From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <ffmpeg-devel-bounces@ffmpeg.org>
Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100])
	by master.gitmailbox.com (Postfix) with ESMTPS id 021614112B
	for <ffmpegdev@gitmailbox.com>; Wed, 19 Mar 2025 13:08:23 +0000 (UTC)
Received: from [127.0.1.1] (localhost [127.0.0.1])
	by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 71399687ACF;
	Wed, 19 Mar 2025 15:08:18 +0200 (EET)
Received: from mail-wm1-f42.google.com (mail-wm1-f42.google.com
 [209.85.128.42])
 by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 921EE687A3D
 for <ffmpeg-devel@ffmpeg.org>; Wed, 19 Mar 2025 15:08:12 +0200 (EET)
Received: by mail-wm1-f42.google.com with SMTP id
 5b1f17b1804b1-43cfdc2c8c9so26838345e9.2
 for <ffmpeg-devel@ffmpeg.org>; Wed, 19 Mar 2025 06:08:12 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1742389692; x=1742994492; darn=ffmpeg.org;
 h=in-reply-to:content-language:references:to:from:subject:user-agent
 :mime-version:date:message-id:from:to:cc:subject:date:message-id
 :reply-to; bh=wVcE9zq+nQqxZkQH/eGqBlJQNofpaIHyS626vGTPesw=;
 b=kDjR4v6tgFV8xOM5a8Of1JkDEyXXYMpgTu8OGGe1vQliTziAHFkkezBhI9r2odPgNL
 LrdKphy7Zu1XIeUcWBzVIGmbXbIrNpxGpo/yS15NXWUs9hPQTSrnYSSJe+sh/2Hs+zfK
 /BBGKQPtQxE8gE6YUYW9n10+v/TZ23swFbf7MSbBBsdaMxKJreGFtxBG0azeYWaZR7Ga
 6c4WVaXgDlIt1+tLYP0QeD/J5P+gqnKV+t+HeTLWJVYZLgV5TnHAlRiPn1BwxVaXMw5r
 vFDXcdvfBusdjICR7ipGt6zyGXPnr9PDw4WW1pSaWjA9l7TgrGrEOcrJQbeon3+De5yJ
 KtUg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1742389692; x=1742994492;
 h=in-reply-to:content-language:references:to:from:subject:user-agent
 :mime-version:date:message-id:x-gm-message-state:from:to:cc:subject
 :date:message-id:reply-to;
 bh=wVcE9zq+nQqxZkQH/eGqBlJQNofpaIHyS626vGTPesw=;
 b=Zx8F5XhpPZM1/b2rRRx4VvhuY6Yvk2eIsYkg8meIxq7V/OqqDjfCMdm3gNPPLpUwty
 bhycSP+jBLMr/LQKfRggRcKELWGUCt0QgMX2iXwh13WMiKCFQ1Yi6xObuW/YGK9G5txj
 TKvH0Li+/0BKgsmlSNL5+VWEqYQTRup8F1mq3xE9yWPL9lALDBzlK4t/2rysTmNXgRoj
 zBSCEY3K0zie+Bfd6qyRFZCKZ2K9cR2ZrcO6y25eo7+zrjV9OFT4JEayqgtUIHuWGPs0
 tyeJj8KNimjcjAc2y5HNXkI2ef+ONL0qsC/7Te07tzpto95yOR188E4eXX6YoEUmnkHC
 biIA==
X-Gm-Message-State: AOJu0YxZk5ibvDAsZ6Gqjz3h3u1scjt0Iw5AXV0zudjpTebFuiV6ERUO
 CT5NkjeTs8nS/otT3d9sW2Kux7nQQ9XDSAVUpAT+pjyQTCYYDvr5T9KkEg==
X-Gm-Gg: ASbGnctDAn+QUjSjjqu3yDhTHpMcD3zde/gjJ7tS77kusuWlN00LE7OM37qFNlf0QVo
 b/x3jV/Q15sMHBJtKchhq6UoowYBBfAhbTYr3KlCPwweAAbu7F64QR68hS6avE4cwxJAOwyd9ZX
 kLc7VouwHeV63QWMzFvs6gPx7vEUHn5h1Xt1SM/N5boloooBRgcBpFTYdfbjLpc1Vb034WK++j5
 /7/H83n6vQiPvv146BWOI8nxO0TWVSfUKmoLDe4bgo7Bld8dd/xKywoMP5N8ouMPGWO+lBbxCf1
 DJKOXhNMAaCFCCJhSge3B8wRK/xarse7hfMnLm1nq6Za+KAOTVR1gxMpq4dW1UCi+uwad7XJHkX
 M01CXReBCpQk63K7+c7XmpQI=
