aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNiklas Haas <git@haasn.dev>2024-05-25 13:32:24 +0200
committerNiklas Haas <git@haasn.dev>2024-05-28 18:11:57 +0200
commit9fd88bd0923e3eb0f6c778700960a58df87d42a3 (patch)
tree7467ed9429c7e23dd6962da26fa8e30dd0e23d7f
parentb2b23f353aa1d4f88bcf00646bf952f0f7f8b033 (diff)
downloadffmpeg-9fd88bd0923e3eb0f6c778700960a58df87d42a3.tar.gz
avcodec/h2645_sei: loosen up min luminance requirements
The H.265 specification is quite clear on this case: > When min_display_mastering_luminance is not in the range of 1 to > 50000, the nominal maximum display luminance of the mastering display > is unknown or unspecified or specified by other means not specified in > this Specification. And so the current code is correct in marking luminance data as invalid if min luminance is set to 0. However, this breaks playback of at least several real-world Blu-ray releases, for example La La Land, Planet of the Apes, and quite possibly a lot more. These come with ostensibly valid max_luminance tags (1000 nits), but min_luminance set to 0. Loosen up this requirement by guarding it behind FF_COMPLIANCE_STRICT. We still reject blatantly invalid metadata (wrong value range on luminance, max set to 0, max below min, min above 50 nits etc.), so this shouldn't cause any unintended regressions. Fixes: https://github.com/mpv-player/mpv/issues/14177
-rw-r--r--libavcodec/h2645_sei.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/libavcodec/h2645_sei.c b/libavcodec/h2645_sei.c
index 1deb76c765..7c83747cd0 100644
--- a/libavcodec/h2645_sei.c
+++ b/libavcodec/h2645_sei.c
@@ -619,11 +619,15 @@ static int h2645_sei_to_side_data(AVCodecContext *avctx, H2645SEI *sei,
metadata->min_luminance.num = sei->mastering_display.min_luminance;
metadata->min_luminance.den = luma_den;
- metadata->has_luminance &= sei->mastering_display.min_luminance >= 1 &&
- sei->mastering_display.min_luminance <= 50000 &&
+ metadata->has_luminance &= sei->mastering_display.min_luminance <= 50000 &&
sei->mastering_display.min_luminance <
sei->mastering_display.max_luminance;
+ /* Real (blu-ray) releases in the wild come with minimum luminance
+ * values of 0.000 cd/m2, so permit this edge case */
+ if (avctx->strict_std_compliance >= FF_COMPLIANCE_STRICT)
+ metadata->has_luminance &= sei->mastering_display.min_luminance >= 1;
+
if (metadata->has_luminance || metadata->has_primaries)
av_log(avctx, AV_LOG_DEBUG, "Mastering Display Metadata:\n");
if (metadata->has_primaries) {