Filter ffmpeg过滤器开发获取视频缓冲区功能使用

Filter ffmpeg过滤器开发获取视频缓冲区功能使用,filter,ffmpeg,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

我正在写一个拼图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_缓冲挂钩吗

我在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);
}
静态AVFrame*获取视频缓冲区(AVFilterLink*链接,整数w,整数h)
{
FlipContext*flip=link->dst->priv;
AVFrame*frame;
int i;
frame=ff_get_video_缓冲区(链接->dst->输出[0],w,h);
如果(!帧)
返回NULL;
对于(i=0;i<4;i++){
int-vsub=i==1 | i==2?翻转->vsub:0;
int height=AV_CEIL_R换档(h,vsub);
if(帧->数据[i]){
帧->数据[i]+=(高度-1)*帧->线宽[i];
帧->线宽[i]=-帧->线宽[i];
}
}
返回框;
}
静态int filter_帧(AVFilterLink*链接,AVFrame*帧)
{
FlipContext*flip=link->dst->priv;
int i;
对于(i=0;i<4;i++){
int-vsub=i==1 | i==2?翻转->vsub:0;
int height=AV_CEIL_RSHIFT(链接->h,vsub);
if(帧->数据[i]){
帧->数据[i]+=(高度-1)*帧->线宽[i];
帧->线宽[i]=-帧->线宽[i];
}
}
返回ff_filter_帧(链接->dst->输出[0],帧);
}

如果传入帧不可写,则必须分配新的avframe。vf_vflip恰好有自己的calback来实现这一点。你是说必须在get_video_buffer和filter_frame中实现2?为什么像这样的过滤器代码很少?或者更改帧数据是否应编码为vflip.c?其他不更改帧数据的位置?
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);
}