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单片机的电子万年历设计+硬件电路
- 下一篇:基于组态软件的汽车故障设置检测系统设计
-
-
-
-
-
-
-
乳业同业并购式全产业链...
电站锅炉暖风器设计任务书
河岸冲刷和泥沙淤积的监测国内外研究现状
杂拟谷盗体内共生菌沃尔...
大众媒体对公共政策制定的影响
酸性水汽提装置总汽提塔设计+CAD图纸
十二层带中心支撑钢结构...
中考体育项目与体育教学合理结合的研究
java+mysql车辆管理系统的设计+源代码
当代大学生慈善意识研究+文献综述