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++; }