1、HM代码简介
HEVC的测试代码主要有两个,一个是HEVC官网提供的测试代码HM,另一个是multicoreware提供的x265代码。
HM代码是HEVC基础测试代码,同时拥有编码器和解码器,暂时没有并行编码的内容,其整体的编码时间是非常长的。但HM代码整体的可读性非常高,并不需要对C++掌握的非常好就可以阅读。
x265代码是在HM代码基础上优化而来的,只有编码器没有解码器,一方面x265是在HM基础上优化而来的代码,另一方面x265使用了WPP并行程序设计使得编码效率得到了很大的提高。x265之所以能这么快,一方面是代码本身优化的很厉害,不少操作都使用了汇编代码,另一方面针对Intel CPU做了优化加速,就相当于使用了IPP一样。而且这个代码的可读性比较差,还是多线程编程,调试难度大,代码基本上没有注释。x265代码最终还是要看的,毕竟算法上它优化的非常好,有很多值得借鉴的地方,建议先看HM代码,再看x265的代码。
2、HM代码下载及环境搭建
2.1 HM源代码下载
在https://hevc.hhi.fraunhofer.de/下的HMsoftware repository (main at HHI)的tags/下载,目前更新到16.9版本。建议https://hevc.hhi.fraunhofer.de/页面下的Documents以及Overview Papers两个栏目里的文章也一并下载下来看看。
2.2 HM源代码环境搭建
2.2.1 工程文件说明
HM\build\中有VS工程对应的sln,对应VS2010之后的VS版本,选择HM_vc10.sln就可以了。
HM\doc\中有一些文档,和Doxyfile,可以自己下载doxygen这个软件,生成HM代码的API。
HM\cfg\中有配置文件,其中encoder_xxxx_xxx.cfg是Profile,可根据个人需要选择profile,个人建议一开始如果编码8bit的视频流,使用encoder_intra_main.cfg即可,在8bit下这个配置和encoder_intra_main10.cfg是兼容的,在10bit视频流下使用encoder_intra_main10.cfg。encoder_intra_xxx.cfg是只包含I帧、不包含B帧和P帧的配置文件。encoder_lowdelay_xxx.cfg和encode_lowdelya_P_xxx.cfg的差别在于,前者只包含I帧和B帧,而后者是只包含I帧和P帧。encoder_lowdelay_xxx.cfg和encoder_randomaccess_xxx.cfg的差别在于,randomaccess里面的B帧是分层的B帧。
HM\cfg\per-sequence\下是各个标准测试yuv文件的相关配置,一般都是使用BasketballDrill.yuv作为测试视频所以选用BasketballDrill.cfg,不过这个配置中有个错误:FramesToBeEncoded: 500 即要编码的帧数,这里表示的是这个视频一共有多少帧,但这个视频流我测试结果是501帧,不是500帧。我个人建议这个值改小一点,要不然会花很长的时间编码的,我将这个值改成了50帧。
HM\bin\下存放的是可执行文件,就是编码器和解码器的可执行文件。HM\source\下毫无疑问存放的是源代码。
2.2.2 工程配置
我使用的是Vs2010,启动HM_vc10.sln后,将TAppEncoder设置为启动。
然后按F6,编译整个工程,编译完成后。设置TAppEcoder的工程属性:鼠标选定TAppEncoder,然后按Alt+Enter;或者鼠标选中TAppEncoder,右键,选择Properties。
在Configuration Properties->Debuging中设置CommandArguments和WorkingDirectory。CommandArguments设置成:
-c encoder_lowdelay_P_main.cfg -cencoder_yuv.cfg。WorkingDirectory设置成:..\..\bin\vc2010\Win32\Debug。将BasketballDrill.cfg里面的内容拷贝到新建的cencoder_yuv.cfg文件中,并修改InputFile路径即可。
如果是x64的系统,可以将Plaform设置成Active(x64),确定后,按Ctrl+F5就可以运行HM代码开始编码yuv视频了。