From patchwork Tue Aug 16 13:30:42 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Thilo Borgmann X-Patchwork-Id: 37313 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3d0d:b0:8d:a68e:8a0e with SMTP id y13csp1867815pzi; Tue, 16 Aug 2022 06:31:03 -0700 (PDT) X-Google-Smtp-Source: AA6agR6+qp/Pf483vrcAgqbdxndPLyIwhydhSGgCPc/V3PS3X4ZHEKhCpkLVVuqeSD6JnDD6PoA5 X-Received: by 2002:a17:907:94d6:b0:730:bfe6:8352 with SMTP id dn22-20020a17090794d600b00730bfe68352mr13364949ejc.348.1660656663361; Tue, 16 Aug 2022 06:31:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660656663; cv=none; d=google.com; s=arc-20160816; b=DMsi0mk/DWxEc40eZZMVP6O1ZpajKeogEsXBWnVE64+oiZEgB+EEGLjcNQtZiO9/tB gVhl/iNH+tRAnAjIwNC7gf3N1grkbM7nPP/dFALPUBs0i60GCrzfvbe38puIJVK9HXlS Fo2SXYXYVh/uxuz1nnbCMtGYQ1ex+6lvYE6TfVBuf3M8FdSUuzQ65TnW+HRdeA2I/2X8 QXB7iaIrjoqjpn8dnCn8aMQ/jOYMKQX2/Psz8KyqY7FJb6RKtiX7/HbsrU/MERfLWyrE beuijni85GuROBJ0GSV6nDizl5M7nd2L1DJthC9c31OhIcyHDyRgYmT6k1nj+kFCYXPa Seug== 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:message-id:date:to:from :dkim-signature:delivered-to; bh=QG2215PAkAZZNX4RF/pm7Wbv2RymcmD+/fc1rFZj9h8=; b=kf05ORJdmWcMbvrRD+QNSGoB6a1KGlh+2lwHc4aW87u2wQuW3hV3in0OOA/JY+T2Hr 0h22cgW4MtrhE0/xhRuuoJ05dWgdf8tfdK612oyrq7vBs1cFYuwJZF20ApN55DDdeJVV EqbsWrLPzcUfCuERDjBjXfGuL0bMJo5AU58Fsl/yjW355iuD4UDZtKXWXO4p2K9q4Sff owi4lOcJVMGqlkq2M5aLMLTPVs/GnXMtKoMMZSb8ne7tk+rymexYHAmh2fyXWETnlI47 v7HDUgYtPgo0QbyT8KTLrgOSzyABdfTE3bxuLXyup5MDz71STXoZkTC340DwWCuLWeKz xPqA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@mail.de header.s=mailde202009 header.b="ljmD+5/r"; 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 b3-20020a0564021f0300b00443367b756bsi8867032edb.194.2022.08.16.06.31.02; Tue, 16 Aug 2022 06:31:03 -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="ljmD+5/r"; 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 96D8068B876; Tue, 16 Aug 2022 16:30:58 +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 E7CD668B205 for ; Tue, 16 Aug 2022 16:30:51 +0300 (EEST) Received: from postfix02.mail.de (postfix02.bt.mail.de [10.0.121.126]) by shout02.mail.de (Postfix) with ESMTP id 97795A0340; Tue, 16 Aug 2022 15:30:51 +0200 (CEST) Received: from smtp04.mail.de (smtp04.bt.mail.de [10.0.121.214]) by postfix02.mail.de (Postfix) with ESMTP id 7CD2BA03C3; Tue, 16 Aug 2022 15:30:51 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=mail.de; s=mailde202009; t=1660656651; bh=xfxpkNGgMjxrmuJfUcBHz0zRShF9+l/QWkIdix6vdc0=; h=From:To:Cc:Subject:Date:Message-Id:From:To:CC:Subject:Reply-To; b=ljmD+5/rjII8jTPcOJFNbxzHupB9B3Kca3L8e0RCICyhNbdUA3PuwSWaJfuUgmMFT SZzD5PMr4V26c2xc07jWT9MrhGUmwQz+DQsRZLhW+Rfi1g61cvec42H12qxIJG5jix agfRk86mx6E8YUuoyIexy96T5qhmSY78KslFCBIFGub476L3Mt+MQvT1LQW5Hk5qWY ynxhkkqkQM1CGK1YPGp8KsuFw9txvghcSlKQREajZ6Wikb9gza+zsRIxOXzEk3Hgxy 7N0NQlTgn9ukUfJFe7eV+QPeqOf/EEPgBeIyuNbqryna2IAiDrsq/vbSAnqAzZwnG3 VyYez5vcfrRXw== Received: from [127.0.0.1] (localhost [127.0.0.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp04.mail.de (Postfix) with ESMTPSA id 37B68C1338; Tue, 16 Aug 2022 15:30:50 +0200 (CEST) From: Thilo Borgmann To: ffmpeg-devel@ffmpeg.org Date: Tue, 16 Aug 2022 15:30:42 +0200 Message-Id: <20220816133046.70846-1-thilo.borgmann@mail.de> MIME-Version: 1.0 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: 3535 X-purgate-ID: 154282::1660656651-000016C9-A69E3EFB/0/0 Subject: [FFmpeg-devel] [PATCH 1/5] 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 Cc: =?utf-8?q?Jan_Ekstr=C3=B6m?= Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: qjKg/mSdeqJh From: Jan Ekström --- 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++; }