From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 2E5CD42784 for ; Wed, 30 Mar 2022 12:20:35 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EB9C468B20E; Wed, 30 Mar 2022 15:19:52 +0300 (EEST) 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-Google-Smtp-Source: ABdhPJyqk9FVnAlBluLlEkpjMQyj4IgRUD3TfQvGWP9I5Mvg7r4SUsL1f5yz1gNT7RjusSxXJE3vUA== 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: 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, \ -- 2.28.0.windows.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".