电子文章 | 电子资料下载 | 家电维修 | 维修资料下载 | 加入收藏 | 全站地图
您现在所在位置:电子爱好者维修技术维修教程知识电子制作基于DM642的X264开源代码实现的研究

基于DM642的X264开源代码实现的研究

09-08 12:15:28 | http://www.5idzw.com | 电子制作 | 人气:742
标签:电子小制作,http://www.5idzw.com 基于DM642的X264开源代码实现的研究,http://www.5idzw.com
摘要:本文概述了H.264视频压缩编码标准的主要特性,简要介绍了当前H.264的几种开源软件,详细分析了其中X264参考程序的具体结构,并针对TMS320DM642平台建议了可能的优化方向。
关键字:H.264;开源软件;X264;TMS320DM642;优化

引言

H.264/AVC是ISO/IEC和ITU-T两大国际标准化组织联合制定的新一代视频编码标准。它引入多种宏块划分、多模式的帧内和帧间预测编码、高精度亚像素运动估计、多参考帧运动补偿等技术,提高了压缩比;采用整数DCT变换,避免了精度的损失。在码流结构上,提出VCL层和NAL层的概念,其中增加的NAL层负责将编码器的输出码流适配到各种类型的网络中,提供了友好的网络接口。同时,标准提供的许多工具如参数集、灵活的宏块排列次序、冗余片等,使得H.264的码流在网络中传输时具有更强的抗误码性能。基于H.264的实时编解码器设计与实现已经成为当前视频通信领域的热点问题。

1、H.264开源代码简介

       H.264所具有的独特优势促进了与之对应的开源软件的开发与应用。目前常见的H.264开源软件编解码器有以下三种 :

       1)JM

       H.264的官方测试源码,由德国HHI研究所负责开发。该代码旨在实现H.264的所有特性,因而结构冗长,编码复杂度极高,多用于学术研究,不适于实际应用。

       2)X264

       X264是由法国巴黎中心学校的中心研究所于2004年6月发起,并由许多视频编码爱好者共同完成的项目。其目标是实现实用的264编码器,所以它引入MMX、SSE等汇编指令来提高编码速度,同时摒弃了一些耗时但对编码性能提高微小的模块,如多参考帧等。

       3)T264

       由中国视频编码自由组织联合开发的H.264编解码器。它和X264一样注重实用,吸收了JM、X264、XVID的优点。但其解码器只能解T264编码器生成的码流。

2、X264代码分析

       本文所介绍的X264为060418版,下文所提到的程序结构和运行结果如不作特殊说明均针对该版本。

       代码的实现流程如图1所示。

图1  X264编码流程图

       整个代码的执行可以分为以下三个部分:

    1)数据的读入与存放

       X264开辟了unused、next、current、reference等区域分别保存未处理原始图片序列、即将编码帧序列、当前编码帧和参考帧序列,同时还开辟了fenc和fdec区域用于存放已编码帧和重构帧。

       程序按以下顺序读入数据:首先,从YUV数据文件中读取数据存到临时变量pic_in,同时为unused开辟存储空间,并用fenc指针指向这个空间。接着,将pic_in中的图片数据拷贝到fenc所指向的区域,并在拷贝完成后对图片大小进行判断,如果长宽不为16的整数倍则进行像素扩展;将处理后的fenc区域数据放入next区域。之后,如果存在B帧,则从next区域取出B帧以后的P帧放到current区域中,也就是说先编码I、P帧再编码之间的B帧;否则,直接从next区域取出一帧存入current区域。此时current区域中存放的就是已经过预处理的即将要编码的帧数据了。最后,由于fenc区域是编码的直接对象,再将current区域中的内容拷贝到fenc中正式开始编码。

    2)数据的压缩编码

    ①判断帧类型,初始化相关参数

如果是IDR帧,意味着是一个新切片的开始。在H.264中为了防止编码错误扩散规定当前切片不以本切片以外的其它帧为参考,因而遇到IDR帧需要重置参考帧区域。同时,将SEI(Sequence Enhancement Information)、SPS(Sequence Parameter Set)和PPS(Picture Parameter Set)分别单独写入NAL单元。这三个参数集集合了编解码的核心参数,直接关系解码端能否正常解码。如果不是IDR帧,依据帧类型设定当前NAL单元的类型和切片类型。

