[FFmpeg-cvslog] r26315 - trunk/libavfilter/vf_pad.c

Baptiste Coudurier baptiste.coudurier
Wed Jan 12 02:35:11 CET 2011


On 01/11/2011 05:19 PM, Michael Niedermayer wrote:
> On Tue, Jan 11, 2011 at 05:01:00PM -0800, Baptiste Coudurier wrote:
>> On 01/11/2011 04:45 PM, Michael Niedermayer wrote:
>>> On Tue, Jan 11, 2011 at 04:35:14PM -0800, Baptiste Coudurier wrote:
>>>> On 01/11/2011 03:53 PM, michael wrote:
>>>>> Author: michael
>>>>> Date: Wed Jan 12 00:53:24 2011
>>>>> New Revision: 26315
>>>>>
>>>>> Log:
>>>>> Fix design of the pad filter.
>>>>> Previously the pad filter just drawed borders in the surrounding of the input
>>>>> without checking if this area was allocated or writeable. Now we check and
>>>>> allocate a new buffer if the input is unsuitable.
>>>>
>>>> How so ? pad filter get_buffer should ensure that the buffer is
>>>> correctly allocated.
>>>
>>> yes, but nothing gurantees that what is input into start_frame/draw_slice
>>> is what get_buffer returned
>>
>> Humm I have a bad feeling about this. I think it should be better
>> guaranteed given how many filters handle the buffers currently.
>>
>>> An example to show this problem
>>>
>>>                   /->pad=1000:100
>>> decoder ->   split
>>>                   \->pad=100:1000
>>>
>>> the decoder can here only get frames allocated from one of the 2 pad filters
>>> the second pad filter will get frames that have been allocated by the other
>>
>> Yes, but in this case direct rendering is not possible for the one of
>> the filters, so I don't see why this is a problem.
>
> in this case true, but for example:
>
>
>                    /->crop=1000:100
>   decoder ->   split
>                    \->crop=100:1000
>
> direct rendering is possible but only if buffers are passed along that have
> not been provided by the next filters get_buffer().

Well, yes, but that's not the pad filter :)

>> [...]
 >>
>>> There are also simpler cases where its convenient not to return the data in
>>> the next filters provided buffer.
>>> Examples are for example when the data alraedy is somewhere else like a
>>> AVPacket from a raw demuxer or from a decoder like our mpeg2 decoder that can
>>> provide slices by reusing a 16pixel high buffer to improve cache useage
>>
>> Assuming direct rendering, the decoder will write slices in the user
>> supplied buffer using get_buffer, so I don't see why this is a problem.
>
> It wont, see yourself:
>      s->dest[0] = s->current_picture.data[0] + ((s->mb_x - 1)<<  mb_size);
>      s->dest[1] = s->current_picture.data[1] + ((s->mb_x - 1)<<  (mb_size - s->chroma_x_shift));
>      s->dest[2] = s->current_picture.data[2] + ((s->mb_x - 1)<<  (mb_size - s->chroma_x_shift));
>
>      if(!(s->pict_type==FF_B_TYPE&&  s->avctx->draw_horiz_band&&  s->picture_structure==PICT_FRAME))
>      {
>          if(s->picture_structure==PICT_FRAME){
>          s->dest[0] += s->mb_y *   linesize<<  mb_size;
>          s->dest[1] += s->mb_y * uvlinesize<<  (mb_size - s->chroma_y_shift);
>          s->dest[2] += s->mb_y * uvlinesize<<  (mb_size - s->chroma_y_shift);
>          }else{
>              s->dest[0] += (s->mb_y>>1) *   linesize<<  mb_size;
>              s->dest[1] += (s->mb_y>>1) * uvlinesize<<  (mb_size - s->chroma_y_shift);
>              s->dest[2] += (s->mb_y>>1) * uvlinesize<<  (mb_size - s->chroma_y_shift);
>              assert((s->mb_y&1) == (s->picture_structure == PICT_BOTTOM_FIELD));
>          }
>      }
>
> B frames of codecs except h264 (where its impossible due to intra pred)
> will be returned in 16pixel high slices when draw_horiz_band is used never
> filling the whole buffer from get_buffer

Well, this is a mess IMHO. I have the feeling this was tested ~10 years 
ago and is no longer true.

In general, I'm against making APIs more complicated because of some 
obscure case.

Anyway, I don't think I agree with not guaranteeing that the buffer 
passed to start_frame is the buffer returned by get_buffer, this will 
make filters a mess and will only cause problems.

And this would break yadif as well.

Implementation of pad filter was good as it was, now it's overly 
complicated.

-- 
Baptiste COUDURIER
Key fingerprint                 8D77134D20CC9220201FC5DB0AC9325C5C1ABAAA
FFmpeg maintainer                                  http://www.ffmpeg.org



More information about the ffmpeg-cvslog mailing list