基于CABAC的可伸缩视频编码方法研究毕业论文.doc_第1页
基于CABAC的可伸缩视频编码方法研究毕业论文.doc_第2页
基于CABAC的可伸缩视频编码方法研究毕业论文.doc_第3页
基于CABAC的可伸缩视频编码方法研究毕业论文.doc_第4页
基于CABAC的可伸缩视频编码方法研究毕业论文.doc_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于CABAC的可伸缩视频编码方法研究毕业论文目 录摘要IAbstractII第一章 绪论11.1可伸缩视频技术概述11.2可伸缩视频技术的研究概况与发展趋势21.3主要研究工作31.4 本文安排3第二章 H.264标准中的CABAC42.1概述42.2二值化52.2.1 一元码(Unary)52.2.2 截断一元码(Truncated Unary, TU)52.2.3 k阶指数哥伦布编码(kth order Exp-Golomb, EGk)62.2.4 定长编码(Fixed-Length, FL)62.2.5 4位FL与截断值为2的TU联合二值化方案62.2.6 TU与EGk的联合二值化方案(Unary/kth order Exp-Golomb, UEGk)62.2.7 各种句法元素值的二值化62.2.8 联合二值化方案编码实例72.3上下文建模72.3.1 上下文的初始化82.3.2 上下文模型的分类82.3.3 上下文模型的分配与确定82.4二进制算术编码92.4.1 概率估计92.4.2 算术编码器的总体描述10第三章 JM8.6中的CABAC143.1 slice.c部分函数分析143.1.1 encode_one_slice函数分析143.1.2 start_slice函数分析153.1.3 terminate_slice函数分析153.2 macroblock.c部分函数分析163.2.1 start_macroblock函数分析163.2.2 write_one_macroblock函数分析163.2.3 writeMBHeader函数分析173.2.4 writeMotionInfo2NAL函数分析173.2.5 writeCBPandLumaCoeff函数分析183.2.6 writeChromaCoeff函数分析183.3 rdopt.c部分函数分析183.3.1 encode_one_macroblock函数分析193.3.2 RDCost_for_macroblocks函数分析193.3.3 RDCost_for_8x8blocks函数分析193.3.4 RDCost_for_4x4IntraBlocks函数分析203.4 cabac.c部分函数分析203.4.1 CheckAvailabilityOfNeighborsCABAC函数分析213.4.2 writeFieldModeInfo_CABAC函数分析213.4.3 writeMB_skip_flagInfo_CABAC函数分析213.4.4 writeMB_typeInfo_CABAC函数分析223.4.5 writeB8_typeInfo_CABAC函数分析253.4.6 writeIntraPredMode_CABAC函数分析263.4.7 writeRefFrame_CABAC函数分析263.4.8 writeDquant_CABAC函数分析273.4.9 writeMVD_CABAC函数分析273.4.10 writeCIPredMode_CABAC函数分析283.4.11 writeCBP_BIT_CABAC函数分析293.4.12 writeCBP_CABAC函数分析303.4.13 write_and_store_CBP_block_bit函数分析313.4.14 write_significance_map函数分析323.4.15 write_significant_coefficients函数分析323.4.16 writeRunLevel_CABAC函数分析333.5 biariencode.c部分函数分析333.5.1 biari_encode_symbol函数分析333.5.2 biari_encode_symbol_eq_prob函数分析343.5.3 biari_encode_symbol_final函数分析353.5.4 biari_init_context函数分析353.6 JM8.6与标准的结合分析35第四章 JM8.6程序上的CABAC性能分析374.1实验前的设置374.1.1实验环境374.1.2 JM8.6编译设置374.1.3 编码配置文件设置384.2实验数据与分析39总结与展望43参考文献44附录45致谢63第一章 绪论1.1可伸缩视频技术概述数字视频技术在通信和广播领域得到了日益广泛的应用,随着互联网和移动通信的迅猛发展,视频信息和多媒体信息在互联网和移动网络中的处理和传输技术成为国内外专家研究的热点之一。视频信息具有直观性、确切性、高效性与广泛性等一系列的有点,但其信息量太大,要使视频得到有效的应用,必须首先解决视频压缩编码问题,其次既要解决压缩后视频质量保证的问题。这两者是相互矛盾的,是矛盾的两个方面。我们的任务是既要有较大的压缩比,又要保证一定的视频质量。传统的视频编码技术主要是面向存储的,目标是单纯地追求某一固定码率下的压缩效率;随着计算机网络技术和Internet的迅猛发展,面向网络应用的视频服务正飞速增长,如:视频会议、可视电话、视频点播、视频监控等。视频编码的目标由单纯的追求高压缩率转向了使视频流能够更好地适应各种不同的网络环境和用户终端,并具有一定的容错性和可伸缩性。1但是,视频(尤其是实时视频)对带宽、延迟和丢失率等都有一定要求,而现有的因特网提供的服务不能为视频应用提供服务质量保证。并且,由于网络和接收端的异构性,使得很难充分利用现有网络带宽和资源、实现服务的灵活性。由于网络的异构性和缺乏QoS保证,带宽往往在一个较大范围内变化,在速率起伏很大的IP(Internet Protocol)网络及具有不同传输特性的异构网络上进行视频传输的要求和应用越来越多。因此对视频编码的要求不但是保证高压缩率,同时还要求编码后的视频流能够适应一定的网络带宽的变化,并具有一定的容错性和多方面的可伸缩性针对网络应用对视频编码技术提出的特殊要求。在这种背景下,视频可伸缩编码的重要性日益突出,其应用非常广泛,且具有很高的理论研究及实际应用价值,因此受到人们的极大关注。可伸缩性视频编码有很好的应用前景,如无线局域网或IP网上传输视频流、网上直播、移动电子商务等。因分层的可伸缩视频编码方法通常把每层的视频流分解成基本层码流和增强层码流,这就允许视频流可在不同的网络环境或流量中传输。在IP网络中不同质量的视频流能被分配给一个或多个不同的客户端,因此根据网络流量的计费管理系统就可得到保证,如DVB-H或3GPP的MBMS等网络,它们有不同能力的终端设备。应用分层编码方法,如果网络支持某种网络流仅传输到某一设备,那么终端不必接受所有的位流。例如在MBMS 或DVB-H网络中可能把H.264基本层码流发送到低性能的终端设备,位流的其他层发送到高性能终端设备。用H.264可伸缩性码流代替联播,可大大减轻主干线的负担。可伸缩性视频编码另一个很有前途的应用是在视频监视系统中,一般来说,从许多摄像机得到的视频必须在终端设备上存储和显示,这可能有不同的空域或时域分辨率。例如在一个监视器或在移动设备上(如可视电话或PDA),许多场景分屏显示,从专用摄像机上观看场景,对这样的应用,可伸缩性视频编码很有吸引力,因为不需要代码或格式转换。监视摄像机发送出来的大量数据必须存储起来,可伸缩性编码可在某一特定时间后删除已存场景的高分辨率层,仅把低分辨率复制到文档中,不必重新编码和复制,使存储更加灵活。一般整个分辨率视频能保持 13天,中间质量(减少时域或空域分辨率)的视频可保持一周,低质量(时域、空域分辨率同时减少)的视频可保持更长的时间。21.2可伸缩视频技术的研究概况与发展趋势可伸缩视频编码(SVC)是目前国际上研究的热点。联合视频组(JVT)围绕 SVC 展开了大量的研究工作,提出了作为H.264/AVC扩展集的SVC方案,实现了时域、空域和质量(SNR)的可伸缩性。H.264/AVC国际视频编码标准的逐渐成熟和推广,越来越多的视频应用已经或即将采用H.264/AVC标准。由于存在不同的网络和不同的终端,因此对于视频编码的可伸缩性方面的要求也越来越迫切。所谓的可伸缩视频编码(scalable video coding:SVC)技术包括空域可伸缩性(分辨率伸缩),时域可伸缩性(帧率伸缩),质量可伸缩性和复杂度可伸缩性等,要求视频编解码器在比特流级别具有以下可伸缩特性:通过简单的丢包或截断码流等操作提取出的子码流具有较低的空间时间分辨率和/或较低的码率(对应于较低的视频质量),同时任何可能子码流的编码效率应该与相应非可伸缩视频编解码器相当。当前国际上对于视频编码技术的研究热点逐渐集中于在H.264/AVC基础上实现可伸缩视频编码。2005年1月,ISO的MPEG和ITUT的VCEG,同意联合起来将SVC作为H.264/AVC的扩展集并由联合视频组(JVT)提出了草案,收录为H.264/AVC的Annex G。此后,每次JVT的会议都围绕着SVC技术对草案进行修订和完善。在2006年10月的JVT会议上,提出了H.264/AVC可伸缩扩展集的第8版草案。3H.264/AVC可伸缩扩展集的一大特点是,扩展集中所采用的 H.264/AVC 中的大部分技术都与AVC标准中的定义一致(例如,运动补偿预测,intra预测,变换编码,熵编码,去块滤波器等),只加入或修改了很少一部分内容。H.264/AVC的可伸缩扩展的技术要点为:(1)时域分级预测结构;(2)用于空域可伸缩性的层间预测机制;(3)基本层与H.264/AVC兼容;(4)用渐进细化片(progressive refinement slices)实现精细颗粒的质量可伸缩性;(5)NAL 单元概念的使用和扩展。H.264在主要档次中采用了基于上下文的自适应二进制算术编码(Context-based Adaptive Binary Arithmetic Coding,CABAC)。CABAC是一种高效的熵编码方法,它在计算的复杂度和编码效率之间作了折衷,建立了基于查表的概率模型,对乘法运算也作了优化,从而获得很高的编码效率。国内外有许多的专家学者都对CABAC做了大量的研究,包括:如何进行CABAC的软硬件实现的算法设计以达到效率的进一步提高;针对编码时间较长的重要图的CABAC编码算法进行优化,降低其计算复杂度,减少其内存访问次数;优化上下文模型的表征,降低CABAC编码器与内存之间的频繁访问和上下文模型表格初始化时的CPU计算量;通过牺牲少量的编码准确度来降低CABAC的计算复杂度,提高编码速率;在CABAC过程中引入子表法与流重用发,来提高编码精确度,等等。H.264被认为是传统视频编码技术的领导者,通过多种新技术的应用使编码效率得到很大的提高,在1.5 Mbit/s左右速率下就可以达到接近DVD的画质效果,但是由于其实现复杂度非常高,大规模工业化使用还尚待时日。目前市场上已有的一些H.264编码产品,多数只实现H.264标准的部分算法,未能完全发挥H.264的编码效率,预计形成成熟的产业链还需一段时间。在标准化方面,H.264无疑是最为全面的,它能够支持从低码率的手机、电视到高码率的高清晰电视等多种应用方式。而H.264中可伸缩性编码将来的发展方向应注重编码效率的提高及算法复杂度减小。1.3主要研究工作我主要的研究工作包括以下几个方面:1、以H.264为主,研究各种可伸缩视频编码技术;2、研究CABAC编码协议以及JM8.6源程序的相关部分,将源程序的流程与编码过程对应起来;3、深入研究并理清CABAC对图像的各种句法元素的编码过程;4、分析比较CABAC的性能。1.4 本文安排本文余下内容将如下安排。第二章将详细介绍H.264标准(下文凡提到“标准”,均指文献4)中的基于上下文的自适应二进制算术编码CABAC,包括对它的二进化,上下文建模与二进制算术编码这三种基本组成部分的深入描述。第三章将解释H.264的官方测试源码JM8.6中涉及到CABAC的部分程序,并与标准相对应。第三章将通过JM8.6分析CABAC的性能,并与CAVLC相比较。具体的章节安排见目录。67第二章 H.264标准中的CABAC2.1概述H.264又名“MPEG-4 AVC(Advanced Video Coding)”,是国际电信联盟电信标准化部门(International Telecommunications UnionTelecommunication Standardization Sector,ITU-T)与国际标准化组织(International Organization for Standardization,ISO)联合开发组共同开发的最新国际视频编码标准,于2003年5月发布了第一个版本。在该标准中采用了一系列先进的编码技术,在编码效率、网络适应性等诸多方面都超越了以往的视频编码标准。其中,为了改进以往标准中熵编码(Entropy Coding)存在的编码效率低、重建效果差以及存在一些不可避免的帧间符号冗余等不足,H.264中规定了两种熵编码的模式,即基于上下文的自适应二进制算术编码 (Context-bsaed Adaptive Binary Arithmetic Coding,CABAC)和基于上下文自适应可变长编码 (Context-bsaed Adaptive Variable-Length Coding,CAVLC )。熵编码直接对变换编码后的系数进行编码。视频信号间有很强的非静态统计依赖性,这些统计特性很大程度上依赖于视频内容和图像获取方式。传统的编码思想是将视频信号的比特流映射成一个个不同码字长的语法元素,这种变长编码仅仅利用了这些非静态统计特性中的一部分进行压缩,而在以往的视频编码方案中,存在于语法元素数值之间的高阶统计依赖性则基本被忽略了。CABAC是H.264/AVC标准中两种熵编码方法中的一种,是将自适应的二进制算术编码与一个设计精良的上下文模型结合起来得到的方法。它很好地利用了语法元素数值之间的高阶信息,使得熵编码的效率得到了进一步提高。它的主要特点有:利用每个语法元素的上下文关系,根据已编码元素为待编码元素选择概率模型,即上下文建模;根据当前的统计特性自适应地进行概率估计;使用算术编码。5图2.1展示了在CABAC中编码一个单独的句法元素的通用方框图。这个编码过程主要由三个基本步骤组成:1、二值化;2、上下文建模;3、基于表格的二进制算术编码。在第一步,一个给出的非二进制值的句法元素唯一地对应到一个二进制序列,叫二进制串。当给出一个二进制值的句法元素时,这一初始步骤将被跳过,如图1所示。对于每个元素的二进制串或每个二进制值的句法元素,后面会根据编码模式有一两个子步骤。接下来就是对二元数据进行编码,标准中有两种编码模式可供选择。在常规编码模式(regular coding mode)中,一个句法元素的每一个二进值(bin)按其判决产生的顺序进入上下文模型器,在这里,模型器根据已经编码过的句法元素或二进值为每一个输入的二进值分配一个概率模型,这就是上下文模型化。然后该二进值和分配给它的概率模型一起被送进常规算术编码器进行编码,此外编码器还要根据该二元位的值反馈一个信息给上下文模型器,用以更新上下文模型,这就是编码中的自适应;另一种模式是旁路编码模式(bypass coding mode),在该模式中,没有模型器为每个二进值分配一个特定的概率模型,输入的二元数据是直接用一个简单的旁路编码器进行编码的,这样做是为了加快整个编码(以及另一端解码)的速度,当然,该模式只用于某些特殊的二进值。后面将更加详细地讨论二值化,上下文建模与基于表格的二进制算术编码这三个主要步骤以及它们之间的相互联系。图2.1 CABAC编码器方框图2.2二值化CABAC的二值化方案有四种基本类型:一元码,截断一元码,k阶指数哥伦布编码,与定长编码。此外,还有基于这些基本类型的联合的二值化方案与基于查表的二值化方案。2.2.1 一元码(Unary)对于一个非二进制的无符号整数值符号x0,在CABAC中的一元码码字由x个“1”位外加一个结尾的“0”位组成。例如,输入的句法元素值为4,其二值化结果为11110。2.2.2 截断一元码(Truncated Unary, TU)已知截断值S。对于一个非二进制的无符号整数值符号0x=(1k) put(1); x=x-(1k)&0x01); /EGk的后缀 break;2.2.4 定长编码(Fixed-Length, FL)对用到定长编码二进化的句法元素值假设了一个有限的字母表 0,1,2,Cmax,编码的二进制长度为 。其中,二进制1对应其中重要性最低的符号,随着重要性的增加,二进制数也会跟着增加。2.2.5 4位FL与截断值为2的TU联合二值化方案前缀使用长度为4位(Cmax=15)的定长编码,后缀使用截断值S=2的一元截断码。2.2.6 TU与EGk的联合二值化方案(Unary/kth order Exp-Golomb, UEGk)前缀使用一元截断码,后缀使用k阶哥伦布编码。对于不同的句法元素值,有不同的截断值与阶数。2.2.7 各种句法元素值的二值化宏块跳过标记mb_skip_flag、4*4亮度块的帧内预测模式标记prev_intra4x4_pred_mode_ flag、8*8亮度块的帧内预测模式标记prev_intra8x8_pred_mode_ flag、当前宏块的帧/场模式标记mb_field_decoding_flag、已编码块标记coded_block_flag、重要系数标记significant_ coeff_flag、最后一个重要系数标记last_significant_coeff_flag、系数符号位标记coeff_sign_ flag、片结束标记end_of_slice_flag、8*8转换系数块标记transform_size_8x8_flag均使用1位的定长编码。运动矢量差的绝对值使用截断值为9的UEG3二值化。色度帧内预测模式intra_chroma_pred_mode使用截断值为3的TU二值化。转换系数的绝对值减一coeff_abs_level_minus1使用截断值为14的UEG0二值化。块编码模式coded_block_pattern使用4位FL与截断值为2的TU联合二值化方案。该句法元素指定了6个块,其中4个用于亮度,2个用于色度,表示其中是否含有非零系数。coded_block_pattern=coded_block_patternY+16*nc,首先,亮度部分的coded_block_patternY使用的是4位FL转换,而色度部分nc用的是截止值为2的TU二进制变换。宏块类型mb_type与子宏块类型sub_mb_type的二值化通过查表获得,详情参见标准。各句法元素的二值化方案可以参见标准中的表9-25。2.2.8 联合二值化方案编码实例输入的句法元素值为幅度的绝对值abs_level=20。则coeff_abs_level_minus1=19,对此使用截断值S=14,阶数k=0的UEG0二值化方案。先编码前缀部分,按照编码规则易得二进制序列为11 1111 1111 1111(14个1)。再编码后缀部分,下面分别按照伪C代码与编码规则进行编码:1、按照伪C代码进行编码x = 19 S = 5。进行第一次循环:51(即12(即11),因此put(1), x=4-2=2, k+1=2;进行第三次循环:24(即1k)&0x01=(21)&0x01=1,所以put(1);进行第二次循环:k-1=0,因为(xk)&0x01=(20)&0x01=0,所以put(0);至此得到EG0的后缀序列10。2、按照编码规则进行编码由x=5得l(x)=log2x(x/2k+1)=2,对应的一元码110即为EG0前缀。又因为x+2k(1-2l(x)=5-3=2=(10)2,其中后缀码字长度为k+l(x)=2,则EG0后缀为10。可见,两种方法得到的联合二值化后缀码字相同,均为11010,则最终输出的二进制序列为11 1111 1111 1111 11010。2.3上下文建模CABAC将片(Slice)作为算术编码的生命期。但对具体句法元素的编码却是发生在宏块级。实际上,在同一个宏块中,不同的句法元素是独立编码。但在不同的宏块中,相邻宏块的句法元素的上下文信息(包括概率状态state与最大概率符号MPS的值)可用于编码当前宏块的同一句法元素。2.3.1 上下文的初始化在开始编码一个新的片时,都会对每个上下文模型指定相应的一对变量(m, n),并根据m, n的值计算出每个上下文模型对应的初始概率状态state与最大概率符号MPS的值。该初始化的过程有以下三个步骤:1、计算 pre_state=(m*(QP-12)4)+n;2、对于P和B帧图像限制pre_state在0,101内,对于I帧图像,限制pre_state在27,74内,即pre_state= min(101, max(0, pre_state)(对P 和B帧),pre_state=min (74,max(27, pre_state)(对I帧);3、将pre_state按以下规则映射到数组state, MPS:如果pre_state=50,state=50- pre_state, MPS=0,否则state= pre_state-51, MPS=1对于不同上下文模型的(m, n)分配参看标准。2.3.2 上下文模型的分类上下文模型大概可以分成4种。第一种上下文模型包含当前要编码的句法元素的两个相邻块的已编码句法元素的信息,其中相邻块的具体位置就要看句法元素了,一般是根据左边与上边的相邻块。第二种上下文模型只对mb_type与sub_mb_type的句法元素有定义。对于这种上下文模型,之前已编码的二进串的值(b0, b1, b2, bi-1)是用来为一个索引为i的二进制句法元素值选择模型的。第三与第四种上下文模型都是只应用在残差数据上。与其它上下文模型不同,这两种类型都是依赖于不同块种类的上下文范围,如下文所示。其中,第三种类型并不依赖于已编码数据,而是待编码数据在扫描路径上的位置。对于第四种类型,首先在前面已编码(已解码)的变换系数幅度中,统计出具有某个特定值的变换系数幅度出现的总次数,然后根据这个数值来为当前变换系数中的二进值确定上下文模型。除了这些基于条件概率的上下文模型,还有固定的概率模型映射到为那些已在常规模式被编码的所有二进串的,以及先前没有指定范围的的上下文模型可以用到的二进值索引。2.3.3 上下文模型的分配与确定通常,每个句法元素的上下文模型根据上下文索引偏移量与上下文增量来确定。其中,上下文索引偏移量对于特定类型片中的特定句法元素是唯一确定的,可以在标准中通过查表获得。而上下文增量,则是根据相邻块的编码情况(也就是上下文信息)得出。对于不同的句法元素,所需相邻块的信息不同,但一般包括可用性(如当前块在片的边缘上,则相邻快可能由于不是在同一片中而不可用)与同一句法元素的编码值。通常用于计算上下文增量的上下文建模函数为ctx_var_spat=cond_term(A,B),A和B表示当前块的相邻块。其中cond_term()表示的是一种函数关系,有以下3种具体情况:ctx_var_spat1=cond_term(A) + cond_term(B);ctx_var_spat2=cond_term(A) + 2*cond_term(B);ctx_var_spat3=cond_term(A)另外,对于利用先前bin值(已编码值)的上下文建模函数为ctx_var_bink = cond_term (b1, , bk-1)各句法元素的上下文增量的具体推导过程参见标准。2.4二进制算术编码算术编码是基于区间划分的,CABAC的算术编码有以下3个明显性质:1、概率估计是对小概率符号LPS(Plps0.5)的概率而言的,是通过基于表格中64个不同概率状态Pk|0k64之间的相互转换而实现的。2、区间长度R通过一组预先量化的值Q1,Q2,Q3,Q4进行量化以计算新的间隔区间。通过储存一个二维表格TabRangeLPS来决定LPS的新的子间隔范围Rlps,表格包含所有64*4预计算值Qi * Pk,通过快速查表这样就可以免除算术编码中的乘法运算了。3、对近似均匀分布(Plps=0.5)的句法元素,在编码和译码时选择旁路方式,可以免除上下文建模,提高编码速度。2.4.1 概率估计在H.264/AVC中的免除乘法的二进制编码基本思想依赖于一个假设:每一个上下文模型估计的概率可以用一个有效的有限的特征值集合来表征。对于CABAC,对LPS有64个特征概率值。 伸缩因子,N64一方面想要获得快速的自适应N要小;另一方面,如果想获得更加稳定更加精确的估计,则需要更大的N。注意在MQ编码中,在CABAC方法中,不需要对LPS的概率值进行表格化。在算术编码中,每一个概率仅仅用其相关的索引 作为地址。这样设计的结果导致,CABAC中的每一个上下文模型可以有两个参数完全决定:LPS概率当前估计值()和MPS的值(0或者1)。这样,在CABAC的概率估计中有128个不同的状态,每一个状态用一个7位整型数来表达。实际上,有一个状态的索引()对应着LPS的最小概率值,但它并没有被纳入CABAC的概率估计和更新的范围,这个值被用作特殊的场合,传达特殊的信息。比如,当解码器检测到当前区间的划分依据是这个概率值时,认为这表示当前流的结束。因此只有126个有效概率状态。另外,有一个状态的索引()对应LPS的最小概率值,它对应的更新值是它自身,当MPS连续出现,LPS的概率持续减小,直到,保持不变。7概率估计指的是上下文的更新,因此只发生在编码不同块中同一句法元素或者其它上下文发生改变的时候,它是通过在LPS的64个概率状态之间互相转移而实现的。对于一个给定概率状态,概率的更新取决于状态索引和已经编码的符号值(MPS or LPS)。更新过程导致一个新的概率状态,潜在的LPS概率修正,如果有必要需要修改MPS的值。如果当state0时,也就是LPS的概率已经达到了最大值0.5,输入的是一个小概率符号LPS,那么MPS和LPS就要互换,因为state0时,Plps0.5。在I片中,有: if(decision=MPS) state-next_state_MPS_intra(state) else state-next_state_LPS(state)在其他片中,有: if(decision=MPS) state-next_state_MPS (state) else statecurrSEnr=0)。使用cabac.c文件中的CheckAvailabilityOfNeighborsCABAC函数(详细见3.4.1)来检查邻居宏块是否可用,并在当前宏块中分别设置对应的指针。重置宏块的输入句法元素(currMB-mb_type = 0, currMB-cbp_blk = 0, currMB- cbp = 0, currMB-cbp_bits = 0等)。3.2.2 write_one_macroblock函数分析void write_one_macroblock (int eos_bit)主要功能:把句法元素传递到NAL。如果当前宏块不是片中的第一个宏块,使用macroblock.c文件中的write_terminating_bit函数对非片结束符号0进行编码。把CABAC编码标记cabac_encoding置为1。 使用macroblock.c文件中的writeMBHeader函数(详细见3.2.3)来编码宏块头。 使用macroblock.c文件中的writeMotionInfo2NAL函数(详细见3.2.4)来编码运动信息。 使用macroblock.c文件中的writeCBPandLumaCoeff函数(详细见3.2.5)来编码当前宏块的块编码模式,量化参数差值与亮度系数。使用macroblock.c文件中的writeChromaCoeff函数(详细见3.2.6)来编码色度系数。把CABAC编码标记cabac_encoding置为0。3.2.3 writeMBHeader函数分析int writeMBHeader (int rdopt)主要功能:编码宏块头。如果是在I片中(img-type = I_SLICE),使用cabac.c文件中的writeFieldModeInfo_ CABAC函数(详细见3.4.2)对宏块的自适应帧/场模式信息进行编码(currSE-value1 = currMB-mb_field, currSE-writing = writeFieldModeInfo_CABAC)。再使用macroblock.c文件中MBType2Value函数把宏块类型转换成对应的编码值(currSE-value1 = MBType2Value (currMB)),然后使用cabac.c文件中的writeMB_typeInfo_CABAC函数(详细见3.4.4)对当前宏块的宏块类型进行编码。如果是在其他类型的片中,只要使用CABAC编码,进行如下处理:使用macroblock.c文件中MBType2Value函数把宏块类型转换成对应的编码值(mb_type = MBType2Value (currMB), currSE-value1 = mb_type),然后使用cabac.c文件中的writeMB_skip_flagInfo_ CABAC函数(详细见3.4.3)对宏块跳过标记进行编码。后面同样对宏块的自适应帧/场模式信息以及当前宏块的宏块类型进行编码,编码过程与I片中的相同。如果当前宏块的宏块类型是8*8P宏块(mb_type = P8x8),:使用macroblock.c文件中B8Mode2Value函数把8*8块类型转换成对应的编码值(currSE-value1 = B8Mode2Value (currMB-b8modei, currMB-b8pdiri)),然后使用cabac.c文件中的writeB8_typeInfo_ CABAC函数(详细见3.4.5)对8*8块类型信息进行编码。接着,使用macroblock.c文件中writeIntra4x4Modes函数对一个8*8块的帧内预测模式进行编码(no_bits += writeIntra4x4Modes(-1))。其中,使用cabac.c文件中的writeIntraPred Mode_CABAC函数(详细见3.4.6)来进行编码。如果当前宏块是I4MB或者I16MB(currMB-IntraChromaPredModeFlag = 1),使用macroblock.c文件中writeChromaIntraPredMode函数对色度的帧内预测模式进行编码(no_bits += writeChromaIntraPredMode())。其中,使用cabac.c文件中的writeCIPredMode_ CABAC函数(详细见3.4.10)来进行编码。最后返回编码长度no_bits。3.2.4 writeMotionInfo2NAL函数分析int writeMotionInfo2NAL ()主要功能:编码运动信息。如果有多个参考帧,要对当前宏块的参考图像参数进行编码。使用macroblock.c文件中writeReferenceFrame函数来编码参考帧。其中,使用macroblock.c文件中BType2CtxRef函数来设置参考帧参数的上下文(currSE-context = BType2CtxRef (mode)),然后使用cabac.c文件中的writeRefFrame_CABAC函数(详细见3.4.7)对当前宏块的参考图像参数进行编码。对前向与后向运动矢量进行编码。使用macroblock.c文件中writeMotionVector8x8函数来编码一个8*8块的运动矢量。其中,使用cabac.c文

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论