浅析H.264标准中的CAVLC编码

来源 :科技与企业 | 被引量 : 0次 | 上传用户:gchongyuan
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  【摘 要】本文是在阅读了讲解H.264/AVC中熵编码相关内容的书籍后的感想,主要介绍了熵编码的基本原理,H.264/AVC中熵编码的方法,重点介绍了基于上下文自适应的可变长编码(CAVLC),并将它和基于上下文二进制算术编码(CABAC)进行了比较。
  【关键词】熵编码;编码算法;编码比较
  H.264是在网络技术和视频业务不断发展的情况下产生的新一代视频压缩编码标准,它是由国际标准化组织与国际电讯联盟组成的联合视频小组开发的。与原有标准相比,H.264提出了许多新技术,在诸多方面都超越了原有的视频技术,减少了占用的硬件资源,降低了实现复杂性。其中就包括全新的熵编码技术。
  1、熵编码编码
  使用长度不同的比特串对字母进行编码有一定的困难。尤其是几乎所有几率的熵都是一个有理数。
  使用整数位元(bit)
  哈夫曼编码建议了一种将位元进位成整数的算法,但这个算法在特定情况下无法达到最佳结果。为此有人加以改进,提供最佳整数位元数。这个算法使用二叉树来设立一个编码。这个二叉树的终端节点代表被编码的字母,根节点代表使用的位元。
  熵编码模型
  要确定每个字母的比特数算法需要尽可能精确地知道每个字母的出现机率。模型的任务是提供这个数据。模型的预言越好压缩的结果就越好。此外模型必须在压缩和恢复时提出同样的数据。在历史上有许多不同的模型。
  静态模型
  静态模型在压缩前对整个文字进行分析计算每个字母的机率。这个计算结果用于整个文字上。
  优点:编码表只需计算一次,因此编码速度高。除在解码时所需要的机率值外结果肯定不比原文长。
  缺点:计算的机率必须附加在编码后的文字上,这使得整个结果加长。计算的机率是整个文字的机率,因此无法对部分地区的有序数列进行优化。
  动态模型
  在这个模型里机率随编码过程而不断变化。多种算法可以达到这个目的:
  前向动态:机率按照已经被编码的字母来计算,每次一个字母被编码后它的机率就增高。
  反向动态:在编码前计算每个字母在剩下的还未编码的部分的机率。随着编码的进行最后越来越多的字母不再出现,它们的机率成为0,而剩下的字母的机率升高,为它们编码的比特数降低。压缩率不端增高,以至于最后一个字母只需要0比特来编码。
  优点:模型按照不同部位的特殊性优化;在前向模型中机率数据不需要输送。
  缺点:每个字母被处理后机率要重算,因此比较慢。计算出来的机率与实际的机率不一样,在最坏状态下压缩的数据比实际原文还要长。
  一般在动态模型中不使用机率,而使用每个字母出现的次数。除上述的前向和反向模型外还有其它的动态模型计算方法。比如在前向模型中可以不时减半出现过的字母的次数来降低一开始的字母的影响力。对于尚未出现过的字母的处理方法也有许多不同的手段:比如假设每个字母正好出现一次,这样所有的字母均可被编码。
  模型度
  模型度说明模型顾及历史上多少个字母。比如模型度0说明模型顾及整个原文。模型度1说明模型顾及原文中的上一个字母并不断改变其机率。模型度可以无限高,但是对于大的原文来说模型度越高其需要的计算内存也越多。
  熵编码基本原理
  熵编码是无损压缩编码方法,它生成的码流可以经过解码无失真地恢复出原数据。熵编码是建立在随机过程的统计特性基础上的。
  对信息源X的各符号的自信息量取统计平均,可得到平均信息量H(X)。H(X)称为信息源X的熵(entropy),单位是bit/符号。
  H.264标准中定义了三种熵编码,分别是指数哥伦布编码(Exp-Golomb)、基于上下文的自适应可变长编码(CAVLC)、基于上下文的自适应二进制算术编码(CABAC)。指数哥伦布编码用于对句法元素的编码,把所有句法元素映像到统一的可扩展码字表,不单独对每个句法元素设计不同的码字表,这有助于降低编解码的复杂度。对于量化后的差值变换系数,可以根据不同的档次來决定使用CAVLC还是CABAC。CABAC的压缩率与CAVLC相比较高,但计算量也更大。
  下面主要介绍CAVLC。
  2、CAVLC(基于上下文自适应的可变长编码)
  2.1 CAVLC是用于亮度和色度残差数据的编码
  利用相邻已编码符号所提供的相关性,为所要编码的符号选择合适的上下文模型。利用合适的上下文模型就可以大大降低符号间的冗余度。在CAVLC中,上下文模型的选择主要体现在两个方面:非零系数编码所需表格的选择以及拖尾系数后缀长度的更新。
  CAVLC之所以代替早期草案中提出的UVLC(统一的可变长编码)对残差数据进行熵编码,它的根本原因有如下几点:
  1.CAVLC可以全面的提高编码的质量。
  2.应用锯齿形(zig-zag)扫描的方法,将非零系数值(Level)和零行程(Run)分开编码,可提高编码的自适应性,有助于提高编码的效率。
  3.将Level和Run分开编码可降低对存储数据的复杂度。
  CAVLC熵编码的对象是经DCT变换和量化后得到的亮度和色度残差数据,量化后的4×4块残差数据具有如下特征:
  (1)经过帧间、帧内预测、DCT变换、量化后,残差块仅仅含有少许能量,除了低频部分含有非零系数外,宏块系数基本上为0。CAVLC使用游程编码的方式来表示连续的零,有效的提高了编码的压缩效率。
  (2)量化的数据经Zigzag扫描之后,低频部分非零系数幅值较大,而高频部分经常是由+1、-1等拖尾系数组成的序列,CAVLC对此类拖尾系数采用了与其他非零系数不同的编码方式。
  2.2 CAVLC编码算法分析
  2.2.1 CAVLC涉及的语法元素分析
  CAVLC 算法共涉及到5个语法元素需要编码,即coeff_token,total_zeros,level_prefix,level_suffix,run_before,每一个语法元素的具体含义如下:   coeff_token,编码非零系数(total_coeffs)和拖尾系数(TrailingOnes)的个数;
  level-prefix,除拖尾系数外非零系数(level)的前缀部分;
  level_suffix,除拖尾系数外非零系数(level)的后缀部分;
  total_zeros,在逆Zig-zag 扫描顺序下,最后一个非零系数前零的总数;
  run_before,在逆Zig-zag 扫描顺序下待编码非零系数前零的个数.
  CAVLC在编码前对4x4数据矩阵经过系数重排变成一维数据序列,为提高编码效率,CAVLC将整个残差块的系数分成三类,即拖尾系数(TrailingOnes)、除拖尾系数外的非零系数(level)和零值。level的码流由level_prefix和level_suffix两个语法元素组成。根据非零系数在一维数据序列中的分布,利用total_zeros和run_before 两个语法元素联合查表可得。因此,对一个4x4残差数据块的编码,CAVLC编码器应该首先完成游程长度的编码,然后再是语法元素的编码。
  CAVLC编码流程及相应码流形成过程
  H.264中块编码是基于4x4块的大小,通过帧间、帧内预测、变换、量化、Zigzag扫描后形成重排后的块残差数据,经过编码前的相应语法元素的初始化,各语法元素的编码等过程最终形成编码码流。
  2.2.2 下面对CAVLC算法编码流程进行具体分析:
  (1) 编码前语法元素(TotalCoeff,TrailingOnes)和变量(nC)的初始化对于4×4的残差块而言,非零系数总数(TotalCoeff)的取值范围为[0,16],而拖尾系数(TrailingOnes)个数在H.264/AVC中规定为[0,3],如果编码块最后±1个数超过3,则只有最后3個作为拖尾系数处理,其他的则作为正常非零系数处理。通过查表决定非零系数个数和拖尾系数个数的编码方式。查找表的选择方式取决于当前块的左边块和上方块已经编码的非零系数值,体现了语法元素的上下文相关性。
  (2) 编码coeff_token语法元素并形成相应比特流
  根据输入的非零系数数目和拖尾系数数目以及变量nC的值,查找相应的编码表格,得到映射到非零系数数目和尾系数数目的值coeff_token,将coeff_token形成的比特流存入编码缓冲区中。
  (3) 编码TrailingOnes的符号并形成相应比特流
  为提高编码效率,对每个拖尾系数(±1)只需要编码其符号,用0 代表+,1代表-,按照反向扫描的顺序,依次对拖尾系数的符号进行编码并存储编码缓冲区。
  (4) 编码各个level 值并形成相应比特流
  残差块中除拖尾系数外余下的非零系数的幅值(level)按照逆序进行编码。编码后的码字包含一个前缀(level_prefix)和一个后缀(level_suffix)。其中变量suffixLength 表示后缀的长度,levelCode 表示修正后幅值,i表示除拖尾系数外非零系数数目。
  (5) 编码total_zeros语法元素并形成相应比特流
  在Zig-zag扫描后的序列中,最高非零系数前所有零的个数(total_zeros)用VLC方式进行编码,该码字表示块中所有零的个数(其值可以通过查表获得)。
  (6) 编码run_before 语法元素并形成相应比特流对每个非零系数前零的个数的编码依赖于变量zerosLeft 的值,zerosLeft表示当非零系数左边所有零的个数,其初值为TotalZeros,在每个非零系数的run_before 值编码后进行更新。
  2.2.3 CAVLC编码算法的特点
  CAVLC利用相邻已编码符号所提供的相关性,动态调整编码中的码表,为编码符号选择合适的上下文模型,大大降低了符号间的冗余度,取得较高的压缩比,从而有利于软硬件的实现。但CAVLC采用固定码表,不能随视频源的统计特性自适应性变化,而且CAVLC最小编码位为1位,对概率大于0.5的编码符号,编码效率降低,因此H.264又提出了一种新的熵编码算法即CABAC 编码算法。
  在H.264中,两种熵编码的功能是可以互相取代的,然而CABAC的压缩性能要好于CAVLC,它基于以下几点实现高压缩率:1.基于语法元素的上下文信息为其选择合适的概率模型;2.基于统计的自适应概率估计更新;3.使用算术编码替代变长编码。
  视频图像在经过预测、变换和量化编码后,需要经过Zig-zag扫描和重新的排序过程,为后序的CAVLC编码进行准备。
  CAVLC熵编码处理流程
  1、TotalCoeffs和TrailingOnes的编码
  从码流的起始位置开始计算整个编码块中非零系数的数目(TotalCoeffs),非零系数的数目为从0-16,非零系数的数目被赋值给变量TotalCoeffs。
  拖尾系数是指码流中正或者负1的个数(+/-1)。拖尾系数的数目(TrailingOnes)被限定在3个以内,如果+/-1的数目超过3个,则只有最后3个被视为拖尾系数,其余的被视为普通的非零系数,拖尾系数的数目被赋值为变量TrailingOnes。
  2、判断计算nC值
  nC(Number Current当前块值)值的计算集中体现了CAVLC的基于上下文的思想,通过nC值选择不同H.264标准附录CAVLC码表。
  3、查表获得coeff_token编码
  根据之前编码和计算过程所得的变量TotalCoeffs、TrailingOnes和nC值可以查H.264标准附录CAVLC码表,即可得出coeff_token编码序列。
  4、编码每个拖尾系数的符号:前面的coeff_token编码中已经包含了拖尾系数的总数,还需进一步对拖尾系数的符号进行编码。由于拖尾系数符合为正(+)或负(-),因此,在H.264标准中规定用0表示正1(+1)、1表示负1(-1)。当拖尾系数的数目超过3个只有最后3个被认定为拖尾系数,因此对符号的编码顺序应按照反向扫描的顺序进行。   5、编码除拖尾系数之外的非零系数的幅值(Levels)
  非零系数的幅值(Levels)由两个部分组成:前缀(level_prefix)和后缀(level_suffix)。levelCode、levelSuffixsSize和suffixLength是编码过程中需要使用的三个变量,其中levelCode是中间过程中用到的无符号数,levelSuffixsSize表示后缀长度位数,suffixLength代表Level的码表序号。
  6、编码最后一个非零系数前零的数目(TotalZeros)
  TotalZeros指的是在最后一个非零系数前零的数目,此非零系数指的是按照正向扫描的最后一个非零系数。因为非零系数数目(TotalCoeffs)是已知,这就决定了TotalZeros可能的最大值。根据TotalCoeffs值,H.264标准共提供了25个变长表格供查找,其中编码亮度数据时有15个表格供查找,编码色度DC 2×2块(4:2:0格式)有3个表格、编码色度DC 2×4块(4:2:2格式)有7个表格。
  7、编码每个非零系数前零的个数(RunBefore)
  在CAVLC中,变量 ZerosLeft表示当前非零系数左边的所有零的个数,ZerosLeft的初始值等于TotalZeros。每个非零系数前零的个数(RunBefore)是按照反序来进行编码的,从最高频的非零系数开始。H.264标准中根据不同ZerosLeft和RunBefore,构建了RunBefore编码表格供编码查找使用。根据表格每编码完一个RunBefore,对ZerosLeft的值进行更新,继续编码下一个RunBefore,直至全部完成所有非零系数前零的个数的编码。当ZerosLeft=0即没有剩余0需要编码时或者只有一个非零系数时,均不需要再进行RunBefore编码。
  综上,本文主要是在阅读了讲解H.264/AVC中熵编码相关内容的书籍后的感想,着重介绍了熵编码的基本原理,H.264/AVC中熵编码的方法,重点介绍了基于上下文自适应的可变长编码(CAVLC),并将其和基于上下文二进制算术编码(CABAC)进行了比较。另外,还了解到相关领域研究者对CAVLC算法的一些优化工作,在此不详细说明。
  参考文献
  [1]畢厚杰,王健,编.新一代视频压缩编码标准:H.264/AVC(第2版)[M],人民邮电出版社,2009
