Skip to content

Commit 8ec865d

Browse files
authored
Merge pull request #820 from DolbyLaboratories/dolby/dovi_dash
Add Dolby Vision for DASH signaling support.
2 parents 2cfda62 + b4c3d98 commit 8ec865d

File tree

2 files changed

+70
-12
lines changed

2 files changed

+70
-12
lines changed

Source/Python/utils/mp4-dash.py

Lines changed: 50 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@
128128

129129
DASH_DEFAULT_ROLE_NAMESPACE = 'urn:mpeg:dash:role:2011'
130130

131+
SCTE_NAMESPACE = 'urn:scte:dash:scte214-extensions'
132+
131133
DASH_MEDIA_SEGMENT_URL_PATTERN_SMOOTH = "/QualityLevels($Bandwidth$)/Fragments(%s=$Time$)"
132134
DASH_MEDIA_SEGMENT_URL_PATTERN_HIPPO = '%s/Bitrate($Bandwidth$)/Fragment($Time$)'
133135

@@ -141,6 +143,10 @@
141143
DOLBY_DIGITAL_AUDIO_CHANNEL_CONFIGURATION_SCHEME_ID_URI = 'tag:dolby.com,2014:dash:audio_channel_configuration:2011'
142144
DOLBY_AC4_AUDIO_CHANNEL_CONFIGURATION_SCHEME_ID_URI = 'tag:dolby.com,2015:dash:audio_channel_configuration:2015'
143145

146+
MPEG_DASH_MATRIX_COEFFICIENTS_SCHEME_ID_URI = 'urn:mpeg:mpegB:cicp:MatrixCoefficients'
147+
MPEG_DASH_COLOUR_PRIMARIES_SCHEME_ID_URI = 'urn:mpeg:mpegB:cicp:ColourPrimaries'
148+
MPEG_DASH_TRANSFER_CHARACTERISTICS_SCHEME_ID_URI = 'urn:mpeg:mpegB:cicp:TransferCharacteristics'
149+
144150
ISOFF_MAIN_PROFILE = 'urn:mpeg:dash:profile:isoff-main:2011'
145151
ISOFF_LIVE_PROFILE = 'urn:mpeg:dash:profile:isoff-live:2011'
146152
ISOFF_ON_DEMAND_PROFILE = 'urn:mpeg:dash:profile:isoff-on-demand:2011'
@@ -485,15 +491,50 @@ def OutputDash(options, set_attributes, audio_sets, video_sets, subtitles_sets,
485491
AddSegmentTemplate(options, adaptation_set, init_segment_url, media_segment_url_template_prefix, video_tracks[0], 'video')
486492

487493
for video_track in video_tracks:
488-
representation = xml.SubElement(adaptation_set,
489-
'Representation',
490-
id=video_track.representation_id,
491-
codecs=video_track.codec,
492-
width=str(video_track.width),
493-
height=str(video_track.height),
494-
scanType=video_track.scan_type,
495-
frameRate=video_track.frame_rate_ratio,
496-
bandwidth=str(video_track.bandwidth))
494+
if hasattr(video_track, 'supplemental_codec') and hasattr(video_track, 'supplemental_profile'):
495+
#adding MatrixCoefficients
496+
if hasattr(video_track, 'matrix_coefficients'):
497+
xml.SubElement(adaptation_set,
498+
'EssentialProperty',
499+
schemeIdUri=MPEG_DASH_MATRIX_COEFFICIENTS_SCHEME_ID_URI,
500+
value=video_track.matrix_coefficients)
501+
502+
#adding ColourPrimaries
503+
if hasattr(video_track, 'colour_primaries'):
504+
xml.SubElement(adaptation_set,
505+
'EssentialProperty',
506+
schemeIdUri=MPEG_DASH_COLOUR_PRIMARIES_SCHEME_ID_URI,
507+
value=video_track.colour_primaries)
508+
509+
#adding TransferCharacteristics
510+
if hasattr(video_track, 'transfer_characteristics'):
511+
xml.SubElement(adaptation_set,
512+
'EssentialProperty',
513+
schemeIdUri=MPEG_DASH_TRANSFER_CHARACTERISTICS_SCHEME_ID_URI,
514+
value=video_track.transfer_characteristics)
515+
516+
representation = xml.SubElement(adaptation_set,
517+
'Representation',
518+
id=video_track.representation_id,
519+
codecs=video_track.codec.split(',')[0],
520+
width=str(video_track.width),
521+
height=str(video_track.height),
522+
scanType=video_track.scan_type,
523+
frameRate=video_track.frame_rate_ratio,
524+
bandwidth=str(video_track.bandwidth))
525+
xml.register_namespace('scte214', SCTE_NAMESPACE)
526+
representation.set('{'+SCTE_NAMESPACE+'}supplementalCodecs', video_track.supplemental_codec)
527+
representation.set('{'+SCTE_NAMESPACE+'}supplementalProfiles', video_track.supplemental_profile)
528+
else:
529+
representation = xml.SubElement(adaptation_set,
530+
'Representation',
531+
id=video_track.representation_id,
532+
codecs=video_track.codec,
533+
width=str(video_track.width),
534+
height=str(video_track.height),
535+
scanType=video_track.scan_type,
536+
frameRate=video_track.frame_rate_ratio,
537+
bandwidth=str(video_track.bandwidth))
497538
if hasattr(video_track, 'max_playout_rate'):
498539
representation.set('maxPlayoutRate', video_track.max_playout_rate)
499540

Source/Python/utils/mp4utils.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -427,17 +427,34 @@ def __init__(self, parent, info):
427427
brand = 'db1p'
428428
if brand in self.parent.info['file']['compatible_brands']:
429429
self.dv_brand = brand
430+
else:
431+
print('WARNING: missing brand "db1p" in MP4 file for Dolby Vision Profile 8.1.')
432+
self.supplemental_profile = brand
433+
self.transfer_characteristics = '16'
434+
self.matrix_coefficients = '9'
435+
self.colour_primaries = '9'
430436
elif bl_compatibility_id == 2:
431437
self.video_range = 'SDR'
432438
brand = 'db2g'
433439
if brand in self.parent.info['file']['compatible_brands']:
434440
self.dv_brand = brand
441+
self.supplemental_profile = brand
435442
elif bl_compatibility_id == 4:
436443
self.video_range = 'HLG'
444+
self.matrix_coefficients = '9'
445+
self.colour_primaries = '9'
437446
if 'db4g' in self.parent.info['file']['compatible_brands']:
438-
self.dv_brand = 'db4g'
439-
elif 'db4h' in self.parent.info['file']['compatible_brands']:
440-
self.dv_brand = 'db4h'
447+
brand = 'db4g'
448+
self.dv_brand = brand
449+
self.supplemental_profile = brand
450+
self.transfer_characteristics = '14'
451+
else:
452+
brand = 'db4h'
453+
self.dv_brand = brand
454+
self.supplemental_profile = brand
455+
self.transfer_characteristics = '18'
456+
if 'db4h' not in self.parent.info['file']['compatible_brands']:
457+
print('WARNING: missing brand "db4g" or "db4h" in MP4 file for Dolby Vision Profile 8.4. Will use "db4h" as default.')
441458
else:
442459
PrintErrorAndExit('ERROR: unsupported ccid for Dolby Vision profile 8/9.')
443460
else:

0 commit comments

Comments
 (0)