Work around non-deterministic tests.
We currently have a bug about non-deterministic output in the MPD generator. This works around that bug by optionally doing everything in a single thread. This allows us to run manifest comparisons without making the major changes needed to add that feature. Issue #177 Change-Id: I10e1084dac77841220161fbd2575cdcb5c13c00e
This commit is contained in:
parent
414f4589c8
commit
f4c07b9ce0
|
@ -60,6 +60,8 @@ class JobManager {
|
|||
// fails or is cancelled. It can be NULL.
|
||||
explicit JobManager(std::unique_ptr<SyncPointQueue> sync_points);
|
||||
|
||||
virtual ~JobManager() = default;
|
||||
|
||||
// Create a new job entry by specifying the origin handler at the top of the
|
||||
// chain and a name for the thread. This will only register the job. To start
|
||||
// the job, you need to call |RunJobs|.
|
||||
|
@ -68,12 +70,12 @@ class JobManager {
|
|||
// Initialize all registered jobs. If any job fails to initialize, this will
|
||||
// return the error and it will not be safe to call |RunJobs| as not all jobs
|
||||
// will be properly initialized.
|
||||
Status InitializeJobs();
|
||||
virtual Status InitializeJobs();
|
||||
|
||||
// Run all registered jobs. Before calling this make sure that
|
||||
// |InitializedJobs| returned |Status::OK|. This call is blocking and will
|
||||
// block until all jobs exit.
|
||||
Status RunJobs();
|
||||
virtual Status RunJobs();
|
||||
|
||||
// Ask all jobs to stop running. This call is non-blocking and can be used to
|
||||
// unblock a call to |RunJobs|.
|
||||
|
@ -81,7 +83,7 @@ class JobManager {
|
|||
|
||||
SyncPointQueue* sync_points() { return sync_points_.get(); }
|
||||
|
||||
private:
|
||||
protected:
|
||||
JobManager(const JobManager&) = delete;
|
||||
JobManager& operator=(const JobManager&) = delete;
|
||||
|
||||
|
|
|
@ -48,6 +48,9 @@ DEFINE_bool(use_fake_clock_for_muxer,
|
|||
DEFINE_string(test_packager_version,
|
||||
"",
|
||||
"Packager version for testing. Should be used for testing only.");
|
||||
DEFINE_bool(single_threaded,
|
||||
false,
|
||||
"If enabled, only use one thread when generating content.");
|
||||
|
||||
namespace shaka {
|
||||
namespace {
|
||||
|
@ -311,6 +314,7 @@ base::Optional<PackagingParams> GetPackagingParams() {
|
|||
PackagingParams packaging_params;
|
||||
|
||||
packaging_params.temp_dir = FLAGS_temp_dir;
|
||||
packaging_params.single_threaded = FLAGS_single_threaded;
|
||||
|
||||
AdCueGeneratorParams& ad_cue_generator_params =
|
||||
packaging_params.ad_cue_generator_params;
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
// Copyright 2020 Google LLLC All rights reserved.
|
||||
//
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file or at
|
||||
// https://developers.google.com/open-source/licenses/bsd
|
||||
|
||||
#include "packager/app/single_thread_job_manager.h"
|
||||
|
||||
#include "packager/media/chunking/sync_point_queue.h"
|
||||
#include "packager/media/origin/origin_handler.h"
|
||||
|
||||
namespace shaka {
|
||||
namespace media {
|
||||
|
||||
SingleThreadJobManager::SingleThreadJobManager(
|
||||
std::unique_ptr<SyncPointQueue> sync_points)
|
||||
: JobManager(std::move(sync_points)) {}
|
||||
|
||||
Status SingleThreadJobManager::InitializeJobs() {
|
||||
Status status;
|
||||
for (const JobEntry& job_entry : job_entries_)
|
||||
status.Update(job_entry.worker->Initialize());
|
||||
return status;
|
||||
}
|
||||
|
||||
Status SingleThreadJobManager::RunJobs() {
|
||||
Status status;
|
||||
for (const JobEntry& job_entry : job_entries_)
|
||||
status.Update(job_entry.worker->Run());
|
||||
return status;
|
||||
}
|
||||
|
||||
} // namespace media
|
||||
} // namespace shaka
|
|
@ -0,0 +1,32 @@
|
|||
// Copyright 2020 Google LLLC All rights reserved.
|
||||
//
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file or at
|
||||
// https://developers.google.com/open-source/licenses/bsd
|
||||
|
||||
#ifndef PACKAGER_APP_SINGLE_THREAD_JOB_MANAGER_H_
|
||||
#define PACKAGER_APP_SINGLE_THREAD_JOB_MANAGER_H_
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "packager/app/job_manager.h"
|
||||
|
||||
namespace shaka {
|
||||
namespace media {
|
||||
|
||||
// A subclass of JobManager that runs all the jobs in a single thread.
|
||||
class SingleThreadJobManager : public JobManager {
|
||||
public:
|
||||
// @param sync_points is an optional SyncPointQueue used to synchronize and
|
||||
// align cue points. JobManager cancels @a sync_points when any job
|
||||
// fails or is cancelled. It can be NULL.
|
||||
explicit SingleThreadJobManager(std::unique_ptr<SyncPointQueue> sync_points);
|
||||
|
||||
Status InitializeJobs() override;
|
||||
Status RunJobs() override;
|
||||
};
|
||||
|
||||
} // namespace media
|
||||
} // namespace shaka
|
||||
|
||||
#endif // PACKAGER_APP_SINGLE_THREAD_JOB_MANAGER_H_
|
|
@ -477,7 +477,7 @@ class PackagerAppTest(unittest.TestCase):
|
|||
segment_duration=1.0,
|
||||
use_fake_clock=True,
|
||||
allow_codec_switching=False):
|
||||
flags = []
|
||||
flags = ['--single_threaded']
|
||||
|
||||
if not strip_parameter_set_nalus:
|
||||
flags += ['--strip_parameter_set_nalus=false']
|
||||
|
@ -767,14 +767,7 @@ class PackagerFunctionalTest(PackagerAppTest):
|
|||
streams = audio_video_streams + dash_text_stream + hls_text_stream
|
||||
self.assertPackageSuccess(streams, self._GetFlags(output_dash=True,
|
||||
output_hls=True))
|
||||
# Mpd cannot be validated right now since we don't generate deterministic
|
||||
# mpd with multiple inputs due to thread racing.
|
||||
# TODO(b/73349711): Generate deterministic mpd or at least validate mpd
|
||||
# schema.
|
||||
self._CheckTestResults(
|
||||
'hls-only-dash-only-captions',
|
||||
diff_files_policy=DiffFilesPolicy(
|
||||
allowed_diff_files=['output.mpd'], exact=False))
|
||||
self._CheckTestResults('hls-only-dash-only-captions')
|
||||
|
||||
def testDashOnlyAndHlsOnly(self):
|
||||
streams = [
|
||||
|
@ -1241,14 +1234,7 @@ class PackagerFunctionalTest(PackagerAppTest):
|
|||
flags = self._GetFlags(output_dash=True, output_hls=True,
|
||||
generate_static_live_mpd=True, ad_cues='1.5')
|
||||
self.assertPackageSuccess(streams, flags)
|
||||
# Mpd cannot be validated right now since we don't generate determinstic
|
||||
# mpd with multiple inputs due to thread racing.
|
||||
# TODO(b/73349711): Generate determinstic mpd or at least validate mpd
|
||||
# schema.
|
||||
self._CheckTestResults(
|
||||
'vtt-text-to-mp4-with-ad-cues',
|
||||
diff_files_policy=DiffFilesPolicy(
|
||||
allowed_diff_files=['output.mpd'], exact=False))
|
||||
self._CheckTestResults('vtt-text-to-mp4-with-ad-cues')
|
||||
|
||||
def testWebmSubsampleEncryption(self):
|
||||
streams = [
|
||||
|
@ -1621,15 +1607,7 @@ class PackagerFunctionalTest(PackagerAppTest):
|
|||
self.assertPackageSuccess(streams,
|
||||
self._GetFlags(output_dash=True,
|
||||
allow_codec_switching=True))
|
||||
# Mpd cannot be validated right now since we don't generate determinstic
|
||||
# mpd with multiple inputs due to thread racing.
|
||||
# TODO(b/73349711): Generate determinstic mpd or at least validate mpd
|
||||
# schema.
|
||||
# See also https://github.com/google/shaka-packager/issues/177.
|
||||
self._CheckTestResults(
|
||||
'audio-video-with-codec-switching',
|
||||
diff_files_policy=DiffFilesPolicy(
|
||||
allowed_diff_files=['output.mpd'], exact=False))
|
||||
self._CheckTestResults('audio-video-with-codec-switching')
|
||||
|
||||
def testAllowCodecSwitchingWithEncryptionAndTrickplay(self):
|
||||
streams = [
|
||||
|
@ -1645,15 +1623,8 @@ class PackagerFunctionalTest(PackagerAppTest):
|
|||
self._GetFlags(output_dash=True,
|
||||
allow_codec_switching=True,
|
||||
encryption=True))
|
||||
# Mpd cannot be validated right now since we don't generate determinstic
|
||||
# mpd with multiple inputs due to thread racing.
|
||||
# TODO(b/73349711): Generate determinstic mpd or at least validate mpd
|
||||
# schema.
|
||||
# See also https://github.com/google/shaka-packager/issues/177.
|
||||
self._CheckTestResults(
|
||||
'audio-video-with-codec-switching-encryption-trick-play',
|
||||
diff_files_policy=DiffFilesPolicy(
|
||||
allowed_diff_files=['output.mpd'], exact=False))
|
||||
'audio-video-with-codec-switching-encryption-trick-play')
|
||||
|
||||
def testLiveProfileAndEncryption(self):
|
||||
self.assertPackageSuccess(
|
||||
|
@ -1675,14 +1646,8 @@ class PackagerFunctionalTest(PackagerAppTest):
|
|||
test_files=['bear-1280x720.mp4', 'bear-640x360.mp4',
|
||||
'bear-320x180.mp4']),
|
||||
self._GetFlags(encryption=True, output_dash=True))
|
||||
# Mpd cannot be validated right now since we don't generate determinstic
|
||||
# mpd with multiple inputs due to thread racing.
|
||||
# TODO(b/73349711): Generate determinstic mpd or at least validate mpd
|
||||
# schema.
|
||||
self._CheckTestResults(
|
||||
'live-profile-and-encryption-and-mult-files',
|
||||
diff_files_policy=DiffFilesPolicy(
|
||||
allowed_diff_files=['output.mpd'], exact=False))
|
||||
'live-profile-and-encryption-and-mult-files')
|
||||
|
||||
def testLiveProfileAndKeyRotation(self):
|
||||
self.assertPackageSuccess(
|
||||
|
|
|
@ -2,24 +2,18 @@
|
|||
<!--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" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT2.7360665798187256S">
|
||||
<Period id="0">
|
||||
<AdaptationSet id="0" contentType="text" subsegmentAlignment="true">
|
||||
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="caption"/>
|
||||
<Representation id="0" bandwidth="273" mimeType="text/vtt">
|
||||
<BaseURL>bear-english-text.vtt</BaseURL>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
<AdaptationSet id="1" contentType="video" width="640" height="360" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
|
||||
<Representation id="1" bandwidth="973483" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
|
||||
<Representation id="0" bandwidth="973483" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||
<BaseURL>bear-640x360-video.mp4</BaseURL>
|
||||
<SegmentBase indexRange="863-930" timescale="30000">
|
||||
<Initialization range="0-862"/>
|
||||
</SegmentBase>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
<AdaptationSet id="2" contentType="audio" subsegmentAlignment="true">
|
||||
<AdaptationSet id="1" contentType="audio" subsegmentAlignment="true">
|
||||
<Accessibility schemeIdUri="urn:tva:metadata:cs:AudioPurposeCS:2007" value="1"/>
|
||||
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="alternate"/>
|
||||
<Representation id="2" bandwidth="133334" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||
<Representation id="1" bandwidth="133334" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||
<BaseURL>bear-640x360-audio.mp4</BaseURL>
|
||||
<SegmentBase indexRange="797-864" timescale="44100">
|
||||
|
@ -27,5 +21,11 @@
|
|||
</SegmentBase>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
<AdaptationSet id="2" contentType="text" subsegmentAlignment="true">
|
||||
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="caption"/>
|
||||
<Representation id="2" bandwidth="273" mimeType="text/vtt">
|
||||
<BaseURL>bear-english-text.vtt</BaseURL>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
</Period>
|
||||
</MPD>
|
||||
|
|
|
@ -2,50 +2,50 @@
|
|||
<!--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" 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.802799940109253S">
|
||||
<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" maxWidth="1280" maxHeight="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:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
||||
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
||||
</ContentProtection>
|
||||
<SupplementalProperty schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016" value="1"/>
|
||||
<SupplementalProperty schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016" value="2"/>
|
||||
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
|
||||
<Representation id="0" bandwidth="281671" codecs="hev1.1.6.L63.90" mimeType="video/mp4" sar="1:1">
|
||||
<BaseURL>bear-640x360-hevc-video.mp4</BaseURL>
|
||||
<SegmentBase indexRange="3215-3282" timescale="30000">
|
||||
<Initialization range="0-3214"/>
|
||||
<Representation id="0" bandwidth="2631545" codecs="avc1.64001f" mimeType="video/mp4" sar="1:1" width="1280" height="720">
|
||||
<BaseURL>bear-1280x720-video.mp4</BaseURL>
|
||||
<SegmentBase indexRange="1129-1196" timescale="30000">
|
||||
<Initialization range="0-1128"/>
|
||||
</SegmentBase>
|
||||
</Representation>
|
||||
<Representation id="3" bandwidth="977743" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1" width="640" height="360">
|
||||
<BaseURL>bear-640x360-video.mp4</BaseURL>
|
||||
<SegmentBase indexRange="1131-1198" timescale="30000">
|
||||
<Initialization range="0-1130"/>
|
||||
</SegmentBase>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
<AdaptationSet id="1" contentType="video" maxWidth="1280" maxHeight="720" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
|
||||
<AdaptationSet id="1" contentType="video" width="1280" height="720" frameRate="30000/30030" 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>
|
||||
<EssentialProperty schemeIdUri="http://dashif.org/guidelines/trickmode" value="0"/>
|
||||
<Representation id="1" bandwidth="470530" codecs="avc1.64001f" mimeType="video/mp4" sar="1:1" maxPlayoutRate="30" codingDependency="false">
|
||||
<BaseURL>bear-1280x720-video-trick_play_factor_1.mp4</BaseURL>
|
||||
<SegmentBase indexRange="1129-1196" timescale="30000">
|
||||
<Initialization range="0-1128"/>
|
||||
</SegmentBase>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
<AdaptationSet id="2" 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>
|
||||
<SupplementalProperty schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016" value="0"/>
|
||||
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
|
||||
<Representation id="1" bandwidth="977743" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1" width="640" height="360">
|
||||
<BaseURL>bear-640x360-video.mp4</BaseURL>
|
||||
<SegmentBase indexRange="1131-1198" timescale="30000">
|
||||
<Initialization range="0-1130"/>
|
||||
</SegmentBase>
|
||||
</Representation>
|
||||
<Representation id="2" bandwidth="2631545" codecs="avc1.64001f" mimeType="video/mp4" sar="1:1" width="1280" height="720">
|
||||
<BaseURL>bear-1280x720-video.mp4</BaseURL>
|
||||
<SegmentBase indexRange="1129-1196" timescale="30000">
|
||||
<Initialization range="0-1128"/>
|
||||
</SegmentBase>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
<AdaptationSet id="2" contentType="video" width="1280" height="720" frameRate="30000/30030" 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>
|
||||
<EssentialProperty schemeIdUri="http://dashif.org/guidelines/trickmode" value="1"/>
|
||||
<Representation id="3" bandwidth="470530" codecs="avc1.64001f" mimeType="video/mp4" sar="1:1" maxPlayoutRate="30" codingDependency="false">
|
||||
<BaseURL>bear-1280x720-video-trick_play_factor_1.mp4</BaseURL>
|
||||
<SegmentBase indexRange="1129-1196" timescale="30000">
|
||||
<Initialization range="0-1128"/>
|
||||
<Representation id="2" bandwidth="281671" codecs="hev1.1.6.L63.90" mimeType="video/mp4" sar="1:1">
|
||||
<BaseURL>bear-640x360-hevc-video.mp4</BaseURL>
|
||||
<SegmentBase indexRange="3215-3282" timescale="30000">
|
||||
<Initialization range="0-3214"/>
|
||||
</SegmentBase>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
|
|
|
@ -2,20 +2,10 @@
|
|||
<!--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" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT2.802799940109253S">
|
||||
<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" maxWidth="1280" maxHeight="720" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
|
||||
<SupplementalProperty schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016" value="1"/>
|
||||
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
|
||||
<Representation id="0" bandwidth="277411" codecs="hev1.1.6.L63.90" mimeType="video/mp4" sar="1:1">
|
||||
<BaseURL>bear-640x360-hevc-video.mp4</BaseURL>
|
||||
<SegmentBase indexRange="1903-1970" timescale="30000">
|
||||
<Initialization range="0-1902"/>
|
||||
</SegmentBase>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
<AdaptationSet id="1" contentType="video" maxWidth="1280" maxHeight="720" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
|
||||
<SupplementalProperty schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016" value="0"/>
|
||||
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
|
||||
<Representation id="1" bandwidth="2627285" codecs="avc1.64001f" mimeType="video/mp4" sar="1:1" width="1280" height="720">
|
||||
<Representation id="0" bandwidth="2627285" codecs="avc1.64001f" mimeType="video/mp4" sar="1:1" width="1280" height="720">
|
||||
<BaseURL>bear-1280x720-video.mp4</BaseURL>
|
||||
<SegmentBase indexRange="862-929" timescale="30000">
|
||||
<Initialization range="0-861"/>
|
||||
|
@ -28,6 +18,16 @@
|
|||
</SegmentBase>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
<AdaptationSet id="1" contentType="video" width="640" height="360" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
|
||||
<SupplementalProperty schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016" value="0"/>
|
||||
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
|
||||
<Representation id="1" bandwidth="277411" codecs="hev1.1.6.L63.90" mimeType="video/mp4" sar="1:1">
|
||||
<BaseURL>bear-640x360-hevc-video.mp4</BaseURL>
|
||||
<SegmentBase indexRange="1903-1970" timescale="30000">
|
||||
<Initialization range="0-1902"/>
|
||||
</SegmentBase>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
<AdaptationSet id="2" contentType="audio" subsegmentAlignment="true">
|
||||
<Representation id="3" bandwidth="133334" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||
|
|
|
@ -12,18 +12,8 @@
|
|||
</SegmentTemplate>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
<AdaptationSet id="1" contentType="text" segmentAlignment="true">
|
||||
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="subtitle"/>
|
||||
<Representation id="1" bandwidth="2056" codecs="wvtt" mimeType="application/mp4">
|
||||
<SegmentTemplate timescale="1000" initialization="bear-english-text-init.mp4" media="bear-english-text-$Number$.m4s" startNumber="1">
|
||||
<SegmentTimeline>
|
||||
<S t="0" d="1000" r="4"/>
|
||||
</SegmentTimeline>
|
||||
</SegmentTemplate>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
<AdaptationSet id="2" contentType="audio" segmentAlignment="true">
|
||||
<Representation id="2" bandwidth="133961" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||
<AdaptationSet id="1" contentType="audio" segmentAlignment="true">
|
||||
<Representation id="1" bandwidth="133961" 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="bear-640x360-audio-init.mp4" media="bear-640x360-audio-$Number$.m4s" startNumber="1">
|
||||
<SegmentTimeline>
|
||||
|
@ -34,5 +24,15 @@
|
|||
</SegmentTemplate>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
<AdaptationSet id="2" contentType="text" segmentAlignment="true">
|
||||
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="subtitle"/>
|
||||
<Representation id="2" bandwidth="2056" codecs="wvtt" mimeType="application/mp4">
|
||||
<SegmentTemplate timescale="1000" initialization="bear-english-text-init.mp4" media="bear-english-text-$Number$.m4s" startNumber="1">
|
||||
<SegmentTimeline>
|
||||
<S t="0" d="1000" r="4"/>
|
||||
</SegmentTimeline>
|
||||
</SegmentTemplate>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
</Period>
|
||||
</MPD>
|
||||
|
|
|
@ -15,14 +15,6 @@
|
|||
</SegmentTimeline>
|
||||
</SegmentTemplate>
|
||||
</Representation>
|
||||
<Representation id="1" bandwidth="978414" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1" width="640" height="360">
|
||||
<SegmentTemplate timescale="30000" initialization="bear-640x360-video-init.mp4" media="bear-640x360-video-$Number$.m4s" startNumber="1">
|
||||
<SegmentTimeline>
|
||||
<S t="0" d="30030" r="1"/>
|
||||
<S t="60060" d="22022"/>
|
||||
</SegmentTimeline>
|
||||
</SegmentTemplate>
|
||||
</Representation>
|
||||
<Representation id="2" bandwidth="383625" codecs="avc1.64000d" mimeType="video/mp4" sar="1:1" width="320" height="180">
|
||||
<SegmentTemplate timescale="30000" initialization="bear-320x180-video-init.mp4" media="bear-320x180-video-$Number$.m4s" startNumber="1">
|
||||
<SegmentTimeline>
|
||||
|
@ -31,13 +23,21 @@
|
|||
</SegmentTimeline>
|
||||
</SegmentTemplate>
|
||||
</Representation>
|
||||
<Representation id="4" bandwidth="978414" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1" width="640" height="360">
|
||||
<SegmentTemplate timescale="30000" initialization="bear-640x360-video-init.mp4" media="bear-640x360-video-$Number$.m4s" startNumber="1">
|
||||
<SegmentTimeline>
|
||||
<S t="0" d="30030" r="1"/>
|
||||
<S t="60060" 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:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b">
|
||||
<cenc:pssh>AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA==</cenc:pssh>
|
||||
</ContentProtection>
|
||||
<Representation id="3" bandwidth="134304" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||
<Representation id="1" bandwidth="134304" 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="bear-1280x720-audio-init.mp4" media="bear-1280x720-audio-$Number$.m4s" startNumber="1">
|
||||
<SegmentTimeline>
|
||||
|
@ -47,17 +47,7 @@
|
|||
</SegmentTimeline>
|
||||
</SegmentTemplate>
|
||||
</Representation>
|
||||
<Representation id="4" bandwidth="134304" 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="bear-640x360-audio-init.mp4" media="bear-640x360-audio-$Number$.m4s" startNumber="1">
|
||||
<SegmentTimeline>
|
||||
<S t="0" d="45056"/>
|
||||
<S t="45056" d="44032"/>
|
||||
<S t="89088" d="31744"/>
|
||||
</SegmentTimeline>
|
||||
</SegmentTemplate>
|
||||
</Representation>
|
||||
<Representation id="5" bandwidth="134047" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||
<Representation id="3" bandwidth="134047" 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="bear-320x180-audio-init.mp4" media="bear-320x180-audio-$Number$.m4s" startNumber="1">
|
||||
<SegmentTimeline>
|
||||
|
@ -67,6 +57,16 @@
|
|||
</SegmentTimeline>
|
||||
</SegmentTemplate>
|
||||
</Representation>
|
||||
<Representation id="5" bandwidth="134304" 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="bear-640x360-audio-init.mp4" media="bear-640x360-audio-$Number$.m4s" startNumber="1">
|
||||
<SegmentTimeline>
|
||||
<S t="0" d="45056"/>
|
||||
<S t="45056" d="44032"/>
|
||||
<S t="89088" d="31744"/>
|
||||
</SegmentTimeline>
|
||||
</SegmentTemplate>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
</Period>
|
||||
</MPD>
|
||||
|
|
|
@ -2,22 +2,16 @@
|
|||
<!--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" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT2.7360665798187256S">
|
||||
<Period id="0">
|
||||
<AdaptationSet id="0" contentType="text" subsegmentAlignment="true">
|
||||
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="subtitle"/>
|
||||
<Representation id="0" bandwidth="273" mimeType="text/vtt">
|
||||
<BaseURL>bear-english-text.vtt</BaseURL>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
<AdaptationSet id="1" contentType="video" width="640" height="360" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
|
||||
<Representation id="1" bandwidth="973483" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
|
||||
<Representation id="0" bandwidth="973483" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||
<BaseURL>bear-640x360-video.mp4</BaseURL>
|
||||
<SegmentBase indexRange="863-930" timescale="30000">
|
||||
<Initialization range="0-862"/>
|
||||
</SegmentBase>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
<AdaptationSet id="2" contentType="audio" subsegmentAlignment="true">
|
||||
<Representation id="2" bandwidth="133334" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||
<AdaptationSet id="1" contentType="audio" subsegmentAlignment="true">
|
||||
<Representation id="1" bandwidth="133334" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||
<BaseURL>bear-640x360-audio.mp4</BaseURL>
|
||||
<SegmentBase indexRange="797-864" timescale="44100">
|
||||
|
@ -25,5 +19,11 @@
|
|||
</SegmentBase>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
<AdaptationSet id="2" contentType="text" subsegmentAlignment="true">
|
||||
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="subtitle"/>
|
||||
<Representation id="2" bandwidth="273" mimeType="text/vtt">
|
||||
<BaseURL>bear-english-text.vtt</BaseURL>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
</Period>
|
||||
</MPD>
|
||||
|
|
|
@ -2,19 +2,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" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" profiles="urn:mpeg:dash:profile:isoff-live:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT2.7360668182373047S">
|
||||
<Period id="0" duration="PT2.002S">
|
||||
<AdaptationSet id="0" contentType="text" segmentAlignment="true">
|
||||
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="subtitle"/>
|
||||
<Representation id="0" bandwidth="1944" codecs="wvtt" mimeType="application/mp4">
|
||||
<SegmentTemplate timescale="1000" initialization="bear-english-text-init.mp4" media="bear-english-text-$Number$.m4s" startNumber="1">
|
||||
<SegmentTimeline>
|
||||
<S t="0" d="1000" r="1"/>
|
||||
<S t="2000" d="1"/>
|
||||
</SegmentTimeline>
|
||||
</SegmentTemplate>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
<AdaptationSet id="1" contentType="video" width="640" height="360" frameRate="30000/1001" segmentAlignment="true" par="16:9">
|
||||
<Representation id="1" bandwidth="974154" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" segmentAlignment="true" par="16:9">
|
||||
<Representation id="0" bandwidth="974154" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||
<SegmentTemplate timescale="30000" initialization="bear-640x360-video-init.mp4" media="bear-640x360-video-$Number$.m4s" startNumber="1">
|
||||
<SegmentTimeline>
|
||||
<S t="0" d="30030" r="1"/>
|
||||
|
@ -22,8 +11,8 @@
|
|||
</SegmentTemplate>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
<AdaptationSet id="2" contentType="audio" segmentAlignment="true">
|
||||
<Representation id="2" bandwidth="133961" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||
<AdaptationSet id="1" contentType="audio" segmentAlignment="true">
|
||||
<Representation id="1" bandwidth="133961" 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="bear-640x360-audio-init.mp4" media="bear-640x360-audio-$Number$.m4s" startNumber="1">
|
||||
<SegmentTimeline>
|
||||
|
@ -33,20 +22,21 @@
|
|||
</SegmentTemplate>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
</Period>
|
||||
<Period id="1" duration="PT.7340666666666671S">
|
||||
<AdaptationSet id="0" contentType="text" segmentAlignment="true">
|
||||
<AdaptationSet id="2" contentType="text" segmentAlignment="true">
|
||||
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="subtitle"/>
|
||||
<Representation id="0" bandwidth="2056" codecs="wvtt" mimeType="application/mp4">
|
||||
<SegmentTemplate timescale="1000" presentationTimeOffset="2001" initialization="bear-english-text-init.mp4" media="bear-english-text-$Number$.m4s" startNumber="4">
|
||||
<Representation id="2" bandwidth="1944" codecs="wvtt" mimeType="application/mp4">
|
||||
<SegmentTemplate timescale="1000" initialization="bear-english-text-init.mp4" media="bear-english-text-$Number$.m4s" startNumber="1">
|
||||
<SegmentTimeline>
|
||||
<S t="2001" d="1000" r="2"/>
|
||||
<S t="0" d="1000" r="1"/>
|
||||
<S t="2000" d="1"/>
|
||||
</SegmentTimeline>
|
||||
</SegmentTemplate>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
<AdaptationSet id="1" contentType="video" width="640" height="360" frameRate="30000/1001" segmentAlignment="true" par="16:9">
|
||||
<Representation id="1" bandwidth="869088" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||
</Period>
|
||||
<Period id="1" duration="PT.7340666666666671S">
|
||||
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" segmentAlignment="true" par="16:9">
|
||||
<Representation id="0" bandwidth="869088" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
|
||||
<SegmentTemplate timescale="30000" presentationTimeOffset="60059" initialization="bear-640x360-video-init.mp4" media="bear-640x360-video-$Number$.m4s" startNumber="3">
|
||||
<SegmentTimeline>
|
||||
<S t="60060" d="22022"/>
|
||||
|
@ -54,8 +44,8 @@
|
|||
</SegmentTemplate>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
<AdaptationSet id="2" contentType="audio" segmentAlignment="true">
|
||||
<Representation id="2" bandwidth="108129" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||
<AdaptationSet id="1" contentType="audio" segmentAlignment="true">
|
||||
<Representation id="1" bandwidth="108129" 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" presentationTimeOffset="88288" initialization="bear-640x360-audio-init.mp4" media="bear-640x360-audio-$Number$.m4s" startNumber="3">
|
||||
<SegmentTimeline>
|
||||
|
@ -64,5 +54,15 @@
|
|||
</SegmentTemplate>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
<AdaptationSet id="2" contentType="text" segmentAlignment="true">
|
||||
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="subtitle"/>
|
||||
<Representation id="2" bandwidth="2056" codecs="wvtt" mimeType="application/mp4">
|
||||
<SegmentTemplate timescale="1000" presentationTimeOffset="2001" initialization="bear-english-text-init.mp4" media="bear-english-text-$Number$.m4s" startNumber="4">
|
||||
<SegmentTimeline>
|
||||
<S t="2001" d="1000" r="2"/>
|
||||
</SegmentTimeline>
|
||||
</SegmentTemplate>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
</Period>
|
||||
</MPD>
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include "packager/app/libcrypto_threading.h"
|
||||
#include "packager/app/muxer_factory.h"
|
||||
#include "packager/app/packager_util.h"
|
||||
#include "packager/app/single_thread_job_manager.h"
|
||||
#include "packager/app/stream_descriptor.h"
|
||||
#include "packager/base/at_exit.h"
|
||||
#include "packager/base/files/file_path.h"
|
||||
|
@ -56,6 +57,7 @@ using media::Demuxer;
|
|||
using media::JobManager;
|
||||
using media::KeySource;
|
||||
using media::MuxerOptions;
|
||||
using media::SingleThreadJobManager;
|
||||
using media::SyncPointQueue;
|
||||
|
||||
namespace media {
|
||||
|
@ -837,7 +839,12 @@ Status Packager::Initialize(
|
|||
sync_points.reset(
|
||||
new SyncPointQueue(packaging_params.ad_cue_generator_params));
|
||||
}
|
||||
if (packaging_params.single_threaded) {
|
||||
internal->job_manager.reset(
|
||||
new SingleThreadJobManager(std::move(sync_points)));
|
||||
} else {
|
||||
internal->job_manager.reset(new JobManager(std::move(sync_points)));
|
||||
}
|
||||
|
||||
std::vector<StreamDescriptor> streams_for_jobs;
|
||||
|
||||
|
|
|
@ -22,6 +22,8 @@
|
|||
'app/libcrypto_threading.h',
|
||||
'app/packager_util.cc',
|
||||
'app/packager_util.h',
|
||||
'app/single_thread_job_manager.cc',
|
||||
'app/single_thread_job_manager.h',
|
||||
'packager.cc',
|
||||
'packager.h',
|
||||
],
|
||||
|
|
|
@ -53,6 +53,9 @@ struct PackagingParams {
|
|||
/// Create a human readable format of MediaInfo. The output file name will be
|
||||
/// the name specified by output flag, suffixed with `.media_info`.
|
||||
bool output_media_info = false;
|
||||
/// Only use a single thread to generate output. This is useful in tests to
|
||||
/// avoid non-deterministic outputs.
|
||||
bool single_threaded = false;
|
||||
/// DASH MPD related parameters.
|
||||
MpdParams mpd_params;
|
||||
/// HLS related parameters.
|
||||
|
|
Loading…
Reference in New Issue