编码器在整个HM解决方案中的工程名为TAppEncoder,入口点函数位于encmain.cpp文件中:

 int main(int argc, char* argv[])
{
TAppEncTop cTAppEncTop; // print information
fprintf( stdout, "\n" );
fprintf( stdout, "HM software: Encoder Version [%s] (including RExt)", NV_VERSION );
fprintf( stdout, NVM_ONOS );
fprintf( stdout, NVM_COMPILEDBY );
fprintf( stdout, NVM_BITS );
fprintf( stdout, "\n\n" ); // create application encoder class
cTAppEncTop.create(); // parse configuration
try
{
if(!cTAppEncTop.parseCfg( argc, argv ))
{
cTAppEncTop.destroy();
#if ENVIRONMENT_VARIABLE_DEBUG_AND_TEST
EnvVar::printEnvVar();
#endif
return ;
}
}
catch (df::program_options_lite::ParseFailure &e)
{
std::cerr << "Error parsing option \""<< e.arg <<"\" with argument \""<< e.val <<"\"." << std::endl;
return ;
} #if PRINT_MACRO_VALUES
printMacroSettings();
#endif #if ENVIRONMENT_VARIABLE_DEBUG_AND_TEST
EnvVar::printEnvVarInUse();
#endif // starting time
Double dResult;
clock_t lBefore = clock(); // call encoding function
cTAppEncTop.encode(); // ending time
dResult = (Double)(clock()-lBefore) / CLOCKS_PER_SEC;
printf("\n Total Time: %12.3f sec.\n", dResult); // destroy application encoder class
cTAppEncTop.destroy(); return ;
}

main

主要包括:

  1. 入口点函数main()【创建cTAppEncTop类,解析输入的配置函数,设定时间相关的参数】
  2. cTAppEncTop.encode()【对编码器所使用的几个对象进行初始化,分配YUV数据缓存,循环读取YUV文件】
  3. m_cTEncTop.encode(...)【调用m_cGOPEncoder.compressGOP()实现对一个GOP的实际编码】
  4. m_cGOPEncoder.compressGOP()【调用initGOP设置GOP的参数;调用m_pcSliceEncoder->initEncSlice(),利用SPS和PPS中的信息创建编码的slice对象;调用m_pcSliceEncoder->compressSlice ( pcPic )对一个slice进行编码。】
  5. m_pcSliceEncoder->compressSlice ( pcPic )【设置编码slice的参数,对slice的每一个cu进行处理】
  6. TEncCu::compressCU()【编码一个CU】

以上各个函数分别在前一个函数中调用,形成类似一个反向的call stack的结构。

函数调用关系如下:

main()——>cTAppEncTop.encode()——>m_cTEncTop.encode(...)——>m_cGOPEncoder.compressGOP()——>m_pcSliceEncoder->compressSlice()——>

xCheckRDCostInter()帧间

m_pcCuEncoder->compressCtu()——>xCompressCU()——>xCheckRDCostIntra()帧内

xCheckIntraPCM()PCM

