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

Vitor Sessak vitor1001
Sat May 30 18:25:37 CEST 2009


Michael Niedermayer wrote:
> On Sat, May 30, 2009 at 03:44:00PM +0200, Vitor Sessak wrote:
>> Michael Niedermayer wrote:
>>> On Fri, May 22, 2009 at 02:31:57PM +0200, Vitor Sessak wrote:
>>>> 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
>>> 1 - the decoder which is pretty much a filter with no input requests
>>>     from the next filter a buffer.
>>> 1b- the next filter can pass this request up until to the video output
>>>     device in principle or return a buffer. If this request passes a
>>>     "pad" filter it is modified accordingly.
>>> 2 - the decoder decodes into this frame.
>>> Which part of that are you not understanding 
>> I probably was missing that there is no decoder that need not only to 
>> preserve, but to output to the same data pointers of the last frame. Can 
>> you confirm that you can decode the first frame in a buffer and the second 
>> frame in a different buffer for every codec?
> 
> no i cant confirm that, the filter framework must support that as well
> but i cant see in how far that would be a problem.

If you have:

Frame 1: Size: 200x200, requested padding 1,1,1,1 -> buffer size:202x202

Frame 2: Size: 200x200, requested padding 8,8,8,8 -> buffer size:216x216

To decode the second frame, you need a buffer of size 216x216, but with 
the previous picture data inside. The only way I see to do this is to 
alloc a new buffer and memcpy the previous picture to it (unless, of 
course, you could predict already in the first frame you'd need a 
216x216 buffer, but it shouldn't be possible in general).

-Vitor




More information about the ffmpeg-devel mailing list