- % if data['media_type'] in ('movie', 'episode', 'clip'):
+ % if data['media_type'] in ('movie', 'episode', 'clip') and data['stream_video_decision']:
+ <%
+ if data['video_dynamic_range'] == 'HDR':
+ video_dynamic_range = ' ' + data['video_dynamic_range']
+ stream_video_dynamic_range = ' ' + data['stream_video_dynamic_range']
+ else:
+ video_dynamic_range = stream_video_dynamic_range = ''
+ %>
% if data['stream_video_decision'] == 'transcode':
<%
hw_d = ' (HW)' if data['transcode_hw_decoding'] else ''
hw_e = ' (HW)' if data['transcode_hw_encoding'] else ''
%>
- Transcode (${data['video_codec'].upper()}${hw_d} ${data['video_full_resolution']}
${data['stream_video_codec'].upper()}${hw_e} ${data['stream_video_full_resolution']})
+ Transcode (${data['video_codec'].upper()}${hw_d} ${data['video_full_resolution']}${video_dynamic_range}
${data['stream_video_codec'].upper()}${hw_e} ${data['stream_video_full_resolution']}${stream_video_dynamic_range})
% elif data['stream_video_decision'] == 'copy':
- Direct Stream (${data['stream_video_codec'].upper()} ${data['stream_video_full_resolution']})
+ Direct Stream (${data['stream_video_codec'].upper()} ${data['stream_video_full_resolution']}${stream_video_dynamic_range})
% else:
- Direct Play (${data['stream_video_codec'].upper()} ${data['stream_video_full_resolution']})
+ Direct Play (${data['stream_video_codec'].upper()} ${data['stream_video_full_resolution']}${stream_video_dynamic_range})
% endif
% elif data['media_type'] == 'photo':
Direct Play (${data['width']}x${data['height']})
@@ -248,12 +255,14 @@ DOCUMENTATION :: END
Audio
- % if data['stream_audio_decision'] == 'transcode':
- Transcode (${AUDIO_CODEC_OVERRIDES.get(data['audio_codec'], data['audio_codec'].upper())} ${data['audio_channel_layout'].split('(')[0].capitalize()} ${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
- % elif data['stream_audio_decision'] == 'copy':
- Direct Stream (${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
- % else:
- Direct Play (${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
+ % if data['stream_audio_decision']:
+ % if data['stream_audio_decision'] == 'transcode':
+ Transcode (${AUDIO_CODEC_OVERRIDES.get(data['audio_codec'], data['audio_codec'].upper())} ${data['audio_channel_layout'].split('(')[0].capitalize()} ${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
+ % elif data['stream_audio_decision'] == 'copy':
+ Direct Stream (${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
+ % else:
+ Direct Play (${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
+ % endif
% endif
diff --git a/data/interfaces/default/index.html b/data/interfaces/default/index.html
index 24e9ae5d..d6b479d5 100644
--- a/data/interfaces/default/index.html
+++ b/data/interfaces/default/index.html
@@ -437,6 +437,8 @@
var video_decision = '';
if (['movie', 'episode', 'clip'].indexOf(s.media_type) > -1 && s.stream_video_decision) {
+ var v_bd = (s.video_dynamic_range === 'HDR') ? ' ' + s.video_dynamic_range : '';
+ var sv_bd = (s.video_dynamic_range === 'HDR') ? ' ' + s.stream_video_dynamic_range : '';
var v_res= '';
switch (s.video_resolution.toLowerCase()) {
case 'sd':
@@ -462,11 +464,11 @@
if (s.stream_video_decision === 'transcode') {
var hw_d = (s.transcode_hw_decoding === 1) ? ' (HW)' : '';
var hw_e = (s.transcode_hw_encoding === 1) ? ' (HW)' : '';
- video_decision = 'Transcode (' + s.video_codec.toUpperCase() + hw_d + ' ' + v_res + '
' + s.stream_video_codec.toUpperCase() + hw_e + ' ' + sv_res + ')';
+ video_decision = 'Transcode (' + s.video_codec.toUpperCase() + hw_d + ' ' + v_res + v_bd + '
' + s.stream_video_codec.toUpperCase() + hw_e + ' ' + sv_res + sv_bd + ')';
} else if (s.stream_video_decision === 'copy') {
- video_decision = 'Direct Stream (' + s.stream_video_codec.toUpperCase() + ' ' + sv_res + ')';
+ video_decision = 'Direct Stream (' + s.stream_video_codec.toUpperCase() + ' ' + sv_res + sv_bd + ')';
} else {
- video_decision = 'Direct Play (' + s.stream_video_codec.toUpperCase() + ' ' + sv_res + ')';
+ video_decision = 'Direct Play (' + s.stream_video_codec.toUpperCase() + ' ' + sv_res + sv_bd + ')';
}
} else if (s.media_type === 'photo') {
video_decision = 'Direct Play (' + s.width + 'x' + s.height + ')';
diff --git a/plexpy/pmsconnect.py b/plexpy/pmsconnect.py
index 485b378e..f81f35e3 100644
--- a/plexpy/pmsconnect.py
+++ b/plexpy/pmsconnect.py
@@ -1262,6 +1262,11 @@ class PmsConnect(object):
'video_codec_level': helpers.get_xml_attr(stream, 'level'),
'video_bitrate': helpers.get_xml_attr(stream, 'bitrate'),
'video_bit_depth': helpers.get_xml_attr(stream, 'bitDepth'),
+ 'video_chroma_subsampling': helpers.get_xml_attr(stream, 'chromaSubsampling'),
+ 'video_color_primaries': helpers.get_xml_attr(stream, 'colorPrimaries'),
+ 'video_color_range': helpers.get_xml_attr(stream, 'colorRange'),
+ 'video_color_space': helpers.get_xml_attr(stream, 'colorSpace'),
+ 'video_color_trc': helpers.get_xml_attr(stream, 'colorTrc'),
'video_frame_rate': helpers.get_xml_attr(stream, 'frameRate'),
'video_ref_frames': helpers.get_xml_attr(stream, 'refFrames'),
'video_height': helpers.get_xml_attr(stream, 'height'),
@@ -1698,6 +1703,11 @@ class PmsConnect(object):
video_id = helpers.get_xml_attr(video_stream_info, 'id')
video_details = {'stream_video_bitrate': helpers.get_xml_attr(video_stream_info, 'bitrate'),
'stream_video_bit_depth': helpers.get_xml_attr(video_stream_info, 'bitDepth'),
+ 'stream_video_chroma_subsampling': helpers.get_xml_attr(video_stream_info, 'chromaSubsampling'),
+ 'stream_video_color_primaries': helpers.get_xml_attr(video_stream_info, 'colorPrimaries'),
+ 'stream_video_color_range': helpers.get_xml_attr(video_stream_info, 'colorRange'),
+ 'stream_video_color_space': helpers.get_xml_attr(video_stream_info, 'colorSpace'),
+ 'stream_video_color_trc': helpers.get_xml_attr(video_stream_info, 'colorTrc'),
'stream_video_codec_level': helpers.get_xml_attr(video_stream_info, 'level'),
'stream_video_ref_frames': helpers.get_xml_attr(video_stream_info, 'refFrames'),
'stream_video_language': helpers.get_xml_attr(video_stream_info, 'language'),
@@ -1708,6 +1718,11 @@ class PmsConnect(object):
else:
video_details = {'stream_video_bitrate': '',
'stream_video_bit_depth': '',
+ 'stream_video_chroma_subsampling': '',
+ 'stream_video_color_primaries': '',
+ 'stream_video_color_range': '',
+ 'stream_video_color_space': '',
+ 'stream_video_color_trc': '',
'stream_video_codec_level': '',
'stream_video_ref_frames': '',
'stream_video_language': '',
@@ -1886,6 +1901,11 @@ class PmsConnect(object):
'video_codec_level': '',
'video_bitrate': '',
'video_bit_depth': '',
+ 'video_chroma_subsampling': '',
+ 'video_color_primaries': '',
+ 'video_color_range': '',
+ 'video_color_space': '',
+ 'video_color_trc': '',
'video_frame_rate': '',
'video_ref_frames': '',
'video_height': '',
@@ -1969,6 +1989,21 @@ class PmsConnect(object):
stream_details['stream_video_resolution'],
stream_details['stream_video_resolution'] + (video_details['stream_video_scan_type'][:1] or 'p'))
+ if helpers.cast_to_int(source_video_details['video_bit_depth']) > 8 \
+ and source_video_details['video_color_space'] == 'bt2020nc':
+ stream_details['video_dynamic_range'] = 'HDR'
+ else:
+ stream_details['video_dynamic_range'] = 'SDR'
+
+ if helpers.cast_to_int(video_details['stream_video_bit_depth']) > 8 \
+ and video_details['stream_video_color_space'] == 'bt2020nc':
+ stream_details['stream_video_dynamic_range'] = 'HDR'
+ else:
+ stream_details['stream_video_dynamic_range'] = 'SDR'
+ else:
+ stream_details['video_dynamic_range'] = ''
+ stream_details['stream_video_dynamic_range'] = ''
+
# Get the quality profile
if media_type in ('movie', 'episode', 'clip') and 'stream_bitrate' in stream_details:
if sync_id: