HM软件学习日记(第15天)

下载&安装
源码的整体框架
分析Encoder部分的框架
研究Encoder的代码

{下载&安装} -->Linux系统性安装最新版本的HM:

  1. HM是通过svn方式管理的,在网站上有三个选项目:
    ####--------->svn_HEVCSoftware - Revision 4998: / <-----------####
    svn_-hevc软件-修订版4998:/
    branches/
    tags/
    trunk/
    ####---------> Powered by Apache Subversion version 1.9.7 (r1800392).<-----------####
    ####--------->由Apache Subversion 1.9.7版(r1800392)提供支持。<-----------####
  2. 选择下载最新版本:trunk/
    并把安装过程记录到:SVN_HM16_20_sh.txt
    之后修改文件夹名字为:HM16-20-trunk-version
yupengfei@yupengfei-X550VX:~$ svn checkout https://hevc.hhi.fraunhofer.de/svn/svn_HEVCSoftware/trunk/>SVN_HM16_20_sh.txt

{源码的整体框架} -->从整体到局部进行分析:

  1. source–>源代码–>C++工程––>tree -a --> All files are listed.
yupengfei@yupengfei-X550VX:~/HM16-20-trunk-version/source$ tree>../treeOfsource.txt
  1. source–>源代码–>C++工程–>tree -d —>List directories only.
yupengfei@yupengfei-X550VX:~/HM16-20-trunk-version/source$ tree -d
.
├── App
│   ├── TAppDecoder
│   ├── TAppEncoder
│   ├── TAppMCTSExtractor
│   └── utils
│       └── BitrateTargeting
└── Lib
    ├── libmd5
    ├── TAppCommon
    ├── TLibCommon
    ├── TLibDecoder
    ├── TLibEncoder
    └── TLibVideoIO

13 directories

  1. HM16.20的整个C++工程的目录结构为两层,根目录下只有两个文件夹——一个是APP,一个是Lib—— ,代码的管理极为条理,命名极为规范。
  2. 编码器函数调用关系图:
    参考:HEVC官方软件HM源代码简单分析-编码器TAppEncoder
  3. 解码器函数调用关系图:
    参考:HEVC官方软件HM源代码简单分析-解码器TAppDecoder
  4. API功能可以查阅HM16.20操作手册

{分析Encoder部分的框架}

  1. ls -laRs
部分ls的参数 参数的含义
-a, --all 不隐藏任何以. 开始的项目
-l 使用较长格式列出信息
-R, --recursive 递归显示子目录
-s, --size 以块数形式显示每个文件分配的尺寸
  1. TAppEncoder
yupengfei@yupengfei-X550VX:~/HM16-20-trunk-version/source/App/TAppEncoder$ ls -laRs
.:
总用量 304
  4 drwxrwxr-x 2 yupengfei yupengfei   4096 8月  10 11:26 .
  4 drwxrwxr-x 6 yupengfei yupengfei   4096 8月  10 11:25 ..
  4 -rw-rw-r-- 1 yupengfei yupengfei   3593 8月  10 11:26 encmain.cpp
200 -rw-rw-r-- 1 yupengfei yupengfei 203747 8月  10 11:26 TAppEncCfg.cpp
 36 -rw-rw-r-- 1 yupengfei yupengfei  33018 8月  10 11:26 TAppEncCfg.h
 48 -rw-rw-r-- 1 yupengfei yupengfei  47572 8月  10 11:26 TAppEncTop.cpp
  8 -rw-rw-r-- 1 yupengfei yupengfei   4147 8月  10 11:26 TAppEncTop.h
