ffmpeg过滤器dev get_video_buffer函数用法

时间:2018-06-19 09:05:00

标签: filter ffmpeg

我正在写一个马赛克ffmpeg过滤器。 从vf_vflip.c复制代码,我注册了一个回调函数get_video_buffer 并按如下方式实施:

static AVFrame *get_video_buffer(AVFilterLink *link, int w, int h)
{
    MosaicContext *s = link->dst->priv;
    AVFrame *frame;
    int i;
    int j,k;

    frame = ff_get_video_buffer(link->dst->outputs[0], w, h);
    if (!frame)
        return NULL;

    if (s->w == 0 || s->h == 0)
        return frame;

    for (i = 0; i < 3; i ++) {
        // some trick code
    }

    return frame;
}

static const AVFilterPad avfilter_vf_mosaic_inputs[] = {
    {
        .name             = "default",
        .type             = AVMEDIA_TYPE_VIDEO,
        //.get_video_buffer = get_video_buffer,
        .filter_frame     = filter_frame,
        .config_props     = config_input,
    },
    { NULL }
};

但是在阅读了一些过滤器开发指南之后,我发现只有少数过滤器实现了get_video_buffer函数。默认函数是f_default_get_video_buffer() 我做了一些日志,发现ffmpeg调用函数就像

get_video_buffer
filter_frame
get_video_buffer
filter_frame
get_video_buffer
filter_frame
...

我对get_video_buffer做什么工作很困惑。 只知道某些过滤器会保留帧缓存。 我可以juse注释掉get_video_buffer钩子吗?

我在vf_vflip.c中的get_video_buffer()和filter_frame()中都看到了翻转作业 这是浪费时间吗?

static AVFrame *get_video_buffer(AVFilterLink *link, int w, int h)
{
    FlipContext *flip = link->dst->priv;
    AVFrame *frame;
    int i;

    frame = ff_get_video_buffer(link->dst->outputs[0], w, h);
    if (!frame)
        return NULL;

    for (i = 0; i < 4; i ++) {
        int vsub = i == 1 || i == 2 ? flip->vsub : 0;
        int height = AV_CEIL_RSHIFT(h, vsub);

        if (frame->data[i]) {
            frame->data[i] += (height - 1) * frame->linesize[i];
            frame->linesize[i] = -frame->linesize[i];
        }
    }

    return frame;
}

static int filter_frame(AVFilterLink *link, AVFrame *frame)
{
    FlipContext *flip = link->dst->priv;
    int i;

    for (i = 0; i < 4; i ++) {
        int vsub = i == 1 || i == 2 ? flip->vsub : 0;
        int height = AV_CEIL_RSHIFT(link->h, vsub);

        if (frame->data[i]) {
            frame->data[i] += (height - 1) * frame->linesize[i];
            frame->linesize[i] = -frame->linesize[i];
        }
    }

    return ff_filter_frame(link->dst->outputs[0], frame);
}

0 个答案:

没有答案