[FFmpeg-devel] [PATCH] libavfilter-soc: implement pad filter

Vitor Sessak vitor1001
Fri May 22 14:31:57 CEST 2009


Stefano Sabatini wrote:
> On date Thursday 2009-05-21 23:20:51 +0200, Stefano Sabatini encoded:
>> On date Wednesday 2009-05-20 20:42:21 +0200, Vitor Sessak encoded:
> [...]
>>> 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.
> 
> In attachment an updated patch with the missing changes to
> vsrc_buffer.c.
> 
> Can someone suggest how would be possible to avoid the initial frame
> -> picref memcpy?

What non lavfi-patched ffmpeg.c does now is:

1- allocs a frame with the padding specified by command-line opts -padXXXX
2- decodes the frame to this buffer. Note that this buffer might need to 
be reused for ME.

what I suggest:

a) For the first frame
1- ffmpeg.c allocs a frame with no padding.
2- libavfilter request a frame with padding px,py.
3- ffmpeg.c allocs a frame with padding px, py, copies the frame to it 
and free the replaces (freeing) the old frame by the new
4- ffmpeg.c passes the new frame to the filter framework

b) For the next frame
5- ffmpeg.c decodes the frame with padding px, py
6- libavfilter request a frame with padding px2, py2
7- if (px2 > px || py2 > py) alloc another frame and memcpy the pic to 
it (and set px = px2; py = py2;). if not, just send the frame pointer to 
libavfilter

Note that since the frame must be preserved for ME, it is impossible to 
completely avoid memcpy() if the padding amount varies wildly between 
frames. All we can do is to avoid it if it is constant or decreasing. 
Note the user can optimize his filter chain to avoid memcpy. For 
example, this (hypothetical, libavfilter does not support changing 
width/height on the fly yet) nasty filter

pad=100*sin(2*PI*FRAME_NUMBER/100):100*cos(2*PI*FRAME_NUMBER/100)

can be replaced by

pad=100:100, 
crop=100-100*sin(2*PI*FRAME_NUMBER/100):100-100*cos(2*PI*FRAME_NUMBER/100)

which will not require any memcpy'ing.

-Vitor



More information about the ffmpeg-devel mailing list