From patchwork Mon Aug 15 19:58:54 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thilo Borgmann X-Patchwork-Id: 37296 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3d0d:b0:8d:a68e:8a0e with SMTP id y13csp1466431pzi; Mon, 15 Aug 2022 12:59:08 -0700 (PDT) X-Google-Smtp-Source: AA6agR6Y1IpXsK93DygRqgwqyE0VdYblu037Zb/9wgp5mb9GzMSGHmhsY8wUjqwNzpT+g4abm4jX X-Received: by 2002:a17:907:7fa5:b0:730:5d54:4c24 with SMTP id qk37-20020a1709077fa500b007305d544c24mr11340309ejc.641.1660593547763; Mon, 15 Aug 2022 12:59:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660593547; cv=none; d=google.com; s=arc-20160816; b=0wqfZ61IyLuhcgyqp4w7gJQ/jdcoFP94DxYOTZsaVPLuRo+irxL+ZmGtCcBtJqkdTm EYzQJsm8DPde7oy6ILNV1hdXIY4r7U0a04OJ/7NQ+ZTc1Xq80c2AetDlUc606bCxUACK zhaEjIFKd2TeC4wQFN9POMclcGHgcU+XYxQ5+wzORs2IvKSUjYG/CoYyQ9tTT7zfTL62 Kx4Q1EQXMgq8+u2QOT30OwIQj+1QLdsTfe5K8wbh5zdpwUM3YOaodNYw7m/LVhyZaGru 0lQOrVV4fmD6+FxIVFRmpnaQWpNDkf+7ninBaltj3o+FUtHZDPgcI+ZdT4/JEZyIZsEg 2gUQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject:from:to :content-language:mime-version:date:message-id:dkim-signature :delivered-to; bh=CM9k+Uc42PtP9YBekJ+GIn22TX9U9GLvi5Iuhoyl6SA=; b=V/HGAhz5Kg3+ztlZgRE/Jdf1Js589H6yu0yO2hROfH/Pr93nhBz7KcRTNgQoVa0xi+ dL/VwinSy18JbjG5bb0+sBi+bURtHu/n4kQbJFkRbDh0Jgk2LeNp3h393LwHvBoDT3Yh /vll92Wh9hoyXiSsphqIbjiz+n1Vw+rTSNWTgX4poqfFgBB2G9HTw+5vUv5USOvDFI5S cHzfd13AG+pEXY+Ja2KikurcYSfxnpma3/DLiyEqPXMX1T9UAumpssqzXs9T07CNzSQw H3CA57E54CtBC1vkEKqeD6u6Z8sI6yd2AhXiWKiNZtJ/WBWKBxh/CiopwAZuD3+poWFe QbzQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@mail.de header.s=mailde202009 header.b=Db2Lo48Y; 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=NONE dis=NONE) header.from=mail.de Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id g10-20020aa7c58a000000b0043e728bfb58si7629710edq.164.2022.08.15.12.59.06; Mon, 15 Aug 2022 12:59:07 -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=@mail.de header.s=mailde202009 header.b=Db2Lo48Y; 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=NONE dis=NONE) header.from=mail.de Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 17F1D68B965; Mon, 15 Aug 2022 22:59:04 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from shout01.mail.de (shout01.mail.de [62.201.172.24]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 39E5A68B962 for ; Mon, 15 Aug 2022 22:58:57 +0300 (EEST) Received: from postfix03.mail.de (postfix03.bt.mail.de [10.0.121.127]) by shout01.mail.de (Postfix) with ESMTP id 4F80DA093B for ; Mon, 15 Aug 2022 21:58:56 +0200 (CEST) Received: from smtp02.mail.de (smtp02.bt.mail.de [10.0.121.212]) by postfix03.mail.de (Postfix) with ESMTP id 3419280167 for ; Mon, 15 Aug 2022 21:58:56 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=mail.de; s=mailde202009; t=1660593536; bh=NI+dznu6j9PKHohaivk9yDNALfyKJ3/KCagtTVgahZI=; h=Message-ID:Date:To:From:Subject:From:To:CC:Subject:Reply-To; b=Db2Lo48Y8VHqnqF/LoGEax5x3zigKG+fMBs640UdLjgikgUPFC/+vUWEN/5X3Bz9y eVJZVOXCPKZBQ7HlJiUu3Ov4u6v4B2BqGu1HdE0QaEzzhmL4e3V+uSHI7FFFtYFjKy I+itaNtP1tUFfWs5YP+TqXaVMWyvFquXihtOJU6wBFyVQCDr+lBp/fh3X9jbDHFCQw MdqIPTZt76amfPJpyxo5KXLN/iySRfVEAaixR3PTxw/EfYHOZnJlRJF16Vi0/kfNdA p8KZaeVX5SqhtjWvY659ania5Jh0vdJUl9cRjzqax5fNpsNvQEILeo32uGdMADRRYx EzDacw7jFT0Tw== Received: from [127.0.0.1] (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by smtp02.mail.de (Postfix) with ESMTPSA id 05C7EA04B2 for ; Mon, 15 Aug 2022 21:58:55 +0200 (CEST) Message-ID: Date: Mon, 15 Aug 2022 21:58:54 +0200 MIME-Version: 1.0 Content-Language: en-US To: FFmpeg development discussions and patches From: Thilo Borgmann X-purgate: clean X-purgate: This mail is considered clean (visit http://www.eleven.de for further information) X-purgate-type: clean X-purgate-Ad: Categorized by eleven eXpurgate (R) http://www.eleven.de X-purgate: This mail is considered clean (visit http://www.eleven.de for further information) X-purgate: clean X-purgate-size: 5835 X-purgate-ID: 154282::1660593536-0000737C-A1615FB2/0/0 Subject: [FFmpeg-devel] [PATCH v2 1/4] fftools: Add support for dictionary options 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: YWBLcKN/Sgdp Hi, this is an updated and cleaned-up version of Jan's patchset discussed in [1], therefore v2... Comments from the previous thread are in and left-overs from the several options version removed. I'd especially appreciate any comments on 2/4, ffmpeg_opt.c:112ff which is pretty ugly as-is. Should fix #8329 and #6370. Thanks, Thilo From 47e7d37e742344f8ae618b180cf8cb77abb33626 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Ekstr=C3=B6m?= Date: Mon, 15 Aug 2022 20:44:16 +0200 Subject: [PATCH v2 1/4] fftools: Add support for dictionary options --- fftools/cmdutils.c | 18 ++++++++++++++++++ fftools/cmdutils.h | 2 ++ fftools/ffmpeg_opt.c | 11 +++++++++-- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c index 18e768b386..22ba654bb0 100644 --- a/fftools/cmdutils.c +++ b/fftools/cmdutils.c @@ -131,6 +131,22 @@ int64_t parse_time_or_die(const char *context, const char *timestr, return us; } +static AVDictionary *parse_dict_or_die(const char *context, + const char *dict_str) +{ + AVDictionary *dict = NULL; + int ret = av_dict_parse_string(&dict, dict_str, "=", ",", 0); + if (ret < 0) { + av_log(NULL, AV_LOG_FATAL, + "Failed to create a dictionary from '%s': %s!\n", + dict_str, av_err2str(ret)); + exit_program(1); + } + + + return dict; +} + void show_help_options(const OptionDef *options, const char *msg, int req_flags, int rej_flags, int alt_flags) { @@ -288,6 +304,8 @@ static int write_option(void *optctx, const OptionDef *po, const char *opt, *(float *)dst = parse_number_or_die(opt, arg, OPT_FLOAT, -INFINITY, INFINITY); } else if (po->flags & OPT_DOUBLE) { *(double *)dst = parse_number_or_die(opt, arg, OPT_DOUBLE, -INFINITY, INFINITY); + } else if (po->flags & OPT_DICT) { + *(AVDictionary **)dst = parse_dict_or_die(opt, arg); } else if (po->u.func_arg) { int ret = po->u.func_arg(optctx, opt, arg); if (ret < 0) { diff --git a/fftools/cmdutils.h b/fftools/cmdutils.h index d87e162ccd..6a519c6546 100644 --- a/fftools/cmdutils.h +++ b/fftools/cmdutils.h @@ -129,6 +129,7 @@ typedef struct SpecifierOpt { uint64_t ui64; float f; double dbl; + AVDictionary *dict; } u; } SpecifierOpt; @@ -157,6 +158,7 @@ typedef struct OptionDef { #define OPT_DOUBLE 0x20000 #define OPT_INPUT 0x40000 #define OPT_OUTPUT 0x80000 +#define OPT_DICT 0x100000 union { void *dst_ptr; int (*func_arg)(void *, const char *, const char *); diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c index 97f14b2a5b..cc038aae6b 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -62,6 +62,7 @@ #define SPECIFIER_OPT_FMT_ui64 "%"PRIu64 #define SPECIFIER_OPT_FMT_f "%f" #define SPECIFIER_OPT_FMT_dbl "%lf" +#define SPECIFIER_OPT_FMT_dict "%p" static const char *const opt_name_codec_names[] = {"c", "codec", "acodec", "vcodec", "scodec", "dcodec", NULL}; static const char *const opt_name_audio_channels[] = {"ac", NULL}; @@ -208,11 +209,17 @@ static void uninit_options(OptionsContext *o) av_freep(&(*so)[i].specifier); if (po->flags & OPT_STRING) av_freep(&(*so)[i].u.str); + else if (po->flags & OPT_DICT) + av_dict_free(&(*so)[i].u.dict); } av_freep(so); *count = 0; - } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING) - av_freep(dst); + } else if (po->flags & OPT_OFFSET) { + if (po->flags & OPT_STRING) + av_freep(dst); + else if (po->flags & OPT_DICT) + av_dict_free((AVDictionary **)&dst); + } po++; } From patchwork Mon Aug 15 20:02:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thilo Borgmann X-Patchwork-Id: 37295 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3d0d:b0:8d:a68e:8a0e with SMTP id y13csp1468021pzi; Mon, 15 Aug 2022 13:02:21 -0700 (PDT) X-Google-Smtp-Source: AA6agR6JgdQCo+ELN87w1UQM8UupWb2SKbw0eC8Qtb6OuPdnNy87Lc2/Ud0LOdHcaoUwBjItKqU9 X-Received: by 2002:a05:6402:270e:b0:43d:e3e1:847a with SMTP id y14-20020a056402270e00b0043de3e1847amr15962635edd.130.1660593741252; Mon, 15 Aug 2022 13:02:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660593741; cv=none; d=google.com; s=arc-20160816; b=iVXeW48s1HxMhSpVRSITEPYqgiIvDjyccKIcdiJlcvJ1LQuoSkqQTt33J+IYU1OEuS ZJpVowaaUZMJJC6yp9hcAUEjEDNTN02IJAXeNEmanZGmdyIcp2AseSDCpE8feFXlZPT9 Zay6G0j+gGCiTw14UU1C9JY1LgPATjdnFVWTKlLTfw1mxvYqC5IZCP6DjNmLIrxDIvbR EtBPUZbEZYTY0QTOFpLpzKeLaZJBmjKtwHpOQyLoFrpys0khN/GZttM1XL4aiqtWTNwg 5uScBwxHZvIryCM/oP2I/U8MWBEGnNOY93KOd77rIrujNiit4oGwCpjIsjlepEBDC2Ab aYqw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :in-reply-to:from:references:to:content-language:mime-version:date :message-id:dkim-signature:delivered-to; bh=96degxB5A5m5WdDTSD2GbMdYzBVpG2KlVbdFhuMkfgE=; b=fSBmJ04XYQIHFHeUpVeIUepSYTfqbXW84503ma23lV6R90ycgvUhDGQMJFua+aWuBs JbfLESUsYEiiGnC5Tar+OKGxU+iDoYrL486laSFGbmvtGwfx03FNExk4OBlmTW+tHAcJ xqgPrpxkaNkQzn0JuhcniBakBUqsNnkpv+GwalSjy7hu1S6yDT6w5HgfoUHauFDZ/mR0 AdfnKvs0WBjA3I1b7GN0B5B1PD7KMmPgusfLVyi6+YaVL7Xq5DVKOIVp1ZqWmAkq+B7C svFfFE+VtRcavULdN4oY2hLuss9/O+sviCySFxv3yylBxmWbqyWHpChCRPGTs7W5ZX3g +Few== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@mail.de header.s=mailde202009 header.b=xoGIG+Qt; 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=NONE dis=NONE) header.from=mail.de Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id h5-20020a1709063b4500b00730699b91dbsi7290502ejf.438.2022.08.15.13.02.20; Mon, 15 Aug 2022 13:02:21 -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=@mail.de header.s=mailde202009 header.b=xoGIG+Qt; 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=NONE dis=NONE) header.from=mail.de Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5271468B969; Mon, 15 Aug 2022 23:02:17 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from shout02.mail.de (shout02.mail.de [62.201.172.25]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C64FA68B20B for ; Mon, 15 Aug 2022 23:02:10 +0300 (EEST) Received: from postfix01.mail.de (postfix01.bt.mail.de [10.0.121.125]) by shout02.mail.de (Postfix) with ESMTP id 0D45DA0D80 for ; Mon, 15 Aug 2022 22:02:10 +0200 (CEST) Received: from smtp02.mail.de (smtp02.bt.mail.de [10.0.121.212]) by postfix01.mail.de (Postfix) with ESMTP id EA280801C2 for ; Mon, 15 Aug 2022 22:02:09 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=mail.de; s=mailde202009; t=1660593729; bh=ubdbrsvUvXFVwVdwJe5nX3l0dPBMDo2qCDQCai8lLgc=; h=Message-ID:Date:Subject:To:From:From:To:CC:Subject:Reply-To; b=xoGIG+QtTFS12tryEBuLDA7GbuRKmnkx3N8m4jEBrNxHs1BXr2OD5jFuOVXb85LiC J3CPohDkucFduIqx4oQgd5U/tETGHBgUumgySzYMMrjkdZ4Jt2lv9PdMlODMVXXIoZ tapTRTlenIgGp9+BxUB/9Q+W8tRk+F1qs2x4Uds0P+bUBprZBanaEpRLqclB7ay6JO bA0x+sH0Y7uDxWhYDGW+i012ZPk5I4p0Z6WPAhSYaXvV1xm8oTXo6/2Z8cCsdO5lkP D3xchTNVdASYy265iKUKXw0ReEbfX3i//Rf6rqYs5vxlL3L6fibXg7rsGR2KeIW1yO xEzgfACCAf24w== Received: from [127.0.0.1] (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by smtp02.mail.de (Postfix) with ESMTPSA id BB858A0216 for ; Mon, 15 Aug 2022 22:02:09 +0200 (CEST) Message-ID: <3476fe9f-0433-99fa-0f0f-451f4062a7c8@mail.de> Date: Mon, 15 Aug 2022 22:02:09 +0200 MIME-Version: 1.0 Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: From: Thilo Borgmann In-Reply-To: X-purgate: clean X-purgate: This mail is considered clean (visit http://www.eleven.de for further information) X-purgate-type: clean X-purgate-Ad: Categorized by eleven eXpurgate (R) http://www.eleven.de X-purgate: This mail is considered clean (visit http://www.eleven.de for further information) X-purgate: clean X-purgate-size: 15020 X-purgate-ID: 154282::1660593729-0000737C-FDEB5DCF/0/0 Subject: [FFmpeg-devel] [PATCH v2 2/4] ffmpeg: Add display_matrix option 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: cUFCFW5KMuYw $subject -Thilo From fe2ff114cb004f897c7774753d9cf28298eba82d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Ekstr=C3=B6m?= Date: Mon, 15 Aug 2022 21:09:27 +0200 Subject: [PATCH v2 2/4] ffmpeg: Add display_matrix option This enables overriding the rotation as well as horizontal/vertical flip state of a specific video stream on the input side. Additionally, switch the singular test that was utilizing the rotation metadata to instead override the input display rotation, thus leading to the same result. --- doc/ffmpeg.texi | 13 +++++ fftools/cmdutils.h | 1 + fftools/ffmpeg.h | 2 + fftools/ffmpeg_opt.c | 107 ++++++++++++++++++++++++++++++++++++ tests/fate/filter-video.mak | 2 +- 5 files changed, 124 insertions(+), 1 deletion(-) diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi index 42440d93b4..5d3e3b3052 100644 --- a/doc/ffmpeg.texi +++ b/doc/ffmpeg.texi @@ -912,6 +912,19 @@ If used together with @option{-vcodec copy}, it will affect the aspect ratio stored at container level, but not the aspect ratio stored in encoded frames, if it exists. +@item -display_matrix[:@var{stream_specifier}] @var{opt1=val1[,opt2=val2]...} (@emph{input,per-stream}) +Set the video display matrix according to given options. + +@table @option +@item rotation=@var{number} +Set the rotation using a floating point number that describes a pure +counter-clockwise rotation in degrees. +The @code{-autorotate} logic will be affected. +@item hflip=@var{[0,1]} +@item vflip=@var{[0,1]} +Set a horizontal or vertical flip. +@end table + @item -vn (@emph{input/output}) As an input option, blocks all video streams of a file from being filtered or being automatically selected or mapped for any output. See @code{-discard} diff --git a/fftools/cmdutils.h b/fftools/cmdutils.h index 6a519c6546..df90cc6958 100644 --- a/fftools/cmdutils.h +++ b/fftools/cmdutils.h @@ -166,6 +166,7 @@ typedef struct OptionDef { } u; const char *help; const char *argname; + const AVClass *args; } OptionDef; /** diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index 6991ba7632..0ea730fd42 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -193,6 +193,8 @@ typedef struct OptionsContext { int nb_force_fps; SpecifierOpt *frame_aspect_ratios; int nb_frame_aspect_ratios; + SpecifierOpt *display_matrixes; + int nb_display_matrixes; SpecifierOpt *rc_overrides; int nb_rc_overrides; SpecifierOpt *intra_matrices; diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c index cc038aae6b..e184b4239c 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -20,6 +20,7 @@ #include "config.h" +#include #include #if HAVE_SYS_RESOURCE_H @@ -45,6 +46,7 @@ #include "libavutil/avutil.h" #include "libavutil/bprint.h" #include "libavutil/channel_layout.h" +#include "libavutil/display.h" #include "libavutil/getenv_utf8.h" #include "libavutil/intreadwrite.h" #include "libavutil/fifo.h" @@ -87,6 +89,7 @@ static const char *const opt_name_forced_key_frames[] = {"forced_key_fra static const char *const opt_name_fps_mode[] = {"fps_mode", NULL}; static const char *const opt_name_force_fps[] = {"force_fps", NULL}; static const char *const opt_name_frame_aspect_ratios[] = {"aspect", NULL}; +static const char *const opt_name_display_matrixes[] = {"display_matrix", NULL}; static const char *const opt_name_rc_overrides[] = {"rc_override", NULL}; static const char *const opt_name_intra_matrices[] = {"intra_matrix", NULL}; static const char *const opt_name_inter_matrices[] = {"inter_matrix", NULL}; @@ -112,6 +115,32 @@ static const char *const opt_name_time_bases[] = {"time_base", NU static const char *const opt_name_enc_time_bases[] = {"enc_time_base", NULL}; static const char *const opt_name_bits_per_raw_sample[] = {"bits_per_raw_sample", NULL}; +// XXX this should probably go into a seperate file _args.c and #included here + struct display_matrix_s { + const AVClass *class; + double rotation; + int hflip; + int vflip; + }; +#define OFFSET(x) offsetof(struct display_matrix_s, x) + static const AVOption display_matrix_args[] = { + { "rotation", "set rotation", OFFSET(rotation), AV_OPT_TYPE_DOUBLE, + { .dbl = DBL_MAX }, -(DBL_MAX), DBL_MAX - 1.0f, AV_OPT_FLAG_ARGUMENT}, + { "hflip", "set hflip", OFFSET(hflip), AV_OPT_TYPE_BOOL, + { .i64 = -1 }, 0, 1, AV_OPT_FLAG_ARGUMENT}, + { "vflip", "set vflip", OFFSET(vflip), AV_OPT_TYPE_BOOL, + { .i64 = -1 }, 0, 1, AV_OPT_FLAG_ARGUMENT}, + { NULL }, + }; + static const AVClass class_display_matrix_args = { + .class_name = "display_matrix_args", + .item_name = av_default_item_name, + .option = display_matrix_args, + .version = LIBAVUTIL_VERSION_INT, + }; +#undef OFFSET +// XXX + #define WARN_MULTIPLE_OPT_USAGE(name, type, so, st)\ {\ char namestr[128] = "";\ @@ -808,6 +837,75 @@ static int opt_recording_timestamp(void *optctx, const char *opt, const char *ar return 0; } +static void add_display_matrix_to_stream(OptionsContext *o, + AVFormatContext *ctx, AVStream *st) +{ + int hflip_set = 0, vflip_set = 0, display_rotation_set = 0; + uint8_t *buf = NULL; + + static struct display_matrix_s test_args = { + .class = &class_display_matrix_args, + .rotation = DBL_MAX, + .hflip = -1, + .vflip = -1, + }; + + AVDictionary *global_args = NULL; + AVDictionary *local_args = NULL; + AVDictionaryEntry *en = NULL; + + MATCH_PER_STREAM_OPT(display_matrixes, dict, global_args, ctx, st); + + if (!global_args) + return; + + // make a copy of the dict so it doesn't get freed from underneath us + if (av_dict_copy(&local_args, global_args, 0) < 0) { + av_log(NULL, AV_LOG_FATAL, + "Failed to copy argument dict for display matrix!\n"); + } + + if (av_opt_set_dict2(&test_args, &local_args, 0) < 0) { + av_log(NULL, AV_LOG_FATAL, + "Failed to set options for a display matrix!\n"); + exit_program(1); + } + + while ((en = av_dict_get(local_args, "", en, AV_DICT_IGNORE_SUFFIX))) { + av_log(NULL, AV_LOG_FATAL, + "Unknown option=value pair for display matrix: " + "key: '%s', value: '%s'!\n", + en->key, en->value); + } + + if (av_dict_count(local_args)) { + exit_program(1); + } + + av_dict_free(&local_args); + + display_rotation_set = test_args.rotation != DBL_MAX; + hflip_set = test_args.hflip != -1; + vflip_set = test_args.vflip != -1; + + if (!display_rotation_set && !hflip_set && !vflip_set) + return; + + if (!(buf = av_stream_new_side_data(st, AV_PKT_DATA_DISPLAYMATRIX, + sizeof(int32_t) * 9))) { + av_log(NULL, AV_LOG_FATAL, "Failed to generate a display matrix!\n"); + exit_program(1); + } + + av_display_rotation_set((int32_t *)buf, + display_rotation_set ? -(test_args.rotation) : + -0.0f); + av_display_matrix_flip((int32_t *)buf, + hflip_set ? test_args.hflip : 0, + vflip_set ? test_args.vflip : 0); +} + + static const AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder) { const AVCodecDescriptor *desc; @@ -942,6 +1040,8 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic) } if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { + add_display_matrix_to_stream(o, ic, st); + MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st); MATCH_PER_STREAM_OPT(hwaccel_output_formats, str, hwaccel_output_format, ic, st); @@ -1865,6 +1965,8 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, in ost->frame_aspect_ratio = q; } + add_display_matrix_to_stream(o, oc, st); + MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st); MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st); @@ -3992,6 +4094,11 @@ const OptionDef options[] = { { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) }, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" }, + { "display_matrix", OPT_VIDEO | HAS_ARG | OPT_DICT | OPT_SPEC | + OPT_INPUT, { .off = OFFSET(display_matrixes) }, + "define a display matrix with rotation and/or horizontal/vertical " + "flip for stream(s)", + "arguments", &class_display_matrix_args }, { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) }, "set pixel format", "format" }, diff --git a/tests/fate/filter-video.mak b/tests/fate/filter-video.mak index 372c70bba7..763390ea51 100644 --- a/tests/fate/filter-video.mak +++ b/tests/fate/filter-video.mak @@ -691,7 +691,7 @@ fate-filter-metadata-avf-aphase-meter-out-of-phase: SRC = $(TARGET_SAMPLES)/filt fate-filter-metadata-avf-aphase-meter-out-of-phase: CMD = run $(FILTER_METADATA_COMMAND) "amovie='$(SRC)',aphasemeter=video=0" FATE_FILTER_SAMPLES-$(call TRANSCODE, RAWVIDEO H264, MOV, ARESAMPLE_FILTER AAC_FIXED_DECODER) += fate-filter-meta-4560-rotate0 -fate-filter-meta-4560-rotate0: CMD = transcode mov $(TARGET_SAMPLES)/filter/sample-in-issue-505.mov mov "-c copy -metadata:s:v:0 rotate=0" "-af aresample" "" "" "-flags +bitexact -c:a aac_fixed" +fate-filter-meta-4560-rotate0: CMD = transcode "mov -display_matrix:v:0 rotation=0" $(TARGET_SAMPLES)/filter/sample-in-issue-505.mov mov "-c copy" "-af aresample" "" "" "-flags +bitexact -c:a aac_fixed" FATE_FILTER_CMP_METADATA-$(CONFIG_BLOCKDETECT_FILTER) += fate-filter-refcmp-blockdetect-yuv fate-filter-refcmp-blockdetect-yuv: CMD = cmp_metadata blockdetect yuv420p 0.015 From patchwork Mon Aug 15 20:02:14 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thilo Borgmann X-Patchwork-Id: 37297 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3d0d:b0:8d:a68e:8a0e with SMTP id y13csp1468098pzi; Mon, 15 Aug 2022 13:02:30 -0700 (PDT) X-Google-Smtp-Source: AA6agR69hmSV1ij8/sgpgFwP87/L1DKPIuxdyHqsqGTcdzPuCccApXOmmkuQiDxeL5grCS0OJfB8 X-Received: by 2002:a05:6402:3506:b0:43e:954b:bc8a with SMTP id b6-20020a056402350600b0043e954bbc8amr16194362edd.266.1660593750296; Mon, 15 Aug 2022 13:02:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660593750; cv=none; d=google.com; s=arc-20160816; b=lAMIOUYexN3qfeW/vehsqqnUuqHysTqIrUsTjx/8/g7gWmXwoEdom+iHKPx0AVH+lB PglCVY4fZ3kRvvUxwfdqGSOZYs67OnzFt7bEWsP2f0S24vDiqZXAYQIYVUUcC6gYelLe 6+ojf6VmiTLG0TWtg1E/hrb1dN1STuLmIFb94T7MXvCEomuNHHdYUbBo3YfRdILEj/6z uzWQWvXGKxuwnkAFlvz4WqkO1Zk+Miix1Bz0YQrm6M8dMyOBDvQOVXm3htF3G7FI/xXd TIs0eP+u4Z3O+97epLGjfjPFdQBPvFLXougAkcFa+8ToRtsWXH48SU6vuGKUkgp2sqDb lsRg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :in-reply-to:from:references:to:content-language:mime-version:date :message-id:dkim-signature:delivered-to; bh=InctAgg5ZFkejmzIEMNTOj90hHNo/jv18kI5MxZtEqs=; b=x3+iESgf0CIk0+gUnWnnWSyt5snqZ5toy+V5xa0FCv1/WlEmffofMVE2JJZcvRo7qq gU2KqZI4Hh1C5doZItN3mmQv0abeZDPCdc0hbPmWJ1lVXmqBU5m/lW6HjkmV3bLEBr0Z 1bnNQ9dj58n01h3LoJ+j86w86UTyFcqf3j+N8Lryljl1SOoOV33ATW1GhHnXsKbw3M4p MVmaBEM8e+GYmRGgifGYLVHx/4VSUsxqGqL6T5gYP68/UfoL/q4FY/TJvoeqxJ6AT5WV y9PF9rYLvsmiPBmHtOXi6KwsLUAvMgz+BV6IDQWte1q9/FWVYKkDQL1G0El7C9Hxkp5g k+tg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@mail.de header.s=mailde202009 header.b=B2Uk2tlM; 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=NONE dis=NONE) header.from=mail.de Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id z3-20020a170906668300b00733187684e7si7643304ejo.409.2022.08.15.13.02.28; Mon, 15 Aug 2022 13:02:30 -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=@mail.de header.s=mailde202009 header.b=B2Uk2tlM; 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=NONE dis=NONE) header.from=mail.de Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2613768B976; Mon, 15 Aug 2022 23:02:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from shout01.mail.de (shout01.mail.de [62.201.172.24]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2314A68B96D for ; Mon, 15 Aug 2022 23:02:16 +0300 (EEST) Received: from postfix03.mail.de (postfix03.bt.mail.de [10.0.121.127]) by shout01.mail.de (Postfix) with ESMTP id C21E9A0911 for ; Mon, 15 Aug 2022 22:02:15 +0200 (CEST) Received: from smtp02.mail.de (smtp02.bt.mail.de [10.0.121.212]) by postfix03.mail.de (Postfix) with ESMTP id A726B80297 for ; Mon, 15 Aug 2022 22:02:15 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=mail.de; s=mailde202009; t=1660593735; bh=vkXmEPXNvhHweG++mg/7VwSTEc/2c4rUU7oTMCLWarI=; h=Message-ID:Date:Subject:To:From:From:To:CC:Subject:Reply-To; b=B2Uk2tlMkTMO7HUzmtEmWYWK0mTy95g5+XsdzicSbnUboZkZHNOREIuFF25NlIpKm 7AEI8WVOrHtvEPV0uLVnT4CUYEpskGQ4fxI4SUFakWCowmupXcUqHYduUlobBT2o3L dn/+lfybc/ksqxRXqKd1H0NPiuoN6VAKY9yihVRMOeCSOzzaE5PbulxRNehYZeVwbn PSHkQR9jmTAdUAdli5L/cd73QUmYGElBNudwN8sLrfok4NDf0RonkdZpEOB2zddF1s UHmRQQ0DDg660OkHNdB1Rw3beCEcFmcZ1rTsVqEShy/+6egbPBnnzYe6Yd/JvH3zqN 4w2NTCnCMRL/A== Received: from [127.0.0.1] (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by smtp02.mail.de (Postfix) with ESMTPSA id 75C92A04B6 for ; Mon, 15 Aug 2022 22:02:15 +0200 (CEST) Message-ID: <16f3b7f9-2296-d459-9135-8e6e86e8e3de@mail.de> Date: Mon, 15 Aug 2022 22:02:14 +0200 MIME-Version: 1.0 Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: From: Thilo Borgmann In-Reply-To: X-purgate: clean X-purgate: This mail is considered clean (visit http://www.eleven.de for further information) X-purgate-type: clean X-purgate-Ad: Categorized by eleven eXpurgate (R) http://www.eleven.de X-purgate: This mail is considered clean (visit http://www.eleven.de for further information) X-purgate: clean X-purgate-size: 5353 X-purgate-ID: 154282::1660593735-0000737C-24970BA7/0/0 Subject: [FFmpeg-devel] [PATCH v2 3/4] ffmpeg: Deprecate display rotation override with a metadata key 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: aCwkfnpUA5OY $subject -Thilo From 2c556c126b77b7bc90749096f858daa6124cf097 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Ekstr=C3=B6m?= Date: Mon, 15 Aug 2022 20:58:05 +0200 Subject: [PATCH v2 3/4] ffmpeg: Deprecate display rotation override with a metadata key Now that we have proper options for defining display matrix overrides, this should no longer be required. fftools does not have its own versioning, so for now the define is just set to 1 and disables the functionality if set to zero. --- fftools/ffmpeg.c | 2 ++ fftools/ffmpeg.h | 5 +++++ fftools/ffmpeg_opt.c | 10 ++++++++++ 3 files changed, 17 insertions(+) diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 8eb7759392..b0a8839129 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -2824,12 +2824,14 @@ static int init_output_stream_streamcopy(OutputStream *ost) } } +#if FFMPEG_ROTATION_METADATA if (ost->rotate_overridden) { uint8_t *sd = av_stream_new_side_data(ost->st, AV_PKT_DATA_DISPLAYMATRIX, sizeof(int32_t) * 9); if (sd) av_display_rotation_set((int32_t *)sd, -ost->rotate_override_value); } +#endif switch (par->codec_type) { case AVMEDIA_TYPE_AUDIO: diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index 0ea730fd42..12125ac006 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -53,6 +53,7 @@ #define FFMPEG_OPT_PSNR 1 #define FFMPEG_OPT_MAP_CHANNEL 1 #define FFMPEG_OPT_MAP_SYNC 1 +#define FFMPEG_ROTATION_METADATA 1 enum VideoSyncMethod { VSYNC_AUTO = -1, @@ -520,11 +521,15 @@ typedef struct OutputStream { const char *fps_mode; int force_fps; int top_field_first; +#if FFMPEG_ROTATION_METADATA int rotate_overridden; +#endif int autoscale; int bitexact; int bits_per_raw_sample; +#if FFMPEG_ROTATION_METADATA double rotate_override_value; +#endif AVRational frame_aspect_ratio; diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c index e184b4239c..f6551621c3 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -2930,16 +2930,26 @@ static void of_add_metadata(AVFormatContext *oc, const OptionsContext *o) for (int j = 0; j < oc->nb_streams; j++) { OutputStream *ost = output_streams[nb_output_streams - oc->nb_streams + j]; if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) { +#if FFMPEG_ROTATION_METADATA if (!strcmp(o->metadata[i].u.str, "rotate")) { char *tail; double theta = av_strtod(val, &tail); if (!*tail) { ost->rotate_overridden = 1; ost->rotate_override_value = theta; + + av_log(NULL, AV_LOG_WARNING, + "Conversion of a 'rotate' metadata key to a " + "proper display matrix rotation is deprecated. " + "See -display_matrix for setting rotation " + "instead."); } } else { +#endif av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0); +#if FFMPEG_ROTATION_METADATA } +#endif } else if (ret < 0) exit_program(1); } From patchwork Mon Aug 15 20:02:19 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thilo Borgmann X-Patchwork-Id: 37298 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3d0d:b0:8d:a68e:8a0e with SMTP id y13csp1468135pzi; Mon, 15 Aug 2022 13:02:38 -0700 (PDT) X-Google-Smtp-Source: AA6agR7XFhGW4UoN4qO48jM7EFzvociFN1w2YE/krC2AbkJ+lEvsQiYf10YtQGn98xDSRm51RFfA X-Received: by 2002:a05:6402:28ca:b0:43b:5235:f325 with SMTP id ef10-20020a05640228ca00b0043b5235f325mr15754262edb.320.1660593757766; Mon, 15 Aug 2022 13:02:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660593757; cv=none; d=google.com; s=arc-20160816; b=LJ5+2e7B4sYTyc4roD4CkNwQLKKzFBcilyGLMXM4eBCkBGhQlJwjyijt3pIs8Q9GJo 62bZOeHocA6y65sK9dmKC8zad0Jii/SVt2yx4Fc+x7K2gM6cHjMMK/2BYjujeh5xxpzx 0P6lapLJgz1NGD1EzBNokL5rVbXDJSrAO4kcBUz4TYVlvC9lVYXMEdKuDQIx3ysr5P8C O4p151mfbCMmH5bv+0qUZjT2S3MTWGL1Or95uP+c0n2shY7DZ4PI81j5Lof3nkCQabjR TV+CynHXABpHvxyPp9UzidSg25HcpI/woPJ7riwL92WaufWXHTcv9vZIJrKRq1nlCvld JFEg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :in-reply-to:from:references:to:content-language:mime-version:date :message-id:dkim-signature:delivered-to; bh=Yse6mnFHDSH3MpaBExbhyULAMUh1WiTBe9gC3UhLb1U=; b=mAXRlxQhlsIEUcRLoXEfET5ObidJmkA+WPBkNsuxcISG0XlPiq6M4jA3r5Amta+V6D 2qDG5TzPjqEKwmFQ7ka3oxzNKaX5lDWp/OiQLA+lvfMk8jHQkT2vq8d7YM17U2XRuYOh aBQEKmShKpNeW8mhljkCBNfgozTrL6dyLVnq5O3zKxYHAeZQMGLovXfGwaVshVxRRzn9 ekcmd0CpmbGIYLRfx2pJjb6+z91+9KXTsiSwQ9eWPBk4QT2NaMK2Ne12nd2HDLZL5XJE HcHba0BQMVmqXve0137CcVm2EGr2pqlfepgCyj44j1E74HrjsTyPgYdf+QEj5v/O7PGt wJAw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@mail.de header.s=mailde202009 header.b=ip5MRHGZ; 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=NONE dis=NONE) header.from=mail.de Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id p1-20020a17090653c100b00730c1ae0a9dsi7267794ejo.444.2022.08.15.13.02.37; Mon, 15 Aug 2022 13:02:37 -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=@mail.de header.s=mailde202009 header.b=ip5MRHGZ; 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=NONE dis=NONE) header.from=mail.de Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4DE3068B97E; Mon, 15 Aug 2022 23:02:27 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from shout01.mail.de (shout01.mail.de [62.201.172.24]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3AC9168B93A for ; Mon, 15 Aug 2022 23:02:21 +0300 (EEST) Received: from postfix03.mail.de (postfix03.bt.mail.de [10.0.121.127]) by shout01.mail.de (Postfix) with ESMTP id D93FCA0937 for ; Mon, 15 Aug 2022 22:02:20 +0200 (CEST) Received: from smtp02.mail.de (smtp02.bt.mail.de [10.0.121.212]) by postfix03.mail.de (Postfix) with ESMTP id BEBF1801EC for ; Mon, 15 Aug 2022 22:02:20 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=mail.de; s=mailde202009; t=1660593740; bh=h0bSIKiR34my9WUOXGvAidRbf1ZFWp3cVwWTXK+vNIY=; h=Message-ID:Date:Subject:To:From:From:To:CC:Subject:Reply-To; b=ip5MRHGZtwqBktN/pPyuDvxaj2/2Vm9O3RIMQT8I5U8BMpu+qErniC8CkhkssWPH3 nGttZc6aCubhm/RxFugv7I11y0nm7Z9NLP4sjOVqw86Ltx91gatpeWVGKjW9f0r9OH xX7PzmZxplmSuNctqsaPj/WR70rhfZZILneRZtHzr7f8Mw1mr3/2EoJps/ii7prqyh EyHIINR+mRvkAqau35gNqvUs6mIb6FO0/cW5uvjup2JGL9bnQjmVueN1ib4a+C5CoI yWj/yi8ffbjTI4YaSVsEcdLXCVxnhGt7tn3jqFc41x0Xudmp0Xc7MMbO9xnTg1fr0s 870ipa6II78bQ== Received: from [127.0.0.1] (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by smtp02.mail.de (Postfix) with ESMTPSA id 93700A04B6 for ; Mon, 15 Aug 2022 22:02:20 +0200 (CEST) Message-ID: Date: Mon, 15 Aug 2022 22:02:19 +0200 MIME-Version: 1.0 Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: From: Thilo Borgmann In-Reply-To: X-purgate: clean X-purgate: This mail is considered clean (visit http://www.eleven.de for further information) X-purgate-type: clean X-purgate-Ad: Categorized by eleven eXpurgate (R) http://www.eleven.de X-purgate: This mail is considered clean (visit http://www.eleven.de for further information) X-purgate: clean X-purgate-size: 5699 X-purgate-ID: 154282::1660593740-0000737C-BA0F36A9/0/0 Subject: [FFmpeg-devel] [PATCH v2 4/4] ffmpeg: Allow printing of option arguments in help output 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 6EX9Wk2n6Abc $subject -Thilo From 33abe03ac137bd1e4bf4af90731ec177d34298a8 Mon Sep 17 00:00:00 2001 From: Thilo Borgmann Date: Mon, 15 Aug 2022 21:00:18 +0200 Subject: [PATCH v2 4/4] ffmpeg: Allow printing of option arguments in help output --- fftools/cmdutils.c | 5 +++++ libavutil/opt.c | 14 +++++++++++++- libavutil/opt.h | 8 ++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c index 22ba654bb0..dae018f83a 100644 --- a/fftools/cmdutils.c +++ b/fftools/cmdutils.c @@ -172,6 +172,11 @@ void show_help_options(const OptionDef *options, const char *msg, int req_flags, av_strlcat(buf, po->argname, sizeof(buf)); } printf("-%-17s %s\n", buf, po->help); + + if (po->args) { + const AVClass *p = po->args; + av_arg_show(&p, NULL); + } } printf("\n"); } diff --git a/libavutil/opt.c b/libavutil/opt.c index a3940f47fb..89ef111690 100644 --- a/libavutil/opt.c +++ b/libavutil/opt.c @@ -1256,7 +1256,7 @@ static void opt_list(void *obj, void *av_log_obj, const char *unit, av_log(av_log_obj, AV_LOG_INFO, " %-15s ", opt->name); else av_log(av_log_obj, AV_LOG_INFO, " %s%-17s ", - (opt->flags & AV_OPT_FLAG_FILTERING_PARAM) ? " " : "-", + (opt->flags & (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_ARGUMENT)) ? " " : "-", opt->name); switch (opt->type) { @@ -1329,6 +1329,7 @@ FF_ENABLE_DEPRECATION_WARNINGS av_log(av_log_obj, AV_LOG_INFO, "%-12s ", ""); break; } + if (!(opt->flags & AV_OPT_FLAG_ARGUMENT)) { av_log(av_log_obj, AV_LOG_INFO, "%c%c%c%c%c%c%c%c%c%c%c", (opt->flags & AV_OPT_FLAG_ENCODING_PARAM) ? 'E' : '.', (opt->flags & AV_OPT_FLAG_DECODING_PARAM) ? 'D' : '.', @@ -1341,6 +1342,7 @@ FF_ENABLE_DEPRECATION_WARNINGS (opt->flags & AV_OPT_FLAG_BSF_PARAM) ? 'B' : '.', (opt->flags & AV_OPT_FLAG_RUNTIME_PARAM) ? 'T' : '.', (opt->flags & AV_OPT_FLAG_DEPRECATED) ? 'P' : '.'); + } if (opt->help) av_log(av_log_obj, AV_LOG_INFO, " %s", opt->help); @@ -1456,6 +1458,16 @@ int av_opt_show2(void *obj, void *av_log_obj, int req_flags, int rej_flags) return 0; } +int av_arg_show(void *obj, void *av_log_obj) +{ + if (!obj) + return -1; + + opt_list(obj, av_log_obj, NULL, AV_OPT_FLAG_ARGUMENT, 0, -1); + + return 0; +} + void av_opt_set_defaults(void *s) { av_opt_set_defaults2(s, 0, 0); diff --git a/libavutil/opt.h b/libavutil/opt.h index 461b5d3b6b..dce3483237 100644 --- a/libavutil/opt.h +++ b/libavutil/opt.h @@ -297,6 +297,7 @@ typedef struct AVOption { #define AV_OPT_FLAG_FILTERING_PARAM (1<<16) ///< a generic parameter which can be set by the user for filtering #define AV_OPT_FLAG_DEPRECATED (1<<17) ///< set if option is deprecated, users should refer to AVOption.help text for more information #define AV_OPT_FLAG_CHILD_CONSTS (1<<18) ///< set if option constants can also reside in child objects +#define AV_OPT_FLAG_ARGUMENT (1<<19) ///< set if option is an argument to another option //FIXME think about enc-audio, ... style flags /** @@ -386,6 +387,13 @@ typedef struct AVOptionRanges { */ int av_opt_show2(void *obj, void *av_log_obj, int req_flags, int rej_flags); +/** + * Show the obj arguments. + * + * @param av_log_obj log context to use for showing the options + */ +int av_arg_show(void *obj, void *av_log_obj); + /** * Set the values of all AVOption fields to their default values. *