{下载&安装} -->Linux系统性安装最新版本的HM:
- 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)提供支持。<-----------####
- 选择下载最新版本: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
{源码的整体框架} -->从整体到局部进行分析:
- source–>源代码–>C++工程––>tree -a --> All files are listed.
yupengfei@yupengfei-X550VX:~/HM16-20-trunk-version/source$ tree>../treeOfsource.txt
- 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
- HM16.20的整个C++工程的目录结构为两层,根目录下只有两个文件夹——一个是APP,一个是Lib—— ,代码的管理极为条理,命名极为规范。
- 编码器函数调用关系图:
参考:HEVC官方软件HM源代码简单分析-编码器TAppEncoder
- 解码器函数调用关系图:
参考:HEVC官方软件HM源代码简单分析-解码器TAppDecoder
- API功能可以查阅HM16.20操作手册
{分析Encoder部分的框架}
- ls -laRs
部分ls的参数 |
参数的含义 |
-a, --all |
不隐藏任何以. 开始的项目 |
-l |
使用较长格式列出信息 |
-R, --recursive |
递归显示子目录 |
-s, --size |
以块数形式显示每个文件分配的尺寸 |
- 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"
#include "../Lib/TLibCommon/Debug.h"
int main(int argc, char* argv[])
{
TAppEncTop cTAppEncTop;
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" );
cTAppEncTop.create();
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
Double dResult;
clock_t lBefore = clock();
cTAppEncTop.encode();
dResult = (Double)(clock()-lBefore) / CLOCKS_PER_SEC;
printf("\n Total Time: %12.3f sec.\n", dResult);
cTAppEncTop.destroy();
return 0;
}
- 就这样开启了HM软件的代码分析之旅,之后会对代码进行进一步学习,并依据新算法提出改进意见。最近在学习GitHub的使用,掌握GitHub的使用后会将代码上传到GitHub上,对代码进行批注和修改。
- 欢迎批评指正!!