From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id B6B68411CA for ; Thu, 17 Mar 2022 15:30:16 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D3B7A68AA68; Thu, 17 Mar 2022 17:30:13 +0200 (EET) Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-oln040092073067.outbound.protection.outlook.com [40.92.73.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2F0FE68020D for ; Thu, 17 Mar 2022 17:30:07 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=oTy5+/aSM6u1R/MF20AHCnLvJmTcmVGdTkL/PmHE91H1jhC/dbyXvNdzTdnMmHpz6rWeHaw8h/NCwzx6d1sj8Bngdd99YevdQfMGeW9Qjv23g+gMk/EI6hTJVpjbIB7SUM8riGbgrMclZ2V3VWupFDSh82MXBxSSU2kSDG2iTf6karzCWmnbqRaSfPsprZW8Rur52zGGvMKyrUj/Bnj+o2gUjEhEkQO17CcHzh5BqEczH1abivyoZ5PFY7EdXa37LLYI3Guz+Du4fPhFOr/QD4Qlq1kKcTjgb7xQZcNlYLmV6VZ69RYysWLA6tKz+PGLxT0WDuYAyI/FaZ1m06qPRw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=RYiOqYKh99qB5s/fj8za68FX5lLXR7fOnDI1fV8K2Ho=; b=jEfMwpdIstgvrWDDeCVlJKi2w4794l6gCFMe7wl1cfHFXr571O2sDS5hkr5sfA/CnJlzdigT7goszEUDltF1LK3Kkno/rwePI+irVPYMjJieEIVUl/phZGjaWegM2uHXZhHnbnzWUJFyEMZjO2RzV6muYLDXjbleA7ujdO5JI8z7+Nrx8KT4MsDL2hgoHJk7d7TvLjl6FnIKWpq+ysdGCYbDmMHPm8GGAvMIPauZrV1Q1ekNhI0aQQy5pnoG6ytUFk0ZRYzoiXXdE3BcPb1LLW1HqKMOgr0ksAhZvNruZtjk86E5eZH5iCtz9f4ppaPbHy9nXznSyxMThtx0B4H4OQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=RYiOqYKh99qB5s/fj8za68FX5lLXR7fOnDI1fV8K2Ho=; b=AugADPrMVIwBaLwKMtDSVHPcEkpp9nIqNydPY5Jw24I5HIwJZDoIWD43gf7dzJ9sw6xs2YlVB/bjgUBrhRAlfCloh/tRrP7DfhC87gv4LYIKNN4I3t15UMfd8FEhl4q0z4mpg1W5Re8NovXS0i6m7Q+c0D2KMjq0c6oZfz65kyfrd6oWtW0Uq2rnIbjmpfDH51lLX0Kc7NRrKarpSyl8gHBXKUqEddtb17wf1W9WeZyKPcTHL53pvjcBlG50gEb0kAp/66ShuhUawCwRn1tjoG6pxsH+9V/ukgSFicCzF20LOWoU9vE3ZK1q/AxS8qgSIXFgKf90kDPYMQJFtLxefw== Received: from AS1PR01MB9564.eurprd01.prod.exchangelabs.com (2603:10a6:20b:4d1::16) by DB8PR01MB6295.eurprd01.prod.exchangelabs.com (2603:10a6:10:155::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5081.14; Thu, 17 Mar 2022 15:30:05 +0000 Received: from AS1PR01MB9564.eurprd01.prod.exchangelabs.com ([fe80::9070:a5fd:e532:bdf8]) by AS1PR01MB9564.eurprd01.prod.exchangelabs.com ([fe80::9070:a5fd:e532:bdf8%3]) with mapi id 15.20.5081.016; Thu, 17 Mar 2022 15:30:05 +0000 Message-ID: Date: Thu, 17 Mar 2022 16:30:04 +0100 Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: <20220315090532.27295-1-anton@khirnov.net> <20220315090532.27295-4-anton@khirnov.net> From: Andreas Rheinhardt In-Reply-To: <20220315090532.27295-4-anton@khirnov.net> X-TMN: [6DCWH6NunIxiGhQGjJ5OSp71Zy/IspAT] X-ClientProxiedBy: AS8PR04CA0100.eurprd04.prod.outlook.com (2603:10a6:20b:31e::15) To AS1PR01MB9564.eurprd01.prod.exchangelabs.com (2603:10a6:20b:4d1::16) X-Microsoft-Original-Message-ID: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 1e77171d-cfdb-4ef6-2159-08da082b02cb X-MS-TrafficTypeDiagnostic: DB8PR01MB6295:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: NjrPHE127YBdCJpbRJtcQo4jN87jLFbHviS0vZRv9aIgMH+vaNf86fZ90aUl77gMlqpnOQ0BPq9q3sCYDAFOd6mTBguhJMutdLSi+Wy86SysCzNUqJgGpDQWS6F/+CWl0rBxLqQRJJxcnOrxRQqACQCxiNwZOx50/gj1KBxHj9iTlT37jVe1jJjdW8ObQ+D+T/cGtAw8J5JN9Olxy5/f390bM/CXVcrwcIgckTwHnSW9G7OTT6Tpk36umpvLbhZniZuAJFiGTmgsChSzwYsBNp4sB0nzSEpqMX51TsjIpaMS+RQJExW+ExQ3ZOzE54uI8Hc+469CueXWQmrr91WnRNIHclsxdDh0E3tDTpbcg9n97b96BsPNFlVmmMsIbO1iFiQn2peACL/9ZHiZc5CVHLH53OSgKKXtDvwH7cmTTgsMknDHxqh/he1hgry9bswyoXSe1YB596dCosOyEy3spPrsOpRPM8+u3JcgGcmMtm8HTpi8nSad8nz+4kNoEz29NIlO3PRMBWayNLpFoET6B47iqREWivu1jTQZxR/m2kRTZFUNo4KfMQldKn3NocZjB6rdOSJomLRTB0AEgVmofg== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?di9Od3U1bWRwbTB3K3N5ODJaN3FSMFRTR0pTVnpXMFRqSDRoRG9FY25McGxJ?= =?utf-8?B?N1VkY0E4dThIYVM2NkhubFNPb1RoUVZHRVUvRG0yQk5BbDN1dGhGMkU3MG44?= =?utf-8?B?Yy9rUnM0T3lmWTBpZjVzaFdzVHpqaURnUVhEMFMrV2YwQ3JDRjBxN1NEU2wy?= =?utf-8?B?bUEwZ2hVZ2I3cVc2bkZDRzc5WDZyeUZaWVVDVzJEM082cGhkZXNFZnloMHEx?= =?utf-8?B?cGRpaG9lSXIvQjNwd1h2S2puY1haenBxWW00SC9VdTNZbkYzS21kaW9DMFU0?= =?utf-8?B?LzZMRk9JaFVXZC9rNURNQVlKblZLNkhwSkgwWHAvMTVPQk5FLzZQd3pZUGJM?= =?utf-8?B?eS82dVRNQUsxZFdxQnRFTVRJMTEzbEZPbnMzTHhZWU1UbitnNys4aFJvWDZL?= =?utf-8?B?dldlVlg3SDJUOW5KUTVRdUwvc3hTU0JsZTl2S0FvMnM1bE1PSytEd0xOazVp?= =?utf-8?B?S2ZndTVpSGZLZDN0OTNuWllZZG9tYmxzeThNQnhHYUFGcTBGL2o2dFVpSm4r?= =?utf-8?B?K2JpY2g4NEoyVWdlcEdVWDVXdVArOExBZlhRODN5QlVGV3ViMG5NYnhqMmFn?= =?utf-8?B?a3h6dHJwRzUvb0c2MHltZlFLMnBmMGJDTjBXejgzZElXaDkrUVl4c2ZkWTk3?= =?utf-8?B?VEtNanVOZ25vd09YcjhjQTJWY0F4SXo0NTlWaGJTTkN3dDBYczlEbXZNKzRI?= =?utf-8?B?dVk0VWF0UjFKK2FObGtXZGJHYmRGRkVhMkNGTC9xUDkxYUhGdzNwS1FkV0Zl?= =?utf-8?B?U3I1ZVhWR1FqWHNCM3hGeHlOMDB2RG1RcXBNK2QxWDJkeS83alplZjJCYWxV?= =?utf-8?B?aWNUTXZGR3JDQlFmMGZNbDZVdW1KVVlEZkpxN3BXUFlLZGw4UVU0emFlUkp2?= =?utf-8?B?Ynl2c044Tmk3Mm1JSFZQcEk4VmFxdGx5NitjeEFvUmdCZlUwK3oxNG5hcXZY?= =?utf-8?B?MEtQcmtSUFFCVmVFT1ZzWHNqM1k0eGFFcFJNc2U4MnRkeEdxdnNJWElZMmJt?= =?utf-8?B?UDVyejRlaS9Uem5IN2c5Wlh6VlZudlJpNkl6YmNLQW5XcHlUdjlxUy9HZGhS?= =?utf-8?B?RnZnSEVrSXNlYUNuSGFzeDJkSUU4QUlGUGxUNzdBRkxldzdNNVdiN3hJNmVY?= =?utf-8?B?SVR3enJqUU1JTDk3ZmgycXFzMllDVWkwNmNXWFJOeXNPcS8wNTZWa3FFNE5Q?= =?utf-8?B?a0hXTkNMbnpmNkZYMU9EK1lBcEVJM1pFTjY0eTJ4U1RSbHdEdE1zSi9ScWlC?= =?utf-8?B?ZnZwZEsvN1JiUGlHajdVSGYvODFjeEg5TTg1ZE9DR2xkVkR3NUo2T2EyR0Na?= =?utf-8?B?aHFoSEEvdndEMndYbHNHKy9VMk4zSUEzSTd1WGgvaTRHSHJRbjVoaytMWXAw?= =?utf-8?B?T2tJQVdNVzNIeUZmUHRTS1NtclhQdGoxTzYxNnZIWTMwdy83MWRLd3dOeE9l?= =?utf-8?B?aEN2SUFzSVo3ZnArMHRIY0NQaU5VV0lIVklwMUFJQ1BsS1RVZlhlUlpiZ21G?= =?utf-8?B?Q3lKK1BGdmJlUDdBU3RZQXR6SzdQOW5qR1VDbFMwRkN5VjYyM3lLd2oyQzhG?= =?utf-8?Q?tQLQ+j6OQb1Kn0UYfmsP23ZSgmm+7LRHOOxP3dMr3ygB77?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1e77171d-cfdb-4ef6-2159-08da082b02cb X-MS-Exchange-CrossTenant-AuthSource: AS1PR01MB9564.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Mar 2022 15:30:05.2641 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB8PR01MB6295 Subject: Re: [FFmpeg-devel] [PATCH 04/10] fftools/cmdutils: split common option handlers into their own file 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Anton Khirnov: > --- > fftools/Makefile | 2 +- > fftools/cmdutils.c | 1399 +-------------- > fftools/cmdutils.h | 202 --- > fftools/ffmpeg_opt.c | 1 + > fftools/ffplay.c | 1 + > fftools/ffprobe.c | 1 + > fftools/{cmdutils.c => opt_common.c} | 2450 ++++++++------------------ > fftools/opt_common.h | 231 +++ > 8 files changed, 985 insertions(+), 3302 deletions(-) > copy fftools/{cmdutils.c => opt_common.c} (60%) > create mode 100644 fftools/opt_common.h Very weird stats. When I apply this, I get: fftools/Makefile | 2 +- fftools/cmdutils.c | 1399 +------------------------------------------------ fftools/cmdutils.h | 202 ------- fftools/ffmpeg_opt.c | 1 + fftools/ffplay.c | 1 + fftools/ffprobe.c | 1 + fftools/opt_common.c | 1445 +++++++++++++++++++++++++++++++++++++++++++++++++++ fftools/opt_common.h | 231 ++++++++ 8 files changed, 1685 insertions(+), 1597 deletions(-) > +#if CONFIG_AVFILTER > +static void show_help_filter(const char *name) > +{ > +#if CONFIG_AVFILTER > + const AVFilter *f = avfilter_get_by_name(name); > + int i, count; > + > + if (!name) { > + av_log(NULL, AV_LOG_ERROR, "No filter name specified.\n"); > + return; > + } else if (!f) { > + av_log(NULL, AV_LOG_ERROR, "Unknown filter '%s'.\n", name); > + return; > + } > + > + printf("Filter %s\n", f->name); > + if (f->description) > + printf(" %s\n", f->description); > > - printf(" Supported framerates:"); > - while (fps->num) { > - printf(" %d/%d", fps->num, fps->den); > - fps++; > - } > - printf("\n"); > + if (f->flags & AVFILTER_FLAG_SLICE_THREADS) > + printf(" slice threading supported\n"); > + > + printf(" Inputs:\n"); > + count = avfilter_filter_pad_count(f, 0); > + for (i = 0; i < count; i++) { You can use a local loop variable here and in several other places here. > + printf(" #%d: %s (%s)\n", i, avfilter_pad_get_name(f->inputs, i), > + av_get_media_type_string(avfilter_pad_get_type(f->inputs, i))); > } > - PRINT_CODEC_SUPPORTED(c, pix_fmts, enum AVPixelFormat, "pixel formats", > - AV_PIX_FMT_NONE, GET_PIX_FMT_NAME); > - PRINT_CODEC_SUPPORTED(c, supported_samplerates, int, "sample rates", 0, > - GET_SAMPLE_RATE_NAME); > - PRINT_CODEC_SUPPORTED(c, sample_fmts, enum AVSampleFormat, "sample formats", > - AV_SAMPLE_FMT_NONE, GET_SAMPLE_FMT_NAME); > - PRINT_CODEC_SUPPORTED(c, channel_layouts, uint64_t, "channel layouts", > - 0, GET_CH_LAYOUT_DESC); > + if (f->flags & AVFILTER_FLAG_DYNAMIC_INPUTS) > + printf(" dynamic (depending on the options)\n"); > + else if (!count) > + printf(" none (source filter)\n"); > > - if (c->priv_class) { > - show_help_children(c->priv_class, > - AV_OPT_FLAG_ENCODING_PARAM | > - AV_OPT_FLAG_DECODING_PARAM); > + printf(" Outputs:\n"); > + count = avfilter_filter_pad_count(f, 1); > + for (i = 0; i < count; i++) { > + printf(" #%d: %s (%s)\n", i, avfilter_pad_get_name(f->outputs, i), > + av_get_media_type_string(avfilter_pad_get_type(f->outputs, i))); > } > + if (f->flags & AVFILTER_FLAG_DYNAMIC_OUTPUTS) > + printf(" dynamic (depending on the options)\n"); > + else if (!count) > + printf(" none (sink filter)\n"); > + > + if (f->priv_class) > + show_help_children(f->priv_class, AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM | > + AV_OPT_FLAG_AUDIO_PARAM); > + if (f->flags & AVFILTER_FLAG_SUPPORT_TIMELINE) > + printf("This filter has support for timeline through the 'enable' option.\n"); > +#else > + av_log(NULL, AV_LOG_ERROR, "Build without libavfilter; " > + "can not to satisfy request\n"); > +#endif > } > +#endif > > -static char get_media_type_char(enum AVMediaType type) > +static void show_help_bsf(const char *name) > { > - switch (type) { > - case AVMEDIA_TYPE_VIDEO: return 'V'; > - case AVMEDIA_TYPE_AUDIO: return 'A'; > - case AVMEDIA_TYPE_DATA: return 'D'; > - case AVMEDIA_TYPE_SUBTITLE: return 'S'; > - case AVMEDIA_TYPE_ATTACHMENT:return 'T'; > - default: return '?'; > + const AVBitStreamFilter *bsf = av_bsf_get_by_name(name); > + > + if (!name) { > + av_log(NULL, AV_LOG_ERROR, "No bitstream filter name specified.\n"); > + return; > + } else if (!bsf) { > + av_log(NULL, AV_LOG_ERROR, "Unknown bit stream filter '%s'.\n", name); > + return; > } > + > + printf("Bit stream filter %s\n", bsf->name); > + PRINT_CODEC_SUPPORTED(bsf, codec_ids, enum AVCodecID, "codecs", > + AV_CODEC_ID_NONE, GET_CODEC_NAME); > + if (bsf->priv_class) > + show_help_children(bsf->priv_class, AV_OPT_FLAG_BSF_PARAM); > } > > -static const AVCodec *next_codec_for_id(enum AVCodecID id, void **iter, > - int encoder) > +int show_help(void *optctx, const char *opt, const char *arg) > { > - const AVCodec *c; > - while ((c = av_codec_iterate(iter))) { > - if (c->id == id && > - (encoder ? av_codec_is_encoder(c) : av_codec_is_decoder(c))) > - return c; > + char *topic, *par; > + av_log_set_callback(log_callback_help); > + > + topic = av_strdup(arg ? arg : ""); > + if (!topic) > + return AVERROR(ENOMEM); > + par = strchr(topic, '='); > + if (par) > + *par++ = 0; > + > + if (!*topic) { > + show_help_default(topic, par); > + } else if (!strcmp(topic, "decoder")) { > + show_help_codec(par, 0); > + } else if (!strcmp(topic, "encoder")) { > + show_help_codec(par, 1); > + } else if (!strcmp(topic, "demuxer")) { > + show_help_demuxer(par); > + } else if (!strcmp(topic, "muxer")) { > + show_help_muxer(par); > + } else if (!strcmp(topic, "protocol")) { > + show_help_protocol(par); > +#if CONFIG_AVFILTER > + } else if (!strcmp(topic, "filter")) { > + show_help_filter(par); > +#endif > + } else if (!strcmp(topic, "bsf")) { > + show_help_bsf(par); > + } else { > + show_help_default(topic, par); > } > - return NULL; > + > + av_freep(&topic); > + return 0; > +} > + > +static void print_codecs_for_id(enum AVCodecID id, int encoder) > +{ > + void *iter = NULL; > + const AVCodec *codec; > + > + printf(" (%s: ", encoder ? "encoders" : "decoders"); > + > + while ((codec = next_codec_for_id(id, &iter, encoder))) > + printf("%s ", codec->name); > + > + printf(")"); > } > > static int compare_codec_desc(const void *a, const void *b) > @@ -1534,17 +638,16 @@ static unsigned get_codecs_sorted(const AVCodecDescriptor ***rcodecs) > return nb_codecs; > } > > -static void print_codecs_for_id(enum AVCodecID id, int encoder) > +static char get_media_type_char(enum AVMediaType type) > { > - void *iter = NULL; > - const AVCodec *codec; > - > - printf(" (%s: ", encoder ? "encoders" : "decoders"); > - > - while ((codec = next_codec_for_id(id, &iter, encoder))) > - printf("%s ", codec->name); > - > - printf(")"); > + switch (type) { > + case AVMEDIA_TYPE_VIDEO: return 'V'; > + case AVMEDIA_TYPE_AUDIO: return 'A'; > + case AVMEDIA_TYPE_DATA: return 'D'; > + case AVMEDIA_TYPE_SUBTITLE: return 'S'; > + case AVMEDIA_TYPE_ATTACHMENT:return 'T'; > + default: return '?'; AVMEDIA_TYPE_ATTACHMENT has obviously been added later. You now have an opportunity to fix the formatting. You should use it. > + } > } > > int show_codecs(void *optctx, const char *opt, const char *arg) > @@ -1666,21 +769,6 @@ int show_bsfs(void *optctx, const char *opt, const char *arg) > return 0; > } > > +static int show_formats_devices(void *optctx, const char *opt, const char *arg, int device_only, int muxdemuxers) > +{ > + void *ifmt_opaque = NULL; > + const AVInputFormat *ifmt = NULL; > + void *ofmt_opaque = NULL; > + const AVOutputFormat *ofmt = NULL; > + const char *last_name; > + int is_dev; > + > + printf("%s\n" > + " D. = Demuxing supported\n" > + " .E = Muxing supported\n" > + " --\n", device_only ? "Devices:" : "File formats:"); > + last_name = "000"; > + for (;;) { > + int decode = 0; > + int encode = 0; > + const char *name = NULL; > + const char *long_name = NULL; > + > + if (muxdemuxers !=SHOW_DEMUXERS) { > + ofmt_opaque = NULL; Can use smaller scope; same below. > + while ((ofmt = av_muxer_iterate(&ofmt_opaque))) { > + is_dev = is_device(ofmt->priv_class); > + if (!is_dev && device_only) > + continue; > + if ((!name || strcmp(ofmt->name, name) < 0) && > + strcmp(ofmt->name, last_name) > 0) { > + name = ofmt->name; > + long_name = ofmt->long_name; > + encode = 1; > + } > + } > + } > + if (muxdemuxers != SHOW_MUXERS) { > + ifmt_opaque = NULL; > + while ((ifmt = av_demuxer_iterate(&ifmt_opaque))) { > + is_dev = is_device(ifmt->priv_class); > + if (!is_dev && device_only) > + continue; > + if ((!name || strcmp(ifmt->name, name) < 0) && > + strcmp(ifmt->name, last_name) > 0) { > + name = ifmt->name; > + long_name = ifmt->long_name; > + encode = 0; > + } > + if (name && strcmp(ifmt->name, name) == 0) > + decode = 1; > + } > + } > + if (!name) > + break; > + last_name = name; > + > + printf(" %c%c %-15s %s\n", > + decode ? 'D' : ' ', > + encode ? 'E' : ' ', > + name, > + long_name ? long_name:" "); > + } > + return 0; > +} > + _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".