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;
}