HEVC/HM代码稍微旧一点的版本,里面已经有build目录和VS工程,例如HM16.8直接打开HM_vc2015.sln就行。较新的版本同VVC/VTM几乎完全一样。这里以VVC/VTM为例。这里也有一篇非常详细的HM早期版本的教程:HEVC代码学习0:HM使用+码流分析教程_慢慢积累-CSDN博客
下载提案的网站:Welcome to Joint Video Experts Team,选择All Meetings,以VTM6.0为例,是O那次会议,提案为:
会议记录 JVET-O2000 Meeting Report of the 15th JVET Meeting (Gothenburg, SE, 3–12 July 2019)
算法描述 JVET-O2002 Algorithm description for Versatile Video Coding and Test Model 6 (VTM 6)
下载VTM6.0的代码:Files · VTM-6.0 · jvet / VVCSoftware_VTM · GitLab
备注:RC是Release Candidate(发行候选版本)的简称。和Beta版最大的差别在于Beta阶段会一直加入新的功能,但是到了RC版本,几乎就不会加入新的功能了,而主要着重于除错
关于提案的一些常识:JVET提案学习方法_慢慢积累-CSDN博客
可以考虑在改动之前,先在本地建立一个Git仓库,防止以后忘记代码有没有改过、改了哪里、改乱了等等。
git init
git add .
git commit -m "VTM 6.0"
阅读这个项目的README,得知在Windows系统下:
1.安装Cmake,下载:https://cmake.org/download/,下载Zip,然后把bin目录添加到环境变量,或者直接下载那个msi的安装包来安装。
2.新建build目录,在目录中执行:
mkdir build
cd build
cmake .. -G "Visual Studio 16 2019" -A x64
最后一句命令可以根据自己的VisualStudio版本修改:
cmake .. -G "Visual Studio 14 2015" -A x64
cmake .. -G "Visual Studio 15 2017" -A x64
cmake .. -G "Visual Studio 16 2019" -A x64
然后在build目录打开 NextSoftware.sln
就可以了。
下面这段是cmake的日志,可以看出来,如果更换了VS版本,是打不开NextSoftware.sln
的,需要重新生成。
PS E:\Documents\VideoCoding\VVCSoftware_VTM\build> cmake .. -G "Visual Studio 16 2019" -A x64
-- Selecting Windows SDK version 10.0.17763.0 to target Windows 10.0.18362.
-- The C compiler identification is MSVC 19.22.27905.0
-- The CXX compiler identification is MSVC 19.22.27905.0
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/bin/Hostx64/x64/cl.exe
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/bin/Hostx64/x64/cl.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/bin/Hostx64/x64/cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/bin/Hostx64/x64/cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Setting up BBuildEnv 3.13.0.2
-- Looking for pthread.h
-- Looking for pthread.h - not found
-- Found Threads: TRUE
-- Found OpenMP_C: -openmp (found version "2.0")
-- Found OpenMP_CXX: -openmp (found version "2.0")
-- Found OpenMP: TRUE (found version "2.0")
-- bb_enable_warnings: -> updating warnings flags: /WX;/wd4996
-- Configuring done
-- Generating done
-- Build files have been written to: E:/Documents/VideoCoding/VVCSoftware_VTM/build
编码
右键把EncoderApp
设为启动项目
配置 EncoderApp
项目属性:
- 属性 - 调试 - 工作目录:
$(SolutionDir)../bin
($(SolutionDir)
就是build文件夹,我这里设到与build同级的bin文件夹)
- 属性 - 调试 - 命令参数:
-c ../cfg/per-sequence/BasketballPass.cfg -c ../cfg/encoder_intra_vtm.cfg
(如果需要可以在结尾添加>> enc_log.txt
来把输出保存到txt中)
- 属性 - 常规 - 输出目录:这个可以不改,也可以改成和工作目录一致。默认位置在bin文件夹里一层一层点进去。
然后把BasketballPass.cfg对应的yuv文件放到工作目录,或者修改BasketballPass.cfg文件里yuv文件的位置。
然后右键 - 生成;然后点本地调试器
,就可以开始跑。
解码
右键把DecoderApp
设为启动项目
配置 DecoderApp
项目属性:
属性 - 调试 - 工作目录:$(SolutionDir)../bin
属性 - 调试 - 命令参数:-b str.bin -o dec.yuv
如果想使用YUView查看统计信息,命令参数:-b str.vvc -o dec.yuv --TraceFile="ACoded.vtmbmsstats" --TraceRule="D_BLOCK_STATISTICS_ALL:poc>=0" >> declog.txt
,注意在此之前的编码要修改配置文件生成vvc文件 具体可参考文章:VVC/VTM 可视化_hujy23的博客-CSDN博客。
关于修改编码参数
(以IBC参数为例)
如果研究IBC,编码时的命令参数要加一项,有几种加法:
-
加
--IBC=1
,变成-c BasketballDrillText.cfg -c encoder_intra_vtm.cfg --IBC=1
。(怎么知道可以这样写呢,读doc目录下的software manual) -
加
-c ../cfg/per-class/classF.cfg
,变成-c ../cfg/per-sequence/BasketballPass.cfg -c ../cfg/encoder_intra_vtm.cfg -c ../cfg/per-class/classF.cfg
,参数里的classF.cfg要放在最后面,因为不同配置文件里的同一个配置,靠后的生效的。(encoder_intra_vtm.cfg和classF.cfg都规定了IBC,前者规定是0后者是1)。 -
或者直接修改
encoder_intra_vtm.cfg
里面的IBC部分。
怎么查看有没有生效呢?在main函数中parseCfg函数这句设置断点,然后F5开始调试,运行到这里,在局部变量窗口展开pcEncApp
-EncAppCfg
可以在这一大堆参数,此时都还是空的,再F10走一步,可以看到参数都读进来了,里面有IBC相关的,m_IBCMode就是IBC的开关。