HM版本:16.18
從本文開始,我們將從編碼端層層剖析HM的代碼。我們首先從編碼端入手,在TAppEncoder
中我們可以看到有一個encmain.cpp
文件,這個文件即是編碼的主函數。
在encmain.cpp
中主要做了以下幾件事:
其中TAppEncTop
繼承自TAppEncCfg
,在父類TAppEncCfg
中,定義了大量成員變量來保存參數,子類TAppEncTop
中除了父類的成員外,還包括編碼所需要的各種成員變量和成員方法。
實際上在代碼中給出的英文註釋已經非常詳細了,這裏就不再機械的翻譯一遍了,後面遇到代碼中未進行註釋的地方將會使用中文進行註釋。最後是encmain.cpp
的代碼:
#include <time.h>
#include <iostream>
#include "TAppEncTop.h"
#include "TAppCommon/program_options_lite.h"
//! \ingroup TAppEncoder
//! \{
#include "../Lib/TLibCommon/Debug.h"
// ====================================================================================================================
// Main function
// ====================================================================================================================
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
// for (int i = 0; i < 9; i++) {
//std:cout << *argv++ << endl;
// }
try
{
if(!cTAppEncTop.parseCfg( argc, argv ))
{
cTAppEncTop.destroy();
#if ENVIRONMENT_VARIABLE_DEBUG_AND_TEST
EnvVar::printEnvVar();
#endif
return 1;
}
}
catch (df::program_options_lite::ParseFailure &e)
{
std::cerr << "Error parsing option \""<< e.arg <<"\" with argument \""<< e.val <<"\"." << std::endl;
return 1;
}
#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();
system("PAUSE");
return 0;
}