[MP4] Make outputs CMAF compatible
- Added flag --mp4_include_pssh_in_stream, default to true. If it is set to false, the encrypted mp4 stream will not include pssh. - Align BytesOfProtectedData to multiple of 16 bytes for cenc. - Set TrackHeader flag to kTrackEnabled | kTrackInMovie | kTrackInPreview - Move mvex to after trak, required by HLS - Add cmfc/cmfs compatible brands except for avc3/hev1, where CMAF requires single initialization switching set which is not supported. - Set duration to 0 in tkhd, mdhd, mvhd. Also updated major_brand and compatible brands: - Set major_brand to isom (iso-bmff media file format) and made dash a compatible brand - Replaced compatible brand iso6 with iso8 since we use sthd for text tracks Fixes b/36278260 Change-Id: I3cc5dd5aa1621714d517fe02fe3841d19a1a07f6
This commit is contained in:
parent
5d71d8cc9f
commit
d007ddf20b
|
@ -41,3 +41,6 @@ DEFINE_string(temp_dir,
|
||||||
"",
|
"",
|
||||||
"Specify a directory in which to store temporary (intermediate) "
|
"Specify a directory in which to store temporary (intermediate) "
|
||||||
" files. Used only if single_segment=true.");
|
" files. Used only if single_segment=true.");
|
||||||
|
DEFINE_bool(mp4_include_pssh_in_stream,
|
||||||
|
true,
|
||||||
|
"MP4 only: include pssh in the encrypted stream.");
|
||||||
|
|
|
@ -18,5 +18,6 @@ DECLARE_double(fragment_duration);
|
||||||
DECLARE_bool(fragment_sap_aligned);
|
DECLARE_bool(fragment_sap_aligned);
|
||||||
DECLARE_int32(num_subsegments_per_sidx);
|
DECLARE_int32(num_subsegments_per_sidx);
|
||||||
DECLARE_string(temp_dir);
|
DECLARE_string(temp_dir);
|
||||||
|
DECLARE_bool(mp4_include_pssh_in_stream);
|
||||||
|
|
||||||
#endif // APP_MUXER_FLAGS_H_
|
#endif // APP_MUXER_FLAGS_H_
|
||||||
|
|
|
@ -193,6 +193,7 @@ EncryptionOptions GetEncryptionOptions() {
|
||||||
MuxerOptions GetMuxerOptions() {
|
MuxerOptions GetMuxerOptions() {
|
||||||
MuxerOptions muxer_options;
|
MuxerOptions muxer_options;
|
||||||
muxer_options.num_subsegments_per_sidx = FLAGS_num_subsegments_per_sidx;
|
muxer_options.num_subsegments_per_sidx = FLAGS_num_subsegments_per_sidx;
|
||||||
|
muxer_options.mp4_include_pssh_in_stream = FLAGS_mp4_include_pssh_in_stream;
|
||||||
if (FLAGS_mp4_use_decoding_timestamp_in_timeline) {
|
if (FLAGS_mp4_use_decoding_timestamp_in_timeline) {
|
||||||
LOG(WARNING) << "Flag --mp4_use_decoding_timestamp_in_timeline is set. "
|
LOG(WARNING) << "Flag --mp4_use_decoding_timestamp_in_timeline is set. "
|
||||||
"Note that it is a temporary hack to workaround Chromium "
|
"Note that it is a temporary hack to workaround Chromium "
|
||||||
|
|
|
@ -187,6 +187,16 @@ class PackagerAppTest(unittest.TestCase):
|
||||||
self._VerifyDecryption(self.output[0], 'bear-640x360-a-golden.mp4')
|
self._VerifyDecryption(self.output[0], 'bear-640x360-a-golden.mp4')
|
||||||
self._VerifyDecryption(self.output[1], 'bear-640x360-v-golden.mp4')
|
self._VerifyDecryption(self.output[1], 'bear-640x360-v-golden.mp4')
|
||||||
|
|
||||||
|
def testPackageWithEncryptionAndNoPsshInStream(self):
|
||||||
|
self.packager.Package(
|
||||||
|
self._GetStreams(['audio', 'video']),
|
||||||
|
self._GetFlags(encryption=True, include_pssh_in_stream=False))
|
||||||
|
self._DiffGold(self.output[0], 'bear-640x360-a-cenc-no-pssh-golden.mp4')
|
||||||
|
self._DiffGold(self.output[1], 'bear-640x360-v-cenc-no-pssh-golden.mp4')
|
||||||
|
self._DiffGold(self.mpd_output, 'bear-640x360-av-cenc-no-pssh-golden.mpd')
|
||||||
|
self._VerifyDecryption(self.output[0], 'bear-640x360-a-golden.mp4')
|
||||||
|
self._VerifyDecryption(self.output[1], 'bear-640x360-v-golden.mp4')
|
||||||
|
|
||||||
def testPackageWithEncryptionCbc1(self):
|
def testPackageWithEncryptionCbc1(self):
|
||||||
self.packager.Package(
|
self.packager.Package(
|
||||||
self._GetStreams(['audio', 'video']),
|
self._GetStreams(['audio', 'video']),
|
||||||
|
@ -432,6 +442,19 @@ class PackagerAppTest(unittest.TestCase):
|
||||||
self._DiffLiveMpdGold(self.mpd_output,
|
self._DiffLiveMpdGold(self.mpd_output,
|
||||||
'bear-640x360-av-live-cenc-rotation-golden.mpd')
|
'bear-640x360-av-live-cenc-rotation-golden.mpd')
|
||||||
|
|
||||||
|
def testPackageWithLiveProfileAndKeyRotationAndNoPsshInStream(self):
|
||||||
|
self.packager.Package(
|
||||||
|
self._GetStreams(['audio', 'video'], live=True),
|
||||||
|
self._GetFlags(
|
||||||
|
encryption=True, key_rotation=True, include_pssh_in_stream=False))
|
||||||
|
self._DiffLiveGold(self.output[0],
|
||||||
|
'bear-640x360-a-live-cenc-rotation-no-pssh-golden')
|
||||||
|
self._DiffLiveGold(self.output[1],
|
||||||
|
'bear-640x360-v-live-cenc-rotation-no-pssh-golden')
|
||||||
|
self._DiffLiveMpdGold(
|
||||||
|
self.mpd_output,
|
||||||
|
'bear-640x360-av-live-cenc-rotation-no-pssh-golden.mpd')
|
||||||
|
|
||||||
def testPackageWithLiveProfileAndKeyRotationAndNonDashIfIop(self):
|
def testPackageWithLiveProfileAndKeyRotationAndNonDashIfIop(self):
|
||||||
self.packager.Package(
|
self.packager.Package(
|
||||||
self._GetStreams(['audio', 'video'], live=True),
|
self._GetStreams(['audio', 'video'], live=True),
|
||||||
|
@ -550,6 +573,7 @@ class PackagerAppTest(unittest.TestCase):
|
||||||
random_iv=False,
|
random_iv=False,
|
||||||
widevine_encryption=False,
|
widevine_encryption=False,
|
||||||
key_rotation=False,
|
key_rotation=False,
|
||||||
|
include_pssh_in_stream=True,
|
||||||
dash_if_iop=True,
|
dash_if_iop=True,
|
||||||
output_media_info=False,
|
output_media_info=False,
|
||||||
output_hls=False,
|
output_hls=False,
|
||||||
|
@ -587,6 +611,9 @@ class PackagerAppTest(unittest.TestCase):
|
||||||
if key_rotation:
|
if key_rotation:
|
||||||
flags.append('--crypto_period_duration=1')
|
flags.append('--crypto_period_duration=1')
|
||||||
|
|
||||||
|
if not include_pssh_in_stream:
|
||||||
|
flags.append('--mp4_include_pssh_in_stream=false')
|
||||||
|
|
||||||
if not dash_if_iop:
|
if not dash_if_iop:
|
||||||
flags.append('--generate_dash_if_iop_compliant_mpd=false')
|
flags.append('--generate_dash_if_iop_compliant_mpd=false')
|
||||||
if output_media_info:
|
if output_media_info:
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -7,11 +7,11 @@
|
||||||
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
||||||
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
||||||
</ContentProtection>
|
</ContentProtection>
|
||||||
<Representation id="0" bandwidth="81545" codecs="opus" mimeType="audio/mp4" audioSamplingRate="48000">
|
<Representation id="0" bandwidth="81568" codecs="opus" mimeType="audio/mp4" audioSamplingRate="48000">
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<BaseURL>output_audio.mp4</BaseURL>
|
<BaseURL>output_audio.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="967-1034" timescale="1000000">
|
<SegmentBase indexRange="975-1042" timescale="1000000">
|
||||||
<Initialization range="0-966"/>
|
<Initialization range="0-974"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
|
@ -20,10 +20,10 @@
|
||||||
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
||||||
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
||||||
</ContentProtection>
|
</ContentProtection>
|
||||||
<Representation id="1" bandwidth="210170" codecs="vp09.00.00.08.00.01.00.00" mimeType="video/mp4" sar="427:320">
|
<Representation id="1" bandwidth="210193" codecs="vp09.00.00.08.00.01.00.00" mimeType="video/mp4" sar="427:320">
|
||||||
<BaseURL>output_video.mp4</BaseURL>
|
<BaseURL>output_video.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="1051-1118" timescale="1000000">
|
<SegmentBase indexRange="1059-1126" timescale="1000000">
|
||||||
<Initialization range="0-1050"/>
|
<Initialization range="0-1058"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,4 +1,4 @@
|
||||||
bandwidth: 129139
|
bandwidth: 129162
|
||||||
audio_info {
|
audio_info {
|
||||||
codec: "mp4a.40.2"
|
codec: "mp4a.40.2"
|
||||||
sampling_frequency: 44100
|
sampling_frequency: 44100
|
||||||
|
@ -8,11 +8,11 @@ audio_info {
|
||||||
}
|
}
|
||||||
init_range {
|
init_range {
|
||||||
begin: 0
|
begin: 0
|
||||||
end: 958
|
end: 966
|
||||||
}
|
}
|
||||||
index_range {
|
index_range {
|
||||||
begin: 959
|
begin: 967
|
||||||
end: 1026
|
end: 1034
|
||||||
}
|
}
|
||||||
media_file_name: "place_holder"
|
media_file_name: "place_holder"
|
||||||
media_duration_seconds: 2.7631745
|
media_duration_seconds: 2.7631745
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
packager/app/test/testdata/bear-640x360-a-live-cenc-rotation-no-pssh-golden-1.m4s
vendored
Normal file
BIN
packager/app/test/testdata/bear-640x360-a-live-cenc-rotation-no-pssh-golden-1.m4s
vendored
Normal file
Binary file not shown.
BIN
packager/app/test/testdata/bear-640x360-a-live-cenc-rotation-no-pssh-golden-2.m4s
vendored
Normal file
BIN
packager/app/test/testdata/bear-640x360-a-live-cenc-rotation-no-pssh-golden-2.m4s
vendored
Normal file
Binary file not shown.
BIN
packager/app/test/testdata/bear-640x360-a-live-cenc-rotation-no-pssh-golden-3.m4s
vendored
Normal file
BIN
packager/app/test/testdata/bear-640x360-a-live-cenc-rotation-no-pssh-golden-3.m4s
vendored
Normal file
Binary file not shown.
BIN
packager/app/test/testdata/bear-640x360-a-live-cenc-rotation-no-pssh-golden-init.mp4
vendored
Normal file
BIN
packager/app/test/testdata/bear-640x360-a-live-cenc-rotation-no-pssh-golden-init.mp4
vendored
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -7,10 +7,10 @@
|
||||||
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
||||||
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
||||||
</ContentProtection>
|
</ContentProtection>
|
||||||
<Representation id="0" bandwidth="885567" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
<Representation id="0" bandwidth="885590" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||||
<BaseURL>output_video.mp4</BaseURL>
|
<BaseURL>output_video.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="1083-1150" timescale="30000">
|
<SegmentBase indexRange="1091-1158" timescale="30000">
|
||||||
<Initialization range="0-1082"/>
|
<Initialization range="0-1090"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
|
@ -19,11 +19,11 @@
|
||||||
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
||||||
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
||||||
</ContentProtection>
|
</ContentProtection>
|
||||||
<Representation id="1" bandwidth="129139" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
<Representation id="1" bandwidth="129162" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<BaseURL>output_audio.mp4</BaseURL>
|
<BaseURL>output_audio.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="959-1026" timescale="44100">
|
<SegmentBase indexRange="967-1034" timescale="44100">
|
||||||
<Initialization range="0-958"/>
|
<Initialization range="0-966"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
|
|
|
@ -7,10 +7,10 @@
|
||||||
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
||||||
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
||||||
</ContentProtection>
|
</ContentProtection>
|
||||||
<Representation id="0" bandwidth="884377" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
<Representation id="0" bandwidth="884400" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||||
<BaseURL>output_video.mp4</BaseURL>
|
<BaseURL>output_video.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="1092-1159" timescale="30000">
|
<SegmentBase indexRange="1100-1167" timescale="30000">
|
||||||
<Initialization range="0-1091"/>
|
<Initialization range="0-1099"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
|
@ -19,11 +19,11 @@
|
||||||
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
||||||
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
||||||
</ContentProtection>
|
</ContentProtection>
|
||||||
<Representation id="1" bandwidth="127214" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
<Representation id="1" bandwidth="127237" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<BaseURL>output_audio.mp4</BaseURL>
|
<BaseURL>output_audio.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="968-1035" timescale="44100">
|
<SegmentBase indexRange="976-1043" timescale="44100">
|
||||||
<Initialization range="0-967"/>
|
<Initialization range="0-975"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
|
|
|
@ -7,10 +7,10 @@
|
||||||
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
||||||
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
||||||
</ContentProtection>
|
</ContentProtection>
|
||||||
<Representation id="0" bandwidth="885567" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
<Representation id="0" bandwidth="885590" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||||
<BaseURL>output_video.mp4</BaseURL>
|
<BaseURL>output_video.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="1083-1150" timescale="30000">
|
<SegmentBase indexRange="1091-1158" timescale="30000">
|
||||||
<Initialization range="0-1082"/>
|
<Initialization range="0-1090"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
|
@ -19,11 +19,11 @@
|
||||||
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
||||||
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
||||||
</ContentProtection>
|
</ContentProtection>
|
||||||
<Representation id="1" bandwidth="129139" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
<Representation id="1" bandwidth="129162" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<BaseURL>output_audio.mp4</BaseURL>
|
<BaseURL>output_audio.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="959-1026" timescale="44100">
|
<SegmentBase indexRange="967-1034" timescale="44100">
|
||||||
<Initialization range="0-958"/>
|
<Initialization range="0-966"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--Generated with https://github.com/google/shaka-packager version <tag>-<hash>-<test>-->
|
||||||
|
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT2.76317S">
|
||||||
|
<Period id="0">
|
||||||
|
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
|
||||||
|
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="31323334-3536-3738-3930-313233343536"/>
|
||||||
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
||||||
|
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
||||||
|
</ContentProtection>
|
||||||
|
<Representation id="0" bandwidth="885438" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||||
|
<BaseURL>output_video.mp4</BaseURL>
|
||||||
|
<SegmentBase indexRange="1039-1106" timescale="30000">
|
||||||
|
<Initialization range="0-1038"/>
|
||||||
|
</SegmentBase>
|
||||||
|
</Representation>
|
||||||
|
</AdaptationSet>
|
||||||
|
<AdaptationSet id="1" contentType="audio" subsegmentAlignment="true">
|
||||||
|
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="31323334-3536-3738-3930-313233343536"/>
|
||||||
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
||||||
|
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
||||||
|
</ContentProtection>
|
||||||
|
<Representation id="1" bandwidth="129012" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
|
<BaseURL>output_audio.mp4</BaseURL>
|
||||||
|
<SegmentBase indexRange="915-982" timescale="44100">
|
||||||
|
<Initialization range="0-914"/>
|
||||||
|
</SegmentBase>
|
||||||
|
</Representation>
|
||||||
|
</AdaptationSet>
|
||||||
|
</Period>
|
||||||
|
</MPD>
|
|
@ -3,27 +3,27 @@
|
||||||
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT2.76317S">
|
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT2.76317S">
|
||||||
<Period id="0">
|
<Period id="0">
|
||||||
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
|
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
|
||||||
<Representation id="0" bandwidth="885567" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
<Representation id="0" bandwidth="885590" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||||
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="31323334-3536-3738-3930-313233343536"/>
|
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="31323334-3536-3738-3930-313233343536"/>
|
||||||
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
||||||
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
||||||
</ContentProtection>
|
</ContentProtection>
|
||||||
<BaseURL>output_video.mp4</BaseURL>
|
<BaseURL>output_video.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="1083-1150" timescale="30000">
|
<SegmentBase indexRange="1091-1158" timescale="30000">
|
||||||
<Initialization range="0-1082"/>
|
<Initialization range="0-1090"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
<AdaptationSet id="1" contentType="audio" subsegmentAlignment="true">
|
<AdaptationSet id="1" contentType="audio" subsegmentAlignment="true">
|
||||||
<Representation id="1" bandwidth="129139" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
<Representation id="1" bandwidth="129162" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="31323334-3536-3738-3930-313233343536"/>
|
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="31323334-3536-3738-3930-313233343536"/>
|
||||||
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
||||||
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
||||||
</ContentProtection>
|
</ContentProtection>
|
||||||
<BaseURL>output_audio.mp4</BaseURL>
|
<BaseURL>output_audio.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="959-1026" timescale="44100">
|
<SegmentBase indexRange="967-1034" timescale="44100">
|
||||||
<Initialization range="0-958"/>
|
<Initialization range="0-966"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
|
|
|
@ -7,10 +7,10 @@
|
||||||
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
||||||
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
||||||
</ContentProtection>
|
</ContentProtection>
|
||||||
<Representation id="0" bandwidth="885567" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
<Representation id="0" bandwidth="885590" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||||
<BaseURL>output_video.mp4</BaseURL>
|
<BaseURL>output_video.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="1083-1150" timescale="30000">
|
<SegmentBase indexRange="1091-1158" timescale="30000">
|
||||||
<Initialization range="0-1082"/>
|
<Initialization range="0-1090"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
|
@ -19,11 +19,11 @@
|
||||||
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
||||||
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
||||||
</ContentProtection>
|
</ContentProtection>
|
||||||
<Representation id="1" bandwidth="129139" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
<Representation id="1" bandwidth="129162" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<BaseURL>output_audio.mp4</BaseURL>
|
<BaseURL>output_audio.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="959-1026" timescale="44100">
|
<SegmentBase indexRange="967-1034" timescale="44100">
|
||||||
<Initialization range="0-958"/>
|
<Initialization range="0-966"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
|
|
|
@ -3,19 +3,19 @@
|
||||||
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT2.76317S">
|
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT2.76317S">
|
||||||
<Period id="0">
|
<Period id="0">
|
||||||
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
|
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
|
||||||
<Representation id="0" bandwidth="882040" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
<Representation id="0" bandwidth="882064" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||||
<BaseURL>output_video.mp4</BaseURL>
|
<BaseURL>output_video.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="815-882" timescale="30000">
|
<SegmentBase indexRange="823-890" timescale="30000">
|
||||||
<Initialization range="0-814"/>
|
<Initialization range="0-822"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
<AdaptationSet id="1" contentType="audio" subsegmentAlignment="true">
|
<AdaptationSet id="1" contentType="audio" subsegmentAlignment="true">
|
||||||
<Representation id="1" bandwidth="126487" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
<Representation id="1" bandwidth="126510" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<BaseURL>output_audio.mp4</BaseURL>
|
<BaseURL>output_audio.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="749-816" timescale="44100">
|
<SegmentBase indexRange="757-824" timescale="44100">
|
||||||
<Initialization range="0-748"/>
|
<Initialization range="0-756"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
||||||
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
||||||
</ContentProtection>
|
</ContentProtection>
|
||||||
<Representation id="0" bandwidth="875620" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
<Representation id="0" bandwidth="875692" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||||
<SegmentTemplate timescale="30000" initialization="output_video-init.mp4" media="output_video-$Number$.m4s" startNumber="1">
|
<SegmentTemplate timescale="30000" initialization="output_video-init.mp4" media="output_video-$Number$.m4s" startNumber="1">
|
||||||
<SegmentTimeline>
|
<SegmentTimeline>
|
||||||
<S t="2002" d="30030" r="1"/>
|
<S t="2002" d="30030" r="1"/>
|
||||||
|
@ -21,7 +21,7 @@
|
||||||
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
||||||
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
||||||
</ContentProtection>
|
</ContentProtection>
|
||||||
<Representation id="1" bandwidth="124560" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
<Representation id="1" bandwidth="124634" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<SegmentTemplate timescale="44100" initialization="output_audio-init.mp4" media="output_audio-$Number$.m4s" startNumber="1">
|
<SegmentTemplate timescale="44100" initialization="output_audio-init.mp4" media="output_audio-$Number$.m4s" startNumber="1">
|
||||||
<SegmentTimeline>
|
<SegmentTimeline>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-live:2011" minBufferTime="PT2S" type="dynamic" publishTime="some_publish_time" availabilityStartTime="some_availability_start_time" minimumUpdatePeriod="PT5S" timeShiftBufferDepth="PT1800S">
|
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-live:2011" minBufferTime="PT2S" type="dynamic" publishTime="some_publish_time" availabilityStartTime="some_availability_start_time" minimumUpdatePeriod="PT5S" timeShiftBufferDepth="PT1800S">
|
||||||
<Period id="0" start="PT0S">
|
<Period id="0" start="PT0S">
|
||||||
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" segmentAlignment="true" par="16:9">
|
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" segmentAlignment="true" par="16:9">
|
||||||
<Representation id="0" bandwidth="875620" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
<Representation id="0" bandwidth="875692" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||||
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="31323334-3536-3738-3930-313233343536"/>
|
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="31323334-3536-3738-3930-313233343536"/>
|
||||||
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
||||||
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
<AdaptationSet id="1" contentType="audio" segmentAlignment="true">
|
<AdaptationSet id="1" contentType="audio" segmentAlignment="true">
|
||||||
<Representation id="1" bandwidth="124560" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
<Representation id="1" bandwidth="124634" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="31323334-3536-3738-3930-313233343536"/>
|
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="31323334-3536-3738-3930-313233343536"/>
|
||||||
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" segmentAlignment="true" par="16:9">
|
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" segmentAlignment="true" par="16:9">
|
||||||
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="00000000-0000-0000-0000-000000000000"/>
|
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="00000000-0000-0000-0000-000000000000"/>
|
||||||
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b"/>
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b"/>
|
||||||
<Representation id="0" bandwidth="876506" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
<Representation id="0" bandwidth="876578" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||||
<SegmentTemplate timescale="30000" initialization="output_video-init.mp4" media="output_video-$Number$.m4s" startNumber="1">
|
<SegmentTemplate timescale="30000" initialization="output_video-init.mp4" media="output_video-$Number$.m4s" startNumber="1">
|
||||||
<SegmentTimeline>
|
<SegmentTimeline>
|
||||||
<S t="2002" d="30030" r="1"/>
|
<S t="2002" d="30030" r="1"/>
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
<AdaptationSet id="1" contentType="audio" segmentAlignment="true">
|
<AdaptationSet id="1" contentType="audio" segmentAlignment="true">
|
||||||
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="00000000-0000-0000-0000-000000000000"/>
|
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="00000000-0000-0000-0000-000000000000"/>
|
||||||
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b"/>
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b"/>
|
||||||
<Representation id="1" bandwidth="125525" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
<Representation id="1" bandwidth="125598" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<SegmentTemplate timescale="44100" initialization="output_audio-init.mp4" media="output_audio-$Number$.m4s" startNumber="1">
|
<SegmentTemplate timescale="44100" initialization="output_audio-init.mp4" media="output_audio-$Number$.m4s" startNumber="1">
|
||||||
<SegmentTimeline>
|
<SegmentTimeline>
|
||||||
|
|
32
packager/app/test/testdata/bear-640x360-av-live-cenc-rotation-no-pssh-golden.mpd
vendored
Normal file
32
packager/app/test/testdata/bear-640x360-av-live-cenc-rotation-no-pssh-golden.mpd
vendored
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--Generated with https://github.com/google/shaka-packager version <tag>-<hash>-<test>-->
|
||||||
|
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-live:2011" minBufferTime="PT2S" type="dynamic" publishTime="some_publish_time" availabilityStartTime="some_availability_start_time" minimumUpdatePeriod="PT5S" timeShiftBufferDepth="PT1800S">
|
||||||
|
<Period id="0" start="PT0S">
|
||||||
|
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" segmentAlignment="true" par="16:9">
|
||||||
|
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="00000000-0000-0000-0000-000000000000"/>
|
||||||
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b"/>
|
||||||
|
<Representation id="0" bandwidth="876109" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||||
|
<SegmentTemplate timescale="30000" initialization="output_video-init.mp4" media="output_video-$Number$.m4s" startNumber="1">
|
||||||
|
<SegmentTimeline>
|
||||||
|
<S t="2002" d="30030" r="1"/>
|
||||||
|
<S t="62062" d="22022"/>
|
||||||
|
</SegmentTimeline>
|
||||||
|
</SegmentTemplate>
|
||||||
|
</Representation>
|
||||||
|
</AdaptationSet>
|
||||||
|
<AdaptationSet id="1" contentType="audio" segmentAlignment="true">
|
||||||
|
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="00000000-0000-0000-0000-000000000000"/>
|
||||||
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b"/>
|
||||||
|
<Representation id="1" bandwidth="125122" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
|
<SegmentTemplate timescale="44100" initialization="output_audio-init.mp4" media="output_audio-$Number$.m4s" startNumber="1">
|
||||||
|
<SegmentTimeline>
|
||||||
|
<S t="0" d="45056"/>
|
||||||
|
<S t="45056" d="44032"/>
|
||||||
|
<S t="89088" d="32768"/>
|
||||||
|
</SegmentTimeline>
|
||||||
|
</SegmentTemplate>
|
||||||
|
</Representation>
|
||||||
|
</AdaptationSet>
|
||||||
|
</Period>
|
||||||
|
</MPD>
|
|
@ -3,7 +3,7 @@
|
||||||
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-live:2011" minBufferTime="PT2S" type="dynamic" publishTime="some_publish_time" availabilityStartTime="some_availability_start_time" minimumUpdatePeriod="PT5S" timeShiftBufferDepth="PT1800S">
|
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-live:2011" minBufferTime="PT2S" type="dynamic" publishTime="some_publish_time" availabilityStartTime="some_availability_start_time" minimumUpdatePeriod="PT5S" timeShiftBufferDepth="PT1800S">
|
||||||
<Period id="0" start="PT0S">
|
<Period id="0" start="PT0S">
|
||||||
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" segmentAlignment="true" par="16:9">
|
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" segmentAlignment="true" par="16:9">
|
||||||
<Representation id="0" bandwidth="876506" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
<Representation id="0" bandwidth="876578" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||||
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="00000000-0000-0000-0000-000000000000"/>
|
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="00000000-0000-0000-0000-000000000000"/>
|
||||||
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b"/>
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b"/>
|
||||||
<SegmentTemplate timescale="30000" initialization="output_video-init.mp4" media="output_video-$Number$.m4s" startNumber="1">
|
<SegmentTemplate timescale="30000" initialization="output_video-init.mp4" media="output_video-$Number$.m4s" startNumber="1">
|
||||||
|
@ -15,7 +15,7 @@
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
<AdaptationSet id="1" contentType="audio" segmentAlignment="true">
|
<AdaptationSet id="1" contentType="audio" segmentAlignment="true">
|
||||||
<Representation id="1" bandwidth="125525" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
<Representation id="1" bandwidth="125598" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="00000000-0000-0000-0000-000000000000"/>
|
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="00000000-0000-0000-0000-000000000000"/>
|
||||||
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b"/>
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b"/>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-live:2011" minBufferTime="PT2S" type="dynamic" publishTime="some_publish_time" availabilityStartTime="some_availability_start_time" minimumUpdatePeriod="PT5S" timeShiftBufferDepth="PT1800S">
|
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-live:2011" minBufferTime="PT2S" type="dynamic" publishTime="some_publish_time" availabilityStartTime="some_availability_start_time" minimumUpdatePeriod="PT5S" timeShiftBufferDepth="PT1800S">
|
||||||
<Period id="0" start="PT0S">
|
<Period id="0" start="PT0S">
|
||||||
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" segmentAlignment="true" par="16:9">
|
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" segmentAlignment="true" par="16:9">
|
||||||
<Representation id="0" bandwidth="872999" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
<Representation id="0" bandwidth="873071" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||||
<SegmentTemplate timescale="30000" initialization="output_video-init.mp4" media="output_video-$Number$.m4s" startNumber="1">
|
<SegmentTemplate timescale="30000" initialization="output_video-init.mp4" media="output_video-$Number$.m4s" startNumber="1">
|
||||||
<SegmentTimeline>
|
<SegmentTimeline>
|
||||||
<S t="2002" d="30030" r="1"/>
|
<S t="2002" d="30030" r="1"/>
|
||||||
|
@ -13,7 +13,7 @@
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
<AdaptationSet id="1" contentType="audio" segmentAlignment="true">
|
<AdaptationSet id="1" contentType="audio" segmentAlignment="true">
|
||||||
<Representation id="1" bandwidth="122235" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
<Representation id="1" bandwidth="122308" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<SegmentTemplate timescale="44100" initialization="output_audio-init.mp4" media="output_audio-$Number$.m4s" startNumber="1">
|
<SegmentTemplate timescale="44100" initialization="output_audio-init.mp4" media="output_audio-$Number$.m4s" startNumber="1">
|
||||||
<SegmentTimeline>
|
<SegmentTimeline>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-live:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT2.76317S">
|
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-live:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT2.76317S">
|
||||||
<Period id="0">
|
<Period id="0">
|
||||||
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" segmentAlignment="true" par="16:9">
|
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" segmentAlignment="true" par="16:9">
|
||||||
<Representation id="0" bandwidth="872999" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
<Representation id="0" bandwidth="873071" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||||
<SegmentTemplate timescale="30000" initialization="output_video-init.mp4" media="output_video-$Number$.m4s" startNumber="1">
|
<SegmentTemplate timescale="30000" initialization="output_video-init.mp4" media="output_video-$Number$.m4s" startNumber="1">
|
||||||
<SegmentTimeline>
|
<SegmentTimeline>
|
||||||
<S t="2002" d="30030" r="1"/>
|
<S t="2002" d="30030" r="1"/>
|
||||||
|
@ -13,7 +13,7 @@
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
<AdaptationSet id="1" contentType="audio" segmentAlignment="true">
|
<AdaptationSet id="1" contentType="audio" segmentAlignment="true">
|
||||||
<Representation id="1" bandwidth="122235" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
<Representation id="1" bandwidth="122308" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<SegmentTemplate timescale="44100" initialization="output_audio-init.mp4" media="output_audio-$Number$.m4s" startNumber="1">
|
<SegmentTemplate timescale="44100" initialization="output_audio-init.mp4" media="output_audio-$Number$.m4s" startNumber="1">
|
||||||
<SegmentTimeline>
|
<SegmentTimeline>
|
||||||
|
|
|
@ -3,19 +3,19 @@
|
||||||
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT2.76317S">
|
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT2.76317S">
|
||||||
<Period id="0">
|
<Period id="0">
|
||||||
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
|
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
|
||||||
<Representation id="0" bandwidth="882040" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
<Representation id="0" bandwidth="882064" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||||
<BaseURL>output_video.mp4</BaseURL>
|
<BaseURL>output_video.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="815-882" timescale="30000">
|
<SegmentBase indexRange="823-890" timescale="30000">
|
||||||
<Initialization range="0-814"/>
|
<Initialization range="0-822"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
<AdaptationSet id="1" contentType="audio" lang="pt-BR" subsegmentAlignment="true">
|
<AdaptationSet id="1" contentType="audio" lang="pt-BR" subsegmentAlignment="true">
|
||||||
<Representation id="1" bandwidth="126487" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
<Representation id="1" bandwidth="126510" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<BaseURL>output_audio.mp4</BaseURL>
|
<BaseURL>output_audio.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="749-816" timescale="44100">
|
<SegmentBase indexRange="757-824" timescale="44100">
|
||||||
<Initialization range="0-748"/>
|
<Initialization range="0-756"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
|
|
|
@ -3,19 +3,19 @@
|
||||||
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT2.76317S">
|
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT2.76317S">
|
||||||
<Period id="0">
|
<Period id="0">
|
||||||
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
|
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
|
||||||
<Representation id="0" bandwidth="882040" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
<Representation id="0" bandwidth="882064" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||||
<BaseURL>output_video.mp4</BaseURL>
|
<BaseURL>output_video.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="815-882" timescale="30000">
|
<SegmentBase indexRange="823-890" timescale="30000">
|
||||||
<Initialization range="0-814"/>
|
<Initialization range="0-822"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
<AdaptationSet id="1" contentType="audio" lang="pt-BR" subsegmentAlignment="true">
|
<AdaptationSet id="1" contentType="audio" lang="pt-BR" subsegmentAlignment="true">
|
||||||
<Representation id="1" bandwidth="126487" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
<Representation id="1" bandwidth="126510" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<BaseURL>output_audio.mp4</BaseURL>
|
<BaseURL>output_audio.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="749-816" timescale="44100">
|
<SegmentBase indexRange="757-824" timescale="44100">
|
||||||
<Initialization range="0-748"/>
|
<Initialization range="0-756"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
|
|
|
@ -8,19 +8,19 @@
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
<AdaptationSet id="1" contentType="video" width="640" height="360" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
|
<AdaptationSet id="1" contentType="video" width="640" height="360" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
|
||||||
<Representation id="1" bandwidth="882040" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
<Representation id="1" bandwidth="882064" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||||
<BaseURL>output_video.mp4</BaseURL>
|
<BaseURL>output_video.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="815-882" timescale="30000">
|
<SegmentBase indexRange="823-890" timescale="30000">
|
||||||
<Initialization range="0-814"/>
|
<Initialization range="0-822"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
<AdaptationSet id="2" contentType="audio" subsegmentAlignment="true">
|
<AdaptationSet id="2" contentType="audio" subsegmentAlignment="true">
|
||||||
<Representation id="2" bandwidth="126487" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
<Representation id="2" bandwidth="126510" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<BaseURL>output_audio.mp4</BaseURL>
|
<BaseURL>output_audio.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="749-816" timescale="44100">
|
<SegmentBase indexRange="757-824" timescale="44100">
|
||||||
<Initialization range="0-748"/>
|
<Initialization range="0-756"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
|
|
Binary file not shown.
|
@ -7,10 +7,10 @@
|
||||||
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
||||||
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
||||||
</ContentProtection>
|
</ContentProtection>
|
||||||
<Representation id="0" bandwidth="264870" codecs="hev1.1.6.L63.90" mimeType="video/mp4" sar="1:1">
|
<Representation id="0" bandwidth="264881" codecs="hev1.1.6.L63.90" mimeType="video/mp4" sar="1:1">
|
||||||
<BaseURL>output_video.mp4</BaseURL>
|
<BaseURL>output_video.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="3171-3238" timescale="30000">
|
<SegmentBase indexRange="3175-3242" timescale="30000">
|
||||||
<Initialization range="0-3170"/>
|
<Initialization range="0-3174"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,4 +1,4 @@
|
||||||
bandwidth: 885567
|
bandwidth: 885590
|
||||||
video_info {
|
video_info {
|
||||||
codec: "avc1.64001e"
|
codec: "avc1.64001e"
|
||||||
width: 640
|
width: 640
|
||||||
|
@ -11,11 +11,11 @@ video_info {
|
||||||
}
|
}
|
||||||
init_range {
|
init_range {
|
||||||
begin: 0
|
begin: 0
|
||||||
end: 1082
|
end: 1090
|
||||||
}
|
}
|
||||||
index_range {
|
index_range {
|
||||||
begin: 1083
|
begin: 1091
|
||||||
end: 1150
|
end: 1158
|
||||||
}
|
}
|
||||||
media_file_name: "place_holder"
|
media_file_name: "place_holder"
|
||||||
media_duration_seconds: 2.7360666
|
media_duration_seconds: 2.7360666
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -3,10 +3,10 @@
|
||||||
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT2.73607S">
|
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT2.73607S">
|
||||||
<Period id="0">
|
<Period id="0">
|
||||||
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
|
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
|
||||||
<Representation id="0" bandwidth="882040" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
<Representation id="0" bandwidth="882064" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||||
<BaseURL>output_0.mp4</BaseURL>
|
<BaseURL>output_0.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="815-882" timescale="30000">
|
<SegmentBase indexRange="823-890" timescale="30000">
|
||||||
<Initialization range="0-814"/>
|
<Initialization range="0-822"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
packager/app/test/testdata/bear-640x360-v-live-cenc-rotation-no-pssh-golden-1.m4s
vendored
Normal file
BIN
packager/app/test/testdata/bear-640x360-v-live-cenc-rotation-no-pssh-golden-1.m4s
vendored
Normal file
Binary file not shown.
BIN
packager/app/test/testdata/bear-640x360-v-live-cenc-rotation-no-pssh-golden-2.m4s
vendored
Normal file
BIN
packager/app/test/testdata/bear-640x360-v-live-cenc-rotation-no-pssh-golden-2.m4s
vendored
Normal file
Binary file not shown.
BIN
packager/app/test/testdata/bear-640x360-v-live-cenc-rotation-no-pssh-golden-3.m4s
vendored
Normal file
BIN
packager/app/test/testdata/bear-640x360-v-live-cenc-rotation-no-pssh-golden-3.m4s
vendored
Normal file
Binary file not shown.
BIN
packager/app/test/testdata/bear-640x360-v-live-cenc-rotation-no-pssh-golden-init.mp4
vendored
Normal file
BIN
packager/app/test/testdata/bear-640x360-v-live-cenc-rotation-no-pssh-golden-init.mp4
vendored
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -7,10 +7,10 @@
|
||||||
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
||||||
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
||||||
</ContentProtection>
|
</ContentProtection>
|
||||||
<Representation id="0" bandwidth="340983" codecs="vp08.00.00.08.01.01.00.00" mimeType="video/mp4" sar="1:1">
|
<Representation id="0" bandwidth="341006" codecs="vp08.00.00.08.01.01.00.00" mimeType="video/mp4" sar="1:1">
|
||||||
<BaseURL>output_video.mp4</BaseURL>
|
<BaseURL>output_video.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="1019-1086" timescale="1000000">
|
<SegmentBase indexRange="1027-1094" timescale="1000000">
|
||||||
<Initialization range="0-1018"/>
|
<Initialization range="0-1026"/>
|
||||||
</SegmentBase>
|
</SegmentBase>
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
|
|
Binary file not shown.
|
@ -103,6 +103,11 @@ std::unique_ptr<FixedKeySource> FixedKeySource::CreateFromHexStrings(
|
||||||
if (!base::HexStringToBytes(key_hex, &encryption_key->key)) {
|
if (!base::HexStringToBytes(key_hex, &encryption_key->key)) {
|
||||||
LOG(ERROR) << "Cannot parse key_hex " << key_hex;
|
LOG(ERROR) << "Cannot parse key_hex " << key_hex;
|
||||||
return std::unique_ptr<FixedKeySource>();
|
return std::unique_ptr<FixedKeySource>();
|
||||||
|
} else if (encryption_key->key.size() != 16) {
|
||||||
|
// CENC only supports AES-128, i.e. 16 bytes.
|
||||||
|
LOG(ERROR) << "Invalid key size '" << encryption_key->key.size()
|
||||||
|
<< "', must be 16 bytes.";
|
||||||
|
return std::unique_ptr<FixedKeySource>();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<uint8_t> pssh_boxes;
|
std::vector<uint8_t> pssh_boxes;
|
||||||
|
|
|
@ -32,6 +32,8 @@ enum FourCC : uint32_t {
|
||||||
FOURCC_cenc = 0x63656e63,
|
FOURCC_cenc = 0x63656e63,
|
||||||
FOURCC_cens = 0x63656e73,
|
FOURCC_cens = 0x63656e73,
|
||||||
FOURCC_co64 = 0x636f3634,
|
FOURCC_co64 = 0x636f3634,
|
||||||
|
FOURCC_cmfc = 0x636d6663,
|
||||||
|
FOURCC_cmfs = 0x636d6673,
|
||||||
FOURCC_ctim = 0x6374696d,
|
FOURCC_ctim = 0x6374696d,
|
||||||
FOURCC_ctts = 0x63747473,
|
FOURCC_ctts = 0x63747473,
|
||||||
FOURCC_dOps = 0x644f7073,
|
FOURCC_dOps = 0x644f7073,
|
||||||
|
@ -63,6 +65,8 @@ enum FourCC : uint32_t {
|
||||||
FOURCC_hvcC = 0x68766343,
|
FOURCC_hvcC = 0x68766343,
|
||||||
FOURCC_iden = 0x6964656e,
|
FOURCC_iden = 0x6964656e,
|
||||||
FOURCC_iso6 = 0x69736f36,
|
FOURCC_iso6 = 0x69736f36,
|
||||||
|
FOURCC_iso8 = 0x69736f38,
|
||||||
|
FOURCC_isom = 0x69736f6d,
|
||||||
FOURCC_iods = 0x696f6473,
|
FOURCC_iods = 0x696f6473,
|
||||||
FOURCC_mdat = 0x6d646174,
|
FOURCC_mdat = 0x6d646174,
|
||||||
FOURCC_mdhd = 0x6d646864,
|
FOURCC_mdhd = 0x6d646864,
|
||||||
|
|
|
@ -50,6 +50,12 @@ struct MuxerOptions {
|
||||||
/// User-specified bit rate for the media stream. If zero, the muxer will
|
/// User-specified bit rate for the media stream. If zero, the muxer will
|
||||||
/// attempt to estimate.
|
/// attempt to estimate.
|
||||||
uint32_t bandwidth = 0;
|
uint32_t bandwidth = 0;
|
||||||
|
|
||||||
|
// MP4 only: include pssh in the encrypted stream. CMAF recommends carrying
|
||||||
|
// license acquisition information in the manifest and not duplicate the
|
||||||
|
// information in the stream. (This is not a hard requirement so we are still
|
||||||
|
// CMAF compatible even if pssh is included in the stream.)
|
||||||
|
bool mp4_include_pssh_in_stream = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace media
|
} // namespace media
|
||||||
|
|
|
@ -463,8 +463,12 @@ bool EncryptionHandler::EncryptNalFrame(MediaSample* sample,
|
||||||
// ISO/IEC 23001-7:2016 10.2 'cbc1' 10.3 'cens'
|
// ISO/IEC 23001-7:2016 10.2 'cbc1' 10.3 'cens'
|
||||||
// The BytesOfProtectedData size SHALL be a multiple of 16 bytes to
|
// The BytesOfProtectedData size SHALL be a multiple of 16 bytes to
|
||||||
// avoid partial blocks in Subsamples.
|
// avoid partial blocks in Subsamples.
|
||||||
|
// CMAF requires 'cenc' scheme BytesOfProtectedData SHALL be a multiple
|
||||||
|
// of 16 bytes; while 'cbcs' scheme BytesOfProtectedData SHALL start on
|
||||||
|
// the first byte of video data following the slice header.
|
||||||
if (encryption_options_.protection_scheme == FOURCC_cbc1 ||
|
if (encryption_options_.protection_scheme == FOURCC_cbc1 ||
|
||||||
encryption_options_.protection_scheme == FOURCC_cens) {
|
encryption_options_.protection_scheme == FOURCC_cens ||
|
||||||
|
encryption_options_.protection_scheme == FOURCC_cenc) {
|
||||||
const uint16_t misalign_bytes = cipher_bytes % kCencBlockSize;
|
const uint16_t misalign_bytes = cipher_bytes % kCencBlockSize;
|
||||||
current_clear_bytes += misalign_bytes;
|
current_clear_bytes += misalign_bytes;
|
||||||
cipher_bytes -= misalign_bytes;
|
cipher_bytes -= misalign_bytes;
|
||||||
|
|
|
@ -237,7 +237,8 @@ class EncryptionHandlerEncryptionTest
|
||||||
subsamples.emplace_back(static_cast<uint16_t>(kSubsampleSize3), 0u);
|
subsamples.emplace_back(static_cast<uint16_t>(kSubsampleSize3), 0u);
|
||||||
} else {
|
} else {
|
||||||
if (codec_ == kCodecVP9 || protection_scheme_ == FOURCC_cbc1 ||
|
if (codec_ == kCodecVP9 || protection_scheme_ == FOURCC_cbc1 ||
|
||||||
protection_scheme_ == FOURCC_cens) {
|
protection_scheme_ == FOURCC_cens ||
|
||||||
|
protection_scheme_ == FOURCC_cenc) {
|
||||||
// Align the encrypted bytes to multiple of 16 bytes.
|
// Align the encrypted bytes to multiple of 16 bytes.
|
||||||
subsamples.emplace_back(static_cast<uint16_t>(kAlignedClearSize1),
|
subsamples.emplace_back(static_cast<uint16_t>(kAlignedClearSize1),
|
||||||
static_cast<uint32_t>(kAlignedCipherSize1));
|
static_cast<uint32_t>(kAlignedCipherSize1));
|
||||||
|
|
|
@ -562,7 +562,7 @@ TrackHeader::TrackHeader()
|
||||||
volume(-1),
|
volume(-1),
|
||||||
width(0),
|
width(0),
|
||||||
height(0) {
|
height(0) {
|
||||||
flags = kTrackEnabled | kTrackInMovie;
|
flags = kTrackEnabled | kTrackInMovie | kTrackInPreview;
|
||||||
}
|
}
|
||||||
TrackHeader::~TrackHeader() {}
|
TrackHeader::~TrackHeader() {}
|
||||||
FourCC TrackHeader::BoxType() const { return FOURCC_tkhd; }
|
FourCC TrackHeader::BoxType() const { return FOURCC_tkhd; }
|
||||||
|
@ -2219,16 +2219,17 @@ bool Movie::ReadWriteInternal(BoxBuffer* buffer) {
|
||||||
RCHECK(ReadWriteHeaderInternal(buffer) &&
|
RCHECK(ReadWriteHeaderInternal(buffer) &&
|
||||||
buffer->PrepareChildren() &&
|
buffer->PrepareChildren() &&
|
||||||
buffer->ReadWriteChild(&header) &&
|
buffer->ReadWriteChild(&header) &&
|
||||||
buffer->TryReadWriteChild(&metadata) &&
|
buffer->TryReadWriteChild(&metadata));
|
||||||
buffer->TryReadWriteChild(&extends));
|
|
||||||
if (buffer->Reading()) {
|
if (buffer->Reading()) {
|
||||||
BoxReader* reader = buffer->reader();
|
BoxReader* reader = buffer->reader();
|
||||||
DCHECK(reader);
|
DCHECK(reader);
|
||||||
RCHECK(reader->ReadChildren(&tracks) &&
|
RCHECK(reader->ReadChildren(&tracks) &&
|
||||||
|
reader->TryReadChild(&extends) &&
|
||||||
reader->TryReadChildren(&pssh));
|
reader->TryReadChildren(&pssh));
|
||||||
} else {
|
} else {
|
||||||
for (uint32_t i = 0; i < tracks.size(); ++i)
|
for (uint32_t i = 0; i < tracks.size(); ++i)
|
||||||
RCHECK(buffer->ReadWriteChild(&tracks[i]));
|
RCHECK(buffer->ReadWriteChild(&tracks[i]));
|
||||||
|
RCHECK(buffer->TryReadWriteChild(&extends));
|
||||||
for (uint32_t i = 0; i < pssh.size(); ++i)
|
for (uint32_t i = 0; i < pssh.size(); ++i)
|
||||||
RCHECK(buffer->ReadWriteChild(&pssh[i]));
|
RCHECK(buffer->ReadWriteChild(&pssh[i]));
|
||||||
}
|
}
|
||||||
|
|
|
@ -115,17 +115,29 @@ Status MP4Muxer::InitializeMuxer() {
|
||||||
std::unique_ptr<FileType> ftyp(new FileType);
|
std::unique_ptr<FileType> ftyp(new FileType);
|
||||||
std::unique_ptr<Movie> moov(new Movie);
|
std::unique_ptr<Movie> moov(new Movie);
|
||||||
|
|
||||||
ftyp->major_brand = FOURCC_dash;
|
ftyp->major_brand = FOURCC_isom;
|
||||||
ftyp->compatible_brands.push_back(FOURCC_iso6);
|
ftyp->compatible_brands.push_back(FOURCC_iso8);
|
||||||
ftyp->compatible_brands.push_back(FOURCC_mp41);
|
ftyp->compatible_brands.push_back(FOURCC_mp41);
|
||||||
if (streams().size() == 1 && streams()[0]->stream_type() == kStreamVideo) {
|
ftyp->compatible_brands.push_back(FOURCC_dash);
|
||||||
const FourCC codec_fourcc = CodecToFourCC(
|
|
||||||
streams()[0]->codec(), static_cast<VideoStreamInfo*>(streams()[0].get())
|
if (streams().size() == 1) {
|
||||||
|
FourCC codec_fourcc = FOURCC_NULL;
|
||||||
|
if (streams()[0]->stream_type() == kStreamVideo) {
|
||||||
|
codec_fourcc =
|
||||||
|
CodecToFourCC(streams()[0]->codec(),
|
||||||
|
static_cast<VideoStreamInfo*>(streams()[0].get())
|
||||||
->h26x_stream_format());
|
->h26x_stream_format());
|
||||||
if (codec_fourcc != FOURCC_NULL)
|
if (codec_fourcc != FOURCC_NULL)
|
||||||
ftyp->compatible_brands.push_back(codec_fourcc);
|
ftyp->compatible_brands.push_back(codec_fourcc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CMAF allows only one track/stream per file.
|
||||||
|
// CMAF requires single initialization switching for AVC3/HEV1, which is not
|
||||||
|
// supported yet.
|
||||||
|
if (codec_fourcc != FOURCC_avc3 && codec_fourcc != FOURCC_hev1)
|
||||||
|
ftyp->compatible_brands.push_back(FOURCC_cmfc);
|
||||||
|
}
|
||||||
|
|
||||||
moov->header.creation_time = IsoTimeNow();
|
moov->header.creation_time = IsoTimeNow();
|
||||||
moov->header.modification_time = IsoTimeNow();
|
moov->header.modification_time = IsoTimeNow();
|
||||||
moov->header.next_track_id = static_cast<uint32_t>(streams().size()) + 1;
|
moov->header.next_track_id = static_cast<uint32_t>(streams().size()) + 1;
|
||||||
|
@ -160,7 +172,7 @@ Status MP4Muxer::InitializeMuxer() {
|
||||||
<< streams()[i]->stream_type();
|
<< streams()[i]->stream_type();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (streams()[i]->is_encrypted()) {
|
if (streams()[i]->is_encrypted() && options().mp4_include_pssh_in_stream) {
|
||||||
const auto& key_system_info =
|
const auto& key_system_info =
|
||||||
streams()[i]->encryption_config().key_system_info;
|
streams()[i]->encryption_config().key_system_info;
|
||||||
moov->pssh.resize(key_system_info.size());
|
moov->pssh.resize(key_system_info.size());
|
||||||
|
|
|
@ -30,6 +30,9 @@ MultiSegmentSegmenter::MultiSegmentSegmenter(const MuxerOptions& options,
|
||||||
// Use the same brands for styp as ftyp.
|
// Use the same brands for styp as ftyp.
|
||||||
styp_->major_brand = Segmenter::ftyp()->major_brand;
|
styp_->major_brand = Segmenter::ftyp()->major_brand;
|
||||||
styp_->compatible_brands = Segmenter::ftyp()->compatible_brands;
|
styp_->compatible_brands = Segmenter::ftyp()->compatible_brands;
|
||||||
|
// Replace 'cmfc' with 'cmfs' for CMAF segments compatibility.
|
||||||
|
std::replace(styp_->compatible_brands.begin(), styp_->compatible_brands.end(),
|
||||||
|
FOURCC_cmfc, FOURCC_cmfs);
|
||||||
}
|
}
|
||||||
|
|
||||||
MultiSegmentSegmenter::~MultiSegmentSegmenter() {}
|
MultiSegmentSegmenter::~MultiSegmentSegmenter() {}
|
||||||
|
|
|
@ -42,11 +42,7 @@ Segmenter::Segmenter(const MuxerOptions& options,
|
||||||
moov_(std::move(moov)),
|
moov_(std::move(moov)),
|
||||||
moof_(new MovieFragment()),
|
moof_(new MovieFragment()),
|
||||||
fragment_buffer_(new BufferWriter()),
|
fragment_buffer_(new BufferWriter()),
|
||||||
sidx_(new SegmentIndex()),
|
sidx_(new SegmentIndex()) {}
|
||||||
progress_listener_(NULL),
|
|
||||||
progress_target_(0),
|
|
||||||
accumulated_progress_(0),
|
|
||||||
sample_duration_(0u) {}
|
|
||||||
|
|
||||||
Segmenter::~Segmenter() {}
|
Segmenter::~Segmenter() {}
|
||||||
|
|
||||||
|
@ -61,6 +57,7 @@ Status Segmenter::Initialize(
|
||||||
|
|
||||||
moof_->tracks.resize(streams.size());
|
moof_->tracks.resize(streams.size());
|
||||||
fragmenters_.resize(streams.size());
|
fragmenters_.resize(streams.size());
|
||||||
|
stream_durations_.resize(streams.size());
|
||||||
|
|
||||||
for (uint32_t i = 0; i < streams.size(); ++i) {
|
for (uint32_t i = 0; i < streams.size(); ++i) {
|
||||||
moof_->tracks[i].header.track_id = i + 1;
|
moof_->tracks[i].header.track_id = i + 1;
|
||||||
|
@ -101,20 +98,17 @@ Status Segmenter::Initialize(
|
||||||
}
|
}
|
||||||
|
|
||||||
Status Segmenter::Finalize() {
|
Status Segmenter::Finalize() {
|
||||||
// Set tracks and moov durations.
|
// Set movie duration. Note that the duration in mvhd, tkhd, mdhd should not
|
||||||
// Note that the updated moov box will be written to output file for VOD case
|
// be touched, i.e. kept at 0. The updated moov box will be written to output
|
||||||
// only.
|
// file for VOD case only.
|
||||||
for (std::vector<Track>::iterator track = moov_->tracks.begin();
|
moov_->extends.header.fragment_duration = 0;
|
||||||
track != moov_->tracks.end();
|
for (size_t i = 0; i < stream_durations_.size(); ++i) {
|
||||||
++track) {
|
uint64_t duration =
|
||||||
track->header.duration = Rescale(track->media.header.duration,
|
Rescale(stream_durations_[i], moov_->tracks[i].media.header.timescale,
|
||||||
track->media.header.timescale,
|
|
||||||
moov_->header.timescale);
|
moov_->header.timescale);
|
||||||
if (track->header.duration > moov_->header.duration)
|
if (duration > moov_->extends.header.fragment_duration)
|
||||||
moov_->header.duration = track->header.duration;
|
moov_->extends.header.fragment_duration = duration;
|
||||||
}
|
}
|
||||||
moov_->extends.header.fragment_duration = moov_->header.duration;
|
|
||||||
|
|
||||||
return DoFinalize();
|
return DoFinalize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,7 +133,7 @@ Status Segmenter::AddSample(size_t stream_id,
|
||||||
|
|
||||||
if (sample_duration_ == 0)
|
if (sample_duration_ == 0)
|
||||||
sample_duration_ = sample->duration();
|
sample_duration_ = sample->duration();
|
||||||
moov_->tracks[stream_id].media.header.duration += sample->duration();
|
stream_durations_[stream_id] += sample->duration();
|
||||||
return Status::OK;
|
return Status::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -220,12 +214,12 @@ uint32_t Segmenter::GetReferenceTimeScale() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
double Segmenter::GetDuration() const {
|
double Segmenter::GetDuration() const {
|
||||||
if (moov_->header.timescale == 0) {
|
uint64_t duration = moov_->extends.header.fragment_duration;
|
||||||
|
if (duration == 0) {
|
||||||
// Handling the case where this is not properly initialized.
|
// Handling the case where this is not properly initialized.
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
|
return static_cast<double>(duration) / moov_->header.timescale;
|
||||||
return static_cast<double>(moov_->header.duration) / moov_->header.timescale;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Segmenter::UpdateProgress(uint64_t progress) {
|
void Segmenter::UpdateProgress(uint64_t progress) {
|
||||||
|
@ -258,11 +252,16 @@ void Segmenter::FinalizeFragmentForKeyRotation(
|
||||||
size_t stream_id,
|
size_t stream_id,
|
||||||
bool fragment_encrypted,
|
bool fragment_encrypted,
|
||||||
const EncryptionConfig& encryption_config) {
|
const EncryptionConfig& encryption_config) {
|
||||||
|
if (options_.mp4_include_pssh_in_stream) {
|
||||||
const std::vector<ProtectionSystemSpecificInfo>& system_info =
|
const std::vector<ProtectionSystemSpecificInfo>& system_info =
|
||||||
encryption_config.key_system_info;
|
encryption_config.key_system_info;
|
||||||
moof_->pssh.resize(system_info.size());
|
moof_->pssh.resize(system_info.size());
|
||||||
for (size_t i = 0; i < system_info.size(); i++)
|
for (size_t i = 0; i < system_info.size(); i++)
|
||||||
moof_->pssh[i].raw_box = system_info[i].CreateBox();
|
moof_->pssh[i].raw_box = system_info[i].CreateBox();
|
||||||
|
} else {
|
||||||
|
LOG(WARNING)
|
||||||
|
<< "Key rotation and no pssh in stream may not work well together.";
|
||||||
|
}
|
||||||
|
|
||||||
// Skip the following steps if the current fragment is not going to be
|
// Skip the following steps if the current fragment is not going to be
|
||||||
// encrypted. 'pssh' box needs to be included in the fragment, which is
|
// encrypted. 'pssh' box needs to be included in the fragment, which is
|
||||||
|
|
|
@ -127,11 +127,12 @@ class Segmenter {
|
||||||
std::unique_ptr<BufferWriter> fragment_buffer_;
|
std::unique_ptr<BufferWriter> fragment_buffer_;
|
||||||
std::unique_ptr<SegmentIndex> sidx_;
|
std::unique_ptr<SegmentIndex> sidx_;
|
||||||
std::vector<std::unique_ptr<Fragmenter>> fragmenters_;
|
std::vector<std::unique_ptr<Fragmenter>> fragmenters_;
|
||||||
MuxerListener* muxer_listener_;
|
MuxerListener* muxer_listener_ = nullptr;
|
||||||
ProgressListener* progress_listener_;
|
ProgressListener* progress_listener_ = nullptr;
|
||||||
uint64_t progress_target_;
|
uint64_t progress_target_ = 0u;
|
||||||
uint64_t accumulated_progress_;
|
uint64_t accumulated_progress_ = 0u;
|
||||||
uint32_t sample_duration_;
|
uint32_t sample_duration_ = 0u;
|
||||||
|
std::vector<uint64_t> stream_durations_;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(Segmenter);
|
DISALLOW_COPY_AND_ASSIGN(Segmenter);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue