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.
---
Not-quite-as-long name is not-quite-as-long.
Do we want an explicit way to disable the autodetection and let the user set
the quirks field? Currently it works for the user to just overwrite it after
calling av_hwdevice_ctx_init().
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 1bdc4cb..b0567f5 100644
--- a/libavutil/hwcontext_vaapi.c
+++ b/libavutil/hwcontext_vaapi.c
@@ -263,12 +263,25 @@ fail:
return err;
}
+static const 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_PARAM_BUFFERS,
+ },
+};
+
static int vaapi_device_init(AVHWDeviceContext *hwdev)
{
VAAPIDeviceContext *ctx = hwdev->internal->priv;
AVVAAPIDeviceContext *hwctx = hwdev->hwctx;
VAImageFormat *image_list = NULL;
VAStatus vas;
+ const char *vendor_string;
int err, i, image_count;
enum AVPixelFormat pix_fmt;
unsigned int fourcc;
@@ -310,6 +323,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);
return 0;
fail:
diff --git a/libavutil/hwcontext_vaapi.h b/libavutil/hwcontext_vaapi.h
index 1c87f5d..43181ff 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_PARAM_BUFFERS = (1 << 0),
+};
+
/**
* 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