- 博客(188)
- 资源 (33)
- 收藏
- 关注

原创 HEVC码率控制浅析——HM代码阅读之四
继续分析第一篇提到的compressSlice中对LCU的RC参数初始化:#if RATE_CONTROL_LAMBDA_DOMAIN Double oldLambda = m_pcRdCost->getLambda(); if ( m_pcCfg->getUseRateCtrl() ) { Int estQP = pc
2013-09-05 13:43:56
7564
4

原创 HEVC码率控制浅析——HM代码阅读之三
续上文继续分析m_pcRateCtrl->initRCPic( )Void TEncRateCtrl::initRCPic( Int frameLevel ){ m_encRCPic = new TEncRCPic; m_encRCPic->create( m_encRCSeq, m_encRCGOP, frameLevel, m_listRCPictures );}
2013-09-05 11:24:07
6629

原创 HEVC码率控制浅析——HM代码阅读之二
上一篇文章主要讨论了RC的总体框架,本文开始分析具体的代码实现细节。分析的顺序按照总体框架来,即初始化-->更新。 (1)m_cRateCtrl.init()#if M0036_RC_IMPROVEMENTVoid TEncRateCtrl::init( Int totalFrames, Int targetBitrate, Int frameRate, Int GOPSize,
2013-09-03 17:58:48
7371
3

原创 HEVC码率控制浅析——HM代码阅读之一
HM的码率控制提案主要参考如下三篇:K0103,M0036,M0257。本文及后续文章将基于HM12.0进行讨论,且首先仅讨论K0103对应的代码,之后再陆续补充M0036,M0257对应的代码分析,这么做可能会使得剧情不会显得那么地跳跃,分析起来能够更好地被接受。 按照我的个人习惯,还是先分析HM中码率控制部分(以后简称RC)的总体框架吧。跟RC有关的头文件和源文件为工程TLibEn
2013-09-03 15:46:39
14743
12

原创 HM中去方块滤波的禁用方法
有时候我们想禁用掉HM的去方块滤波,测试下去方块滤波的效果,很容易就想到要修改配置文件,根据注释,容易找到: LoopFilterDisable : 1 # Disable deblocking filter (0=Filter, 1=No Filter) 但是运行完程序后就会发现,这个参数改为0或者改为1结果根本就是一样
2013-08-13 17:47:32
4083
1

原创 HM中CU,TU的划分
相信只要是做算法改进的,首先都会遇到这么一个问题:CU,PU及TU这几个在HM中该如何打印出它们最终的划分情况呢?也经常有人来问我这个问题,一般来说,因为问我的时候我一般手头都没有现成的代码可以提供,另一方面,也没空把vs打开写上一段,所以只能是告诉他们大概的思路,其实我很早之前的一篇博客已经进行了介绍,只是当时没有把代码附上,后来也找不到了,就不了了之了。本文算是把这个遗憾给补上吧。直接附上代码
2013-08-08 17:49:33
17765
10

原创 ffmpeg错误隐藏框架分析
本文主要是分析ffmpeg的错误隐藏框架,故解码流程此处不会特地进行讨论,网上其他地方其实也有不少介绍相关流程的了,但发现基本没有介绍错误隐藏流程的,故本文希望能填补这个空白。 我们直接从decode_frame开始跟踪(相信从这个地方开始不会有人有啥疑问吧,怎么跟踪到这里的已经有很多资料介绍的了),decode_frame ---> decode_nal_units
2013-07-30 13:45:17
5298

原创 ffmpeg中guess_mv的分析
static void guess_mv(MpegEncContext *s){ uint8_t fixed[s->mb_stride * s->mb_height];#define MV_FROZEN 3#define MV_CHANGED 2#define MV_UNCHANGED 1 const int mb_stride = s->mb_strid
2013-07-30 11:15:33
2449

原创 HEVC帧间预测之七——运动估计(四)
有了前面几篇的铺垫,本文就可以把整像素部分的运动估计给结束掉了。到目前为止,只剩下xTZSearch这个函数没分析了,在开始这个函数的代码解释之前,让我们共同来理一下TZSearch的基本流程:1. 搜索预测得到的mv所指向的点:中值预测mv,当前PU的左,上及右上PU的mv,还有零运动矢量(0,0)2. 在步骤1中找到匹配误差最小的点作为接下来搜索的起始点3. 步长从1开始,以2的指
2013-03-18 16:11:03
12472
17

原创 HEVC帧间预测之六——运动估计(三)
本文分析xTZSearch调用了两个最为主要的函数:xTZ8PointDiamondSearch和xTZ2PointSearch,值得一提的是,HM中还提供了另外一个搜索函数xTZ8PointSquareSearch,但由于实际并没有使用这个函数,且它其实跟钻石搜索只是搜索点的选择略有不同,分析起来基本上也是一样的,这里就不重复啰嗦了。__inline Void TEncSearch::xTZ
2013-03-18 14:06:16
7769
1

原创 HEVC帧间预测之五——运动估计(二)
分析xTZSearch这个函数,xTZSearchHelp是当中最为重要的子函数之一。它实现最基本的功能:根据输入的搜索点坐标,参考图像首地址,原始图像首地址,以及当前PU大小等相关信息,计算出SAD,并与之前保存的最佳值进行比较,更新到目前为止的最佳值相关参数,如uiBestSad,搜索点坐标,搜索步长等。其他的函数如xTZ8PointSearch等搜索函数,最终都是调用xTZSearchHel
2013-03-18 13:36:56
9308
1

原创 HEVC帧间预测之四——运动估计(一)
其实HM的运动估计这部分与H.264相比基本没有变化,如果看过JMVC运动估计的代码,会发现xTZSearch的结构几乎就是一样的。所以,严格来讲,这部分的东西没有什么太多新鲜的东西,相信以前研究过TZSearch的人看这部分代码会很轻松。先看运动估计的主调函数://!< 运动估计Void TEncSearch::xMotionEstimation( TComDataCU* pcCU, T
2013-03-17 22:36:57
17368
4

原创 HEVC帧间预测之三——TEncCu::xCheckRDCostMerge2Nx2N函数分析
本文将对实现merge模式的主函数xCheckRDCostMerge2Nx2N进行分析,方便理清merge模式的整个过程。之前的一篇分析了getInterMergeCandidates的具体实现,还有两个比较重要的函数motionCompensation和encodeResAndCalcRdInterCU,将留在后面陆续进行分析,但是根据它们的命名就不难猜出它们的作用,而且事实也是这样,因此对理解
2013-03-12 16:11:49
10373
10

原创 HEVC帧间预测之二——TComDataCU::xGetColMVP的分析
在上一篇介绍的函数中,在求TMVP时调用了一个比较重要的函数,xGetColMVP。本文对该函数进行较为详细的分析:Bool TComDataCU::xGetColMVP( RefPicList eRefPicList, Int uiCUAddr, Int uiPartUnitIdx, TComMv& rcMv, Int& riRefIdx ){//! 这部分的内容可以参考draft 8.
2013-03-12 14:33:16
7567
2

原创 HEVC帧间预测之一——TComDataCU::getInterMergeCandidates函数分析
从今天开始,正式转入到帧间预测方向。由于帧间预测涉及到的方面广且复杂,所以我的理解出现错误的情况可能会更多,请大家以辩证的眼光来看待我的帖子,有问题欢迎大家批评指正。 大家都知道xCompressCU是实际进行预测编码的函数,故很容易就能锁定帧间预测的一个大致范围,在研究了帧内预测的基础上,相信很快就能在该函数中找到与帧间预测相关的函数:xCheckRDCostInter,xCheckRD
2013-03-12 13:29:28
11197
6

原创 HEVC CU 级别的分析
接下来有关HEVC的文章都是HEVC学习系列的延续,但由于序号偏多,为方便起见,就不再单独编号,直接以讨论内容作为题目了。 要研究CU级的代码,少不了要接触到这么一个类TComDataCU。为了比较顺畅地看代码,对这个类的重要成员自然需要有比较好的认识才行,这就是本文的目的,给大家提供一个共同讨论类中私有成员含义与作用的平台。 class TComDataCU{privat
2013-03-05 21:49:03
12654
18

原创 最新版(2013.01.17)x264的多线程代码研究(一)
先罗列出代码中与多线程有关的宏定义、结构体、变量、函数等,锁定为需要重点关注的对象,在接下来的研究中逐步深入探讨这些对象的含义和作用。define X264_THREAD_MAX 128#define X264_LOOKAHEAD_THREAD_MAX 16#define X264_LOOKAHEAD_MAX 250// arbitrary, but low because S
2013-01-27 13:17:48
4105
1

原创 HEVC学习(三十六) —— 去方块滤波之七
本文介绍关于去方块滤波的最后一个函数(这一系列基本上只讨论了亮度分量的情况,色度分量的情况类似,不单独做出分析)。Void TComLoopFilter::xEdgeFilterLuma( TComDataCU* pcCU, UInt uiAbsZorderIdx, UInt uiDepth, Int iDir, Int iEdge ){ TComPicYuv* pcPicYuvR
2013-01-25 21:32:12
4680
1

原创 HEVC学习(三十五) —— 去方块滤波之六
先看HM中定义tC、β这两个变量的表格,与draft中的Table 8-10相对应:const UChar tctable_8x8[54] ={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,5,5,6,6,7,8,9,10,11,13,14,16,18,20,22,24};
2013-01-25 21:08:16
3789
1

原创 HEVC学习(三十四) —— 去方块滤波之五
本文考察实现去方块滤波的核心函数xDeblockCU:Void TComLoopFilter::xDeblockCU( TComDataCU* pcCU, UInt uiAbsZorderIdx, UInt uiDepth, Int Edge ){ if(pcCU->getPic()==0||pcCU->getPartitionSize(uiAbsZorderIdx)==SIZE_N
2013-01-25 16:53:40
5041

原创 HEVC学习(三十三) —— 去方块滤波之四
本文考察Boundary Strength (BS)的获取过程:Void TComLoopFilter::xGetBoundaryStrengthSingle ( TComDataCU* pcCU, UInt uiAbsZorderIdx, Int iDir, UInt uiAbsPartIdx ){ TComSlice* const pcSlice = pcCU->getSlice
2013-01-25 16:03:09
5228
4

原创 HEVC学习(三十二) —— 去方块滤波之三
Void TComLoopFilter::xSetEdgefilterPU( TComDataCU* pcCU, UInt uiAbsZorderIdx ){ const UInt uiDepth = pcCU->getDepth( uiAbsZorderIdx ); const UInt uiWidthInBaseUnits = pcCU->getPic()->getNumPa
2013-01-25 14:11:36
5196
2

原创 HEVC学习(三十一) —— 去方块滤波之二
这个是维护去方块滤波参数的结构体:/// parameters for deblocking filtertypedef struct _LFCUParam{ Bool bInternalEdge; ///< indicates internal edge Bool bLeftEdge;
2013-01-24 22:30:20
4555

原创 HEVC学习(三十) —— 去方块滤波之一
去方块滤波的详细过程可参看draft 8.7.1 to 8.7.2 。 在compressGOP中可以找到下面一段代码,这里就是调用去方块滤波的地方 //-- Loop filter Bool bLFCrossTileBoundary = pcSlice->getPPS()->getLoopFilterAcrossTilesEnabledFlag();
2013-01-24 21:37:56
9139
1

原创 HEVC学习(二十九) —— 量化之三
为了更好地与draft进行对应,看HM中的反量化部分代码:Void TComTrQuant::xDeQuant(Int bitDepth, const TCoeff* pSrc, Int* pDes, Int iWidth, Int iHeight, Int scalingListType ){ const TCoeff* piQCoef = pSrc; Int*
2013-01-20 23:04:11
5879

原创 HEVC学习(二十八) —— 量化之二
Void TComTrQuant::transformNxN( TComDataCU* pcCU, Pel* pcResidual, //!< 残差 UInt uiStride,
2013-01-20 20:25:37
9406
11

原创 HEVC学习(二十七) —— 变换编码之二
//! 用于significant_coeff_flag的上下文推导过程的模式选择 draft 9.3.3.1.4Int TComTrQuant::calcPatternSigCtx( const UInt* sigCoeffGroupFlag, UInt posXCG, UInt posYCG, Int width, Int height ){ if( width == 4 &&
2013-01-19 23:01:05
6159

原创 HEVC学习(二十六) —— 量化之一
先列出HM中与draft对应的几个表格,随着研究的深入,本文会慢慢补充。enum ScalingListSize{ SCALING_LIST_4x4 = 0, SCALING_LIST_8x8, SCALING_LIST_16x16, SCALING_LIST_32x32, SCALING_LIST_SIZE_NUM}; //!< Table 7-2 (S
2013-01-15 19:11:56
7719

原创 HEVC学习(二十五) —— 变换系数的编码之一
本文首先介绍系数扫描模式的初始化。直接给出代码及相应的注释: // scanning order tableUInt* g_auiSigLastScan[ 3 ][ MAX_CU_DEPTH ]; //!< [pattern][depth]const UInt g_sigLastScan8x8[ 3 ][ 4 ] ={ {0, 2, 1, 3}, //!< rig
2013-01-12 14:33:07
7694
2

原创 HEVC学习(二十四) —— 熵编码之五
本文介绍EncodeDecision过程,对应的代码及注释如下:/** * \brief Encode bin * * \param binValue bin value * \param rcCtxModel context model */Void TEncBinCABAC::encodeBin( UInt binValue, ContextModel &rcC
2013-01-07 15:27:09
6658
2

原创 HEVC学习(二十三) —— 熵编码之四
本文主要考察与概率转移有关的几个表格及使用分析。下图是draft 9.3.4.2中的Figure 9-7,在接下来的分析中需要用到,这里先贴出来:(注:图中有个小错误,valMPS = 1 ? valMPS,实际应为valMPS = 1 - valMPS,特此更正)在ContextModel.cpp中,给出了transIdxLPS和transIdxMPS这两个表格:const
2013-01-06 14:24:54
6569
2

原创 HEVC学习(二十二) —— 熵编码之三
在继续介绍CABAC之前,先穿插进另外几种相对而言较为简单的熵编码方式。下图是截取自draft 7.3.2.1的关于VPS(Video Parameter Set)的句法元素描述:关注表格中"Descriptor”这一栏,当中的描述符有u,ue,分别表示无符号整型、无符号整型0阶指数哥伦布编码方式,可以在HM中找到与表格相对应的一段代码:Void TEncCavlc::codeVPS(
2013-01-05 14:57:38
6958

原创 HEVC学习(二十一) —— 熵编码之二
本文继续讨论编码器的初始化过程,即draft 9.3.1.1。上一篇介绍的是各个context对应到标准相应表格的值,以及相关变量和函数,前面提到initBuffer函数对context进行初始化,但是没有深入解析这个函数的实现,这就是本文的主要任务。首先介绍下面讨论过程中会涉及到的一个类ContextModel3DBuffer,重点关注该类的构造函数:/// context mode
2013-01-04 22:51:37
6896
14

原创 HEVC学习(二十) —— 熵编码之一
从本篇开始,接下来的若干篇会逐步分析HM 9.1中有关熵编码的过程。在此以及以后的几篇,我都默认大家对熵编码(针对CABAC,因为HEVC只有这一种编码方式,而H.264有CAVLC和CABAC两种)的基本概念和流程有了一定的基础,同时,由于HEVC中的CABAC基本流程与H.264中的基本一致,因此,这里暂时不会介绍熵编码框架和流程,有兴趣的可以参考H.264中的相关资料。我会按照编码的执行顺序
2013-01-04 15:46:20
20345
2

原创 HEVC学习(十九) —— NAL unit 的解码过程之三
前面两篇已经将NAL的解析过程的核心部分介绍完了,本篇主要讨论如何将NAL的payload部分转化为原始数据,即从EBSP到RBSP的过程。该过程由TAppDecTop::decode()的子函数read(nalu, nalUnit)调用convertPayloadToRBSP(nalUnitBuf, pcBitstream, (nalUnitBuf[0] & 64) == 0)实现。re
2013-01-03 20:43:15
11532
1

原创 HEVC学习(十八) —— NAL unit 的解码过程之二
下面介绍实际完成NAL解析工作的函数:/** * Parse an AVC AnnexB Bytestream bs to extract a single nalUnit * while accumulating bytestream statistics into stats. * * If EOF occurs while trying to extract a NALu
2013-01-03 19:39:29
5990

原创 HEVC学习(十七) —— NAL unit 的解码过程之一
下图为官方标准中NAL层的句法元素,且以伪代码的形式给出了解码过程:在HM中由TAppDecTop::decode()调用byteStreamNALUnit(bytestream, nalUnit, stats)实现如上伪代码:/** * Parse an AVC AnnexB Bytestream bs to extract a single nalUnit * while
2013-01-03 19:00:42
10629
3

原创 BD-rate的计算
相信不少接触视频编码的朋友在看相关的文献的时候,总会看到论文中测试时给出一个重要的参数BD-rate,可能一直心存疑问,这个BD-rate到底是个什么东西呢?可以参考这一份提案http://download.youkuaiyun.com/detail/hevc_cjl/4927493简单地说,这个BD-rate计算的是两种算法对应的两条RD曲线的差值的均值,具体需要通过对测试的几个(一般是4个)点进行曲线
2012-12-25 19:09:23
16868

原创 x264去方块滤波函数解析(三)
去方块滤波查表时需要用到的几个数组:/* Deblocking filter */static const uint8_t i_alpha_table[52+12*2] ={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2012-12-19 23:15:18
1915

原创 x264去方块滤波函数解析(二)
上一篇介绍了实际进行滤波的函数,本篇主要介绍,去方块滤波这边的函数调用关系。先看几个定义://! 两个函数指针,第一个是bS=1~3时调用的,第二个是bS=4时调用的。typedef void (*x264_deblock_inter_t)( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 );typedef voi
2012-12-19 23:03:37
2981
ffmpeg可执行文件exe
2013-04-09
最新版的x264(VS工程)
2012-12-06
news_qcif.yuv
2012-11-28
waterfall_cif.yuv
2012-11-28
foreman_qcif.yuv
2012-11-28
HEVC reference software manual (JCTVC-F634)
2012-11-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人