The driver being used is detected inside av_hwdevice_ctx_init(), and the quirks field then set from a table of known drivers.
Also adds the Intel i965 driver quirk (it does not destroy parameter buffers used in a call to vaRenderPicture()) and detects that driver to set it. --- Another approach... Moving the quirks into the device properties will allow us to fix the broken behaviour in the decode hwaccel as well, once the hwdevice is available there (<https://git.libav.org/?p=libav.git;a=blob;f=libavcodec/vaapi.c#l184>). I am getting a suitable AMD card (i.e. something with non-i965 VAAPI) next week to test this; I won't commit anything before trying that. libavutil/hwcontext_vaapi.c | 34 ++++++++++++++++++++++++++++++++++ libavutil/hwcontext_vaapi.h | 15 +++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/libavutil/hwcontext_vaapi.c b/libavutil/hwcontext_vaapi.c index 4563e14..642763f 100644 --- a/libavutil/hwcontext_vaapi.c +++ b/libavutil/hwcontext_vaapi.c @@ -281,6 +281,18 @@ fail: return err; } +static struct { + const char *friendly_name; + const char *match_string; + unsigned int quirks; +} vaapi_driver_quirks_table[] = { + { + "Intel i965 (Quick Sync)", + "i965", + AV_VAAPI_DRIVER_QUIRK_RENDER_DOES_NOT_DESTROY_PARAM_BUFFERS, + }, +}; + static int vaapi_device_init(AVHWDeviceContext *hwdev) { VAAPIDeviceContext *ctx = hwdev->internal->priv; @@ -288,6 +300,7 @@ static int vaapi_device_init(AVHWDeviceContext *hwdev) AVHWFramesConstraints *constraints = NULL; VAImageFormat *image_list = NULL; VAStatus vas; + const char *vendor_string; int err, i, j, image_count; enum AVPixelFormat pix_fmt; unsigned int fourcc; @@ -340,6 +353,27 @@ static int vaapi_device_init(AVHWDeviceContext *hwdev) } } + // Detect the driver in use and set quirk flags if necessary. + vendor_string = vaQueryVendorString(hwctx->display); + hwctx->driver_quirks = 0; + if (vendor_string) { + for (i = 0; i < FF_ARRAY_ELEMS(vaapi_driver_quirks_table); i++) { + if (strstr(vendor_string, + vaapi_driver_quirks_table[i].match_string)) { + av_log(hwdev, AV_LOG_VERBOSE, "Matched \"%s\" as known driver " + "\"%s\".\n", vendor_string, + vaapi_driver_quirks_table[i].friendly_name); + hwctx->driver_quirks |= + vaapi_driver_quirks_table[i].quirks; + break; + } + } + if (!(i < FF_ARRAY_ELEMS(vaapi_driver_quirks_table))) { + av_log(hwdev, AV_LOG_VERBOSE, "Unknown driver \"%s\", assuming " + "standard behaviour.\n", vendor_string); + } + } + av_free(image_list); av_hwframe_constraints_free(&constraints); return 0; diff --git a/libavutil/hwcontext_vaapi.h b/libavutil/hwcontext_vaapi.h index 1c87f5d..fc0b56e 100644 --- a/libavutil/hwcontext_vaapi.h +++ b/libavutil/hwcontext_vaapi.h @@ -33,6 +33,15 @@ * with the data pointer set to a VASurfaceID. */ +enum { + /** + * The driver does not destroy parameter buffers when they are used by + * vaRenderPicture(). Additional code will be required to destroy them + * separately afterwards. + */ + AV_VAAPI_DRIVER_QUIRK_RENDER_DOES_NOT_DESTROY_PARAM_BUFFERS = 0x01, +}; + /** * VAAPI connection details. * @@ -43,6 +52,12 @@ typedef struct AVVAAPIDeviceContext { * The VADisplay handle, to be filled by the user. */ VADisplay display; + /** + * Driver quirks to apply - this is filled by av_hwdevice_ctx_init(), + * with reference to a table of known drivers. The user may need to + * refer to this when performing any related operations using VAAPI. + */ + unsigned int driver_quirks; } AVVAAPIDeviceContext; /** -- 2.8.1 _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
