HTM---main函数的流程及类结构

来源:互联网 发布:尼康优化校准设置技巧 编辑:程序博客网 时间:2024/06/07 00:17

int main(int argc, char* argv[])

{

  TAppEncTop  cTAppEncTop;

这里定义了一个应用程序类,该类是 TAppEncCfg类的继承类。 TAppEncCfg基类提供参数,而TAppEncTop提供相关的操作。这里大致查看下TAppEncTop类的成员

**************TAppEncTop类成员**************************************

这里采用vector和list的形式主要是因为要编码的是多视点的视频,每个视点都看做是独立的视频序列,可以由不同的编码策略。每个视频的输入输出文件也不同。

 

  std::vector      m_acTEncTopList ;

每个视点一个TEncTop编码类,其类中嵌套了编码流程的各个模块的类,例熵编码、运动估计、 SAO、自适应环路滤波类及编码单元类(GOP类、片类、CU类)。   

  std::vector      m_acTEncDepthTopList ;

  std::vector  m_acTVideoIOYuvInputFileList;  ///< input YUV file

文件的输入类:主要的保存文件句柄和比特深度,类中提供各种的文件操作,例打开、关闭、写、读等。

  std::vector  m_acTVideoIOYuvDepthInputFileList;

  std::vector  m_acTVideoIOYuvReconFileList;  ///< output reconstruction file

输出文件类,和输入文件类相同,只不过文件的模式不同,该模式为写模式。

  std::vector  m_acTVideoIOYuvDepthReconFileList;


  std::vector< TComList* >  m_picYuvRec;       ///< list of reconstruction YUV files

重建图像的list,需要为每个视角维护一个重建图像的参考图像的list,这就形成了以list为项的vector。vector[0]为视角0的参考图像list,每个list为图像的链表。若是使用vector操作,参考图像采用先进先出需要将数组中除第一数外的所有的均前移,这样效率极低

  std::vector< TComList* >  m_picYuvDepthRec;         


  std::vector           m_frameRcvd;                  ///< number of received frames

  std::vector           m_depthFrameRcvd;   

为每个视角记录,编码端收到的帧数。

  unsigned                   m_essentialBytes;

  unsigned                   m_totalBytes;

#if DEPTH_MAP_GENERATION      

该宏在#if ( H3D_IVMP || H3D_IVRP )下定义的,这两个为视角间运动预测和视角间残差预测

#if VIDYO_VPS_INTEGRATION

  TComVPSAccess               m_cVPSAccess;    维护了一个视频参数集数组

#endif

  TComSPSAccess               m_cSPSAccess;

  TComAUPicAccess             m_cAUPicAccess;

#endif


#if VIDYO_VPS_INTEGRATION|QC_MVHEVC_B0046

  TComVPS                     m_cVPS;         视频参数集

#endif

  

#if HHI_VSO                             视点合成优化需要将深度和视频合成一个

  TRenTop                     m_cRendererTop; 

  TRenModel                   m_cRendererModel;   

#endif


#if HHI_INTERVIEW_SKIP

  TRenTop  m_cUsedPelsRenderer;                               ///< renderer for used pels map

#endif
********************************************************************


  // print information

  fprintf( stdout, "\n" );

  fprintf( stdout, "3D-HTM Software: Encoder Version [%s] based on HM Version [%s]", NV_VERSION, HM_VERSION );  

  fprintf( stdout, NVM_ONOS );

  fprintf( stdout, NVM_COMPILEDBY );

  fprintf( stdout, NVM_BITS );

  fprintf( stdout, "\n" );


  // create application encoder class

  cTAppEncTop.create();


  // parse configuration

  if(!cTAppEncTop.parseCfg( argc, argv ))

该函数是分析命令行即lencod.exe -c encode.cfg 并将参数文件中的数据读入到TAppEncCfg类中同时做了配置文件参数的检查输出了必要的信息到终端。

  {

    cTAppEncTop.destroy();

    return 1;

  }


  // starting time

  double dResult;

  long lBefore = clock();


  // call encoding function

  cTAppEncTop.encode();     //核心函数,编码应用程序类中完成全部编码工作的函数


  // ending time

  dResult = (double)(clock()-lBefore) / CLOCKS_PER_SEC;

  printf("\n Total Time: .3f sec.\n", dResult);


  // destroy application encoder class

  cTAppEncTop.destroy();


  return 0;

}


原创粉丝点击