This previously returned ENOMEM because the failure was detected during
av_hwdevice_ctx_alloc(), which is not helpful.  Check earlier in order to
return the correct ENOSYS instead.
---
Before:

$ ./ffmpeg_g -init_hw_device vaapi=d0:/dev/dri/renderD128 -init_hw_device 
dxva2=d1@d0
...
Device creation failed: -12.
Failed to set value 'dxva2=d1@d0' for option 'init_hw_device': Cannot allocate 
memory
Error parsing global options: Cannot allocate memory

After:

$ ./ffmpeg_g -init_hw_device vaapi=d0:/dev/dri/renderD128 -init_hw_device 
dxva2=d1@d0
Device creation failed: -38.
Failed to set value 'dxva2=d1@d0' for option 'init_hw_device': Function not 
implemented
Error parsing global options: Function not implemented


 libavutil/hwcontext.c | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/libavutil/hwcontext.c b/libavutil/hwcontext.c
index d13d0f7c9b..4a307369c4 100644
--- a/libavutil/hwcontext.c
+++ b/libavutil/hwcontext.c
@@ -139,19 +139,22 @@ static void hwdevice_ctx_free(void *opaque, uint8_t *data)
     av_freep(&ctx);
 }

+static const HWContextType *hwcontext_find_type(enum AVHWDeviceType type)
+{
+    for (int i = 0; hw_table[i]; i++) {
+        if (hw_table[i]->type == type)
+            return hw_table[i];
+    }
+    return NULL;
+}
+
 AVBufferRef *av_hwdevice_ctx_alloc(enum AVHWDeviceType type)
 {
     AVHWDeviceContext *ctx;
     AVBufferRef *buf;
-    const HWContextType *hw_type = NULL;
-    int i;
+    const HWContextType *hw_type;

-    for (i = 0; hw_table[i]; i++) {
-        if (hw_table[i]->type == type) {
-            hw_type = hw_table[i];
-            break;
-        }
-    }
+    hw_type = hwcontext_find_type(type);
     if (!hw_type)
         return NULL;

@@ -652,6 +655,11 @@ int av_hwdevice_ctx_create_derived_opts(AVBufferRef 
**dst_ref_ptr,
     AVHWDeviceContext *dst_ctx, *tmp_ctx;
     int ret = 0;

+    if (!hwcontext_find_type(type)) {
+        // The type we want to derive is not supported in this build.
+        return AVERROR(ENOSYS);
+    }
+
     tmp_ref = src_ref;
     while (tmp_ref) {
         tmp_ctx = (AVHWDeviceContext*)tmp_ref->data;
--
2.29.2
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to