X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavfilter%2Fvsrc_buffer.c;h=93f2367ab8da9d49b6ed9477cd577d366d4fdf58;hb=bc154882e11f4a218cc8cfb10ae0b4cbc83b5f9f;hp=c48f04af588cfb409e2a9d86199660f5d4d74c0e;hpb=b8dddebf3e341631d02328144e8dd9e75091fc69;p=ffmpeg diff --git a/libavfilter/vsrc_buffer.c b/libavfilter/vsrc_buffer.c index c48f04af588..93f2367ab8d 100644 --- a/libavfilter/vsrc_buffer.c +++ b/libavfilter/vsrc_buffer.c @@ -1,20 +1,20 @@ /* * Copyright (c) 2008 Vitor Sessak * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -25,6 +25,7 @@ #include "avfilter.h" #include "vsrc_buffer.h" +#include "libavutil/imgutils.h" typedef struct { int64_t pts; @@ -32,6 +33,7 @@ typedef struct { int has_frame; int h, w; enum PixelFormat pix_fmt; + AVRational time_base; ///< time_base to set in the output link AVRational pixel_aspect; } BufferSourceContext; @@ -62,13 +64,24 @@ int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque) { BufferSourceContext *c = ctx->priv; + char pix_fmt_str[128]; int n = 0; - if (!args || (n = sscanf(args, "%d:%d:%d", &c->w, &c->h, &c->pix_fmt)) != 3) { - av_log(ctx, AV_LOG_ERROR, "Expected 3 arguments, but only %d found in '%s'\n", n, args ? args : ""); + if (!args || + (n = sscanf(args, "%d:%d:%127[^:]:%d:%d", &c->w, &c->h, pix_fmt_str, &c->time_base.num, &c->time_base.den)) != 5) { + av_log(ctx, AV_LOG_ERROR, "Expected 5 arguments, but only %d found in '%s'\n", n, args); return AVERROR(EINVAL); } + if ((c->pix_fmt = av_get_pix_fmt(pix_fmt_str)) == PIX_FMT_NONE) { + char *tail; + c->pix_fmt = strtol(pix_fmt_str, &tail, 10); + if (*tail || c->pix_fmt < 0 || c->pix_fmt >= PIX_FMT_NB) { + av_log(ctx, AV_LOG_ERROR, "Invalid pixel format string '%s'\n", pix_fmt_str); + return AVERROR(EINVAL); + } + } + av_log(ctx, AV_LOG_INFO, "w:%d h:%d pixfmt:%s\n", c->w, c->h, av_pix_fmt_descriptors[c->pix_fmt].name); return 0; } @@ -87,6 +100,7 @@ static int config_props(AVFilterLink *link) link->w = c->w; link->h = c->h; + link->time_base = c->time_base; return 0; } @@ -94,7 +108,7 @@ static int config_props(AVFilterLink *link) static int request_frame(AVFilterLink *link) { BufferSourceContext *c = link->src->priv; - AVFilterPicRef *picref; + AVFilterBufferRef *picref; if (!c->has_frame) { av_log(link->src, AV_LOG_ERROR, @@ -108,17 +122,18 @@ static int request_frame(AVFilterLink *link) AV_PERM_REUSE2, link->w, link->h); - av_picture_copy((AVPicture *)&picref->data, (AVPicture *)&c->frame, - picref->pic->format, link->w, link->h); + av_image_copy(picref->data, picref->linesize, + c->frame.data, c->frame.linesize, + picref->format, link->w, link->h); - picref->pts = c->pts; - picref->pixel_aspect = c->pixel_aspect; - picref->interlaced = c->frame.interlaced_frame; - picref->top_field_first = c->frame.top_field_first; - avfilter_start_frame(link, avfilter_ref_pic(picref, ~0)); + picref->pts = c->pts; + picref->video->pixel_aspect = c->pixel_aspect; + picref->video->interlaced = c->frame.interlaced_frame; + picref->video->top_field_first = c->frame.top_field_first; + avfilter_start_frame(link, avfilter_ref_buffer(picref, ~0)); avfilter_draw_slice(link, 0, link->h, 1); avfilter_end_frame(link); - avfilter_unref_pic(picref); + avfilter_unref_buffer(picref); c->has_frame = 0;