代码:JM12.2.编码结构:IPP。GOP:3.
跟踪代码:(注:表示编码主流程,表示RC流程)
----------------------------------------------------------------------------------------------
进入main() ,首先调用init_global_buffers().进入init_global_buffers(),调用两个函数generic_alloc( &generic_RC )//Dynamically allocate memory needed for generic rate control 和 rc_alloc( &quadratic_RC ) //Dynamically allocate memory needed for rate control。然后进入rc_init_seq(rc_quadratic *prc) //Initialize rate control parameters。这三个函数在整个流程中只调用一次。
----------------------------------------------------------------------------------------------
编码循环开始。调用rc_init_GOP(rc_quadratic *prc, int np, int nb) //Initialize one GOP。
----------------------------------------------------------------------------------------------
开始编码第一帧。I帧。
进入encode_one_frame(),调用rc_init_pict(rc_quadratic *prc, int fieldpic,int topfield,int targetcomputation, float mult) //Initialize one picture。接着调用updateQP(quadratic_RC, 0) //compute a quantization parameter for each frame.调用frame_picture() //Encodes a frame picture。进入frame_picture(), 调用code_a_picture()//Encodes a picture. 进入code_a_picture(),调用encode_one_slice() //Encodes one slice。进入encode_one_slice(),调用encode_one_macroblock() //Mode Decision for a macroblock, 进入encode_one_macroblock(),调用update_rc()//Update Rate Control Parameters,接着调用handle_qp(Macroblock *currMB, short best_mode) //Update QP Parameters (critical in case of SKIP MBs or MBAFF).
编码完一帧以后调用rc_update_pict_frame(rc_quadratic *prc, int nbits) //update after frame encoding。最后调用rc_update_pict(rc_quadratic *prc, int nbits) //update one picture after frame/field encoding.
第一帧I帧编码完成。
----------------------------------------------------------------------------------------------
开始编码第二帧。第一个P帧。
循环再次调用encode_one_frame()。现在编码的是P帧。调用rc_init_pict(),接着调用updateQP(),进入updateQP(),调用updateFirstP( rc_quadratic *prc, int topfield ) //计算第一个P帧的量化参数。调用frame_picture() 。进入frame_picture(), 调用code_a_picture() 。进入code_a_picture(),调用encode_one_slice() 。进入encode_one_slice(),对宏块进行编码循环。先调用start_macroblock(),如果已编码宏块数大于0并且是基本单元宏块数的整数倍,则调用updateRCModel (rc_quadratic *prc) //update the parameters of quadratic R-D model。进入updateRCModel(),调用QP2QStep(),接着调用两次RCModelEstimator()。之后调用updateMADModel,然后调用updateQP()。进入updateQP(),调用updateFirstP().然后调用encode_one_macroblock(), 进入encode_one_macroblock(),调用update_rc()接着调用handle_qp()。
***需要注意的一点:对于第一个基本单元,进入updateRCModel之后,在调用完两次RCModelEstimator之后,没有调用updateMADModel。从第二个基本单元开始,才进入updateMADModel。进入updateMADModel以后,会调用MADModelEstimator。并且,编码第一个P帧时调用updateMADModel没有任何作用。只有在编码第二个P帧开始,updateMADModel才会起作用。***
编码完一帧以后调用rc_update_pict_frame。接着调用rc_update_pict().调用 updateRCModel(),进入updateRCModel(),调用两次RCModelEstimator()。之后调用updateMADModel。进入updateMADModel,这个时候updateMADModel函数会起作用了。它调用MADModelEstimator,更新参数之后并再次调用MADModelEstimator。
第一个P帧编码完成。
----------------------------------------------------------------------------------------------
开始编码第三帧,即第二个P帧。
调用encode_one_frame()。调用rc_init_pict(),接着调用updateQP(),进入updateQP(),由于是第一个基本单元,调用updateFirstBU( rc_quadratic *prc, int topfield )。之后调用frame_picture() 。进入frame_picture(), 调用code_a_picture() 。进入code_a_picture(),调用encode_one_slice() 。进入encode_one_slice(),对宏块进行编码循环。调用encode_one_macroblock(), 进入encode_one_macroblock(),调用update_rc()接着调用handle_qp()。编码的宏块数超过一个且是基本单元宏块数的整数倍时,调用在start_macroblock里面的updateRCModel。进入updateRCModel(),调用QP2QStep(),接着调用两次RCModelEstimator()。之后调用updateMADModel,进入updateMADModel,调用两次MADModelEstimator。然后调用updateQP()。进入updateQP,如果Target<0,调用updateNegativeTarget( rc_quadratic *prc, int topfield, int m_Qp ),否则会:调用predictCurrPicMAD,接着调用updateModelQPBU(rc_quadratic *prc, int topfield, int m_Qp),如果是最后一个基本单元,则调用updateLastBU().
编码完一帧以后调用rc_update_pict_frame。接着调用rc_update_pict().调用 updateRCModel(),进入updateRCModel(),调用两次RCModelEstimator()。之后调用updateMADModel。进入updateMADModel,这个时候updateMADModel函数会起作用了。它调用MADModelEstimator,更新参数之后并再次调用MADModelEstimator。
-----------------------------------------------------------------------------------------------------------------------------------
以上是我跟踪代码所得。比较简单,但是仍希望对大家有帮助。

