[PR] Fixing EXR and Alpha (PR #23928)

michaelni via ffmpeg-devel <[email protected]> Mon, 27 Jul 2026 17:20:44 -0000
Newsgroups gmane.comp.video.ffmpeg.devel
Message-ID <178517346698.51.10233398291599127446@29965ddac10e>
PR #23928 opened by michaelni
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23928
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23928.patch

Fixing EXR and some alpha improvments

Co-Authored-by: Claude (Opus 5)


>From 730c957fa856fca891dd7e5acc0d86df422a87a5 Mon Sep 17 00:00:00 2001
From: Michael Niedermayer <[email protected]>
Date: Mon, 27 Jul 2026 18:55:00 +0200
Subject: [PATCH 1/8] avfilter/vf_premultiply: support half float formats

gbrapf16le is what the EXR decoder outputs, and EXR is premultiplied, so
it is the format premultiply_dynamic is the most likely to be asked to
convert. Not supporting it meant a scale filter had to be inserted to
convert the pixel format first, which loses precision and, since swscale
can read but not write half float, can leave the format negotiation with
no solution at all.

Co-Authored-by: Opus 5
---
 libavfilter/vf_premultiply.c | 143 ++++++++++++++++++++++++++++++++++-
 1 file changed, 141 insertions(+), 2 deletions(-)

diff --git a/libavfilter/vf_premultiply.c b/libavfilter/vf_premultiply.c
index 1cea3cab7f..9fca2d842a 100644
--- a/libavfilter/vf_premultiply.c
+++ b/libavfilter/vf_premultiply.c
@@ -20,9 +20,12 @@
 
 #include "config_components.h"
 
+#include "libavutil/float2half.h"
+#include "libavutil/half2float.h"
 #include "libavutil/imgutils.h"
 #include "libavutil/pixdesc.h"
 #include "libavutil/opt.h"
+#include "libavutil/thread.h"
 #include "avfilter.h"
 #include "filters.h"
 #include "formats.h"
@@ -33,6 +36,25 @@ typedef struct ThreadData {
     AVFrame *m, *a, *d;
 } ThreadData;
 
+static Half2FloatTables h2f_tables;
+static Float2HalfTables f2h_tables;
+
+static av_cold void init_half_tables(void)
+{
+    ff_init_half2float_tables(&h2f_tables);
+    ff_init_float2half_tables(&f2h_tables);
+}
+
+static av_always_inline float h2f(uint16_t h)
+{
+    return av_int2float(half2float(h, &h2f_tables));
+}
+
+static av_always_inline uint16_t f2h(float f)
+{
+    return float2half(av_float2int(f), &f2h_tables);
+}
+
 typedef struct PreMultiplyContext {
     const AVClass *class;
     int width[AV_VIDEO_MAX_PLANES], height[AV_VIDEO_MAX_PLANES];
@@ -78,7 +100,7 @@ static int query_formats(const AVFilterContext *ctx,
         AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV444P14,
         AV_PIX_FMT_YUV444P16,
         AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
-        AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16, AV_PIX_FMT_GBRPF32,
+        AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16, AV_PIX_FMT_GBRPF16, AV_PIX_FMT_GBRPF32,
         AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY9, AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY14, AV_PIX_FMT_GRAY16,
         AV_PIX_FMT_NONE
     };
@@ -87,7 +109,7 @@ static int query_formats(const AVFilterContext *ctx,
         AV_PIX_FMT_YUVA444P,
         AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUVA444P16,
         AV_PIX_FMT_GBRAP,
-        AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP16, AV_PIX_FMT_GBRAPF32,
+        AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP16, AV_PIX_FMT_GBRAPF16, AV_PIX_FMT_GBRAPF32,
         AV_PIX_FMT_NONE
     };
 
@@ -294,6 +316,54 @@ static void premultiplyf32offset(const uint8_t *mmsrc, const uint8_t *aasrc,
     }
 }
 
+static void premultiplyf16(const uint8_t *mmsrc, const uint8_t *aasrc,
+                          uint8_t *ddst,
+                          ptrdiff_t mlinesize, ptrdiff_t alinesize,
+                          ptrdiff_t dlinesize,
+                          int w, int h,
+                          int half, int shift, int offset)
+{
+    const uint16_t *msrc = (const uint16_t *)mmsrc;
+    const uint16_t *asrc = (const uint16_t *)aasrc;
+    uint16_t *dst = (uint16_t *)ddst;
+    int x, y;
+
+    for (y = 0; y < h; y++) {
+        for (x = 0; x < w; x++) {
+            dst[x] = f2h(h2f(msrc[x]) * h2f(asrc[x]));
+        }
+
+        dst  += dlinesize / 2;
+        msrc += mlinesize / 2;
+        asrc += alinesize / 2;
+    }
+}
+
+static void premultiplyf16offset(const uint8_t *mmsrc, const uint8_t *aasrc,
+                                uint8_t *ddst,
+                                ptrdiff_t mlinesize, ptrdiff_t alinesize,
+                                ptrdiff_t dlinesize,
+                                int w, int h,
+                                int half, int shift, int offset)
+{
+    const uint16_t *msrc = (const uint16_t *)mmsrc;
+    const uint16_t *asrc = (const uint16_t *)aasrc;
+    uint16_t *dst = (uint16_t *)ddst;
+    int x, y;
+
+    float offsetf = offset / 65535.0f;
+
+    for (y = 0; y < h; y++) {
+        for (x = 0; x < w; x++) {
+            dst[x] = f2h(((h2f(msrc[x]) - offsetf) * h2f(asrc[x])) + offsetf);
+        }
+
+        dst  += dlinesize / 2;
+        msrc += mlinesize / 2;
+        asrc += alinesize / 2;
+    }
+}
+
 static void unpremultiply8(const uint8_t *msrc, const uint8_t *asrc,
                            uint8_t *dst,
                            ptrdiff_t mlinesize, ptrdiff_t alinesize,
@@ -497,6 +567,64 @@ static void unpremultiplyf32offset(const uint8_t *mmsrc, const uint8_t *aasrc,
     }
 }
 
+static void unpremultiplyf16(const uint8_t *mmsrc, const uint8_t *aasrc,
+                            uint8_t *ddst,
+                            ptrdiff_t mlinesize, ptrdiff_t alinesize,
+                            ptrdiff_t dlinesize,
+                            int w, int h,
+                            int half, int max, int offset)
+{
+    const uint16_t *msrc = (const uint16_t *)mmsrc;
+    const uint16_t *asrc = (const uint16_t *)aasrc;
+    uint16_t *dst = (uint16_t *)ddst;
+    int x, y;
+
+    for (y = 0; y < h; y++) {
+        for (x = 0; x < w; x++) {
+            float a = h2f(asrc[x]);
+
+            if (a > 0.0f)
+                dst[x] = f2h(h2f(msrc[x]) / a);
+            else
+                dst[x] = msrc[x];
+        }
+
+        dst  += dlinesize / 2;
+        msrc += mlinesize / 2;
+        asrc += alinesize / 2;
+    }
+}
+
+static void unpremultiplyf16offset(const uint8_t *mmsrc, const uint8_t *aasrc,
+                            uint8_t *ddst,
+                            ptrdiff_t mlinesize, ptrdiff_t alinesize,
+                            ptrdiff_t dlinesize,
+                            int w, int h,
+                            int half, int max, int offset)
+{
+    const uint16_t *msrc = (const uint16_t *)mmsrc;
+    const uint16_t *asrc = (const uint16_t *)aasrc;
+    uint16_t *dst = (uint16_t *)ddst;
+    int x, y;
+
+    float offsetf = offset / 65535.0f;
+
+    for (y = 0; y < h; y++) {
+        for (x = 0; x < w; x++) {
+            float a = h2f(asrc[x]);
+
+            if (a > 0.0f)
+                dst[x] = f2h((h2f(msrc[x]) - offsetf) / a + offsetf);
+            else
+                dst[x] = msrc[x];
+        }
+
+        dst  += dlinesize / 2;
+        msrc += mlinesize / 2;
+        asrc += alinesize / 2;
+    }
+}
+
 static int premultiply_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
 {
     PreMultiplyContext *s = ctx->priv;
@@ -592,6 +720,10 @@ static int filter_frame(AVFilterContext *ctx,
             case AV_PIX_FMT_GBRAP16:
                 s->premultiply[0] = s->premultiply[1] = s->premultiply[2] = limited ? unpremultiply16offset : unpremultiply16;
                 break;
+            case AV_PIX_FMT_GBRPF16:
+            case AV_PIX_FMT_GBRAPF16:
+                s->premultiply[0] = s->premultiply[1] = s->premultiply[2] = limited ? unpremultiplyf16offset : unpremultiplyf16;
+                break;
             case AV_PIX_FMT_GBRPF32:
             case AV_PIX_FMT_GBRAPF32:
                 s->premultiply[0] = s->premultiply[1] = s->premultiply[2] = limited ? unpremultiplyf32offset : unpremultiplyf32;
@@ -644,6 +776,10 @@ static int filter_frame(AVFilterContext *ctx,
             case AV_PIX_FMT_GBRAP16:
                 s->premultiply[0] = s->premultiply[1] = s->premultiply[2] = limited ? premultiply16offset : premultiply16;
                 break;
+            case AV_PIX_FMT_GBRPF16:
+            case AV_PIX_FMT_GBRAPF16:
+                s->premultiply[0] = s->premultiply[1] = s->premultiply[2] = limited ? premultiplyf16offset: premultiplyf16;
+                break;
             case AV_PIX_FMT_GBRPF32:
             case AV_PIX_FMT_GBRAPF32:
                 s->premultiply[0] = s->premultiply[1] = s->premultiply[2] = limited ? premultiplyf32offset: premultiplyf32;
@@ -809,10 +945,13 @@ static int activate(AVFilterContext *ctx)
 
 static av_cold int init(AVFilterContext *ctx)
 {
+    static AVOnce half_tables_once = AV_ONCE_INIT;
     PreMultiplyContext *s = ctx->priv;
     AVFilterPad pad = { 0 };
     int ret;
 
+    ff_thread_once(&half_tables_once, init_half_tables);
+
     if (!strcmp(ctx->filter->name, "premultiply_dynamic")) {
         s->dynamic = s->inplace = 1;
         return 0;
-- 
2.52.0


>From 4550c33ac87248fae249d60b2f3a2e0ec9ab7f45 Mon Sep 17 00:00:00 2001
From: Michael Niedermayer <[email protected]>
Date: Mon, 27 Jul 2026 18:55:00 +0200
Subject: [PATCH 2/8] avfilter/avfiltergraph: redo a round after inserting a
 conversion filter

Inserting an auto conversion filter replaces the link that was being
worked on by two new links, and only the mergers that triggered the
insertion are settled on them. The other properties of those links are
left unmerged, and since the original link no longer exists it is not
revisited in the current round. If nothing else in the graph is delayed,
query_formats() returns success with those links still unmerged, and the
filters on both ends end up disagreeing on the format.

Do another round whenever a conversion filter was inserted, not only
when there was more than one of them.

Co-Authored-by: Opus 5
---
 libavfilter/avfiltergraph.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c
index f1abcc80b4..06fcf8107e 100644
--- a/libavfilter/avfiltergraph.c
+++ b/libavfilter/avfiltergraph.c
@@ -701,10 +701,9 @@ retry:
                 }
             }
 
-            /* if there is more than one auto filter, we may need another round
-             * to fully settle formats due to possible cross-incompatibilities
-             * between the auto filters themselves */
-            if (num_conv > 1)
+            /* the new links are only settled for the mergers that triggered
+             * the insertion, and the link we were on is gone */
+            if (num_conv)
                 goto retry;
         }
     }
-- 
2.52.0


>From 9d27358f69e444c1c6b00ce1cffc4119a28d3b0c Mon Sep 17 00:00:00 2001
From: Michael Niedermayer <[email protected]>
Date: Mon, 27 Jul 2026 18:55:00 +0200
Subject: [PATCH 3/8] avfilter/vf_scale: accept all alpha modes

swscale does not change the alpha mode, it only carries it over, and
scaling premultiplied alpha is valid, so there is no reason to reject
it. Since f3431169daab3f1ca26638de6d4f6fca0f090c15 the default of
straight alpha applied here instead, which made the scale filter
unusable in a premultiplied chain.

That is fatal because scale is the conversion filter for pixel formats:
converting the alpha mode of a frame whose pixel format is not supported
by premultiply_dynamic requires inserting a scale filter, which in turn
required converting the alpha mode, and the negotiation kept inserting
filters forever. This happened for example with

    ffmpeg -i premultiplied.exr out.jpg

where the gbrapf16le frames of the EXR decoder are not supported by
premultiply_dynamic.

Co-Authored-by: Opus 5
---
 libavfilter/vf_scale.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c
index f2d3021080..7511e8c9ea 100644
--- a/libavfilter/vf_scale.c
+++ b/libavfilter/vf_scale.c
@@ -526,7 +526,8 @@ static int query_formats(const AVFilterContext *ctx,
             return ret;
     }
 
-    return 0;
+    /* swscale only carries the alpha mode over */
+    return ff_set_common_all_alpha_modes2(ctx, cfg_in, cfg_out);
 }
 
 static int scale_eval_dimensions(AVFilterContext *ctx)
-- 
2.52.0


>From 867146f257d1340553eb43011f49e627a34c51ce Mon Sep 17 00:00:00 2001
From: Michael Niedermayer <[email protected]>
Date: Mon, 27 Jul 2026 18:55:00 +0200
Subject: [PATCH 4/8] avfilter/formats: allow premultiplied alpha for
 metadata-only filters

AVFILTER_FLAG_METADATA_ONLY guarantees that the data of the frames a
filter outputs is exactly the data it received, so such a filter does no
color arithmetic at all and premultiplied alpha is safe for it.

Keeping the straight alpha default of
f3431169daab3f1ca26638de6d4f6fca0f090c15 for them requires a conversion
for filters that do not even look at the frame data, such as format or
null.

Co-Authored-by: Opus 5
---
 libavfilter/formats.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/libavfilter/formats.c b/libavfilter/formats.c
index 2076beda0d..13bf02268f 100644
--- a/libavfilter/formats.c
+++ b/libavfilter/formats.c
@@ -1228,7 +1228,10 @@ int ff_default_query_formats(AVFilterContext *ctx)
         ret = ff_set_common_all_color_ranges(ctx);
         if (ret < 0)
             return ret;
-        ret = ff_set_common_alpha_mode_straight(ctx);
+        /* metadata-only filters do no color arithmetic at all */
+        ret = ctx->filter->flags & AVFILTER_FLAG_METADATA_ONLY ?
+              ff_set_common_all_alpha_modes(ctx) :
+              ff_set_common_alpha_mode_straight(ctx);
         if (ret < 0)
             return ret;
     }
