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 7B5FC4114E for ; Fri, 25 Mar 2022 14:13:57 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A912E68B298; Fri, 25 Mar 2022 16:12:42 +0200 (EET) Received: from mail-lf1-f42.google.com (mail-lf1-f42.google.com [209.85.167.42]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 24F6068B28D for ; Fri, 25 Mar 2022 16:12:42 +0200 (EET) Received: by mail-lf1-f42.google.com with SMTP id a26so13575957lfg.10 for ; Fri, 25 Mar 2022 07:12:42 -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=O1WcsWfmRIel9tElns9LMmnPpxj18tVvIKsI4HSqavQ=; b=jFtQeWc3WETRVCylsiw4tDRts4d3O/H1mYzWnfAvPbs/8A+FzGl2Ihyvs2iiKOY1sj OEKETacICLm8HkpROEuk2FjwoEPWLHxWemN6LQhRtz48M+/JNpQ4mVSRCeXZFp/gItvY Bm10rV6cj/Zii2H5DKTrTMcUOfw7X2F2sSBkMy0HueDVh6OPyy3Lv56u9txZrJZUz4bv AXYOSxy5LXRy6voHXX/2w/Q5V6OF3H5foIkBM/TRl7FmN4JY3zPQUwQN/vlol3Lir1Hd CQrKmk3Cc25qJGzSvR79X6YblEoTU3cheV832Pao+3FuH6Q125F4TXki32wI6NKMxhZ0 tWGQ== 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=O1WcsWfmRIel9tElns9LMmnPpxj18tVvIKsI4HSqavQ=; b=ZtdC5U5AHTp9H8uHih/HWSHtIFQ/UV9uPxg+dxMTgmfzss3cYz2Zi7aDssI4SzZ7gU urQtrQ4RRNefhr5r3at+pIRkp24e8AGL4oqImqSujTWFtVFKyBNroV15lqSCv7PbxN8G niuoXk8q/TXE43Aapfbo7IenKObLPW/fRIuOKSjVNwtX9Yf1yM6P+NFlpgNLbnVN5GiI TuzN4/H5u93BTqFJd90ZDubAGDZUuWrTPr4gWjFfdQ8y4QvvX2ltTnR2GYkeCICM1J19 XgdGaR3CLDUeSlm6Vv4DWtZfaqT3kQ2+a0+CzA6FxgWoIt2gIqUK2YSGH2XSqsBXv6CX sRRw== X-Gm-Message-State: AOAM532eR/fXHJk5PHQ9tSU537AMHOxtmGQb0XwjmSRK8e4Hl8jo0iSB zg2btULdQxrlSNe17tQyF1uxNDOQPaM= X-Google-Smtp-Source: ABdhPJxoUb0rlkQpurh0XLGin8uhWFTovQ/cZnMlhKXmc4mvRCdE7JnJ0WmCU7ZD3etRU5KcGF1ARg== X-Received: by 2002:a05:6512:e9e:b0:44a:10f4:a185 with SMTP id bi30-20020a0565120e9e00b0044a10f4a185mr7784486lfb.205.1648217560474; Fri, 25 Mar 2022 07:12:40 -0700 (PDT) Received: from localhost.localdomain (deedock.humlab.lu.se. [130.235.135.183]) by smtp.gmail.com with ESMTPSA id c25-20020a2e6819000000b00247de61d3fdsm700858lja.113.2022.03.25.07.12.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 07:12:39 -0700 (PDT) From: Diederick Niehorster To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Mar 2022 15:10:33 +0100 Message-Id: <20220325141041.1748-15-dcnieho@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220325141041.1748-1-dcnieho@gmail.com> References: <20220325141041.1748-1-dcnieho@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 14/22] 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 33061b4408..0a75504d9c 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 9853069a2d..5a62e5ec6f 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".