From: Waldo Bastian Date: Fri, 7 Dec 2007 00:04:09 +0000 (-0800) Subject: Update to VA API 0.28 X-Git-Tag: phase2-20081110~18 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f8ccff8acbf7579ded1902789695a1023334a3fe;p=platform%2Fupstream%2Flibva.git Update to VA API 0.28 --- diff --git a/configure.ac b/configure.ac index eac1988..b203f39 100644 --- a/configure.ac +++ b/configure.ac @@ -21,7 +21,7 @@ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. AC_PREREQ(2.57) -AC_INIT([libva], 0.26, [waldo.bastian@intel.com], libva) +AC_INIT([libva], 0.28, [waldo.bastian@intel.com], libva) AC_CONFIG_SRCDIR([Makefile.am]) AM_INIT_AUTOMAKE([dist-bzip2]) diff --git a/debian/files b/debian/files index 2b0673f..bbaff89 100644 --- a/debian/files +++ b/debian/files @@ -1,2 +1,2 @@ -libva-dev_0.20-1_i386.deb libdevel extra -libva1_0.20-1_i386.deb libs extra +libva-dev_0.24-1_i386.deb libdevel extra +libva1_0.24-1_i386.deb libs extra diff --git a/dummy_drv_video/dummy_drv_video.c b/dummy_drv_video/dummy_drv_video.c index 7cf1a50..04e9e37 100644 --- a/dummy_drv_video/dummy_drv_video.c +++ b/dummy_drv_video/dummy_drv_video.c @@ -451,6 +451,18 @@ VAStatus dummy_CreateImage( return VA_STATUS_SUCCESS; } +VAStatus dummy_DeriveImage( + VADriverContextP ctx, + VASurfaceID surface, + VAImage *image /* out */ +) +{ + INIT_DRIVER_DATA + + /* TODO */ + return VA_STATUS_SUCCESS; +} + VAStatus dummy_DestroyImage( VADriverContextP ctx, VAImageID image @@ -508,6 +520,26 @@ VAStatus dummy_PutImage( return VA_STATUS_SUCCESS; } +VAStatus dummy_PutImage2( + VADriverContextP ctx, + VASurfaceID surface, + VAImageID image, + int src_x, + int src_y, + unsigned int src_width, + unsigned int src_height, + int dest_x, + int dest_y, + unsigned int dest_width, + unsigned int dest_height +) +{ + INIT_DRIVER_DATA + + /* TODO */ + return VA_STATUS_SUCCESS; +} + VAStatus dummy_QuerySubpictureFormats( VADriverContextP ctx, VAImageFormat *format_list, /* out */ @@ -623,6 +655,32 @@ VAStatus dummy_AssociateSubpicture( return VA_STATUS_SUCCESS; } +VAStatus dummy_AssociateSubpicture2( + VADriverContextP ctx, + VASubpictureID subpicture, + VASurfaceID *target_surfaces, + int num_surfaces, + short src_x, /* upper left offset in subpicture */ + short src_y, + unsigned short src_width, + unsigned short src_height, + short dest_x, /* upper left offset in surface */ + short dest_y, + unsigned short dest_width, + unsigned short dest_height, + /* + * whether to enable chroma-keying or global-alpha + * see VA_SUBPICTURE_XXX values + */ + unsigned int flags +) +{ + INIT_DRIVER_DATA + + /* TODO */ + return VA_STATUS_SUCCESS; +} + VAStatus dummy_DeassociateSubpicture( VADriverContextP ctx, VASubpictureID subpicture, @@ -1141,7 +1199,7 @@ VAStatus dummy_Terminate( VADriverContextP ctx ) return VA_STATUS_SUCCESS; } -VAStatus __vaDriverInit_0_26( VADriverContextP ctx ) +VAStatus __vaDriverInit_0_28( VADriverContextP ctx ) { object_base_p obj; int result; @@ -1149,7 +1207,7 @@ VAStatus __vaDriverInit_0_26( VADriverContextP ctx ) int i; ctx->version_major = 0; - ctx->version_minor = 26; + ctx->version_minor = 28; ctx->max_profiles = DUMMY_MAX_PROFILES; ctx->max_entrypoints = DUMMY_MAX_ENTRYPOINTS; ctx->max_attributes = DUMMY_MAX_CONFIG_ATTRIBUTES; @@ -1183,10 +1241,12 @@ VAStatus __vaDriverInit_0_26( VADriverContextP ctx ) ctx->vtable.vaPutSurface = dummy_PutSurface; ctx->vtable.vaQueryImageFormats = dummy_QueryImageFormats; ctx->vtable.vaCreateImage = dummy_CreateImage; + ctx->vtable.vaDeriveImage = dummy_DeriveImage; ctx->vtable.vaDestroyImage = dummy_DestroyImage; ctx->vtable.vaSetImagePalette = dummy_SetImagePalette; ctx->vtable.vaGetImage = dummy_GetImage; ctx->vtable.vaPutImage = dummy_PutImage; + ctx->vtable.vaPutImage2 = dummy_PutImage2; ctx->vtable.vaQuerySubpictureFormats = dummy_QuerySubpictureFormats; ctx->vtable.vaCreateSubpicture = dummy_CreateSubpicture; ctx->vtable.vaDestroySubpicture = dummy_DestroySubpicture; @@ -1195,6 +1255,7 @@ VAStatus __vaDriverInit_0_26( VADriverContextP ctx ) ctx->vtable.vaSetSubpictureChromakey = dummy_SetSubpictureChromakey; ctx->vtable.vaSetSubpictureGlobalAlpha = dummy_SetSubpictureGlobalAlpha; ctx->vtable.vaAssociateSubpicture = dummy_AssociateSubpicture; + ctx->vtable.vaAssociateSubpicture2 = dummy_AssociateSubpicture2; ctx->vtable.vaDeassociateSubpicture = dummy_DeassociateSubpicture; ctx->vtable.vaQueryDisplayAttributes = dummy_QueryDisplayAttributes; ctx->vtable.vaGetDisplayAttributes = dummy_GetDisplayAttributes; diff --git a/dummy_drv_video/dummy_drv_video.h b/dummy_drv_video/dummy_drv_video.h index d1920ab..3ebd60b 100644 --- a/dummy_drv_video/dummy_drv_video.h +++ b/dummy_drv_video/dummy_drv_video.h @@ -34,7 +34,7 @@ #define DUMMY_MAX_IMAGE_FORMATS 10 #define DUMMY_MAX_SUBPIC_FORMATS 4 #define DUMMY_MAX_DISPLAY_ATTRIBUTES 4 -#define DUMMY_STR_VENDOR "Dummy-dummy-1.0-dummy" +#define DUMMY_STR_VENDOR "Dummy Driver 1.0" struct dummy_driver_data { struct object_heap config_heap; diff --git a/src/Makefile.am b/src/Makefile.am index 1eed0c6..35876c6 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -22,7 +22,7 @@ libva_la_LTLIBRARIES = libva.la libva_ladir = $(libdir) -libva_la_LDFLAGS = -version-number 0:26:0 -no-undefined +libva_la_LDFLAGS = -version-number 0:28:0 -no-undefined libva_la_LIBADD = -ldl -lX11 -lXext libva_la_SOURCES = va_dri.c va.c va_dristr.h diff --git a/src/va.c b/src/va.c index 5681a6e..5c824c5 100644 --- a/src/va.c +++ b/src/va.c @@ -35,8 +35,8 @@ #include "va_dri.h" #define VA_MAJOR_VERSION 0 -#define VA_MINOR_VERSION 26 -#define DRIVER_INIT_FUNC "__vaDriverInit_0_26" +#define VA_MINOR_VERSION 28 +#define DRIVER_INIT_FUNC "__vaDriverInit_0_28" #define DEFAULT_DRIVER_DIR "/usr/X11R6/lib/modules/dri" #define DRIVER_EXTENSION "_drv_video.so" @@ -211,7 +211,7 @@ static VAStatus va_getDriverName(VADriverContextP ctx, char **driver_name) static VAStatus va_openDriver(VADriverContextP ctx, char *driver_name) { VAStatus vaStatus = VA_STATUS_ERROR_UNKNOWN; - char *search_path; + char *search_path = NULL; char *saveptr; char *driver_dir; @@ -299,10 +299,12 @@ static VAStatus va_openDriver(VADriverContextP ctx, char *driver_name) CHECK_VTABLE(vaStatus, ctx, PutSurface); CHECK_VTABLE(vaStatus, ctx, QueryImageFormats); CHECK_VTABLE(vaStatus, ctx, CreateImage); + CHECK_VTABLE(vaStatus, ctx, DeriveImage); CHECK_VTABLE(vaStatus, ctx, DestroyImage); CHECK_VTABLE(vaStatus, ctx, SetImagePalette); CHECK_VTABLE(vaStatus, ctx, GetImage); CHECK_VTABLE(vaStatus, ctx, PutImage); + CHECK_VTABLE(vaStatus, ctx, PutImage2); CHECK_VTABLE(vaStatus, ctx, QuerySubpictureFormats); CHECK_VTABLE(vaStatus, ctx, CreateSubpicture); CHECK_VTABLE(vaStatus, ctx, DestroySubpicture); @@ -311,6 +313,7 @@ static VAStatus va_openDriver(VADriverContextP ctx, char *driver_name) CHECK_VTABLE(vaStatus, ctx, SetSubpictureChromakey); CHECK_VTABLE(vaStatus, ctx, SetSubpictureGlobalAlpha); CHECK_VTABLE(vaStatus, ctx, AssociateSubpicture); + CHECK_VTABLE(vaStatus, ctx, AssociateSubpicture2); CHECK_VTABLE(vaStatus, ctx, DeassociateSubpicture); CHECK_VTABLE(vaStatus, ctx, QueryDisplayAttributes); CHECK_VTABLE(vaStatus, ctx, GetDisplayAttributes); @@ -340,6 +343,18 @@ static VAStatus va_openDriver(VADriverContextP ctx, char *driver_name) return vaStatus; } +VAPrivFunc vaGetLibFunc(VADisplay dpy, const char *func) +{ + VADriverContextP ctx = CTX(dpy); + if( !vaContextIsValid(ctx) ) + return NULL; + + if (NULL == ctx->handle) + return NULL; + + return (VAPrivFunc) dlsym(ctx->handle, func); +} + /* * Returns a short english description of error_status @@ -942,6 +957,76 @@ VAStatus vaPutImage ( return ctx->vtable.vaPutImage ( ctx, surface, image, src_x, src_y, width, height, dest_x, dest_y ); } +/* + * Similar to vaPutImage but with additional destination width + * and height arguments to enable scaling + */ +VAStatus vaPutImage2 ( + VADisplay dpy, + VASurfaceID surface, + VAImageID image, + int src_x, + int src_y, + unsigned int src_width, + unsigned int src_height, + int dest_x, + int dest_y, + unsigned int dest_width, + unsigned int dest_height +) +{ + VADriverContextP ctx = CTX(dpy); + CHECK_CONTEXT(ctx); + + TRACE(vaPutImage2); + return ctx->vtable.vaPutImage2 ( ctx, surface, image, src_x, src_y, src_width, src_height, dest_x, dest_y, dest_width, dest_height ); +} + +/* + * Derive an VAImage from an existing surface. + * This interface will derive a VAImage and corresponding image buffer from + * an existing VA Surface. The image buffer can then be mapped/unmapped for + * direct CPU access. This operation is only possible on implementations with + * direct rendering capabilities and internal surface formats that can be + * represented with a VAImage. When the operation is not possible this interface + * will return VA_STATUS_ERROR_OPERATION_FAILED. Clients should then fall back + * to using vaCreateImage + vaPutImage to accomplish the same task in an + * indirect manner. + * + * Implementations should only return success when the resulting image buffer + * would be useable with vaMap/Unmap. + * + * When directly accessing a surface special care must be taken to insure + * proper synchronization with the graphics hardware. Clients should call + * vaQuerySurfaceStatus to insure that a surface is not the target of concurrent + * rendering or currently being displayed by an overlay. + * + * Additionally nothing about the contents of a surface should be assumed + * following a vaPutSurface. Implementations are free to modify the surface for + * scaling or subpicture blending within a call to vaPutImage. + * + * Calls to vaPutImage or vaGetImage using the same surface from which the image + * has been derived will return VA_STATUS_ERROR_SURFACE_BUSY. vaPutImage or + * vaGetImage with other surfaces is supported. + * + * An image created with vaDeriveImage should be freed with vaDestroyImage. The + * image and image buffer structures will be destroyed; however, the underlying + * surface will remain unchanged until freed with vaDestroySurfaces. + */ +VAStatus vaDeriveImage ( + VADisplay dpy, + VASurfaceID surface, + VAImage *image /* out */ +) +{ + VADriverContextP ctx = CTX(dpy); + CHECK_CONTEXT(ctx); + + TRACE(vaDeriveImage); + return ctx->vtable.vaDeriveImage ( ctx, surface, image ); +} + + /* Get maximum number of subpicture formats supported by the implementation */ int vaMaxNumSubpictureFormats ( VADisplay dpy @@ -1021,7 +1106,7 @@ VAStatus vaSetSubpictureImage ( return ctx->vtable.vaSetSubpictureImage ( ctx, subpicture, image); } - +#warning TODO: Remove vaSetSubpicturePalette in rev 0.29 VAStatus vaSetSubpicturePalette ( VADisplay dpy, VASubpictureID subpicture, @@ -1110,6 +1195,33 @@ VAStatus vaAssociateSubpicture ( return ctx->vtable.vaAssociateSubpicture ( ctx, subpicture, target_surfaces, num_surfaces, src_x, src_y, dest_x, dest_y, width, height, flags ); } +VAStatus vaAssociateSubpicture2 ( + VADisplay dpy, + VASubpictureID subpicture, + VASurfaceID *target_surfaces, + int num_surfaces, + short src_x, /* upper left offset in subpicture */ + short src_y, + unsigned short src_width, + unsigned short src_height, + short dest_x, /* upper left offset in surface */ + short dest_y, + unsigned short dest_width, + unsigned short dest_height, + /* + * whether to enable chroma-keying or global-alpha + * see VA_SUBPICTURE_XXX values + */ + unsigned int flags +) +{ + VADriverContextP ctx = CTX(dpy); + CHECK_CONTEXT(ctx); + + TRACE(vaAssociateSubpicture2); + return ctx->vtable.vaAssociateSubpicture2 ( ctx, subpicture, target_surfaces, num_surfaces, src_x, src_y, src_width, src_height, dest_x, dest_y, dest_width, dest_height, flags ); +} + /* * vaDeassociateSubpicture removes the association of the subpicture with target_surfaces. */ @@ -1200,7 +1312,7 @@ VAStatus vaSetDisplayAttributes ( } - +#warning TODO: Remove vaDbgCopySurfaceToBuffer in rev 0.29 VAStatus vaDbgCopySurfaceToBuffer(VADisplay dpy, VASurfaceID surface, void **buffer, /* out */ diff --git a/src/va.h b/src/va.h index 49c26bd..d2c9dd2 100755 --- a/src/va.h +++ b/src/va.h @@ -24,7 +24,7 @@ /* * Video Decode Acceleration API Specification * - * Rev. 0.25 + * Rev. 0.28 * * * Revision History: @@ -46,6 +46,9 @@ * rev 0.24 (09/18/2007 Jonathan Bian) - Added display attributes. * rev 0.25 (10/18/2007 Jonathan Bian) - Changed to use IDs only for some types. * rev 0.26 (11/07/2007 Waldo Bastian) - Change vaCreateBuffer semantics + * rev 0.27 (11/19/2007 Matt Sottek) - Added DeriveImage + * rev 0.28 (12/06/2007 Jonathan Bian) - Added new versions of PutImage and AssociateSubpicture + * to enable scaling * * Acknowledgements: * Some concepts borrowed from XvMC and XvImage. @@ -147,15 +150,26 @@ VAStatus vaTerminate ( /* * vaQueryVendorString returns a pointer to a zero-terminated string * describing some aspects of the VA implemenation on a specific - * hardware accelerator. The format of the returned string is: - * --- + * hardware accelerator. The format of the returned string is vendor + * specific and at the discretion of the implementer. * e.g. for the Intel GMA500 implementation, an example would be: - * "IntelGMA500-1.0-0.2-patch3 + * "Intel GMA500 - 2.0.0.32L.0005" */ const char *vaQueryVendorString ( VADisplay dpy ); +typedef int (*VAPrivFunc)(); + +/* + * Return a function pointer given a function name in the library. + * This allows private interfaces into the library + */ +VAPrivFunc vaGetLibFunc ( + VADisplay dpy, + const char *func +); + /* Currently defined profiles */ typedef enum { @@ -906,9 +920,9 @@ typedef struct _VAIQMatrixBufferH264 typedef struct _VASliceParameterBufferH264 { unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */ - unsigned int slice_data_offset;/* the offset to first byte of slice data */ + unsigned int slice_data_offset;/* the offset to the NAL start code for this slice */ unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */ - unsigned short slice_data_bit_offset; /* bit offset in the first byte of valid data */ + unsigned short slice_data_bit_offset; /* bit offset from NAL start code to the beginning of slice data */ unsigned short first_mb_in_slice; unsigned char slice_type; unsigned char direct_spatial_mv_pred_flag; @@ -1079,18 +1093,6 @@ VAStatus vaQuerySurfaceStatus ( VASurfaceStatus *status /* out */ ); - -/* - * Copies the surface to a buffer - * The stride of the surface will be stored in *stride - * Caller should free the returned buffer with free() when done. - */ -VAStatus vaDbgCopySurfaceToBuffer(VADisplay dpy, - VASurfaceID surface, - void **buffer, /* out */ - unsigned int *stride /* out */ -); - /* * Images and Subpictures * VAImage is used to either get the surface data to client memory, or @@ -1252,6 +1254,63 @@ VAStatus vaPutImage ( int dest_y ); + /* + * Similar to vaPutImage but with additional destination width + * and height arguments to enable scaling + */ +VAStatus vaPutImage2 ( + VADisplay dpy, + VASurfaceID surface, + VAImageID image, + int src_x, + int src_y, + unsigned int src_width, + unsigned int src_height, + int dest_x, + int dest_y, + unsigned int dest_width, + unsigned int dest_height +); + +/* + * Derive an VAImage from an existing surface. + * This interface will derive a VAImage and corresponding image buffer from + * an existing VA Surface. The image buffer can then be mapped/unmapped for + * direct CPU access. This operation is only possible on implementations with + * direct rendering capabilities and internal surface formats that can be + * represented with a VAImage. When the operation is not possible this interface + * will return VA_STATUS_ERROR_OPERATION_FAILED. Clients should then fall back + * to using vaCreateImage + vaPutImage to accomplish the same task in an + * indirect manner. + * + * Implementations should only return success when the resulting image buffer + * would be useable with vaMap/Unmap. + * + * When directly accessing a surface special care must be taken to insure + * proper synchronization with the graphics hardware. Clients should call + * vaQuerySurfaceStatus to insure that a surface is not the target of concurrent + * rendering or currently being displayed by an overlay. + * + * Additionally nothing about the contents of a surface should be assumed + * following a vaPutSurface. Implementations are free to modify the surface for + * scaling or subpicture blending within a call to vaPutImage. + * + * Calls to vaPutImage or vaGetImage using the same surface from which the image + * has been derived will return VA_STATUS_ERROR_SURFACE_BUSY. vaPutImage or + * vaGetImage with other surfaces is supported. + * + * An image created with vaDeriveImage should be freed with vaDestroyImage. The + * image and image buffer structures will be destroyed; however, the underlying + * surface will remain unchanged until freed with vaDestroySurfaces. + */ +VAStatus vaDeriveImage ( + VADisplay dpy, + VASurfaceID surface, + VAImage *image /* out */ +); + + + /* * Subpictures * Subpicture is a special type of image that can be blended @@ -1313,17 +1372,6 @@ VAStatus vaSetSubpictureImage ( VAImageID image ); -VAStatus vaSetSubpicturePalette ( - VADisplay dpy, - VASubpictureID subpicture, - /* - * pointer to an array holding the palette data. The size of the array is - * num_palette_entries * entry_bytes in size. The order of the components - * in the palette is described by the component_order in VAImage struct - */ - unsigned char *palette -); - /* * If chromakey is enabled, then the area where the source value falls within * the chromakey [min, max] range is transparent @@ -1378,6 +1426,30 @@ VAStatus vaAssociateSubpicture ( ); /* + * Similar to vaAssociateSubpicture but with additional destination width + * and height to enable scaling + */ +VAStatus vaAssociateSubpicture2 ( + VADisplay dpy, + VASubpictureID subpicture, + VASurfaceID *target_surfaces, + int num_surfaces, + short src_x, /* upper left offset in subpicture */ + short src_y, + unsigned short src_width, + unsigned short src_height, + short dest_x, /* upper left offset in surface */ + short dest_y, + unsigned short dest_width, + unsigned short dest_height, + /* + * whether to enable chroma-keying or global-alpha + * see VA_SUBPICTURE_XXX values + */ + unsigned int flags +); + +/* * vaDeassociateSubpicture removes the association of the subpicture with target_surfaces. */ VAStatus vaDeassociateSubpicture ( @@ -1501,8 +1573,8 @@ Mostly to demonstrate program flow with no error handling ... int max_num_profiles, max_num_entrypoints, max_num_attribs; max_num_profiles = vaMaxNumProfiles(dpy); - max_num_entrypoints = vaMaxNumProfiles(dpy); - max_num_attribs = vaMaxNumProfiles(dpy); + max_num_entrypoints = vaMaxNumEntrypoints(dpy); + max_num_attribs = vaMaxNumAttributes(dpy); /* find out whether MPEG2 MP is supported */ VAProfile *profiles = malloc(sizeof(VAProfile)*max_num_profiles); diff --git a/src/va_backend.h b/src/va_backend.h index 9304088..45aee4a 100755 --- a/src/va_backend.h +++ b/src/va_backend.h @@ -209,6 +209,12 @@ struct VADriverVTable VAImage *image /* out */ ); + VAStatus (*vaDeriveImage) ( + VADriverContextP ctx, + VASurfaceID surface, + VAImage *image /* out */ + ); + VAStatus (*vaDestroyImage) ( VADriverContextP ctx, VAImageID image @@ -247,6 +253,20 @@ struct VADriverVTable int dest_y ); + VAStatus (*vaPutImage2) ( + VADriverContextP ctx, + VASurfaceID surface, + VAImageID image, + int src_x, + int src_y, + unsigned int src_width, + unsigned int src_height, + int dest_x, + int dest_y, + unsigned int dest_width, + unsigned int dest_height + ); + VAStatus (*vaQuerySubpictureFormats) ( VADriverContextP ctx, VAImageFormat *format_list, /* out */ @@ -314,6 +334,26 @@ struct VADriverVTable unsigned int flags ); + VAStatus (*vaAssociateSubpicture2) ( + VADriverContextP ctx, + VASubpictureID subpicture, + VASurfaceID *target_surfaces, + int num_surfaces, + short src_x, /* upper left offset in subpicture */ + short src_y, + unsigned short src_width, + unsigned short src_height, + short dest_x, /* upper left offset in surface */ + short dest_y, + unsigned short dest_width, + unsigned short dest_height, + /* + * whether to enable chroma-keying or global-alpha + * see VA_SUBPICTURE_XXX values + */ + unsigned int flags + ); + VAStatus (*vaDeassociateSubpicture) ( VADriverContextP ctx, VASubpictureID subpicture, diff --git a/src/va_x11.h b/src/va_x11.h index fdb91ba..a316162 100755 --- a/src/va_x11.h +++ b/src/va_x11.h @@ -33,9 +33,9 @@ extern "C" { */ /* de-interlace flags for vaPutSurface */ +#define VA_FRAME_PICTURE 0x00000000 #define VA_TOP_FIELD 0x00000001 #define VA_BOTTOM_FIELD 0x00000002 -#define VA_FRAME_PICTURE 0x00000004 /* weave */ /* * clears the drawable with background color. * for hardware overlay based implementation this flag diff --git a/test/vainfo.c b/test/vainfo.c index a793e14..cd0d979 100644 --- a/test/vainfo.c +++ b/test/vainfo.c @@ -28,7 +28,7 @@ #include #include #include - +#include int main(int argc, const char* argv[]) { @@ -64,8 +64,9 @@ int main(int argc, const char* argv[]) { fprintf(stderr, "%s: vaInitialize failed with error code %d (%s)\n", name, va_status, vaErrorStr(va_status)); + return 3; } - printf("%s: VA API version: %d.%d\n", name, major_version, minor_version); + driver = vaQueryVendorString(va_dpy); printf("%s: Driver version: %s\n", name, driver ? driver : ""); vaTerminate(va_dpy);