-- 
2.52.0


>From 149af79adc9624eba7e65d9be91ee4a091ec0da2 Mon Sep 17 00:00:00 2001
From: Michael Niedermayer <[email protected]>
Date: Mon, 27 Jul 2026 18:55:00 +0200
Subject: [PATCH 5/8] avfilter/buffersink: accept all alpha modes unless told
 otherwise

The sink does not process the frames, it hands them over to the caller
as they are, alpha mode included, and the caller can look at the alpha
mode of the frame it gets. Requesting straight alpha by default forces a
conversion that nobody asked for.

Co-Authored-by: Opus 5
---
 libavfilter/buffersink.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/libavfilter/buffersink.c b/libavfilter/buffersink.c
index e829007557..ef94981109 100644
--- a/libavfilter/buffersink.c
+++ b/libavfilter/buffersink.c
@@ -318,6 +318,11 @@ static int vsink_query_formats(const AVFilterContext *ctx,
         ret = ff_set_common_alpha_modes_from_list2(ctx, cfg_in, cfg_out, buf->alphamodes);
         if (ret < 0)
             return ret;
+    } else {
+        /* the frames are handed over as they are, alpha mode included */
+        ret = ff_set_common_all_alpha_modes2(ctx, cfg_in, cfg_out);
+        if (ret < 0)
+            return ret;
     }
 
     return 0;
