pub fn video_audio_codecs(detected: &str) -> StringExpand description
Narrow a detected audio-codec list to what the renderer that will actually play the video can decode.
The platform list comes from MediaCodecList, which describes ExoPlayer —
but the webview <video> element may be what renders the video, and
Chromium/WebKit decode a much smaller set than the platform does. Advertising
the raw list makes Jellyfin direct-play a track the webview cannot decode, and
the user gets picture with no sound.
Which renderer gets it is not fixed: Linux is always the element, and Android
follows experimentalNativeVideo, which took ExoPlayer as its default in
DR-161 but is a user setting either way. So the narrow list is the only one
that holds on both sides of that switch. The cost is a Dolby-licensed Android
device transcoding an E-AC-3 track its ExoPlayer could have direct-played;
the alternative is silence for everyone the switch lands the other way, which
is the bug this exists to prevent.
The gap is widest on devices whose vendor licenses Dolby: a phone with
c2.dolby.eac3.decoder reports eac3, so it — and only it — gets a silent
direct play where a leaner device is transcoded to AAC and plays fine.
This applies to the video direct-play profile only. Audio-only playback really is ExoPlayer’s, so its profile keeps the full platform list.
TRACES: UR-004 | DR-148 | UT-142