Commit 4b42530309 for ffmpeg
commit 4b425303099fd9a8965f1623c4d4bfd478727585
Author: smp79 <sergey79@gmail.com>
Date: Tue Oct 20 23:14:28 2026 +0300
avcodec/hevc/hevcdec: don't re-apply a stale alternative transfer SEI
The alternative transfer characteristics SEI is parsed into
sei.common.alternative_transfer, and export_stream_params_from_sei()
applies it to avctx->color_trc at every frame start. However
ff_h2645_sei_reset() never clears that state, so once such an SEI
has been seen it keeps overriding color_trc for the rest of the
decode.
When the active SPS later changes to one without a colour
description, export_stream_params() resets primaries, transfer and
matrix to unspecified, and the stale SEI then restores the old
transfer characteristics.
Clear the pending SEI after exporting it during frame start, once the
frame's SPS parameters have been applied. Keep the shared export
helper non-consuming: extradata processing calls it before first-frame
SPS activation, and AVDISCARD_ALL can export SPS parameters again for
each packet. Clearing the flag in those paths would lose an SEI that
still applies to the sequence.
Add a FATE test with an HLG section followed by an SDR section.
Signed-off-by: Sergey Philippov <sergey79@gmail.com>
diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
index 83fbdef9ba..0934f64096 100644
--- a/libavcodec/hevc/hevcdec.c
+++ b/libavcodec/hevc/hevcdec.c
@@ -4161,6 +4161,7 @@ static int hevc_frame_start(HEVCContext *s, HEVCLayerContext *l,
ret = export_stream_params_from_sei(s);
if (ret < 0)
return ret;
+ s->sei.common.alternative_transfer.present = 0;
ret = ff_hevc_set_new_ref(s, l, s->poc);
if (ret < 0)
diff --git a/tests/fate/hevc.mak b/tests/fate/hevc.mak
index 9ae21af24a..4dac1a2b4b 100644
--- a/tests/fate/hevc.mak
+++ b/tests/fate/hevc.mak
@@ -276,6 +276,9 @@ fate-hevc-extradata-reload: CMD = framemd5 -i $(TARGET_SAMPLES)/hevc/extradata-r
fate-hevc-paired-fields: CMD = probeframes -show_entries frame=interlaced_frame,top_field_first $(TARGET_SAMPLES)/hevc/paired_fields.hevc
FATE_HEVC_FFPROBE-$(call DEMDEC, HEVC, HEVC) += fate-hevc-paired-fields
+fate-hevc-atc-sei-reset: CMD = probeframes -show_entries frame=color_primaries,color_transfer,color_space $(TARGET_SAMPLES)/hevc/atc-sei-reset.hevc
+FATE_HEVC_FFPROBE-$(call PARSERDEMDEC, HEVC, HEVC, HEVC) += fate-hevc-atc-sei-reset
+
fate-hevc-monochrome-crop: CMD = probeframes -show_entries frame=width,height:stream=width,height $(TARGET_SAMPLES)/hevc/hevc-monochrome.hevc
FATE_HEVC_FFPROBE-$(call PARSERDEMDEC, HEVC, HEVC, HEVC) += fate-hevc-monochrome-crop
diff --git a/tests/ref/fate/hevc-atc-sei-reset b/tests/ref/fate/hevc-atc-sei-reset
new file mode 100644
index 0000000000..7a181458b2
--- /dev/null
+++ b/tests/ref/fate/hevc-atc-sei-reset
@@ -0,0 +1,40 @@
+[FRAME]
+color_space=bt2020nc
+color_primaries=bt2020
+color_transfer=arib-std-b67
+[/FRAME]
+[FRAME]
+color_space=bt2020nc
+color_primaries=bt2020
+color_transfer=arib-std-b67
+[/FRAME]
+[FRAME]
+color_space=bt2020nc
+color_primaries=bt2020
+color_transfer=arib-std-b67
+[/FRAME]
+[FRAME]
+color_space=bt2020nc
+color_primaries=bt2020
+color_transfer=arib-std-b67
+[/FRAME]
+[FRAME]
+color_space=unknown
+color_primaries=unknown
+color_transfer=unknown
+[/FRAME]
+[FRAME]
+color_space=unknown
+color_primaries=unknown
+color_transfer=unknown
+[/FRAME]
+[FRAME]
+color_space=unknown
+color_primaries=unknown
+color_transfer=unknown
+[/FRAME]
+[FRAME]
+color_space=unknown
+color_primaries=unknown
+color_transfer=unknown
+[/FRAME]