SlideShare a Scribd company logo
1 of 19
谢谢你: 我只对编码部分整体的看了一边,理解很浅显,希望你看完之后能够帮我指正一下。 每一个流程前边列出了该流程的出处,我只针对自己认为比较复杂的函数画出了流程图。 问题 : 我感觉虽然做的是框架的工作,但是对 x264 的整体把握的并不好,不知道问题出在哪里? 有什么可以加深理解的办法呢? 我得目标是针对具体的某一块的算法进行优化,我想先要把整个程序的所有细节实现都看的比较明白了 以后在开始进行优化,不知道是否可行。还有你建议从哪里切入开始看细节部分呢?我是不是对标准的理解 还不够深入,在看程序的时候返回去查看标准的时候应该看哪一个文档比较好呢?是 H.264_Prepublish_0503.doc 么? 谢谢目前就这些问题了,你有时间的话帮我看看 吧!
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
X264 : Encode_Frames 不强制任何参数 调用 x264_encoder_encode 进行编码 编码 NAL 层 x264_nal_encode p_write_nalu 写入 图片结束 Encoder.c: x264_encoder_encode 将图片 copy 到一帧 中去并且移动到一个 缓冲器 选择帧类型 移动一些 B  帧 和一个非 B 帧到编 码队列中去 获得要被编码 的帧 编码 Do encode 更新编码器状态 计算和打印 统计值 判断是否存放 重建的帧 设置输出 图片属性
Encoder.c: do encode 设置帧上下文 (初始化帧类型) 初始化 (参考列表, bit 率控制) 创建切片头部 写入 bit 流:初始化 bit 流上下文 - > 写入序列参数信号和图片 参数信号- > 写入切片数据 ( x264_slice_write )- >bit 流 结束,设置输出。
Encoder.c: x264_slice_write 初始化状态参数 NAL 单元开始 写切片头部 如果是 cabac 编码 初始化上下文以及编码器 编码开始 装载缓冲区 分析宏块参数 x264_macroblock_analyse 宏块编码 x264_macroblock_encode
是否为 跳过宏块 是 进行相关处理 否 是否为 cabac 编码 是 否 写入 cavlc 编码 x264_macroblock_write_cavlc 写入结束 保存缓冲区数据 编码结束( cabac 或者 cavlc ) NAL 单元编码结束 End 写入 cabac 编码 x264_macroblock _write_cabac
设置 QP 并且避免 QP 变化太快 对分析进行初始化 判断切片类型 B 分析开始 进行帧内模式分析 比较 16*16 和 4*4 子块模式 I P P 切片分析 B 切片分析 从分析中更新 宏块 宏块分析结束 Analysis.c : x264_macroblock_analyse
P 检查是否为 跳过 P 宏块 是 否 相关处理 分析加载花费 分析帧间 16*16 模式 是否为 16*16 子块模式 是 否 分析帧间 P 模式 8*8 子块 选择最好的 帧间模式 检测到 16*16 子 块信号并且帧内 8*8 花费 小于 16*16 运动 估计花费 P 切片分析 分析帧间 8*8 子块 是 否
分析帧间 16*8/8*16 子块 进行 1/4 象素加工 最佳帧内宏块模式 分析,并对色度和亮度 成分分别附值 P 切片分析结束
B 切片分析 判断是否为 直接模式 是 否 进行相关处理 判断是否为 skip 模式 否 是 分析加载花费, 直接模式和 帧间 16*16 模式 是否收到 16*16 子块信号 分析帧内 8*8, 8*16,16*8 子块 否 加工 1/4 象素精度
最佳帧内宏块 模式分析 B 切片 分析结束
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 的块进行化简 色度编码开始
量化放缩 判断是否为 skip 模式, 并进行相关处理 x264_mb_encode_8x8 计算亮度色度句型,以及非零计数 存储 cbp: coded_ block_ pattern 检查 P/B 跳过情况, 进行相应处理 色度编码结束 宏块编码结束
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] 宏块编码结束
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  中,用于重建 编码结束
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
Macroblock.c: x264_mb_encode_8x8( 编码色度成分 ) 对色度成分进行 8×8 子块 dct 变换 对每一个 4×4 子块进行处理: 存储 dc 系数,量化, z 扫描,反量化 对每一个子块的 dc 系数进行单独处理 量化, z 扫描 对每一个子块的 dc 系数进行反变换和反量化 用于重建块 判断如果为 B 帧间模式并且简化参数足够低则: 该 8*8 块几乎没有色度数据因此把它置为空, 这样作可以节省 bit 对整块进行反 dct 变换,用于重建 结束
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 ) 写入部分类型,针对每种不同类型 写入参考帧号和预测矢量 跳出类型判断 否
是否为 P_8×8 类型 是 否 写入子宏块类型 写入 4 个参考图像索引 写入子宏块的 mvd ? x264_sub_mb_mv_write_cavlc 跳出宏块类型判断 是否为 B_8×8 类型 写入宏块类型 写入子块类型 写入参考帧索引 写入残差块,注意对 B 宏 块来说是两个残差分量 跳出宏块类型判断 是否为 B 直接类型 否 是 否 初始化参考列表 写入宏块类型 写入参考帧索引 写入 mvd 直接写 0 是 写入编码的块的句型 写入残差数据 block_ residual_ write_ cavlc 结束

