[FFmpeg-devel] [PATCH 2/3] avfilter/vf_hwmap: get the AVHWDeviceType from outlink format

Tong Wu tong1.wu at intel.com
Wed Jun 29 09:32:45 EEST 2022


When a derive_device_type is not specified, the hwmap filter should be
able to retrieve AVHWDeviceType from outlink->format and create
corresponding hwdevice context.

Signed-off-by: Tong Wu <tong1.wu at intel.com>
---
 libavfilter/vf_hwmap.c | 26 +++++++++++++++++---------
 1 file changed, 17 insertions(+), 9 deletions(-)

diff --git a/libavfilter/vf_hwmap.c b/libavfilter/vf_hwmap.c
index 2e03dfc1fe..a0c2e134cf 100644
--- a/libavfilter/vf_hwmap.c
+++ b/libavfilter/vf_hwmap.c
@@ -72,26 +72,34 @@ static int hwmap_config_output(AVFilterLink *outlink)
     if (inlink->hw_frames_ctx) {
         hwfc = (AVHWFramesContext*)inlink->hw_frames_ctx->data;
 
-        if (ctx->derive_device_type) {
-            enum AVHWDeviceType type;
+        enum AVHWDeviceType type;
 
+        if (ctx->derive_device_type) {
             type = av_hwdevice_find_type_by_name(ctx->derive_device_type);
             if (type == AV_HWDEVICE_TYPE_NONE) {
                 av_log(avctx, AV_LOG_ERROR, "Invalid device type.\n");
                 err = AVERROR(EINVAL);
                 goto fail;
             }
-
-            err = av_hwdevice_ctx_create_derived(&device, type,
-                                                 hwfc->device_ref, 0);
-            if (err < 0) {
-                av_log(avctx, AV_LOG_ERROR, "Failed to created derived "
-                       "device context: %d.\n", err);
+        } else {
+            type = av_hwdevice_get_type_by_pix_fmt(outlink->format);
+            if (type == AV_HWDEVICE_TYPE_NONE) {
+                av_log(avctx, AV_LOG_ERROR, "Could not get device type from "
+                       "format %s.\n", av_get_pix_fmt_name(outlink->format));
+                err = AVERROR(EINVAL);
                 goto fail;
             }
-            device_is_derived = 1;
         }
 
+        err = av_hwdevice_ctx_create_derived(&device, type,
+                                             hwfc->device_ref, 0);
+        if (err < 0) {
+            av_log(avctx, AV_LOG_ERROR, "Failed to created derived "
+                   "device context: %d.\n", err);
+            goto fail;
+        }
+        device_is_derived = 1;
+
         desc = av_pix_fmt_desc_get(outlink->format);
         if (!desc) {
             err = AVERROR(EINVAL);
-- 
2.35.1.windows.2



More information about the ffmpeg-devel mailing list