-- 
2.52.0


>From d6b559d2b4494e053788016c9d2a1975780f7d45 Mon Sep 17 00:00:00 2001
From: Michael Niedermayer <[email protected]>
Date: Mon, 27 Jul 2026 18:55:00 +0200
Subject: [PATCH 6/8] avfilter/buffersrc: accept all alpha modes if there is no
 alpha

Without an alpha component the alpha mode is meaningless, so pinning it
to the default instead of leaving it free requires a pointless
conversion when the rest of the graph settles on premultiplied alpha,
for example when encoding to EXR.

Co-Authored-by: Opus 5
---
 libavfilter/buffersrc.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/libavfilter/buffersrc.c b/libavfilter/buffersrc.c
index 16efa6e6c8..a798c3c8d1 100644
--- a/libavfilter/buffersrc.c
+++ b/libavfilter/buffersrc.c
@@ -524,6 +524,10 @@ static int query_formats(const AVFilterContext *ctx,
             }
             if ((ret = ff_set_common_alpha_modes2(ctx, cfg_in, cfg_out, alpha_modes)) < 0)
                 return ret;
+        } else {
+            /* without alpha the alpha mode is meaningless, leave it free */
+            if ((ret = ff_set_common_all_alpha_modes2(ctx, cfg_in, cfg_out)) < 0)
+                return ret;
         }
         break;
     }