【HEVC】1、HM-16.7编码器的基本结构的更多相关文章

  1. Paper | A novel deep learning-based method of improving coding efficiency from the decoder-end for HEVC

    目录 精彩叙述 细节 发表在2017年DCC. 这篇文章立意很简单,方法也很简单,但是做得早.效果好.引用量也不错(40+). 指标:在HEVC的intra.LDP.LDB和RA模式下,BDBR平均可 ...

  2. HEVC,VP9,x264性能对比

    Dan Grois等人在论文<Performance Comparison of H.265/MPEG-HEVC, VP9, andH.264/MPEG-AVC Encoders>中,比较 ...

  3. 编解码再进化:Ali266 与下一代视频技术

    过去的一年见证了人类百年不遇的大事记,也见证了多种视频应用的厚积薄发.而因此所带来的视频数据量的爆发式增长更加加剧了对高效编解码这样的底层硬核技术的急迫需求. 新视频编解码标准 VVC 定稿不久之后, ...

  4. [总结]FFMPEG视音频编解码零基础学习方法--转

    ffmpeg编解码学习   目录(?)[-] ffmpeg程序的使用ffmpegexeffplayexeffprobeexe 1 ffmpegexe 2 ffplayexe 3 ffprobeexe ...

  5. FFMPEG视音频编解码零基础学习方法-b

    感谢大神分享,虽然现在还看不懂,留着大家一起看啦 PS:有不少人不清楚“FFmpeg”应该怎么读.它读作“ef ef em peg” 0. 背景知识 本章主要介绍一下FFMPEG都用在了哪里(在这里仅 ...

  6. [总结]FFMPEG视音频编解码零基础学习方法

    在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者.在和大家探讨的过程中,我忽然发现了一个问题:在“ ...

  7. 【转】[总结]FFMPEG视音频编解码零基础学习方法

    在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者.在和大家探讨的过程中,我忽然发现了一个问题:在“ ...

  8. Java Main如何被执行?(转)

    java应用程序的启动在/hotspot/src/share/tools/launcher/java.c的main()函数中,而在虚拟机初始化过程中,将创建并启动Java的Main线程.最后将调用JN ...

  9. 【Keras】基于SegNet和U-Net的遥感图像语义分割

    上两个月参加了个比赛,做的是对遥感高清图像做语义分割,美其名曰"天空之眼".这两周数据挖掘课期末project我们组选的课题也是遥感图像的语义分割,所以刚好又把前段时间做的成果重新 ...

随机推荐

  1. Java8新特性--lamada详解

    最近玩了一下这个,感觉挺有趣的,语法使用起来很简洁,让代码看起来挺清爽易读的. 看了一下源码,发现挺充分的利用了jak1.5的特性(注解.泛型). 但是,具体的实现流程还是有点不通透,先Mark,等用 ...

  2. 设置jdk的编码

    在环境变量中:  AVA_TOOL_OPTIONS-Dfile.encoding=utf-8 -Duser.language=en -Duser.country=US

  3. 关于unity中C#使用WaitForSeconds的方法

    //我有一段这样的代码,我要实现3秒后执行内容,JS是这样写的 function Update () { load (); } function load (){ //等待3秒执行语句 yield W ...

  4. js的一点

    1.js中实现继承的方法 1.js原型(prototype)实现继承 <SPAN style="<SPAN style="FONT-SIZE: 18px"&g ...

  5. tomcat7 启动项目报错 java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig()

    JDK版本:jdk1.8.0_77 Tomcat 版本:apache-tomcat-7.0.47 异常重现步骤: 1.完成项目部署 2.启动Tomcat 异常头部信息:java.lang.NoSuch ...

  6. Majority Element II

    Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorit ...

  7. kuangbin_SegTree D (POJ 2528)

    讲道理我之前暂时跳过染色的题是因为总觉得有什么很高端的算法来query 直到我做了F题(ZOJ 1610)才发现就是个暴力统计.....也对 也就几万个长度单位而已.... F就不po上来了 选了有点 ...

  8. [BZOJ 3123]森林

    这题和 COT1 一定有 JQ 喵~ 线段树的启发式合并,每次要连接两个点时就对比较小的那棵树暴力 DFS 一边 然后均摊时间依旧是 logn 的,均摊真是世界上最邪恶的东西了…… 然后这题的数据是要 ...

  9. How to create/restore a slave using GTID replication in MySQL 5.6

    MySQL 5.6 is GA! Now we have new things to play with and in my personal opinion the most interesting ...

  10. Oracle基本教程

    Oracle基本教程 1.Oracle介绍 2.SqlPlus使用 3.用户管理与权限控制 4.数据库备份与还原 5.物理备份--Rman 6.常用查询 7.Oracle用法集锦 8.oracle修改 ...