X-Google-Smtp-Source: AGHT+IEsFdVD09kFCfdTTg89MxIdavbFv4fkO7lWyn1JsNpGHX8hF7cT0YjM4R+kkzDhX1wFo9H+cg==
X-Received: by 2002:a05:600c:5c9:b0:43d:526:e0ce with SMTP id
 5b1f17b1804b1-43d43b9da23mr11773235e9.21.1742389690716; 
 Wed, 19 Mar 2025 06:08:10 -0700 (PDT)
Received: from ?IPV6:2001:9e8:1d87:9a00:68c7:4c2f:744c:eef4?
 ([2001:9e8:1d87:9a00:68c7:4c2f:744c:eef4])
 by smtp.gmail.com with ESMTPSA id
 5b1f17b1804b1-43d43f589b4sm18514185e9.24.2025.03.19.06.08.09
 for <ffmpeg-devel@ffmpeg.org>
 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
 Wed, 19 Mar 2025 06:08:09 -0700 (PDT)
Content-Type: multipart/mixed; boundary="------------1WrZsfkpngP2IIMMuk8Y0jkl"
Message-ID: <58e63704-d439-4314-974c-601dea251ae6@gmail.com>
Date: Wed, 19 Mar 2025 14:08:08 +0100
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
From: Leandro Santiago <leandrosansilva@gmail.com>
To: ffmpeg-devel@ffmpeg.org
References: <6bef7ee3-6e0b-496a-9018-ce02d5e8cd63@gmail.com>
Content-Language: en-US
In-Reply-To: <6bef7ee3-6e0b-496a-9018-ce02d5e8cd63@gmail.com>
Subject: Re: [FFmpeg-devel] [PATCH] avfilter: Proof of Concept: enable
 out-of-tree filters
X-BeenThere: ffmpeg-devel@ffmpeg.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: FFmpeg development discussions and patches <ffmpeg-devel.ffmpeg.org>
List-Unsubscribe: <https://ffmpeg.org/mailman/options/ffmpeg-devel>,
 <mailto:ffmpeg-devel-request@ffmpeg.org?subject=unsubscribe>
List-Archive: <https://ffmpeg.org/pipermail/ffmpeg-devel>
List-Post: <mailto:ffmpeg-devel@ffmpeg.org>
List-Help: <mailto:ffmpeg-devel-request@ffmpeg.org?subject=help>
List-Subscribe: <https://ffmpeg.org/mailman/listinfo/ffmpeg-devel>,
 <mailto:ffmpeg-devel-request@ffmpeg.org?subject=subscribe>
Reply-To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Errors-To: ffmpeg-devel-bounces@ffmpeg.org
Sender: "ffmpeg-devel" <ffmpeg-devel-bounces@ffmpeg.org>
Archived-At: <https://master.gitmailbox.com/ffmpegdev/58e63704-d439-4314-974c-601dea251ae6@gmail.com/>
List-Archive: <https://master.gitmailbox.com/ffmpegdev/>
List-Post: <mailto:ffmpegdev@gitmailbox.com>

This is a multi-part message in MIME format.
--------------1WrZsfkpngP2IIMMuk8Y0jkl
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

I've applied a few changes from your feedback, the following is how the feature looks like.

***Disclaimer***

this is still a proof of concept and for now I am looking for your feedback and help. There are lots of rough corners and stuff that does not work. I by no means intend to request the changes as they are to be merged. Call it an RFC if you will.

Also, I am not sending the patch as an attachment, and leave the e-mail body for discussion only. I am not sure whether this is a good approach or goes against the mailing list policy. This is the time I wish we could really contribute using the Pull Request more on a nice web interface.

If you folks want to experiment, I pushed my changes in this PR: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/13

***Finish disclaimer***

I changed the name convention from "extra filters" to "external filters", as it sounds more natural. (Another possibility would be "extension filters", so please let me know what you think).

The build system will automatically pick up any filters in the subdirectory `ext/libavfilter`, and ignore it if it does not exist.

The rationale behind this directory structure is to reserve the possibility of extensions of other libraries as well.

An external filter is composed by at least one Makefile, and this Makefile has some "metadata" encoded in its comments, used by the `./configure` script to generate some code. I'll show how they look like in an example.

Although this way to encode metadata looks very ugly and I am pretty sure can be improved, this is the best I could for now, and I hope you folks can point me directions on how to improve it, as you have more knowledge of the build system than I do.

Here are the metadata types:

