summaryrefslogtreecommitdiff
path: root/libavutil
diff options
context:
space:
mode:
Diffstat (limited to 'libavutil')
-rw-r--r--libavutil/hwcontext_vaapi.c39
-rw-r--r--libavutil/hwcontext_vaapi.h22
-rw-r--r--libavutil/version.h2
3 files changed, 62 insertions, 1 deletions
diff --git a/libavutil/hwcontext_vaapi.c b/libavutil/hwcontext_vaapi.c
index ee5ce5d075..506545cc28 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,32 @@ static int vaapi_device_init(AVHWDeviceContext *hwdev)
}
}
+ if (hwctx->driver_quirks & AV_VAAPI_DRIVER_QUIRK_USER_SET) {
+ av_log(hwdev, AV_LOG_VERBOSE, "Not detecting driver: "
+ "quirks set by user.\n");
+ } else {
+ // 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 1c87f5db5e..0ac4caa5bb 100644
--- a/libavutil/hwcontext_vaapi.h
+++ b/libavutil/hwcontext_vaapi.h
@@ -33,6 +33,20 @@
* with the data pointer set to a VASurfaceID.
*/
+enum {
+ /**
+ * The quirks field has been set by the user and should not be detected
+ * automatically by av_hwdevice_ctx_init().
+ */
+ AV_VAAPI_DRIVER_QUIRK_USER_SET = (1 << 0),
+ /**
+ * 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 << 1),
+};
+
/**
* VAAPI connection details.
*
@@ -43,6 +57,14 @@ 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, unless the
+ * AV_VAAPI_DRIVER_QUIRK_USER_SET bit is already present. The user
+ * may need to refer to this field when performing any later
+ * operations using VAAPI with the same VADisplay.
+ */
+ unsigned int driver_quirks;
} AVVAAPIDeviceContext;
/**
diff --git a/libavutil/version.h b/libavutil/version.h
index 6cd42a6276..1f38c6378b 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -54,7 +54,7 @@
*/
#define LIBAVUTIL_VERSION_MAJOR 55
-#define LIBAVUTIL_VERSION_MINOR 18
+#define LIBAVUTIL_VERSION_MINOR 19
#define LIBAVUTIL_VERSION_MICRO 0
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \