From c14ec8f59ce12d0b9eb45030c3657f656c1149a3 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Tue, 15 Oct 2024 08:00:51 -0400 Subject: [PATCH] Fix crash when playing HDR on SDR TV. Improve device profile (#1980) --- source/utils/deviceCapabilities.bs | 100 +++++++++++++++++++++++------ 1 file changed, 79 insertions(+), 21 deletions(-) diff --git a/source/utils/deviceCapabilities.bs b/source/utils/deviceCapabilities.bs index 746880cb6..aa580e53a 100644 --- a/source/utils/deviceCapabilities.bs +++ b/source/utils/deviceCapabilities.bs @@ -414,7 +414,14 @@ function getContainerProfiles() as object end function function getCodecProfiles() as object - globalUserSettings = m.global.session.user.settings + myGlobal = m.global + globalUserSettings = myGlobal.session.user.settings + displayMaxBitDepth = myGlobal.device.videoBitDepth + if displayMaxBitDepth = invalid + displayMaxBitDepth = "8" + else + displayMaxBitDepth = displayMaxBitDepth.toStr() + end if codecProfiles = [] profileSupport = { "h264": {}, @@ -556,25 +563,27 @@ function getCodecProfiles() as object vp9VideoRangeTypes = "SDR" av1VideoRangeTypes = "SDR" - dp = di.GetDisplayProperties() - if dp.Hdr10 - hevcVideoRangeTypes = hevcVideoRangeTypes + "|HDR10" - vp9VideoRangeTypes = vp9VideoRangeTypes + "|HDR10" - av1VideoRangeTypes = av1VideoRangeTypes + "|HDR10" - end if - if dp.Hdr10Plus - av1VideoRangeTypes = av1VideoRangeTypes + "|HDR10+" - end if - if dp.HLG - hevcVideoRangeTypes = hevcVideoRangeTypes + "|HLG" - vp9VideoRangeTypes = vp9VideoRangeTypes + "|HLG" - av1VideoRangeTypes = av1VideoRangeTypes + "|HLG" - end if - if dp.DolbyVision - h264VideoRangeTypes = h264VideoRangeTypes + "|DOVI" - hevcVideoRangeTypes = hevcVideoRangeTypes + "|DOVI" - 'vp9VideoRangeTypes = vp9VideoRangeTypes + ",DOVI" no evidence that vp9 can hold DOVI - av1VideoRangeTypes = av1VideoRangeTypes + "|DOVI" + if canPlay4k() + dp = di.GetDisplayProperties() + if dp.Hdr10 + hevcVideoRangeTypes = hevcVideoRangeTypes + "|HDR10" + vp9VideoRangeTypes = vp9VideoRangeTypes + "|HDR10" + av1VideoRangeTypes = av1VideoRangeTypes + "|HDR10" + end if + if dp.Hdr10Plus + av1VideoRangeTypes = av1VideoRangeTypes + "|HDR10+" + end if + if dp.HLG + hevcVideoRangeTypes = hevcVideoRangeTypes + "|HLG" + vp9VideoRangeTypes = vp9VideoRangeTypes + "|HLG" + av1VideoRangeTypes = av1VideoRangeTypes + "|HLG" + end if + if dp.DolbyVision + h264VideoRangeTypes = h264VideoRangeTypes + "|DOVI" + hevcVideoRangeTypes = hevcVideoRangeTypes + "|DOVI" + 'vp9VideoRangeTypes = vp9VideoRangeTypes + ",DOVI" no evidence that vp9 can hold DOVI + av1VideoRangeTypes = av1VideoRangeTypes + "|DOVI" + end if end if ' H264 @@ -670,7 +679,13 @@ function getCodecProfiles() as object "Property": "VideoLevel", "Value": mpeg2Levels.join("|"), "IsRequired": false - } + }, + { + "Condition": "LessThanEqual", + "Property": "VideoBitDepth", + "Value": displayMaxBitDepth, + "IsRequired": false + }, ] } @@ -706,6 +721,12 @@ function getCodecProfiles() as object "Type": "Video", "Codec": "av1", "Conditions": [ + { + "Condition": "LessThanEqual", + "Property": "VideoBitDepth", + "Value": displayMaxBitDepth, + "IsRequired": false + }, { "Condition": "EqualsAny", "Property": "VideoProfile", @@ -765,6 +786,12 @@ function getCodecProfiles() as object "Type": "Video", "Codec": "hevc", "Conditions": [ + { + "Condition": "LessThanEqual", + "Property": "VideoBitDepth", + "Value": displayMaxBitDepth, + "IsRequired": false + }, { "Condition": "NotEquals", "Property": "IsAnamorphic", @@ -834,6 +861,12 @@ function getCodecProfiles() as object "Type": "Video", "Codec": "vp9", "Conditions": [ + { + "Condition": "LessThanEqual", + "Property": "VideoBitDepth", + "Value": displayMaxBitDepth, + "IsRequired": false + }, { "Condition": "EqualsAny", "Property": "VideoProfile", @@ -1094,3 +1127,28 @@ function setPreferredCodec(codecString as string, preferredCodec as string) as s return newCodecString end if end function + +' does the connected display support playing 4k video? +function canPlay4k() as boolean + deviceInfo = CreateObject("roDeviceInfo") + hdmiStatus = CreateObject("roHdmiStatus") + + ' Check if the output mode is 2160p or higher + maxVideoHeight = m.global.device.videoHeight + if maxVideoHeight = invalid then return false + if maxVideoHeight.ToInt() < 2160 + return false + end if + + ' Check if HDCP 2.2 is enabled, skip check for TVs + if deviceInfo.GetModelType() = "STB" and hdmiStatus.IsHdcpActive("2.2") <> true + return false + end if + + ' Check if the Roku player can decode 4K 60fps HEVC streams + if deviceInfo.CanDecodeVideo({ Codec: "hevc", Profile: "main", Level: "5.1" }).result <> true + return false + end if + + return true +end function