欢迎来到天天文库
浏览记录
ID:39328080
大小:1.49 MB
页数:78页
时间:2019-06-30
《H264熵编码具体算法》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第6章H.264/AVC编码器原理第6章H.264/AVC编码器原理6.8CAVLC(基于上下文自适应的可变长编码)6.9CABAC(基于上下文的自适应二进制算术熵编码)6.10码率控制6.11去方块滤波6.12其余特征6.8CAVLC(基于上下文自适应的可变长编码)1.CAVLC概念CAVLC即基于上下文的自适应变长编码。CAVLC的本质是变长编码,它的特性主要体现在自适应能力上,CAVLC可以根据已编码句法元素的情况动态的选择编码中使用的码表,并且随时更新拖尾系数后缀的长度,从而获得极高的压缩比。H.264标准中
2、使用了CAVLC对4*4模块的亮度和色度残差数据进行编码。2.CAVLC的基本原理CAVLC用于亮度和色度残差数据的编码。残差经过变换量化后的数据表现出如下特性:4*4块数据经过预测、变换、量化后,非零系数主要集中在低频部分,而高频系数大部分是零;量化后的数据经过zig-zag扫描,DC系数附近的非零系数值较大,而高频位置上的非零系数值大部分是+1和-1;相邻的4*4块的非零系数的数目是相关的。CAVLC充分利用残差经过整数变换、量化后数据的特性进行压缩,进一步减少数据中的冗余信息,为H.264卓越的编码效率奠定了基
3、础。3.CAVLC的上下文模型利用相邻已编码符号所提供的相关性,为所要编码的符号选择合适的上下文模型。利用合适的上下文模型,就可以大大降低符号间的冗余度。4.CAVLC的编码过程4.1重排序在编码器中,16*16帧内模式编码的宏块里,每个已量化变换系数的4*4亮度块的DC系数首先以图1所示的顺序扫描。剩余的15个AC系数从第二个位置开始扫描。类似的,色度的2*2DC系数以光栅顺序首先扫描,剩余的15个AC系数从从第二个位置开始扫描。图1例:设有一个4*4块数据(假定NC=0)数据重排列:0,3,0,1,-1,-1,0
4、,1,0,0,0,0,0,0,0,003-100-110100000004.2编码非零系数的数目(TotalCoeffs)以及拖尾系数的数目(TrailingOnes)非零系数数目的范围是从0到16,拖尾系数数目的范围是从0到3。如果±1的个数大于3个,只有最后3个被视为拖尾系数,其余的被视为普通的非零系数。例:设有一个4*4块数据(假定NC=0)非零系数的数目(TotalCoeffs)=5;拖尾系数的数目(TrailingOnes)=3;最后一个非零系数前零的数目(Total_zeros)=3;03-100-110
5、10000000对非零系数数目和拖尾系数数目的编码是通过查表的方式,共有4个变长表格和1个定长表格可供选择。表格的选择是根据变量NC(NumberCurrent,当前块值)的值来选择的,在求变量NC值的过程中,体现了基于上下文的思想。BAnA和nB分别为在当前宏块左侧和上侧的变换系数幅值blkA和blkB中的非0变换系数幅值数量(由TotalCoeff(coeff_token)给出)例:设有一个4*4块数据(假定NC=0)∵非零系数的数目(TotalCoeffs)=5;拖尾系数的数目(TrailingOnes)=3;
6、NC=0∴经查表可知码流为0000100∴code=000010003-100-110100000004.3编码每个拖尾系数的符号对于每个拖尾系数(±1)只需要指明其符号,其符号用一个比特表示(0表示+,1表示-)。编码的顺序是按照反向扫描的顺序,从高频数据开始。例:设有一个4*4块数据(假定NC=0)∵逆序编码,三个拖尾系数的符号依次是+,-,-;∴码流为011∴code=000010001103-100-110100000004.4编码除了拖尾系数之外的非零系数的幅值(Levels)非零系数的幅值(Levels)
7、按照反向扫描顺序进行编码,即从高频向低频顺序编码。非零系数的幅值(Levels)的组成分为两个部分,前缀(level_prefix)和后缀(level_suffix)。变量suffixLength是基于上下文模式自适应更新的,suffixLength的更新与当前的suffixLength的值以及已经解码好的非零系数的值(Level)有关。suffixLength数值的初始化以及更新过程如下所示:普通情况下suffixLength初始化为0,但是当块中有多于10个非零系数并且其中拖尾系数的数目少于3个,suffixL
8、ength初始化为1。编码在最高频率位置上的非零系数。如果当前已经解码好的非零系数值大于预先定义好的阈值,变量suffixLength加1。第一个阈值是0,表示在第一个非零系数被编码后,suffixLength的值总是增加1。编码过程如下:①将有符号的Level[i]转换成无符号的levelCode;如果Level[i]是正的,levelC
此文档下载收益归作者所有