-- 
2.52.0


>From 3645a20bf0079641b182c68c14712b63332691b9 Mon Sep 17 00:00:00 2001
From: Michael Niedermayer <[email protected]>
Date: Mon, 27 Jul 2026 18:55:00 +0200
Subject: [PATCH 7/8] fate/filter-video: test automatic conversion of
 premultiplied alpha

Before the previous commits this hung, endlessly inserting scale and
premultiply_dynamic filters into each other.

Co-Authored-by: Opus 5
---
 tests/fate/filter-video.mak               | 5 +++++
 tests/ref/fate/filter-alpha-mode-autoconv | 6 ++++++
 2 files changed, 11 insertions(+)
 create mode 100644 tests/ref/fate/filter-alpha-mode-autoconv

diff --git a/tests/fate/filter-video.mak b/tests/fate/filter-video.mak
index e3a3be2753..80ad2d943b 100644
--- a/tests/fate/filter-video.mak
+++ b/tests/fate/filter-video.mak
@@ -96,6 +96,11 @@ fate-filter-lavd-testsrc: CMD = framecrc -f lavfi -i testsrc=r=7:n=2:d=10
 FATE_FILTER-$(call FILTERFRAMECRC, TESTSRC2) += $(addprefix fate-filter-testsrc2-, yuv420p yuv444p rgb24 rgba)
 fate-filter-testsrc2-%: CMD = framecrc -lavfi testsrc2=r=7:d=10 -pix_fmt $(word 4, $(subst -, ,$(@)))
 
+# alpha mode and pixel format both need converting, rgba not being supported by
+# premultiply_dynamic
+FATE_FILTER-$(call FILTERFRAMECRC, TESTSRC2 FORMAT SETPARAMS PREMULTIPLY_DYNAMIC SCALE) += fate-filter-alpha-mode-autoconv
+fate-filter-alpha-mode-autoconv: CMD = framecrc -auto_conversion_filters -lavfi testsrc2=s=32x32:d=1:r=1,format=rgba,setparams=alpha_mode=premultiplied,format=alpha_modes=straight
+
 FATE_FILTER-$(call FILTERFRAMECRC, ALLRGB) += fate-filter-allrgb
 fate-filter-allrgb: CMD = framecrc -lavfi allrgb=rate=5:duration=1 -pix_fmt rgb24
 
diff --git a/tests/ref/fate/filter-alpha-mode-autoconv b/tests/ref/fate/filter-alpha-mode-autoconv
new file mode 100644
index 0000000000..e0f3fde60b
--- /dev/null
+++ b/tests/ref/fate/filter-alpha-mode-autoconv
@@ -0,0 +1,6 @@
+#tb 0: 1/1
+#media_type 0: video
+#codec_id 0: rawvideo
+#dimensions 0: 32x32
+#sar 0: 1/1
+0,          0,          0,        1,     4096, 0xa1138274
-- 
2.52.0