接着进行一系列初始化参数的操作,包括建立关于参考帧的list0和list1,初始化量化参数QP、MV、参考帧等相关变量,初始化比特流的起始位置和大小等。

    ②以宏块为单位对视频数据进行编码

    在进行预测编码之前必须得到周围块的相关信息。在X264中开辟了intra4x4_pred_mode和non_zero_count区域用来存放当前宏块左侧和上侧相邻宏块的预测模式和非零值个数。在编码开始之前通过x264_macroblock_cache_load()函数将相关数据载入缓存。然后,利用x264_macroblock_analyse()函数分析参数,确定最佳编码模式。I片从9种4x4模式和4种16x16模式中选择模式; P片选择帧间预测模式下的宏块分割方式或帧内预测模式下的4x4模式和16x16模式。接着,用x264_macroblock_encode()函数对宏块进行编码。编码过程严格按照编码框架中规定的DCT变换、zigzag扫描和熵编码的过程以先亮度块再色度块的顺序进行。需要声明的是编码过程对DC参数和AC参数的处理是分开进行的:首先对整个宏块进行DCT变换,然后将亮度块和色度块的DC参数抽出分别组成4×4和2×2的子块并对剩余AC参数进行量化扫描,接着对DC子块再进行Hadmard变换、量化、zigzag扫描、反变换、反量化,再对剩下的AC参数进行反量化,最后将处理后的DC子块和AC子块重新组合并对组合后的宏块进行IDCT变换。

    以上过程完毕以后,统计CBP(Coded Block Pattern)信息。CBP一共6bit,用于表示当前宏块是否存在非零值,主要用于决定熵编码时采用的码表。其中,高2bit表示2个8×8色度块的CBP (2:Cb、Cr中至少一个4×4块的AC系数不全为0;1:Cb、Cr中至少一个2×2的DC系数不全为0;0:所有色度系数全0)。低4bit分别对应4个8×8亮度块,第i位(i= 0、1、2、3)表示一个MB中第i行的4个4×4子块是否有非零参数。若存在非零值,则将相应位置1。将各子块的非零值个数保存到non_zero_count区域。使用先前得到的CBP查相应码表进行熵编码,将编码参数和编码数据写入比特流。

    ③保存编码信息

    利用x264_macroblock_cache_save()函数将当前MB最下一行和最右一列的子块的编码模式保存到intra4x4_pred_mode,将子块非零参数的个数保存到non_zero_count中,以备下一次预测编码采用。最后,统计MB信息,更新参考帧列表,并从unused区域取出新的帧放入fenc区域以备下次编码。

    3)数据的输出

    对NAL编码数据加上NAL头信息组成完整的NAL单元,输出到本地文件。

3、X264在TMS320DM642平台上的移植与优化

       原始的X264代码是基于PC平台的,程序通过采用MMX和SSE语言编写SAD、DCT等函数使X264具有很高的编码速度。而在实际应用中,要想实时实现H.264的复杂算法,必须借助DSP这样具有超强运算能力的嵌入式平台。本文采用TMS320DM642开发板作为实现和开发的平台,并在其上进行代码的移植和优化。

       1)TMS320DM642硬件平台简介

       TMS320DM642是一款基于TI 的第二代高性能超长指令字(VLIW) 架构VelociTI.2(tm)的高性能DSP,该器件是目前计算密集型视频/图像应用领域的理想选择,其主要特点如下 :

    ① 增强功能单元:DM642 的8 个功能单元中的VelociTI.2 扩展包括加速视频与影像应用性能的新指令。

    ② L1/L2 分级存储器结构:16 KB 直接映射的L1P 程序高速缓存,16 KB 双路关联L1D 数据高速缓存,256 KB L2 统一映射RAM/高速缓存(灵活的RAM/缓存分配)。

    ③ 64 位外部存储器接口(EMIF):可实现与异步存储器和同步存储器无缝连接。

[1] [2]  下一页

,基于DM642的X264开源代码实现的研究
关于《基于DM642的X264开源代码实现的研究》的更多文章