From patchwork Fri Mar 25 14:10:33 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: 34975 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:ab0:5fda:0:0:0:0:0 with SMTP id g26csp1376958uaj; Fri, 25 Mar 2022 07:14:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwLtMRB1zm79/QT2flgxZn7ZBw0+gIdZkXKwZtIfGDv7TMJ1E0uVy5Z6r8BvOuOLBfioXJJ X-Received: by 2002:a17:906:4cca:b0:6ce:6a06:bf7 with SMTP id q10-20020a1709064cca00b006ce6a060bf7mr12273832ejt.109.1648217640093; Fri, 25 Mar 2022 07:14:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648217640; cv=none; d=google.com; s=arc-20160816; b=OEUcjGimI9KV9DrjCfK/IxcM61NI6eE3QhGJk14bzskDcWlC/2AefIslZnPm6xYgwY d28E6UlCpnfuzj4X3LpVBp1d6nk9/XK/CjWfT8X0h+WZcuXey4c2ZMgVKxA/xMY8gPcy BxLvDMiIAjBHIg9Gxu8st+D+cNZIRv+3tMVGV66lUrWonx9R+Hh0PxV4avINtny7r2j9 jZnzwz0tWvbK8hVux/yn3oAS3bDmu0K/RkOkaLj4jorCTrHEX0tTxEkr9ZzrFZuoChne A/KTShJdcrhaahLh9Ief6hhEEsADgxj06INwxaxO6AGbyRqNABIDnLmNrF/xG8UQ46bQ oEjA== 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=EwDYmawdN9Jz65CTscXn5KCeWiCryLTTS+aNYfg/6ck=; b=U2LXAn4HsJ91ZAAKb7Ri1sV2+tLEWNkLf6Yqk+hUmrdcRsPqyI4HG1kST9n0ykTmfM Ac+DEFjE8Do/A4hOpRBozKHClz7FEEsnGRbpaUmWd/N/vTASWGyFeZ5IfgqmZ8iDwFL2 I8EA7tvJzY8QXAyegz6oT+/xnTVAENDv8Fhf8AMsNqfu9qQedBvMidOdcOCLxJcN4/El /9iWqeGeSGzrMGuRjImxGMM5iS3+0blVOWTlCHms3sJNrwHEdIHzH7e8tmr2UyJqpVtM f3UbqYyzmOv7jbDu+ZFvjwfDNnO5UQh7lQAILD1TXN9wUs1DYxDomT/0pI/w9Kc8zOEv yoSA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=jFtQeWc3; 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 u16-20020a056402065000b0041962abfa3fsi2717998edx.387.2022.03.25.07.13.59; Fri, 25 Mar 2022 07:14:00 -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=jFtQeWc3; 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 D84A968B299; Fri, 25 Mar 2022 16:12:42 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org 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-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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: awKjJz811jen 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, \