>From 4e2de160e12f1a3aa9f7059ba75d37a58344dab8 Mon Sep 17 00:00:00 2001
From: Michael Niedermayer <[email protected]>
Date: Mon, 27 Jul 2026 18:55:00 +0200
Subject: [PATCH 8/8] Revert "fate: disable tests that depend on premultipled
 conversion"

Automatic conversion of premultiplied alpha works again, the tests pass
unchanged.

This reverts commit 336b175c9f5d1194f4377f34aacfe4a85ca628b6.

Co-Authored-by: Opus 5
---
 tests/fate/image.mak      | 58 +++++++++++++++++++--------------------
 tests/fate/lavf-image.mak | 24 ++++++++--------
 2 files changed, 41 insertions(+), 41 deletions(-)

diff --git a/tests/fate/image.mak b/tests/fate/image.mak
index 4b1afa10cc..e9fe059ead 100644
--- a/tests/fate/image.mak
+++ b/tests/fate/image.mak
@@ -103,16 +103,16 @@ fate-dpxparser: CMD = framecrc -f image2pipe -i $(TARGET_SAMPLES)/dpx/lena_4x_co
 FATE_IMAGE_PROBE-$(call DEMDEC, IMAGE2, DPX) += fate-dpx-probe
 fate-dpx-probe: CMD = probeframes -show_entries frame=color_transfer,color_range,color_space,color_primaries,sample_aspect_ratio $(TARGET_SAMPLES)/dpx/cyan.dpx
 
-#FATE_EXR += fate-exr-slice-raw
+FATE_EXR += fate-exr-slice-raw
 fate-exr-slice-raw: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgba_slice_raw.exr -vf scale -pix_fmt gbrapf32le
 
-#FATE_EXR += fate-exr-slice-rle
+FATE_EXR += fate-exr-slice-rle
 fate-exr-slice-rle: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgba_slice_rle.exr -vf scale -pix_fmt gbrapf32le
 
-#FATE_EXR += fate-exr-slice-zip1
+FATE_EXR += fate-exr-slice-zip1
 fate-exr-slice-zip1: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgba_slice_zip1.exr -vf scale -pix_fmt gbrapf32le
 
-#FATE_EXR += fate-exr-slice-zip16
+FATE_EXR += fate-exr-slice-zip16
 fate-exr-slice-zip16: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgba_slice_zip16.exr -vf scale -pix_fmt gbrapf32le
 
 FATE_EXR += fate-exr-slice-pxr24
@@ -121,7 +121,7 @@ fate-exr-slice-pxr24: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgb_slice_pxr24.ex
 FATE_EXR += fate-exr-rgb-scanline-pxr24-float-12x8
 fate-exr-rgb-scanline-pxr24-float-12x8: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgb_scanline_pxr24_float_12x8.exr -vf scale -pix_fmt gbrpf32le
 
-#FATE_EXR += fate-exr-rgba-multiscanline-half-b44
+FATE_EXR += fate-exr-rgba-multiscanline-half-b44
 fate-exr-rgba-multiscanline-half-b44: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgba_multiscanline_half_b44.exr -vf scale -pix_fmt gbrapf32le
 
 FATE_EXR += fate-exr-rgb-scanline-float-b44
@@ -142,88 +142,88 @@ fate-exr-rgb-tile-float-raw-150x130: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgb
 FATE_EXR += fate-exr-rgb-tile-half-raw-12x8
 fate-exr-rgb-tile-half-raw-12x8: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgb_tile_half_raw_12x8.exr -vf scale -pix_fmt gbrpf32le
 
-#FATE_EXR += fate-exr-rgba-scanline-float-half-b44-13x9-l1
+FATE_EXR += fate-exr-rgba-scanline-float-half-b44-13x9-l1
 fate-exr-rgba-scanline-float-half-b44-13x9-l1: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgba_scanline_float_half_b44_13x9.exr -vf scale -pix_fmt gbrapf32le
 
-#FATE_EXR += fate-exr-rgba-scanline-float-half-b44-13x9-l2
+FATE_EXR += fate-exr-rgba-scanline-float-half-b44-13x9-l2
 fate-exr-rgba-scanline-float-half-b44-13x9-l2: CMD = framecrc -layer "VRaySamplerInfo" -i $(TARGET_SAMPLES)/exr/rgba_scanline_float_half_b44_13x9.exr -vf scale -pix_fmt gbrapf32le
 
-#FATE_EXR += fate-exr-rgba-scanline-float-half-b44-12x8-l1
+FATE_EXR += fate-exr-rgba-scanline-float-half-b44-12x8-l1
 fate-exr-rgba-scanline-float-half-b44-12x8-l1: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgba_scanline_float_half_b44_12x8.exr -vf scale -pix_fmt gbrapf32le
 
