From patchwork Thu Jun 3 22:32:57 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: 28067 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp535116iof; Thu, 3 Jun 2021 15:41:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxUl6G2Awwjwnr5EhaYExjC7HgZzAa5CstLzs+/qxOOInsHqO0BIovMhY3AdIfGTHvVJpHD X-Received: by 2002:a05:6402:158e:: with SMTP id c14mr1614171edv.128.1622760074978; Thu, 03 Jun 2021 15:41:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1622760074; cv=none; d=google.com; s=arc-20160816; b=Wrr6ZEkTOXW2tIBvCokJnUhr3m62xqu78woeujStKEDIFogs20pocYYthJixJJp3yt PZCYkBM3BE/7ceISAsC+dBD0whUlgBWFRYa+7TLTWFPUZKEySaDalPfiwqv/WSZ5wxof qoVwpBsKKkRI2Lou/MCJT+vWigZYrsMMfIfCWIDbA/TJ9g2axboGEBKryh7lMCKY3bdA +XQp8cdm3KTPXN9QXjle0FDQSb+Qjsg90SkNs3KPUB7vNCEOD5o495hY328BVR3i0yqP UtebjIFoFo6OIz9ZeI7a2Fj35WNwMOieYiP/DjfhTng6bxyXkUnEo0oQZWkGue8+3TG4 oTfw== 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=twBnKPRp2db7VtLvFsL7uUn7clwCWlXOWW+Tq97tgW5tNEluKFnOU0WkNhsSM7Hi0T gDi/j24vrNGG2Nrk08SHYqGMeLCTSVFI045rit+VuxyzvluZ+Y8UY5eToM8LFOq4xwsM CNZ5faWWPAdzDuUsl/rkzB3mKH9Tf+UEyclRa64elQnnwno4qW9HopDDZEppAovLIlot o0mj9PXY2TrmtEHGiVzx0ZSnzzmRi/Y7VF0vSJremqwroUn3xf8B6KYW+2vyZdr/IX2a AyXKQs7v3iAf2kRo/KK5ua5oN0mMl6jMjID+QocQrxU/ZYWj3Hij4Qb5aBWlVP3kiCdi QiDA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=ewVSyhAw; 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 bo20si3315533edb.524.2021.06.03.15.41.14; Thu, 03 Jun 2021 15:41:14 -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=ewVSyhAw; 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 BD53A68A134; Fri, 4 Jun 2021 01:41:10 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f45.google.com (mail-lf1-f45.google.com [209.85.167.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F3D8B6882FB for ; Fri, 4 Jun 2021 01:41:03 +0300 (EEST) Received: by mail-lf1-f45.google.com with SMTP id n12so4177369lft.10 for ; Thu, 03 Jun 2021 15:41: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=Alnixg7Ry7smcJazqYVdR3Ws88UD/RXxXTCKnlxa1XA=; b=ewVSyhAwc5dusnQc9spV5ZFN9Q93k/QUXoMeGnCg0AqIiyTh8BklIz2cHa5D6vIuAp hFnXBjGOhMEAQjHoX+VrACzPDzcbEry3rqZEgyhEsjtkJcMICbTkY/ReWm/f2HTLq2Qh AVRl4WXJ+sYqaoqAa04ta/4reP2j2ewOFvxM6SH4m9kW57Z4OajLVvG8mUZs0e5ve6zW YlA2hJaenxQsx9xXvzv1dH9KDeO17BDblc+udEJi3vz7QP7FuqV0/svczsqp4yKzYfWx jlcKN++L4UR2kzEjdcXns3KNxpU9wJogy8wG18dRkXz6nrZ+GE2Ss/O0ZL+OwQaTWyK3 4gMg== 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=uGAmeUT5+qKWl1huIOIiQCNBNI2RMCjArcnR4wDSfOMno9LaUubxzCrDC2L+D/7J3E W85/SFDCY7jrB4j4bf+FB2TamTITte1+ap5H28WXz2G2fjf/v1wdvBNowoZhO6q6ZCjq zyeFlrZG4v1k893ICAsitdC+C1aTYc8MxuQeN51gpLLCYFIZ8RyOvwcYEMBSg1Ios2yx T/Hbp4ha0bu8pSoGAiYqzJhaxD+EsgxkcncmGgnH8xrN1QgytoeaqaxHzOdsyJYsIMxP p13Mq8VySHYIpzynfhc6ZXyP33jQNqqBGP7L7tBNxBPuA5yjwWZgqR3jPsGq6Q6ZcEIL TvNg== X-Gm-Message-State: AOAM533ngT+k08HQWVOBj52Ku7fK+g7OomxoSwD6r+xx/bvGx/oysHDm dVK+95jCLtgDjARuIVTk7TRC3hLssQc= X-Received: by 2002:a05:6512:b95:: with SMTP id b21mr698599lfv.491.1622759741667; Thu, 03 Jun 2021 15:35:41 -0700 (PDT) Received: from localhost.localdomain (84-217-56-54.customers.ownit.se. [84.217.56.54]) by smtp.gmail.com with ESMTPSA id b6sm236026lfa.296.2021.06.03.15.35.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 03 Jun 2021 15:35:41 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 4 Jun 2021 00:32:57 +0200 Message-Id: <20210603223302.1047-2-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20210603223302.1047-1-dcnieho@gmail.com> References: <20210603223302.1047-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: jHteKpfEWPbR 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; /** * @}