[FFmpeg-devel] [PATCH] HWAccel infrastructure (take 3)

Gwenole Beauchesne gbeauchesne
Wed Feb 18 14:38:01 CET 2009

On Wed, 18 Feb 2009, Michael Niedermayer wrote:

>> +    /**
>> +     * Called at the beginning of each slice.
>> +     *
>> +     * libavcodec will try its best to provide a single \p buf base at
>> +     * each call. However, this is not guaranteed for all codecs but
>> +     * for MPEG-1/2. This function is mandatory only if end_slice()
>> +     * is implemented.
>> +     *
>> +     * @param avctx the codec context
>> +     * @param buf the slice, or frame, data buffer base
>> +     * @param buf_offset the offset to the actual slice data
>> +     * @return zero if successful, a negative value otherwise
>> +     */
>> +    int (*start_slice)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_offset);
> hmm this seems poorly designed
> first, it needs a buf_size or you will segfault
> second buf / buf_offset can be replaced by buf or why not?

Actually, the correct sequence order was meant to be start_slice(), 
decode_slice(), end_slice() so that to follow natural processing of the 
bitstream in the codec implementation. Otherwise, we can end up 
duplicating code to advance to the next slice and/or add other variables 
to record the previous position then compute size. i.e. IMO, uglification 
in some locations (in h263dec.c in particular).

If it's OK with you to slightly uglify h263dec but make it possible to 
merge all 3 into a single decode_slice() call, then that'd be fine with me 

Concerning buf / buf_offset, this was meant for optimization purposes in 
the HWAccel implementation. That way we can reduce control blocks and/or 
(it depends on the HWAccel) copy only one buffer in the end.

>> +} AVHWAccel;
> please add a "const char name"

And what/how would this be used for? I mean, in the current approach, this 
is not needed at all as we can already automatically select the HWAccel 
and fallback to pure SW mode otherwise.

>> @@ -950,7 +950,8 @@ void MPV_frame_end(MpegEncContext *s)
>>      //just to make sure that all data is rendered.
>>      if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
>>          ff_xvmc_field_end(s);
>> -    }else if(!(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
>> +    }else if(!s->avctx->hwaccel
>> +       && !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
>>         && s->unrestricted_mv
>    }else if(!(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
> +      !s->avctx->hwaccel
>       && s->unrestricted_mv

Order does not really matter here since the next patch will remove the 
HWACCEL_VDPAU thing. So, currently it's 1-/2+ then 1-, and with your 
suggestion that will be 1+ then 2-/1+ -- do you prefer keeping some more 
work for next time? ;-)

I could make it a one-line but someone will surely complain that the line 
is too long.

More information about the ffmpeg-devel mailing list