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 <[email protected]> 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 <[email protected]> --- 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 <[email protected]> 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 <[email protected]> --- 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 <[email protected]> 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 <[email protected]> --- 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 <[email protected]> Date: Sat, 29 Nov 2025 00:10:50 +0100 Subject: [PATCH 4/5] avfilter/af_amerge: fix indentation Signed-off-by: Marton Balint <[email protected]> --- 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 <[email protected]> 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 <[email protected]> --- 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 -- [email protected] To unsubscribe send an email to [email protected]
