From 9270585a442f782f721eaeb1b9ecdb0ae1bc8c5e Mon Sep 17 00:00:00 2001 From: uvjustin <46082645+uvjustin@users.noreply.github.com> Date: Fri, 16 Oct 2020 04:37:27 +0800 Subject: [PATCH] Cap AVC profile level at 4.1 in stream master playlist (#41592) * Cap AVC profile level at 4.1 * Use smaller multiplier in bandwidth calculation --- homeassistant/components/stream/fmp4utils.py | 3 ++- homeassistant/components/stream/hls.py | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/stream/fmp4utils.py b/homeassistant/components/stream/fmp4utils.py index dc929e531c1..1838b3fc88b 100644 --- a/homeassistant/components/stream/fmp4utils.py +++ b/homeassistant/components/stream/fmp4utils.py @@ -70,7 +70,8 @@ def get_codec_string(segment: io.BytesIO) -> str: ): profile = stsd_box[111:112].hex() compatibility = stsd_box[112:113].hex() - level = stsd_box[113:114].hex() + # Cap level at 4.1 for compatibility with some Google Cast devices + level = hex(min(stsd_box[113], 41))[2:] codec += "." + profile + compatibility + level # Handle H265 diff --git a/homeassistant/components/stream/hls.py b/homeassistant/components/stream/hls.py index 09729f79ada..92801c4807f 100644 --- a/homeassistant/components/stream/hls.py +++ b/homeassistant/components/stream/hls.py @@ -32,10 +32,11 @@ class HlsMasterPlaylistView(StreamView): def render(track): """Render M3U8 file.""" # Need to calculate max bandwidth as input_container.bit_rate doesn't seem to work - # Calculate file size / duration and use a multiplier to account for variation + # Calculate file size / duration and use a small multiplier to account for variation + # hls spec already allows for 25% variation segment = track.get_segment(track.segments[-1]) bandwidth = round( - segment.segment.seek(0, io.SEEK_END) * 8 / segment.duration * 3 + segment.segment.seek(0, io.SEEK_END) * 8 / segment.duration * 1.2 ) codecs = get_codec_string(segment.segment) lines = [