H.264编码过程

x264编码过程笔记

// ------------------------------------------------------------------------------------

一、初始化
1、一次性分配所有需要用到的内存。
2、根据参数填充或归零初始化x264句柄结构体中的各个成员以及相关的全局变量和内存缓存区。
3、初始化sps和pps。
4、初始化各个主要运算函数指针(例如:DCT运算,根据不同平台优化的不同函数,在此指定)。

// ------------------------------------------------------------------------------------

二、编码
1、将源YUV数据按指定格式和形式拷贝到指定缓存区。
2、决定当前编码帧类型。
3、创建参考帧列表。
4、初始化条带。
5、初始化比特流缓存。
6、初始化NAL。
7、【编码主流程】
8、处理重建帧,更新参考帧。
9、将NAL编码并输出到最终进行传输或保存的缓存区。

// ------------------------------------------------------------------------------------

三、【编码主流程】

//=========================================
I帧:

1、确定当前待编码宏块,赋值源宏块指针以及重建宏块指针,同时初始化或载入某些缓存的变量,以及设定当前宏块位置信息。
2、根据当前宏块位置确定可以尝试的预测模式,然后全部预测一遍,选出代价值(SAD)最小的预测模式作为当前宏块的帧内预测模式。这个步骤分别对Y和UV进行。
3、根据上一步确定的预测模式初步预测出当前重建宏块。
4、当前重建宏块与当前源宏块进行残差,之后再进行16x16的DCT。
5、将16个4x4DCT结果的DC分量抽取出并按Z字形重排;AC分量则进行量化、Z字形重排以及反量化。
6、将上一步排好的DC分量进行4x4DCT、量化、Z字形重排、反4x4DCT、反量化。
7、将第6步中反量化后的DC按重排前的顺序放回到第5步中反量化后的AC中,形成整个反量化后的16x16的DCT结果。
8、将第7步中16x16的DCT结果与第3步中的初步预测出的重建宏块进行反残差以及反DCT运算,得出最终的重建宏块。
9、以上步骤是针对luma(即:亮度Y)信息而言的,对于chroma(即:色差UV)则也进行上述步骤,只是其中有一处小的差别:会对重排后的AC分量进行分值计算,如果小于7分则AC分量全部清零。
10、将当前宏块的相关信息(例如:预测模式、量化步长等)写入比特流,然后再分别将luma和chroma的残差量化Z字形重排的结果进行CAVLC编码后写入比特流中。
11、缓存住一些下一帧需要用到的信息。

以上步骤就是一个I帧宏块的编码过程,宏块编码是按照从左至右再从上至下的顺序进行,将所有宏块编码完毕,则一个完整的I帧就编好了。
//=========================================


//=========================================
P帧:

1、与I帧该步骤类似,此外还多了赋值参考宏块指针,以及初始化或载入运动向量信息。

2-1、P_SKIP模式的判定:
2-2、获取缓存的运动向量,并进行裁剪处理。
2-3、对当前参考宏块进行亮度的运动补偿,得到初步的亮度重建宏块。
2-4、将前面的亮度重建宏块与亮度源宏块进行残差和16x16DCT。
2-5、然后分别对每个4x4的DCT结果进行量化和Z扫描(注:简化‘Z字形重排’这种说法,实质都是一样的),并进行分值计算,若累计分值超过6分,则该宏块不作为P_SKIP(即:忽略宏块)。
2-6、对当前参考宏块进行色度的运动补偿,得到初步的色度重建宏块。
2-7、将前面的色度重建宏块与色度源宏块进行残差和8x8DCT。
2-8、对上一步的4个2x2DCT结果的DC分量进行2x2DCT并量化,然后,如果运算所得结果中有一个不为零,则该宏块不作为P_SKIP。
2-9、对2-7步的4个2x2DCT结果进行量化和Z扫描,并进行分值计算,若累计分值超过7分,则该宏块不作为P_SKIP。

3、如果当前宏块作为P_SKIP,则获取缓存的运动向量,然后缓存参考帧序列和运动向量。
4、此时,P_SKIP宏块的帧间预测步骤完成。

5、如果当前宏块不作为P_SKIP,则进行16x16的Inter块运动估计(整像素),此时宏块类型为P_L0。
6、获取缓存的运动向量,然后为了获取最佳运动向量而进行宏块搜索,首先用缓存的运动向量来初始化最佳运动向量,然后进行小钻石搜索,通过代价值来判定是否结束搜索,并相应的更新最佳运动向量。
7、进行1/2精度的运动估计,将当前参考宏块的亮度进行4种基于上一步最佳运动向量的运动补偿,然后分别用SAD计算宏块的相似度(代价值),判断最佳代价并根据代价更新运动向量,最后保存最佳运动向量。
8、缓存参考帧序列和运动向量。
9、此时,P_L0(非P_SKIP)宏块的帧间预测步骤完成。

10、如果不为P_SKIP宏块,则基于参考宏块进行运动补偿,得到初步的重建宏块。之后的步骤与I帧的4~8步骤类似,只不过对于亮度而言,多了分值的判断,小于特定分值的情况下会将亮度信息忽略。
11、如果不为P_SKIP宏块,则进行类似I帧的第10步,只是多了一些相关信息的记录(例如:运动向量)。
12、缓存住一些下一帧需要用到的信息,其中包括运动向量和运动参考。

以上步骤就是一个P帧宏块的编码过程,宏块编码是按照从左至右再从上至下的顺序进行,将所有宏块编码完毕,则一个完整的P帧就编好了。
//=========================================

你可能感兴趣的:(笔记摘要)