- check: this is a command used to check if 3rd party dependencies are available and enabling them within the build system. The command here is executed by `./configure`. This entry is optional and for now there can be only one of them, due to technical limitations of my implementation.

- symbol: this entry can appear multiple times, and indicates the name of the FFFilter objects exported by the filter. There must be one entry per exported symbol. These entries are used by `./configure` to generate the list of enabled filters.

- ldflags: those are extra LDFLAGS to be used to link libavfilter. I am not happy this this one at all, as such information ideally should be encoded as Makefile variables, but I confess I could not manage to do it. I'd be happy to get directions on where in the build system to look for the right "hook", but I'll continue looking for it as well.

As an example, here is how one can create an empty filter. Just to exercise the build system, the example filter depends on an external library, json-c, which is found using pkg-config and will be dynamically linked to libavfilter. In case json-c is not found, `./configure` will fail, as expected.

```

mkdir -p ext/libavfilter/example

```

Then create the a file ext/libavfilter/example/Makefile with the content:

```

# check: require_pkg_config json json-c json-c/json.h json_c_version_num
# symbol: ff_vf_example
# ldflags: -ljson-c

OBJS += vf_example.o
CFLAGS += -DFOO=1234

libavfilter/vf_example.o:
        $(CC) $(EXTERNAL_FILTER_FLAGS) $(CPPFLAGS) $(CFLAGS) -c -o $@ $(EXTERNAL_FILTER_EXAMPLE_LOCATION)/vf_example.c

```

Then, create the file ext/libavfilter/example/Makefile/vf_example.c with the content:


```

#include "libavutil/internal.h"
#include "avfilter.h"
#include "filters.h"
#include "video.h"

#include <json.h>

static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, char *res, int res_len, int flags) {
  // NOTE: I know this makes no sense, I just wanted to use some symbol from json-c
  // in a way the compiler cannot optimize it out
  return json_c_version_num();
}


const FFFilter ff_vf_example = {
    .p.name        = "example",
    .p.description = NULL_IF_CONFIG_SMALL("An external example filter"),
    .p.flags       = AVFILTER_FLAG_METADATA_ONLY,
    FILTER_INPUTS(ff_video_default_filterpad),
    FILTER_OUTPUTS(ff_video_default_filterpad),
    .process_command = process_command,
};

```

