文档章节

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

abcijkxyz
 abcijkxyz
发布于 2016/08/06 11:55
字数 1010
阅读 68
收藏 0

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

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







本文转载自:http://blog.csdn.net/leixiaohua1020/article/details/49822701

abcijkxyz
粉丝 64
博文 6421
码字总数 1876
作品 0
深圳
项目经理
私信 提问
[总结]视音频编解码技术零基础学习方法

一直想把视音频编解码技术做一个简单的总结,可是苦于时间不充裕,一直没能完成。今天有着很大的空闲,终于可以总结一个有关视音频技术的入门教程,可以方便更多的人学习从零开始学习视音频技...

leixiaohua1020
2014/06/16
0
0
视频编码国家标准AVS与H.264的比较(节选)

注:这个报告是官方报告,时间比较早了,AVS和H.264版本更新了很多,仅仅作为参考。 对视频编码标准进行客观评价的常用方法是峰值信噪比PSNR。表9、表10分别给出了AVS与MPEG-2标准以及AVS与M...

雷霄骅
2013/10/18
0
0
x264源代码简单分析:x264命令行工具(x264.exe)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leixiaohua1020/article/details/45583217 ===================================================== H.264源代......

雷霄骅
2015/05/08
0
0
[总结]视频质量评价技术零基础学习方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leixiaohua1020/article/details/16359465 前段时间略忙,因此一直计划要总结的很多东西都没来得及写,这两天...

雷霄骅
2014/04/21
0
0
x264源代码简单分析:编码器主干部分-2

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leixiaohua1020/article/details/45719905 ===================================================== H.264源代......

雷霄骅
2015/05/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java 8 Optional:优雅地避免 NPE

本篇文章将详细介绍 Optional 类,以及如何用它消除代码中的 null 检查。在开始之前首先来看下什么是 NPE,以及在 Java 8 之前是如何处理 NPE 问题的。 空指针异常(NullPointException,简称...

武培轩
28分钟前
7
0
CountDownLatch实现的并发框架

目录结构 package com.**.**.base.support.executor;import lombok.NoArgsConstructor;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;imp......

MR_TE
30分钟前
11
0
学习记录(day06-事件、按键修饰符、计算属性)

[TOC] 1.1 事件修饰符/按键修饰符 vue 通过事件修饰符对dom事件细节进行控制 <标签 @事件.修饰符="函数"></标签>.prevent ---阻止浏览器默认行为.stop ---阻止浏览器事件冒泡.e...

庭前云落
49分钟前
9
0
006-Sigle-基于blockstack去中心化博客

本篇文章主要讲解有关基于Blockstack的Sigle是一个去中心化的博客项目; 官网地址:https://www.sigle.io/ Github地址:https://github.com/pradel/sigle 页面展示: 介绍: A beautiful de...

Riverzhou
56分钟前
22
0
驰骋工作流引擎开发平台属性功能的隐藏显示介绍

关键字: 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 表单引擎 工作流功能说明 工作流设计 工作流快速开发平台 业务流程管理 bpm工作流系统 java工作流主流框架 自定义...

孟娟
58分钟前
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部