(转)x264 编码流程 (2)


1.        初始化当前帧的状态
2.        当前进行的是帧编码,因此NAL单元携带的是一个编码片,一个NAL单元应由一组对应于视频编码的头信息和一个压缩编码后的视频数据序列。 写当前NAL单元的头信息(x264_nal_start)
3.        写片头信息(x264_slice_header_write),包括:片中第一宏块的地址,片的类型,参考帧索引及一些帧编码模式的选择
4.        循环对每个宏块进行编码:
         I.        先获得宏块的位置坐标(i_mb_x,i_mb_y),若i_mb_x为0,则进行去块滤波;
         II.        将当前宏块的上和左边的宏块加载进来存入数组(x264_macroblock_cache_load)。
         III.        对宏块进行分析(x264_macroblock_analyse),通过计算SAD值,决定宏块预测类型
                  A.        I帧:只使用帧内预测,分别计算亮度16x16(4种)和4x4(9种)色度8x8(3种)所有模式的代价值,选                              出SAT值最小的模式
                  B.        P帧:计算帧内模式(同A)和帧间模式。帧间预测:对P帧的每一种分割进行帧间预测,得到最佳的运动矢量及最佳匹配块。过程:寻找当前块的后续矢量—— >选出最佳矢量——>找到最佳的整像素点——>找到最佳的二分之一像素点——>找到最佳的1/4像素点,取代码最小的为最佳MV 和分割方式。最后从帧内模式和帧间模式中选择小者。
          IV.        对宏块进行编码
                  A、        帧内预测模式时,用所选的预测模式对宏块中的像素值进行预测,若当前块是第一块,则预测值为128
                  B、        帧间预测模式,用所选的运动矢量进行运动补偿得到宏块的预测值。对残差矩阵进行变换量化,扫描和CAVLC熵编码。
           V. 将CAVLC编码结果写入h->out.bs(x264_macroblock_write_cavlc);保存宏块信息 (x264_macroblock_cache_save);通过调整QP进行码率控制;RBSP比特填充(bs_rbsp_trailing),一次 nal编码结束,指向下一个nal(x264_nal_end);

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgygxw.html