【HEVC】1、HM-16.7编码器的基本结构

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

 1 int main(int argc, char* argv[])
 2 {
 3   TAppEncTop  cTAppEncTop;
 4 
 5   // print information
 6   fprintf( stdout, "\n" );
 7   fprintf( stdout, "HM software: Encoder Version [%s] (including RExt)", NV_VERSION );
 8   fprintf( stdout, NVM_ONOS );
 9   fprintf( stdout, NVM_COMPILEDBY );
10   fprintf( stdout, NVM_BITS );
11   fprintf( stdout, "\n\n" );
12 
13   // create application encoder class
14   cTAppEncTop.create();
15 
16   // parse configuration
17   try
18   {
19     if(!cTAppEncTop.parseCfg( argc, argv ))
20     {
21       cTAppEncTop.destroy();
22 #if ENVIRONMENT_VARIABLE_DEBUG_AND_TEST
23       EnvVar::printEnvVar();
24 #endif
25       return 1;
26     }
27   }
28   catch (df::program_options_lite::ParseFailure &e)
29   {
30     std::cerr << "Error parsing option \""<< e.arg <<"\" with argument \""<< e.val <<"\"." << std::endl;
31     return 1;
32   }
33 
34 #if PRINT_MACRO_VALUES
35   printMacroSettings();
36 #endif
37 
38 #if ENVIRONMENT_VARIABLE_DEBUG_AND_TEST
39   EnvVar::printEnvVarInUse();
40 #endif
41 
42   // starting time
43   Double dResult;
44   clock_t lBefore = clock();
45 
46   // call encoding function
47   cTAppEncTop.encode();
48 
49   // ending time
50   dResult = (Double)(clock()-lBefore) / CLOCKS_PER_SEC;
51   printf("\n Total Time: %12.3f sec.\n", dResult);
52 
53   // destroy application encoder class
54   cTAppEncTop.destroy();
55 
56   return 0;
57 }
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

转载于:https://www.cnblogs.com/545235abc/p/5188754.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值