PR #25378 opened by Daniel Campos Ramos (danielcamposramos) URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/25378 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/25378.patch
stereo3d currently keeps the input's Stereo 3D side data after changing the picture layout. A top and bottom input converted with stereo3d=abl:sbsl is still marked top and bottom. libx264 then writes a top and bottom frame packing SEI, and mpeg2video writes JP3D type 0x04 instead of 0x03. Replace the packing type, eye order and view on every packed output frame, including direct output and alternating frames. Keep the primary eye as a preference for 2D rendering, independently of packing order, and preserve the camera fields. Remove the mark from mono and anaglyph output. HDMI output includes a blanking gap that AVStereo3D cannot describe, so mark its packing unspecified rather than retaining a false input layout. The FATE regression fails on master and passes all 192 cases after the fix with GCC and clang. It checks every named output, absent and duplicate input marks, and shared input frames. The full applicable suites pass all 5,993 control tests and all 5,994 patched tests with each compiler, with no changed existing output. All 74 encoder checks pass with each compiler. They read the H.264 SEI and JP3D bytes independently, and the H.264 reader agrees with trace_headers. The tests also record the existing encoder limits: libx264 cannot signal inverted packing, and JP3D has no eye order field. It touches the same filter as #25377 (the icr eye order fix); the two apply together without conflicts, and the combination passes all 25 stereo3d FATE tests. @Cigaes, this follows #25376 in the same filter, in case you look at both together. AI partners helped produce this work. >From 910113aecd02ea45f7ef237f2be15513e37db8bb Mon Sep 17 00:00:00 2001 From: Daniel Campos Ramos <[email protected]> Date: Fri, 23 Oct 2026 01:03:46 -0300 Subject: [PATCH] avfilter/stereo3d: describe output packing in frame side data Replace stale input packing after conversion, including direct output and both alternating-frame paths. Preserve the primary-eye preference and camera fields, and remove the stereo mark for mono and anaglyph output. Use unspecified packing for HDMI output, whose blanking area has no corresponding AVStereo3D type. Propagate metadata allocation failures when producing paired frames. Add a FATE test for every named output, absent and duplicate marks, shared input frames, and the direct and buffered output paths. The test fails on unpatched master with both GCC and clang. Signed-off-by: Daniel Campos Ramos <[email protected]> Assisted-by: gpt-6-astra via Codex --- libavfilter/Makefile | 1 + libavfilter/tests/stereo3d.c | 208 ++++++++++++++++++++++++ libavfilter/vf_stereo3d.c | 92 ++++++++++- tests/fate/filter-video.mak | 7 +- tests/ref/fate/filter-stereo3d-metadata | 192 ++++++++++++++++++++++ 5 files changed, 492 insertions(+), 8 deletions(-) create mode 100644 libavfilter/tests/stereo3d.c create mode 100644 tests/ref/fate/filter-stereo3d-metadata diff --git a/libavfilter/Makefile b/libavfilter/Makefile index ef2542b98b9..f4b5479eb40 100644 --- a/libavfilter/Makefile +++ b/libavfilter/Makefile @@ -691,6 +691,7 @@ TOOLS = graph2dot TESTPROGS = drawutils filtfmts formats integral TESTPROGS-$(CONFIG_DRAWVG_FILTER) += drawvg +TESTPROGS-$(CONFIG_STEREO3D_FILTER) += stereo3d TOOLS-$(CONFIG_LIBZMQ) += zmqsend diff --git a/libavfilter/tests/stereo3d.c b/libavfilter/tests/stereo3d.c new file mode 100644 index 00000000000..9e8a501ee54 --- /dev/null +++ b/libavfilter/tests/stereo3d.c @@ -0,0 +1,208 @@ +/* + * Copyright (c) 2026 Daniel Campos Ramos + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <stdio.h> +#include <string.h> + +#include "libavutil/common.h" +#include "libavutil/stereo3d.h" +#include "libavfilter/avfilter.h" +#include "libavfilter/buffersink.h" +#include "libavfilter/buffersrc.h" + +static const struct { + const char *name; + int type, inverted; +} outputs[] = { + { "sbsl", AV_STEREO3D_SIDEBYSIDE, 0 }, + { "sbsr", AV_STEREO3D_SIDEBYSIDE, 1 }, + { "sbs2l", AV_STEREO3D_SIDEBYSIDE, 0 }, + { "sbs2r", AV_STEREO3D_SIDEBYSIDE, 1 }, + { "abl", AV_STEREO3D_TOPBOTTOM, 0 }, + { "abr", AV_STEREO3D_TOPBOTTOM, 1 }, + { "ab2l", AV_STEREO3D_TOPBOTTOM, 0 }, + { "ab2r", AV_STEREO3D_TOPBOTTOM, 1 }, + { "tbl", AV_STEREO3D_TOPBOTTOM, 0 }, + { "tbr", AV_STEREO3D_TOPBOTTOM, 1 }, + { "tb2l", AV_STEREO3D_TOPBOTTOM, 0 }, + { "tb2r", AV_STEREO3D_TOPBOTTOM, 1 }, + { "irl", AV_STEREO3D_LINES, 0 }, + { "irr", AV_STEREO3D_LINES, 1 }, + { "icl", AV_STEREO3D_COLUMNS, 0 }, + { "icr", AV_STEREO3D_COLUMNS, 1 }, + { "chl", AV_STEREO3D_CHECKERBOARD, 0 }, + { "chr", AV_STEREO3D_CHECKERBOARD, 1 }, + { "al", AV_STEREO3D_FRAMESEQUENCE, 0 }, + { "ar", AV_STEREO3D_FRAMESEQUENCE, 1 }, + { "hdmi", AV_STEREO3D_UNSPEC, 0 }, + { "ml", -1, 0 }, { "mr", -1, 0 }, + { "agmc", -1, 0 }, { "agmd", -1, 0 }, + { "agmg", -1, 0 }, { "agmh", -1, 0 }, + { "arbg", -1, 0 }, { "arcc", -1, 0 }, + { "arcd", -1, 0 }, { "arcg", -1, 0 }, + { "arch", -1, 0 }, { "argg", -1, 0 }, + { "aybc", -1, 0 }, { "aybd", -1, 0 }, + { "aybg", -1, 0 }, { "aybh", -1, 0 }, +}; + +static int is_alternating(const char *name) +{ + return !strcmp(name, "al") || !strcmp(name, "ar"); +} + +static int check(const char *input, unsigned output, int marked) +{ + AVFilterGraph *graph = avfilter_graph_alloc(); + AVFilterContext *source, *filter, *sink; + AVFrame *frame = av_frame_alloc(), *result = av_frame_alloc(); + AVStereo3D *stereo = NULL; + char args[128]; + const char *name = outputs[output].name; + const int type = outputs[output].type; + const int temporal = type == AV_STEREO3D_FRAMESEQUENCE; + int width = 64, height = !strcmp(name, "hdmi") ? 1440 : 96; + int ret = 0, bad = 0, count = 0, expected; + + if (!graph || !frame || !result) { + ret = AVERROR(ENOMEM); + goto end; + } + graph->nb_threads = 1; + snprintf(args, sizeof(args), "video_size=%dx%d:pix_fmt=rgb24:" + "time_base=1/25:frame_rate=25/1:pixel_aspect=1/1", width, height); + ret = avfilter_graph_create_filter(&source, avfilter_get_by_name("buffer"), + "in", args, NULL, graph); + if (ret < 0) + goto end; + snprintf(args, sizeof(args), "%s:%s", input, name); + ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("stereo3d"), + "stereo", args, NULL, graph); + if (ret < 0) + goto end; + ret = avfilter_graph_create_filter(&sink, avfilter_get_by_name("buffersink"), + "out", NULL, NULL, graph); + if (ret < 0 || (ret = avfilter_link(source, 0, filter, 0)) < 0 || + (ret = avfilter_link(filter, 0, sink, 0)) < 0 || + (ret = avfilter_graph_config(graph, NULL)) < 0) + goto end; + + frame->width = width; + frame->height = height; + frame->format = AV_PIX_FMT_RGB24; + frame->sample_aspect_ratio = (AVRational) { 1, 1 }; + ret = av_frame_get_buffer(frame, 0); + if (ret < 0) + goto end; + for (int y = 0; y < height; y++) + memset(frame->data[0] + y * frame->linesize[0], y < height / 2 ? 32 : 192, width * 3); + for (int i = 0; i < marked; i++) { + AVStereo3D *sd = av_stereo3d_create_side_data(frame); + if (!sd) { + ret = AVERROR(ENOMEM); + goto end; + } + sd->type = AV_STEREO3D_TOPBOTTOM; + sd->flags = AV_STEREO3D_FLAG_INVERT; + sd->view = AV_STEREO3D_VIEW_RIGHT; + sd->primary_eye = AV_PRIMARY_EYE_RIGHT; + sd->baseline = 65000; + sd->horizontal_disparity_adjustment = (AVRational) { 1, 8 }; + sd->horizontal_field_of_view = (AVRational) { 90, 1 }; + if (!stereo) + stereo = sd; + } + /* Keep a reference to the input side data while the filter replaces it. */ + for (int i = 0; i < 4; i++) { + frame->pts = i; + ret = av_buffersrc_add_frame_flags(source, frame, AV_BUFFERSRC_FLAG_KEEP_REF); + if (ret < 0) + goto end; + } + ret = av_buffersrc_add_frame_flags(source, NULL, 0); + if (ret < 0) + goto end; + while ((ret = av_buffersink_get_frame(sink, result)) >= 0) { + const AVFrameSideData *side = av_frame_get_side_data(result, AV_FRAME_DATA_STEREO3D); + const AVStereo3D *sd = side ? (const AVStereo3D *)side->data : NULL; + int entries = 0; + for (int i = 0; i < result->nb_side_data; i++) + entries += result->side_data[i]->type == AV_FRAME_DATA_STEREO3D; + if (type < 0) { + bad |= entries != 0; + } else { + /* INVERT applies to the view slots, as in the H.264 SEI exporter. */ + int view = temporal ? (count & 1 ? AV_STEREO3D_VIEW_RIGHT : AV_STEREO3D_VIEW_LEFT) : AV_STEREO3D_VIEW_PACKED; + if (entries != 1 || !sd || sd->type != type || + sd->flags != (outputs[output].inverted ? AV_STEREO3D_FLAG_INVERT : 0) || + sd->view != view || sd->primary_eye != (marked ? AV_PRIMARY_EYE_RIGHT : AV_PRIMARY_EYE_NONE) || + sd->baseline != (marked ? 65000 : 0) || + av_cmp_q(sd->horizontal_disparity_adjustment, (AVRational) { marked ? 1 : 0, 8 }) || + av_cmp_q(sd->horizontal_field_of_view, (AVRational) { marked ? 90 : 0, 1 })) { + fprintf(stderr, "%s:%s mark=%d frame=%d: entries=%d type=%d flags=%d view=%d primary=%d\n", + input, name, marked, count, entries, sd ? sd->type : -1, + sd ? sd->flags : -1, sd ? sd->view : -1, sd ? sd->primary_eye : -1); + bad = 1; + } + } + count++; + av_frame_unref(result); + } + if (ret != AVERROR_EOF) + goto end; + expected = is_alternating(input) ? (temporal ? 4 : 2) : (temporal ? 6 : 4); + bad |= count != expected; + if (stereo) + bad |= stereo->type != AV_STEREO3D_TOPBOTTOM || + stereo->flags != AV_STEREO3D_FLAG_INVERT || + stereo->view != AV_STEREO3D_VIEW_RIGHT || + stereo->primary_eye != AV_PRIMARY_EYE_RIGHT || + stereo->baseline != 65000; + printf("%s:%s marked=%d frames=%d %s\n", input, name, marked, count, bad ? "FAIL" : "OK"); + ret = bad ? AVERROR_INVALIDDATA : 0; +end: + av_frame_free(&frame); + av_frame_free(&result); + avfilter_graph_free(&graph); + return ret; +} + +int main(void) +{ + static const char *const inputs[] = { + "sbsl", "sbsr", "sbs2l", "sbs2r", "abl", "abr", "ab2l", "ab2r", + "irl", "irr", "icl", "icr", "al", "ar", + }; + int failed = 0; + + av_log_set_level(AV_LOG_ERROR); + for (unsigned i = 0; i < FF_ARRAY_ELEMS(outputs); i++) + for (int marked = 0; marked <= 2; marked++) + failed |= check("abl", i, marked) < 0; + /* Exercise every input, including the direct and buffered output paths. */ + for (unsigned i = 0; i < FF_ARRAY_ELEMS(inputs); i++) + for (unsigned j = 0; j < FF_ARRAY_ELEMS(outputs); j++) + if (!strcmp(inputs[i], outputs[j].name) || + !strcmp(outputs[j].name, "sbsl") || + !strcmp(outputs[j].name, "ml") || + !strcmp(outputs[j].name, "mr") || + is_alternating(outputs[j].name)) + failed |= check(inputs[i], j, 1) < 0; + return failed; +} diff --git a/libavfilter/vf_stereo3d.c b/libavfilter/vf_stereo3d.c index 15d6f31c11f..f9c0fa81e6d 100644 --- a/libavfilter/vf_stereo3d.c +++ b/libavfilter/vf_stereo3d.c @@ -25,6 +25,7 @@ #include "libavutil/opt.h" #include "libavutil/parseutils.h" #include "libavutil/pixdesc.h" +#include "libavutil/stereo3d.h" #include "avfilter.h" #include "drawutils.h" #include "filters.h" @@ -148,6 +149,7 @@ typedef struct Stereo3DContext { int hsub, vsub; int pixstep[4]; AVFrame *prev; + int next_view; int blanks; int in_off_left[4], in_off_right[4]; AVRational aspect; @@ -676,6 +678,72 @@ static void interleave_cols_to_any(Stereo3DContext *s, int *out_off, int p, AVFr } } +static int output_frame(AVFilterContext *ctx, AVFrame *frame) +{ + Stereo3DContext *s = ctx->priv; + const AVFrameSideData *sd = av_frame_get_side_data(frame, AV_FRAME_DATA_STEREO3D); + AVStereo3D props, *stereo; + int has_stereo = !!sd; + + if (sd) + props = *(const AVStereo3D *)sd->data; + av_frame_remove_side_data(frame, AV_FRAME_DATA_STEREO3D); + + if (s->out.format <= MONO_R) + return ff_filter_frame(ctx->outputs[0], frame); + + stereo = av_stereo3d_create_side_data(frame); + if (!stereo) { + av_frame_free(&frame); + return AVERROR(ENOMEM); + } + if (has_stereo) + *stereo = props; + stereo->flags = s->out.format & 1 ? AV_STEREO3D_FLAG_INVERT : 0; + stereo->view = AV_STEREO3D_VIEW_PACKED; + + switch (s->out.format) { + case SIDE_BY_SIDE_LR: + case SIDE_BY_SIDE_RL: + case SIDE_BY_SIDE_2_LR: + case SIDE_BY_SIDE_2_RL: + stereo->type = AV_STEREO3D_SIDEBYSIDE; + break; + case ABOVE_BELOW_LR: + case ABOVE_BELOW_RL: + case ABOVE_BELOW_2_LR: + case ABOVE_BELOW_2_RL: + stereo->type = AV_STEREO3D_TOPBOTTOM; + break; + case INTERLEAVE_ROWS_LR: + case INTERLEAVE_ROWS_RL: + stereo->type = AV_STEREO3D_LINES; + break; + case INTERLEAVE_COLS_LR: + case INTERLEAVE_COLS_RL: + stereo->type = AV_STEREO3D_COLUMNS; + break; + case CHECKERBOARD_LR: + case CHECKERBOARD_RL: + stereo->type = AV_STEREO3D_CHECKERBOARD; + break; + case ALTERNATING_LR: + case ALTERNATING_RL: + stereo->type = AV_STEREO3D_FRAMESEQUENCE; + stereo->view = s->next_view ? AV_STEREO3D_VIEW_RIGHT : AV_STEREO3D_VIEW_LEFT; + s->next_view ^= 1; + break; + case HDMI: + /* The blanking area cannot be described by AV_STEREO3D_TOPBOTTOM. */ + stereo->type = AV_STEREO3D_UNSPEC; + break; + default: + av_assert0(0); + } + + return ff_filter_frame(ctx->outputs[0], frame); +} + static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref) { AVFilterContext *ctx = inlink->dst; @@ -686,7 +754,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref) int i, ret; if (s->in.format == s->out.format) - return ff_filter_frame(outlink, inpicref); + return output_frame(ctx, inpicref); switch (s->out.format) { case ALTERNATING_LR: @@ -756,7 +824,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref) } else if ((s->out.format == MONO_L && s->in.format == ALTERNATING_LR) || (s->out.format == MONO_R && s->in.format == ALTERNATING_RL)) { s->prev->pts /= 2; - ret = ff_filter_frame(outlink, s->prev); + ret = output_frame(ctx, s->prev); av_frame_free(&inpicref); s->prev = NULL; return ret; @@ -764,12 +832,16 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref) (s->out.format == MONO_R && s->in.format == ALTERNATING_LR)) { av_frame_free(&s->prev); inpicref->pts /= 2; - return ff_filter_frame(outlink, inpicref); + return output_frame(ctx, inpicref); } else if ((s->out.format == ALTERNATING_LR && s->in.format == ALTERNATING_RL) || (s->out.format == ALTERNATING_RL && s->in.format == ALTERNATING_LR)) { FFSWAP(int64_t, s->prev->pts, inpicref->pts); - ff_filter_frame(outlink, inpicref); - ret = ff_filter_frame(outlink, s->prev); + ret = output_frame(ctx, inpicref); + if (ret < 0) { + av_frame_free(&s->prev); + return ret; + } + ret = output_frame(ctx, s->prev); s->prev = NULL; return ret; } else { @@ -1081,7 +1153,13 @@ copy: if (s->out.format == ALTERNATING_LR) FFSWAP(AVFrame *, oleft, oright); oright->pts = s->prev->pts * 2; - ff_filter_frame(outlink, oright); + ret = output_frame(ctx, oright); + if (ret < 0) { + av_frame_free(&oleft); + av_frame_free(&s->prev); + av_frame_free(&inpicref); + return ret; + } out = oleft; oleft->pts = s->prev->pts + inpicref->pts; av_frame_free(&s->prev); @@ -1097,7 +1175,7 @@ copy: } av_assert0(out); out->sample_aspect_ratio = s->aspect; - return ff_filter_frame(outlink, out); + return output_frame(ctx, out); } static av_cold void uninit(AVFilterContext *ctx) diff --git a/tests/fate/filter-video.mak b/tests/fate/filter-video.mak index 4a065ec0320..530342bc574 100644 --- a/tests/fate/filter-video.mak +++ b/tests/fate/filter-video.mak @@ -730,7 +730,12 @@ FATE_STEREO3D_ANAGLYPH := $(addprefix fate-filter-stereo3d-sbsl-, $(FATE_STEREO3 $(FATE_STEREO3D_ANAGLYPH): CMD = framecrc -c:v pgmyuv -i $(SRC) -frames:v 5 -flags +bitexact -sws_flags +accurate_rnd+bitexact -vf scale,stereo3d=$(word 4, $(subst -, ,$(@))):$(word 5, $(subst -, ,$(@))) FATE_STEREO3D-$(call FILTERDEMDEC, SCALE STEREO3D, IMAGE2, PGMYUV) += $(FATE_STEREO3D_ANAGLYPH) -fate-filter-stereo3d: $(FATE_STEREO3D-yes) +FATE_STEREO3D_METADATA-$(CONFIG_STEREO3D_FILTER) += fate-filter-stereo3d-metadata +fate-filter-stereo3d-metadata: libavfilter/tests/stereo3d$(EXESUF) +fate-filter-stereo3d-metadata: CMD = run libavfilter/tests/stereo3d$(EXESUF) +FATE_LIBAVFILTER-yes += $(FATE_STEREO3D_METADATA-yes) + +fate-filter-stereo3d: $(FATE_STEREO3D-yes) $(FATE_STEREO3D_METADATA-yes) FATE_FILTER_VSYNTH-yes += $(FATE_STEREO3D-yes) FATE_FILTER_VSYNTH_VIDEO_FILTER-$(call ALLYES, SCALE_FILTER THUMBNAIL_FILTER) += fate-filter-thumbnail diff --git a/tests/ref/fate/filter-stereo3d-metadata b/tests/ref/fate/filter-stereo3d-metadata new file mode 100644 index 00000000000..95c0180fb89 --- /dev/null +++ b/tests/ref/fate/filter-stereo3d-metadata @@ -0,0 +1,192 @@ +abl:sbsl marked=0 frames=4 OK +abl:sbsl marked=1 frames=4 OK +abl:sbsl marked=2 frames=4 OK +abl:sbsr marked=0 frames=4 OK +abl:sbsr marked=1 frames=4 OK +abl:sbsr marked=2 frames=4 OK +abl:sbs2l marked=0 frames=4 OK +abl:sbs2l marked=1 frames=4 OK +abl:sbs2l marked=2 frames=4 OK +abl:sbs2r marked=0 frames=4 OK +abl:sbs2r marked=1 frames=4 OK +abl:sbs2r marked=2 frames=4 OK +abl:abl marked=0 frames=4 OK +abl:abl marked=1 frames=4 OK +abl:abl marked=2 frames=4 OK +abl:abr marked=0 frames=4 OK +abl:abr marked=1 frames=4 OK +abl:abr marked=2 frames=4 OK +abl:ab2l marked=0 frames=4 OK +abl:ab2l marked=1 frames=4 OK +abl:ab2l marked=2 frames=4 OK +abl:ab2r marked=0 frames=4 OK +abl:ab2r marked=1 frames=4 OK +abl:ab2r marked=2 frames=4 OK +abl:tbl marked=0 frames=4 OK +abl:tbl marked=1 frames=4 OK +abl:tbl marked=2 frames=4 OK +abl:tbr marked=0 frames=4 OK +abl:tbr marked=1 frames=4 OK +abl:tbr marked=2 frames=4 OK +abl:tb2l marked=0 frames=4 OK +abl:tb2l marked=1 frames=4 OK +abl:tb2l marked=2 frames=4 OK +abl:tb2r marked=0 frames=4 OK +abl:tb2r marked=1 frames=4 OK +abl:tb2r marked=2 frames=4 OK +abl:irl marked=0 frames=4 OK +abl:irl marked=1 frames=4 OK +abl:irl marked=2 frames=4 OK +abl:irr marked=0 frames=4 OK +abl:irr marked=1 frames=4 OK +abl:irr marked=2 frames=4 OK +abl:icl marked=0 frames=4 OK +abl:icl marked=1 frames=4 OK +abl:icl marked=2 frames=4 OK +abl:icr marked=0 frames=4 OK +abl:icr marked=1 frames=4 OK +abl:icr marked=2 frames=4 OK +abl:chl marked=0 frames=4 OK +abl:chl marked=1 frames=4 OK +abl:chl marked=2 frames=4 OK +abl:chr marked=0 frames=4 OK +abl:chr marked=1 frames=4 OK +abl:chr marked=2 frames=4 OK +abl:al marked=0 frames=6 OK +abl:al marked=1 frames=6 OK +abl:al marked=2 frames=6 OK +abl:ar marked=0 frames=6 OK +abl:ar marked=1 frames=6 OK +abl:ar marked=2 frames=6 OK +abl:hdmi marked=0 frames=4 OK +abl:hdmi marked=1 frames=4 OK +abl:hdmi marked=2 frames=4 OK +abl:ml marked=0 frames=4 OK +abl:ml marked=1 frames=4 OK +abl:ml marked=2 frames=4 OK +abl:mr marked=0 frames=4 OK +abl:mr marked=1 frames=4 OK +abl:mr marked=2 frames=4 OK +abl:agmc marked=0 frames=4 OK +abl:agmc marked=1 frames=4 OK +abl:agmc marked=2 frames=4 OK +abl:agmd marked=0 frames=4 OK +abl:agmd marked=1 frames=4 OK +abl:agmd marked=2 frames=4 OK +abl:agmg marked=0 frames=4 OK +abl:agmg marked=1 frames=4 OK +abl:agmg marked=2 frames=4 OK +abl:agmh marked=0 frames=4 OK +abl:agmh marked=1 frames=4 OK +abl:agmh marked=2 frames=4 OK +abl:arbg marked=0 frames=4 OK +abl:arbg marked=1 frames=4 OK +abl:arbg marked=2 frames=4 OK +abl:arcc marked=0 frames=4 OK +abl:arcc marked=1 frames=4 OK +abl:arcc marked=2 frames=4 OK +abl:arcd marked=0 frames=4 OK +abl:arcd marked=1 frames=4 OK +abl:arcd marked=2 frames=4 OK +abl:arcg marked=0 frames=4 OK +abl:arcg marked=1 frames=4 OK +abl:arcg marked=2 frames=4 OK +abl:arch marked=0 frames=4 OK +abl:arch marked=1 frames=4 OK +abl:arch marked=2 frames=4 OK +abl:argg marked=0 frames=4 OK +abl:argg marked=1 frames=4 OK +abl:argg marked=2 frames=4 OK +abl:aybc marked=0 frames=4 OK +abl:aybc marked=1 frames=4 OK +abl:aybc marked=2 frames=4 OK +abl:aybd marked=0 frames=4 OK +abl:aybd marked=1 frames=4 OK +abl:aybd marked=2 frames=4 OK +abl:aybg marked=0 frames=4 OK +abl:aybg marked=1 frames=4 OK +abl:aybg marked=2 frames=4 OK +abl:aybh marked=0 frames=4 OK +abl:aybh marked=1 frames=4 OK +abl:aybh marked=2 frames=4 OK +sbsl:sbsl marked=1 frames=4 OK +sbsl:al marked=1 frames=6 OK +sbsl:ar marked=1 frames=6 OK +sbsl:ml marked=1 frames=4 OK +sbsl:mr marked=1 frames=4 OK +sbsr:sbsl marked=1 frames=4 OK +sbsr:sbsr marked=1 frames=4 OK +sbsr:al marked=1 frames=6 OK +sbsr:ar marked=1 frames=6 OK +sbsr:ml marked=1 frames=4 OK +sbsr:mr marked=1 frames=4 OK +sbs2l:sbsl marked=1 frames=4 OK +sbs2l:sbs2l marked=1 frames=4 OK +sbs2l:al marked=1 frames=6 OK +sbs2l:ar marked=1 frames=6 OK +sbs2l:ml marked=1 frames=4 OK +sbs2l:mr marked=1 frames=4 OK +sbs2r:sbsl marked=1 frames=4 OK +sbs2r:sbs2r marked=1 frames=4 OK +sbs2r:al marked=1 frames=6 OK +sbs2r:ar marked=1 frames=6 OK +sbs2r:ml marked=1 frames=4 OK +sbs2r:mr marked=1 frames=4 OK +abl:sbsl marked=1 frames=4 OK +abl:abl marked=1 frames=4 OK +abl:al marked=1 frames=6 OK +abl:ar marked=1 frames=6 OK +abl:ml marked=1 frames=4 OK +abl:mr marked=1 frames=4 OK +abr:sbsl marked=1 frames=4 OK +abr:abr marked=1 frames=4 OK +abr:al marked=1 frames=6 OK +abr:ar marked=1 frames=6 OK +abr:ml marked=1 frames=4 OK +abr:mr marked=1 frames=4 OK +ab2l:sbsl marked=1 frames=4 OK +ab2l:ab2l marked=1 frames=4 OK +ab2l:al marked=1 frames=6 OK +ab2l:ar marked=1 frames=6 OK +ab2l:ml marked=1 frames=4 OK +ab2l:mr marked=1 frames=4 OK +ab2r:sbsl marked=1 frames=4 OK +ab2r:ab2r marked=1 frames=4 OK +ab2r:al marked=1 frames=6 OK +ab2r:ar marked=1 frames=6 OK +ab2r:ml marked=1 frames=4 OK +ab2r:mr marked=1 frames=4 OK +irl:sbsl marked=1 frames=4 OK +irl:irl marked=1 frames=4 OK +irl:al marked=1 frames=6 OK +irl:ar marked=1 frames=6 OK +irl:ml marked=1 frames=4 OK +irl:mr marked=1 frames=4 OK +irr:sbsl marked=1 frames=4 OK +irr:irr marked=1 frames=4 OK +irr:al marked=1 frames=6 OK +irr:ar marked=1 frames=6 OK +irr:ml marked=1 frames=4 OK +irr:mr marked=1 frames=4 OK +icl:sbsl marked=1 frames=4 OK +icl:icl marked=1 frames=4 OK +icl:al marked=1 frames=6 OK +icl:ar marked=1 frames=6 OK +icl:ml marked=1 frames=4 OK +icl:mr marked=1 frames=4 OK +icr:sbsl marked=1 frames=4 OK +icr:icr marked=1 frames=4 OK +icr:al marked=1 frames=6 OK +icr:ar marked=1 frames=6 OK +icr:ml marked=1 frames=4 OK +icr:mr marked=1 frames=4 OK +al:sbsl marked=1 frames=2 OK +al:al marked=1 frames=4 OK +al:ar marked=1 frames=4 OK +al:ml marked=1 frames=2 OK +al:mr marked=1 frames=2 OK +ar:sbsl marked=1 frames=2 OK +ar:al marked=1 frames=4 OK +ar:ar marked=1 frames=4 OK +ar:ml marked=1 frames=2 OK +ar:mr marked=1 frames=2 OK -- 2.54.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
