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

Reply via email to