H.264参考软件JM12.2RC代码详细流程相关推荐

  1. H.264官方软件JM源代码简单分析-解码器ldecod

    ===================================================== H.264/H.265 官方源代码分析文章: H.264官方软件JM源代码简单分析-编码器l ...

  2. H.264官方软件JM源代码简单分析-解码器ldecod(转载)

    转载自 雷霄骅 大神博客 https://blog.csdn.net/leixiaohua1020 ================================================== ...

  3. H.264视频编解码的代码移植和优化

    基于DSP系统开发的视频编解码系统,国内几乎都是走的移植,优化的路线,并且移植的代码,都是开源的.毕竟花费大量的人力,物力去开发一套自己的代码,并不见得比一些成熟的开源代码效率更高,健壮性更好.更何况 ...

  4. H.264官方软件JM源代码简单分析-编码器lencod

    ===================================================== H.264/H.265 官方源代码分析文章: H.264官方软件JM源代码简单分析-编码器l ...

  5. h.264参考图像列表、解码图像缓存

    1.参考图像列表(reference picture list) 一般来说,h.264会把需要编码的图像分为三种类型:I.P.B,其中的B.P类型的图像由于采用了帧间编码的这种编码方式,而帧间编码又是 ...

  6. H.264解码器ffmpeg完整优化代码(包括PC和Windows Mobile版本)

    这里把前段时间对ffmpeg0.48进行简化和修改,包括修正内存泄漏,修改一些语句使Max Speed能够打开这些.其实代码还是比较乱的,也有很大的继续优化空间.这个工作花费了我一些休息时间,不过,我 ...

  7. H.266 参考软件VTM下载和安装

    1.下载安装cmake ,下载地址https://cmake.org/. 安装后打开控制面板-系统-高级系统设置-环境变量-PATH-编辑-输入cmake.exe的路径即可. 2.如果你之前(HEVC ...

  8. VVC/H.266参考软件VTM算法描述 [译](一. CTU划分部分)

    Algorithm description for Versatile Video Coding and Test Model 8 (VTM 8) [译自JVET-Q2002] 3.2 Partiti ...

  9. nerf-pytorch3D 代码详细流程 debug

    train_nerf.py import main config内容 model class RadianceFieldRenderer def __init__ 分"coarse" ...

最新文章

  1. Expo大作战(十九)--expo打包后,发布分用程序到商店的注意事项
  2. 平板就是生产力?东京大学研究者“辟谣”了,用纸笔记录,更有利于记忆
  3. SringIOC中Bean的后置处理器
  4. signal.h 中的宏定义 SIG_DFL 及 SIG_IGN
  5. sqlserver 根据数组排序_看动画学算法之:排序-count排序
  6. invalid new-expression of abstract class type 'CurveFittingEdge'
  7. MOCTF-Web-Flag在哪?
  8. 基于 frida 实现的逆向工具包 hooker
  9. 锁定计算机在哪里设置方法,怎样锁定电脑?如何设置电脑锁屏【步骤详解】
  10. springboot2.0集成activiti modeler
  11. BeanUtils 使用问题
  12. RDS查看Binlog日志内容
  13. Spring Boot中文文档
  14. Kotlin基础学习第3章—内置类型
  15. 本地HTML打不开 总打开360页面,彻底解决IE浏览器打不开网页时自动跳转到hao.360.cn导航页的问题-网络教程与技术 -亦是美网络...
  16. 为什么高斯滤波器被广泛用于图像处理?
  17. 2018---2019 数学四班张子琪 C语言设计总结
  18. 百位红人助阵,如涵这场影响力盛典点亮夜钱塘
  19. 甘特图:项目进度管理的必备工具
  20. 树莓派官方摄像头测试

热门文章

  1. CCF201803-4 棋局评估(100分)【博弈+DFS】
  2. Bailian3251 最少费用【递归】
  3. Bailian2728 第一个C++程序【水题】
  4. 2019 ICPC中国邀请赛(南昌)暨国际丝绸之路程序设计竞赛-网络赛题解
  5. Bailian2766 最大子矩阵【最大子段和+DP】
  6. 趣味程序之数学之美系列
  7. 正则表达式 —— 括号与特殊字符
  8. Gamma 函数与exponential power distribution (指数幂分布)
  9. Python 面向对象 —— __slots__ 与 @property(python 下的 getter、setter 方法)
  10. 深度学习基础(五)—— rectifier function and softplus