FATE (FFmpeg Automated Testing Environment) 是FFmpeg社区开发的自动化测试框架,支持对FFmpeg API的测试,也支持对FFmpeg内部函数的测试。对FFmpeg video filter的测试,就属于对API的测试。之前为了为一个video filter增加fate测试,大概研究了一下,感觉FFmpeg官方主页的资料还可以更详细,在酝酿写一篇介绍的时候,看到"大师兄悟空"在微信公共号“流媒体技术”发布了《如何编写FFmpeg自动化测试用例》(一、二),就一时懒得动笔。
趁最近几天假期,想想还是记录一下为佳,除了分享外,还可以自用备查。我的记录角度是在Linux环境下如何一步步的探索出FFmpeg video filter FATE的测试过程,从而理解如何为一个video filter增加fate测试。可能这样更实用,一个新的任务,缺少足够资料,都可以用这样类似的方法去探索。成文顺序虽然大致是按探索过程来的,但是,为了阅读逻辑性,有些地方会直接介绍后来才理解到的知识点。
先上一个图,列一下接下来会用到的主要文件以及目录。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tGRrAXw6-1587431743857)(https://graph.baidu.com/resource/2227cb590ec9d4d2b732201581001970.png)]
- 预备步骤1
得到FFmpeg源代码并且编译:
#演示目的,所以,所有内容都放在/tmp/目录下
$ mkdir -p /tmp/ffmpeg_work
$ cd /tmp/ffmpeg_work
$ git clone https://git.ffmpeg.org/ffmpeg.git
#新建编译目录,以和源码目录分离
$ mkdir build
$ cd build
#configure参数有很多,这里简单起见,使用默认值
$ ../ffmpeg/configure
$ make -j8
#可以看到编译出了ffmpeg和ffplay等
#其中带_g后缀的文件名表示symbol没有被strip。
$ ls
config.asm doc ffmpeg ffplay ffprobe
fftools libavdevice libavformat libswresample
Makefile tests config.h ffbuild ffmpeg_g
ffplay_g ffprobe_g libavcodec libavfilter
libavutil libswscale src.
- 预备步骤2
在FATE中有很多测试,有些测试是自包含的,有些测试还需要额外的资料,在FFmpeg中一般称之为SAMPLES,可以用下面的方法获取SAMPLES。
$ make fate-rsync SAMPLES=fate-suite/
#命令输出如下,表示用rsync方法来同步资料
rsync -vrltLW --timeout=60 --contimeout=60 rsync://fate-suite.ffmpeg.org/fate-suite/ fate-suite/
不幸的是,由于网络原因,这条命令很难成功执行。所以,只能假设这些资料都已经在你的系统的/tmp/ffmpeg_work/fate-suite/
目录下面了。需要提醒的是,这些资料可能会经常更新(一般来说,只会增加内容,不会修改文件),如果你要跑完整FATE的话,需要时时更新。
- 运行FATE
对于自包含不需要SAMPLES的测试,只需要运行下面的命令。
$ make fate
GEN tests/pixfmts.mak
# 下面的输出提示也表明后续测试不需要SAMPLES
warning: only a subset of the fate tests will be run because SAMPLES is not specified
HOSTCC tests/base64.o
HOSTLD tests/base64
HOSTCC tests/tiny_psnr.o
HOSTLD tests/tiny_psnr
HOSTCC tests/tiny_ssim.o
HOSTLD tests/tiny_ssim
HOSTCC tests/audiomatch.o
HOSTLD tests/audiomatch
CC tests/checkasm/aacpsdsp.o
CC tests/checkasm/af_afir.o
CC tests/checkasm/alacdsp.o
...
TEST checkasm-aacpsdsp
TEST checkasm-af_afir
TEST checkasm-alacdsp
...
我为DNN模块加的FATE测试也属于这种类型。
对于需要SAMPLES的测试,则可以用下面的命令来指定SAMPLES对应的目录。实际上,指定SAMPLES还有其他的几种方法,这里只是选择了其中的一种方法。在指定SAMPLES后,make fate
就会跑所有的测试用例,包括自包含的测试。
$ make fate SAMPLES=../fate-suite/
...
TEST filter-scale500
...
有些FFmpeg video filter的fate测试属于这种类型,需要依赖SAMPLES的存在。而有些video filter的fate测试所需要的数据都已经在FFmpeg源代码目录树中了,就不需要依赖SAMPLES了。
在make fate的时候,首先会编译测试用例(见命令行输出的CC等字样),然后就会执行测试(见命令行输出的TEST字样)。根据命令行输出我们可以看到有很多个子测试被执行。
- 单跑一个fate测试
上述make fate
的方法会跑多个测试,为了理解如何增加一个filter测试,我们应该先缩小到一个测试的情况。基于对makefile的了解,我们知道只要为make指定单独的一个测试作为target即可,那具体应该是什么呢,