Add end to end tests for edash-packager

Test files can be updated with --test_update_golden_files if needed.

Change-Id: I5aa904634450f8963f55c46ab5fe0b63f67fef46
This commit is contained in:
KongQun Yang 2015-09-25 15:58:18 -07:00
parent 8c202047fb
commit 8a850af9cd
42 changed files with 565 additions and 86 deletions

View File

@ -22,9 +22,9 @@ class PackagerApp(object):
self.build_dir = os.path.join(test_env.SRC_DIR, 'out', build_type) self.build_dir = os.path.join(test_env.SRC_DIR, 'out', build_type)
self.binary = os.path.join(self.build_dir, 'packager') self.binary = os.path.join(self.build_dir, 'packager')
def BuildSrc(self, clean=True): def BuildSrc(self, clean=False):
if clean: if clean:
assert 0 == subprocess.call(['ninja', '-C', self.build_dir, '-t', 'clean']) return subprocess.call(['ninja', '-C', self.build_dir, '-t', 'clean'])
return subprocess.call(['ninja', '-C', self.build_dir]) return subprocess.call(['ninja', '-C', self.build_dir])
def DumpStreamInfo(self, stream): def DumpStreamInfo(self, stream):

View File

@ -9,8 +9,11 @@
"""Tests utilizing the sample packager binary.""" """Tests utilizing the sample packager binary."""
import filecmp
import os import os
import re
import shutil import shutil
import subprocess
import tempfile import tempfile
import unittest import unittest
@ -22,115 +25,291 @@ class PackagerAppTest(unittest.TestCase):
def setUp(self): def setUp(self):
self.packager = packager_app.PackagerApp() self.packager = packager_app.PackagerApp()
self.input = os.path.join( self.tmp_dir = tempfile.mkdtemp()
test_env.SRC_DIR, 'packager', 'media', 'test', 'data', 'bear-1280x720.mp4') self.output_prefix = os.path.join(self.tmp_dir, 'output')
self.tmpdir = tempfile.mkdtemp() self.mpd_output = self.output_prefix + '.mpd'
fd, self.output = tempfile.mkstemp(dir=self.tmpdir)
os.close(fd)
def tearDown(self): def tearDown(self):
shutil.rmtree(self.tmpdir) shutil.rmtree(self.tmp_dir)
def testBuildingCode(self): def testBuildingCode(self):
self.assertEqual(0, self.packager.BuildSrc()) self.assertEqual(0, self.packager.BuildSrc())
def testDumpStreamInfo(self): def testDumpStreamInfo(self):
stream_info = self.packager.DumpStreamInfo(self.input) input = os.path.join(test_env.SRC_DIR, 'packager', 'media', 'test', 'data',
'bear-1280x720.mp4')
stream_info = self.packager.DumpStreamInfo(input)
expected_stream_info = ('Found 2 stream(s).\n' expected_stream_info = ('Found 2 stream(s).\n'
'Stream [0] type: Audio\n' 'Stream [0] type: Audio\n'
' codec_string: mp4a.40.2\n' ' codec_string: mp4a.40.2\n'
' time_scale: 44100\n' ' time_scale: 44100\n'
' duration: 121856 (2.8 seconds)\n' ' duration: 121856 (2.8 seconds)\n'
' language: und\n'
' is_encrypted: false\n' ' is_encrypted: false\n'
' codec: AAC\n' ' codec: AAC\n'
' sample_bits: 16\n' ' sample_bits: 16\n'
' num_channels: 2\n' ' num_channels: 2\n'
' sampling_frequency: 44100\n\n' ' sampling_frequency: 44100\n'
' language: und\n\n'
'Stream [1] type: Video\n' 'Stream [1] type: Video\n'
' codec_string: avc1.64001f\n' ' codec_string: avc1.64001f\n'
' time_scale: 30000\n' ' time_scale: 30000\n'
' duration: 82082 (2.7 seconds)\n' ' duration: 82082 (2.7 seconds)\n'
' language: und\n'
' is_encrypted: false\n' ' is_encrypted: false\n'
' codec: H264\n' ' codec: H264\n'
' width: 1280\n' ' width: 1280\n'
' height: 720\n' ' height: 720\n'
' pixel aspect ratio: 1:1\n'
' trick_play_rate: 0\n'
' nalu_length_size: 4') ' nalu_length_size: 4')
self.assertIn(expected_stream_info, stream_info) self.assertIn(expected_stream_info, stream_info,
"\nExpecting: \n %s\n\nBut seeing: \n%s" % (
expected_stream_info, stream_info))
def testMuxFirstStream(self): def testPackageFirstStream(self):
stream = 'input=%s,stream=0,output=%s' % (self.input, self.output) self.packager.Package(self._GetStreams(['0']), self._GetFlags())
streams = [stream] self._DiffGold(self.output[0], 'bear-1280x720-a-golden.mp4')
self.packager.Package(streams) self._DiffGold(self.mpd_output, 'bear-1280x720-a-golden.mpd')
self._AssertStreamInfo(self.output, 'type: Audio')
def testMuxAudioStream(self): def testPackage(self):
stream = 'input=%s,stream=%s,output=%s' % (self.input, 'audio', self.output) self.packager.Package(self._GetStreams(['audio', 'video']),
streams = [stream] self._GetFlags())
self.packager.Package(streams) self._DiffGold(self.output[0], 'bear-1280x720-a-golden.mp4')
self._AssertStreamInfo(self.output, 'type: Audio') self._DiffGold(self.output[1], 'bear-1280x720-v-golden.mp4')
self._DiffGold(self.mpd_output, 'bear-1280x720-av-golden.mpd')
def testMuxMultiSegments(self): def testPackageWithEncryption(self):
template = '%s$Number$.m4s' % self.output self.packager.Package(self._GetStreams(['audio', 'video']),
stream = ('input=%s,stream=%s,init_segment=%s,segment_template=%s' % self._GetFlags(encryption=True))
(self.input, 'video', self.output, template)) self._DiffGold(self.output[0], 'bear-1280x720-a-cenc-golden.mp4')
streams = [stream] self._DiffGold(self.output[1], 'bear-1280x720-v-cenc-golden.mp4')
flags = ['--nosingle_segment'] self._DiffGold(self.mpd_output, 'bear-1280x720-av-cenc-golden.mpd')
self.packager.Package(streams, flags)
self._AssertStreamInfo(self.output, 'type: Video')
def testEncryptingVideoStream(self): def testPackageWithEncryptionAndRandomIv(self):
stream = 'input=%s,stream=%s,output=%s' % (self.input, 'video', self.output) self.packager.Package(self._GetStreams(['audio', 'video']),
streams = [stream] self._GetFlags(encryption=True, random_iv=True))
flags = ['--enable_fixed_key_encryption', self._AssertStreamInfo(self.output[0], 'is_encrypted: true')
'--key_id=31323334353637383930313233343536', self._AssertStreamInfo(self.output[1], 'is_encrypted: true')
'--key=31', # The outputs are encrypted with random iv, so they are not the same as
'--pssh=33'] # golden files.
self.packager.Package(streams, flags) self.assertFalse(self._CompareWithGold(
self._AssertStreamInfo(self.output, 'is_encrypted: true') self.output[0], 'bear-1280x720-a-cenc-golden.mp4'))
self.assertFalse(self._CompareWithGold(
self.output[1], 'bear-1280x720-v-cenc-golden.mp4'))
self._DiffGold(self.mpd_output, 'bear-1280x720-av-cenc-golden.mpd')
@unittest.skipUnless(test_env.has_aes_flags, def testPackageWithEncryptionAndRealClock(self):
'Requires AES and network credentials.') self.packager.Package(self._GetStreams(['audio', 'video']),
self._GetFlags(encryption=True, use_fake_clock=False))
self._AssertStreamInfo(self.output[0], 'is_encrypted: true')
self._AssertStreamInfo(self.output[1], 'is_encrypted: true')
# The outputs are generated with real clock, so they are not the same as
# golden files.
self.assertFalse(self._CompareWithGold(
self.output[0], 'bear-1280x720-a-cenc-golden.mp4'))
self.assertFalse(self._CompareWithGold(
self.output[1], 'bear-1280x720-v-cenc-golden.mp4'))
self._DiffGold(self.mpd_output, 'bear-1280x720-av-cenc-golden.mpd')
def testPackageWithEncryptionAndDashIfIop(self):
self.packager.Package(self._GetStreams(['audio', 'video']),
self._GetFlags(encryption=True, dash_if_iop=True))
self._DiffGold(self.output[0], 'bear-1280x720-a-cenc-golden.mp4')
self._DiffGold(self.output[1], 'bear-1280x720-v-cenc-golden.mp4')
self._DiffGold(self.mpd_output, 'bear-1280x720-av-cenc-iop-golden.mpd')
def testPackageWithEncryptionAndOutputMediaInfo(self):
self.packager.Package(self._GetStreams(['audio', 'video']),
self._GetFlags(encryption=True,
output_media_info=True))
self._DiffGold(self.output[0], 'bear-1280x720-a-cenc-golden.mp4')
self._DiffGold(self.output[1], 'bear-1280x720-v-cenc-golden.mp4')
self._DiffMediaInfoGold(self.output[0], 'bear-1280x720-a-cenc-golden.mp4')
self._DiffMediaInfoGold(self.output[1], 'bear-1280x720-v-cenc-golden.mp4')
def testPackageWithLiveProfile(self):
self.packager.Package(self._GetStreams(['audio', 'video'], live=True),
self._GetFlags(live=True))
self._DiffLiveGold(self.output[0], 'bear-1280x720-a-live-golden')
self._DiffLiveGold(self.output[1], 'bear-1280x720-v-live-golden')
self._DiffLiveMpdGold(self.mpd_output, 'bear-1280x720-av-live-golden.mpd')
def testPackageWithLiveProfileAndEncryption(self):
self.packager.Package(self._GetStreams(['audio', 'video'], live=True),
self._GetFlags(encryption=True, live=True))
self._DiffLiveGold(self.output[0], 'bear-1280x720-a-live-cenc-golden')
self._DiffLiveGold(self.output[1], 'bear-1280x720-v-live-cenc-golden')
self._DiffLiveMpdGold(self.mpd_output,
'bear-1280x720-av-live-cenc-golden.mpd')
def testPackageWithLiveProfileAndEncryptionAndDashIfIop(self):
self.packager.Package(self._GetStreams(['audio', 'video'], live=True),
self._GetFlags(encryption=True, live=True,
dash_if_iop=True))
self._DiffLiveGold(self.output[0], 'bear-1280x720-a-live-cenc-golden')
self._DiffLiveGold(self.output[1], 'bear-1280x720-v-live-cenc-golden')
self._DiffLiveMpdGold(self.mpd_output,
'bear-1280x720-av-live-cenc-iop-golden.mpd')
def testPackageWithLiveProfileAndKeyRotation(self):
self.packager.Package(self._GetStreams(['audio', 'video'], live=True),
self._GetFlags(encryption=True, key_rotation=True,
live=True))
self._DiffLiveGold(self.output[0],
'bear-1280x720-a-live-cenc-rotation-golden')
self._DiffLiveGold(self.output[1],
'bear-1280x720-v-live-cenc-rotation-golden')
self._DiffLiveMpdGold(self.mpd_output,
'bear-1280x720-av-live-cenc-rotation-golden.mpd')
def testPackageWithLiveProfileAndKeyRotationAndDashIfIop(self):
self.packager.Package(self._GetStreams(['audio', 'video'], live=True),
self._GetFlags(encryption=True, key_rotation=True,
live=True, dash_if_iop=True))
self._DiffLiveGold(self.output[0],
'bear-1280x720-a-live-cenc-rotation-golden')
self._DiffLiveGold(self.output[1],
'bear-1280x720-v-live-cenc-rotation-golden')
self._DiffLiveMpdGold(self.mpd_output,
'bear-1280x720-av-live-cenc-rotation-iop-golden.mpd')
@unittest.skipUnless(test_env.has_aes_flags, 'Requires AES credentials.')
def testWidevineEncryptionWithAes(self): def testWidevineEncryptionWithAes(self):
stream = 'input=%s,stream=%s,output=%s' % (self.input, 'video', self.output) flags = self._GetFlags(widevine_encryption=True)
streams = [stream] flags += ['--aes_signing_key=' + test_env.options.aes_signing_key,
flags = ['--enable_widevine_encryption',
'--key_server_url=' + test_env.options.key_server_url,
'--content_id=' + test_env.options.content_id,
'--signer=' + test_env.options.signer,
'--aes_signing_key=' + test_env.options.aes_signing_key,
'--aes_signing_iv=' + test_env.options.aes_signing_iv] '--aes_signing_iv=' + test_env.options.aes_signing_iv]
self.packager.Package(streams, flags) self.packager.Package(self._GetStreams(['audio', 'video']), flags)
self._AssertStreamInfo(self.output, 'is_encrypted: true') self._AssertStreamInfo(self.output[0], 'is_encrypted: true')
self._AssertStreamInfo(self.output[1], 'is_encrypted: true')
@unittest.skipUnless(test_env.has_aes_flags, @unittest.skipUnless(test_env.has_aes_flags, 'Requires AES credentials.')
'Requires AES and network credentials.')
def testKeyRotationWithAes(self): def testKeyRotationWithAes(self):
stream = 'input=%s,stream=%s,output=%s' % (self.input, 'video', self.output) flags = self._GetFlags(widevine_encryption=True, key_rotation=True)
streams = [stream] flags += ['--aes_signing_key=' + test_env.options.aes_signing_key,
flags = ['--enable_widevine_encryption', '--aes_signing_iv=' + test_env.options.aes_signing_iv]
'--key_server_url=' + test_env.options.key_server_url, self.packager.Package(self._GetStreams(['audio', 'video']), flags)
'--content_id=' + test_env.options.content_id, self._AssertStreamInfo(self.output[0], 'is_encrypted: true')
'--signer=' + test_env.options.signer, self._AssertStreamInfo(self.output[1], 'is_encrypted: true')
'--aes_signing_key=' + test_env.options.aes_signing_key,
'--aes_signing_iv=' + test_env.options.aes_signing_iv,
'--crypto_period_duration=1']
self.packager.Package(streams, flags)
self._AssertStreamInfo(self.output, 'is_encrypted: true')
@unittest.skipUnless(test_env.has_rsa_flags, @unittest.skipUnless(test_env.has_rsa_flags, 'Requires RSA credentials.')
'Requires RSA and network credentials.')
def testWidevineEncryptionWithRsa(self): def testWidevineEncryptionWithRsa(self):
stream = 'input=%s,stream=%s,output=%s' % (self.input, 'video', self.output) flags = self._GetFlags(widevine_encryption=True)
streams = [stream] flags += ['--rsa_signing_key_path=' + test_env.options.rsa_signing_key_path]
flags = ['--enable_widevine_encryption', self.packager.Package(self._GetStreams(['audio', 'video']), flags)
'--key_server_url=' + test_env.options.key_server_url, self._AssertStreamInfo(self.output[0], 'is_encrypted: true')
'--content_id=' + test_env.options.content_id, self._AssertStreamInfo(self.output[1], 'is_encrypted: true')
'--signer=' + test_env.options.signer,
'--rsa_signing_key_path=' + test_env.options.rsa_signing_key_path] def _GetStreams(self, stream_descriptors, live = False):
self.packager.Package(streams, flags) streams = []
self._AssertStreamInfo(self.output, 'is_encrypted: true') self.output = []
test_data_dir = os.path.join(
test_env.SRC_DIR, 'packager', 'media', 'test', 'data')
for stream_descriptor in stream_descriptors:
if live:
# This is still output prefix actually.
output = '%s_%s' % (self.output_prefix, stream_descriptor)
stream = ('input=%s,stream=%s,init_segment=%s-init.mp4,' +
'segment_template=%s-$Number$.m4s')
input = os.path.join(test_data_dir, 'bear-1280x720-av_frag.mp4')
streams.append(stream % (input, stream_descriptor, output, output))
else:
output = '%s_%s.mp4' % (self.output_prefix, stream_descriptor)
stream = 'input=%s,stream=%s,output=%s'
input = os.path.join(test_data_dir, 'bear-1280x720.mp4')
streams.append(stream % (input, stream_descriptor, output))
self.output.append(output)
return streams
def _GetFlags(self, encryption = False, random_iv = False,
widevine_encryption = False, key_rotation = False,
live = False, dash_if_iop=False, output_media_info = False,
use_fake_clock = True):
flags = []
if widevine_encryption:
widevine_server_url = ('https://license.uat.widevine.com/cenc' +
'/getcontentkey/widevine_test')
flags += ['--enable_widevine_encryption',
'--key_server_url=' + widevine_server_url,
'--content_id=3031323334353637',
'--signer=widevine_test']
elif encryption:
flags += ['--enable_fixed_key_encryption',
'--key_id=31323334353637383930313233343536',
'--key=32333435363738393021323334353637',
'--pssh=31323334353637383930313233343536']
if not random_iv:
flags.append('--iv=33343536373839303132333435363738')
if key_rotation: flags.append('--crypto_period_duration=1')
if live:
flags.append('--profile=live')
if dash_if_iop:
flags.append('--generate_dash_if_iop_compliant_mpd')
if output_media_info:
flags.append('--output_media_info')
else:
flags += ['--mpd_output', self.mpd_output]
flags.append('--segment_duration=1')
# Use fake clock, so output can be compared.
if use_fake_clock:
flags.append("--use_fake_clock_for_muxer")
return flags
def _CompareWithGold(self, test_output, golden_file_name):
golden_file = os.path.join(test_env.SRC_DIR, 'packager', 'app', 'test',
'testdata', golden_file_name)
return filecmp.cmp(test_output, golden_file)
def _DiffGold(self, test_output, golden_file_name):
golden_file = os.path.join(test_env.SRC_DIR, 'packager', 'app', 'test',
'testdata', golden_file_name)
if test_env.options.test_update_golden_files:
if not filecmp.cmp(test_output, golden_file):
print "Updating golden file: ", golden_file_name
shutil.copyfile(test_output, golden_file)
else:
match = filecmp.cmp(test_output, golden_file)
if not match:
p = subprocess.Popen(['git', '--no-pager', 'diff', '--color=auto',
'--no-ext-diff', '--no-index',
golden_file, test_output],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, error = p.communicate()
self.fail(output + error)
# '*.media_info' outputs contain media file names, which is changing for
# every test run. These needs to be replaced for comparison.
def _DiffMediaInfoGold(self, test_output, golden_file_name):
media_info_output = test_output + '.media_info'
# Replaces filename, which is changing for every test run.
with open(media_info_output, 'r') as f:
content = f.read()
with open(media_info_output, 'w') as f:
f.write(content.replace(test_output, 'place_holder'))
self._DiffGold(media_info_output, golden_file_name + '.media_info')
def _DiffLiveGold(self, test_output_prefix, golden_file_name_prefix):
# Compare init and the first three segments.
self._DiffGold(test_output_prefix + '-init.mp4',
golden_file_name_prefix + '-init.mp4')
for i in range(1, 4):
self._DiffGold(test_output_prefix + '-%d.m4s' % i,
golden_file_name_prefix + '-%d.m4s' % i)
# Live mpd contains a current availabilityStartTime, which needs to be
# replaced for comparison.
def _DiffLiveMpdGold(self, test_output, golden_file_name):
with open(test_output, 'r') as f:
content = f.read()
# Extract availabilityStartTime
m = re.search('(?<=availabilityStartTime=")[^"]+', content)
self.assertIsNotNone(m)
availabilityStartTime = m.group(0)
print 'availabilityStartTime: ', availabilityStartTime
with open(test_output, 'w') as f:
f.write(content.replace(availabilityStartTime, 'place_holder'))
self._DiffGold(test_output, golden_file_name)
def _AssertStreamInfo(self, stream, info): def _AssertStreamInfo(self, stream, info):
stream_info = self.packager.DumpStreamInfo(stream) stream_info = self.packager.DumpStreamInfo(stream)

View File

@ -25,12 +25,6 @@ SRC_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../../..')
# Parse arguments and calculate dynamic global objects and attributes. # Parse arguments and calculate dynamic global objects and attributes.
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
common = parser.add_argument_group(
'encryption flags',
'These flags are required to enable AES and/or RSA encryption tests.')
common.add_argument('--key_server_url')
common.add_argument('--content_id')
common.add_argument('--signer')
aes = parser.add_argument_group( aes = parser.add_argument_group(
'aes flags', 'aes flags',
'These flags are required to enable AES signed encryption tests.') 'These flags are required to enable AES signed encryption tests.')
@ -40,14 +34,13 @@ rsa = parser.add_argument_group(
'rsa flags', 'rsa flags',
'These flags are required to enable RSA signed encryption tests.') 'These flags are required to enable RSA signed encryption tests.')
rsa.add_argument('--rsa_signing_key_path') rsa.add_argument('--rsa_signing_key_path')
parser.add_argument('--test_update_golden_files', default=0, type=int)
options, args = parser.parse_known_args() options, args = parser.parse_known_args()
sys.argv[1:] = args sys.argv[1:] = args
has_aes_flags = False has_aes_flags = False
if (options.key_server_url and options.content_id and options.signer and if (options.aes_signing_key and options.aes_signing_iv):
options.aes_signing_key and options.aes_signing_iv):
has_aes_flags = True has_aes_flags = True
has_rsa_flags = False has_rsa_flags = False
if (options.key_server_url and options.content_id and options.signer and if options.rsa_signing_key_path:
options.rsa_signing_key_path):
has_rsa_flags = True has_rsa_flags = True