-#FATE_EXR += fate-exr-rgba-scanline-float-half-b44-12x8-l2
+FATE_EXR += fate-exr-rgba-scanline-float-half-b44-12x8-l2
 fate-exr-rgba-scanline-float-half-b44-12x8-l2: CMD = framecrc -layer "VRaySamplerInfo" -i $(TARGET_SAMPLES)/exr/rgba_scanline_float_half_b44_12x8.exr -vf scale -pix_fmt gbrapf32le
 
-#FATE_EXR += fate-exr-rgba-scanline-float-half-b44a-12x8-l1
+FATE_EXR += fate-exr-rgba-scanline-float-half-b44a-12x8-l1
 fate-exr-rgba-scanline-float-half-b44a-12x8-l1: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgba_scanline_float_half_b44a_12x8.exr -vf scale -pix_fmt gbrapf32le
 
-#FATE_EXR += fate-exr-rgba-scanline-float-half-b44a-12x8-l2
+FATE_EXR += fate-exr-rgba-scanline-float-half-b44a-12x8-l2
 fate-exr-rgba-scanline-float-half-b44a-12x8-l2: CMD = framecrc -layer "VRaySamplerInfo" -i $(TARGET_SAMPLES)/exr/rgba_scanline_float_half_b44a_12x8.exr -vf scale -pix_fmt gbrapf32le
 
-#FATE_EXR += fate-exr-rgba-scanline-float-half-b44a-13x9-l1
+FATE_EXR += fate-exr-rgba-scanline-float-half-b44a-13x9-l1
 fate-exr-rgba-scanline-float-half-b44a-13x9-l1: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgba_scanline_float_half_b44a_13x9.exr -vf scale -pix_fmt gbrapf32le
 
-#FATE_EXR += fate-exr-rgba-scanline-float-half-b44a-13x9-l2
+FATE_EXR += fate-exr-rgba-scanline-float-half-b44a-13x9-l2
 fate-exr-rgba-scanline-float-half-b44a-13x9-l2: CMD = framecrc -layer "VRaySamplerInfo" -i $(TARGET_SAMPLES)/exr/rgba_scanline_float_half_b44a_13x9.exr -vf scale -pix_fmt gbrapf32le
 
 FATE_EXR += fate-exr-rgb-tile-pxr24-float-half-l1
 fate-exr-rgb-tile-pxr24-float-half-l1: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgb_tile_pxr24_float_half.exr -vf scale -pix_fmt gbrpf32le
 
-#FATE_EXR += fate-exr-rgb-tile-pxr24-float-half-l2
+FATE_EXR += fate-exr-rgb-tile-pxr24-float-half-l2
 fate-exr-rgb-tile-pxr24-float-half-l2: CMD = framecrc -layer "VRaySamplerInfo" -i $(TARGET_SAMPLES)/exr/rgb_tile_pxr24_float_half.exr -vf scale -pix_fmt gbrapf32le
 
 FATE_EXR += fate-exr-rgb-tile-pxr24-half-float-l1
 fate-exr-rgb-tile-pxr24-half-float-l1: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgb_tile_pxr24_half_float.exr -vf scale -pix_fmt gbrpf32le
 
-#FATE_EXR += fate-exr-rgb-tile-pxr24-half-float-l2
+FATE_EXR += fate-exr-rgb-tile-pxr24-half-float-l2
 fate-exr-rgb-tile-pxr24-half-float-l2: CMD = framecrc -layer "VRaySamplerInfo" -i $(TARGET_SAMPLES)/exr/rgb_tile_pxr24_half_float.exr -vf scale -pix_fmt gbrapf32le
 
 FATE_EXR += fate-exr-rgb-tile-half-float-b44-12x8-l1
 fate-exr-rgb-tile-half-float-b44-12x8-l1: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgb_tile_half_float_b44_12x8.exr -vf scale -pix_fmt gbrpf32le
 
-#FATE_EXR += fate-exr-rgb-tile-half-float-b44-12x8-l2
+FATE_EXR += fate-exr-rgb-tile-half-float-b44-12x8-l2
 fate-exr-rgb-tile-half-float-b44-12x8-l2: CMD = framecrc -layer "VRaySamplerInfo" -i $(TARGET_SAMPLES)/exr/rgb_tile_half_float_b44_12x8.exr -vf scale -pix_fmt gbrapf32le
 
 FATE_EXR += fate-exr-rgb-tile-zip-half-float-l1
 fate-exr-rgb-tile-zip-half-float-l1: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgb_tile_zip_half_float.exr -vf scale -pix_fmt gbrpf32le
 
-#FATE_EXR += fate-exr-rgb-tile-zip-half-float-l2
+FATE_EXR += fate-exr-rgb-tile-zip-half-float-l2
 fate-exr-rgb-tile-zip-half-float-l2: CMD = framecrc -layer "VRaySamplerInfo" -i $(TARGET_SAMPLES)/exr/rgb_tile_zip_half_float.exr -vf scale -pix_fmt gbrapf32le
 
 FATE_EXR += fate-exr-rgb-tile-zip1-half-float-l1
 fate-exr-rgb-tile-zip1-half-float-l1: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgb_tile_zip1_half_float.exr -vf scale -pix_fmt gbrpf32le
 
