]> git.sesse.net Git - ffmpeg/commitdiff
dshow: support choosing between devices with same name
authorRamiro Polla <ramiro.polla@gmail.com>
Fri, 30 Sep 2011 20:49:09 +0000 (17:49 -0300)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 6 Nov 2011 00:19:56 +0000 (01:19 +0100)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
doc/indevs.texi
libavdevice/dshow.c

index 3aa8f2f8a28c0d8d6059180864ab33703a17d679..90ae29c69ed00baf78ec7b8119c3e8195013b706 100644 (file)
@@ -104,6 +104,14 @@ If set to @option{true}, print a list of devices and exit.
 If set to @option{true}, print a list of selected device's options
 and exit.
 
+@item video_device_number
+Set video device number for devices with same name (starts at 0,
+defaults to 0).
+
+@item audio_device_number
+Set audio device number for devices with same name (starts at 0,
+defaults to 0).
+
 @end table
 
 @subsection Examples
@@ -122,6 +130,12 @@ Open video device @var{Camera}:
 $ ffmpeg -f dshow -i video="Camera"
 @end example
 
+@item
+Open second video device with name @var{Camera}:
+@example
+$ ffmpeg -f dshow -video_device_number 1 -i video="Camera"
+@end example
+
 @item
 Open video device @var{Camera} and audio device @var{Microphone}:
 @example
index ab5f7e97e05f5d89da3bef5a87aa34846b0ca419..a5263df90b9886910e079513227725b108a419ec 100644 (file)
@@ -31,6 +31,8 @@ struct dshow_ctx {
     IGraphBuilder *graph;
 
     char *device_name[2];
+    int video_device_number;
+    int audio_device_number;
 
     int   list_options;
     int   list_devices;
@@ -249,6 +251,8 @@ dshow_cycle_devices(AVFormatContext *avctx, ICreateDevEnum *devenum,
     IEnumMoniker *classenum = NULL;
     IMoniker *m = NULL;
     const char *device_name = ctx->device_name[devtype];
+    int skip = (devtype == VideoDevice) ? ctx->video_device_number
+                                        : ctx->audio_device_number;
     int r;
 
     const GUID *device_guid[2] = { &CLSID_VideoInputDeviceCategory,
@@ -283,6 +287,7 @@ dshow_cycle_devices(AVFormatContext *avctx, ICreateDevEnum *devenum,
             if (strcmp(device_name, buf))
                 goto fail1;
 
+            if (!skip--)
             IMoniker_BindToObject(m, 0, 0, &IID_IBaseFilter, (void *) &device_filter);
         } else {
             av_log(avctx, AV_LOG_INFO, " \"%s\"\n", buf);
@@ -938,6 +943,8 @@ static const AVOption options[] = {
     { "list_options", "list available options for specified device", OFFSET(list_options), AV_OPT_TYPE_INT, {.dbl=0}, 0, 1, DEC, "list_options" },
     { "true", "", 0, AV_OPT_TYPE_CONST, {.dbl=1}, 0, 0, DEC, "list_options" },
     { "false", "", 0, AV_OPT_TYPE_CONST, {.dbl=0}, 0, 0, DEC, "list_options" },
+    { "video_device_number", "set video device number for devices with same name (starts at 0)", OFFSET(video_device_number), AV_OPT_TYPE_INT, {.dbl = 0}, 0, INT_MAX, DEC },
+    { "audio_device_number", "set audio device number for devices with same name (starts at 0)", OFFSET(audio_device_number), AV_OPT_TYPE_INT, {.dbl = 0}, 0, INT_MAX, DEC },
     { NULL },
 };