`

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

 
阅读更多
代码: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.2)解码流程理解及解码流程图

    本文将详细介绍H.264(JM12.2)解码流程的理解和解码流程图。 一、H.264解码标准 H.264解码标准是由ITU-T推荐的视频编解码标准,目的是为了提高视频压缩效率和视频质量。H.264解码标准的主要特点包括: * 高效的...

    H.264参考软件jm86

    jm86则是H.264编码标准的一个参考软件实现,用于帮助开发者理解和研究H.264编码技术。 jm86是由JVT(Joint Video Team)开发的一系列参考模型之一,它代表了H.264编码算法的一种具体实现。这个开源项目提供了完整的...

    H.264参考软件JM9.5

    总结,H.264参考软件JM9.5是研究和开发H.264编码技术的重要工具,它涵盖了运动估计、块匹配算法等核心技术和完整的编码流程。通过深入研究和利用这款软件,我们可以更好地理解和优化视频编码技术,推动视频通信领域...

    H.264参考代码JM86学习版

    《H.264参考代码JM86学习版》是一个专为学习视频编解码技术设计的资源包,尤其对H.264/AVC标准的实践理解提供了宝贵的参考资料。该版本被称为“经典学习版本”,表明其在教育和研究领域具有较高的价值。 H.264/AVC...

    JM86_ccs.rar_H.264_H.264 代码_JM86

    标题中的"JM86_ccs.rar_H.264_H.264 代码_JM86"指的是一款名为JM86的编码器实现,它包含H.264编码标准的源代码。H.264,也称为AVC(Advanced Video Coding),是一种高效能的视频编码标准,广泛应用于高清视频传输、...

    如何结合H.264标准看JM代码

    本文将对 H.264 JM 代码进行详细解析,回答常见的问题,并提供相关的知识点。 1. 一个 SPS 后,有若干个 PPS 吗? 在 H.264 JM 代码中,一个 SPS(Sequence Parameter Set)后可以有多个 PPS(Picture Parameter ...

    H.264学习笔记-JM源代码笔记

    JM是H.264标准的一个参考实现,由JVT(联合视频团队)开发,它提供了对H.264编码算法的详细实现,是理解和研究H.264的宝贵资源。 阅读笔记之一.doc,可能是作者在分析JM源代码过程中的详细记录,包含了对关键算法的...

    JM86,H.264编码经典版本

    《深入解析H.264编码技术:以JM86经典版本为例》 H.264,全称为Advanced Video Coding(高级视频编码),是一种在数字视频编码领域广泛应用的国际标准,由ITU-T的VCEG(视频编码专家组)和ISO/IEC的MPEG(动态图像...

    h264 JM 所有代码和工具

    本篇将详细介绍H264 JM代码和工具,以及它们如何帮助我们深入理解H.264编解码的发展和改进。 一、H264编码标准概述 H.264,全称为ITU-T的G.729 Annex D和ISO/IEC的14496-10,是一个联合视频编码标准,由多个组织...

    H.264测试软件JM14.2

    描述中提到的“H.264官方测试软件JM14.2”,意味着这是一个官方发布的、用于测试和评估H.264编码算法的工具。这个版本可能包含了当时最新的编码优化和改进,对于学习和研究H.264编码技术具有很高的参考价值。通过...

    深入理解视频编解码技术(基于H.264标准及参考模型)

    第4章和第5章是《深入理解视频编解码技术:基于H.264标准及参考模型》的精华内容,介绍了H.264的参考软件并用大量篇幅分析了JM8.6版本的代码,使读者能更快地掌握H.264的核心内容;第6章是H.264的DSP移植与优化;第7...

    h.264官方源码JM17.0

    JM(Joint Model)是H.264标准的官方参考软件,由VCEG和MPEG联合开发,用于验证标准的实现和性能。JM17.0是其中的一个版本,包含了完整的编码和解码功能,对于学习H.264编码原理非常有帮助。 1. 架构概览 JM17.0...

    H.264测试软件JM8.6

    《深入理解H.264编码解码:以JM8.6测试软件为例》 H.264,全称为Advanced Video Coding(高级视频编码),是目前广泛应用的视频编码标准,广泛应用于高清视频、网络流媒体、蓝光光盘等领域。它的高效编码能力使得在...

    H.264JM12.4

    JM12.4是H.264参考软件的一个版本,它包含了完整的编码和解码流程,可供研究人员和开发者进行实验和分析。这个版本可能包含了一些优化和改进,比如错误恢复机制、多视图编码支持、高分辨率视频处理等。开发者可以...

    H.264 参考软件JM16.1 VC++7.0/8.0/9.0

    H.264参考软件最新版本16.1,支持VC++7.0,VC++8.0 Changes in Version JM 16.1 (since JM 16.0) ------------------------------------------ - encoder: check slice group parameter size for slice_group_map_...

    h.264视频编解码源代码.rar

    详细说明:h.264标准代码,用于视频编码!可以实现各种视频的编码和解码,可以在这个代码的基础上进行各种开发,比如算法的优化,转码技术,实现各种分辨了的转码-h.264 standard code, uses in the video frequency...

    最新的H.264源码,jm18.3

    JM18.3是H.264编码器的一个具体实现版本,它代表了该编码技术在某个时间点的最优性能和最新发展。 H.264的编码技术基于多个关键特性,包括: 1. **块划分**:视频帧被分割成不同大小的宏块,以便于处理和编码。JM...

    H.264 JM测试模型

    8. **软件文档**:随附的软件说明文档将详细解释模型的工作原理,帮助开发者理解和调试代码,这对于理解H.264标准的实施细节非常有价值。 在使用H.264 JM测试模型时,你需要熟悉C++编程,并且可能需要了解一些视频...

    H.264官方参考软件 JM 18.4

    总之,H.264的JM 18.4参考软件是学习和实践视频编码技术的关键资源,它集成了H.264标准的多项创新技术,通过源代码分析,我们可以深入了解视频压缩的全过程,为开发高效、高质量的视频应用提供强大支持。

    视频标准H.264的参考代码JM86

    对于开发者和研究人员来说,通过分析和修改JM86源代码,可以深入了解H.264的内部工作机制,并为自定义编码器或者优化现有编码器提供参考。 在使用JM86时,初学者可能会遇到一些挑战,例如理解复杂的命令行参数、...

Global site tag (gtag.js) - Google Analytics