-#FATE_EXR += fate-exr-rgb-tile-zip1-half-float-l2
+FATE_EXR += fate-exr-rgb-tile-zip1-half-float-l2
 fate-exr-rgb-tile-zip1-half-float-l2: CMD = framecrc -layer "VRaySamplerInfo" -i $(TARGET_SAMPLES)/exr/rgb_tile_zip1_half_float.exr -vf scale -pix_fmt gbrapf32le
 
 FATE_EXR += fate-exr-rgb-tile-rle-half-float-l1
 fate-exr-rgb-tile-rle-half-float-l1: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgb_tile_rle_half_float.exr -vf scale -pix_fmt gbrpf32le
 
-#FATE_EXR += fate-exr-rgb-tile-rle-half-float-l2
+FATE_EXR += fate-exr-rgb-tile-rle-half-float-l2
 fate-exr-rgb-tile-rle-half-float-l2: CMD = framecrc -layer "VRaySamplerInfo" -i $(TARGET_SAMPLES)/exr/rgb_tile_rle_half_float.exr -vf scale -pix_fmt gbrapf32le
 
 FATE_EXR += fate-exr-rgb-tile-raw-half-float-l1
 fate-exr-rgb-tile-raw-half-float-l1: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgb_tile_raw_half_float.exr -vf scale -pix_fmt gbrpf32le
 
-#FATE_EXR += fate-exr-rgb-tile-raw-half-float-l2
+FATE_EXR += fate-exr-rgb-tile-raw-half-float-l2
 fate-exr-rgb-tile-raw-half-float-l2: CMD = framecrc -layer "VRaySamplerInfo" -i $(TARGET_SAMPLES)/exr/rgb_tile_raw_half_float.exr -vf scale -pix_fmt gbrapf32le
 
 FATE_EXR += fate-exr-rgb-scanline-b44-half-float-12x8-l1
 fate-exr-rgb-scanline-b44-half-float-12x8-l1: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgb_scanline_b44_half_float_12x8.exr -vf scale -pix_fmt gbrpf32le
 
-#FATE_EXR += fate-exr-rgb-scanline-b44-half-float-12x8-l2
+FATE_EXR += fate-exr-rgb-scanline-b44-half-float-12x8-l2
 fate-exr-rgb-scanline-b44-half-float-12x8-l2: CMD = framecrc -layer "VRaySamplerInfo" -i $(TARGET_SAMPLES)/exr/rgb_scanline_b44_half_float_12x8.exr -vf scale -pix_fmt gbrapf32le
 
 FATE_EXR += fate-exr-rgb-scanline-pxr24-half-float-l1
 fate-exr-rgb-scanline-pxr24-half-float-l1: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgb_scanline_pxr24_half_float.exr -vf scale -pix_fmt gbrpf32le
 
-#FATE_EXR += fate-exr-rgb-scanline-pxr24-half-float-l2
+FATE_EXR += fate-exr-rgb-scanline-pxr24-half-float-l2
 fate-exr-rgb-scanline-pxr24-half-float-l2: CMD = framecrc -layer "VRaySamplerInfo" -i $(TARGET_SAMPLES)/exr/rgb_scanline_pxr24_half_float.exr -vf scale -pix_fmt gbrapf32le
 
 FATE_EXR += fate-exr-rgb-scanline-pxr24-float-half-l1
 fate-exr-rgb-scanline-pxr24-float-half-l1: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgb_scanline_pxr24_float_half.exr -vf scale -pix_fmt gbrpf32le
 
-#FATE_EXR += fate-exr-rgb-scanline-pxr24-float-half-l2
+FATE_EXR += fate-exr-rgb-scanline-pxr24-float-half-l2
 fate-exr-rgb-scanline-pxr24-float-half-l2: CMD = framecrc -layer "VRaySamplerInfo" -i $(TARGET_SAMPLES)/exr/rgb_scanline_pxr24_float_half.exr -vf scale -pix_fmt gbrapf32le
 
 FATE_EXR += fate-exr-rgb-scanline-pxr24-half-uint32-13x9
@@ -232,25 +232,25 @@ fate-exr-rgb-scanline-pxr24-half-uint32-13x9: CMD = framecrc -layer "VRaySampler
 FATE_EXR += fate-exr-rgb-scanline-zip-half-float-l1
 fate-exr-rgb-scanline-zip-half-float-l1: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgb_scanline_zip_half_float.exr -vf scale -pix_fmt gbrpf32le
 
-#FATE_EXR += fate-exr-rgb-scanline-zip-half-float-l2
+FATE_EXR += fate-exr-rgb-scanline-zip-half-float-l2
 fate-exr-rgb-scanline-zip-half-float-l2: CMD = framecrc -layer "VRaySamplerInfo" -i $(TARGET_SAMPLES)/exr/rgb_scanline_zip_half_float.exr -vf scale -pix_fmt gbrapf32le
 
 FATE_EXR += fate-exr-rgb-scanline-zip1-half-float-l1
 fate-exr-rgb-scanline-zip1-half-float-l1: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgb_scanline_zip1_half_float.exr -vf scale -pix_fmt gbrpf32le
 
