9.3.2. H264模块功能说明

9.3.2.1. 原理框图

下图是H264解码引擎的功能模块以及外部接口示意图。

../../../_images/avc_framework.png

H264解码引擎包含了时序控制、熵解码、反量化、反变换、重构、帧内预测、帧间预测、deblock、后处理等模块,每个模块的处理的基本单元是MB(Macroblock)。

  • 熵解码从外部DRAM读取原始码流,并分别解码出MB信息与块系数信息,其中MB信息会传递给帧内/帧间预测模块、Deblock模块,块系数信息会传递给反量化模块;

  • 反量化模块根据接收到的块系数以及反量化参数进行反量化,并将反量化后的结果传递给反变换模块;

  • 反变换模块根据当前宏块信息选择正确的反变换方式进行反变换,将反变换后的残差系数传递给重构模块;

  • 帧内/帧间模块根据收到的MB信息从参考帧中计算出当前块的预测值;

  • 重构模块将收到的残差系数与预测值进行相加,得到当前的块的像素值;

  • Deblock模块根据当前的MB信息将当前块边沿像素值进行平滑滤波,输出最终的解码图像;

  • 时序控制根据图像标准与MB类型对各个子模块进行调度,确保解码过程的正确性与高效率,为了提高解码效率,各子模块之前采取并行的方式进行

9.3.2.2. 功能说明

视频文件解码包括文件解析、视频原始码流分离、视频序列头数据解析、视频帧/场头数据解析、视频slice头数据解析、MB数据解析与解码等过程。

VE引擎仅仅对运算量要求比较大的Slice级以及MB级数据进行处理,对于Slice和/或MB之上的数据处理仍然需要主CPU进行处理。

9.3.2.3. 解码流程

H.264格式解码流程如下:

../../../_images/avc_decode.png

H.264格式启动一次解码仅完成一个slice数据解码,一个slice可以是完整的一帧图像,也可以是部分图像。

9.3.2.4. 解码辅助功能

  • startcode检测

VE引擎还具有startcode检索、错误检测等功能。当VE引擎检测到下一个非slice startcode, VE引擎会将检测到的startcode之前的所有数据送给解码器,并将码流读取指针停留在startcode之前。

  • 错误处理

当所有数据解码完成后,无论当前帧解码是否完整,都视为解码完成,主CPU需要根据已经解码出的MB个数判断当前解码是否正确。当解码遇到错误时(超越规定的范围值),VE引擎会停止解码,并将码流读取指针停留在当前位置,在发出解码完成中断通知的同时产生解码错误的中断,主CPU需要根据当前的错误情况进行容错处理。

  • 写保护

VE引擎还具有外部SDRAM写保护功能。主CPU可设置一个允许VE引擎可改写的SDRAM地址范围,当VE引擎尝试改写该地址范围之外的地址空间时该功能将阻止对SDRAM的真正改写,并触发错误中断。

9.3.2.5. 原始码流配置功能

../../../_images/vbv_buffer.png

原始码流缓冲区(Bitstream Buffer)用于存放VE解码所需要的原始码流,由主CPU负责写入,VE解码引擎负责读取。该Buffer是一个环形Buffer,当VE引擎读取到结束地址后自动返回到开始地址继续读取,因此在启动解码之前主CPU需要通知VE引擎该缓冲区的开始地址、结束地址、有效码流的偏移位置、有效码流长度等信息。

VE引擎在读取过程中会通过寄存器实时给出当前的读取偏移量,主CPU会根据VE读取的偏移量继续有效填写数据,避免数据溢出(overflow)。VE引擎将配置的有效数据解码消耗完成后,如果还无法完成当前解码,则表示当前解码数据不够,如果主CPU已经配置last位(表示当前解码所需的数据都已经写入),则表示当前解码出错,VE引擎将结束当前解码任务,如果主CPU没有配置last位,则表示当前解码所需的数据还只是部分写入,则VE引擎仅产生解码中断,保持当前所有状态,等待主CPU将下笔数据写入并启动VE引擎,然后继续当前的解码任务。

为了保证数据读取的高效率以及降低数据读取延迟(latency)的敏感度,VE引擎内部还有一个小的缓冲区,VE引擎首先从外部SDRAM中的原始码流缓冲器中读取有效数据,并放入内部的小缓冲区,然后熵解码基于该小缓冲区进行解码。尽管熵解码没有直接基于SDRAM中的码流缓冲区进行解码,VE引擎会将有效消耗的数据位偏移量正确映射到码流缓冲区上。当主CPU向原始码流缓冲区写入数据时,如果中间通过Cache,必须确保数据真正写入SDRAM后才能启动VE解码。