From patchwork Sun Oct 20 09:55:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Forest Crossman X-Patchwork-Id: 15857 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 9904B44859F for ; Sun, 20 Oct 2019 12:55:59 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 745E868ADBA; Sun, 20 Oct 2019 12:55:59 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oi1-f196.google.com (mail-oi1-f196.google.com [209.85.167.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5E16568A3AF for ; Sun, 20 Oct 2019 12:55:52 +0300 (EEST) Received: by mail-oi1-f196.google.com with SMTP id i16so8715302oie.4 for ; Sun, 20 Oct 2019 02:55:52 -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=CrICvsLBNhRc/J9S7srerlzrAbofPE0cKkUmyCTDmYEDsgvkOxXOCcxFMmgD5LGvJt /St5ahA2oVudID2ayazlDLCwrtnxU5XyOlIt36N0ApuCN5tQO1TkTQvSm1t1ByA3bW/N SJW0zlxGp/3/YHzLR1jmaCnh2wbkc5JH5WZQ6AG//hotKdwaKIURL9rtWZmlvl4cRJQN vh+FYXl92wSBaxG234zwI7Z+dtxQB5cDqOfkjKZk6gRvQR1CeQdEqBGgB9AWyWCsWpxV WbfVq+fF8UC1LMzZ8fkULyEPcK/3eEDeA+80jO6Rl2P/iO7JaYjxFv59xU2+BZ19bLaX 8aPQ== 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=KRHkTCaGrgKKO7hYz0nuqW6uPOhHA1+pM5uVBsZgduOuiuNV18wiaHItXJRgatxYEK lQfPeN1EJejLSpSYB3sfcR3T28C1vsnKLPsyZRBOxsLQ8ygR3OVk9MtmoZXM3Brxfcfy eH+p0qye0Ah5E7Gq8AFsUm67KWFr8BCC/f2Kwp7Hkxpkj1OxD/b45PSQgaPorlWznpbk z/2Ls6Z9ZPiloQqD1oVond5MxmEP1dX9mRZIqtLwrz6mVwAx0qrJLvxpQzuQ6MEesw9H fLPrfB7G7I0QtbcSx7bgM20fwGmLf5lotAB73vEYgEOaz4iEQKY0bYHmsQPKPMw57Vyn Qjfg== X-Gm-Message-State: APjAAAWjUmZWmFjwbzLdN8sJZiInCdEr4HUkKBuqNUGA1h0A5eRNPVYs Pj7RpiZxjC35Ui9ay0ZGOCk4/gtt X-Google-Smtp-Source: APXvYqyWAF+BBqBpNULP2myOKDHSxDb1De3zhvph9ivfeEgMkBhqBacNYSt63L8+/WqPquU8+6EjoQ== X-Received: by 2002:aca:37c2:: with SMTP id e185mr14872300oia.98.1571565350663; Sun, 20 Oct 2019 02:55:50 -0700 (PDT) Received: from localhost.localdomain (ip-137-232-239-173.texas.us.northamericancoax.com. [173.239.232.137]) by smtp.gmail.com with ESMTPSA id 60sm3247187oto.27.2019.10.20.02.55.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 20 Oct 2019 02:55:50 -0700 (PDT) From: Forest Crossman To: ffmpeg-devel@ffmpeg.org Date: Sun, 20 Oct 2019 04:55:29 -0500 Message-Id: <20191020095533.15016-2-cyrozap@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191020095533.15016-1-cyrozap@gmail.com> References: <20191020095533.15016-1-cyrozap@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 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, };