博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
H.264参考软件JM12.2RC代码详细流程
阅读量:7033 次
发布时间:2019-06-28

本文共 4071 字,大约阅读时间需要 13 分钟。

hot3.png

代码: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。
-----------------------------------------------------------------------------------------------------------------------------------
以上是我跟踪代码所得。比较简单,但是仍希望对大家有帮助。

转载于:https://my.oschina.net/leixiaohua1020/blog/302288

你可能感兴趣的文章
[转载]jQuery 顺便学习下CSS选择器 奇偶匹配nth-child(even)
查看>>
在网页中嵌入任意字体的解决方案
查看>>
UVa 11491 Erasing and Winning
查看>>
Sencha-Touch开发环境准备(Webstorm+Ruby)
查看>>
MapReduce(3): Partitioner, Combiner and Shuffling
查看>>
转老赵同志的博客:Indy10记录及其他类型的传送
查看>>
用两个栈实现一个队列
查看>>
第三方分享
查看>>
几道题目
查看>>
Silverlight 登陆界面
查看>>
整数溢出(转帖)
查看>>
MySql不支持事务解决
查看>>
SQL Server 数据库备份和还原认识和总结(二)
查看>>
需求改进与系统设计
查看>>
UI Input Validate
查看>>
Git以及TortoiseGit的下载安装使用
查看>>
Oracle + Entity Framework 更新没有设置主键的表
查看>>
包和包体简介
查看>>
显示界面的,调节frame的代码 写到 viewwillappear,
查看>>
array调用排序,返回的数组要 重新赋值,
查看>>