IIDC camera sources can now be listed by using the following command: ffmpeg -sources libdc1394
The basic structure of this function was borrowed from libavdevice/alsa.c:ff_alsa_get_device_list. Signed-off-by: Forest Crossman <cyro...@gmail.com> --- libavdevice/libdc1394.c | 73 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/libavdevice/libdc1394.c b/libavdevice/libdc1394.c index 003335fdd8..ec74cea87a 100644 --- a/libavdevice/libdc1394.c +++ b/libavdevice/libdc1394.c @@ -22,6 +22,8 @@ #include <dc1394/dc1394.h> +#include "avdevice.h" + #include "libavutil/imgutils.h" #include "libavutil/internal.h" #include "libavutil/log.h" @@ -288,6 +290,76 @@ static int dc1394_close(AVFormatContext * context) return 0; } +static int dc1394_get_device_list(AVFormatContext *c, AVDeviceInfoList *device_list) +{ + int ret = 0; + uint32_t i; + dc1394_t *d; + dc1394camera_t *camera; + dc1394camera_list_t *list; + AVDeviceInfo *new_device = NULL; + + d = dc1394_new(); + if (dc1394_camera_enumerate(d, &list) != DC1394_SUCCESS || !list) { + av_log(c, AV_LOG_ERROR, "Unable to look for an IIDC camera.\n"); + ret = -1; + goto out; + } + + device_list->nb_devices = 0; + device_list->default_device = -1; + + if (list->num > 0) { + device_list->default_device = 0; + } + + for (i = 0; i < list->num; i++) { + new_device = av_mallocz(sizeof(AVDeviceInfo)); + if (!new_device) { + ret = AVERROR(ENOMEM); + break; + } + + camera = dc1394_camera_new_unit(d, list->ids[i].guid, list->ids[i].unit); + if (!camera) { + av_log(c, AV_LOG_ERROR, "Unable to open camera 0x%016"PRIx64":%"PRIu16"\n", + list->ids[i].guid, list->ids[i].unit); + ret = -1; + break; + } + + new_device->device_name = av_asprintf("0x%016"PRIx64":%"PRIu16, + list->ids[i].guid, list->ids[i].unit); + new_device->device_description = av_asprintf("%s %s", + camera->vendor, camera->model); + dc1394_camera_free(camera); + + if (!new_device->device_description || !new_device->device_name) { + ret = AVERROR(ENOMEM); + break; + } + + if ((ret = av_dynarray_add_nofree(&device_list->devices, + &device_list->nb_devices, new_device)) < 0) { + break; + } + + new_device = NULL; + } + if (new_device) { + av_free(new_device->device_description); + av_free(new_device->device_name); + av_free(new_device); + } + + /* Freeing list of cameras */ + dc1394_camera_free_list(list); + +out: + dc1394_free(d); + return ret; +} + AVInputFormat ff_libdc1394_demuxer = { .name = "libdc1394", .long_name = NULL_IF_CONFIG_SMALL("dc1394 v.2 A/V grab"), @@ -295,6 +367,7 @@ AVInputFormat ff_libdc1394_demuxer = { .read_header = dc1394_read_header, .read_packet = dc1394_read_packet, .read_close = dc1394_close, + .get_device_list = dc1394_get_device_list, .flags = AVFMT_NOFILE, .priv_class = &libdc1394_class, }; -- 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".