Binary file not shown.

View File

@ -0,0 +1,27 @@
bandwidth: 77870
audio_info {
codec: "mp4a.40.2"
sampling_frequency: 44100
time_scale: 44100
num_channels: 2
decoder_config: "\022\020"
}
init_range {
begin: 0
end: 810
}
index_range {
begin: 811
end: 878
}
media_file_name: "place_holder"
media_duration_seconds: 2.7631745
reference_time_scale: 44100
container_type: CONTAINER_MP4
protected_content {
default_key_id: "1234567890123456"
content_protection_entry {
uuid: "edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"
pssh: "\000\000\0000pssh\000\000\000\000\355\357\213\251y\326J\316\243\310\'\334\325\035!\355\000\000\000\0201234567890123456"
}
}

Binary file not shown.

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<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" minBufferTime="PT2S" type="static" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" mediaPresentationDuration="PT2.763174533843994S">
<Period>
<AdaptationSet id="0" contentType="audio" subSegmentAlignment="true">
<Representation id="0" bandwidth="77283" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
<BaseURL>output_0.mp4</BaseURL>
<SegmentBase indexRange="608-675" timescale="44100">
<Initialization range="0-607"/>
</SegmentBase>
</Representation>
</AdaptationSet>
</Period>
</MPD>

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.

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<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" minBufferTime="PT2S" type="static" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" mediaPresentationDuration="PT2.763174533843994S">
<Period>
<AdaptationSet id="0" contentType="audio" subSegmentAlignment="true">
<Representation id="0" bandwidth="77870" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
<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 schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
</ContentProtection>
<BaseURL>output_audio.mp4</BaseURL>
<SegmentBase indexRange="811-878" timescale="44100">
<Initialization range="0-810"/>
</SegmentBase>
</Representation>
</AdaptationSet>
<AdaptationSet id="1" contentType="video" width="1280" height="720" frameRate="30000/1001" subSegmentAlignment="true" par="16:9">
<Representation id="1" bandwidth="2016732" codecs="avc1.64001f" mimeType="video/mp4" sar="1:1" width="1280" height="720" frameRate="30000/1001">
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="31323334-3536-3738-3930-313233343536"/>
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
</ContentProtection>
<BaseURL>output_video.mp4</BaseURL>
<SegmentBase indexRange="939-982" timescale="30000">
<Initialization range="0-938"/>
</SegmentBase>
</Representation>
</AdaptationSet>
</Period>
</MPD>

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<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" minBufferTime="PT2S" type="static" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" mediaPresentationDuration="PT2.763174533843994S">
<Period>
<AdaptationSet id="0" 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:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
</ContentProtection>
<Representation id="0" bandwidth="77870" 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="811-878" timescale="44100">
<Initialization range="0-810"/>
</SegmentBase>
</Representation>
</AdaptationSet>
<AdaptationSet id="1" contentType="video" width="1280" height="720" 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:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
</ContentProtection>
<Representation id="1" bandwidth="2016732" codecs="avc1.64001f" mimeType="video/mp4" sar="1:1" width="1280" height="720" frameRate="30000/1001">
<BaseURL>output_video.mp4</BaseURL>
<SegmentBase indexRange="939-982" timescale="30000">
<Initialization range="0-938"/>
</SegmentBase>
</Representation>
</AdaptationSet>
</Period>
</MPD>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<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" minBufferTime="PT2S" type="static" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" mediaPresentationDuration="PT2.763174533843994S">
<Period>
<AdaptationSet id="0" contentType="audio" subSegmentAlignment="true">
<Representation id="0" bandwidth="77283" 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="608-675" timescale="44100">
<Initialization range="0-607"/>
</SegmentBase>
</Representation>
</AdaptationSet>
<AdaptationSet id="1" contentType="video" width="1280" height="720" frameRate="30000/1001" subSegmentAlignment="true" par="16:9">
<Representation id="1" bandwidth="2015963" codecs="avc1.64001f" mimeType="video/mp4" sar="1:1" width="1280" height="720" frameRate="30000/1001">
<BaseURL>output_video.mp4</BaseURL>
<SegmentBase indexRange="676-719" timescale="30000">
<Initialization range="0-675"/>
</SegmentBase>
</Representation>
</AdaptationSet>
</Period>
</MPD>

