From patchwork Mon Sep 19 09:46:01 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Thilo Borgmann X-Patchwork-Id: 38043 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3b1c:b0:96:9ee8:5cfd with SMTP id c28csp1112859pzh; Mon, 19 Sep 2022 02:46:46 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4umbk4BdhYKvW/IbR9BQaY53Kdfl/DutMVT/7y3geKmtsAMnZ0numFztvezOswjNEwbtw0 X-Received: by 2002:a17:906:8463:b0:771:a3d2:7c3 with SMTP id hx3-20020a170906846300b00771a3d207c3mr11642226ejc.592.1663580806247; Mon, 19 Sep 2022 02:46:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1663580806; cv=none; d=google.com; s=arc-20160816; b=wdLo+sFuqXtA4zqt9d1QprYPG17zv0d6NjWzTzrI6w/YBroeHNWCVDi0gS5g7AY4me V67BLHRYusdXRj+l5YPhp3NYHmnVm6jrmscT9J8KoDBz2OIQOU+S9kEuiA0oEhIqCaHU O3jHlTfpWzqIyvqtVJpk8QVijMJHPAoUbtVlrubyOGkJVgQRfF3jdW//KeQbHDC8Pq+7 S6CTXp9/wpRdFbitJ9jdKxt5MeP2Qjq/6LMG0rkaa6JquidQk/pvnW4tOK20NpDZ0eGl 9VYr5CQIqTBRxD98YLTrNRPDm9I4FsFOKaWmLSr5OkEbKjzuYtwZUhdLocXRPo8v46CH H6jg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding: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=IgYR2fnVnQ19x5vle1CU2Ll2jv2XtMhXW2mx0r/E+3I=; b=Dae4GGYTmPK9wVvY5FutN/6dNJIuGyx5PGa0yFvT7v3aPQx5pDSiZFCFMTXdXWBhZx IlQ6xhvsYb0s8iV7REKyC5ftjG9wB8vpseG2bZEHCvMb4lZaKL9gwkoXUe9fv/PW3X9a f4Ft3FxAQfC+k4hl+nY1LEjp9MhbADqli9BC1bi1ygj+QHjPVg5esX2S+3Log3B+at86 N8Iek7N3onF/G+426aJpQRcTXBSoqoVBt63IQldhdxxBj2WhDkS/JdKrZwglp5mhXxva jinXly/gCiZUO5P3brbbrYWB4JMEI239KSwbR3/zw6IECkLkeWvHD+A2GNBqykCX3d9f lDhw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@mail.de header.s=mailde202009 header.b=ivAVMgA0; 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 e2-20020a50d4c2000000b00450fda68304si8588032edj.349.2022.09.19.02.46.45; Mon, 19 Sep 2022 02:46:46 -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=ivAVMgA0; 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 848D068BC58; Mon, 19 Sep 2022 12:46:16 +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 B273868BB03 for ; Mon, 19 Sep 2022 12:46:06 +0300 (EEST) Received: from postfix01.mail.de (postfix01.bt.mail.de [10.0.121.125]) by shout02.mail.de (Postfix) with ESMTP id 58636A0C35 for ; Mon, 19 Sep 2022 11:46:06 +0200 (CEST) Received: from smtp01.mail.de (smtp01.bt.mail.de [10.0.121.211]) by postfix01.mail.de (Postfix) with ESMTP id 412998014F for ; Mon, 19 Sep 2022 11:46:06 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=mail.de; s=mailde202009; t=1663580766; bh=ZTDAmqLc/pEcnWwsulzSAVDNiBLnxOJjf26zaht+63E=; h=From:To:Subject:Date:Message-Id:From:To:CC:Subject:Reply-To; b=ivAVMgA0uQClgnb0cD7UQpnAGnfJHlNhvs2fSUe3i0HM21zFVkBKc8OomeK+aypfG If0KFVbGY5FrWSXJtVa/8TrPDMPhS7vEY8fb7fA1AL3oSAn2Cqe1lgqYaEW4no7V+R 2Z9piIeTZjf/RYvu1LMKrPcC7zsHfYvL06Pz2kgaile4M0JrzS0WTLSQyJ4t/xAmyk 9NAdtPv9NyymDlJm9+ISCAQnhLLxcSII1ZysmpKM5SewdTyHk5YgdSWacjQyvjJJHV 7bPAZKZuTaKaaDHrsjhJ+jjZD8nX1McNKAuhiDZmx8K5ylrIB7ShWmOYFKcsRThITh zpSRkvg5DxoJQ== 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 smtp01.mail.de (Postfix) with ESMTPSA id 0528A10015D for ; Mon, 19 Sep 2022 11:46:05 +0200 (CEST) From: Thilo Borgmann To: ffmpeg-devel@ffmpeg.org Date: Mon, 19 Sep 2022 11:46:01 +0200 Message-Id: <20220919094604.4645-4-thilo.borgmann@mail.de> In-Reply-To: <20220919094604.4645-1-thilo.borgmann@mail.de> References: <20220919094604.4645-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: 5044 X-purgate-ID: 154282::1663580766-CD7F95FC-F4435AE4/0/0 Subject: [FFmpeg-devel] [PATCH v4 3/6] 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: nncZ0YvBgLAl From: Jan Ekström --- fftools/cmdutils.c | 17 +++++++++++++++++ fftools/cmdutils.h | 2 ++ fftools/ffmpeg_opt.c | 29 ++++++++++++++++++++++++++--- 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c index b6dd73902b..f918d83854 100644 --- a/fftools/cmdutils.c +++ b/fftools/cmdutils.c @@ -137,6 +137,21 @@ 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) { @@ -299,6 +314,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 2f469f8c25..c7a4628191 100644 --- a/fftools/cmdutils.h +++ b/fftools/cmdutils.h @@ -140,6 +140,7 @@ typedef struct SpecifierOpt { uint64_t ui64; float f; double dbl; + AVDictionary *dict; } u; } SpecifierOpt; @@ -168,6 +169,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 5febe319e4..be1cd673f6 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -62,6 +62,21 @@ #define SPECIFIER_OPT_FMT_ui64 "%"PRIu64 #define SPECIFIER_OPT_FMT_f "%f" #define SPECIFIER_OPT_FMT_dbl "%lf" +#define SPECIFIER_OPT_FMT_dict "%s" + +static char* specifier_opt_func_dict(char **valstr, AVDictionary *val) { + int ret; + ret = av_dict_get_string(val, valstr, '=', ':'); + return (ret < 0) ? NULL : *valstr; +} + +#define SPECIFIER_OPT_FUNC_str(val) val +#define SPECIFIER_OPT_FUNC_i(val) val +#define SPECIFIER_OPT_FUNC_i64(val) val +#define SPECIFIER_OPT_FUNC_ui64(val) val +#define SPECIFIER_OPT_FUNC_f(val) val +#define SPECIFIER_OPT_FUNC_dbl(val) val +#define SPECIFIER_OPT_FUNC_dict(val) specifier_opt_func_dict(&valstr, val) 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}; @@ -114,11 +129,13 @@ static const char *const opt_name_bits_per_raw_sample[] = {"bits_per_raw_s #define WARN_MULTIPLE_OPT_USAGE(name, type, so, st)\ {\ char namestr[128] = "";\ + char *valstr = NULL;\ const char *spec = so->specifier && so->specifier[0] ? so->specifier : "";\ for (i = 0; opt_name_##name[i]; i++)\ av_strlcatf(namestr, sizeof(namestr), "-%s%s", opt_name_##name[i], opt_name_##name[i+1] ? (opt_name_##name[i+2] ? ", " : " or ") : "");\ av_log(NULL, AV_LOG_WARNING, "Multiple %s options specified for stream %d, only the last option '-%s%s%s "SPECIFIER_OPT_FMT_##type"' will be used.\n",\ - namestr, st->index, opt_name_##name[0], spec[0] ? ":" : "", spec, so->u.type);\ + namestr, st->index, opt_name_##name[0], spec[0] ? ":" : "", spec, SPECIFIER_OPT_FUNC_##type(so->u.type));\ + av_freep(&valstr);\ } #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\ @@ -208,11 +225,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++; }