From d5a8ed2a39e1df9a8d501bfc6092244606823018 Mon Sep 17 00:00:00 2001 From: imSp4rky Date: Sat, 31 Oct 2026 21:52:03 -0600 Subject: [PATCH] fix(titles): name a dv profile 7 or 8 track with an unnamed pq base DV.HDR --- tests/core/test_hdr10p_naming.py | 23 +++++++++++++++++++++-- unshackle/core/titles/title.py | 8 ++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/tests/core/test_hdr10p_naming.py b/tests/core/test_hdr10p_naming.py index b7ea6a58..d6eb9a06 100644 --- a/tests/core/test_hdr10p_naming.py +++ b/tests/core/test_hdr10p_naming.py @@ -22,7 +22,9 @@ def clean_config(monkeypatch: pytest.MonkeyPatch) -> None: monkeypatch.setattr(config, "codec_names", {}) -def hdr_tag(commercial: str, range_: Video.Range, transfer: str = "PQ") -> str: +def hdr_tag( + commercial: str, range_: Video.Range, transfer: str = "PQ", hdr_format: str = "SMPTE ST 2086", profile: str = "" +) -> str: movie = Movie(id_="movie-0001", service=DummyService, name="The Film", year=2024, language="en") movie.tracks = Tracks(Video(url="https://example.test/v.mpd", language="en", codec=Video.Codec.AV1, range_=range_)) video = types.SimpleNamespace( @@ -32,7 +34,8 @@ def hdr_tag(commercial: str, range_: Video.Range, transfer: str = "PQ") -> str: scan_type="Progressive", other_display_aspect_ratio=["16:9"], hdr_format_commercial=commercial, - hdr_format="SMPTE ST 2086", + hdr_format=hdr_format, + hdr_format_profile=profile, transfer_characteristics=transfer, transfer_characteristics_original=None, frame_rate="23.976", @@ -63,3 +66,19 @@ def test_hlg_without_an_hdr_format_keeps_the_hlg_tag() -> None: def test_sdr_gets_no_hdr_tag() -> None: assert hdr_tag("", Video.Range.SDR, transfer="BT.709") == "" + + +def test_a_profile_8_dv_track_with_an_unnamed_pq_base_gets_dv_hdr() -> None: + assert hdr_tag("Dolby Vision", Video.Range.DV, hdr_format="Dolby Vision", profile="dvhe.08") == "DV.HDR" + + +def test_a_profile_5_dv_track_stays_dv() -> None: + assert hdr_tag("Dolby Vision", Video.Range.DV, hdr_format="Dolby Vision", profile="dvhe.05") == "DV" + + +def test_a_profile_8_4_dv_track_with_an_hlg_base_stays_dv() -> None: + assert hdr_tag("Dolby Vision", Video.Range.DV, transfer="HLG", hdr_format="Dolby Vision", profile="dvhe.08") == "DV" + + +def test_a_dv_track_with_a_named_hdr10_base_keeps_dv_hdr() -> None: + assert hdr_tag("HDR10", Video.Range.DV, hdr_format="Dolby Vision", profile="dvhe.08") == "DV.HDR" diff --git a/unshackle/core/titles/title.py b/unshackle/core/titles/title.py index 67b764a4..c7a9432b 100644 --- a/unshackle/core/titles/title.py +++ b/unshackle/core/titles/title.py @@ -163,6 +163,14 @@ class Title: if (primary_video_track.hdr_format or "").startswith("Dolby Vision"): context["hdr"] = "DV" base_layer = DYNAMIC_RANGE_MAP.get(hdr_format) + profile = getattr(primary_video_track, "hdr_format_profile", None) or "" + if ( + base_layer in (None, "DV") + and trc + and "PQ" in trc + and profile.startswith(("dvhe.07", "dvhe.08")) + ): + base_layer = "HDR" if base_layer and base_layer != "DV": context["hdr"] += f".{base_layer}" elif (primary_video_track.hdr_format or "").startswith("HDR Vivid"):