Signed-off-by: Forest Crossman <cyro...@gmail.com> --- doc/indevs.texi | 3 ++ libavdevice/libdc1394.c | 70 ++++++++++++++++++++++++++++------------- 2 files changed, 51 insertions(+), 22 deletions(-)
diff --git a/doc/indevs.texi b/doc/indevs.texi index 14595774f3..757fac91de 100644 --- a/doc/indevs.texi +++ b/doc/indevs.texi @@ -1068,6 +1068,9 @@ IIDC1394 input device, based on libdc1394 and libraw1394. Requires the configure option @code{--enable-libdc1394}. +Specify the FireWire device GUID to be used as the input file, or "auto" +to choose the first device detected. + @subsection Options @table @option diff --git a/libavdevice/libdc1394.c b/libavdevice/libdc1394.c index 7be1d7b8dd..90252f7c4a 100644 --- a/libavdevice/libdc1394.c +++ b/libavdevice/libdc1394.c @@ -171,6 +171,8 @@ static int dc1394_read_header(AVFormatContext *c) dc1394_data* dc1394 = c->priv_data; dc1394camera_list_t *list; int res, i; + uint64_t guid; + uint16_t unit; const struct dc1394_frame_format *fmt = NULL; const struct dc1394_frame_rate *fps = NULL; const struct dc1394_frame_format *tmp_fmt; @@ -186,33 +188,57 @@ static int dc1394_read_header(AVFormatContext *c) /* Now let us prep the hardware. */ dc1394->d = dc1394_new(); - if (dc1394_camera_enumerate(dc1394->d, &list) != DC1394_SUCCESS || !list) { - av_log(c, AV_LOG_ERROR, "Unable to look for an IIDC camera.\n"); - goto out; - } - if (list->num == 0) { - av_log(c, AV_LOG_ERROR, "No cameras found.\n"); - dc1394_camera_free_list(list); - goto out; - } + /* Parse URL */ + if (sscanf(c->url, "0x%"SCNx64":%"SCNu16, &guid, &unit) == 2) { + /* If both the GUID and unit are set, open the device based on + * those values exactly. */ + dc1394->camera = dc1394_camera_new_unit(dc1394->d, guid, unit); + if (!dc1394->camera) { + av_log(c, AV_LOG_ERROR, "Unable to open camera 0x%016"PRIx64":%"PRIu16"\n", + guid, unit); + goto out; + } + } else if (sscanf(c->url, "0x%"SCNx64, &guid) == 1) { + /* If the GUID is set, but not the unit, grab the device using + * the first unit found. */ + dc1394->camera = dc1394_camera_new(dc1394->d, guid); + if (!dc1394->camera) { + av_log(c, AV_LOG_ERROR, "Unable to open camera 0x%016"PRIx64"\n", + guid); + goto out; + } + } else { + /* If no GUID is set, or is set to "auto", use the first camera + * found. */ + if (dc1394_camera_enumerate(dc1394->d, &list) != DC1394_SUCCESS || !list) { + av_log(c, AV_LOG_ERROR, "Unable to look for an IIDC camera.\n"); + goto out; + } - /* FIXME: To select a specific camera I need to search in list its guid */ - dc1394->camera = dc1394_camera_new (dc1394->d, list->ids[0].guid); + if (list->num == 0) { + av_log(c, AV_LOG_ERROR, "No cameras found.\n"); + dc1394_camera_free_list(list); + goto out; + } - if (!dc1394->camera) { - av_log(c, AV_LOG_ERROR, "Unable to open camera with guid 0x%"PRIx64"\n", - list->ids[0].guid); - dc1394_camera_free_list(list); - goto out; - } + if (list->num > 1) { + av_log(c, AV_LOG_INFO, "Multiple cameras detected, using the first camera found.\n"); + } - if (list->num > 1) { - av_log(c, AV_LOG_INFO, "Working with the first camera found\n"); - } + guid = list->ids[0].guid; + unit = list->ids[0].unit; + dc1394->camera = dc1394_camera_new_unit(dc1394->d, guid, unit); - /* Freeing list of cameras */ - dc1394_camera_free_list (list); + /* Freeing list of cameras */ + dc1394_camera_free_list (list); + + if (!dc1394->camera) { + av_log(c, AV_LOG_ERROR, "Unable to open camera 0x%016"PRIx64":%"PRIu16"\n", + guid, unit); + goto out; + } + } /* Select MAX Speed possible from the cam */ if (dc1394->camera->bmode_capable>0) { -- 2.23.0 _______________________________________________ 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".