#define CHECK_DISPLAY(dpy) if( !vaDisplayIsValid(dpy) ) { return VA_STATUS_ERROR_INVALID_DISPLAY; }
#define ASSERT assert
-#define CHECK_VTABLE(s, ctx, func) if (!va_checkVtable(ctx->vtable.va##func, #func)) s = VA_STATUS_ERROR_UNKNOWN;
+#define CHECK_VTABLE(s, ctx, func) if (!va_checkVtable(ctx->vtable->va##func, #func)) s = VA_STATUS_ERROR_UNKNOWN;
#define CHECK_MAXIMUM(s, ctx, var) if (!va_checkMaximum(ctx->max_##var, #var)) s = VA_STATUS_ERROR_UNKNOWN;
#define CHECK_STRING(s, ctx, var) if (!va_checkString(ctx->str_##var, #var)) s = VA_STATUS_ERROR_UNKNOWN;
}
else
{
- vaStatus = (*init_func)(ctx);
+ struct VADriverVTable *vtable = ctx->vtable;
+
+ vaStatus = VA_STATUS_SUCCESS;
+ if (!vtable) {
+ vtable = calloc(1, sizeof(*vtable));
+ if (!vtable)
+ vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
+ }
+ ctx->vtable = vtable;
+
+ if (VA_STATUS_SUCCESS == vaStatus)
+ vaStatus = (*init_func)(ctx);
if (VA_STATUS_SUCCESS == vaStatus)
{
old_ctx = CTX(dpy);
if (old_ctx->handle) {
- vaStatus = old_ctx->vtable.vaTerminate(old_ctx);
+ vaStatus = old_ctx->vtable->vaTerminate(old_ctx);
dlclose(old_ctx->handle);
old_ctx->handle = NULL;
}
+ free(old_ctx->vtable);
+ old_ctx->vtable = NULL;
if (VA_STATUS_SUCCESS == vaStatus)
pDisplayContext->vaDestroy(pDisplayContext);
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaQueryConfigEntrypoints ( ctx, profile, entrypoints, num_entrypoints);
+ return ctx->vtable->vaQueryConfigEntrypoints ( ctx, profile, entrypoints, num_entrypoints);
}
VAStatus vaGetConfigAttributes (
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaGetConfigAttributes ( ctx, profile, entrypoint, attrib_list, num_attribs );
+ return ctx->vtable->vaGetConfigAttributes ( ctx, profile, entrypoint, attrib_list, num_attribs );
}
VAStatus vaQueryConfigProfiles (
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaQueryConfigProfiles ( ctx, profile_list, num_profiles );
+ return ctx->vtable->vaQueryConfigProfiles ( ctx, profile_list, num_profiles );
}
VAStatus vaCreateConfig (
VA_FOOL(va_FoolCreateConfig, dpy, profile, entrypoint, attrib_list, num_attribs, config_id);
- vaStatus = ctx->vtable.vaCreateConfig ( ctx, profile, entrypoint, attrib_list, num_attribs, config_id );
+ vaStatus = ctx->vtable->vaCreateConfig ( ctx, profile, entrypoint, attrib_list, num_attribs, config_id );
VA_TRACE(va_TraceCreateConfig, dpy, profile, entrypoint, attrib_list, num_attribs, config_id);
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaDestroyConfig ( ctx, config_id );
+ return ctx->vtable->vaDestroyConfig ( ctx, config_id );
}
VAStatus vaQueryConfigAttributes (
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaQueryConfigAttributes( ctx, config_id, profile, entrypoint, attrib_list, num_attribs);
+ return ctx->vtable->vaQueryConfigAttributes( ctx, config_id, profile, entrypoint, attrib_list, num_attribs);
}
VAStatus vaCreateSurfaces (
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- vaStatus = ctx->vtable.vaCreateSurfaces( ctx, width, height, format, num_surfaces, surfaces );
+ vaStatus = ctx->vtable->vaCreateSurfaces( ctx, width, height, format, num_surfaces, surfaces );
VA_TRACE(va_TraceCreateSurface, dpy, width, height, format, num_surfaces, surfaces);
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaDestroySurfaces( ctx, surface_list, num_surfaces );
+ return ctx->vtable->vaDestroySurfaces( ctx, surface_list, num_surfaces );
}
VAStatus vaCreateContext (
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- vaStatus = ctx->vtable.vaCreateContext( ctx, config_id, picture_width, picture_height,
+ vaStatus = ctx->vtable->vaCreateContext( ctx, config_id, picture_width, picture_height,
flag, render_targets, num_render_targets, context );
VA_TRACE(va_TraceCreateContext, dpy, config_id, picture_width, picture_height, flag, render_targets, num_render_targets, context);
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaDestroyContext( ctx, context );
+ return ctx->vtable->vaDestroyContext( ctx, context );
}
VAStatus vaCreateBuffer (
if (ret)
return VA_STATUS_SUCCESS;
- return ctx->vtable.vaCreateBuffer( ctx, context, type, size, num_elements, data, buf_id);
+ return ctx->vtable->vaCreateBuffer( ctx, context, type, size, num_elements, data, buf_id);
}
VAStatus vaBufferSetNumElements (
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaBufferSetNumElements( ctx, buf_id, num_elements );
+ return ctx->vtable->vaBufferSetNumElements( ctx, buf_id, num_elements );
}
if (ret)
return VA_STATUS_SUCCESS;
- va_status = ctx->vtable.vaMapBuffer( ctx, buf_id, pbuf );
+ va_status = ctx->vtable->vaMapBuffer( ctx, buf_id, pbuf );
if (va_status == VA_STATUS_SUCCESS)
VA_TRACE(va_TraceMapBuffer, dpy, buf_id, pbuf);
if (ret)
return VA_STATUS_SUCCESS;
- return ctx->vtable.vaUnmapBuffer( ctx, buf_id );
+ return ctx->vtable->vaUnmapBuffer( ctx, buf_id );
}
VAStatus vaDestroyBuffer (
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaDestroyBuffer( ctx, buffer_id );
+ return ctx->vtable->vaDestroyBuffer( ctx, buffer_id );
}
VAStatus vaBufferInfo (
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaBufferInfo( ctx, context, buf_id, type, size, num_elements );
+ return ctx->vtable->vaBufferInfo( ctx, context, buf_id, type, size, num_elements );
}
VAStatus vaBeginPicture (
if (ret)
return VA_STATUS_SUCCESS;
- return ctx->vtable.vaBeginPicture( ctx, context, render_target );
+ return ctx->vtable->vaBeginPicture( ctx, context, render_target );
}
VAStatus vaRenderPicture (
VA_TRACE(va_TraceRenderPicture, dpy, context, buffers, num_buffers);
- return ctx->vtable.vaRenderPicture( ctx, context, buffers, num_buffers );
+ return ctx->vtable->vaRenderPicture( ctx, context, buffers, num_buffers );
}
VAStatus vaEndPicture (
return VA_STATUS_SUCCESS;
}
- va_status = ctx->vtable.vaEndPicture( ctx, context );
+ va_status = ctx->vtable->vaEndPicture( ctx, context );
VA_TRACE(va_TraceEndPicture, dpy, context);
if (ret)
return VA_STATUS_SUCCESS;
- va_status = ctx->vtable.vaSyncSurface( ctx, render_target );
+ va_status = ctx->vtable->vaSyncSurface( ctx, render_target );
VA_TRACE(va_TraceSyncSurface, dpy, render_target);
return va_status;
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- va_status = ctx->vtable.vaQuerySurfaceStatus( ctx, render_target, status );
+ va_status = ctx->vtable->vaQuerySurfaceStatus( ctx, render_target, status );
VA_TRACE(va_TraceQuerySurfaceStatus, dpy, render_target, status);
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- va_status = ctx->vtable.vaQuerySurfaceError( ctx, surface, error_status, error_info );
+ va_status = ctx->vtable->vaQuerySurfaceError( ctx, surface, error_status, error_info );
VA_TRACE(va_TraceQuerySurfaceError, dpy, surface, error_status, error_info);
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaQueryImageFormats ( ctx, format_list, num_formats);
+ return ctx->vtable->vaQueryImageFormats ( ctx, format_list, num_formats);
}
/*
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaCreateImage ( ctx, format, width, height, image);
+ return ctx->vtable->vaCreateImage ( ctx, format, width, height, image);
}
/*
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaDestroyImage ( ctx, image);
+ return ctx->vtable->vaDestroyImage ( ctx, image);
}
VAStatus vaSetImagePalette (
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaSetImagePalette ( ctx, image, palette);
+ return ctx->vtable->vaSetImagePalette ( ctx, image, palette);
}
/*
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaGetImage ( ctx, surface, x, y, width, height, image);
+ return ctx->vtable->vaGetImage ( ctx, surface, x, y, width, height, image);
}
/*
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaPutImage ( ctx, surface, image, src_x, src_y, src_width, src_height, dest_x, dest_y, dest_width, dest_height );
+ return ctx->vtable->vaPutImage ( ctx, surface, image, src_x, src_y, src_width, src_height, dest_x, dest_y, dest_width, dest_height );
}
/*
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaDeriveImage ( ctx, surface, image );
+ return ctx->vtable->vaDeriveImage ( ctx, surface, image );
}
if (ret)
return VA_STATUS_SUCCESS;
- return ctx->vtable.vaQuerySubpictureFormats ( ctx, format_list, flags, num_formats);
+ return ctx->vtable->vaQuerySubpictureFormats ( ctx, format_list, flags, num_formats);
}
/*
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaCreateSubpicture ( ctx, image, subpicture );
+ return ctx->vtable->vaCreateSubpicture ( ctx, image, subpicture );
}
/*
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaDestroySubpicture ( ctx, subpicture);
+ return ctx->vtable->vaDestroySubpicture ( ctx, subpicture);
}
VAStatus vaSetSubpictureImage (
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaSetSubpictureImage ( ctx, subpicture, image);
+ return ctx->vtable->vaSetSubpictureImage ( ctx, subpicture, image);
}
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaSetSubpictureChromakey ( ctx, subpicture, chromakey_min, chromakey_max, chromakey_mask );
+ return ctx->vtable->vaSetSubpictureChromakey ( ctx, subpicture, chromakey_min, chromakey_max, chromakey_mask );
}
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaSetSubpictureGlobalAlpha ( ctx, subpicture, global_alpha );
+ return ctx->vtable->vaSetSubpictureGlobalAlpha ( ctx, subpicture, global_alpha );
}
/*
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaAssociateSubpicture ( ctx, subpicture, target_surfaces, num_surfaces, src_x, src_y, src_width, src_height, dest_x, dest_y, dest_width, dest_height, flags );
+ return ctx->vtable->vaAssociateSubpicture ( ctx, subpicture, target_surfaces, num_surfaces, src_x, src_y, src_width, src_height, dest_x, dest_y, dest_width, dest_height, flags );
}
/*
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaDeassociateSubpicture ( ctx, subpicture, target_surfaces, num_surfaces );
+ return ctx->vtable->vaDeassociateSubpicture ( ctx, subpicture, target_surfaces, num_surfaces );
}
VAStatus va_status;
- va_status = ctx->vtable.vaQueryDisplayAttributes ( ctx, attr_list, num_attributes );
+ va_status = ctx->vtable->vaQueryDisplayAttributes ( ctx, attr_list, num_attributes );
VA_TRACE(va_TraceQueryDisplayAttributes, dpy, attr_list, num_attributes);
VAStatus va_status;
- va_status = ctx->vtable.vaGetDisplayAttributes ( ctx, attr_list, num_attributes );
+ va_status = ctx->vtable->vaGetDisplayAttributes ( ctx, attr_list, num_attributes );
VA_TRACE(va_TraceGetDisplayAttributes, dpy, attr_list, num_attributes);
VA_TRACE(va_TraceSetDisplayAttributes, dpy, attr_list, num_attributes);
- return ctx->vtable.vaSetDisplayAttributes ( ctx, attr_list, num_attributes );
+ return ctx->vtable->vaSetDisplayAttributes ( ctx, attr_list, num_attributes );
}
VAStatus vaLockSurface(VADisplay dpy,
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaLockSurface( ctx, surface, fourcc, luma_stride, chroma_u_stride, chroma_v_stride, luma_offset, chroma_u_offset, chroma_v_offset, buffer_name, buffer);
+ return ctx->vtable->vaLockSurface( ctx, surface, fourcc, luma_stride, chroma_u_stride, chroma_v_stride, luma_offset, chroma_u_offset, chroma_v_offset, buffer_name, buffer);
}
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
- return ctx->vtable.vaUnlockSurface( ctx, surface );
+ return ctx->vtable->vaUnlockSurface( ctx, surface );
}