1 回答
TA贡献1830条经验 获得超3个赞
AVFilter
所有我们写的滤镜都要用一个AVFilter结构体讲给ffmpeg听。 这个结构体里描述了ffmpeg从哪个方法进入我们的滤镜。 这个结构体在libavfilter/avfilter.h里如下定义:
01 typedef struct
02 {
03 char *name; ///< 滤镜名称
04
05 int priv_size; ///< 给滤镜分配的内存大小
06
07 int (*init)(AVFilterContext *ctx, const char *args, void *opaque);
08 void (*uninit)(AVFilterContext *ctx);
09
10 int (*query_formats)(AVFilterContext *ctx);
11
12 const AVFilterPad *inputs; ///< 一系列输入 NULL terminated list of inputs. NULL if none
13 const AVFilterPad *outputs; ///< 一系列输出 NULL terminated list of outputs. NULL if none
14 } AVFilter;
“query_formats”方法用于设置可以接受的输入图像格式和输出的图像格式(用于滤镜链分辨哪些滤镜可以组合在一起用)。
AVFilterPad
这个滤镜用于描述滤镜的输入输出,在libavfilter/avfilter.h中定义如下:
01 typedef struct AVFilterPad
02 {
03 char *name;
04 int type;
05
06 int min_perms;
07 int rej_perms;
08
09 void (*start_frame)(AVFilterLink *link, AVFilterPicRef *picref);
10 AVFilterPicRef *(*get_video_buffer)(AVFilterLink *link, int perms);
11 void (*end_frame)(AVFilterLink *link);
12 void (*draw_slice)(AVFilterLink *link, int y, int height);
13
14 int (*request_frame)(AVFilterLink *link);
15
16 int (*config_props)(AVFilterLink *link);
17 } AVFilterPad;
头文件里有十分具体的描述,这里大概解释如下:
输入输出pad都可以用的元素:
name pad的名字,所有的输入pad名字不能重复,所有的输出名字不能重复;
type 此元素目前只能为“AV_PAD_VIDEO”值
config_props 链接此pad的配置方法的函数指针
仅限输入pad使用的元素:
min_perms 接受输入需要的最小权限
rej_perms 不接受的输入权限
start_frame 一帧传入时引用的方法的函数指针
draw_slice 每个slice已经传入后引用的方法的函数指针
end_frame 一帧完整结束后引用的方法的函数指针
get_video_buffer 前一个滤镜调用,用以为一个图像请求内存
仅限输出pad使用的元素:
request_frame 请求滤镜输出一帧
- 1 回答
- 0 关注
- 1220 浏览
添加回答
举报