From patchwork Thu Oct 15 21:30:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Forest Crossman X-Patchwork-Id: 22980 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 33BCD44ACD1 for ; Fri, 16 Oct 2020 01:28:10 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 113F868B91C; Fri, 16 Oct 2020 01:28:10 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-yb1-f193.google.com (mail-yb1-f193.google.com [209.85.219.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7640A68ADBA for ; Fri, 16 Oct 2020 01:28:03 +0300 (EEST) Received: by mail-yb1-f193.google.com with SMTP id d15so275818ybl.10 for ; Thu, 15 Oct 2020 15:28:03 -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=iX3s51tKL4GCBfnvy5RoBAOzjf4W3zvdG/zuDrVQrdE=; b=snVsdo/7x5SPJjM2wRdS5w+OE4jKjoCCBKrdOVUzr/H4lVgMBZ9mIX7yJ794qXGKIz 5jFJxBSGqqNtfsqg8w2Cn/lwi2pd2wpdxbG07kWi0nF1pRzwOVcesAdsaYuBNzA7zKNN 8A/2k5n0iWDKI7fNPvgQIBl2E8cij43Qr11UZKWjzkQMFoLd1XENvx05oKEtlOqgGyRx m3fNyefQM/LCekW8kh4pDWl3ibqJdhiUEZBEVf3jaF5EUZSSRZTsBzN9yXrgU7HKzL2F HrDK9FweuBVcj1hiE3tOT+WInObtACKv2gyuidZZYUQ2xV4d+QLeQ4DlB2PiyRBk2GI+ KL9A== 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=iX3s51tKL4GCBfnvy5RoBAOzjf4W3zvdG/zuDrVQrdE=; b=ibyEB65Drw1BgDVMly08iZD6sypWr0uJCMV3wg3ymaJDehRkxzIero1iADSaJvvA8X ZyvShc/NJDxkVFSD3wHCorqWBD5wY9wF/OnGUmEPhoNC15dE0H0w2AbKi1gQPPJwpRrc TMUuPpCRVju9LoZTTFzMMKKeqhZ0YbVmO6F4tGoVrzDbsfCCvpz7j7goiLKbHieD7mVm 8b/qgvI45P++xSPoYzd/VpSCaNVDiwB3ry/vx8t4naU65giMOV8mC6PyNzPdvV+8h7cL m/pag+T1fZEiO2kIBplTzFLdsmpgCrhmf8OsWK7ITAX2pP2JbYylvUldhPFhCYiKoLkQ Djng== X-Gm-Message-State: AOAM530ZVozuSIoa2an6yk1GswLPRc9V6qJ4KLS/0NB2nEE5JQrA0UiX tZPUQi5TD3OAyOWKmfUO5M/7Xdu5Tuo= X-Google-Smtp-Source: ABdhPJxpvpmU4c2gt64pKdSUgusxWk27GbW+wdWijsSnOfn/BYbRPLrjOpncGmJkuAvP9oKF7LTZQA== X-Received: by 2002:a9d:5e90:: with SMTP id f16mr362397otl.266.1602797452246; Thu, 15 Oct 2020 14:30:52 -0700 (PDT) Received: from localhost.localdomain ([170.130.31.90]) by smtp.gmail.com with ESMTPSA id 15sm233248ooy.36.2020.10.15.14.30.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Oct 2020 14:30:51 -0700 (PDT) From: Forest Crossman To: ffmpeg-devel@ffmpeg.org Date: Thu, 15 Oct 2020 16:30:35 -0500 Message-Id: <20201015213039.1019624-2-cyrozap@gmail.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201015213039.1019624-1-cyrozap@gmail.com> References: <20191020095533.15016-1-cyrozap@gmail.com> <20201015213039.1019624-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, };