Ticket #643: 10-vaapi_dynamic_load.patch

File 10-vaapi_dynamic_load.patch, 7.5 KB (added by Gabi Julien, 15 years ago)

VAAPI dynamic loading patch

  • configure

     
    28582858done
    28592859
    28602860check_lib math.h sin -lm && LIBM="-lm"
    2861 enabled vaapi && require vaapi va/va.h vaInitialize -lva
     2861enabled vaapi && check_header va/va.h
    28622862
    28632863check_mathfunc exp2
    28642864check_mathfunc exp2f
  • libavcodec/vaapi.c

     
    2929 * @{
    3030 */
    3131
    32 static void destroy_buffers(VADisplay display, VABufferID *buffers, unsigned int n_buffers)
     32static void destroy_buffers(struct vaapi_context *vactx, VADisplay display, VABufferID *buffers, unsigned int n_buffers)
    3333{
    3434    unsigned int i;
     35
     36    if (!vactx->va_destroy_buffer_function)
     37        return;
     38
    3539    for (i = 0; i < n_buffers; i++) {
    3640        if (buffers[i]) {
    37             vaDestroyBuffer(display, buffers[i]);
     41            vactx->va_destroy_buffer_function(display, buffers[i]);
    3842            buffers[i] = 0;
    3943        }
    4044    }
     
    4549    VABufferID va_buffers[3];
    4650    unsigned int n_va_buffers = 0;
    4751
    48     vaUnmapBuffer(vactx->display, vactx->pic_param_buf_id);
     52    if (!vactx->va_unmap_buffer_function)
     53        return -1;
     54
     55    vactx->va_unmap_buffer_function(vactx->display, vactx->pic_param_buf_id);
    4956    va_buffers[n_va_buffers++] = vactx->pic_param_buf_id;
    5057
    5158    if (vactx->iq_matrix_buf_id) {
    52         vaUnmapBuffer(vactx->display, vactx->iq_matrix_buf_id);
     59        vactx->va_unmap_buffer_function(vactx->display, vactx->iq_matrix_buf_id);
    5360        va_buffers[n_va_buffers++] = vactx->iq_matrix_buf_id;
    5461    }
    5562
    5663    if (vactx->bitplane_buf_id) {
    57         vaUnmapBuffer(vactx->display, vactx->bitplane_buf_id);
     64        vactx->va_unmap_buffer_function(vactx->display, vactx->bitplane_buf_id);
    5865        va_buffers[n_va_buffers++] = vactx->bitplane_buf_id;
    5966    }
    6067
    61     if (vaBeginPicture(vactx->display, vactx->context_id,
     68    if (vactx->va_begin_picture_function && vactx->va_begin_picture_function(vactx->display, vactx->context_id,
    6269                       surface) != VA_STATUS_SUCCESS)
    6370        return -1;
    6471
    65     if (vaRenderPicture(vactx->display, vactx->context_id,
     72    if (vactx->va_render_picture_function && vactx->va_render_picture_function(vactx->display, vactx->context_id,
    6673                        va_buffers, n_va_buffers) != VA_STATUS_SUCCESS)
    6774        return -1;
    6875
    69     if (vaRenderPicture(vactx->display, vactx->context_id,
     76    if (vactx->va_render_picture_function && vactx->va_render_picture_function(vactx->display, vactx->context_id,
    7077                        vactx->slice_buf_ids,
    7178                        vactx->n_slice_buf_ids) != VA_STATUS_SUCCESS)
    7279        return -1;
    7380
    74     if (vaEndPicture(vactx->display, vactx->context_id) != VA_STATUS_SUCCESS)
     81    if (vactx->va_end_picture_function && vactx->va_end_picture_function(vactx->display, vactx->context_id) != VA_STATUS_SUCCESS)
    7582        return -1;
    7683
    7784    return 0;
     
    8592    if (vactx->slice_count == 0)
    8693        return 0;
    8794
     95    if (!vactx->va_create_buffer_function)
     96        return -1;
     97
    8898    slice_buf_ids =
    8999        av_fast_realloc(vactx->slice_buf_ids,
    90100                        &vactx->slice_buf_ids_alloc,
     
    94104    vactx->slice_buf_ids = slice_buf_ids;
    95105
    96106    slice_param_buf_id = 0;
    97     if (vaCreateBuffer(vactx->display, vactx->context_id,
     107    if (vactx->va_create_buffer_function(vactx->display, vactx->context_id,
    98108                       VASliceParameterBufferType,
    99109                       vactx->slice_param_size,
    100110                       vactx->slice_count, vactx->slice_params,
     
    103113    vactx->slice_count = 0;
    104114
    105115    slice_data_buf_id = 0;
    106     if (vaCreateBuffer(vactx->display, vactx->context_id,
     116    if (vactx->va_create_buffer_function(vactx->display, vactx->context_id,
    107117                       VASliceDataBufferType,
    108118                       vactx->slice_data_size,
    109119                       1, (void *)vactx->slice_data,
     
    121131{
    122132    void *data = NULL;
    123133
     134    if (!vactx->va_map_buffer_function || !vactx->va_create_buffer_function)
     135        return NULL;
     136
    124137    *buf_id = 0;
    125     if (vaCreateBuffer(vactx->display, vactx->context_id,
     138    if (vactx->va_create_buffer_function(vactx->display, vactx->context_id,
    126139                       type, size, 1, NULL, buf_id) == VA_STATUS_SUCCESS)
    127         vaMapBuffer(vactx->display, *buf_id, &data);
     140        vactx->va_map_buffer_function(vactx->display, *buf_id, &data);
    128141
    129142    return data;
    130143}
     
    192205    ret = 0;
    193206
    194207done:
    195     destroy_buffers(vactx->display, &vactx->pic_param_buf_id, 1);
    196     destroy_buffers(vactx->display, &vactx->iq_matrix_buf_id, 1);
    197     destroy_buffers(vactx->display, &vactx->bitplane_buf_id, 1);
    198     destroy_buffers(vactx->display, vactx->slice_buf_ids, vactx->n_slice_buf_ids);
     208    destroy_buffers(vactx, vactx->display, &vactx->pic_param_buf_id, 1);
     209    destroy_buffers(vactx, vactx->display, &vactx->iq_matrix_buf_id, 1);
     210    destroy_buffers(vactx, vactx->display, &vactx->bitplane_buf_id, 1);
     211    destroy_buffers(vactx, vactx->display, vactx->slice_buf_ids, vactx->n_slice_buf_ids);
    199212    av_freep(&vactx->slice_buf_ids);
    200213    av_freep(&vactx->slice_params);
    201214    vactx->n_slice_buf_ids     = 0;
  • libavcodec/vaapi.h

     
    2525#define AVCODEC_VAAPI_H
    2626
    2727#include <stdint.h>
     28#include <va/va.h>
    2829
    2930/**
    3031 * \defgroup VAAPI_Decoding VA API Decoding
     
    6768    uint32_t context_id;
    6869
    6970    /**
     71     * vaCreateBuffer function pointer from the VA-API library
     72     *
     73     * - encoding: unused
     74     * - decoding: Set by user
     75     */
     76    VAStatus (*va_create_buffer_function)(
     77        VADisplay,
     78        VAContextID,
     79        VABufferType,
     80        unsigned int,
     81        unsigned int,
     82        void *,
     83        VABufferID *
     84    );
     85
     86    /**
     87     * vaDestroyBuffer function pointer from the VA-API library
     88     *
     89     * - encoding: unused
     90     * - decoding: Set by user
     91     */
     92    VAStatus (*va_destroy_buffer_function)(
     93        VADisplay,
     94        VABufferID
     95    );
     96
     97    /**
     98     * vaMapBuffer function pointer from the VA-API library
     99     *
     100     * - encoding: unused
     101     * - decoding: Set by user
     102     */
     103    VAStatus (*va_map_buffer_function)(
     104        VADisplay,
     105        VABufferID,
     106        void **
     107    );
     108
     109    /**
     110     * vaUnmapBuffer function pointer from the VA-API library
     111     *
     112     * - encoding: unused
     113     * - decoding: Set by user
     114     */
     115    VAStatus (*va_unmap_buffer_function)(
     116        VADisplay,
     117        VABufferID
     118    );
     119
     120    /**
     121     * vaBeginPicture function pointer from the VA-API library
     122     *
     123     * - encoding: unused
     124     * - decoding: Set by user
     125     */
     126    VAStatus (*va_begin_picture_function)(
     127        VADisplay,
     128        VAContextID,
     129        VASurfaceID
     130    );
     131
     132    /**
     133     * vaRenderPicture function pointer from the VA-API library
     134     *
     135     * - encoding: unused
     136     * - decoding: Set by user
     137     */
     138    VAStatus (*va_render_picture_function)(
     139        VADisplay,
     140        VAContextID,
     141        VABufferID *,
     142        int
     143    );
     144
     145    /**
     146     * vaEndPicture function pointer from the VA-API library
     147     *
     148     * - encoding: unused
     149     * - decoding: Set by user
     150     */
     151    VAStatus (*va_end_picture_function)(
     152        VADisplay,
     153        VAContextID
     154    );
     155
     156    /**
    70157     * VAPictureParameterBuffer ID
    71158     *
    72159     * - encoding: unused