* [FFmpeg-devel] [PATCH] Fix and extend amerge filter (PR #21068)
@ 2025-11-30 22:08 Marton Balint via ffmpeg-devel
0 siblings, 0 replies; only message in thread
From: Marton Balint via ffmpeg-devel @ 2025-11-30 22:08 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Marton Balint
PR #21068 opened by Marton Balint (cus)
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21068
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21068.patch
Fix a crash with custom layouts, add a new layout_mode option to add more control for output layout handling and channel reorder.
>From 85dbeaa31572c9be5e9b89457b05bfedd0a73e07 Mon Sep 17 00:00:00 2001
From: Marton Balint <cus@passwd.hu>
Date: Thu, 27 Nov 2025 23:57:20 +0100
Subject: [PATCH 1/5] avfilter/af_amerge: fix possible crash with custom
layouts
The check if a native layout can be created from the sources was incomplete and
casued a crash with custom layouts if the layout contained a native channel
multiple times, as in this example command line:
ffmpeg -lavfi "sine[a0];sine,pan=FL+FL[a1];[a0][a1]amerge[aout]" -map "[aout]" -t 1 -f framecrc -
Signed-off-by: Marton Balint <cus@passwd.hu>
---
libavfilter/af_amerge.c | 18 +++++++-----------
1 file changed, 7 insertions(+), 11 deletions(-)
diff --git a/libavfilter/af_amerge.c b/libavfilter/af_amerge.c
index bb82128a84..41137d4b8b 100644
--- a/libavfilter/af_amerge.c
+++ b/libavfilter/af_amerge.c
@@ -77,7 +77,7 @@ static int query_formats(AVFilterContext *ctx)
AVChannelLayout *inlayout[SWR_CH_MAX] = { NULL }, outlayout = { 0 };
uint64_t outmask = 0;
AVFilterChannelLayouts *layouts;
- int i, ret, overlap = 0, nb_ch = 0;
+ int i, ret, nb_ch = 0;
for (i = 0; i < s->nb_inputs; i++) {
if (!ctx->inputs[i]->incfg.channel_layouts ||
@@ -92,15 +92,11 @@ static int query_formats(AVFilterContext *ctx)
av_channel_layout_describe(inlayout[i], buf, sizeof(buf));
av_log(ctx, AV_LOG_INFO, "Using \"%s\" for input %d\n", buf, i + 1);
}
- s->in[i].nb_ch = FF_LAYOUT2COUNT(inlayout[i]);
- if (s->in[i].nb_ch) {
- overlap++;
- } else {
- s->in[i].nb_ch = inlayout[i]->nb_channels;
- if (av_channel_layout_subset(inlayout[i], outmask))
- overlap++;
- outmask |= inlayout[i]->order == AV_CHANNEL_ORDER_NATIVE ?
- inlayout[i]->u.mask : 0;
+ s->in[i].nb_ch = inlayout[i]->nb_channels;
+ for (int j = 0; j < s->in[i].nb_ch; j++) {
+ enum AVChannel id = av_channel_layout_channel_from_index(inlayout[i], j);
+ if (id >= 0 && id < 64)
+ outmask |= (1ULL << id);
}
nb_ch += s->in[i].nb_ch;
}
@@ -108,7 +104,7 @@ static int query_formats(AVFilterContext *ctx)
av_log(ctx, AV_LOG_ERROR, "Too many channels (max %d)\n", SWR_CH_MAX);
return AVERROR(EINVAL);
}
- if (overlap) {
+ if (av_popcount64(outmask) != nb_ch) {
av_log(ctx, AV_LOG_WARNING,
"Input channel layouts overlap: "
"output layout will be determined by the number of distinct input channels\n");
--
2.49.1
>From a4ade2d9ddd16187b4a62f40fe8ce30fe8392dcf Mon Sep 17 00:00:00 2001
From: Marton Balint <cus@passwd.hu>
Date: Fri, 28 Nov 2025 21:01:28 +0100
Subject: [PATCH 2/5] avfilter/af_amerge: rework routing calculation
No change in functionality.
Signed-off-by: Marton Balint <cus@passwd.hu>
---
libavfilter/af_amerge.c | 43 ++++++++++++++++++++---------------------
1 file changed, 21 insertions(+), 22 deletions(-)
diff --git a/libavfilter/af_amerge.c b/libavfilter/af_amerge.c
index 41137d4b8b..92afb4691f 100644
--- a/libavfilter/af_amerge.c
+++ b/libavfilter/af_amerge.c
@@ -63,6 +63,8 @@ static av_cold void uninit(AVFilterContext *ctx)
av_freep(&s->in);
}
+#define INLAYOUT(ctx, i) (&(ctx)->inputs[i]->incfg.channel_layouts->channel_layouts[0])
+
static int query_formats(AVFilterContext *ctx)
{
static const enum AVSampleFormat packed_sample_fmts[] = {
@@ -74,10 +76,11 @@ static int query_formats(AVFilterContext *ctx)
AV_SAMPLE_FMT_NONE
};
AMergeContext *s = ctx->priv;
- AVChannelLayout *inlayout[SWR_CH_MAX] = { NULL }, outlayout = { 0 };
+ AVChannelLayout outlayout = { 0 };
uint64_t outmask = 0;
AVFilterChannelLayouts *layouts;
int i, ret, nb_ch = 0;
+ int native_layout_routes[SWR_CH_MAX] = { 0 };
for (i = 0; i < s->nb_inputs; i++) {
if (!ctx->inputs[i]->incfg.channel_layouts ||
@@ -86,51 +89,47 @@ static int query_formats(AVFilterContext *ctx)
"No channel layout for input %d\n", i + 1);
return AVERROR(EAGAIN);
}
- inlayout[i] = &ctx->inputs[i]->incfg.channel_layouts->channel_layouts[0];
if (ctx->inputs[i]->incfg.channel_layouts->nb_channel_layouts > 1) {
char buf[256];
- av_channel_layout_describe(inlayout[i], buf, sizeof(buf));
+ av_channel_layout_describe(INLAYOUT(ctx, i), buf, sizeof(buf));
av_log(ctx, AV_LOG_INFO, "Using \"%s\" for input %d\n", buf, i + 1);
}
- s->in[i].nb_ch = inlayout[i]->nb_channels;
- for (int j = 0; j < s->in[i].nb_ch; j++) {
- enum AVChannel id = av_channel_layout_channel_from_index(inlayout[i], j);
- if (id >= 0 && id < 64)
- outmask |= (1ULL << id);
- }
+ s->in[i].nb_ch = INLAYOUT(ctx, i)->nb_channels;
nb_ch += s->in[i].nb_ch;
}
if (nb_ch > SWR_CH_MAX) {
av_log(ctx, AV_LOG_ERROR, "Too many channels (max %d)\n", SWR_CH_MAX);
return AVERROR(EINVAL);
}
+ for (int i = 0, ch_idx = 0; i < s->nb_inputs; i++) {
+ for (int j = 0; j < s->in[i].nb_ch; j++) {
+ enum AVChannel id = av_channel_layout_channel_from_index(INLAYOUT(ctx, i), j);
+ if (id >= 0 && id < 64) {
+ outmask |= (1ULL << id);
+ native_layout_routes[id] = ch_idx;
+ }
+ s->route[ch_idx] = ch_idx;
+ ch_idx++;
+ }
+ }
if (av_popcount64(outmask) != nb_ch) {
av_log(ctx, AV_LOG_WARNING,
"Input channel layouts overlap: "
"output layout will be determined by the number of distinct input channels\n");
- for (i = 0; i < nb_ch; i++)
- s->route[i] = i;
av_channel_layout_default(&outlayout, nb_ch);
if (!KNOWN(&outlayout) && nb_ch)
av_channel_layout_from_mask(&outlayout, 0xFFFFFFFFFFFFFFFFULL >> (64 - nb_ch));
} else {
- int *route[SWR_CH_MAX];
- int c, out_ch_number = 0;
-
+ for (int c = 0, ch_idx = 0; c < 64; c++)
+ if ((1ULL << c) & outmask)
+ s->route[native_layout_routes[c]] = ch_idx++;
av_channel_layout_from_mask(&outlayout, outmask);
- route[0] = s->route;
- for (i = 1; i < s->nb_inputs; i++)
- route[i] = route[i - 1] + s->in[i - 1].nb_ch;
- for (c = 0; c < 64; c++)
- for (i = 0; i < s->nb_inputs; i++)
- if (av_channel_layout_index_from_channel(inlayout[i], c) >= 0)
- *(route[i]++) = out_ch_number++;
}
if ((ret = ff_set_common_formats_from_list(ctx, packed_sample_fmts)) < 0)
return ret;
for (i = 0; i < s->nb_inputs; i++) {
layouts = NULL;
- if ((ret = ff_add_channel_layout(&layouts, inlayout[i])) < 0)
+ if ((ret = ff_add_channel_layout(&layouts, INLAYOUT(ctx, i))) < 0)
return ret;
if ((ret = ff_channel_layouts_ref(layouts, &ctx->inputs[i]->outcfg.channel_layouts)) < 0)
return ret;
--
2.49.1
>From f6f5455e9d3a49cd4e34c1e1f9560607f05d23e6 Mon Sep 17 00:00:00 2001
From: Marton Balint <cus@passwd.hu>
Date: Fri, 28 Nov 2025 23:59:18 +0100
Subject: [PATCH 3/5] avfilter/af_amerge: add layout_mode option to control
output channel layout
Signed-off-by: Marton Balint <cus@passwd.hu>
---
doc/filters.texi | 49 ++++++++++++++++++++++++++++---------
libavfilter/af_amerge.c | 53 ++++++++++++++++++++++++++++++++++++-----
2 files changed, 85 insertions(+), 17 deletions(-)
diff --git a/doc/filters.texi b/doc/filters.texi
index 168ea0d2da..464a602f8d 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -2436,6 +2436,11 @@ Only used if option named @var{start} is set to @code{-1}.
Merge two or more audio streams into a single multi-channel stream.
+All inputs must have the same sample rate, and format.
+
+If inputs do not have the same duration, the output will stop with the
+shortest.
+
The filter accepts the following options:
@table @option
@@ -2443,15 +2448,25 @@ The filter accepts the following options:
@item inputs
Set the number of inputs. Default is 2.
-@end table
+@item layout_mode
-If the channel layouts of the inputs are disjoint, and therefore compatible,
-the channel layout of the output will be set accordingly and the channels
-will be reordered as necessary. If the channel layouts of the inputs are not
-disjoint, the output will have all the channels of the first input then all
-the channels of the second input, in that order, and the channel layout of
-the output will be the default value corresponding to the total number of
-channels.
+This option controls how the output channel layout is determined and if the
+audio channels are reordered during merge.
+
+@table @option
+
+@item legacy
+
+This is the mode how the filter behaved historically so it is the default.
+
+If the channel layouts of the inputs are known and disjoint, and therefore
+compatible, the channel layout of the output will be set accordingly and the
+channels will be reordered as necessary. If the channel layouts of the inputs
+are not disjoint, some of them are unknown, or they are using special channel
+layouts, such as ambisonics, the output will have all the channels of the first
+input then all the channels of the second input, in that order, and the channel
+layout of the output will be the default value corresponding to the total
+number of channels.
For example, if the first input is in 2.1 (FL+FR+LF) and the second input
is FC+BL+BR, then the output will be in 5.1, with the channels in the
@@ -2462,10 +2477,22 @@ On the other hand, if both input are in stereo, the output channels will be
in the default order: a1, a2, b1, b2, and the channel layout will be
arbitrarily set to 4.0, which may or may not be the expected value.
-All inputs must have the same sample rate, and format.
+@item reset
+This mode ignores the input channel layouts and does no channel reordering.
+The output will have all the channels of the first input, then all the channels
+of the second input, in that order, and so on.
-If inputs do not have the same duration, the output will stop with the
-shortest.
+The output channel layout will only specify the total channel count.
+
+@item normal
+This mode keeps channel name and designation information from the input
+channels and does no channel reordering. The output will have all the channels
+of the first input, then all the channels of the second input, in that order,
+and so on.
+
+@end table
+
+@end table
@subsection Examples
diff --git a/libavfilter/af_amerge.c b/libavfilter/af_amerge.c
index 92afb4691f..e300cf9c7b 100644
--- a/libavfilter/af_amerge.c
+++ b/libavfilter/af_amerge.c
@@ -23,6 +23,7 @@
* Audio merging filter
*/
+#include "libavutil/avassert.h"
#include "libavutil/avstring.h"
#include "libavutil/bprint.h"
#include "libavutil/channel_layout.h"
@@ -43,14 +44,27 @@ typedef struct AMergeContext {
struct amerge_input {
int nb_ch; /**< number of channels for the input */
} *in;
+ int layout_mode; /**< the method for determining the output channel layout */
} AMergeContext;
#define OFFSET(x) offsetof(AMergeContext, x)
#define FLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+enum LayoutModes {
+ LM_LEGACY,
+ LM_RESET,
+ LM_NORMAL,
+ NB_LAYOUTMODES
+};
+
static const AVOption amerge_options[] = {
{ "inputs", "specify the number of inputs", OFFSET(nb_inputs),
AV_OPT_TYPE_INT, { .i64 = 2 }, 1, SWR_CH_MAX, FLAGS },
+ { "layout_mode", "method used to determine the output channel layout", OFFSET(layout_mode),
+ AV_OPT_TYPE_INT, { .i64 = LM_LEGACY }, 0, NB_LAYOUTMODES - 1, FLAGS, .unit = "layout_mode"},
+ { "legacy", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = LM_LEGACY }, 0, 0, FLAGS, .unit = "layout_mode" },
+ { "reset", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = LM_RESET }, 0, 0, FLAGS, .unit = "layout_mode" },
+ { "normal", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = LM_NORMAL }, 0, 0, FLAGS, .unit = "layout_mode" },
{ NULL }
};
@@ -101,9 +115,16 @@ static int query_formats(AVFilterContext *ctx)
av_log(ctx, AV_LOG_ERROR, "Too many channels (max %d)\n", SWR_CH_MAX);
return AVERROR(EINVAL);
}
+ ret = av_channel_layout_custom_init(&outlayout, nb_ch);
+ if (ret < 0)
+ return ret;
for (int i = 0, ch_idx = 0; i < s->nb_inputs; i++) {
for (int j = 0; j < s->in[i].nb_ch; j++) {
enum AVChannel id = av_channel_layout_channel_from_index(INLAYOUT(ctx, i), j);
+ if (INLAYOUT(ctx, i)->order == AV_CHANNEL_ORDER_CUSTOM)
+ outlayout.u.map[ch_idx] = INLAYOUT(ctx, i)->u.map[j];
+ else
+ outlayout.u.map[ch_idx].id = (id == AV_CHAN_NONE ? AV_CHAN_UNKNOWN : id);
if (id >= 0 && id < 64) {
outmask |= (1ULL << id);
native_layout_routes[id] = ch_idx;
@@ -112,6 +133,9 @@ static int query_formats(AVFilterContext *ctx)
ch_idx++;
}
}
+ switch (s->layout_mode) {
+ case LM_LEGACY:
+ av_channel_layout_uninit(&outlayout);
if (av_popcount64(outmask) != nb_ch) {
av_log(ctx, AV_LOG_WARNING,
"Input channel layouts overlap: "
@@ -125,22 +149,39 @@ static int query_formats(AVFilterContext *ctx)
s->route[native_layout_routes[c]] = ch_idx++;
av_channel_layout_from_mask(&outlayout, outmask);
}
+ break;
+ case LM_RESET:
+ av_channel_layout_uninit(&outlayout);
+ outlayout.order = AV_CHANNEL_ORDER_UNSPEC;
+ outlayout.nb_channels = nb_ch;
+ break;
+ case LM_NORMAL:
+ ret = av_channel_layout_retype(&outlayout, 0, AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL);
+ if (ret < 0)
+ goto out;
+ break;
+ default:
+ av_unreachable("Invalid layout_mode");
+ }
if ((ret = ff_set_common_formats_from_list(ctx, packed_sample_fmts)) < 0)
- return ret;
+ goto out;
for (i = 0; i < s->nb_inputs; i++) {
layouts = NULL;
if ((ret = ff_add_channel_layout(&layouts, INLAYOUT(ctx, i))) < 0)
- return ret;
+ goto out;
if ((ret = ff_channel_layouts_ref(layouts, &ctx->inputs[i]->outcfg.channel_layouts)) < 0)
- return ret;
+ goto out;
}
layouts = NULL;
if ((ret = ff_add_channel_layout(&layouts, &outlayout)) < 0)
- return ret;
+ goto out;
if ((ret = ff_channel_layouts_ref(layouts, &ctx->outputs[0]->incfg.channel_layouts)) < 0)
- return ret;
+ goto out;
- return ff_set_common_all_samplerates(ctx);
+ ret = ff_set_common_all_samplerates(ctx);
+out:
+ av_channel_layout_uninit(&outlayout);
+ return ret;
}
static int config_output(AVFilterLink *outlink)
--
2.49.1
>From 5f8bdf2f363a0cb3e0f03bfebf45412b3b7eea73 Mon Sep 17 00:00:00 2001
From: Marton Balint <cus@passwd.hu>
Date: Sat, 29 Nov 2025 00:10:50 +0100
Subject: [PATCH 4/5] avfilter/af_amerge: fix indentation
Signed-off-by: Marton Balint <cus@passwd.hu>
---
libavfilter/af_amerge.c | 30 +++++++++++++++---------------
1 file changed, 15 insertions(+), 15 deletions(-)
diff --git a/libavfilter/af_amerge.c b/libavfilter/af_amerge.c
index e300cf9c7b..13decdadc5 100644
--- a/libavfilter/af_amerge.c
+++ b/libavfilter/af_amerge.c
@@ -135,21 +135,21 @@ static int query_formats(AVFilterContext *ctx)
}
switch (s->layout_mode) {
case LM_LEGACY:
- av_channel_layout_uninit(&outlayout);
- if (av_popcount64(outmask) != nb_ch) {
- av_log(ctx, AV_LOG_WARNING,
- "Input channel layouts overlap: "
- "output layout will be determined by the number of distinct input channels\n");
- av_channel_layout_default(&outlayout, nb_ch);
- if (!KNOWN(&outlayout) && nb_ch)
- av_channel_layout_from_mask(&outlayout, 0xFFFFFFFFFFFFFFFFULL >> (64 - nb_ch));
- } else {
- for (int c = 0, ch_idx = 0; c < 64; c++)
- if ((1ULL << c) & outmask)
- s->route[native_layout_routes[c]] = ch_idx++;
- av_channel_layout_from_mask(&outlayout, outmask);
- }
- break;
+ av_channel_layout_uninit(&outlayout);
+ if (av_popcount64(outmask) != nb_ch) {
+ av_log(ctx, AV_LOG_WARNING,
+ "Input channel layouts overlap: "
+ "output layout will be determined by the number of distinct input channels\n");
+ av_channel_layout_default(&outlayout, nb_ch);
+ if (!KNOWN(&outlayout) && nb_ch)
+ av_channel_layout_from_mask(&outlayout, 0xFFFFFFFFFFFFFFFFULL >> (64 - nb_ch));
+ } else {
+ for (int c = 0, ch_idx = 0; c < 64; c++)
+ if ((1ULL << c) & outmask)
+ s->route[native_layout_routes[c]] = ch_idx++;
+ av_channel_layout_from_mask(&outlayout, outmask);
+ }
+ break;
case LM_RESET:
av_channel_layout_uninit(&outlayout);
outlayout.order = AV_CHANNEL_ORDER_UNSPEC;
--
2.49.1
>From 488736847134abc0b9c3eec93763bcebf51a78fc Mon Sep 17 00:00:00 2001
From: Marton Balint <cus@passwd.hu>
Date: Sun, 30 Nov 2025 23:00:15 +0100
Subject: [PATCH 5/5] fate/filter-audio: add amerge layout_mode test
Signed-off-by: Marton Balint <cus@passwd.hu>
---
tests/fate/filter-audio.mak | 6 +++
tests/ref/fate/filter-amerge-mode | 65 +++++++++++++++++++++++++++++++
2 files changed, 71 insertions(+)
create mode 100644 tests/ref/fate/filter-amerge-mode
diff --git a/tests/fate/filter-audio.mak b/tests/fate/filter-audio.mak
index b244f82bb7..526645a634 100644
--- a/tests/fate/filter-audio.mak
+++ b/tests/fate/filter-audio.mak
@@ -75,6 +75,12 @@ fate-filter-amerge: tests/data/asynth-44100-1.wav
fate-filter-amerge: SRC = $(TARGET_PATH)/tests/data/asynth-44100-1.wav
fate-filter-amerge: CMD = framecrc -i $(SRC) -i $(SRC) -filter_complex "[0:a][1:a]amerge=inputs=2[aout]" -map "[aout]"
+FATE_AFILTER-$(call FILTERDEMDECENCMUX, AMERGE, WAV, PCM_S16LE, PCM_S16LE, WAV) += fate-filter-amerge-mode
+fate-filter-amerge-mode: tests/data/asynth-44100-1.wav
+fate-filter-amerge-mode: SRC = $(TARGET_PATH)/tests/data/asynth-44100-1.wav
+fate-filter-amerge-mode: CMD = framecrc -channel_layout FL -i $(SRC) -ss 0.1 -channel_layout FR -i $(SRC) -ss 0.2 -i $(SRC) -ss 0.3 -i $(SRC) -ss 0.4 -i $(SRC) -ss 0.5 -i $(SRC) \
+ -filter_complex "[1:a][0:a]amerge[tmp1];[2:a][3:a]amerge=layout_mode=reset[tmp2];[tmp1][tmp2][4:a][5:a]amerge=inputs=4:layout_mode=normal[aout]" -map "[aout]"
+
FATE_AFILTER-$(call FILTERDEMDECENCMUX, APAD, WAV, PCM_S16LE, PCM_S16LE, WAV) += fate-filter-apad
fate-filter-apad: tests/data/asynth-44100-2.wav
fate-filter-apad: SRC = $(TARGET_PATH)/tests/data/asynth-44100-2.wav
diff --git a/tests/ref/fate/filter-amerge-mode b/tests/ref/fate/filter-amerge-mode
new file mode 100644
index 0000000000..b066323f13
--- /dev/null
+++ b/tests/ref/fate/filter-amerge-mode
@@ -0,0 +1,65 @@
+#tb 0: 1/44100
+#media_type 0: audio
+#codec_id 0: pcm_s16le
+#sample_rate 0: 44100
+#channel_layout_name 0: 6 channels (FL+FR+UNK+UNK+FC+FC)
+0, 0, 0, 4096, 49152, 0xd5b59e0b
+0, 4096, 4096, 4096, 49152, 0x5d99b2bc
+0, 8192, 8192, 4096, 49152, 0xafa8901f
+0, 12288, 12288, 4096, 49152, 0x97cd98b3
+0, 16384, 16384, 4096, 49152, 0x767fa951
+0, 20480, 20480, 4096, 49152, 0x09bc8763
+0, 24576, 24576, 4096, 49152, 0xd50e90ae
+0, 28672, 28672, 4096, 49152, 0xc7ce978d
+0, 32768, 32768, 4096, 49152, 0xb90ac520
+0, 36864, 36864, 4096, 49152, 0x32a2ac52
+0, 40960, 40960, 4096, 49152, 0x71ec85c8
+0, 45056, 45056, 4096, 49152, 0x4401b98a
+0, 49152, 49152, 4096, 49152, 0x972cb3b7
+0, 53248, 53248, 4096, 49152, 0x2c37f62d
+0, 57344, 57344, 4096, 49152, 0xee612003
+0, 61440, 61440, 4096, 49152, 0x4f46e987
+0, 65536, 65536, 4096, 49152, 0xb39484ca
+0, 69632, 69632, 4096, 49152, 0xc9042028
+0, 73728, 73728, 4096, 49152, 0xb196a39a
+0, 77824, 77824, 4096, 49152, 0xe4627739
+0, 81920, 81920, 4096, 49152, 0x3107d993
+0, 86016, 86016, 4096, 49152, 0x88606597
+0, 90112, 90112, 4096, 49152, 0xa3df9656
+0, 94208, 94208, 4096, 49152, 0x49442705
+0, 98304, 98304, 4096, 49152, 0x800256b2
+0, 102400, 102400, 4096, 49152, 0x1cb9af12
+0, 106496, 106496, 4096, 49152, 0xbe2d3e59
+0, 110592, 110592, 4096, 49152, 0x73e17139
+0, 114688, 114688, 4096, 49152, 0xc91a7787
+0, 118784, 118784, 4096, 49152, 0x4edf8c55
+0, 122880, 122880, 4096, 49152, 0x70057319
+0, 126976, 126976, 4096, 49152, 0x8a629a55
+0, 131072, 131072, 4096, 49152, 0xc9786b28
+0, 135168, 135168, 4096, 49152, 0x2efd7e7c
+0, 139264, 139264, 4096, 49152, 0x28877cd0
+0, 143360, 143360, 4096, 49152, 0xfd64967e
+0, 147456, 147456, 4096, 49152, 0x0caa8be5
+0, 151552, 151552, 4096, 49152, 0x097dc3c2
+0, 155648, 155648, 4096, 49152, 0xde78524d
+0, 159744, 159744, 4096, 49152, 0xbddb968b
+0, 163840, 163840, 4096, 49152, 0x146347cd
+0, 167936, 167936, 4096, 49152, 0x21ab8f0d
+0, 172032, 172032, 4096, 49152, 0xd2a0b60e
+0, 176128, 176128, 4096, 49152, 0xc7916e40
+0, 180224, 180224, 4096, 49152, 0xd42f5b66
+0, 184320, 184320, 4096, 49152, 0x2daeda35
+0, 188416, 188416, 4096, 49152, 0xd0220a25
+0, 192512, 192512, 4096, 49152, 0xfb962b0d
+0, 196608, 196608, 4096, 49152, 0xb1c6418c
+0, 200704, 200704, 4096, 49152, 0xc5e35827
+0, 204800, 204800, 4096, 49152, 0xf3cb0c12
+0, 208896, 208896, 4096, 49152, 0xfec64d90
+0, 212992, 212992, 4096, 49152, 0xb8685f78
+0, 217088, 217088, 4096, 49152, 0xe7d1562f
+0, 221184, 221184, 4096, 49152, 0xf453cba9
+0, 225280, 225280, 4096, 49152, 0x28928fce
+0, 229376, 229376, 4096, 49152, 0x64a909d9
+0, 233472, 233472, 4096, 49152, 0x2bf762b1
+0, 237568, 237568, 4096, 49152, 0x085daec8
+0, 241664, 241664, 886, 10632, 0x1522906c
--
2.49.1
_______________________________________________
ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org
To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2025-11-30 22:09 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-11-30 22:08 [FFmpeg-devel] [PATCH] Fix and extend amerge filter (PR #21068) Marton Balint via ffmpeg-devel
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git