From patchwork Mon Oct 28 01:37:26 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Forest Crossman X-Patchwork-Id: 15998 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id B0B7E44A8A2 for ; Mon, 28 Oct 2019 03:43:17 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6E5C968AC09; Mon, 28 Oct 2019 03:43:17 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f194.google.com (mail-qt1-f194.google.com [209.85.160.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 96B5F68A1BC for ; Mon, 28 Oct 2019 03:43:11 +0200 (EET) Received: by mail-qt1-f194.google.com with SMTP id l3so1851429qtp.2 for ; Sun, 27 Oct 2019 18:43:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=/E862Q5oeGDFtlrVxga6ZX25Y1Av4fJTc3FtmXPIsgY=; b=mSW0kSnOpYULFkvUdCEtNbD0HZqlO3w6q2HOhXjJupTwcF7Lxz8CBCyffuEm8uw3FG OwfaPKopyw93wcVrj4okkNOJyV/HPeEV2baMbZiYAC/0SqoZlhpYaOnFKUNv5Am062Pd oy/ze55Tu8jKOc2xripaFzZQMvl2XO/+RyCNTNKlnQIPYCdo+NM+KxtdxGFa/ai/w7v6 wD9JnMeMoMeC8iKn9H7grB+N2NhzqB/+LrgqrdJqlZCoFOgqbC7OMttAQHDO3kK+2LcJ Gu14ECVWr6fmzEH/+Y4eewGR+/4Mgu0C2jI7FAXiLoK3ZPT607OwWeWspaGGa4rFfk4c AHUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=/E862Q5oeGDFtlrVxga6ZX25Y1Av4fJTc3FtmXPIsgY=; b=ZFPKI+jG/SVWw+soL5Ph1f1z60xFzO72Ni105L2ANQ39IX8Tbd5zKWBRDfeAiI3GLY QeEv0ojHTvFq6Jfkz73cSYTqWZyvdhjTK0yUj9dz6+jIdFmhXrl3y1o7G+ASHqEFQ61f TKmcjmpMOaMbnYDcHJD4nOrVATtEUmLN5Td9ciCDJUR4JNsFWqHJnoJROMs/NJa/QMsq 089l0snDDQJ3QP28axa1KxoDR/ryKt550O9trVnD0PK+KXFKVdrXR8SCgRU+zeB9XoAY Roq1kcKRS5edjsw0wcdgKNMa6DknbihE9iArArTcosbNBQdELPWViIoTxDT3nWCXW+9u 80Qg== X-Gm-Message-State: APjAAAXcMl16W9GjwmIJ0I+ow7BuJorNV+cODf2rHWxlOnmXCqSyCxaQ gu0cBPwAiFmpNoUH+bsuQUv7CQLypJc= X-Google-Smtp-Source: APXvYqwAQaFEITTioXe3daNyaj+vsREpaSZVMrpBo+UU44Mgd4MQiGTioFutD2qhVr6QvlQsievc2Q== X-Received: by 2002:a37:6f06:: with SMTP id k6mr13524174qkc.141.1572226657844; Sun, 27 Oct 2019 18:37:37 -0700 (PDT) Received: from localhost.localdomain ([194.59.251.37]) by smtp.gmail.com with ESMTPSA id c15sm5212556qkc.101.2019.10.27.18.37.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 27 Oct 2019 18:37:37 -0700 (PDT) From: Forest Crossman To: ffmpeg-devel@ffmpeg.org Date: Sun, 27 Oct 2019 20:37:26 -0500 Message-Id: X-Mailer: git-send-email 2.23.0 In-Reply-To: References: <20191020095533.15016-1-cyrozap@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 1/5] libdc1394: Enable listing sources X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Forest Crossman Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" 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 --- 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 +#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, };