API changes, most recent first:
+2016-xx-xx - xxxxxxx - lavu 55.19.0 - hwcontext_vaapi.h
+ Add driver quirks field to VAAPI-specific hwdevice and enum with
+ members AV_VAAPI_DRIVER_QUIRK_* to represent its values.
+
2016-xx-xx - xxxxxxx - lavu 55.18.0 - pixdesc.h
Add AV_PIX_FMT_P010(LE/BE).
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;
}
}
+ 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:
* 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.
*
* 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;
/**