- 博客(27)
- 资源 (7)
- 收藏
- 关注
原创 HM编码器代码阅读(25)——和熵编码有关的一些类
熵编码中各个类的介绍: TEncEntropyIf是熵编码算法的虚基类——它封装了熵编码算法的细节,TEncSbac和TEncCavlc都是它的子类,这个类定义了一些纯虚的接口。具体的实现根据使用的算法的不同而不同,例如TEncSbac使用了CABAC熵编码算法、TEncCavlc使用了cavlc熵编码算法。 TEncEntropy是熵编码器类,TEncEn
2016-04-25 17:46:08 1895 2
原创 HM编码器代码阅读(24)——变换系数的编码
入口函数TEncSlice::encodeSlice。在处理完VPS,SPS,PPS和片头信息之后就开始对片的数据(不仅是数据还有一些其他的参数和控制信息)进行编码了。encodeSlice函数就是熵编码的重头戏了。处理过程如下:(1)先初始化熵编码器,然后设置CABAC熵编码器为当前的熵编码器。(2)然后就是加载各种熵编码器,各种初始化,各种加载上下文信息。(3)遍历片中的每
2016-04-24 21:49:11 3701 1
原创 HM编码器代码阅读(23)——参数集的熵编码
在HEVC中,各种参数集以及控制信息等使用CAVLC编码,而帧或者片中的数据(连同CU的语法元素等)使用的是CABAC进行熵编码(不知道还有没有其他的编码方法)。下面介绍一下各种参数集的熵编码。在TEncGOP::compressGOP函数(图像组编码函数)中可以看到,在调用compressSlice对片编码之后,调用了m_pcEntropyCoder->setEntropyCoder
2016-04-24 21:04:33 2817
原创 HM编码器代码阅读(22)——cabac的流程
TEncSbac::resetEntropy函数详解(熵编码的初始化过程):这个函数的实质就是初始化各种上下文// 重置熵编码器Void TEncSbac::resetEntropy (){ Int iQp = m_pcSlice->getSliceQp(); SliceType eSliceType = m_pcSlice->ge
2016-04-24 17:57:57 9550
原创 HM编码器代码阅读(21)——熵编码的概念以及在HEVC中应用
熵编码把一系列用于表示视频序列的元素符号转变为一个用来传输或存储的压缩码流。信息的多少用信息量来度量,显然,信息量与不确定性的消除程度有关,消除的不确定性越大,信息量就越大。不确定性的大小与事件发生的概率相关,因此不确定性可以度量,更进一步信息量也可以度量。假设某一个信源(就是产生信息的地方)的概率空间是:X(表示信源产生的符号的集合),P(
2016-04-22 17:39:20 9043
原创 HM编码器代码阅读(19)——量化
下面要讲解变换和量化具体的执行函数。TComTrQuant::transformNxN函数详解:这是变换和量化的具体执行函数(1)首先判断是否确实需要变换量化(2)如果使用了skip模式,那么调用xTransformSkip进行处理;否则调用xT进行变换处理(3)调用xQuant函数进行量化// 变换和量化!!!!!Void TComTrQuant::transformN
2016-04-19 16:52:59 4524 1
原创 HM编码器代码阅读(18)——变换
入口函数:encodeResAndCalcRdInterCU。这个函数的作用是根据预测值,求出残差,然后进行TU的划分,然后进行变换、量化等操作以及RD代价的计算。流程:(1)如果是帧内预测,那么直接返回(2)判断是否使用skip模式,如果使用了: 1)对所有的子分割设置skip标志 2)清理残差 3)把预测的CU直接设置为重建的CU
2016-04-19 16:29:40 7359 1
原创 HM编码器代码阅读(17)——帧间预测之merge模式(一)Merge模式的介绍以及相关函数
入口函数:TEncCu::xCheckRDCostMerge2Nx2N主要流程:(1)获取可用merge候选MV数量以及merge候选MV(2)判断是否为无损模式,如果是无损模式,那么下面的for循环只需迭代一次,如果不是武勋模式,那么下面的for循环要迭代两次(3)一个for循环,遍历所有的merge模式候选者 1)设置相关参数 2)调用motionCom
2016-04-15 17:57:07 7654
原创 HM编码器代码阅读(16)——帧间预测之AMVP模式(四)预测MV的获取
入口函数:motionCompensation 运动补偿是一种描述相邻帧(相邻在这里表示在编码关系上相邻,在播放顺序上两帧未必相邻) 差别的方法, 具体来说是描述前面一帧(相邻在这里表示在编码关系上的前面,在播放顺序上未必在当前帧前面)的每个小块怎样移动到当前帧中的某个位置去最早的运动补偿的设计只是简单的从当前帧中减去参考帧,从而得到通常含有较少能量(或者成为信息)的"残差",从而可以
2016-04-15 16:44:02 5851 2
原创 HM编码器代码阅读(15)——帧间预测之AMVP模式(三)xGetBlkBits函数
入口函数:xMotionEstimation基本思想:就是用TZSearch算法先进行整像素搜索,确定一个局部的最佳值,然后以这个最佳点为中心再进行精度更高的分像素搜索。主要流程:(1)首先计算搜索范围(2)获取相邻块像素的访问方式(通过调用getPattern)(3)计算当前CU(或者说PU)大小(4)如果是B帧(使用双向预测),还要设置权重?(5)访问方式的初始化
2016-04-15 16:12:00 3012
原创 HM编码器代码阅读(14)——帧间预测之AMVP模式(二)predInterSearch函数
predInterSearch主要的工作是ME(运动估计)和MC(运动补偿)。函数中有一个bTestNormalMC变量,它表示是否进行正常的MC过程,正常的MC过程就是进行ME再进行MC。正常的MC流程是,遍历所有的参考帧,进行ME(运动估计:xEstimateMvPredAMVP),然后记录AVP或者MV的信息,进行MC(运动补偿,目的是选出最优的参数),然后更新最优的参数,遍历完所有
2016-04-15 15:59:57 10934 2
原创 HM编码器代码阅读(13)——帧间预测之AMVP模式(一)总体流程
入口函数xCheckRDCostInter。主要流程如下:(1)得到当前的深度。(2)调用predInterSearch,进行ME(运动估计)和MC(运动补偿)。(3)调用encodeResAndCalcRdInterCU,根据预测值,求出残差,然后进行TU的划分,然后进行变换、量化等操作以及RD代价的计算。(4)调用xCheckBestMode选择最好的模式。#if
2016-04-14 16:43:28 5659 1
原创 HM编码器代码阅读(12)——CU编码
入口函数:TEncCu::compressCU(或者xCompressCU)。xCompressCU是一个递归函数,对于每一个CU,该函数都会被调用,主要是计算当前CU编码之后代价,然后再计算当前CU的每一个子CU编码后的代价,和当前CU的编码代价相比较,用来决定是否对当前CU进行分割。详细流程:(1)复制原始yuv数据(2)计算当前CU四个角的坐标(3)调用xComputeQP计
2016-04-14 16:28:03 12185 3
原创 HM编码器代码阅读(11)——CU的初始化
入口函数TComDataCU::initCU主要流程:(1)计算当前LCU在图像中的像素地址(2)计算LCU可以被分成多少个4x4的CU(3)把片的起始CU的地址存储起来(4)设置每一个4x4子CU的参数信息(5)设置当前LCU的左边、上方、右上角、左上角的相邻的LCU(6)设置参考帧的数组// 编码单元初始化Void TComDataCU::initCU( TC
2016-04-14 15:32:43 3454 4
原创 HM编码器代码阅读(10)——片的编码
入口函数TEncSlice::compressSlice这个函数主要是设置一些参数和初始化一些东西,然后对片中的每一个LCU调用initCU(初始化CU)和compressCU(对CU编码)和encodeCU(对CU进行熵编码,目的是选择最优参数)。TEncSlice::compressSlice函数的详解:(1)计算当前slice的开始CU和结束CU(2)初始化Sbac编码器
2016-04-14 15:14:19 3853 2
原创 HM编码器代码阅读(9)——片编码器的初始化
入口函数:TEncSlice::initEncSlice。在处理图像组的时候,遍历图像组的每一帧,对每一帧调用TEncSlice::initEncSlice。主要是设置和计算一些参数,为片的编码做准备。主要功能包括:(1)取出当前帧的第一片(HM15中每一帧只被划分成一片)(2)设置片的SPS(序列参数集)和PPS(图像参数集)(3)设置片所属的帧;片初始化
2016-04-14 15:00:55 3245
原创 HM编码器代码阅读(8)——其他的一些重要的变量和数据结构的说明
1、TComDataCU。TComDataCU:LCU 及其子 CU 的数据结构,存储了一个 LCU 所有的相关信息,里面重要的数据结构包括:m_uiCUAddr:一个 LCU 在 slice 中的位置m_uiAbsIdxInLCU:当前 CU 在 LCU 中的位置,位置用 Z 扫描顺序m_puhWidth: CU 的宽度m_puhHeight:CU 的高度m_puhDep
2016-04-13 17:06:04 3843 1
转载 HM编码器代码阅读(7)——整个编码流程以及相关的函数
来自网上的文档,但是最初来源不知道是哪,谢谢这个作者!整个流程可以从compressGOP函数开始着手:1、compressGOP对一整个图像组(GOP)进行编码,主要是遍历GOP中每一帧,对每一帧进行单独编码2、每一帧又会被划分成若干slice(HM15中,每一帧对应一个slice),因此对每一帧的处理就转换成对每一片的处理。3、每一个slice都会调用com
2016-04-13 16:51:46 7264 3
原创 HM编码器代码阅读(6)——GOP、IDR帧、I帧周期的关系(待修改)
关于GOP中IDR帧的说明:1、在H.264中一个图像组的起始帧一定是IDR帧,因此在H.264中在处理一个GOP之前会把参考图像集清空,因此一个GOP中的帧一定不会参考另一个GOP的帧——这就是封闭式GOP。2、在HEVC中,一个GOP的第一帧默认不是IDR帧,而是普通的I帧,在处理一个GOP之前,编码器不会把参考集清空,因此在HEVC中一个GOP是会参考另一个GOP的数据,造成了GOP
2016-04-13 14:30:32 6069 1
原创 非阻塞connect的实现
需要非阻塞connec的几种情况:1.三路握手需要时间,这个要视具体的网络情况而定。当然也有可能失败。在三路握手的时候我们并不需要在原地等待三路握手的完成,可以用这些时间来完成其它事情,然后当这些事情完成后,再去检测连接是否建立(也就是三路握手是否完成)。2.可以用这种技术来同时建立多个连接。(WEB浏览器中很常用)。3.connect超时需要很长时间才会通知,如果我们认为超过0.1秒
2016-04-13 12:13:21 1163
原创 HM编码器代码阅读(5)——参考帧的选择
参考帧是怎么来的以及如何设置这个问题困扰了我很久,现在理出了一点头绪。参考帧的选择主要涉及几个函数:selectReferencePictureSetcreateExplicitReferencePictureSetFromReferenceapplyReferencePictureSetarrangeLongtermPicturesInRPSset
2016-04-12 17:53:27 5688 6
原创 HM编码器代码阅读(4)——一些概念
AMVP 即先进运动矢量预测WPP 波前编码SEI 图像增强提高信息NAL单元的前两个字节是头部(第一个字节总是0,接着是NAL类型,然后是layer标志,最后是temporal标志)DPB 是解码图像缓存VCL NAL包含编码数据no-VCL NAL包含控制信息IRAP图像必须属于时域层0,且使用帧内预测leading Picture在解码顺序上紧跟着IRAP图像
2016-04-12 17:43:24 3424
原创 HM编码器代码阅读(3)——一些比较容易混淆的类和结构
TcomPic 是图片类,它包含TComPicSym(图像符号类)和TComPicYuv(yuv数据类:包括原始数据,预测数据、惨差数据)TvideoIOYuv 是用来读取yuv文件的类,读取出来之后把数据放到TComPicYuv中TComPicSym中则存放了指向片(TComSlice)的二级指针,和指向CU(TComDataCU)的二维指针,其实片和CU的实际数据仍然存放在TComPi
2016-04-12 17:42:51 4310 7
原创 HM编码器代码阅读(2)——框架以及主要流程
编码器的运行方式:encoder -c encoder_lowdelay_main.cfg -c akiyo.cfg其中encoder就是编码器可执行文件的名字,encoder_lowdelay_main.cfg是编码器的配置信息,akiyo.cfg是待编码的视频数据的信息。下面是运行截图:编码器主函数在文件encmain.cpp中,调用如下
2016-04-12 17:12:38 5486 2
原创 HM编码器代码阅读(1)——介绍以及相关知识
HM是HEVC(H.265)的开源实现,可以从网上直接下载。HEVC(H.265)是新一代的视频编解码标准。本人目前研究的只是编码器部分,而且还是入门阶段!为了提高自己,边学边记,由于理解不够深入,难免会有误,请见谅!本人现在使用的版本是15.0,最新版本好像已经到16.0了文件的功能以及作用:AccessUnit.h 定义了存取单元(或者说访问单元),实质是一个类型为
2016-04-12 16:45:51 6721 11
转载 Epoll在LT和ET模式下的读写方式
原文:点击打开链接在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK)从字面上看, 意思是:EAGAIN: 再试一次,EWOULDBLOCK: 如果这是一个阻塞socket, 操作将被block,perror输出: Resource temporarily unavailable总结:
2016-04-09 16:02:12 591
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人