Ticket #643: 10-vaapi_dynamic_load.patch

File 10-vaapi_dynamic_load.patch, 7.5 KB (added by gajul, 5 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