View File

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<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" minBufferTime="PT2S" type="dynamic" profiles="urn:mpeg:dash:profile:isoff-live:2011" availabilityStartTime="place_holder" minimumUpdatePeriod="PT5S" timeShiftBufferDepth="PT1800S">
<Period start="PT0S">
<AdaptationSet id="0" contentType="video" width="1280" height="720" frameRate="30000/1001" segmentAlignment="true" par="16:9">
<Representation id="0" bandwidth="2143213" codecs="avc1.64001f" mimeType="video/mp4" sar="1:1" width="1280" height="720" frameRate="30000/1001">
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="31323334-3536-3738-3930-313233343536"/>
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
</ContentProtection>
<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">
<Representation id="1" bandwidth="73920" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
<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 schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
</ContentProtection>
<SegmentTemplate timescale="44100" initialization="output_audio-init.mp4" media="output_audio-$Number$.m4s" startNumber="1">
<SegmentTimeline>
<S t="0" d="45056" r="1"/>
<S t="90112" d="31744"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
</AdaptationSet>
</Period>
</MPD>

View File

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<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" minBufferTime="PT2S" type="dynamic" profiles="urn:mpeg:dash:profile:isoff-live:2011" availabilityStartTime="place_holder" minimumUpdatePeriod="PT5S" timeShiftBufferDepth="PT1800S">
<Period start="PT0S">
<AdaptationSet id="0" contentType="video" width="1280" height="720" frameRate="30000/1001" segmentAlignment="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:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
</ContentProtection>
<Representation id="0" bandwidth="2143213" codecs="avc1.64001f" mimeType="video/mp4" sar="1:1" width="1280" height="720" frameRate="30000/1001">
<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="31323334-3536-3738-3930-313233343536"/>
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
</ContentProtection>
<Representation id="1" bandwidth="73920" 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" r="1"/>
<S t="90112" d="31744"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
</AdaptationSet>
</Period>
</MPD>

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<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" minBufferTime="PT2S" type="dynamic" profiles="urn:mpeg:dash:profile:isoff-live:2011" availabilityStartTime="place_holder" minimumUpdatePeriod="PT5S" timeShiftBufferDepth="PT1800S">
<Period start="PT0S">
<AdaptationSet id="0" contentType="video" width="1280" height="720" frameRate="30000/1001" segmentAlignment="true" par="16:9">
<Representation id="0" bandwidth="2143647" codecs="avc1.64001f" mimeType="video/mp4" sar="1:1" width="1280" height="720" frameRate="30000/1001">
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="00000000-0000-0000-0000-000000000000"/>
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"/>
<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">
<Representation id="1" bandwidth="74365" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
<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 schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"/>
<SegmentTemplate timescale="44100" initialization="output_audio-init.mp4" media="output_audio-$Number$.m4s" startNumber="1">
<SegmentTimeline>
<S t="0" d="45056" r="1"/>
<S t="90112" d="31744"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
</AdaptationSet>
</Period>
</MPD>

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<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" minBufferTime="PT2S" type="dynamic" profiles="urn:mpeg:dash:profile:isoff-live:2011" availabilityStartTime="place_holder" minimumUpdatePeriod="PT5S" timeShiftBufferDepth="PT1800S">
<Period start="PT0S">
<AdaptationSet id="0" contentType="video" width="1280" height="720" 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:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"/>
<Representation id="0" bandwidth="2143647" codecs="avc1.64001f" mimeType="video/mp4" sar="1:1" width="1280" height="720" frameRate="30000/1001">
<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:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"/>
<Representation id="1" bandwidth="74365" 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" r="1"/>
<S t="90112" d="31744"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
</AdaptationSet>
</Period>
</MPD>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<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" minBufferTime="PT2S" type="dynamic" profiles="urn:mpeg:dash:profile:isoff-live:2011" availabilityStartTime="place_holder" minimumUpdatePeriod="PT5S" timeShiftBufferDepth="PT1800S">
<Period start="PT0S">
<AdaptationSet id="0" contentType="video" width="1280" height="720" frameRate="30000/1001" segmentAlignment="true" par="16:9">
<Representation id="0" bandwidth="2143213" codecs="avc1.64001f" mimeType="video/mp4" sar="1:1" width="1280" height="720" frameRate="30000/1001">
<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">
<Representation id="1" bandwidth="73920" 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" r="1"/>
<S t="90112" d="31744"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
</AdaptationSet>
</Period>
</MPD>

Binary file not shown.

View File

@ -0,0 +1,30 @@
bandwidth: 2016732
video_info {
codec: "avc1.64001f"
width: 1280
height: 720
time_scale: 30000
frame_duration: 1001
decoder_config: "\001d\000\037\377\341\000\031gd\000\037\2544\345\001@\026\354\004@\000\000\031\000\000\005\332\243\306\014E\200\001\000\005h\356\262\310\260"
pixel_width: 1
pixel_height: 1
}
init_range {
begin: 0
end: 938
}
index_range {
begin: 939
end: 982
}
media_file_name: "place_holder"
media_duration_seconds: 2.7360666
reference_time_scale: 30000
container_type: CONTAINER_MP4
protected_content {
default_key_id: "1234567890123456"
content_protection_entry {
uuid: "edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"
pssh: "\000\000\0000pssh\000\000\000\000\355\357\213\251y\326J\316\243\310\'\334\325\035!\355\000\000\000\0201234567890123456"
}
}

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.