本篇源出的目的,是因为我们到目前为止,并没有达成一个默契。那就是我们接下来学习H264句法和语义的宗旨,是从简单到复杂,这里的简单就是最简单。意思是我们先在最简单的情况下,来看看怎么做出一个H264编解码器,然后逐步放开条件,去研究更复杂的功能。
之所以此时写出这么一篇,是因为我们接下来,会遇到很多看似错综复杂的句法元素,因为H264本身,就是一个错综复杂的整体。因此我们要学会将复杂的问题,以简单的眼光看待,养成选择性忽略某些句法元素的习惯。
而忽略的原则,就是我们形成的默契:一个最简单的H264编解码器是如何实现的?
我们已经知道,H264本身是由多个功能累加形成的整体,放在软件开发里,这些功能一定有个先后顺序。因此我们只需要立足于最简单的1.0版,找出最重要的几个功能,先研究透彻即可。
下表即H264所具有的主要功能:
最简单的H264编解码器
如表所示,我们只会用到baseline中背景色部分功能,所以后面暂时并不会涉及到数据分割的部分,因此nal_unit_type等于2、3、4的情况都不会出现。并且我们也不会使用FMO,所以在这种情况下,我们可以简单的认为,一个slice就代表了一帧数据。
同时场编码、P_Slice、B_Slice、CABAC、加权预测都不会用到,这样一来,我们就可以从最简单的一种情况来分析,看看一个 i 宏块是怎么编码和解码的,帧内预测是怎么用的,然后再逐步放开条件,去研究更深入的东西。
在接下来的Slice_Header的句法和语义一文中,我们就要渗透这一原则,暂时用不到的句法元素,虽然也会讲解到,但我们要选择性的忽略掉。