-#FATE_EXR += fate-exr-rgb-scanline-zip1-half-float-l2
+FATE_EXR += fate-exr-rgb-scanline-zip1-half-float-l2
 fate-exr-rgb-scanline-zip1-half-float-l2: CMD = framecrc -layer "VRaySamplerInfo" -i $(TARGET_SAMPLES)/exr/rgb_scanline_zip1_half_float.exr -vf scale -pix_fmt gbrapf32le
 
 FATE_EXR += fate-exr-rgb-scanline-rle-half-float-l1
 fate-exr-rgb-scanline-rle-half-float-l1: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgb_scanline_rle_half_float.exr -vf scale -pix_fmt gbrpf32le
 
-#FATE_EXR += fate-exr-rgb-scanline-rle-half-float-l2
+FATE_EXR += fate-exr-rgb-scanline-rle-half-float-l2
 fate-exr-rgb-scanline-rle-half-float-l2: CMD = framecrc -layer "VRaySamplerInfo" -i $(TARGET_SAMPLES)/exr/rgb_scanline_rle_half_float.exr -vf scale -pix_fmt gbrapf32le
 
 FATE_EXR += fate-exr-rgb-scanline-raw-half-float-l1
 fate-exr-rgb-scanline-raw-half-float-l1: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgb_scanline_raw_half_float.exr -vf scale -pix_fmt gbrpf32le
 
-#FATE_EXR += fate-exr-rgb-scanline-raw-half-float-l2
+FATE_EXR += fate-exr-rgb-scanline-raw-half-float-l2
 fate-exr-rgb-scanline-raw-half-float-l2: CMD = framecrc -layer "VRaySamplerInfo" -i $(TARGET_SAMPLES)/exr/rgb_scanline_raw_half_float.exr -vf scale -pix_fmt gbrapf32le
 
 FATE_EXR += fate-exr-rgb-scanline-b44-uint32
@@ -290,10 +290,10 @@ fate-exr-y-scanline-zip-half-12x8: CMD = framecrc -i $(TARGET_SAMPLES)/exr/y_sca
 FATE_EXR += fate-exr-rgb-scanline-half-piz-dw-t08
 fate-exr-rgb-scanline-half-piz-dw-t08: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgb_scanline_half_piz_dw_t08.exr -vf scale -pix_fmt gbrpf32le
 
-#FATE_EXR += fate-exr-rgba-zip16-16x32-flag4
+FATE_EXR += fate-exr-rgba-zip16-16x32-flag4
 fate-exr-rgba-zip16-16x32-flag4: CMD = framecrc -i $(TARGET_SAMPLES)/exr/rgba_zip16_16x32_flag4.exr -vf scale -pix_fmt gbrapf32le
 
-#FATE_EXR += fate-exr-ya-scanline-zip-half-12x8
+FATE_EXR += fate-exr-ya-scanline-zip-half-12x8
 fate-exr-ya-scanline-zip-half-12x8: CMD = framecrc -i $(TARGET_SAMPLES)/exr/ya_scanline_zip_half_12x8.exr -vf scale -pix_fmt gbrapf32le
 
 FATE_EXR += fate-exr-rgb-tile-half-zip
diff --git a/tests/fate/lavf-image.mak b/tests/fate/lavf-image.mak
index 19eaae6c3e..4177e091b3 100644
--- a/tests/fate/lavf-image.mak
+++ b/tests/fate/lavf-image.mak
@@ -9,18 +9,18 @@ FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         DPX) += gbrp12le.dpx
 FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         DPX) += rgb48le.dpx
 FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         DPX) += rgb48le_10.dpx
 FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         DPX) += rgba64le.dpx
-#FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += none.grayf32le.exr
-#FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += none.gbrpf32le.exr
-#FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += none.gbrapf32le.exr
-#FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += rle.grayf32le.exr
-#FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += rle.gbrpf32le.exr
-#FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += rle.gbrapf32le.exr
-#FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += zip1.grayf32le.exr
-#FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += zip1.gbrpf32le.exr
-#FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += zip1.gbrapf32le.exr
-#FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += zip16.grayf32le.exr
-#FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += zip16.gbrpf32le.exr
-#FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += zip16.gbrapf32le.exr
+FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += none.grayf32le.exr
+FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += none.gbrpf32le.exr
+FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += none.gbrapf32le.exr
+FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += rle.grayf32le.exr
+FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += rle.gbrpf32le.exr
+FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += rle.gbrapf32le.exr
+FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += zip1.grayf32le.exr
+FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += zip1.gbrpf32le.exr
+FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += zip1.gbrapf32le.exr
+FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += zip16.grayf32le.exr
+FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += zip16.gbrpf32le.exr
+FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         EXR) += zip16.gbrapf32le.exr
 FATE_LAVF_IMAGES-$(call LAVF_IMAGES,       MJPEG) += jpg
 FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         PAM) += pam
 FATE_LAVF_IMAGES-$(call LAVF_IMAGES,         PAM) += rgba.pam
-- 
2.52.0

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]