summaryrefslogtreecommitdiff
path: root/libavutil
diff options
context:
space:
mode:
Diffstat (limited to 'libavutil')
-rw-r--r--libavutil/hwcontext.c16
-rw-r--r--libavutil/hwcontext.h20
-rw-r--r--libavutil/hwcontext_cuda.c2
-rw-r--r--libavutil/hwcontext_internal.h3
-rw-r--r--libavutil/hwcontext_opencl.c12
-rw-r--r--libavutil/hwcontext_qsv.c3
-rw-r--r--libavutil/hwcontext_vaapi.c3
-rw-r--r--libavutil/hwcontext_vulkan.c9
-rw-r--r--libavutil/version.h2
9 files changed, 52 insertions, 18 deletions
diff --git a/libavutil/hwcontext.c b/libavutil/hwcontext.c
index 8cc91d9a28..d13d0f7c9b 100644
--- a/libavutil/hwcontext.c
+++ b/libavutil/hwcontext.c
@@ -643,9 +643,10 @@ fail:
return ret;
}
-int av_hwdevice_ctx_create_derived(AVBufferRef **dst_ref_ptr,
- enum AVHWDeviceType type,
- AVBufferRef *src_ref, int flags)
+int av_hwdevice_ctx_create_derived_opts(AVBufferRef **dst_ref_ptr,
+ enum AVHWDeviceType type,
+ AVBufferRef *src_ref,
+ AVDictionary *options, int flags)
{
AVBufferRef *dst_ref = NULL, *tmp_ref;
AVHWDeviceContext *dst_ctx, *tmp_ctx;
@@ -678,6 +679,7 @@ int av_hwdevice_ctx_create_derived(AVBufferRef **dst_ref_ptr,
if (dst_ctx->internal->hw_type->device_derive) {
ret = dst_ctx->internal->hw_type->device_derive(dst_ctx,
tmp_ctx,
+ options,
flags);
if (ret == 0) {
dst_ctx->internal->source_device = av_buffer_ref(src_ref);
@@ -709,6 +711,14 @@ fail:
return ret;
}
+int av_hwdevice_ctx_create_derived(AVBufferRef **dst_ref_ptr,
+ enum AVHWDeviceType type,
+ AVBufferRef *src_ref, int flags)
+{
+ return av_hwdevice_ctx_create_derived_opts(dst_ref_ptr, type, src_ref,
+ NULL, flags);
+}
+
static void ff_hwframe_unmap(void *opaque, uint8_t *data)
{
HWMapDescriptor *hwmap = (HWMapDescriptor*)data;
diff --git a/libavutil/hwcontext.h b/libavutil/hwcontext.h
index f874af9f8f..04d19d89c2 100644
--- a/libavutil/hwcontext.h
+++ b/libavutil/hwcontext.h
@@ -328,6 +328,26 @@ int av_hwdevice_ctx_create_derived(AVBufferRef **dst_ctx,
enum AVHWDeviceType type,
AVBufferRef *src_ctx, int flags);
+/**
+ * Create a new device of the specified type from an existing device.
+ *
+ * This function performs the same action as av_hwdevice_ctx_create_derived,
+ * however, it is able to set options for the new device to be derived.
+ *
+ * @param dst_ctx On success, a reference to the newly-created
+ * AVHWDeviceContext.
+ * @param type The type of the new device to create.
+ * @param src_ctx A reference to an existing AVHWDeviceContext which will be
+ * used to create the new device.
+ * @param options Options for the new device to create, same format as in
+ * av_hwdevice_ctx_create.
+ * @param flags Currently unused; should be set to zero.
+ * @return Zero on success, a negative AVERROR code on failure.
+ */
+int av_hwdevice_ctx_create_derived_opts(AVBufferRef **dst_ctx,
+ enum AVHWDeviceType type,
+ AVBufferRef *src_ctx,
+ AVDictionary *options, int flags);
/**
* Allocate an AVHWFramesContext tied to a given device context.
diff --git a/libavutil/hwcontext_cuda.c b/libavutil/hwcontext_cuda.c
index 58d128a280..718a449b6e 100644
--- a/libavutil/hwcontext_cuda.c
+++ b/libavutil/hwcontext_cuda.c
@@ -395,7 +395,7 @@ error:
}
static int cuda_device_derive(AVHWDeviceContext *device_ctx,
- AVHWDeviceContext *src_ctx,
+ AVHWDeviceContext *src_ctx, AVDictionary *opts,
int flags) {
AVCUDADeviceContext *hwctx = device_ctx->hwctx;
CudaFunctions *cu;
diff --git a/libavutil/hwcontext_internal.h b/libavutil/hwcontext_internal.h
index dba0f39944..e6266494ac 100644
--- a/libavutil/hwcontext_internal.h
+++ b/libavutil/hwcontext_internal.h
@@ -67,7 +67,8 @@ typedef struct HWContextType {
int (*device_create)(AVHWDeviceContext *ctx, const char *device,
AVDictionary *opts, int flags);
int (*device_derive)(AVHWDeviceContext *dst_ctx,
- AVHWDeviceContext *src_ctx, int flags);
+ AVHWDeviceContext *src_ctx,
+ AVDictionary *opts, int flags);
int (*device_init)(AVHWDeviceContext *ctx);
void (*device_uninit)(AVHWDeviceContext *ctx);
diff --git a/libavutil/hwcontext_opencl.c b/libavutil/hwcontext_opencl.c
index 41fdfe96f1..cd8638abbb 100644
--- a/libavutil/hwcontext_opencl.c
+++ b/libavutil/hwcontext_opencl.c
@@ -1194,7 +1194,7 @@ static int opencl_filter_drm_arm_device(AVHWDeviceContext *hwdev,
#endif
static int opencl_device_derive(AVHWDeviceContext *hwdev,
- AVHWDeviceContext *src_ctx,
+ AVHWDeviceContext *src_ctx, AVDictionary *opts,
int flags)
{
int err;
@@ -1207,16 +1207,16 @@ static int opencl_device_derive(AVHWDeviceContext *hwdev,
// Surface mapping works via DRM PRIME fds with no special
// initialisation required in advance. This just finds the
// Beignet ICD by name.
- AVDictionary *opts = NULL;
+ AVDictionary *selector_opts = NULL;
- err = av_dict_set(&opts, "platform_vendor", "Intel", 0);
+ err = av_dict_set(&selector_opts, "platform_vendor", "Intel", 0);
if (err >= 0)
- err = av_dict_set(&opts, "platform_version", "beignet", 0);
+ err = av_dict_set(&selector_opts, "platform_version", "beignet", 0);
if (err >= 0) {
OpenCLDeviceSelector selector = {
.platform_index = -1,
.device_index = 0,
- .context = opts,
+ .context = selector_opts,
.enumerate_platforms = &opencl_enumerate_platforms,
.filter_platform = &opencl_filter_platform,
.enumerate_devices = &opencl_enumerate_devices,
@@ -1224,7 +1224,7 @@ static int opencl_device_derive(AVHWDeviceContext *hwdev,
};
err = opencl_device_create_internal(hwdev, &selector, NULL);
}
- av_dict_free(&opts);
+ av_dict_free(&selector_opts);
}
break;
#endif
diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c
index 40794558fb..35a944f8f8 100644
--- a/libavutil/hwcontext_qsv.c
+++ b/libavutil/hwcontext_qsv.c
@@ -1213,7 +1213,8 @@ fail:
}
static int qsv_device_derive(AVHWDeviceContext *ctx,
- AVHWDeviceContext *child_device_ctx, int flags)
+ AVHWDeviceContext *child_device_ctx,
+ AVDictionary *opts, int flags)
{
return qsv_device_derive_from_child(ctx, MFX_IMPL_HARDWARE_ANY,
child_device_ctx, flags);
diff --git a/libavutil/hwcontext_vaapi.c b/libavutil/hwcontext_vaapi.c
index b306965b4a..5c4f5de04e 100644
--- a/libavutil/hwcontext_vaapi.c
+++ b/libavutil/hwcontext_vaapi.c
@@ -1624,7 +1624,8 @@ static int vaapi_device_create(AVHWDeviceContext *ctx, const char *device,
}
static int vaapi_device_derive(AVHWDeviceContext *ctx,
- AVHWDeviceContext *src_ctx, int flags)
+ AVHWDeviceContext *src_ctx,
+ AVDictionary *opts, int flags)
{
#if HAVE_VAAPI_DRM
if (src_ctx->type == AV_HWDEVICE_TYPE_DRM) {
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index 262089f5da..b40974dce4 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -950,7 +950,8 @@ static int vulkan_device_create(AVHWDeviceContext *ctx, const char *device,
}
static int vulkan_device_derive(AVHWDeviceContext *ctx,
- AVHWDeviceContext *src_ctx, int flags)
+ AVHWDeviceContext *src_ctx,
+ AVDictionary *opts, int flags)
{
av_unused VulkanDeviceSelection dev_select = { 0 };
@@ -974,7 +975,7 @@ static int vulkan_device_derive(AVHWDeviceContext *ctx,
if (strstr(vendor, "AMD"))
dev_select.vendor_id = 0x1002;
- return vulkan_device_create_internal(ctx, &dev_select, NULL, flags);
+ return vulkan_device_create_internal(ctx, &dev_select, opts, flags);
}
#endif
case AV_HWDEVICE_TYPE_DRM: {
@@ -992,7 +993,7 @@ static int vulkan_device_derive(AVHWDeviceContext *ctx,
drmFreeDevice(&drm_dev_info);
- return vulkan_device_create_internal(ctx, &dev_select, NULL, flags);
+ return vulkan_device_create_internal(ctx, &dev_select, opts, flags);
}
#endif
#if CONFIG_CUDA
@@ -1011,7 +1012,7 @@ static int vulkan_device_derive(AVHWDeviceContext *ctx,
dev_select.has_uuid = 1;
- return vulkan_device_create_internal(ctx, &dev_select, NULL, flags);
+ return vulkan_device_create_internal(ctx, &dev_select, opts, flags);
}
#endif
default:
diff --git a/libavutil/version.h b/libavutil/version.h
index f63cd4ba79..5821bcdd0e 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -79,7 +79,7 @@
*/
#define LIBAVUTIL_VERSION_MAJOR 56
-#define LIBAVUTIL_VERSION_MINOR 47
+#define LIBAVUTIL_VERSION_MINOR 48
#define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \