From patchwork Thu Jun 3 22:45:49 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 28072 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp537830iof; Thu, 3 Jun 2021 15:46:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwbvVSUDyCLemftjrKeopQF/fwTQmFZlnhqr+BaLqBThhn7aoZnCx6dJ4uZoAcENxoLnj3A X-Received: by 2002:a17:906:394e:: with SMTP id g14mr1377042eje.3.1622760401108; Thu, 03 Jun 2021 15:46:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1622760401; cv=none; d=google.com; s=arc-20160816; b=fbNI6k8PtE9A70w5OayNtzEpBKDvTaqmX/3jM2wHcGybOSDW3DGFEmwrhn/6BBH1Vl 94t+OJ8G+tUSSUf4XYlxzRi8+dIKt/ZUvbfRH++uHuoFGiH/rsA8Zda7YKTn5ZsJndF8 KcwaGh7FtEldTNc7nozyEao4RnDOAZESYMnEie2nOTrZmy9hDnKAC/QzQXbiuwGV9nqi gvRdnOm4CRKUOP7OY7KZdPuxX3QSYRxH5yFc8hFnPP3jSLtcMaRgPATJO9krDfXD1GT3 2nOUalX2ojy8mH7GWt7vU9sAX2k/7+vbRpeD+ySQNIvDiQLvlFRtWI3V+p/DiWwUoTrh Ve9g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=9h5LEh02A5QKiIdko5CyhLQ0xipVhXpOIEmNR1JRTIc=; b=TBWqKbIqn7Pp3MrwlwLhaXwqgumYmkQ+hWmRy6tmvI6lgj5qbJ6+zNBrQc3hU1ajG2 tDjdvzytd3AxKTRTECLNZ2+uPe3tL4E4CHm8NBNoMlilivTrjeR1ZMbPL6jr8AHZZp6X YNcV84HlkYIqSPH2uux4BNILnRXJxbUtTudoaLEjWg2rAQKs6H9vf2jF4zzsOJq77SRN d6JUQauWVMLVg5AFH/PvO7KQjRBjrbsjPHCD9zcE3JobedGctPfmBbpvrwbOh1WV+xbX is3DVmhn7gJIbxF81hhD81aub76VxonX5t2doSdrHdCoKLTtCTx+NYSJqUSSbKF8zgig PPSQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=gjwHgJA4; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id mp18si2867557ejc.543.2021.06.03.15.46.40; Thu, 03 Jun 2021 15:46:41 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=gjwHgJA4; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8AE1968A2B3; Fri, 4 Jun 2021 01:46:30 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f46.google.com (mail-lf1-f46.google.com [209.85.167.46]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C9EFB68921B for ; Fri, 4 Jun 2021 01:46:23 +0300 (EEST) Received: by mail-lf1-f46.google.com with SMTP id f30so11225988lfj.1 for ; Thu, 03 Jun 2021 15:46:23 -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=Alnixg7Ry7smcJazqYVdR3Ws88UD/RXxXTCKnlxa1XA=; b=gjwHgJA42iCmA9EX0JnOdyrZmzrmkkbFwDMEHg21/N2H4HqwDk8W0tkX3JSev7hOxM PEr3WKph6ny6KC0dwYTPbw1Sm8plJmDYCHBsoxgoHdYdCekPgulN8NJoBOfR/6iWK34m e0jG30z9I5agkBQDIVCniOg3m+CQhmjlUkSpPifct2hpH4OX0XGWQIt5iw4XRH4Eiqtt 35jcwjh9lxGAyPC+Y8PaT60mlQkJvF7lxhGr7HpXyEJ3YOLCZko0q975T22XH8rSILYH YQEGlA9JLjvV9aeObPnBkab9HbU5OJtS7pFkJucki3EIlEArFvxE1q5tE31AyIJBhVKx cilw== 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=Alnixg7Ry7smcJazqYVdR3Ws88UD/RXxXTCKnlxa1XA=; b=cvzDcAR2dPzGvaVz4UcbAln20Z1w3NN/Sc94xLFbcf1r4mFN4ZaNvg/8lLUdrjHjcn 3I4ezJaFrKSCVRlXwfh/Kluvmee1/WjzdQ+tLLvdSIQcL2R7REfHAYFWYNu89jcVSVhK 4r5vkgizpPGRFI/yqD34MidUWO7N+2cP1HUup3jtPqO65JVAGpMggK+Mgt978eqX0GCG IXfNMjGiJbGzTyQ1ZLKZfV6Zmlrmdye3CCX2y/TZY/7Jua3ZVbaUVhVcIiC17EZYJ0uy HDn2Watr4uBNo7at9wzQYt5mrMkvFivk3vhqC5BibZr8/AeQvLyY/aYJeeJgPTTB/+wP 5VAg== X-Gm-Message-State: AOAM533sktxAJcO66v7BYo/oFDtsOgS/9TNcvVyYJdQ/ILYvVxQ/uezF wt8irAenLAVE3hUmwmVWoqUH7acmQtQ= X-Received: by 2002:a05:6512:3990:: with SMTP id j16mr737184lfu.367.1622760382728; Thu, 03 Jun 2021 15:46:22 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id t15sm82373lfp.176.2021.06.03.15.46.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 03 Jun 2021 15:46:22 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 4 Jun 2021 00:45:49 +0200 Message-Id: <20210603224552.1218-2-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210603224552.1218-1-dcnieho@gmail.com> References: <20210603224552.1218-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/4] avdevice/avdevice: Revert "Deprecate AVDevice Capabilities API" X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Diederick Niehorster Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: j8iWGKYM5gGH This reverts commit 4f49ca7bbc75a9db4cdf93f27f95a668c751f160. This patch series will implement this capability for avdevice/dshow, enabling configuration discovery of DirectShow devices through the API, which is important for my use case. It enables making proper GUIs presenting users with options, instead of asking them to discover a dshow devices capabilities through the list_options option with an ffmpeg tool, and listing what they want to configure in text boxes. Signed-off-by: Diederick Niehorster --- doc/APIchanges | 4 +++ libavdevice/avdevice.c | 71 ++++++++++++++++++++++++++++++++++++++---- libavdevice/avdevice.h | 5 --- libavdevice/version.h | 5 +-- libavformat/avformat.h | 21 +++++++++++++ 5 files changed, 91 insertions(+), 15 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index c46f4d5304..30c0e7bf3f 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -14,6 +14,10 @@ libavutil: 2021-04-27 API changes, most recent first: +2021-xx-xx - xxxxxxxxxx - lavd 58.xx.100 - avdevice.h + Un-deprecated avdevice_capabilities_create() and + avdevice_capabilities_free(). + 2021-04-27 - cb3ac722f4 - lavc 59.0.100 - avcodec.h Constified AVCodecParserContext.parser. diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c index 22b7595ab1..371ec17d02 100644 --- a/libavdevice/avdevice.c +++ b/libavdevice/avdevice.c @@ -27,11 +27,39 @@ #include "libavutil/ffversion.h" const char av_device_ffversion[] = "FFmpeg version " FFMPEG_VERSION; -#if FF_API_DEVICE_CAPABILITIES +#define E AV_OPT_FLAG_ENCODING_PARAM +#define D AV_OPT_FLAG_DECODING_PARAM +#define A AV_OPT_FLAG_AUDIO_PARAM +#define V AV_OPT_FLAG_VIDEO_PARAM +#define OFFSET(x) offsetof(AVDeviceCapabilitiesQuery, x) + const AVOption av_device_capabilities[] = { + { "codec", "codec", OFFSET(codec), AV_OPT_TYPE_INT, + {.i64 = AV_CODEC_ID_NONE}, AV_CODEC_ID_NONE, INT_MAX, E|D|A|V }, + { "sample_format", "sample format", OFFSET(sample_format), AV_OPT_TYPE_SAMPLE_FMT, + {.i64 = AV_SAMPLE_FMT_NONE}, AV_SAMPLE_FMT_NONE, INT_MAX, E|D|A }, + { "sample_rate", "sample rate", OFFSET(sample_rate), AV_OPT_TYPE_INT, + {.i64 = -1}, -1, INT_MAX, E|D|A }, + { "channels", "channels", OFFSET(channels), AV_OPT_TYPE_INT, + {.i64 = -1}, -1, INT_MAX, E|D|A }, + { "channel_layout", "channel layout", OFFSET(channel_layout), AV_OPT_TYPE_CHANNEL_LAYOUT, + {.i64 = -1}, -1, INT_MAX, E|D|A }, + { "pixel_format", "pixel format", OFFSET(pixel_format), AV_OPT_TYPE_PIXEL_FMT, + {.i64 = AV_PIX_FMT_NONE}, AV_PIX_FMT_NONE, INT_MAX, E|D|V }, + { "window_size", "window size", OFFSET(window_width), AV_OPT_TYPE_IMAGE_SIZE, + {.str = NULL}, -1, INT_MAX, E|D|V }, + { "frame_size", "frame size", OFFSET(frame_width), AV_OPT_TYPE_IMAGE_SIZE, + {.str = NULL}, -1, INT_MAX, E|D|V }, + { "fps", "fps", OFFSET(fps), AV_OPT_TYPE_RATIONAL, + {.dbl = -1}, -1, INT_MAX, E|D|V }, { NULL } }; -#endif + +#undef E +#undef D +#undef A +#undef V +#undef OFFSET unsigned avdevice_version(void) { @@ -66,18 +94,49 @@ int avdevice_dev_to_app_control_message(struct AVFormatContext *s, enum AVDevToA return s->control_message_cb(s, type, data, data_size); } -#if FF_API_DEVICE_CAPABILITIES int avdevice_capabilities_create(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s, AVDictionary **device_options) { - return AVERROR(ENOSYS); + int ret; + av_assert0(s && caps); + av_assert0(s->iformat || s->oformat); + if ((s->oformat && !s->oformat->create_device_capabilities) || + (s->iformat && !s->iformat->create_device_capabilities)) + return AVERROR(ENOSYS); + *caps = av_mallocz(sizeof(**caps)); + if (!(*caps)) + return AVERROR(ENOMEM); + (*caps)->device_context = s; + if (((ret = av_opt_set_dict(s->priv_data, device_options)) < 0)) + goto fail; + if (s->iformat) { + if ((ret = s->iformat->create_device_capabilities(s, *caps)) < 0) + goto fail; + } else { + if ((ret = s->oformat->create_device_capabilities(s, *caps)) < 0) + goto fail; + } + av_opt_set_defaults(*caps); + return 0; + fail: + av_freep(caps); + return ret; } void avdevice_capabilities_free(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s) { - return; + if (!s || !caps || !(*caps)) + return; + av_assert0(s->iformat || s->oformat); + if (s->iformat) { + if (s->iformat->free_device_capabilities) + s->iformat->free_device_capabilities(s, *caps); + } else { + if (s->oformat->free_device_capabilities) + s->oformat->free_device_capabilities(s, *caps); + } + av_freep(caps); } -#endif int avdevice_list_devices(AVFormatContext *s, AVDeviceInfoList **device_list) { diff --git a/libavdevice/avdevice.h b/libavdevice/avdevice.h index 8370bbc7f2..727ba2a5f3 100644 --- a/libavdevice/avdevice.h +++ b/libavdevice/avdevice.h @@ -321,7 +321,6 @@ int avdevice_dev_to_app_control_message(struct AVFormatContext *s, enum AVDevToAppMessageType type, void *data, size_t data_size); -#if FF_API_DEVICE_CAPABILITIES /** * Following API allows user to probe device capabilities (supported codecs, * pixel formats, sample formats, resolutions, channel counts, etc). @@ -417,7 +416,6 @@ typedef struct AVDeviceCapabilitiesQuery { /** * AVOption table used by devices to implement device capabilities API. Should not be used by a user. */ -attribute_deprecated extern const AVOption av_device_capabilities[]; /** @@ -437,7 +435,6 @@ extern const AVOption av_device_capabilities[]; * * @return >= 0 on success, negative otherwise. */ -attribute_deprecated int avdevice_capabilities_create(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s, AVDictionary **device_options); @@ -447,9 +444,7 @@ int avdevice_capabilities_create(AVDeviceCapabilitiesQuery **caps, AVFormatConte * @param caps Device capabilities data to be freed. * @param s Context of the device. */ -attribute_deprecated void avdevice_capabilities_free(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s); -#endif /** * Structure describes basic parameters of the device. diff --git a/libavdevice/version.h b/libavdevice/version.h index 6021a0dd65..a51692621f 100644 --- a/libavdevice/version.h +++ b/libavdevice/version.h @@ -28,7 +28,7 @@ #include "libavutil/version.h" #define LIBAVDEVICE_VERSION_MAJOR 59 -#define LIBAVDEVICE_VERSION_MINOR 0 +#define LIBAVDEVICE_VERSION_MINOR 1 #define LIBAVDEVICE_VERSION_MICRO 100 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ @@ -46,8 +46,5 @@ * dropped at a future version bump. The defines themselves are not part of * the public API and may change, break or disappear at any time. */ -#ifndef FF_API_DEVICE_CAPABILITIES -#define FF_API_DEVICE_CAPABILITIES (LIBAVDEVICE_VERSION_MAJOR < 60) -#endif #endif /* AVDEVICE_VERSION_H */ diff --git a/libavformat/avformat.h b/libavformat/avformat.h index a28ac372da..77c3261e47 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -578,6 +578,16 @@ typedef struct AVOutputFormat { * @see avdevice_list_devices() for more details. */ int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list); + /** + * Initialize device capabilities submodule. + * @see avdevice_capabilities_create() for more details. + */ + int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + /** + * Free device capabilities submodule. + * @see avdevice_capabilities_free() for more details. + */ + int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); enum AVCodecID data_codec; /**< default data codec */ /** * Initialize format. May allocate data here, and set any AVFormatContext or @@ -743,6 +753,17 @@ typedef struct AVInputFormat { */ int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list); + /** + * Initialize device capabilities submodule. + * @see avdevice_capabilities_create() for more details. + */ + int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + + /** + * Free device capabilities submodule. + * @see avdevice_capabilities_free() for more details. + */ + int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); } AVInputFormat; /** * @}