From patchwork Wed Mar 30 12:17:58 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Diederick C. Niehorster" X-Patchwork-Id: 35068 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c05:b0:7a:e998:b410 with SMTP id bw5csp774458pzb; Wed, 30 Mar 2022 05:20:38 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxZCoE2G45YwzoIyYChMPOSfBBBzRyzIY9WfntrlKYYraBlN8Usilr+KrPROdG2y78e42Mo X-Received: by 2002:a17:907:3f29:b0:6df:7eac:7fa4 with SMTP id hq41-20020a1709073f2900b006df7eac7fa4mr39958877ejc.391.1648642838451; Wed, 30 Mar 2022 05:20:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648642838; cv=none; d=google.com; s=arc-20160816; b=vpCj3Q2NYIdwn4sbyFzZt2ZlZoM0g9wF+gIqchFtV1y/HOCJ7bvjcXYU/GUA/fpjd6 o7ZklmCG8qro/vTUEQz7G+ZeX5jHnpjlUW9KgjqjVeNiF0PPC8RpUQScks3XBxfrc03Y mA3ALui5iuF44jqcooDWBVcA0M8BfL0Vgc52aFMx2VFQ6cS4OcHiEdmzGhHMBw6MLroh ncDGAciPiBhM7/cv4NLCwDc4g/KXM/eW1rrPaKRgHZEe/vcwAxH1iz22tK+wGEt+3DbQ srIzyuI4dyLxfHDkIm8/83mrFB9YBrXWAR4xhkjBHyu69CBTLNu4xnasPSPgrbTPgx0m eUCw== 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=JEX+rZlj5vLUpd3byo6DdH+zMZqIoHib5p1zfmVA+FE=; b=Krr+A70HG/lQ5rsvXcHzrDWoyeG0JPy/s0vKwKtJwcCgF524Q2g/Q9pPpr9z6lmCRN 5zJn0iIEYI3mKdlYvdcL1b9wxyBul0R3tYBrycVlQWSzmCZjQTB74vQIz9w54ZNuBWsu C5sG6GIuUM+ka4Od5dWwMYG9UvXZMzM7LQLw0l3PGXWYa52HEtKYENJzurGfZOwDDZnB Yi0kiECPhQFdEOVa9B5F2z3tXsBabpvgvp/PuMKsrgW/4/fhdeeYR5ykbKkgNsirTgHp kXObXc7+Qk45lArPLDclr/q+R1hJgPv9V7fss5v5R+9GHpXFUBSbeQnMwksN7L6cks5G 3NnQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=AjlRWquj; 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 l16-20020a170906a41000b006df76385f2bsi20721886ejz.971.2022.03.30.05.20.38; Wed, 30 Mar 2022 05:20:38 -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=20210112 header.b=AjlRWquj; 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 2D3A168B210; Wed, 30 Mar 2022 15:19:53 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f48.google.com (mail-lf1-f48.google.com [209.85.167.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BE62068B13C for ; Wed, 30 Mar 2022 15:19:46 +0300 (EEST) Received: by mail-lf1-f48.google.com with SMTP id h7so35493301lfl.2 for ; Wed, 30 Mar 2022 05:19:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=DQ07VCqpbGLDnLFVQQHhti6Awh5ysPUT1zIJ+naNLuE=; b=AjlRWquj5MHrAIj5wO+cjZtU3LvxHHsG+IPFF95NGnzIJt7gWwpZIvXq9GroOlDhHx qACMgR+cwkVf9ySotf+Hqc7CQg7wu43ivGAgbxvLmqrHA7tJHIHv56Pn3XjWb1c5pCgb L+HtXbFDeO2xUakZuAAjm+QLx8uyUqEBqpkbk6WDG8Y7/fuQVg9zGM77uxu2Y+umHhkx cjRF5Nmjfz1mBRx0pLQK/BC/ZWCMkiOsyQ3jWcrEXbubCfFpsP7dNGUzIhxCiJUJsu5x CrLxLtHdwG54STzoI2Hm3uNUDEyI+eVPXJEJcQBxDwGZT4nQ5z/FwPTLoqoOVJe0A3Gj j+Ew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=DQ07VCqpbGLDnLFVQQHhti6Awh5ysPUT1zIJ+naNLuE=; b=D2FklSjKqnzrYtJmXRz4Xw886/q031CLIut3Q+DjTWliDsHbxmHtobl+Tyuh0Fr6x/ W3tyGucCqiAEtgbdHspEiOk9v3pCa6N48ej6Ejp4ImcOZ+0FsUUT/xaAmIU7bk7sYuHB XSoIjGINllLQBnEhNKBr2SFeD3ftiksn19P+jE2Js1tY5z8U1Lm1UuAjfZdUR0ZHec6w zqPQre48CxV5YrXWNfPUEWNV0rkoSPPZpF+tuAoKFxvFxLUPuyAuBEoRr4ftrX4sf9vJ x6VORQzbmMVNoPefBpYzgEJX7us3HaDGB1+3r1PdXqYeZ0ZKJqiRy/zXj2gB49Oq2oOH x05Q== X-Gm-Message-State: AOAM533gjyCzuw/XZ4NmdSXXi2ysgtFRNzQVtgSkGmTTcQKINEs6zDjh n4I8LtKRulqboRl4gd91NDmrjSVfmJg= X-Received: by 2002:ac2:4241:0:b0:448:4b83:8372 with SMTP id m1-20020ac24241000000b004484b838372mr6740548lfl.463.1648642785820; Wed, 30 Mar 2022 05:19:45 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id f18-20020ac25cd2000000b0044a34937c16sm2318126lfq.173.2022.03.30.05.19.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 05:19:45 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Wed, 30 Mar 2022 14:17:58 +0200 Message-Id: <20220330121806.822-14-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220330121806.822-1-dcnieho@gmail.com> References: <20220330121806.822-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 13/21] avdevice: improve capabilities' option 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: KsMtbWkf22+m This adds avdevice_capabilities_get_class() to allow examining the capabilities that can be queried/set through the capabilities API, and avdevice_capabilities_bprint_num() which allows printing the value returned when querying a capability. These values (min_value and max_value of an AVOptionRange) are doubles and this function formats them properly, e.g. 1. for a AV_OPT_TYPE_PIXEL_FMT -> yuyv422. bump minor version. Signed-off-by: Diederick Niehorster --- libavdevice/avdevice.c | 80 ++++++++++++++++++++++++++++++++++++++++++ libavdevice/avdevice.h | 27 ++++++++++++++ libavdevice/version.h | 4 +-- 3 files changed, 109 insertions(+), 2 deletions(-) diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c index 863f8df477..e2c60618d3 100644 --- a/libavdevice/avdevice.c +++ b/libavdevice/avdevice.c @@ -19,6 +19,9 @@ #include "libavutil/avassert.h" #include "libavutil/samplefmt.h" #include "libavutil/pixfmt.h" +#include "libavutil/pixdesc.h" +#include "libavutil/avutil.h" +#include "libavcodec/codec_id.h" #include "libavformat/version.h" #include "avdevice.h" #include "internal.h" @@ -141,6 +144,83 @@ int avdevice_capabilities_create(AVDeviceCapabilitiesQuery **caps, AVFormatConte return ret; } +static const AVClass avdevice_capabilities_context_class = { + .class_name = "AVDeviceCapabilitiesQuery", + .item_name = av_default_item_name, + .option = ff_device_capabilities, + .version = LIBAVUTIL_VERSION_INT +}; + +const AVClass *avdevice_capabilities_get_class(void) +{ + return &avdevice_capabilities_context_class; +} + +int avdevice_capabilities_bprint_num(AVBPrint *bp, const char *name, double val) +{ + int opt_type_set = 0, is_codec = 0; + enum AVOptionType type; // will be set below, opt_type_set tracks if has been set + const AVClass *cap_class = avdevice_capabilities_get_class(); + + // may fail, e.g. if name of a component of a multi-component option was provided as input + const AVOption *field = av_opt_find(&cap_class, name, NULL, 0, AV_OPT_SEARCH_FAKE_OBJ); + if (field) { + type = field->type; + opt_type_set = 1; + } + + // based on name, a type override or other extra info may be needed + if (opt_type_set && type==AV_OPT_TYPE_INT && strcmp(name, "codec")==0) + is_codec = 1; + // next three are for the three components of a AV_OPT_TYPE_IMAGE_SIZE + // NB: these wont be found by av_opt_find above + else if ( + strcmp(name, ff_device_get_query_component_name(AV_DEV_CAP_QUERY_WINDOW_SIZE, 0))==0 || + strcmp(name, ff_device_get_query_component_name(AV_DEV_CAP_QUERY_WINDOW_SIZE, 1))==0 || + strcmp(name, ff_device_get_query_component_name(AV_DEV_CAP_QUERY_WINDOW_SIZE, 2))==0 + ) { + type = AV_OPT_TYPE_INT; + opt_type_set = 1; + } + + // now, format if type set, else error + if (!opt_type_set) { + av_log(NULL, AV_LOG_ERROR, "A device capability with the name '%s' is not known\n", name); + return AVERROR_OPTION_NOT_FOUND; + } + + switch (type) + { + case AV_OPT_TYPE_INT: + { + int temp = lrint(val); + if (is_codec) + av_bprintf(bp, "%s", (char *)avcodec_get_name((enum AVCodecID)lrint(val))); + else + av_bprintf(bp, "%d", temp); + break; + } + case AV_OPT_TYPE_PIXEL_FMT: + av_bprintf(bp, "%s", (char *)av_x_if_null(av_get_pix_fmt_name((enum AVPixelFormat)lrint(val)), "none")); + break; + case AV_OPT_TYPE_SAMPLE_FMT: + av_bprintf(bp, "%s", (char *)av_x_if_null(av_get_sample_fmt_name((enum AVSampleFormat)lrint(val)), "none")); + break; + case AV_OPT_TYPE_DOUBLE: + av_bprintf(bp, "%f", val); + break; + case AV_OPT_TYPE_CHANNEL_LAYOUT: + av_bprintf(bp, "0x%"PRIx64, llrint(val)); + break; + + default: + av_log(NULL, AV_LOG_ERROR, "avdevice_capabilities_bprint_num is not implemented for this option type\n", name); + return AVERROR_PATCHWELCOME; + } + + return 0; +} + void avdevice_capabilities_free(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s) { if (!s || !caps || !(*caps)) diff --git a/libavdevice/avdevice.h b/libavdevice/avdevice.h index a815d65f12..5f9dfccc34 100644 --- a/libavdevice/avdevice.h +++ b/libavdevice/avdevice.h @@ -64,6 +64,7 @@ #include "libavutil/log.h" #include "libavutil/opt.h" #include "libavutil/dict.h" +#include "libavutil/bprint.h" #include "libavformat/avformat.h" /** @@ -418,6 +419,16 @@ int avdevice_dev_to_app_control_message(struct AVFormatContext *s, */ typedef struct AVDeviceCapabilitiesQuery AVDeviceCapabilitiesQuery; +/** + * Get the AVClass for AVDeviceCapabilitiesQuery. It can be used + * in combination with AV_OPT_SEARCH_FAKE_OBJ for examining + * which capabilities can be queried through the + * AVDeviceCapabilitiesQuery API. + * + * @see av_opt_find(), av_opt_next(). + */ +const AVClass *avdevice_capabilities_get_class(void); + /** * Initialize capabilities probing API based on AVOption API. * @@ -438,6 +449,22 @@ typedef struct AVDeviceCapabilitiesQuery AVDeviceCapabilitiesQuery; int avdevice_capabilities_create(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s, AVDictionary **device_options); +/** + * Format a capabilities value as string and append to a bprint buffer. + * @param bp A buffer to which the output string will be + * appended. + * @param name Name of the option to print (provide + * AVOptionRange.str). + * @param val An capabilities value represented as a + * double (e.g. min_value or max_value of + * AVOptionRange) + * @return 0 on success, a negative error code otherwise. Even if + * return value indicates success, the state of the bp variable + * should also be checked, as it may have experienced memory allocation + * trouble. + */ +int avdevice_capabilities_bprint_num(AVBPrint *bp, const char *name, double val); + /** * Free resources created by avdevice_capabilities_create() * diff --git a/libavdevice/version.h b/libavdevice/version.h index 181987d287..764aceccb5 100644 --- a/libavdevice/version.h +++ b/libavdevice/version.h @@ -30,8 +30,8 @@ #include "version_major.h" -#define LIBAVDEVICE_VERSION_MINOR 1 -#define LIBAVDEVICE_VERSION_MICRO 101 +#define LIBAVDEVICE_VERSION_MINOR 2 +#define LIBAVDEVICE_VERSION_MICRO 100 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ LIBAVDEVICE_VERSION_MINOR, \