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]

Reply via email to