=====================================================

H.264/H.265 官方源代码分析文章:

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

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

HEVC官方软件HM源代码简单分析-编码器TAppEncoder

HEVC官方软件HM源代码简单分析-解码器TAppDecoder

=====================================================

上一篇文章总结了H.264官方参考软件JM中的视频解码器ldecod的结构,本文继续分析JM中的视频编码器lencod。

函数调用关系图

JM中的H.264视频编码器lencod的函数调用关系图如下所示。

单击查看更清晰的大图

下面解释一下图中关键标记的含义。

函数背景色
函数在图中以方框的形式表现出来。不同的背景色标志了该函数不同的作用:
白色背景的函数:不加区分的普通内部函数。
黄色背景函数:滤波函数(Filter)。用于环路滤波,半像素插值,SSIM/PSNR的计算。
绿色背景的函数:宏块编码函数(Encode)。通过对残差的DCT变换、量化等方式对宏块进行编码。
紫色背景的函数:熵编码函数(Entropy Coding)。对宏块编码后的数据进行CABAC或者CAVLC熵编码。

浅蓝色背景函数:码率控制函数(Rate Control)。对码率进行控制的函数。

箭头线
箭头线标志了函数的调用关系:
黑色箭头线:不加区别的调用关系。
黄色的箭头线:滤波函数(Filter)之间的调用关系。
绿色箭头线:宏块编码函数(Encode)之间的调用关系。
紫色箭头线:熵编码函数(Entropy Coding)之间的调用关系。
 
函数所在的文件
每个函数标识了它所在的文件路径。

下文记录结构图中几个关键的部分。

普通内部函数

普通内部函数指的是lencod中还没有进行分类的函数。例如:

编码器的main()函数中调用的参数配置函数Configure()、初始化编码器函数init_encoder()、编码函数encode_sequence()、释放编码器函数free_encoder()等。
编码器主要编码函数encode_one_frame()逐层调用的函数perform_encode_frame()、frame_picture()、code_a_picture()、code_a_plane()等。

宏块编码函数

宏块编码函数通过运动估计、DCT变换、量化等步骤对图像数据进行编码。编码的工作都是在Slice结构体中的encode_one_macroblock()中完成的。encode_one_macroblock()调用PartitionMotionSearch()完成帧间宏块运动估计的工作;调用mode_decision_for_I8x8_MB()、mode_decision_for_I4x4_MB()完成帧内宏块的模式选择;调用Slice结构体的luma_residual_coding()完成了残差编码的工作。
PartitionMotionSearch()调用了BlockMotionSearch()。BlockMotionSearch()调用了Macroblock结构体中的IntPelME()完成整像素的运动估计,又调用了SubPelME()完成了亚像素的运动估计。整像素的运动估计可以使用下面的方法:

EPZS_motion_estimation():EPZS算法;
full_search_motion_estimation():全搜索算法;
UMHEXIntegerPelBlockMotionSearch():UMHEX算法;

亚像素的运动估计可以使用下面的方法:

EPZS_sub_pel_motion_estimation():EPZS算法;
full_sub_pel_motion_estimation():全搜索算法;
UMHEXSubPelBlockME():UMHEX算法;

熵编码函数

熵编码函数使用CAVLC或者CABAC的方式对宏块编码后的数据进行熵编码。熵编码的工作都是在write_macroblock()中完成的。write_macroblock()调用了Slice结构体中的write_MB_layer()方法,根据Slice类型的不同,write_MB_layer()可以指向下面方法:
write_i_slice_MB_layer():I Slice宏块熵编码;
write_p_slice_MB_layer():P Slice宏块熵编码;
write_b_slice_MB_layer():B Slice宏块熵编码;

环路滤波函数

环路滤波函数对重建帧数据进行滤波,去除方块效应。去块效应滤波是在DeblockPicture()中完成的。DeblockPicture()调用了DeblockMb()。而DeblockMb()中调用GetStrengthVer()、GetStrengthHor()函数获取滤波强度;调用EdgeLoopLumaVer()、EdgeLoopLumaHor()进行滤波。

码率控制函数

码率控制模块函数分布在lencod源代码不同的地方,包括rc_init_seq()、rc_init_GOP()、rc_init_frame()、rc_handle_mb()等。

雷霄骅
leixiaohua1020@126.com
http://blog.csdn.net/leixiaohua1020

H.264官方软件JM源代码简单分析-编码器lencod相关推荐

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

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

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

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

  3. HEVC官方软件HM源代码简单分析-解码器TAppDecoder

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

  4. 【Codecs系列】HEVC官方软件HM源代码简单分析-解码器TAppDecoder

    目录 函数调用关系图 普通内部函数 解析函数(Parser) 熵解码函数(Entropy Decoding) 解码函数(Decode) 环路滤波函数(Loop Filter) 本文记录HEVC官方参考 ...

  5. x264源代码简单分析 编码器主干部分-1

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  6. FFmpeg的H.264解码器源代码简单分析:环路滤波(Loop Filter)部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  7. FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧间宏块(Inter)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  8. FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧内宏块(Intra)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  9. FFmpeg的H.264解码器源代码简单分析:解码器主干部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

最新文章

  1. python urllib.request 爬虫 数据处理-Python爬虫学习之(二)| urllib进阶篇
  2. 自定义控件:等比例显示控件RatioLayout
  3. boost::lower_bound相关的测试程序
  4. jzoj4815-ksum【堆】
  5. EFCore-一对一配置外键小记
  6. Python 的多文件和注释
  7. JavaScript编程规范-有利于效率和可读性
  8. Windows驱动开发,几个BLOG值得经常看看
  9. php时间戳防盗链,七牛云储存CDN时间戳防盗链PHP获取方法
  10. 读书笔记《浪潮之巅》感悟
  11. Robotics: Computational Motion Planning(路径规划)笔记(完):人工势场法(Artificial Potential Fields)
  12. 数分项目《泰坦尼克》——Task1
  13. Photoshop脚本 合并链接图层
  14. 清除flashback日志
  15. 【原创】HSV和YCrCb色彩空间介绍
  16. 制作mac os x lion启动盘
  17. FFmpeg[22] - 解决ffmpeg yasm not found, use --disable-yasm for a crippled build
  18. PCIe学习(二):PCIe DMA关键模块分析之一
  19. 用基础jQuery制作个性化留言板
  20. 如何获取苹果设备的UDID(iPhone/iPad UDID查询方法)

热门文章

  1. 阿里无人超市 “微笑打折”成世界互联网大会热点
  2. x86、x86_64/x64、amd64和arm64/aarch64 linux-aarch64 linux-x86-64
  3. Tokenizer 的用法
  4. 【lssvm预测】基于花朵授粉算法优化最小二乘支持向量机lssvm实现预测附matlab代码
  5. 物联网十大常用传感器
  6. springMVC环境搭建—HTTP状态 500 - 内部服务器错误
  7. Photoshop切图实例
  8. qqwry java_Java读取qqwry数据库完整源代码
  9. 下列计算机设备中属于多媒体输入设备的是,属于多媒体输入设备的是()。
  10. MATLAB系列(3)——读取txt文件