More Related Content

Similar to X26

[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)Shanda innovation institute
 
Recycle Open Source Projects
Recycle Open Source ProjectsRecycle Open Source Projects
Recycle Open Source ProjectsGeorge Ang
 
2006 recycle opensourceprojects
2006 recycle opensourceprojects2006 recycle opensourceprojects
2006 recycle opensourceprojectsGeorge Ang
 
高性能Lamp程序设计 付超群
高性能Lamp程序设计   付超群高性能Lamp程序设计   付超群
高性能Lamp程序设计 付超群Shaoning Pan
 
COSCUP 2014 : open source compiler 戰國時代的軍備競賽
COSCUP 2014 : open source compiler 戰國時代的軍備競賽COSCUP 2014 : open source compiler 戰國時代的軍備競賽
COSCUP 2014 : open source compiler 戰國時代的軍備競賽Kito Cheng
 
手把手教你把Vim改装成一个IDE编程环境(图文)
手把手教你把Vim改装成一个IDE编程环境(图文)手把手教你把Vim改装成一个IDE编程环境(图文)
手把手教你把Vim改装成一个IDE编程环境(图文)King Hom
 
2018 VLSI/CAD Symposium Tutorial (Aug. 7, 20:00-21:00 Room 3F-VII)
2018 VLSI/CAD Symposium Tutorial (Aug. 7, 20:00-21:00 Room 3F-VII)2018 VLSI/CAD Symposium Tutorial (Aug. 7, 20:00-21:00 Room 3F-VII)
2018 VLSI/CAD Symposium Tutorial (Aug. 7, 20:00-21:00 Room 3F-VII)Simen Li
 
Lamp高性能设计
Lamp高性能设计Lamp高性能设计
Lamp高性能设计锐 张
 
Python 数据库技术第三讲
Python 数据库技术第三讲Python 数据库技术第三讲
Python 数据库技术第三讲March Liu
 
04_動物姿態識別Pet pose classification
04_動物姿態識別Pet pose classification04_動物姿態識別Pet pose classification
04_動物姿態識別Pet pose classificationIttrainingIttraining
 
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509tidesq
 
Deep learning wiki on data encodingi
Deep learning  wiki on data encodingiDeep learning  wiki on data encodingi
Deep learning wiki on data encodingiwang meng
 
Continuous Delivery Workshop with Ansible x GitLab CI (5th)
 Continuous Delivery Workshop with Ansible x GitLab CI (5th) Continuous Delivery Workshop with Ansible x GitLab CI (5th)
Continuous Delivery Workshop with Ansible x GitLab CI (5th)Chu-Siang Lai
 
Clipper@datacon.2019.tw
Clipper@datacon.2019.twClipper@datacon.2019.tw
Clipper@datacon.2019.twWei-Yu Chen
 
Sy03091说明书
Sy03091说明书Sy03091说明书
Sy03091说明书guest8f3690
 

Similar to X26 (20)

