X26
- 2. x264_param_default 设置默认参数 读取命令行并分析 Parse 编码 Encode X264.c: main X264.c:Encode 得到总帧数 p_get_frame_total 初始化编码器 x264_encoder_open 为新图分配空间 x264_picture_alloc 对帧编码 Encode frame 延迟的 B 帧 更新,清理图片区, 关闭解码器,关闭输入输出文件 设置输出文件参数 p_set_outfile_param
- 3. X264 : Encode_Frames 不强制任何参数 调用 x264_encoder_encode 进行编码 编码 NAL 层 x264_nal_encode p_write_nalu 写入 图片结束 Encoder.c: x264_encoder_encode 将图片 copy 到一帧 中去并且移动到一个 缓冲器 选择帧类型 移动一些 B 帧 和一个非 B 帧到编 码队列中去 获得要被编码 的帧 编码 Do encode 更新编码器状态 计算和打印 统计值 判断是否存放 重建的帧 设置输出 图片属性
- 4. Encoder.c: do encode 设置帧上下文 (初始化帧类型) 初始化 (参考列表, bit 率控制) 创建切片头部 写入 bit 流:初始化 bit 流上下文 - > 写入序列参数信号和图片 参数信号- > 写入切片数据 ( x264_slice_write )- >bit 流 结束,设置输出。
- 6. 是否为 跳过宏块 是 进行相关处理 否 是否为 cabac 编码 是 否 写入 cavlc 编码 x264_macroblock_write_cavlc 写入结束 保存缓冲区数据 编码结束( cabac 或者 cavlc ) NAL 单元编码结束 End 写入 cabac 编码 x264_macroblock _write_cabac
- 7. 设置 QP 并且避免 QP 变化太快 对分析进行初始化 判断切片类型 B 分析开始 进行帧内模式分析 比较 16*16 和 4*4 子块模式 I P P 切片分析 B 切片分析 从分析中更新 宏块 宏块分析结束 Analysis.c : x264_macroblock_analyse
- 8. P 检查是否为 跳过 P 宏块 是 否 相关处理 分析加载花费 分析帧间 16*16 模式 是否为 16*16 子块模式 是 否 分析帧间 P 模式 8*8 子块 选择最好的 帧间模式 检测到 16*16 子 块信号并且帧内 8*8 花费 小于 16*16 运动 估计花费 P 切片分析 分析帧间 8*8 子块 是 否
- 10. B 切片分析 判断是否为 直接模式 是 否 进行相关处理 判断是否为 skip 模式 否 是 分析加载花费, 直接模式和 帧间 16*16 模式 是否收到 16*16 子块信号 分析帧内 8*8, 8*16,16*8 子块 否 加工 1/4 象素精度
- 12. Macroblock.c: x264_macroblock_encode 判断是否为 跳过 P 宏块 是 x264_macroblock_ encode_pskip( h ) 否 判断是否为 跳过 B 宏块 是 x264_macroblock_ encode_skip( h ) 否 量化缩放 判断宏块类型 I 16*16 x264_mb_encode _i16x16 x264_mb_encode _i4x4 Inter MB I 4*4 运动补偿 x264_mb_mc 16×16DCT 变换 分别对每一个 4×4 块量化和 z 扫描 以及对每一个 8×8 的块进行化简 色度编码开始
- 13. 量化放缩 判断是否为 skip 模式, 并进行相关处理 x264_mb_encode_8x8 计算亮度色度句型,以及非零计数 存储 cbp: coded_ block_ pattern 检查 P/B 跳过情况, 进行相应处理 色度编码结束 宏块编码结束
- 14. Encoder.c: x264_mb_encode_i16x16 读取 h->mb.pic.p_fenc[0 ] 中的数据, 对其进行 16*16dct 变换,系数存放 在一个三维数组( 17*4*4 )里边 , 的 dct[1][][] 中 进入循环 16 次 对每一个 4*4 块进行编码 将所有的 4*4 块的 dc 系数,按照 一定顺序存放在 Dct[0][ ] [ ] 中 量化 Z 扫描,结果存放于 h->dct.block[i].residual_ac 反量化所有 dct[1][][] 中的系数 i<16 是 否 对 dct[0][][] 中的所有 dc 系数 进行量化和扫描,解雇存放于 h->dct.luma16x16_dc 重建块( idct, 反量化),并将结果 存放入 h->mb.pic.p_fdec[0] 宏块编码结束
- 15. Encoder.c: x264_mb_encode_i4×4 对 4*4 子块 dct 变换从 p_src 和 p_dst 取出数据变换以后放在 dct4*4 中 对 dct4*4 量化 4*4 Z 字型全扫描结果存放于 h->dct.block[idx].luma4x4 对 dct4*4 中的数据解量化 对 dct4*4 中的数据进行 idct 变换, 结果放置于 p_dst 中,用于重建 编码结束
- 16. commonacroblock.c :x264_mb_mc 判断宏块类型 为使用列表 0 预测的 16*16 预测模式 分三种情况进行处理 ( 16×16 , 16×8 , 8×16 ) x264_mb_mc_0xywh 分为 D_L0,D_L1, 以及 B 预测 三大种种情况进行讨论分别调用: x264_mb_mc_0xywh x264_mb_mc_1xywh x264_mb_mc_01xywh x264_mb_mc_direct8x8 进行处理 如果宏块类型为 P8*8 或者 B8*8 是否为 B 跳过 或者直接模式 是 x264_mb_mc_direct8x8 初始化参考列表 否,即为其 他 B 模式 判断 宏块部分 类新 D_16x16 D_16x8 D_8*16 End
- 17. Macroblock.c: x264_mb_encode_8x8( 编码色度成分 ) 对色度成分进行 8×8 子块 dct 变换 对每一个 4×4 子块进行处理: 存储 dc 系数,量化, z 扫描,反量化 对每一个子块的 dc 系数进行单独处理 量化, z 扫描 对每一个子块的 dc 系数进行反变换和反量化 用于重建块 判断如果为 B 帧间模式并且简化参数足够低则: 该 8*8 块几乎没有色度数据因此把它置为空, 这样作可以节省 bit 对整块进行反 dct 变换,用于重建 结束
- 18. Cavlc.c:x264_macroblock_write_cavlc 判断切片类型 I,P,B 写入宏块类型,预测,和运动矢量 是否为 I_PCM 类型 是 写入哥伦布函数 bs_ write _ue 补齐 0 分别写入 Y, Cr, Cb 值 并且返回 结束 否 是否为 I_4×4 类型 是 写入哥伦布函数 bs_ write _ue 为每一个 4*4 亮度子块进 行预测返回预测模式 写入每一个亮度 4×4 子块的预测模式 写入色度的预测模式 是否为 I_16×16 类型 写入亮度和色度 的预测类型 是 否 是否为 P_L0 类型 跳出类型判断 跳出类型判断 是 判断宏块部分的类型 ( 16×16 , 16×8 , 8×16 ) 写入部分类型,针对每种不同类型 写入参考帧号和预测矢量 跳出类型判断 否
- 19. 是否为 P_8×8 类型 是 否 写入子宏块类型 写入 4 个参考图像索引 写入子宏块的 mvd ? x264_sub_mb_mv_write_cavlc 跳出宏块类型判断 是否为 B_8×8 类型 写入宏块类型 写入子块类型 写入参考帧索引 写入残差块,注意对 B 宏 块来说是两个残差分量 跳出宏块类型判断 是否为 B 直接类型 否 是 否 初始化参考列表 写入宏块类型 写入参考帧索引 写入 mvd 直接写 0 是 写入编码的块的句型 写入残差数据 block_ residual_ write_ cavlc 结束