(You can skip this manually creating those files by checking out this example filter from gitlab: https://gitlab.com/leandrosansilva/ffmpeg-extra-filter-example)

Now you can compile ffmpeg as usual, with `./configure && make && make install` and use the filter.

In my tests, building ffmpeg libraries either in static and shared mode work, with the extra dependencies properly linked.


Explanation:

- The .o files for the external filters will be generated in the same place as the built-in filters, in libavfilter/. That means that two external filters cannot generate the same .o files.

- A new variable with the format EXTERNAL_FILTER_$(FILTER_SYMBOL_IN_UPPERCASE)_LOCATION will be generated for each FFFilter exported. More explanation about that below.

- The build system offers now a variable `EXTERNAL_FILTER_FLAGS` which adds the paths of the libavfilter private headers to the compiler when building the external filters. The idea here is for code for an external filter to look exactly as if it was a built-in filter: the include paths should be the same. This will make it easier for external filters to be moved as built-in and the other way around, not requiring much code changes.


TODO:

- Find a way to remove the `ldflags` metadata entry to turn it into a Makefile variable.

- Allow multiple `check` metadata entries, to make it easier to check for multiple 3rd party dependencies.

- Better error handling on malformed/invalid filter metadata.

- Find a way to encode conditional builds in the metadata. I am here thinking on filters like the `dnn` family, which can have multiple backends, which are now chosen using `--enable-openvino`, `--enable-libtorch`, `--enable-libtensorflow` or the drawtext filter that has optional dependencies. Maybe the external filters could hook new `--enable-*` options to `./configure`, but this smells like trouble when multiple filters specify the same optional dependencies.

- You can see in the example Makefile that a new "magical" variable named `EXTERNAL_FILTER_EXAMPLE_LOCATION` was created by the build system. It looks ugly to me, but I could not find a way to obtain the path of the current Makefile via make, and I needed a way to specify the path of the filter source files. If you know a cleaner way to do it, please let me know.

- Make it possible to link filters written in other languages. My "final" goal for is Rust, but it should not prevent the use of C++ or Zig, for instance. I believe this can be done in a further iteration. For now my focus is only supporting C.

- Once the implementation and "spec" is agreed, document it.

- Refactor the changes in the build system to improve legibility.


Regards,

Leandro

--------------1WrZsfkpngP2IIMMuk8Y0jkl
Content-Type: text/x-patch; charset=UTF-8;
 name="0001-avfilter-Proof-of-Concept-enable-out-of-tree-filters.patch"
Content-Disposition: attachment;
 filename*0="0001-avfilter-Proof-of-Concept-enable-out-of-tree-filters.pa";
 filename*1="tch"
Content-Transfer-Encoding: base64

RnJvbSA3NDg2Zjg3OGI5ODI4Njc2Njc4OTI2MTFlMTgxZGM0ZWFiMzI5OGM4IE1vbiBTZXAg
MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBMZWFuZHJvIFNhbnRpYWdvIDxsZWFuZHJvc2Fuc2ls
dmFAZ21haWwuY29tPgpEYXRlOiBXZWQsIDEyIE1hciAyMDI1IDEzOjQyOjQyICswMTAwClN1
YmplY3Q6IFtQQVRDSF0gYXZmaWx0ZXI6IFByb29mIG9mIENvbmNlcHQ6IGVuYWJsZSBvdXQt
b2YtdHJlZSBmaWx0ZXJzCgpUaGlzIGlzIGEgUE9DL3Byb3RvdHlwZSB0aGF0IGFpbXMgdG8g
ZW5hYmxlIG91dCBvZiB0cmVlIGZpbHRlcnMgb24KRkZtcGVnLgoKSGVyZSBpcyBob3cgdG8g
dGVzdCBpdCwgd2l0aCBhbiBleGFtcGxlIGZpbHRlcjoKCmBgYApta2RpciAtcCBleHQvbGli
YXZmaWx0ZXIKcHVzaGQgZXh0L2xpYmF2ZmlsdGVyCmdpdCBjbG9uZSBodHRwczovL2dpdGxh
Yi5jb20vbGVhbmRyb3NhbnNpbHZhL2ZmbXBlZy1leHRyYS1maWx0ZXItZXhhbXBsZSBleGFt
cGxlCnBvcGQKYGBgCgpUaGVuIGNvbXBpbGUgZmZtcGVnIGFzIHVzdWFsOgoKYGBgCi4vY29u
ZmlndXJlICYmIG1ha2UgJiYgbWFrZSBpbnN0YWxsCmBgYAoKTm93IHlvdSBjYW4gdXNlIHRo
ZSBmaWx0ZXJzOgoKYGBgCmZmcGxheSAvcGF0aC90by9maWxlLndlYm0gLXZmICdmb28sYmFy
JwpgYGAKCldoYXQgd29ya3M6CgotIEJ1aWxkaW5nIEMgYmFzZWQgZmlsdGVycyB3aXRoIG5v
IGV4dHJhLCBvciBzaW1wbGUgZGVwZW5kZW5jaWVzLgotIE11bHRpcGxlIGZpbHRlcnMgaW4g
dGhlIHNhbWUgb2JqZWN0IGZpbGUuCgpXaGF0IGlzIHVnbHk6CgotIFRoZSBmaWx0ZXIgbWV0
YWRhdGEgaXMgaGlkZGVuIGluIHRoZSBNYWtlZmlsZSBjb21tZW50cywgYW5kIHRoaXMgaXMK
ICBuZWVkZWQgYmVjYXVzZSBhdCBgLi9jb25maWd1cmVgIHRpbWUsIGV4ZWN1dGVkIGJlZm9y
ZSBtYWtlLCBzb21lIGNvZGUKICBuZWVkcyB0byBiZSBnZW5lcmF0ZWQgYW5kLCBhbHRob3Vn
aCBzdWNoIGdlbmVyYXRpb24gY291bGQgaW4gdGhlb3J5IGJlCiAgZG9uZSB2aWEgbWFrZSwg
dGhpcyBmZWVscyBsaWtlIHRvbyBtdWNoIGNoYW5nZSBhdCB0aGUgbW9tZW50LgoKLSBBbW9u
ZyB0aGUgbWV0YWRhdGEsIHRoZXJlIGFyZSBsaW5rZXIgYW5kIGNvbXBpbGVyIGZsYWdzLCB3
aGljaCB3b3VsZAogIGxvb2sgbXVjaCBiZXR0ZXIgaWYgdGhleSB3ZXJlIHNpbXBsZSBtYWtl
IHZhcmlhYmxlcy4KCi0gQXQgdGhlIG1vbWVudCBpdCdzIHBvc3NpYmxlIGZvciBvbmx5IG9u
ZSBgY2hlY2tgIG1ldGFkYXRhIGVudHJ5IHRvIGJlCiAgaW5jbHVkZWQgaW4gdGhlIE1ha2Vm
aWxlLCBidXQgd2Ugc2hvdWxkIHN1cHBvcnQgbXVsdGlwbGUgb2YgdGhlbSwgZm9yCiAgdGhl
IGNhc2Ugd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgZXh0cmEgZGVwZW5kZW5jaWVzLgoKV2hh
dCB3YXMgbm90IGltcGxlbWVudGVkOgoKLSBJIGJlbGlldmUgaXQgd291bGQgYmUgdXNlZnVs
IHRvIGNoZWNrIGlmIHRoZSBsaWNlbnNlIG9mIHRoZSBmaWx0ZXIgaXMKICBjb21wYXRpYmxl
IHdpdGggdGhlIGxpY2Vuc2UgdXNlZCB0byBidWlsZCBGRm1wZWcuCgotIE9ubHkgZXh0cmEg
ZmlsdGVycyB3cml0dGVuIGluIEMgKG1heWJlIEMrKz8pIGFyZSBzdXBwb3J0ZWQgZm9yIG5v
dy4KICBPbmUgb2YgbXkgZ29hbHMgaXMgdG8gZW5hYmxlIFJ1c3QgYXMgd2VsbC4KCi0gVGhl
cmUgc2hvdWxkIGJlIGEgd2F5IHRvIGhhdmUgb3B0aW9uYWwgZGVwZW5kZW5jaWVzLCBmb3Ig
ZmlsdGVycyB0aGF0CiAgY2FuIGhhdmUgbXVsdGlwbGUgImJhY2tlbmRzIiwgZm9yIGluc3Rh
bmNlLCB0byBiZSBjaG9zZW4gYXQgYnVpbGQgdGltZS4KClNpZ25lZC1vZmYtYnk6IExlYW5k
cm8gU2FudGlhZ28gPGxlYW5kcm9zYW5zaWx2YUBnbWFpbC5jb20+Ci0tLQogLmdpdGlnbm9y
ZSAgICAgICAgICAgICAgIHwgIDQgKysrCiBjb25maWd1cmUgICAgICAgICAgICAgICAgfCA3
NSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBsaWJhdmZpbHRl
ci9NYWtlZmlsZSAgICAgfCAgNCArKysKIGxpYmF2ZmlsdGVyL2FsbGZpbHRlcnMuYyB8ICAx
ICsKIDQgZmlsZXMgY2hhbmdlZCwgODQgaW5zZXJ0aW9ucygrKQoKZGlmZiAtLWdpdCBhLy5n
aXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDQzMGFiYWY5MWIuLjRlYWU5MTEzNzkgMTAw
NjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtNDQsMyArNDQsNyBA
QAogL3Rvb2xzL3B5dGhvbi9fX3B5Y2FjaGVfXy8KIC9saWJhdmNvZGVjL3Z1bGthbi8qLmMK
IC9saWJhdmZpbHRlci92dWxrYW4vKi5jCisvZmZidWlsZC9leHRlcm5hbC1maWx0ZXJzLnR4
dAorL2ZmYnVpbGQvZXh0ZXJuYWwtZmlsdGVycy5tYWsKKy9saWJhdmZpbHRlci9leHRlcm5h
bF9maWx0ZXJzX2V4dGVybi5oCisvZXh0CmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25m
aWd1cmUKaW5kZXggZDg0ZTMyMTk2ZC4uZjdiYjJjYzM4YSAxMDA3NTUKLS0tIGEvY29uZmln
dXJlCisrKyBiL2NvbmZpZ3VyZQpAQCAtMTc5OCw2ICsxNzk4LDcgQEAgQVZERVZJQ0VfQ09N
UE9ORU5UUz0iCiAKIEFWRklMVEVSX0NPTVBPTkVOVFM9IgogICAgIGZpbHRlcnMKKyAgICBl
eHRlcm5hbF9maWx0ZXJzCiAiCiAKIEFWRk9STUFUX0NPTVBPTkVOVFM9IgpAQCAtNDQ4OSw2
ICs0NDkwLDUwIEBAIGZvciBvcHQgZG8KICAgICBlc2FjCiBkb25lCiAKK3N5bWJvbHNfZnJv
bV9leHRlcm5hbF9maWx0ZXJfbWFrZWZpbGUoKSB7CisgIGdyZXAgJ14jLipzeW1ib2w6JyA8
ICIkMSIgfCBzZWQgLWUgJ3N8I1xzKnN5bWJvbDogXCguKlwpfFwxfGcnCit9CisKK2xpc3Rf
ZXh0ZXJuYWxfZmlsdGVyX21ha2VmaWxlcygpIHsKKyAgWyAhIC1kICJleHQvbGliYXZmaWx0
ZXIiIF0gJiYgcmV0dXJuCisKKyAgZm9yIGYgaW4gZXh0L2xpYmF2ZmlsdGVyLyo7IGRvCisg
ICAgWyAtZiAiJGYvTWFrZWZpbGUiIF0gJiYgZWNobyAkZi9NYWtlZmlsZQorICBkb25lCit9
CisKK2xpc3RfZXh0ZXJuYWxfZmlsdGVyX21ha2VmaWxlcyA+IGZmYnVpbGQvZXh0ZXJuYWwt
ZmlsdGVycy50eHQKKworZmluZF9leHRlcm5hbF9maWx0ZXJzX2V4dGVybigpIHsKKyAgIyBU
T0RPOiBoYW5kbGUgaW52YWxpZCBmaWx0ZXIKKyAgd2hpbGUgcmVhZCBNYWtlZmlsZTsgZG8K
KyAgICBzeW1ib2xzX2Zyb21fZXh0ZXJuYWxfZmlsdGVyX21ha2VmaWxlICIkTWFrZWZpbGUi
IHwgc2VkICdzL15mZl9bYXZmc2lua3JjXVx7Miw1XH1fXChbWzphbG51bTpdX11cezEsXH1c
KS9cMV9maWx0ZXIvJworICBkb25lIDwgZmZidWlsZC9leHRlcm5hbC1maWx0ZXJzLnR4dAor
fQorCitFWFRFUk5BTF9GSUxURVJfTElTVD0kKGZpbmRfZXh0ZXJuYWxfZmlsdGVyc19leHRl
cm4pCisKK2ZvciBuIGluIGV4dGVybmFsX2ZpbHRlcnM7IGRvCisgICAgdj0kKHRvdXBwZXIg
JHtuJXN9KV9MSVNUCisgICAgZXZhbCBlbmFibGUgXCQkdgorICAgIGV2YWwgJHtufV9pZl9h
bnk9IlwkJHYiCitkb25lCisKK0ZJTFRFUl9MSVNUPSIKKyAgICAkRklMVEVSX0xJU1QKKyAg
ICAkRVhURVJOQUxfRklMVEVSX0xJU1QKKyIKKworQVZGSUxURVJfQ09NUE9ORU5UU19MSVNU
PSIKKyAgICAkQVZGSUxURVJfQ09NUE9ORU5UU19MSVNUCisgICAgJEVYVEVSTkFMX0ZJTFRF
Ul9MSVNUCisiCisKK0FMTF9DT01QT05FTlRTPSIKKyAgICAkQUxMX0NPTVBPTkVOVFMKKyAg
ICAkRVhURVJOQUxfRklMVEVSX0xJU1QKKyIKKwogZm9yIGUgaW4gJGVudjsgZG8KICAgICBl
dmFsICJleHBvcnQgJGUiCiBkb25lCkBAIC03MTczLDYgKzcyMTgsMTEgQEAgZW5hYmxlZCBy
a21wcCAgICAgICAgICAgICAmJiB7IHJlcXVpcmVfcGtnX2NvbmZpZyBya21wcCByb2NrY2hp
cF9tcHAgIHJvY2tjaGlwL3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogZW5h
YmxlZCB2YXBvdXJzeW50aCAgICAgICAmJiByZXF1aXJlX2hlYWRlcnMgInZhcG91cnN5bnRo
L1ZTU2NyaXB0NC5oIHZhcG91cnN5bnRoL1ZhcG91clN5bnRoNC5oIgogCisjIENoZWNrIGZv
ciB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBleHRlcm5hbCBmaWx0ZXJzCit3aGlsZSByZWFk
IE1ha2VmaWxlOyBkbworICAjIE5PVEU6IHRoaXMgZXZhbCBpcyBkYW5nZXJvdXMsIGFzIGl0
IGFsbG93cyBhcmJpdHJhcnkgY29kZSBleGVjdXRpb24hCisgIGV2YWwgJChncmVwICdeIy4q
Y2hlY2s6JyAiJE1ha2VmaWxlIiB8IHNlZCAnc3wjXHMqY2hlY2s6IFwoLipcKXxcMXxnJykK
K2RvbmUgPCBmZmJ1aWxkL2V4dGVybmFsLWZpbHRlcnMudHh0CiAKIGlmIGVuYWJsZWQgZ2Ny
eXB0OyB0aGVuCiAgICAgR0NSWVBUX0NPTkZJRz0iJHtjcm9zc19wcmVmaXh9bGliZ2NyeXB0
LWNvbmZpZyIKQEAgLTgyNTAsMTIgKzgzMDAsMjMgQEAgSUdOT1JFX1RFU1RTPSRpZ25vcmVf
dGVzdHMKIFZFUlNJT05fVFJBQ0tJTkc9JHZlcnNpb25fdHJhY2tpbmcKIEVPRgogCit3aGls
ZSByZWFkIE1ha2VmaWxlOyBkbworICAjIE5PVEU6IHRoaXMgZXZhbCBpcyBkYW5nZXJvdXMs
IGFzIGl0IGFsbG93cyBhcmJpdHJhcnkgY29kZSBleGVjdXRpb24hCisgIGV2YWwgImF2Zmls
dGVyX2V4dHJhbGlicz1cIlwkYXZmaWx0ZXJfZXh0cmFsaWJzICQoZ3JlcCAnXiMuKmxkZmxh
Z3M6JyAiJE1ha2VmaWxlIiB8IHNlZCAnc3wjXHMqbGRmbGFnczogXCguKlwpfFwxfGcnKVwi
IgorZG9uZSA8IGZmYnVpbGQvZXh0ZXJuYWwtZmlsdGVycy50eHQKKwogbWFwICdldmFsIGVj
aG8gIiR7dn1fRkZMSUJTPVwkJHt2fV9kZXBzIiA+PiBmZmJ1aWxkL2NvbmZpZy5tYWsnICRM
SUJSQVJZX0xJU1QKIAogZm9yIGVudHJ5IGluICRMSUJSQVJZX0xJU1QgJFBST0dSQU1fTElT
VCAkRVhUUkFMSUJTX0xJU1Q7IGRvCiAgICAgZXZhbCBlY2hvICJFWFRSQUxJQlMtJHtlbnRy
eX09XCQke2VudHJ5fV9leHRyYWxpYnMiID4+IGZmYnVpbGQvY29uZmlnLm1hawogZG9uZQog
CitlY2hvICIiID4gZmZidWlsZC9leHRlcm5hbC1maWx0ZXJzLm1haworCit3aGlsZSByZWFk
IE1ha2VmaWxlOyBkbworICAgIGVjaG8gImluY2x1ZGUgJE1ha2VmaWxlIiA+PiBmZmJ1aWxk
L2V4dGVybmFsLWZpbHRlcnMubWFrCitkb25lIDwgZmZidWlsZC9leHRlcm5hbC1maWx0ZXJz
LnR4dAorCiBjYXQgPiAkVE1QSCA8PEVPRgogLyogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQg
YnkgY29uZmlndXJlIC0gZG8gbm90IG1vZGlmeSEgKi8KICNpZm5kZWYgRkZNUEVHX0NPTkZJ
R19ICkBAIC04MzQzLDYgKzg0MDQsMjAgQEAgY3BfaWZfY2hhbmdlZCAkVE1QSCBsaWJhdnV0
aWwvYXZjb25maWcuaAogIyAuLi4KIGV2YWwgIiQoc2VkIC1uICJzL15leHRlcm4gY29uc3Qg
RkZGaWx0ZXIgZmZfXChbYXZmc2lua3JjXVx7Miw1XH1cKV9cKC4qXCk7L2Z1bGxfZmlsdGVy
X25hbWVfXDI9XDFfXDIvcCIgJHNvdXJjZV9wYXRoL2xpYmF2ZmlsdGVyL2FsbGZpbHRlcnMu
YykiCiAKK3JtIC1mIGxpYmF2ZmlsdGVyL2V4dGVybmFsX2ZpbHRlcnNfZXh0ZXJuLmgKKwor
IyByZWdpc3RlciB0aGUgc3ltYm9scyBvZiB0aGUgZXh0ZXJuYWwgZmlsdGVycword2hpbGUg
cmVhZCBNYWtlZmlsZTsgZG8KKyAgICBldmFsICIkKHN5bWJvbHNfZnJvbV9leHRlcm5hbF9m
aWx0ZXJfbWFrZWZpbGUgIiRNYWtlZmlsZSIgXAorICAgICAgfCBzZWQgJ3MvXmZmX1woW2F2
ZnNpbmtyY11cezIsNVx9XClfXChbWzphbG51bTpdXVx7MSxcfVwpJC9mdWxsX2ZpbHRlcl9u
YW1lX1wyPVwxX1wyLycpIgorCisgICAgc3ltYm9sc19mcm9tX2V4dGVybmFsX2ZpbHRlcl9t
YWtlZmlsZSAiJE1ha2VmaWxlIiB8IHdoaWxlIHJlYWQgc3ltYm9sOyBkbworICAgICAgICBl
Y2hvICJleHRlcm4gY29uc3QgRkZGaWx0ZXIgJHN5bWJvbDsiID4+IGxpYmF2ZmlsdGVyL2V4
dGVybmFsX2ZpbHRlcnNfZXh0ZXJuLmgKKyAgICAgICAgZWNobyAiRVhURVJOQUxfRklMVEVS
XyQoZWNobyAkc3ltYm9sIHwgc2VkICdzL15mZl9bYXZmc2lua3JjXVx7Miw1XH1fXChbWzph
bG51bTpdXVx7MSxcfVwpJC9cMS8nIHwgdHIgYS16IEEtWilfTE9DQVRJT04gPSAkZiIgXAor
ICAgICAgICAgICAgPj4gZmZidWlsZC9leHRlcm5hbC1maWx0ZXJzLm1haworICAgIGRvbmUK
K2RvbmUgPCBmZmJ1aWxkL2V4dGVybmFsLWZpbHRlcnMudHh0CisKICMgZ2VuZXJhdGUgdGhl
IGxpc3RzIG9mIGVuYWJsZWQgY29tcG9uZW50cwogcHJpbnRfZW5hYmxlZF9jb21wb25lbnRz
KCl7CiAgICAgZmlsZT0kMQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvTWFrZWZpbGUgYi9s
aWJhdmZpbHRlci9NYWtlZmlsZQppbmRleCA3YzBkODc5ZWM5Li44NzdiMjRjMzBmIDEwMDY0
NAotLS0gYS9saWJhdmZpbHRlci9NYWtlZmlsZQorKysgYi9saWJhdmZpbHRlci9NYWtlZmls
ZQpAQCAtMjcsNiArMjcsMTAgQEAgT0JKUyA9IGFsbGZpbHRlcnMubyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogaW5jbHVkZSAkKFNS
Q19QQVRIKS9saWJhdmZpbHRlci9kbm4vTWFrZWZpbGUKIGluY2x1ZGUgJChTUkNfUEFUSCkv
bGliYXZmaWx0ZXIvdnVsa2FuL01ha2VmaWxlCiAKKyMgZXh0ZXJuYWwgZmlsdGVycyBoYW5k
bGluZworaW5jbHVkZSAkKFNSQ19QQVRIKS9mZmJ1aWxkL2V4dGVybmFsLWZpbHRlcnMubWFr
CitFWFRFUk5BTF9GSUxURVJfRkxBR1MgPSAtSSQoUFdEKSAtSSQoUFdEKS9saWJhdmZpbHRl
cgorCiBPQkpTLSQoSEFWRV9MSUJDX01TVkNSVCkgICAgICAgICAgICAgICAgICAgICArPSBm
aWxlX29wZW4ubwogT0JKUy0kKEhBVkVfVEhSRUFEUykgICAgICAgICAgICAgICAgICAgICAg
ICAgKz0gcHRocmVhZC5vCiAKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FsbGZpbHRlcnMu
YyBiL2xpYmF2ZmlsdGVyL2FsbGZpbHRlcnMuYwppbmRleCA3NDBkOWFiMjY1Li5jMmQ1NzZl
NGJlIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9hbGxmaWx0ZXJzLmMKKysrIGIvbGliYXZm
aWx0ZXIvYWxsZmlsdGVycy5jCkBAIC02MjEsNiArNjIxLDcgQEAgZXh0ZXJuICBjb25zdCBG
RkZpbHRlciBmZl92c3JjX2J1ZmZlcjsKIGV4dGVybiAgY29uc3QgRkZGaWx0ZXIgZmZfYXNp
bmtfYWJ1ZmZlcjsKIGV4dGVybiAgY29uc3QgRkZGaWx0ZXIgZmZfdnNpbmtfYnVmZmVyOwog
CisjaW5jbHVkZSAibGliYXZmaWx0ZXIvZXh0ZXJuYWxfZmlsdGVyc19leHRlcm4uaCIKICNp
bmNsdWRlICJsaWJhdmZpbHRlci9maWx0ZXJfbGlzdC5jIgogCiAKLS0gCjIuNDguMQoK

--------------1WrZsfkpngP2IIMMuk8Y0jkl
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
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".

--------------1WrZsfkpngP2IIMMuk8Y0jkl--