Repository navigation
fix: name the real HDR format on the player and detail pages, and the playing audio codec in the player - #140
Conversation
…er badges The Stream badges in the Apple TV player's Info tab said "HDR" for any HDR file, Dolby Vision included, and the audio badge showed the file's main audio codec even while another track was playing (for example 4K HDR HEVC TRUEHD while the Audio row said AC3 · 5.1). The dynamic-range badge now shows DV with the Dolby Vision profile (DV P5, DV P7, DV P8.1), or DV when the profile isn't known, then HDR10+, HDR10 or HLG, with HDR only when the type is unknown and nothing for SDR. Silo's video tracks already carry dv_profile, dv_bl_compat_id, video_range_type and hdr10_plus, which the app now decodes. The Emby and Jellyfin adapters fill the same new fields from ExtendedVideoType and ExtendedVideoSubtype (Emby) and VideoRangeType, DvProfile, DvBlSignalCompatibilityId and Hdr10PlusPresentFlag (Jellyfin). They still leave videoRange and dolbyVision empty, so the detail screens show exactly what they did before. The audio badge now uses the selected track's codec, the same text as the Audio row, and changes when the audio track is switched. The badge style, order and layout are unchanged. Release-Notes: - The Apple TV player's Info tab now shows the real HDR format, such as DV P8.1, DV P5, HDR10+, HDR10 or HLG, instead of HDR for everything. - The audio badge in the Apple TV player's Info tab now shows the codec of the audio track that's playing and follows audio track changes. - This release will be available on TestFlight soon.
There was a problem hiding this comment.
Claude review of the whole PR at dad60da. The summary comment lists everything found.
|
Claude review of the new commits b6bdc62..7288c80 I reviewed the new commit since b6bdc62, which changes one line of I checked the one change since the last review, the reworded dynamic-range sentence in claude-sonnet-5-5, high effort, 10 turns, about US$0.12 of API credit |
…ported The architecture guide said the audio badge always matches the Audio row. Until the engine reports the playing track, the badge shows the file's main audio codec and the Audio row isn't shown yet, so say so.
… pickers The detail pages still said DV (Apple TV added a separate HDR10 badge for profile 7 and 8.1), and Emby and Jellyfin files only ever showed HDR, while the player now names the exact format. The Apple TV detail page, the version pickers on both platforms, Continue Watching in the Home focus info, and the iPhone and iPad hero chip and Video range fact now use the same label as the player: DV P7, DV P8.1, DV P5, HDR10+, HDR10, HLG or HDR, from each provider's own fields. Profile 7 keeps its own name although Lucid Engine plays it as 8.1. Card overlays, catalogue summaries and downloads have no video-track details, so they keep their DV and HDR marks.
…pill label Vivid plays profile 7 as 8.1 only on a Dolby Vision display and as its HDR10 base layer elsewhere, so say that instead of always 8.1. The Apple TV browsing guide now says the version pill shows the file's dynamic range (DV P8.1, HDR10+ and so on).
There was a problem hiding this comment.
All reported issues were addressed across 15 files (changes from recent commits).
Reply with feedback, questions, or to request a fix.
View guided diff | Re-trigger cubic
The fact read only the first video stream while the hero and player read them all, so a file with Dolby Vision on a second stream could show HDR10 there and DV P7 in the hero. It now uses the same file-level label. Also corrects which readers keep videoRange and dolbyVision in use (the phone's Dolby Vision fact and Apple TV Continue Watching card overlays) and the Apple TV browsing guide's description of the detail badges.
There was a problem hiding this comment.
All reported issues were addressed across 6 files (changes from recent commits).
Reply with feedback, questions, or to request a fix.
View guided diff | Re-trigger cubic
# Conflicts: # iosApp/project.yml
…deo details load The browsing guide said the hero always shows one dynamic-range badge. It does once the file's video tracks load; before that it shows the catalogue summary's DV or HDR mark, and an SDR file shows its video codec.
Note
Merge after #139. I tested this on top of #139's player and want it to land on that, not the current one.
Problem and reproduction
The Apple TV player's Info tab and the detail pages didn't name a file's real format:
4K HDR HEVC TRUEHDwhile the Audio row saidAC3 · 5.1.DVorHDR. The Apple TV detail page added a separateHDR10badge for profile 7 and 8.1, and Emby and Jellyfin files only ever showedHDR, because nothing read their range or Dolby Vision fields.To reproduce: open a Dolby Vision title, note the badges on its detail page, play it, switch to an audio track with a different codec, then open the Info tab. Root cause: the player only checked the file's
hdrflag and built its badges once at load fromFileVersion.codecAudio, and each detail screen had its ownDV/HDRlogic that only read Silo'sdolby_visionandvideo_range.Implementation and impact
PlayerStreamBadgesworks out one dynamic-range label from the selected file's video tracks:DV P<profile>when the profile is known (DV P5,DV P7,DV P8.1),DVwhen it isn't, thenHDR10+,HDR10orHLG,HDRonly when the file is HDR but the type is unknown, and nothing for SDR. The comment at the top of the file sets out where each provider's values come from.DV P7even though Vivid plays it as 8.1 on a Dolby Vision display (and as its HDR10 base layer on other displays); the player's stats show the actual output./api/v1/watch):dolby_visionis only everProfile <n>, so the.1comes fromdv_bl_compat_id, which is left out when it's 0.video_rangeis onlyDolbyVision,HDRor empty, so HDR10+, HDR10 and HLG come fromvideo_range_type,hdr10_plusand, for older probes,color_transfer.VideoTracknow decodesvideo_range_type,dv_profile,dv_bl_compat_idandhdr10_plus.VideoRangeType,DvProfile,DvBlSignalCompatibilityIdandHdr10PlusPresentFlaginto the same new fields.DOVIInvalid(Dolby Vision outside the spec, played as its base layer) isn't shown as DV.ExtendedVideoType(DolbyVision, Hdr10, Hdr10Plus, HyperLogGamma) andExtendedVideoSubtypeinto the same fields, and falls back toVideoRangetext on servers that don't send them. Emby'sExtendedVideoSubTypesreference only has two-digit values (DoviProfile02toDoviProfile92, soDoviProfile81is profile 8 with compatibility ID 1). Its API reference spells the fieldExtendedVideoSubTypewhile server JSON usesExtendedVideoSubtype, so both are read.4K · DV P8.1 · ATMOS · CCinstead ofDVandHDR10);DetailPlaybackFormatting.dynamicRangeLabel);PlayerTrackwith the same text as the Audio row (one shared helper), andPlayerViewModel.streamBadgesreadsaudioTracksandselectedAudioId, so the badge changes when you switch tracks. Until the engine reports a selected track, the file's main codec stands in as before.HDR. The player's stats and diagnostics keep reporting the engine's output. Emby and Jellyfin still leavevideoRangeanddolbyVisionempty, because the phone's Dolby Vision fact and the Apple TV Continue Watching card overlays read them.VideoTrackfields are optional and type-checked in the adapters, so a server that doesn't send them falls back toDVorHDR.Validation
iosApp/Tests/PlayerStreamBadgesTests.swift, in bothVividTestsandVividTVTests(listed iniosApp/project.yml), covers Silo Dolby Vision profiles 5, 7, 8.1, 8.2, 8.4 and 10, compatibility from the range type, older Silo labels, HDR10+, HDR10 and HLG (including colour transfer only), the HDR fallback and SDR, Jellyfin and Emby through their realversion()mapping and decoder, that the detail label matches the player for all three providers (and, on tvOS, that the detail page showsDV P8.1as one badge with noHDR10), and the audio badge following the playing track.DetailVersionSelectionTests.testVersionSelectorUsesTheDolbyVisionProfilenow expectsDV P8.1in the version picker labels.dad60dapassed, iOS and tvOS (run 38484418131). Results for the latest head are in the checks below.Performance
Not applicable. This changes label text only; no benchmark was run.
Testing status
experiment/vivid-player-bridge) with this PR on top; GitHub Actions simulators (iOS and tvOS).dad60daon refactor: play everything through Vivid's own player bridge and Lucid Engine #139ccc9c42; second device build this PR at1c2ec42on refactor: play everything through Vivid's own player bridge and Lucid Engine #139ead3ead. Later commits only change comments, docs and the iPhone and iPad Video range fact.DV P7for a profile 7 file, which led to the detail page changes here. On the second build the player badges and the detail page labels worked as intended. CI unit tests passed ondad60da.Design impact and approval
Important
Only blurbery can approve design changes. Obtain prior, explicit approval and reference it here. Unapproved design changes must not be merged.
DVplusHDR10. Profile 7 is labelledDV P7.DV P7.Documentation impact
docs/playback/architecture.md: what the Info tab's Stream badges show, the brief file-codec fallback, that profile 7 shows as DV P7, where else the label appears, and what keeps the old marks.docs/apple-tv-browsing.md: the detail page's dynamic-range badge and Version pill show the file's format as one label.docs/cores/emby.mdanddocs/cores/jellyfin.md: which stream fields the label reads, and that the detail pages, version pickers and Home focus info show it.I checked the docs this change affects and updated them in this PR, or explained above why none needed changes.
AI disclosure
Important
Required for every PR. Incomplete disclosures are not ready for review or merge.
I implemented these changes and used Claude Opus as a tool.