Filter滤镜剖析—format
作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音
关于 format 滤镜的用法请阅读一下前文《FFmpeg的视频format滤镜介绍》。
format 滤镜的实现是在 libavfilter/vf_format.c 里面的,但是 format 是没有实现自己的 filter_frame() 函数的,所以他调的是 default_filter_frame(),如下:

你可以把 default_filter_frame() 看成是一个空函数,他里面实际上什么都不做的,只是把 AVFrame 传递给下一个 fifo 队列。
这里读者可能会有一个疑问,format 滤镜不是转化像素格式的吗,如果什么都不做,怎么得到指定的像素格式?
这个是这样的,format 滤镜转化像素格式是依赖 graph_config_formats() 来实现的,在前面创建滤镜链的时候,有一个协商格式的过程,如果两个相邻的 滤镜,他们支持的 格式不一样,就会在中间自动插入一个 scale 滤镜来进行格式转化。如下图:

上图中 overlay 输出的格式是 yuv420p,但是我们设置了 format 滤镜的像素格式为 rgb48be,这时候两个相邻滤镜的格式是不一致的。所以在 graph_config_formats() 的时候,就会自动插入一个 scale 滤镜来帮我们实现格式转化,代码如下:
//自动插入 scale 滤镜的部分代码
filter = avfilter_get_by_name("scale")
...省略...
snprintf(inst_name, sizeof(inst_name), "auto_scaler_%d", scaler_count++);
