[FFmpeg-devel] [PATCH] AVHWAccel infrastructure v2 (take 6) [ping]

Gwenole Beauchesne gbeauchesne
Sun Oct 24 20:57:59 CEST 2010


Hi,

Ping.

v7 also attached to replace {alloc,free}_surface() hooks with the generic 
{get,release}_buffer(). If the user implements his own get_buffer() 
function, he will have to call the hwaccel's one too to initialize data[3] 
properly.

Regards,
Gwenole.

On Mon, 20 Sep 2010, Gwenole Beauchesne wrote:

> Hi,
>
> It seems I didn't reply to this one or the message got lost because I had a 
> v5 lying around for some time. Here is a v6 anyway, that intersects with the 
> tidsp needs.
>
> On Mon, 22 Feb 2010, Michael Niedermayer wrote:
>
>> On Mon, Jan 04, 2010 at 04:39:02PM +0100, Gwenole Beauchesne wrote:
>>> Hi,
>>> 
>>> On Mon, 4 Jan 2010, Michael Niedermayer wrote:
>>> 
>>>>> In the new model I wanted to use, hwaccel_context was to be solely
>>>>> maintained by libavcodec. However, it still needed a way to get some
>>>>> hwaccel context initialized by the user-application. e.g. a VADisplay
>>>>> (void
>>>>> *), an LPDIRECTXVIDEODECODER, etc.
>>>>> 
>>>>> I felt interesting to pass this information through hwaccel attrs along
>>>>> with other int attributes.
>>>> 
>>>> We have existing means to pass information, that is through 
>>>> AVCodecContext
>>>> and using AVOption where appropriate
>>>> As well as using AVFrame instead of AVCodecContext where its per frame
>>>> data
>>> 
>>> OK, I nuked the hwaccel attrs and replaced it with
>>> AVCodecContext.hwaccel_{id,flags}. hwaccel_flags is handled by AVOption. I
>>> left hwaccel_id as is to match existing practise (pix_fmt et al.).
>>> 
>>> I haven't tested with MPlayer yet but this new approach still works with 
>>> my
>>> modified ffplay.
>>> 
>>> So, HW accelerator selection works as is:
>>> - Set AVCodecContext.hwaccel_id to the desired accelerator
>>> - Set AVCodecContext.hwaccel_flags to HWACCEL_CAP_GET_PIXELS if the user
>>> wants AVFrame.data[0-2] populated with YV12 or NV12 pixels
>>> 
>>> This means we can handle multiple accelerators automatically at once.
>>> Anyway, this lived in an ideal world without practical use since the
>>> user-application would still have to handle the HW accelerator
>>> specifically.
>>> 
>>> Regards,
>>> Gwenole.
>> 
>> ]...]
>>> @@ -2497,7 +2498,7 @@ typedef struct AVCodecContext {
>>>       * provided by the user. In that case, this holds display-dependent
>>>       * data FFmpeg cannot instantiate itself. Please refer to the
>>>       * FFmpeg HW accelerator documentation to know how to fill this
>>> -     * is. e.g. for VA API, this is a struct vaapi_context.
>>> +     * is. e.g. for VA API, this is a VADisplay.
>>>       * - encoding: unused
>>>       * - decoding: Set by user
>>>       */
>> 
>> hunk ok probably
>> 
>> [...]
>>> +    /**
>>> +     * Called in codec initialization.
>>> +     *
>>> +     * This is used to initialize the AVCodecContext.hwaccel_context
>>> +     * hardware accelerator context.
>>> +     *
>>> +     * @param avctx the codec context
>>> +     * @return zero if successful, a negative value otherwise
>>> +     */
>>> +    int (*init)(AVCodecContext *avctx);
>>> +
>>> +    /**
>>> +     * Called in codec finalization.
>>> +     *
>>> +     * This is used to clean-up any data from the hardware accelerator
>>> +     * context. Should this function be implemented, it shall reset
>>> +     * AVCodecContext.hwaccel_context to NULL.
>>> +     *
>>> +     * @param avctx the codec context
>>> +     * @return zero if successful, a negative value otherwise
>>> +     */
>>> +    int (*close)(AVCodecContext *avctx);
>>> +
>>> +    /**
>>> +     * Called at the beginning of each frame to allocate a HW surface.
>>> +     *
>>> +     * The returned surface will be stored in Picture.data[3].
>>> +     *
>>> +     * @param avctx the codec context
>>> +     * @param surface the pointer to the HW accelerator surface
>>> +     * @return zero if successful, a negative value otherwise
>>> +     */
>>> +    int (*alloc_surface)(AVCodecContext *avctx, uint8_t **surface);
>>> +
>>> +    /**
>>> +     * Called to free the HW surface that was allocated with 
>>> alloc_surface().
>>> +     *
>>> +     * @param avctx the codec context
>>> +     * @param surface the HW accelerator surface
>>> +     * @return zero if successful, a negative value otherwise
>>> +     */
>>> +    void (*free_surface)(AVCodecContext *avctx, uint8_t *surface);
>>>  } AVHWAccel;
>> 
>> iam not in favor of these. What are these good for?
>> Why are they needed?
>
> This is used to allocate the HW surfaces (VdpSurface, VASurface, etc.) from 
> within FFmpeg. i.e. the AVFrame.data[3] part, hence the uint8_t * instead of 
> the void *.
>
>>> +/** Identifies the hardware accelerator */
>>> +enum HWAccelID {
>>> +    HWACCEL_ID_NONE,
>>> +    HWACCEL_ID_VAAPI,           ///< Video Acceleration (VA) API
>>> +    HWACCEL_ID_NB
>>> +};
>> 
>> this needs a any or auto for autodetection (which should be 0)
>
> I finally forgot about autodetection because it's too complex to handle at 
> the FFmpeg level and delegated that to the player level. In particular, 
> HWAccel context may depend on upper level info, like an X display...
>
>>> +
>>> +/** Identifies the hardware accelerator entry-point */
>>> +enum HWAccelEntrypoint {
>>> +    HWACCEL_ENTRYPOINT_VLD = 1, ///< Variable-length decoding
>>> +    HWACCEL_ENTRYPOINT_IDCT,    ///< Inverse discrete cosine transform
>>> +    HWACCEL_ENTRYPOINT_MOCO,    ///< Motion compensation
>>> +    HWACCEL_ENTRYPOINT_NB
>>> +};
>> 
>> as said previously this is ambigous
>> 
>> HWACCEL_ENTRYPOINT_VLD could mean the hw does just VLD and leaves IDCT/MC
>> to software
>
> Actually, I didn't find the exact meaning. But from a pipeline point of view, 
> this would mean XXX and above. i.e. VLD and above, motion compensation and 
> above. Flagging those would lead to more player work (well, just OR'ing more 
> flags).
>
> I tried to express that in the comment.
>
>>> +/**
>>> + * The hardware accelerator can fetch the pixels from the decoded
>>> + * frames. If the user requested it, avcodec_default_get_buffer()
>>> + * will then allocate the data buffers.
>>> + */
>>> +#define HWACCEL_CAP_GET_PIXELS 0x00000001
>> 
>> might need a AV prefix
>
> OK.
>
> Regards,
> Gwenole.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ffmpeg.hwaccel.v2.7.patch
Type: text/x-diff
Size: 11437 bytes
Desc: 
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20101024/372225aa/attachment.patch>



More information about the ffmpeg-devel mailing list