diff options
Diffstat (limited to 'MediaBrowser.Model/Entities/MediaStream.cs')
| -rw-r--r-- | MediaBrowser.Model/Entities/MediaStream.cs | 158 |
1 files changed, 139 insertions, 19 deletions
diff --git a/MediaBrowser.Model/Entities/MediaStream.cs b/MediaBrowser.Model/Entities/MediaStream.cs index 96b48ca52..58988b6fa 100644 --- a/MediaBrowser.Model/Entities/MediaStream.cs +++ b/MediaBrowser.Model/Entities/MediaStream.cs @@ -73,6 +73,54 @@ namespace MediaBrowser.Model.Entities public string ColorPrimaries { get; set; } /// <summary> + /// Gets or sets the Dolby Vision version major. + /// </summary> + /// <value>The Dolby Vision version major.</value> + public int? DvVersionMajor { get; set; } + + /// <summary> + /// Gets or sets the Dolby Vision version minor. + /// </summary> + /// <value>The Dolby Vision version minor.</value> + public int? DvVersionMinor { get; set; } + + /// <summary> + /// Gets or sets the Dolby Vision profile. + /// </summary> + /// <value>The Dolby Vision profile.</value> + public int? DvProfile { get; set; } + + /// <summary> + /// Gets or sets the Dolby Vision level. + /// </summary> + /// <value>The Dolby Vision level.</value> + public int? DvLevel { get; set; } + + /// <summary> + /// Gets or sets the Dolby Vision rpu present flag. + /// </summary> + /// <value>The Dolby Vision rpu present flag.</value> + public int? RpuPresentFlag { get; set; } + + /// <summary> + /// Gets or sets the Dolby Vision el present flag. + /// </summary> + /// <value>The Dolby Vision el present flag.</value> + public int? ElPresentFlag { get; set; } + + /// <summary> + /// Gets or sets the Dolby Vision bl present flag. + /// </summary> + /// <value>The Dolby Vision bl present flag.</value> + public int? BlPresentFlag { get; set; } + + /// <summary> + /// Gets or sets the Dolby Vision bl signal compatibility id. + /// </summary> + /// <value>The Dolby Vision bl signal compatibility id.</value> + public int? DvBlSignalCompatibilityId { get; set; } + + /// <summary> /// Gets or sets the comment. /// </summary> /// <value>The comment.</value> @@ -104,32 +152,64 @@ namespace MediaBrowser.Model.Entities { get { - if (Type != MediaStreamType.Video) - { - return null; - } + var (videoRange, _) = GetVideoColorRange(); - var colorTransfer = ColorTransfer; - - if (string.Equals(colorTransfer, "smpte2084", StringComparison.OrdinalIgnoreCase) - || string.Equals(colorTransfer, "arib-std-b67", StringComparison.OrdinalIgnoreCase)) - { - return "HDR"; - } + return videoRange; + } + } - // For some Dolby Vision files, no color transfer is provided, so check the codec + /// <summary> + /// Gets the video range type. + /// </summary> + /// <value>The video range type.</value> + public string VideoRangeType + { + get + { + var (_, videoRangeType) = GetVideoColorRange(); - var codecTag = CodecTag; + return videoRangeType; + } + } - if (string.Equals(codecTag, "dovi", StringComparison.OrdinalIgnoreCase) - || string.Equals(codecTag, "dvh1", StringComparison.OrdinalIgnoreCase) - || string.Equals(codecTag, "dvhe", StringComparison.OrdinalIgnoreCase) - || string.Equals(codecTag, "dav1", StringComparison.OrdinalIgnoreCase)) + /// <summary> + /// Gets the video dovi title. + /// </summary> + /// <value>The video dovi title.</value> + public string VideoDoViTitle + { + get + { + var dvProfile = DvProfile; + var rpuPresentFlag = RpuPresentFlag == 1; + var blPresentFlag = BlPresentFlag == 1; + var dvBlCompatId = DvBlSignalCompatibilityId; + + if (rpuPresentFlag + && blPresentFlag + && (dvProfile == 4 + || dvProfile == 5 + || dvProfile == 7 + || dvProfile == 8 + || dvProfile == 9)) { - return "HDR"; + var title = "DV Profile " + dvProfile; + + if (dvBlCompatId > 0) + { + title += "." + dvBlCompatId; + } + + return dvBlCompatId switch + { + 1 => title + " (HDR10)", + 2 => title + " (SDR)", + 4 => title + " (HLG)", + _ => title + }; } - return "SDR"; + return null; } } @@ -571,5 +651,45 @@ namespace MediaBrowser.Model.Entities return true; } + + public (string VideoRange, string VideoRangeType) GetVideoColorRange() + { + if (Type != MediaStreamType.Video) + { + return (null, null); + } + + var colorTransfer = ColorTransfer; + + if (string.Equals(colorTransfer, "smpte2084", StringComparison.OrdinalIgnoreCase)) + { + return ("HDR", "HDR10"); + } + + if (string.Equals(colorTransfer, "arib-std-b67", StringComparison.OrdinalIgnoreCase)) + { + return ("HDR", "HLG"); + } + + var codecTag = CodecTag; + var dvProfile = DvProfile; + var rpuPresentFlag = RpuPresentFlag == 1; + var blPresentFlag = BlPresentFlag == 1; + var dvBlCompatId = DvBlSignalCompatibilityId; + + var isDoViHDRProfile = dvProfile == 5 || dvProfile == 7 || dvProfile == 8; + var isDoViHDRFlag = rpuPresentFlag && blPresentFlag && (dvBlCompatId == 0 || dvBlCompatId == 1 || dvBlCompatId == 4); + + if ((isDoViHDRProfile && isDoViHDRFlag) + || string.Equals(codecTag, "dovi", StringComparison.OrdinalIgnoreCase) + || string.Equals(codecTag, "dvh1", StringComparison.OrdinalIgnoreCase) + || string.Equals(codecTag, "dvhe", StringComparison.OrdinalIgnoreCase) + || string.Equals(codecTag, "dav1", StringComparison.OrdinalIgnoreCase)) + { + return ("HDR", "DOVI"); + } + + return ("SDR", "SDR"); + } } } |