[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
 
ch7-pv1-modules
ch7-pv1-modulesch7-pv1-modules
ch7-pv1-modules
 
Recycle Open Source Projects
Recycle Open Source ProjectsRecycle Open Source Projects
Recycle Open Source Projects
 
2006 recycle opensourceprojects
2006 recycle opensourceprojects2006 recycle opensourceprojects
2006 recycle opensourceprojects
 
高性能Lamp程序设计 付超群
高性能Lamp程序设计   付超群高性能Lamp程序设计   付超群
高性能Lamp程序设计 付超群
 
COSCUP 2014 : open source compiler 戰國時代的軍備競賽
COSCUP 2014 : open source compiler 戰國時代的軍備競賽COSCUP 2014 : open source compiler 戰國時代的軍備競賽
COSCUP 2014 : open source compiler 戰國時代的軍備競賽
 
手把手教你把Vim改装成一个IDE编程环境(图文)
手把手教你把Vim改装成一个IDE编程环境(图文)手把手教你把Vim改装成一个IDE编程环境(图文)
手把手教你把Vim改装成一个IDE编程环境(图文)
 
2018 VLSI/CAD Symposium Tutorial (Aug. 7, 20:00-21:00 Room 3F-VII)
2018 VLSI/CAD Symposium Tutorial (Aug. 7, 20:00-21:00 Room 3F-VII)2018 VLSI/CAD Symposium Tutorial (Aug. 7, 20:00-21:00 Room 3F-VII)
2018 VLSI/CAD Symposium Tutorial (Aug. 7, 20:00-21:00 Room 3F-VII)
 
Lamp高性能设计
Lamp高性能设计Lamp高性能设计
Lamp高性能设计
 
Python 数据库技术第三讲
Python 数据库技术第三讲Python 数据库技术第三讲
Python 数据库技术第三讲
 
04_動物姿態識別Pet pose classification
04_動物姿態識別Pet pose classification04_動物姿態識別Pet pose classification
04_動物姿態識別Pet pose classification
 
getPDF.aspx
getPDF.aspxgetPDF.aspx
getPDF.aspx
 
getPDF.aspx
getPDF.aspxgetPDF.aspx
getPDF.aspx
 
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
 
Deep learning wiki on data encodingi
Deep learning  wiki on data encodingiDeep learning  wiki on data encodingi
Deep learning wiki on data encodingi
 
Continuous Delivery Workshop with Ansible x GitLab CI (5th)
 Continuous Delivery Workshop with Ansible x GitLab CI (5th) Continuous Delivery Workshop with Ansible x GitLab CI (5th)
Continuous Delivery Workshop with Ansible x GitLab CI (5th)
 
Before Reverse C
Before Reverse CBefore Reverse C
Before Reverse C
 
Clipper@datacon.2019.tw
Clipper@datacon.2019.twClipper@datacon.2019.tw
Clipper@datacon.2019.tw
 
Sy03091说明书
Sy03091说明书Sy03091说明书
Sy03091说明书
 
Memcache
MemcacheMemcache
Memcache
 

X26

  • 1. 谢谢你: 我只对编码部分整体的看了一边,理解很浅显,希望你看完之后能够帮我指正一下。 每一个流程前边列出了该流程的出处,我只针对自己认为比较复杂的函数画出了流程图。 问题 : 我感觉虽然做的是框架的工作,但是对 x264 的整体把握的并不好,不知道问题出在哪里? 有什么可以加深理解的办法呢? 我得目标是针对具体的某一块的算法进行优化,我想先要把整个程序的所有细节实现都看的比较明白了 以后在开始进行优化,不知道是否可行。还有你建议从哪里切入开始看细节部分呢?我是不是对标准的理解 还不够深入,在看程序的时候返回去查看标准的时候应该看哪一个文档比较好呢?是 H.264_Prepublish_0503.doc 么? 谢谢目前就这些问题了,你有时间的话帮我看看 吧!
  • 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 流 结束,设置输出。
  • 5. Encoder.c: x264_slice_write 初始化状态参数 NAL 单元开始 写切片头部 如果是 cabac 编码 初始化上下文以及编码器 编码开始 装载缓冲区 分析宏块参数 x264_macroblock_analyse 宏块编码 x264_macroblock_encode
  • 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 子块 是 否
  • 9. 分析帧间 16*8/8*16 子块 进行 1/4 象素加工 最佳帧内宏块模式 分析,并对色度和亮度 成分分别附值 P 切片分析结束
  • 10. B 切片分析 判断是否为 直接模式 是 否 进行相关处理 判断是否为 skip 模式 否 是 分析加载花费, 直接模式和 帧间 16*16 模式 是否收到 16*16 子块信号 分析帧内 8*8, 8*16,16*8 子块 否 加工 1/4 象素精度
  • 11. 最佳帧内宏块 模式分析 B 切片 分析结束
  • 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 结束