decode_one_slice()流程:decode_one_slice()为片解码函数。首先set_ref pic_num()初始化参考帧序列。然后进入循环,对每一个宏块解码。Start_macroblock()初始化当前宏块,read_one_macroblock()中包括熵解码、宏块类型解析、预测模式解析、MVD计算、CBP(CodedBlock Pattern)计算、残差解码等。decode_one_ macroblock()包括反变换、运动补偿、像素重构等。
read_new_macroblock()流程: read_one_macroblock()函数首先初始化一些参数和变量。接着根据宏块类型的不同采用不同的interpret_mb_mode()函数来对宏块进行解析,如I, P, B, SI宏块。然后判断该宏块是否为8×8子宏块分割,如果是,则解析子宏块分割模式。Init_macroblock()函数主要作用是对亮度块中16个4×4块的预测模式、运动矢量进行初始化。然后IS_DIRECT判断该宏块是否B_kip类型宏块,如果是,则按相应算法处理。接着IS_COPY判断该宏块是否COPY类型宏块,如果是,则按相应算法处理。下一步,read_ipred_modes()从比特流中读取亮度块和色度块的预测模式。以亮度块为例,读取时是以4×4块为单位读取的,读取顺序如图3-5所示:
图 3-5 4×4块处理顺序
IS_INTERMV判断该宏块是否帧间编码宏块,如果是,则通过函数readMotionInfoFromNAL()从码流中读取运动矢量残差。最后是分别对亮度和色度宏块进行CAVLC熵解码。解码最小单位是4×4块,每个4×4块在16×16宏块中解码顺序由图3-5给出。
decode_one_slice()流程:decode_one_macroblock()首先针对亮度块解码,之后对色度块解码。首先判断宏块是否采用16×16帧内预测,如果是,则通过函数intrapred_luma_16x16()解码。然后对一个16×16宏块中的每个4×4块分别解码,每个块的解码顺序如图3-5所示,直到所有块解码完成为止。解码4×4块时,首先判断是否为帧内编码,如果是,则通过函数intrapred对4×4块帧内解码。如果是帧间编码,则还要判断是P或是B帧。找到参考帧的匹配块后,用get_block()像素内插恢复像素值。itrans()对当前块的残差进行反变换,然后再将反变换值和预测值相加得到重构值。接着,将该重构值赋给dec_picture->imgY保存。其中dec_picture是一个用来存放解码值的解构体,其成员imgY存放亮度解码值。最后是色度块解码。由于色度块解码和亮度块解码流程基本相同,在这里省去。
4 转码平台搭建和实验结果分析
本人在熟悉并使用H.264编解码程序对原始图像进行编解码过程中,通过理解并调试重要参数,在基于JM10.1模型的基础上,搭建了跳帧转码,降码率转码等多种视频转码类型。
4.1 跳帧转码
由于第三代移动通信技术的推广,面向移动终端用户提供多媒体服务成为必然的发展趋势。但是,无线信道的带宽容量有限,要求我们将现有的高码率视频进一步压缩。在码率变换较大的情况下,单纯依靠码率变换的方法已经不能获得较好的视频图像质量。同时移动终端设备由于显示器处理能力,设备成本,能耗等限制,要求视频的帧率相对较低,这就要求我们使用降低时间分辨率的跳帧转码。
在JM10.1模型的配置文件“encoder.cfg”中通过修改FrameSkip这个重要参数,可以实现跳帧转码。编码器基本设置如下:
(1) 图像大小为176×144 QCIF格式,色度采样格式为YUV420,图像序列为常用的标准测试序列: suzie。
(2) 编码图像总数50帧,其中第一帧为I帧编码,其余49帧为P帧编码。
(3) 采用固定QP=28,码率控制RC关闭。
(4) 帧率为30.Ofps,采用去块效应滤波。
(5) FrameSkip设置为1,即每输入两帧跳过一帧进行编码。
- 上一篇:AT89C52单片机的电子万年历设计+硬件电路
- 下一篇:基于组态软件的汽车故障设置检测系统设计
-
-
-
-
-
-
-
NFC协议物理层的软件实现+文献综述
中国传统元素在游戏角色...
C++最短路径算法研究和程序设计
巴金《激流三部曲》高觉新的悲剧命运
g-C3N4光催化剂的制备和光催化性能研究
现代简约美式风格在室内家装中的运用
江苏省某高中学生体质现状的调查研究
上市公司股权结构对经营绩效的影响研究
高警觉工作人群的元情绪...
浅析中国古代宗法制度