[FFmpeg-devel] [PATCH v5 05/21] avdevice/dshow: accept show config dialog control message

Diederick Niehorster dcnieho at gmail.com
Wed Mar 30 15:17:50 EEST 2022


DirectShow source will pop up its configuration dialog when
AV_APP_TO_DEV_CONFIG is received. Implementation for several other
possible configuration dialogs is more involved and will be provided in
the next commit.

Signed-off-by: Diederick Niehorster <dcnieho at gmail.com>
---
 libavdevice/dshow.c | 29 ++++++++++++++++++++++++++++-
 1 file changed, 28 insertions(+), 1 deletion(-)

diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c
index 652e093204..78194406b5 100644
--- a/libavdevice/dshow.c
+++ b/libavdevice/dshow.c
@@ -1508,6 +1508,7 @@ static int dshow_control_message(AVFormatContext *avctx, int type, void *data, s
     struct dshow_ctx *ctx = avctx->priv_data;
     int run_state = ctx->is_running;
     HRESULT hr;
+    int ret = 0;
 
     switch (type) {
     case AV_APP_TO_DEV_PAUSE:
@@ -1519,6 +1520,32 @@ static int dshow_control_message(AVFormatContext *avctx, int type, void *data, s
     case AV_APP_TO_DEV_TOGGLE_PAUSE:
         run_state = !run_state;
         break;
+    case AV_APP_TO_DEV_CONFIG: {
+        /* For documentation of dialog variable, see ffmpeg-devices.html in docs */
+        int dialog;
+        enum dshowDeviceType devtype;
+        
+        if (!data)
+            av_log(avctx, AV_LOG_ERROR, "Use the data argument to indicate which dialog should be shown.");
+        dialog = *(int *) data;
+        devtype = (dialog & 1) ? AudioDevice : VideoDevice;
+        
+        if (dialog & 1<<1) {
+            // device_dialog
+            if (ctx->device_filter[devtype])
+                ff_dshow_show_filter_properties(ctx->device_filter[devtype], avctx);
+        } else if (dialog & 1<<2) {
+            // crossbar_connection_dialog
+            // TODO
+        } else if (dialog & 1<<3) {
+            // tv_tuner_dialog
+            // TODO
+        }
+        break;
+    }
+
+    default:
+        ret = AVERROR(ENOSYS);
     }
 
     // if play state change requested, apply
@@ -1539,7 +1566,7 @@ static int dshow_control_message(AVFormatContext *avctx, int type, void *data, s
         ctx->is_running = run_state;
     }
 
-    return 0;
+    return ret;
 }
 
 static enum AVCodecID waveform_codec_id(enum AVSampleFormat sample_fmt)
-- 
2.28.0.windows.1



More information about the ffmpeg-devel mailing list