[FFmpeg-devel] [PATCH] libavfilter-soc: implement pad filter
Vitor Sessak
vitor1001
Wed May 20 20:42:21 CEST 2009
Stefano Sabatini wrote:
> On date Tuesday 2009-05-19 02:09:53 +0200, Stefano Sabatini encoded:
>> On date Monday 2009-05-18 23:49:50 +0200, Stefano Sabatini encoded:
>>> On date Sunday 2009-05-17 13:14:22 +0200, Stefano Sabatini encoded:
>>>> On date Monday 2009-05-11 19:17:51 +0200, Vitor Sessak encoded:
>>> [...]
>>>> I'm going to try this approach:
>>>> int request_frame(AVFilterLink *link, int width, int height, int left, int top);
>>>> picref *avfilter_get_video_buffer(link, int exp_w, int exp_h, int left, int top, AV_PERM_WRITE);
>>>>
>>>> the additional parameters given to avfilter_get_video_buffer() (at
>>>> least left and top) seem to be necessary to correctly free the buffer.
>>>>
>>>> An alternative approach would be to extend avfilter_config_links() to
>>>> take the additional parameters w, h, left, top and store them in the
>>>> link, but looks somehow more complicated.
>>> And implementation attached.
>>>
>>> Note how I also extended avfilter_poll_frame(): this seems to be
>>> required for the way it is used in vf_fps.c.
>> Please don't still review it, I'm still nailing down some bugs.
>
> Should be fixed now, try for example with:
>
> ffplay in.avi -vfilters "pad = exp_w=in_w+30 : exp_h=in_h + 30 : color = red,
> pad = exp_w=in_w+30 : exp_h=in_h + 30 : color = blue,
> pad = exp_w=in_w+30 : exp_h=in_h + 30 : color = yellow"
>
> This should provide a good base for further development, in particular
> it shouldn't be too hard to add support for RGB colorspaces.
Nice! Thanks for digging into this!
Some comments:
> /**
> * Polls a frame from the filter chain.
> @@ -515,7 +521,7 @@
> * @return the number of immediately available frames, a negative
> * number in case of error
> */
> -int avfilter_poll_frame(AVFilterLink *link);
> +int avfilter_poll_frame(AVFilterLink *link, int exp_w, int exp_h, int left, int top);
What is the rationale for adding this parameters also to poll_frame()?
> Index: libavfilter-soc/ffmpeg/ffmpeg.c
> ===================================================================
> --- libavfilter-soc.orig/ffmpeg/ffmpeg.c 2009-05-18 23:25:48.000000000 +0200
> +++ libavfilter-soc/ffmpeg/ffmpeg.c 2009-05-18 23:26:03.000000000 +0200
> @@ -355,7 +355,7 @@
> {
> AVFilterPicRef *pic;
>
> - if(avfilter_request_frame(ctx->inputs[0]))
> + if(avfilter_request_frame(ctx->inputs[0], ctx->inputs[0]->w, ctx->inputs[0]->h, 0, 0))
I suppose you didn't test the changes to ffmpeg.c, unless you forgot to
attach the patch for vsrc_buffer.c. I imagine that here handling
avfilter_request_frame() without memcpy'ing the whole frame (as is done
in ffplay.c) would be non trivial.
-Vitor
More information about the ffmpeg-devel
mailing list