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:
parent
8c202047fb
commit
8a850af9cd
|
@ -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):
|
||||||
|
|
|
@ -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',
|
'--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]
|
|
||||||
self.packager.Package(streams, flags)
|
|
||||||
self._AssertStreamInfo(self.output, '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)
|
||||||
|
|
|
@ -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.
|
@ -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.
|
@ -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.
BIN
packager/app/test/testdata/bear-1280x720-a-live-cenc-rotation-golden-init.mp4
vendored
Normal file
BIN
packager/app/test/testdata/bear-1280x720-a-live-cenc-rotation-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.
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
30
packager/app/test/testdata/bear-1280x720-av-live-cenc-rotation-iop-golden.mpd
vendored
Normal file
30
packager/app/test/testdata/bear-1280x720-av-live-cenc-rotation-iop-golden.mpd
vendored
Normal 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>
|
|
@ -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.
|
@ -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.
BIN
packager/app/test/testdata/bear-1280x720-v-live-cenc-rotation-golden-init.mp4
vendored
Normal file
BIN
packager/app/test/testdata/bear-1280x720-v-live-cenc-rotation-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.
Loading…
Reference in New Issue