yupengfei@yupengfei-X550VX:~/HM16-20-trunk-version/source/Lib/TLibEncoder$ ls -las
总用量 1276
  4 drwxrwxr-x 2 yupengfei yupengfei   4096 8月  10 11:26 .
  4 drwxrwxr-x 8 yupengfei yupengfei   4096 8月  10 11:26 ..
  4 -rw-rw-r-- 1 yupengfei yupengfei   3578 8月  10 11:26 AnnexBwrite.h
  8 -rw-rw-r-- 1 yupengfei yupengfei   4644 8月  10 11:26 NALwrite.cpp
  4 -rw-rw-r-- 1 yupengfei yupengfei   2904 8月  10 11:26 NALwrite.h
 68 -rw-rw-r-- 1 yupengfei yupengfei  66133 8月  10 11:26 SEIEncoder.cpp
  8 -rw-rw-r-- 1 yupengfei yupengfei   5654 8月  10 11:26 SEIEncoder.h
 56 -rw-rw-r-- 1 yupengfei yupengfei  56703 8月  10 11:26 SEIwrite.cpp
  8 -rw-rw-r-- 1 yupengfei yupengfei   6745 8月  10 11:26 SEIwrite.h
  8 -rw-rw-r-- 1 yupengfei yupengfei   4898 8月  10 11:26 SyntaxElementWriter.cpp
  8 -rw-rw-r-- 1 yupengfei yupengfei   4107 8月  10 11:26 SyntaxElementWriter.h
 16 -rw-rw-r-- 1 yupengfei yupengfei  14344 8月  10 11:26 TEncAnalyze.h
  8 -rw-rw-r-- 1 yupengfei yupengfei   4141 8月  10 11:26 TEncBinCoderCABACCounter.cpp
  4 -rw-rw-r-- 1 yupengfei yupengfei   2619 8月  10 11:26 TEncBinCoderCABACCounter.h
 12 -rw-rw-r-- 1 yupengfei yupengfei  10289 8月  10 11:26 TEncBinCoderCABAC.cpp
  4 -rw-rw-r-- 1 yupengfei yupengfei   3923 8月  10 11:26 TEncBinCoderCABAC.h
  4 -rw-rw-r-- 1 yupengfei yupengfei   3637 8月  10 11:26 TEncBinCoder.h
 64 -rw-rw-r-- 1 yupengfei yupengfei  65218 8月  10 11:26 TEncCavlc.cpp
  8 -rw-rw-r-- 1 yupengfei yupengfei   6873 8月  10 11:26 TEncCavlc.h
 96 -rw-rw-r-- 1 yupengfei yupengfei  95195 8月  10 11:26 TEncCfg.h
 68 -rw-rw-r-- 1 yupengfei yupengfei  67921 8月  10 11:26 TEncCu.cpp
 12 -rw-rw-r-- 1 yupengfei yupengfei   8342 8月  10 11:26 TEncCu.h
 24 -rw-rw-r-- 1 yupengfei yupengfei  21528 8月  10 11:26 TEncEntropy.cpp
 12 -rw-rw-r-- 1 yupengfei yupengfei  10115 8月  10 11:26 TEncEntropy.h
124 -rw-rw-r-- 1 yupengfei yupengfei 126429 8月  10 11:26 TEncGOP.cpp
 12 -rw-rw-r-- 1 yupengfei yupengfei  11029 8月  10 11:26 TEncGOP.h
  8 -rw-rw-r-- 1 yupengfei yupengfei   4696 8月  10 11:26 TEncPic.cpp
  8 -rw-rw-r-- 1 yupengfei yupengfei   4592 8月  10 11:26 TEncPic.h
  8 -rw-rw-r-- 1 yupengfei yupengfei   5363 8月  10 11:26 TEncPreanalyzer.cpp
  4 -rw-rw-r-- 1 yupengfei yupengfei   2494 8月  10 11:26 TEncPreanalyzer.h
 40 -rw-rw-r-- 1 yupengfei yupengfei  38132 8月  10 11:26 TEncRateCtrl.cpp
 16 -rw-rw-r-- 1 yupengfei yupengfei  14090 8月  10 11:26 TEncRateCtrl.h
 48 -rw-rw-r-- 1 yupengfei yupengfei  46774 8月  10 11:26 TEncSampleAdaptiveOffset.cpp
  8 -rw-rw-r-- 1 yupengfei yupengfei   7319 8月  10 11:26 TEncSampleAdaptiveOffset.h
 72 -rw-rw-r-- 1 yupengfei yupengfei  72203 8月  10 11:26 TEncSbac.cpp
 12 -rw-rw-r-- 1 yupengfei yupengfei   9940 8月  10 11:26 TEncSbac.h
224 -rw-rw-r-- 1 yupengfei yupengfei 227564 8月  10 11:26 TEncSearch.cpp
 24 -rw-rw-r-- 1 yupengfei yupengfei  23482 8月  10 11:26 TEncSearch.h
 52 -rw-rw-r-- 1 yupengfei yupengfei  50361 8月  10 11:26 TEncSlice.cpp
  8 -rw-rw-r-- 1 yupengfei yupengfei   7628 8月  10 11:26 TEncSlice.h
 52 -rw-rw-r-- 1 yupengfei yupengfei  49730 8月  10 11:26 TEncTop.cpp
 12 -rw-rw-r-- 1 yupengfei yupengfei  10359 8月  10 11:26 TEncTop.h
 28 -rw-rw-r-- 1 yupengfei yupengfei  28469 8月  10 11:26 WeightPredAnalysis.cpp
  4 -rw-rw-r-- 1 yupengfei yupengfei   2848 8月  10 11:26 WeightPredAnalysis.h


{研究Encoder的代码}

  • 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
  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();
  return 0;
}
  • 就这样开启了HM软件的代码分析之旅,之后会对代码进行进一步学习,并依据新算法提出改进意见。最近在学习GitHub的使用,掌握GitHub的使用后会将代码上传到GitHub上,对代码进行批注和修改。
  • 欢迎批评指正!!

猜你喜欢

转载自blog.csdn.net/Master_Yu_Daye/article/details/107911999