其他文献
目的选取2002年1月—2011年12月收治的贲门癌病例经上腹切口径路切除组与同期的其它经胸腹径路手术组进行了对比回顾分析。方法随机选择经病理证实的贲门癌病人分为两组,分别
设备出现故障时,不要被表面现象所蒙蔽,不要头疼医头,脚疼医脚,要善于抓事情的根本,设备正常工作不外乎电源的正常、计算机或CPU工作正常、控制信号正常、接口正常、外设正常
嫁接是一个无性繁殖病菌的传播,油茶证明先进实用技术,具有成活率高、生长良好,快速繁殖、高效率特点。本文介绍了油茶胚芽嫁接技术,内容包括:种子的采集与砧芽培养;苗床准备;
呼吸道疾病是儿科最常见的疾病,在儿科门诊约占其就诊率60%~90%,占住院患者30%~60%,很大部分是喘息性患儿,该组目的是在此基础上探讨其在儿科喘息性疾病上的疗效与安全性.方法 将喘
[摘要]房屋的裂缝问题是普遍存在的现象。就裂缝轻重程度而然,轻者影响其美观,重者影响其安全使用,甚至会造成不良的社会影响,尤其是用户反映十分强烈。由于用户对房屋的结构情况不甚了解,房屋一旦出现裂缝,使用户产生不安全感或恐慌,有的裂缝造成屋面、墙面、地面渗漏、门窗变形、外墙抹面脱落等现象,给用户带来许多烦恼。就裂缝的性质而然,可分为温度裂缝、沉降裂缝、施工质量因素裂缝、使用不当及维护不及时而产生的裂
目的观察疏血通(水蛭、地龙)注射液对糖尿病心肌病患者的治疗疗效。方法将38例糖尿病心肌病患者,均内科治疗,疏血通组加用疏血通注射液6mL加入生理盐水250mL中静脉缓慢滴注,1次
丧失体力和智力的人们也同样需要出入公共场所,同样需要享受社会带给他们的变化,同样需要一个舒适的环境。因此,本文主要分析与探讨在现代建筑设计过程中,能够合理地、科学地
我国页岩气田加密井压裂改造还存在水平段部分区域未改造、裂缝非均匀扩展和地层能量亏空等问题。分析这些压裂改造难点,在现有压裂工艺基础上进行优化设计:进一步缩短段簇间