1.3 视频解码原理及主流解码器
根据前述的视频编码过程,视频解码流程是编码的逆操作。实际上,任何一个编码器都隐含了解码器的大部分操作,如对于MPEG-4视频编解码算法来说,在图像或残差做DCT变换、量化后,接着是反量化、IDCT变换,然后将重建的数据补偿到编码图像中,从而保证解码时数据不会产生偏差。而实际的解码器只是增加了熵解码的操作,后续的处理与编码器中的图像帧重建是相同的。
图1-10列出了混合编码算法框架的视频解码原理流程图。首先解析码流的头数据,获取编码图像的有关参数,包括帧编码类型(I/P)、图像宽度或高度等,后续就是以宏块为单位循环解码,图中的阴影框表示以宏块为处理单元循环执行。熵解码是可变长编码VLC的逆操作,即VLD。H.263/MPEG-1/2/4是Huffman熵解码,即通常意义上的VLD,而H.264则是采用了算术解码,又包括CAVLD、CABAD。另外,对于帧间编码的宏块,解码器还要解析出当前宏块的运动向量。熵解码后是反量化操作,反量化就是量化结果乘以量化步长,对于不同的解码算法又有不同的反量化处理,H.263采用了32级的均匀量化,即宏块数据采取一个量化步长;MPEG-4除了支持H.263的均匀量化外,还增加了量化表的处理方式;H.264采用了52级的均匀量化方式。反量化处理后,进行反变换IDCT,对H.263/MPEG-1/2/4采取了8×8块的浮点式IDCT,H.264采取了4×4的整数ICT。运动补偿是解码器中的重点,占用了约60%以上的计算负荷,这是因为码流统计中帧间编码为主要的编码类型,而与之对应的处理就是插值运动补偿,根据从码流中解析的运动向量信息,定位参考帧的确切位置,然后计算1/2、1/4像素精度的插值,最后把结果补偿(加)到重建帧中。解码器中的最后处理是可选的去除块效应(MPEG-4)、环路滤波(H.264)、图像扩展等。
图1-10 视频解码流程图
通常,解码器除了能实现上述的基本处理外,较强壮的、通用性强的解码器还包含码流纠错、解码算法的多平台优化、画面质量提升等技术。开源的多媒体解码集合如ffmpeg/ffdshow等为特定的应用实现、平台移植等提供了良好的蓝本参考,本书的MPEG-4/H.264解码器均借鉴或参考了业界公认的开源算法,这也为读者基于这些开源工程以快速构建自己独特的解码器做了良好的支撑。