[FFmpeg-devel] [PATCH] hwcontext: Skip derivation checking for an existing device if options are set

Mark Thompson sw at jkqxz.net
Tue May 3 03:09:17 EEST 2022


If options are set then the user definitely intends to create a new
device, so we shouldn't attempt to return an existing one.
---
  libavutil/hwcontext.c | 26 ++++++++++++++++----------
  1 file changed, 16 insertions(+), 10 deletions(-)

diff --git a/libavutil/hwcontext.c b/libavutil/hwcontext.c
index ab9ad3703e..c4e01e0e78 100644
--- a/libavutil/hwcontext.c
+++ b/libavutil/hwcontext.c
@@ -653,18 +653,24 @@ int av_hwdevice_ctx_create_derived_opts(AVBufferRef **dst_ref_ptr,
      AVHWDeviceContext *dst_ctx, *tmp_ctx;
      int ret = 0;

-    tmp_ref = src_ref;
-    while (tmp_ref) {
-        tmp_ctx = (AVHWDeviceContext*)tmp_ref->data;
-        if (tmp_ctx->type == type) {
-            dst_ref = av_buffer_ref(tmp_ref);
-            if (!dst_ref) {
-                ret = AVERROR(ENOMEM);
-                goto fail;
+    // If we were derived (possibly transitively) from a device of the
+    // target type then we want to return that original device, unless
+    // options are set in which case we can skip this check because it
+    // is definitely intended to create a new device.
+    if (!options) {
+        tmp_ref = src_ref;
+        while (tmp_ref) {
+            tmp_ctx = (AVHWDeviceContext*)tmp_ref->data;
+            if (tmp_ctx->type == type) {
+                dst_ref = av_buffer_ref(tmp_ref);
+                if (!dst_ref) {
+                    ret = AVERROR(ENOMEM);
+                    goto fail;
+                }
+                goto done;
              }
-            goto done;
+            tmp_ref = tmp_ctx->internal->source_device;
          }
-        tmp_ref = tmp_ctx->internal->source_device;
      }

      dst_ref = av_hwdevice_ctx_alloc(type);
-- 
2.35.1


More information about the ffmpeg-devel mailing list