From 4ba5bec66054cfd4af13c07ac62a97f1a1a2e5f9 Mon Sep 17 00:00:00 2001 From: Haoming Chen Date: Tue, 21 Mar 2017 16:14:46 -0700 Subject: [PATCH] Integrate trick play. - Add trick play adaptation in mpd. This addresses #178. Change-Id: Id6cc08c788eda074c261d0274768051837b84541 --- packager/app/packager_main.cc | 53 +++++- packager/app/packager_util.cc | 13 +- packager/app/packager_util.h | 8 + packager/app/stream_descriptor.cc | 17 +- packager/app/stream_descriptor.h | 14 +- packager/app/test/packager_test.py | 70 +++++++ .../bear-640x360-av-trick-1-cenc-golden.mpd | 44 +++++ .../bear-640x360-av-trick-1-golden.mpd | 32 ++++ ...640x360-av-trick-1-trick-2-cenc-golden.mpd | 50 +++++ ...bear-640x360-av-trick-1-trick-2-golden.mpd | 38 ++++ .../bear-640x360-v-trick-1-cenc-golden.mp4 | Bin 0 -> 53814 bytes .../bear-640x360-v-trick-1-golden.mp4 | Bin 0 -> 53408 bytes .../bear-640x360-v-trick-2-cenc-golden.mp4 | Bin 0 -> 35860 bytes .../bear-640x360-v-trick-2-golden.mp4 | Bin 0 -> 35523 bytes packager/media/base/media_handler.cc | 10 + packager/media/base/media_handler.h | 6 + .../media/base/media_handler_test_base.cc | 33 ++-- packager/media/base/media_handler_test_base.h | 22 ++- packager/media/base/video_stream_info.cc | 2 +- packager/media/base/video_stream_info.h | 24 ++- .../media/event/muxer_listener_internal.cc | 7 + .../media/formats/wvm/wvm_media_parser.cc | 2 +- .../media/trick_play/trick_play_handler.cc | 89 +++++++-- .../media/trick_play/trick_play_handler.h | 36 ++-- .../trick_play/trick_play_handler_unittest.cc | 180 +++++++++++++++--- packager/mpd/base/dash_iop_mpd_notifier.cc | 90 ++++++--- packager/mpd/base/dash_iop_mpd_notifier.h | 22 +++ .../base/dash_iop_mpd_notifier_unittest.cc | 66 +++++++ packager/mpd/base/media_info.proto | 7 + packager/mpd/base/mock_mpd_builder.h | 1 + packager/mpd/base/mpd_builder.cc | 17 +- packager/mpd/base/mpd_builder.h | 11 ++ packager/mpd/base/mpd_utils.cc | 7 + packager/mpd/base/xml/xml_node.cc | 19 ++ packager/mpd/base/xml/xml_node.h | 5 + packager/packager.gyp | 1 + 36 files changed, 875 insertions(+), 121 deletions(-) create mode 100644 packager/app/test/testdata/bear-640x360-av-trick-1-cenc-golden.mpd create mode 100644 packager/app/test/testdata/bear-640x360-av-trick-1-golden.mpd create mode 100644 packager/app/test/testdata/bear-640x360-av-trick-1-trick-2-cenc-golden.mpd create mode 100644 packager/app/test/testdata/bear-640x360-av-trick-1-trick-2-golden.mpd create mode 100644 packager/app/test/testdata/bear-640x360-v-trick-1-cenc-golden.mp4 create mode 100644 packager/app/test/testdata/bear-640x360-v-trick-1-golden.mp4 create mode 100644 packager/app/test/testdata/bear-640x360-v-trick-2-cenc-golden.mp4 create mode 100644 packager/app/test/testdata/bear-640x360-v-trick-2-golden.mp4 diff --git a/packager/app/packager_main.cc b/packager/app/packager_main.cc index cc2732202e..a7edc35fbf 100644 --- a/packager/app/packager_main.cc +++ b/packager/app/packager_main.cc @@ -43,6 +43,7 @@ #include "packager/media/formats/mp2t/ts_muxer.h" #include "packager/media/formats/mp4/mp4_muxer.h" #include "packager/media/formats/webm/webm_muxer.h" +#include "packager/media/trick_play/trick_play_handler.h" #include "packager/mpd/base/dash_iop_mpd_notifier.h" #include "packager/mpd/base/media_info.pb.h" #include "packager/mpd/base/mpd_builder.h" @@ -234,7 +235,10 @@ bool CreateRemuxJobs(const StreamDescriptorList& stream_descriptors, DCHECK(!(mpd_notifier && hls_notifier)); DCHECK(remux_jobs); + std::shared_ptr trick_play_handler; + std::string previous_input; + std::string previous_stream_selector; int stream_number = 0; for (StreamDescriptorList::const_iterator stream_iter = stream_descriptors.begin(); @@ -294,6 +298,7 @@ bool CreateRemuxJobs(const StreamDescriptorList& stream_descriptors, demuxer->SetKeySource(std::move(decryption_key_source)); } remux_jobs->emplace_back(new RemuxJob(std::move(demuxer))); + trick_play_handler.reset(); previous_input = stream_iter->input; // Skip setting up muxers if output is not needed. if (stream_iter->output.empty() && stream_iter->segment_template.empty()) @@ -301,6 +306,15 @@ bool CreateRemuxJobs(const StreamDescriptorList& stream_descriptors, } DCHECK(!remux_jobs->empty()); + // Each stream selector requires an individual trick play handler. + // E.g., an input with two video streams needs two trick play handlers. + // TODO(hmchen): add a test case in packager_test.py for two video streams + // input. + if (stream_iter->stream_selector != previous_stream_selector) { + previous_stream_selector = stream_iter->stream_selector; + trick_play_handler.reset(); + } + std::shared_ptr muxer( CreateOutputMuxer(stream_muxer_options, stream_iter->output_format)); if (FLAGS_use_fake_clock_for_muxer) muxer->set_clock(fake_clock); @@ -341,8 +355,29 @@ bool CreateRemuxJobs(const StreamDescriptorList& stream_descriptors, if (muxer_listener) muxer->SetMuxerListener(std::move(muxer_listener)); - Status status; + // Create a new trick_play_handler. Note that the stream_decriptors + // are sorted so that for the same input and stream_selector, the main + // stream is always the last one following the trick play streams. + if (stream_iter->trick_play_rate > 0) { + if (!trick_play_handler) { + trick_play_handler.reset(new TrickPlayHandler()); + } + trick_play_handler->SetHandlerForTrickPlay(stream_iter->trick_play_rate, + std::move(muxer)); + if (trick_play_handler->IsConnected()) + continue; + } else if (trick_play_handler) { + trick_play_handler->SetHandlerForMainStream(std::move(muxer)); + DCHECK(trick_play_handler->IsConnected()); + continue; + } + + std::vector> handlers; + auto chunking_handler = std::make_shared(chunking_options); + handlers.push_back(chunking_handler); + + Status status; if (encryption_key_source) { auto new_encryption_options = encryption_options; // Use Sample AES in MPEG2TS. @@ -353,18 +388,22 @@ bool CreateRemuxJobs(const StreamDescriptorList& stream_descriptors, new_encryption_options.protection_scheme = kAppleSampleAesProtectionScheme; } - auto encryption_handler = std::make_shared( - new_encryption_options, encryption_key_source); - status.Update(encryption_handler->SetHandler(0, std::move(muxer))); - status.Update( - chunking_handler->SetHandler(0, std::move(encryption_handler))); + handlers.emplace_back( + new EncryptionHandler(new_encryption_options, encryption_key_source)); + } + + // If trick_play_handler is available, muxer should already be connected to + // trick_play_handler. + if (trick_play_handler) { + handlers.push_back(trick_play_handler); } else { - status.Update(chunking_handler->SetHandler(0, std::move(muxer))); + handlers.push_back(std::move(muxer)); } auto* demuxer = remux_jobs->back()->demuxer(); const std::string& stream_selector = stream_iter->stream_selector; status.Update(demuxer->SetHandler(stream_selector, chunking_handler)); + status.Update(ConnectHandlers(handlers)); if (!status.ok()) { LOG(ERROR) << "Failed to setup graph: " << status; diff --git a/packager/app/packager_util.cc b/packager/app/packager_util.cc index 0c538c417d..323615801d 100644 --- a/packager/app/packager_util.cc +++ b/packager/app/packager_util.cc @@ -11,16 +11,18 @@ #include "packager/app/crypto_flags.h" #include "packager/app/fixed_key_encryption_flags.h" -#include "packager/app/playready_key_encryption_flags.h" #include "packager/app/mpd_flags.h" #include "packager/app/muxer_flags.h" +#include "packager/app/playready_key_encryption_flags.h" #include "packager/app/widevine_encryption_flags.h" #include "packager/base/logging.h" #include "packager/base/strings/string_number_conversions.h" #include "packager/media/base/fixed_key_source.h" +#include "packager/media/base/media_handler.h" #include "packager/media/base/muxer_options.h" #include "packager/media/base/playready_key_source.h" #include "packager/media/base/request_signer.h" +#include "packager/media/base/status.h" #include "packager/media/base/widevine_key_source.h" #include "packager/media/chunking/chunking_handler.h" #include "packager/media/crypto/encryption_handler.h" @@ -222,5 +224,14 @@ MpdOptions GetMpdOptions(bool on_demand_profile) { return mpd_options; } +Status ConnectHandlers(std::vector>& handlers) { + size_t num_handlers = handlers.size(); + Status status; + for (size_t i = 1; i < num_handlers; ++i) { + status.Update(handlers[i - 1]->AddHandler(handlers[i])); + } + return status; +} + } // namespace media } // namespace shaka diff --git a/packager/app/packager_util.h b/packager/app/packager_util.h index a6c17a4d6e..604550dc18 100644 --- a/packager/app/packager_util.h +++ b/packager/app/packager_util.h @@ -21,7 +21,9 @@ struct MpdOptions; namespace media { +class MediaHandler; class KeySource; +class Status; struct ChunkingOptions; struct EncryptionOptions; struct MuxerOptions; @@ -50,6 +52,12 @@ MuxerOptions GetMuxerOptions(); /// @return MpdOptions from provided command line options. MpdOptions GetMpdOptions(bool on_demand_profile); +/// Connect handlers in the vector. +/// @param handlers A vector of media handlers to be conncected. the handlers +/// are chained from front() to back(). +/// @return OK on success. +Status ConnectHandlers(std::vector>& handlers); + } // namespace media } // namespace shaka diff --git a/packager/app/stream_descriptor.cc b/packager/app/stream_descriptor.cc index c08ed654ce..a8bbea6de2 100644 --- a/packager/app/stream_descriptor.cc +++ b/packager/app/stream_descriptor.cc @@ -71,8 +71,7 @@ FieldType GetFieldType(const std::string& field_name) { } // anonymous namespace -StreamDescriptor::StreamDescriptor() - : bandwidth(0), output_format(CONTAINER_UNKNOWN) {} +StreamDescriptor::StreamDescriptor() {} StreamDescriptor::~StreamDescriptor() {} @@ -144,6 +143,20 @@ bool InsertStreamDescriptor(const std::string& descriptor_string, descriptor.hls_playlist_name = iter->second; break; } + case kTrickPlayRateField: { + unsigned rate; + if (!base::StringToUint(iter->second, &rate)) { + LOG(ERROR) << "Non-numeric trick play rate " << iter->second + << " specified."; + return false; + } + if (rate == 0) { + LOG(ERROR) << "Stream trick_play_rate should be > 0."; + return false; + } + descriptor.trick_play_rate = rate; + break; + } default: LOG(ERROR) << "Unknown field in stream descriptor (\"" << iter->first << "\")."; diff --git a/packager/app/stream_descriptor.h b/packager/app/stream_descriptor.h index ab6ef368ee..5cb6c80489 100644 --- a/packager/app/stream_descriptor.h +++ b/packager/app/stream_descriptor.h @@ -27,18 +27,26 @@ struct StreamDescriptor { std::string input; std::string output; std::string segment_template; - uint32_t bandwidth; + uint32_t bandwidth = 0; std::string language; - MediaContainerName output_format; + MediaContainerName output_format = CONTAINER_UNKNOWN; std::string hls_name; std::string hls_group_id; std::string hls_playlist_name; - int16_t trick_play_rate; + uint32_t trick_play_rate = 0; }; class StreamDescriptorCompareFn { public: bool operator()(const StreamDescriptor& a, const StreamDescriptor& b) { + if (a.input == b.input) { + if (a.stream_selector == b.stream_selector) + // Stream with high trick_play_rate is at the beginning. + return a.trick_play_rate > b.trick_play_rate; + else + return a.stream_selector < b.stream_selector; + } + return a.input < b.input; } }; diff --git a/packager/app/test/packager_test.py b/packager/app/test/packager_test.py index 6ebce76ce8..4cb94db2a9 100755 --- a/packager/app/test/packager_test.py +++ b/packager/app/test/packager_test.py @@ -101,6 +101,41 @@ class PackagerAppTest(unittest.TestCase): self._DiffGold(self.output[1], 'bear-640x360-v-golden.mp4') self._DiffGold(self.mpd_output, 'bear-640x360-av-golden.mpd') + def testPackageAudioVideoWithTrickPlay(self): + self.packager.Package( + self._GetStreams(['audio', 'video', 'video,trick_play_rate=1']), + self._GetFlags()) + self._DiffGold(self.output[0], 'bear-640x360-a-golden.mp4') + self._DiffGold(self.output[1], 'bear-640x360-v-golden.mp4') + self._DiffGold(self.output[2], 'bear-640x360-v-trick-1-golden.mp4') + self._DiffGold(self.mpd_output, 'bear-640x360-av-trick-1-golden.mpd') + + def testPackageAudioVideoWithTwoTrickPlay(self): + self.packager.Package( + self._GetStreams(['audio', 'video', 'video,trick_play_rate=1', + 'video,trick_play_rate=2']), + self._GetFlags()) + self._DiffGold(self.output[0], 'bear-640x360-a-golden.mp4') + self._DiffGold(self.output[1], 'bear-640x360-v-golden.mp4') + self._DiffGold(self.output[2], 'bear-640x360-v-trick-1-golden.mp4') + self._DiffGold(self.output[3], 'bear-640x360-v-trick-2-golden.mp4') + self._DiffGold(self.mpd_output, + 'bear-640x360-av-trick-1-trick-2-golden.mpd') + + def testPackageAudioVideoWithTwoTrickPlayDecreasingRate(self): + self.packager.Package( + self._GetStreams(['audio', 'video', 'video,trick_play_rate=2', + 'video,trick_play_rate=1']), + self._GetFlags()) + self._DiffGold(self.output[0], 'bear-640x360-a-golden.mp4') + self._DiffGold(self.output[1], 'bear-640x360-v-golden.mp4') + self._DiffGold(self.output[2], 'bear-640x360-v-trick-2-golden.mp4') + self._DiffGold(self.output[3], 'bear-640x360-v-trick-1-golden.mp4') + # Since the stream descriptors are sorted in packager app, a different + # order of trick play rates gets the same mpd. + self._DiffGold(self.mpd_output, + 'bear-640x360-av-trick-1-trick-2-golden.mpd') + def testPackageAudioVideoWithLanguageOverride(self): self.packager.Package( self._GetStreams(['audio', 'video'], language_override='por-BR'), @@ -205,6 +240,36 @@ class PackagerAppTest(unittest.TestCase): self._VerifyDecryption(self.output[0], 'bear-640x360-a-golden.mp4') self._VerifyDecryption(self.output[1], 'bear-640x360-v-golden.mp4') + def testPackageWithEncryptionAndTrickPlay(self): + self.packager.Package( + self._GetStreams(['audio', 'video', 'video,trick_play_rate=1']), + self._GetFlags(encryption=True)) + self._DiffGold(self.output[0], 'bear-640x360-a-cenc-golden.mp4') + self._DiffGold(self.output[1], 'bear-640x360-v-cenc-golden.mp4') + self._DiffGold(self.output[2], 'bear-640x360-v-trick-1-cenc-golden.mp4') + self._DiffGold(self.mpd_output, 'bear-640x360-av-trick-1-cenc-golden.mpd') + self._VerifyDecryption(self.output[0], 'bear-640x360-a-golden.mp4') + self._VerifyDecryption(self.output[1], 'bear-640x360-v-golden.mp4') + self._VerifyDecryption(self.output[2], 'bear-640x360-v-trick-1-golden.mp4') + + # TODO(hmchen): Add a test case that SD and HD AdapatationSet share one trick + # play stream. + def testPackageWithEncryptionAndTwoTrickPlays(self): + self.packager.Package( + self._GetStreams(['audio', 'video', 'video,trick_play_rate=1', + 'video,trick_play_rate=2']), + self._GetFlags(encryption=True)) + self._DiffGold(self.output[0], 'bear-640x360-a-cenc-golden.mp4') + self._DiffGold(self.output[1], 'bear-640x360-v-cenc-golden.mp4') + self._DiffGold(self.output[2], 'bear-640x360-v-trick-1-cenc-golden.mp4') + self._DiffGold(self.output[3], 'bear-640x360-v-trick-2-cenc-golden.mp4') + self._DiffGold(self.mpd_output, + 'bear-640x360-av-trick-1-trick-2-cenc-golden.mpd') + self._VerifyDecryption(self.output[0], 'bear-640x360-a-golden.mp4') + self._VerifyDecryption(self.output[1], 'bear-640x360-v-golden.mp4') + self._VerifyDecryption(self.output[2], 'bear-640x360-v-trick-1-golden.mp4') + self._VerifyDecryption(self.output[3], 'bear-640x360-v-trick-2-golden.mp4') + def testPackageWithEncryptionAndNoPsshInStream(self): self.packager.Package( self._GetStreams(['audio', 'video']), @@ -574,6 +639,11 @@ class PackagerAppTest(unittest.TestCase): else: output_prefix = '%s_%d_%s' % (self.output_prefix, test_file_index, stream_descriptor) + # Replace ',', '=' with '_' to make it more like a filename, also + # avoid potential illegal charactors for a filename. + for ch in [',', '=']: + output_prefix = output_prefix.replace(ch, '_') + if live: if output_format == 'ts': stream = ('input=%s,stream=%s,segment_template=%s-$Number$.ts,' diff --git a/packager/app/test/testdata/bear-640x360-av-trick-1-cenc-golden.mpd b/packager/app/test/testdata/bear-640x360-av-trick-1-cenc-golden.mpd new file mode 100644 index 0000000000..8262361526 --- /dev/null +++ b/packager/app/test/testdata/bear-640x360-av-trick-1-cenc-golden.mpd @@ -0,0 +1,44 @@ + + + + + + + + AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA== + + + output_video.mp4 + + + + + + + + + AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA== + + + + output_video_trick_play_rate_1.mp4 + + + + + + + + + AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA== + + + + output_audio.mp4 + + + + + + + diff --git a/packager/app/test/testdata/bear-640x360-av-trick-1-golden.mpd b/packager/app/test/testdata/bear-640x360-av-trick-1-golden.mpd new file mode 100644 index 0000000000..c4f46e2ca7 --- /dev/null +++ b/packager/app/test/testdata/bear-640x360-av-trick-1-golden.mpd @@ -0,0 +1,32 @@ + + + + + + + output_video.mp4 + + + + + + + + + output_video_trick_play_rate_1.mp4 + + + + + + + + + output_audio.mp4 + + + + + + + diff --git a/packager/app/test/testdata/bear-640x360-av-trick-1-trick-2-cenc-golden.mpd b/packager/app/test/testdata/bear-640x360-av-trick-1-trick-2-cenc-golden.mpd new file mode 100644 index 0000000000..f021e58096 --- /dev/null +++ b/packager/app/test/testdata/bear-640x360-av-trick-1-trick-2-cenc-golden.mpd @@ -0,0 +1,50 @@ + + + + + + + + AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA== + + + output_video.mp4 + + + + + + + + + AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA== + + + + output_video_trick_play_rate_2.mp4 + + + + + + output_video_trick_play_rate_1.mp4 + + + + + + + + + AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA== + + + + output_audio.mp4 + + + + + + + diff --git a/packager/app/test/testdata/bear-640x360-av-trick-1-trick-2-golden.mpd b/packager/app/test/testdata/bear-640x360-av-trick-1-trick-2-golden.mpd new file mode 100644 index 0000000000..59d55b7be2 --- /dev/null +++ b/packager/app/test/testdata/bear-640x360-av-trick-1-trick-2-golden.mpd @@ -0,0 +1,38 @@ + + + + + + + output_video.mp4 + + + + + + + + + output_video_trick_play_rate_2.mp4 + + + + + + output_video_trick_play_rate_1.mp4 + + + + + + + + + output_audio.mp4 + + + + + + + diff --git a/packager/app/test/testdata/bear-640x360-v-trick-1-cenc-golden.mp4 b/packager/app/test/testdata/bear-640x360-v-trick-1-cenc-golden.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..2a960701115cb68753c2344a3bf2868774d90ec2 GIT binary patch literal 53814 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 Y^<5e+zH{zgh57ZSThebjyypf}u`ydR^8f$< literal 0 HcmV?d00001 diff --git a/packager/app/test/testdata/bear-640x360-v-trick-1-golden.mp4 b/packager/app/test/testdata/bear-640x360-v-trick-1-golden.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..60407efb5f9a4656a5cec43a7b1dcf5b63415c03 GIT binary patch literal 53408 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 z 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≠n%0sVXbrT7Zzo{B|=eU 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 yEb_3w2+wo#d&SY7qHA=M;66*qCUm| literal 0 HcmV?d00001 diff --git a/packager/app/test/testdata/bear-640x360-v-trick-2-cenc-golden.mp4 b/packager/app/test/testdata/bear-640x360-v-trick-2-cenc-golden.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..e8daf0b08e9fa158fc003a25bd712a8bc2f00ea6 GIT binary patch literal 35860 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 literal 0 HcmV?d00001 diff --git a/packager/media/base/media_handler.cc b/packager/media/base/media_handler.cc index a806761df5..7d16d87877 100644 --- a/packager/media/base/media_handler.cc +++ b/packager/media/base/media_handler.cc @@ -69,5 +69,15 @@ Status MediaHandler::FlushDownstream(size_t output_stream_index) { return handler_it->second.first->OnFlushRequest(handler_it->second.second); } +Status MediaHandler::FlushAllDownstreams() { + for (const auto& pair : output_handlers_) { + Status status = pair.second.first->OnFlushRequest(pair.second.second); + if (!status.ok()) { + return status; + } + } + return Status::OK; +} + } // namespace media } // namespace shaka diff --git a/packager/media/base/media_handler.h b/packager/media/base/media_handler.h index 7a8bdd481d..f8f21f66f8 100644 --- a/packager/media/base/media_handler.h +++ b/packager/media/base/media_handler.h @@ -86,6 +86,9 @@ class MediaHandler { /// called after setting up the graph before running the graph. Status Initialize(); + /// Validate if the handler is connected to its upstream handler. + bool IsConnected() { return num_input_streams_ > 0; } + protected: /// Internal implementation of initialize. Note that it should only initialize /// the MediaHandler itself. Downstream handlers are handled in Initialize(). @@ -160,6 +163,9 @@ class MediaHandler { /// Flush the downstream connected at the specified output stream index. Status FlushDownstream(size_t output_stream_index); + /// Flush all connected downstreams. + Status FlushAllDownstreams(); + bool initialized() { return initialized_; } size_t num_input_streams() const { return num_input_streams_; } size_t next_output_stream_index() const { return next_output_stream_index_; } diff --git a/packager/media/base/media_handler_test_base.cc b/packager/media/base/media_handler_test_base.cc index 32ba2cfd29..fe25ab6024 100644 --- a/packager/media/base/media_handler_test_base.cc +++ b/packager/media/base/media_handler_test_base.cc @@ -59,27 +59,22 @@ const uint8_t kData[]{ namespace shaka { namespace media { -// A fake media handler definition used for testing. -class FakeMediaHandler : public MediaHandler { - public: - const std::vector>& stream_data_vector() const { - return stream_data_vector_; - } - void clear_stream_data_vector() { stream_data_vector_.clear(); } +Status FakeMediaHandler::InitializeInternal() { + return Status::OK; +} - protected: - Status InitializeInternal() override { return Status::OK; } - Status Process(std::unique_ptr stream_data) override { - stream_data_vector_.push_back(std::move(stream_data)); - return Status::OK; - } - Status OnFlushRequest(size_t input_stream_index) override { return Status::OK; } - bool ValidateOutputStreamIndex(size_t stream_index) const override { - return true; - } +Status FakeMediaHandler::Process(std::unique_ptr stream_data) { + stream_data_vector_.push_back(std::move(stream_data)); + return Status::OK; +} - std::vector> stream_data_vector_; -}; +Status FakeMediaHandler::OnFlushRequest(size_t input_stream_index) { + return Status::OK; +} + +bool FakeMediaHandler::ValidateOutputStreamIndex(size_t stream_index) const { + return true; +} MediaHandlerTestBase::MediaHandlerTestBase() : next_handler_(new FakeMediaHandler), diff --git a/packager/media/base/media_handler_test_base.h b/packager/media/base/media_handler_test_base.h index bdf9274f18..1dd3096818 100644 --- a/packager/media/base/media_handler_test_base.h +++ b/packager/media/base/media_handler_test_base.h @@ -13,8 +13,6 @@ namespace shaka { namespace media { -class FakeMediaHandler; - MATCHER_P3(IsStreamInfo, stream_index, time_scale, encrypted, "") { *result_listener << "which is (" << stream_index << "," << time_scale << "," << (encrypted ? "encrypted" : "not encrypted") << ")"; @@ -76,6 +74,23 @@ MATCHER_P4(IsMediaSample, stream_index, timestamp, duration, encrypted, "") { arg->media_sample->is_encrypted() == encrypted; } +// A fake media handler definition used for testing. +class FakeMediaHandler : public MediaHandler { + public: + const std::vector>& stream_data_vector() const { + return stream_data_vector_; + } + void clear_stream_data_vector() { stream_data_vector_.clear(); } + + protected: + Status InitializeInternal() override; + Status Process(std::unique_ptr stream_data) override; + Status OnFlushRequest(size_t input_stream_index) override; + bool ValidateOutputStreamIndex(size_t stream_index) const override; + + std::vector> stream_data_vector_; +}; + class MediaHandlerTestBase : public ::testing::Test { public: MediaHandlerTestBase(); @@ -126,6 +141,9 @@ class MediaHandlerTestBase : public ::testing::Test { /// @return some random handler that can be used for testing. std::shared_ptr some_handler() { return some_handler_; } + /// @return some a downstream handler that can be used for connecting. + std::shared_ptr next_handler() { return next_handler_; } + private: MediaHandlerTestBase(const MediaHandlerTestBase&) = delete; MediaHandlerTestBase& operator=(const MediaHandlerTestBase&) = delete; diff --git a/packager/media/base/video_stream_info.cc b/packager/media/base/video_stream_info.cc index 2e3ee259a5..704970ad74 100644 --- a/packager/media/base/video_stream_info.cc +++ b/packager/media/base/video_stream_info.cc @@ -48,7 +48,7 @@ VideoStreamInfo::VideoStreamInfo(int track_id, uint16_t height, uint32_t pixel_width, uint32_t pixel_height, - int16_t trick_play_rate, + uint32_t trick_play_rate, uint8_t nalu_length_size, const std::string& language, bool is_encrypted) diff --git a/packager/media/base/video_stream_info.h b/packager/media/base/video_stream_info.h index c462a5019b..a837990c16 100644 --- a/packager/media/base/video_stream_info.h +++ b/packager/media/base/video_stream_info.h @@ -39,7 +39,7 @@ class VideoStreamInfo : public StreamInfo { uint16_t height, uint32_t pixel_width, uint32_t pixel_height, - int16_t trick_play_rate, + uint32_t trick_play_rate, uint8_t nalu_length_size, const std::string& language, bool is_encrypted); @@ -62,16 +62,20 @@ class VideoStreamInfo : public StreamInfo { /// @return 0 if unknown. uint32_t pixel_height() const { return pixel_height_; } uint8_t nalu_length_size() const { return nalu_length_size_; } - int16_t trick_play_rate() const { return trick_play_rate_; } + uint32_t trick_play_rate() const { return trick_play_rate_; } + uint32_t playback_rate() const { return playback_rate_; } const std::vector& eme_init_data() const { return eme_init_data_; } void set_width(uint32_t width) { width_ = width; } void set_height(uint32_t height) { height_ = height; } void set_pixel_width(uint32_t pixel_width) { pixel_width_ = pixel_width; } void set_pixel_height(uint32_t pixel_height) { pixel_height_ = pixel_height; } - void set_trick_play_rate(int16_t trick_play_rate) { + void set_trick_play_rate(uint32_t trick_play_rate) { trick_play_rate_ = trick_play_rate; } + void set_playback_rate(uint32_t playback_rate) { + playback_rate_ = playback_rate; + } void set_eme_init_data(const uint8_t* eme_init_data, size_t eme_init_data_size) { eme_init_data_.assign(eme_init_data, eme_init_data + eme_init_data_size); @@ -86,7 +90,19 @@ class VideoStreamInfo : public StreamInfo { // 0 means unknown. uint32_t pixel_width_; uint32_t pixel_height_; - int16_t trick_play_rate_; // Non-zero for trick-play streams. + uint32_t trick_play_rate_ = 0; // Non-zero for trick-play streams. + + // Playback rate is the attribute for trick play stream, which signals the + // playout capabilities + // (http://dashif.org/wp-content/uploads/2016/12/DASH-IF-IOP-v4.0-clean.pdf, + // page 18, line 1). It is the ratio of main frame rate to the trick play + // frame rate. If the time scale and frame duration are not modified after + // trick play handler processing, the playback_rate equals to the number of + // frames between consecutive key frames selected for trick play stream. For + // example, if the video stream has GOP size of 10 and the trick play rate is + // 3, the key frames are in this trick play stream are [frame_0, frame_30, + // frame_60, ...]. Then the playback_rate is 30. + uint32_t playback_rate_; // Specifies the size of the NAL unit length field. Can be 1, 2 or 4 bytes, or // 0 if the stream is not a NAL structured video stream or if it is an AnnexB diff --git a/packager/media/event/muxer_listener_internal.cc b/packager/media/event/muxer_listener_internal.cc index 65faf21cae..3a2349bcba 100644 --- a/packager/media/event/muxer_listener_internal.cc +++ b/packager/media/event/muxer_listener_internal.cc @@ -101,6 +101,13 @@ void AddVideoInfo(const VideoStreamInfo* video_stream_info, if (!codec_config.empty()) { video_info->set_decoder_config(&codec_config[0], codec_config.size()); } + + if (video_stream_info->trick_play_rate() > 0) { + video_info->set_trick_play_rate(video_stream_info->trick_play_rate()); + CHECK_GT(video_stream_info->playback_rate(), 0u) + << "Max playout rate should be > 0 for trick play streams."; + video_info->set_playback_rate(video_stream_info->playback_rate()); + } } void AddAudioInfo(const AudioStreamInfo* audio_stream_info, diff --git a/packager/media/formats/wvm/wvm_media_parser.cc b/packager/media/formats/wvm/wvm_media_parser.cc index f4214fd0ce..252f76bb4c 100644 --- a/packager/media/formats/wvm/wvm_media_parser.cc +++ b/packager/media/formats/wvm/wvm_media_parser.cc @@ -574,7 +574,7 @@ bool WvmMediaParser::ParseIndexEntry() { } uint64_t track_duration = 0; - int16_t trick_play_rate = 0; + uint32_t trick_play_rate = 0; uint32_t sampling_frequency = kDefaultSamplingFrequency; uint32_t time_scale = kMpeg2ClockRate; uint16_t video_width = 0; diff --git a/packager/media/trick_play/trick_play_handler.cc b/packager/media/trick_play/trick_play_handler.cc index b73af1795b..677e779933 100644 --- a/packager/media/trick_play/trick_play_handler.cc +++ b/packager/media/trick_play/trick_play_handler.cc @@ -12,17 +12,40 @@ namespace shaka { namespace media { -TrickPlayHandler::TrickPlayHandler(const TrickPlayOptions& trick_play_option) - : trick_play_options_(trick_play_option), - cached_stream_data_(trick_play_option.trick_play_rates.size()) { - for (auto rate : trick_play_option.trick_play_rates) { - CHECK_GT(rate, 0); - } +namespace { +const size_t kMainStreamIndex = 0; } +TrickPlayHandler::TrickPlayHandler() {} + TrickPlayHandler::~TrickPlayHandler() {} +void TrickPlayHandler::SetHandlerForMainStream( + std::shared_ptr handler) { + SetHandler(kMainStreamIndex, std::move(handler)); +} + +void TrickPlayHandler::SetHandlerForTrickPlay( + uint32_t trick_play_rate, + std::shared_ptr handler) { + trick_play_rates_.push_back(trick_play_rate); + // Trick play streams start from index 1. + SetHandler(trick_play_rates_.size(), std::move(handler)); +} + Status TrickPlayHandler::InitializeInternal() { + if (!HasMainStream()) { + return Status(error::TRICK_PLAY_ERROR, + "Trick play does not have main stream"); + } + if (trick_play_rates_.empty()) { + return Status(error::TRICK_PLAY_ERROR, + "Trick play rates are not specified."); + } + size_t num_trick_play_rates = trick_play_rates_.size(); + cached_stream_data_.resize(num_trick_play_rates); + playback_rates_.resize(num_trick_play_rates, 0); + return Status::OK; } @@ -54,6 +77,18 @@ Status TrickPlayHandler::Process( } } + if (stream_data->stream_data_type == StreamDataType::kSegmentInfo) { + for (auto& cached_data : cached_stream_data_) { + // It is possible that trick play stream has large frame duration that + // some segments in the main stream are skipped. To avoid empty segments, + // only cache SegementInfo with MediaSample before it. + if (!cached_data.empty() && + cached_data.back()->stream_data_type == StreamDataType::kMediaSample) + cached_data.push_back(stream_data); + } + return Status::OK; + } + if (stream_data->stream_data_type != StreamDataType::kMediaSample) { // Non media sample stream data needs to be dispatched to every output // stream. It is just cached in every queue until a new key frame comes or @@ -66,12 +101,18 @@ Status TrickPlayHandler::Process( if (stream_data->media_sample->is_key_frame()) { // For a new key frame, some of the trick play streams may include it. // The cached data in those trick play streams will be processed. - DCHECK_EQ(trick_play_options_.trick_play_rates.size(), - cached_stream_data_.size()); + DCHECK_EQ(trick_play_rates_.size(), cached_stream_data_.size()); for (size_t i = 0; i < cached_stream_data_.size(); ++i) { - int16_t rate = trick_play_options_.trick_play_rates[i]; + uint32_t rate = trick_play_rates_[i]; if (total_key_frames_ % rate == 0) { - if (!cached_stream_data_[i].empty()) { + // Delay processing cached stream data until receiving the second key + // frame so that the GOP size could be derived. + if (!cached_stream_data_[i].empty() && total_key_frames_ > 0) { + // Num of frames between first two key frames in the trick play + // streams. Use this as the playback_rate. + if (playback_rates_[i] == 0) + playback_rates_[i] = total_frames_; + Status status = ProcessCachedStreamData(i + 1, &cached_stream_data_[i]); if (!status.ok()) @@ -84,24 +125,40 @@ Status TrickPlayHandler::Process( total_key_frames_++; } + total_frames_++; prev_sample_end_timestamp_ = stream_data->media_sample->dts() + stream_data->media_sample->duration(); + return Status::OK; } bool TrickPlayHandler::ValidateOutputStreamIndex(size_t stream_index) const { // Output stream index should be less than the number of trick play // streams + one original stream. - return stream_index <= trick_play_options_.trick_play_rates.size(); + return stream_index <= trick_play_rates_.size(); }; Status TrickPlayHandler::OnFlushRequest(size_t input_stream_index) { DCHECK_EQ(input_stream_index, 0u) << "Trick Play Handler should only have single input."; for (size_t i = 0; i < cached_stream_data_.size(); ++i) { + LOG_IF(WARNING, playback_rates_[i] == 0) + << "Max playout rate for trick play rate " << trick_play_rates_[i] + << " is not determined. " + << "Specify it as total number of frames: " << total_frames_ << "."; + playback_rates_[i] = total_frames_; ProcessCachedStreamData(i + 1, &cached_stream_data_[i]); } - return MediaHandler::FlushDownstream(input_stream_index); + return MediaHandler::FlushAllDownstreams(); +} + +bool TrickPlayHandler::HasMainStream() { + const auto& handlers = output_handlers(); + const auto& main_stream_handler = handlers.find(kMainStreamIndex); + if (main_stream_handler == handlers.end()) { + return false; + } + return main_stream_handler->second.first != nullptr; } Status TrickPlayHandler::ProcessCachedStreamData( @@ -121,8 +178,8 @@ Status TrickPlayHandler::ProcessCachedStreamData( Status TrickPlayHandler::ProcessOneStreamData( size_t output_stream_index, const std::shared_ptr& stream_data) { - uint32_t trick_play_rate = - trick_play_options_.trick_play_rates[output_stream_index - 1]; + size_t trick_play_index = output_stream_index - 1; + uint32_t trick_play_rate = trick_play_rates_[trick_play_index]; Status status; switch (stream_data->stream_data_type) { // trick_play_rate in StreamInfo should be modified. @@ -132,6 +189,9 @@ Status TrickPlayHandler::ProcessOneStreamData( std::shared_ptr trick_play_video_stream_info( new VideoStreamInfo(video_stream_info)); trick_play_video_stream_info->set_trick_play_rate(trick_play_rate); + DCHECK_GT(playback_rates_[trick_play_index], 0u); + trick_play_video_stream_info->set_playback_rate( + playback_rates_[trick_play_index]); status = DispatchStreamInfo(output_stream_index, trick_play_video_stream_info); break; @@ -142,7 +202,6 @@ Status TrickPlayHandler::ProcessOneStreamData( MediaSample::CopyFrom(*(stream_data->media_sample)); trick_play_media_sample->set_duration(prev_sample_end_timestamp_ - stream_data->media_sample->dts()); - status = DispatchMediaSample(output_stream_index, trick_play_media_sample); } diff --git a/packager/media/trick_play/trick_play_handler.h b/packager/media/trick_play/trick_play_handler.h index 55999f0e99..5af28b0b57 100644 --- a/packager/media/trick_play/trick_play_handler.h +++ b/packager/media/trick_play/trick_play_handler.h @@ -12,17 +12,6 @@ namespace shaka { namespace media { -struct TrickPlayOptions { - /// Trick play rates. Note that there can be multiple trick play rates, - /// e.g., 2, 4 and 8. That means, one input video stream will generate 3 - /// output trick play streams and original stream. Three trick play streams - /// are: - /// [key_frame_0, key_frame_2, key_frame_4, ...] - /// [key_frame_0, key_frame_4, key_frame_8,...] - /// [key_frame_0, key_frame_8, key_frame_16, ...]. - std::vector trick_play_rates; -}; - /// TrickPlayHandler is a single-input-multiple-output media handler. It creates /// trick play streams from the input. // The stream data in trick play stream is not a simple duplicate. Some @@ -33,9 +22,13 @@ struct TrickPlayOptions { // input stream data before the next key frame. class TrickPlayHandler : public MediaHandler { public: - explicit TrickPlayHandler(const TrickPlayOptions& trick_play_options); + TrickPlayHandler(); ~TrickPlayHandler() override; + void SetHandlerForMainStream(std::shared_ptr handler); + void SetHandlerForTrickPlay(uint32_t trick_play_rate, + std::shared_ptr handler); + protected: /// @name MediaHandler implementation overrides. /// @{ @@ -48,6 +41,10 @@ class TrickPlayHandler : public MediaHandler { private: friend class TrickPlayHandlerTest; + // Returns true if the trick play handler has main stream output handler + // connected, otherwise returns false. + bool HasMainStream(); + // Process the cached stream data for one trick play stream. // The cached data is dispatched to the |output_stream_index|. Status ProcessCachedStreamData( @@ -62,7 +59,14 @@ class TrickPlayHandler : public MediaHandler { Status ProcessOneStreamData(size_t output_stream_index, const std::shared_ptr& stream_data); - const TrickPlayOptions trick_play_options_; + // Trick play rates. Note that there can be multiple trick play rates, + // e.g., 2, 4 and 8. That means, one input video stream will generate 3 + // output trick play streams and original stream. Three trick play streams + // are: + // [key_frame_0, key_frame_2, key_frame_4, ...] + // [key_frame_0, key_frame_4, key_frame_8,...] + // [key_frame_0, key_frame_8, key_frame_16, ...]. + std::vector trick_play_rates_; TrickPlayHandler(const TrickPlayHandler&) = delete; TrickPlayHandler& operator=(const TrickPlayHandler&) = delete; @@ -70,11 +74,17 @@ class TrickPlayHandler : public MediaHandler { /// Num of key frames received. uint32_t total_key_frames_ = 0; + // Num of frames received. + uint32_t total_frames_ = 0; + // End timestamp of the previous processed media_sample, which is |dts| + // |duration|. The duration of key frame in trick play stream is updated based // on this timestamp. int64_t prev_sample_end_timestamp_ = 0; + // Record playback_rate for each trick play stream. + std::vector playback_rates_; + // The data in output streams should be in the same order as in the input // stream. Cache the stream data before next key frame so that we can // determine the duration for the current key frame. Since one key frame may diff --git a/packager/media/trick_play/trick_play_handler_unittest.cc b/packager/media/trick_play/trick_play_handler_unittest.cc index 0cf9795992..871b1eed02 100644 --- a/packager/media/trick_play/trick_play_handler_unittest.cc +++ b/packager/media/trick_play/trick_play_handler_unittest.cc @@ -22,18 +22,19 @@ namespace { const size_t kStreamIndex0 = 0; const size_t kStreamIndex1 = 1; const size_t kStreamIndex2 = 2; -const size_t kStreamIndex3 = 3; const uint32_t kTimeScale = 800; const uint32_t kDuration = 200; -const int16_t kTrickPlayRates[]{1, 2, 4}; +const uint32_t kTrickPlayRates[]{1, 2}; +const uint32_t kTrickPlayRatesDecreasing[]{2, 1}; const bool kEncrypted = true; } // namespace -MATCHER_P4(IsTrickPlayVideoStreamInfo, +MATCHER_P5(IsTrickPlayVideoStreamInfo, stream_index, time_scale, encrypted, trick_play_rate, + playback_rate, "") { return arg->stream_index == stream_index && arg->stream_data_type == StreamDataType::kStreamInfo && @@ -41,7 +42,9 @@ MATCHER_P4(IsTrickPlayVideoStreamInfo, arg->stream_info->is_encrypted() == encrypted && arg->stream_info->stream_type() == kStreamVideo && static_cast(arg->stream_info.get()) - ->trick_play_rate() == trick_play_rate; + ->trick_play_rate() == trick_play_rate && + static_cast(arg->stream_info.get()) + ->playback_rate() == playback_rate; } MATCHER_P3(IsKeyFrameMediaSample, stream_index, timestamp, duration, "") { @@ -54,12 +57,16 @@ MATCHER_P3(IsKeyFrameMediaSample, stream_index, timestamp, duration, "") { class TrickPlayHandlerTest : public MediaHandlerTestBase { public: - void SetUpTrickPlayHandler(const TrickPlayOptions& trick_play_options) { - trick_play_handler_.reset(new TrickPlayHandler(trick_play_options)); - // The output stream size is number of trick play stream + one - // non-trick-play stream. - SetUpGraph(1, trick_play_options.trick_play_rates.size() + 1, - trick_play_handler_); + void SetUpTrickPlayHandler(const std::vector& trick_play_rates) { + trick_play_handler_.reset(new TrickPlayHandler()); + // Use SetUpGraph to set only input handler, and use + // SetHandlerForMainStream and SetHandlerForTrickPlay for the output + // handlers. + SetUpGraph(1, 0, trick_play_handler_); + trick_play_handler_->SetHandlerForMainStream(next_handler()); + for (uint32_t rate : trick_play_rates) { + trick_play_handler_->SetHandlerForTrickPlay(rate, next_handler()); + } ASSERT_OK(trick_play_handler_->Initialize()); } @@ -77,10 +84,9 @@ class TrickPlayHandlerTest : public MediaHandlerTestBase { // This test makes sure the audio stream is rejected by the trick play handler. TEST_F(TrickPlayHandlerTest, AudioStream) { - TrickPlayOptions trick_play_options; - trick_play_options.trick_play_rates.assign(std::begin(kTrickPlayRates), - std::end(kTrickPlayRates)); - SetUpTrickPlayHandler(trick_play_options); + const std::vector trick_play_rates(std::begin(kTrickPlayRates), + std::end(kTrickPlayRates)); + SetUpTrickPlayHandler(trick_play_rates); Status status = Process(GetAudioStreamInfoStreamData(kStreamIndex0, kTimeScale)); @@ -90,11 +96,10 @@ TEST_F(TrickPlayHandlerTest, AudioStream) { // This test makes sure the trick play handler can process stream data // correctly. -TEST_F(TrickPlayHandlerTest, VideoStream) { - TrickPlayOptions trick_play_options; - trick_play_options.trick_play_rates.assign(std::begin(kTrickPlayRates), - std::end(kTrickPlayRates)); - SetUpTrickPlayHandler(trick_play_options); +TEST_F(TrickPlayHandlerTest, VideoStreamWithTrickPlay) { + const std::vector trick_play_rates(std::begin(kTrickPlayRates), + std::end(kTrickPlayRates)); + SetUpTrickPlayHandler(trick_play_rates); ASSERT_OK(Process(GetVideoStreamInfoStreamData(kStreamIndex0, kTimeScale))); // The stream info is cached, so the output is empty. @@ -119,12 +124,6 @@ TEST_F(TrickPlayHandlerTest, VideoStream) { // Frame 0, key frame. IsMediaSample(kStreamIndex0, kVideoStartTimestamp, kDuration, !kEncrypted), - IsTrickPlayVideoStreamInfo(kStreamIndex1, kTimeScale, !kEncrypted, - kTrickPlayRates[0]), - IsTrickPlayVideoStreamInfo(kStreamIndex2, kTimeScale, !kEncrypted, - kTrickPlayRates[1]), - IsTrickPlayVideoStreamInfo(kStreamIndex3, kTimeScale, !kEncrypted, - kTrickPlayRates[2]), // Frame 1. IsMediaSample(kStreamIndex0, kVideoStartTimestamp + kDuration, kDuration, !kEncrypted), @@ -148,6 +147,10 @@ TEST_F(TrickPlayHandlerTest, VideoStream) { // Frame 3, key frame. IsKeyFrameMediaSample( kStreamIndex0, kVideoStartTimestamp + kDuration * 3, kDuration), + // Stream info, TrickPlayRate = 1. + IsTrickPlayVideoStreamInfo( + kStreamIndex1, kTimeScale, !kEncrypted, kTrickPlayRates[0], + static_cast(kGOPSize) * kTrickPlayRates[0]), // Frame 0, TrickPlayRate = 1. IsKeyFrameMediaSample(kStreamIndex1, kVideoStartTimestamp, kDuration * 3), @@ -178,6 +181,10 @@ TEST_F(TrickPlayHandlerTest, VideoStream) { IsKeyFrameMediaSample(kStreamIndex1, kVideoStartTimestamp + kDuration * 3, kDuration * 3), + // Stream info, TrickPlayRate = 2. + IsTrickPlayVideoStreamInfo( + kStreamIndex2, kTimeScale, !kEncrypted, kTrickPlayRates[1], + static_cast(kGOPSize) * kTrickPlayRates[1]), // Frame 0, TrickPlayRate = 2. IsKeyFrameMediaSample(kStreamIndex2, kVideoStartTimestamp, kDuration * 6), @@ -195,11 +202,128 @@ TEST_F(TrickPlayHandlerTest, VideoStream) { kDuration * 2), // Frame 6, TrickPlayRate = 2. IsKeyFrameMediaSample(kStreamIndex2, + kVideoStartTimestamp + kDuration * 6, + kDuration * 2))); + ClearOutputStreamDataVector(); + + // Flush again, get nothing. + ASSERT_OK(FlushStream(0)); + EXPECT_THAT(GetOutputStreamDataVector(), IsEmpty()); +} + +// This test makes sure the trick play handler can process stream data +// correctly with a decreasing order of trick play rates. +TEST_F(TrickPlayHandlerTest, VideoStreamWithDecreasingTrickPlayRates) { + const std::vector trick_play_rates( + std::begin(kTrickPlayRatesDecreasing), + std::end(kTrickPlayRatesDecreasing)); + SetUpTrickPlayHandler(trick_play_rates); + + ASSERT_OK(Process(GetVideoStreamInfoStreamData(kStreamIndex0, kTimeScale))); + // The stream info is cached, so the output is empty. + EXPECT_THAT( + GetOutputStreamDataVector(), + ElementsAre(IsStreamInfo(kStreamIndex0, kTimeScale, !kEncrypted))); + ClearOutputStreamDataVector(); + + const int kVideoStartTimestamp = 12345; + // Group of Picture size, the frequency of key frames. + const int kGOPSize = 3; + for (int i = 0; i < 3; ++i) { + const bool is_key_frame = (i % kGOPSize == 0); + ASSERT_OK(Process(GetMediaSampleStreamData( + kStreamIndex0, kVideoStartTimestamp + kDuration * i, kDuration, + is_key_frame))); + } + + EXPECT_THAT( + GetOutputStreamDataVector(), + ElementsAre( + // Frame 0, key frame. + IsMediaSample(kStreamIndex0, kVideoStartTimestamp, kDuration, + !kEncrypted), + // Frame 1. + IsMediaSample(kStreamIndex0, kVideoStartTimestamp + kDuration, + kDuration, !kEncrypted), + // Frame 2. + IsMediaSample(kStreamIndex0, kVideoStartTimestamp + kDuration * 2, + kDuration, !kEncrypted))); + ClearOutputStreamDataVector(); + + // This expectation are separated from the expectation above because + // ElementsAre supports at most 10 elements. + for (int i = 3; i < 6; ++i) { + const bool is_key_frame = (i % kGOPSize == 0); + ASSERT_OK(Process(GetMediaSampleStreamData( + kStreamIndex0, kVideoStartTimestamp + kDuration * i, kDuration, + is_key_frame))); + } + + EXPECT_THAT( + GetOutputStreamDataVector(), + ElementsAre( + // Frame 3, key frame. + IsKeyFrameMediaSample( + kStreamIndex0, kVideoStartTimestamp + kDuration * 3, kDuration), + // Stream info, TrickPlayRate = 1. + IsTrickPlayVideoStreamInfo( + kStreamIndex2, kTimeScale, !kEncrypted, + kTrickPlayRatesDecreasing[1], + static_cast(kGOPSize) * kTrickPlayRatesDecreasing[1]), + // Frame 0, TrickPlayRate = 1. + IsKeyFrameMediaSample(kStreamIndex2, kVideoStartTimestamp, + kDuration * 3), + // Frame 4. + IsMediaSample(kStreamIndex0, kVideoStartTimestamp + kDuration * 4, + kDuration, !kEncrypted), + // Frame 5. + IsMediaSample(kStreamIndex0, kVideoStartTimestamp + kDuration * 5, + kDuration, !kEncrypted))); + ClearOutputStreamDataVector(); + + // This expectation are separated from the expectation above because + // ElementsAre supports at most 10 elements. + for (int i = 6; i < 8; ++i) { + const bool is_key_frame = (i % kGOPSize == 0); + ASSERT_OK(Process(GetMediaSampleStreamData( + kStreamIndex0, kVideoStartTimestamp + kDuration * i, kDuration, + is_key_frame))); + } + + EXPECT_THAT( + GetOutputStreamDataVector(), + ElementsAre( + // Frame 6, key frame. + IsKeyFrameMediaSample( + kStreamIndex0, kVideoStartTimestamp + kDuration * 6, kDuration), + // Stream info, TrickPlayRate = 2. + IsTrickPlayVideoStreamInfo( + kStreamIndex1, kTimeScale, !kEncrypted, + kTrickPlayRatesDecreasing[0], + static_cast(kGOPSize) * kTrickPlayRatesDecreasing[0]), + // Frame 0, TrickPlayRate = 2. + IsKeyFrameMediaSample(kStreamIndex1, kVideoStartTimestamp, + kDuration * 6), + // Frame 3, TrickPlayRate = 1. + IsKeyFrameMediaSample(kStreamIndex2, + kVideoStartTimestamp + kDuration * 3, + kDuration * 3), + // Frame 7. + IsMediaSample(kStreamIndex0, kVideoStartTimestamp + kDuration * 7, + kDuration, !kEncrypted))); + ClearOutputStreamDataVector(); + + ASSERT_OK(FlushStream(0)); + EXPECT_THAT(GetOutputStreamDataVector(), + ElementsAre( + // Frame 6, TrickPlayRate = 2. + IsKeyFrameMediaSample(kStreamIndex1, kVideoStartTimestamp + kDuration * 6, kDuration * 2), - // Frame 0, TrickPlayRate = 4. - IsKeyFrameMediaSample(kStreamIndex3, kVideoStartTimestamp, - kDuration * 8))); + // Frame 6, TrickPlayRate = 1. + IsKeyFrameMediaSample(kStreamIndex2, + kVideoStartTimestamp + kDuration * 6, + kDuration * 2))); ClearOutputStreamDataVector(); // Flush again, get nothing. diff --git a/packager/mpd/base/dash_iop_mpd_notifier.cc b/packager/mpd/base/dash_iop_mpd_notifier.cc index f48dc854a2..48fb53f702 100644 --- a/packager/mpd/base/dash_iop_mpd_notifier.cc +++ b/packager/mpd/base/dash_iop_mpd_notifier.cc @@ -151,6 +151,34 @@ bool DashIopMpdNotifier::Flush() { return WriteMpdToFile(output_path_, mpd_builder_.get()); } +AdaptationSet* DashIopMpdNotifier::ReuseAdaptationSet( + const std::list& adaptation_sets, + const MediaInfo& media_info) { + const bool has_protected_content = media_info.has_protected_content(); + for (AdaptationSet* adaptation_set : adaptation_sets) { + ProtectedContentMap::const_iterator protected_content_it = + protected_content_map_.find(adaptation_set->id()); + + // If the AdaptationSet ID is not registered in the map, then it is clear + // content. + if (protected_content_it == protected_content_map_.end()) { + // Can reuse the AdaptationSet without content protection. + if (!has_protected_content) { + return adaptation_set; + } + continue; + } + + if (ProtectedContentEq(protected_content_it->second, + media_info.protected_content())) { + // Content protection info matches. Reuse the AdaptationSet. + return adaptation_set; + } + } + + return nullptr; +} + AdaptationSet* DashIopMpdNotifier::GetAdaptationSetForMediaInfo( const std::string& key, const MediaInfo& media_info) { @@ -158,30 +186,10 @@ AdaptationSet* DashIopMpdNotifier::GetAdaptationSetForMediaInfo( if (adaptation_sets.empty()) return NewAdaptationSet(media_info, &adaptation_sets); - const bool has_protected_content = media_info.has_protected_content(); - - for (std::list::const_iterator adaptation_set_it = - adaptation_sets.begin(); - adaptation_set_it != adaptation_sets.end(); ++adaptation_set_it) { - ProtectedContentMap::const_iterator protected_content_it = - protected_content_map_.find((*adaptation_set_it)->id()); - - // If the AdaptationSet ID is not registered in the map, then it is clear - // content (or encrypted but doesn't need element - // possibly because the player knows how to handle it). - if (protected_content_it == protected_content_map_.end()) { - // Can reuse the AdaptationSet without content protection. - if (!has_protected_content) - return *adaptation_set_it; - continue; - } - - if (ProtectedContentEq(protected_content_it->second, - media_info.protected_content())) { - // Content protection info matches. Reuse the AdaptationSet. - return *adaptation_set_it; - } - } + AdaptationSet* reuse_adaptation_set = + ReuseAdaptationSet(adaptation_sets, media_info); + if (reuse_adaptation_set) + return reuse_adaptation_set; // None of the adaptation sets match with the new content protection. // Need a new one. @@ -267,8 +275,42 @@ AdaptationSet* DashIopMpdNotifier::NewAdaptationSet( (*adaptation_sets->begin())->AddRole(AdaptationSet::kRoleMain); new_adaptation_set->AddRole(AdaptationSet::kRoleMain); } + + if (media_info.video_info().trick_play_rate() > 0) { + uint32_t trick_play_reference_id = 0; + if (!FindOriginalAdaptationSetForTrickPlay(media_info, + &trick_play_reference_id)) { + LOG(ERROR) << "Failed to find main adaptation set for trick play."; + return nullptr; + } + DCHECK_NE(new_adaptation_set->id(), trick_play_reference_id); + new_adaptation_set->AddTrickPlayReferenceId(trick_play_reference_id); + } } return new_adaptation_set; } +bool DashIopMpdNotifier::FindOriginalAdaptationSetForTrickPlay( + const MediaInfo& media_info, + uint32_t* main_adaptation_set_id) { + MediaInfo media_info_no_trickplay = media_info; + media_info_no_trickplay.mutable_video_info()->clear_trick_play_rate(); + std::string key = GetAdaptationSetKey(media_info_no_trickplay); + const std::list& adaptation_sets = + adaptation_set_list_map_[key]; + if (adaptation_sets.empty()) { + return false; + } + + AdaptationSet* reuse_adaptation_set = + ReuseAdaptationSet(adaptation_sets, media_info); + if (!reuse_adaptation_set) { + return false; + } + + *main_adaptation_set_id = reuse_adaptation_set->id(); + + return true; +} + } // namespace shaka diff --git a/packager/mpd/base/dash_iop_mpd_notifier.h b/packager/mpd/base/dash_iop_mpd_notifier.h index a9cc1ebe01..75d7347fd0 100644 --- a/packager/mpd/base/dash_iop_mpd_notifier.h +++ b/packager/mpd/base/dash_iop_mpd_notifier.h @@ -64,6 +64,19 @@ class DashIopMpdNotifier : public MpdNotifier { // Maps AdaptationSet ID to ProtectedContent. typedef std::map ProtectedContentMap; + // Find reusable AdaptationSet, instead of creating a new AdaptationSet for + // the |media_info|. There are two cases that an |existing_adaptation_set| + // can be used: + // 1) The media info does not have protected content and there is an existing + // unprotected content AdapationSet. + // 2) The media info has protected content and there is an exisiting + // AdaptationSet, which has same MediaInfo::ProtectedContent protobuf. + // Returns the reusable AdaptationSet pointer if found, otherwise returns + // nullptr. + AdaptationSet* ReuseAdaptationSet( + const std::list& adaptation_sets, + const MediaInfo& media_info); + // Checks the protected_content field of media_info and returns a non-null // AdaptationSet* for a new Representation. // This does not necessarily return a new AdaptationSet. If @@ -83,6 +96,15 @@ class DashIopMpdNotifier : public MpdNotifier { AdaptationSet* NewAdaptationSet(const MediaInfo& media_info, std::list* adaptation_sets); + // Gets the original AdaptationSet which the trick play video belongs + // to and returns the id of the original adapatation set. + // It is assumed that the corresponding AdaptationSet has been created before + // the trick play AdaptationSet. + // Returns true if main_adaptation_id is found, otherwise false; + bool FindOriginalAdaptationSetForTrickPlay( + const MediaInfo& media_info, + uint32_t* original_adaptation_set_id); + // Testing only method. Returns a pointer to MpdBuilder. MpdBuilder* MpdBuilderForTesting() const { return mpd_builder_.get(); diff --git a/packager/mpd/base/dash_iop_mpd_notifier_unittest.cc b/packager/mpd/base/dash_iop_mpd_notifier_unittest.cc index 8a08437846..d802f91937 100644 --- a/packager/mpd/base/dash_iop_mpd_notifier_unittest.cc +++ b/packager/mpd/base/dash_iop_mpd_notifier_unittest.cc @@ -154,6 +154,72 @@ TEST_F(DashIopMpdNotifierTest, NotifyNewContainer) { EXPECT_TRUE(notifier.Flush()); } +// Verify that basic VOD NotifyNewContainer() operation works on trick play +// streams. +// No encrypted contents. +TEST_F(DashIopMpdNotifierTest, NotifyNewContainerForTrickPlay) { + const char kTrickPlayMediaInfo[] = + "video_info {\n" + " codec: 'avc1'\n" + " width: 1280\n" + " height: 720\n" + " time_scale: 10\n" + " frame_duration: 100\n" + " pixel_width: 1\n" + " pixel_height: 1\n" + " trick_play_rate: 2\n" + " playback_rate: 10\n" + "}\n" + "container_type: 1\n"; + DashIopMpdNotifier notifier(empty_mpd_option_, empty_base_urls_, + output_path_); + + std::unique_ptr mock_mpd_builder(new MockMpdBuilder()); + + // Not using default mocks in this test so that we can keep track of + // mocks by named mocks. + const uint32_t kAdaptationSetId = 2u; + const uint32_t kTrickPlayAdaptationSetId = 3u; + std::unique_ptr mock_adaptation_set( + new MockAdaptationSet(kAdaptationSetId)); + std::unique_ptr mock_tp_adaptation_set( + new MockAdaptationSet(kTrickPlayAdaptationSetId)); + + const uint32_t kRepresentationId = 4u; + const uint32_t kTrickPlayRepresentationId = 5u; + std::unique_ptr mock_representation( + new MockRepresentation(kRepresentationId)); + std::unique_ptr mock_tp_representation( + new MockRepresentation(kTrickPlayRepresentationId)); + + InSequence in_sequence; + EXPECT_CALL(*mock_mpd_builder, AddAdaptationSet(_)) + .WillOnce(Return(mock_adaptation_set.get())); + EXPECT_CALL(*mock_adaptation_set, AddRole(_)).Times(0); + EXPECT_CALL(*mock_adaptation_set, AddRepresentation(_)) + .WillOnce(Return(mock_representation.get())); + + // Calls for trick-play stream. + EXPECT_CALL(*mock_mpd_builder, AddAdaptationSet(_)) + .WillOnce(Return(mock_tp_adaptation_set.get())); + EXPECT_CALL(*mock_tp_adaptation_set, AddRole(_)).Times(0); + EXPECT_CALL(*mock_tp_adaptation_set, + AddTrickPlayReferenceId(kAdaptationSetId)) + .Times(1); + EXPECT_CALL(*mock_tp_adaptation_set, AddRepresentation(_)) + .WillOnce(Return(mock_tp_representation.get())); + + EXPECT_CALL(*mock_mpd_builder, ToString(_)).WillOnce(Return(true)); + + uint32_t unused_container_id; + SetMpdBuilder(¬ifier, std::move(mock_mpd_builder)); + EXPECT_TRUE(notifier.NotifyNewContainer(ConvertToMediaInfo(kValidMediaInfo), + &unused_container_id)); + EXPECT_TRUE(notifier.NotifyNewContainer( + ConvertToMediaInfo(kTrickPlayMediaInfo), &unused_container_id)); + EXPECT_TRUE(notifier.Flush()); +} + // Verify that if the MediaInfo contains text information, then // MpdBuilder::ForceSetSegmentAlignment() is called. TEST_F(DashIopMpdNotifierTest, NotifyNewTextContainer) { diff --git a/packager/mpd/base/media_info.proto b/packager/mpd/base/media_info.proto index 493395802d..5a629e9b17 100644 --- a/packager/mpd/base/media_info.proto +++ b/packager/mpd/base/media_info.proto @@ -40,6 +40,13 @@ message MediaInfo { // aspect ratio, or the @par attribute set on AdaptationSet element. optional uint32 pixel_width = 7; optional uint32 pixel_height = 8; + + // trick_play_rate: sample rate of the key frame from the original stream. + // e.g., 1 means every key frame, 2 means every two key frames. + optional uint32 trick_play_rate = 9; + // playback_rate: the playout capability (e.g., 4x, 8x, 16x fast foward) of + // the trick play stream. + optional uint32 playback_rate = 10; } message AudioInfo { diff --git a/packager/mpd/base/mock_mpd_builder.h b/packager/mpd/base/mock_mpd_builder.h index e74e6e94ec..d1446dcf52 100644 --- a/packager/mpd/base/mock_mpd_builder.h +++ b/packager/mpd/base/mock_mpd_builder.h @@ -38,6 +38,7 @@ class MockAdaptationSet : public AdaptationSet { void(const std::string& drm_uuid, const std::string& pssh)); MOCK_METHOD1(AddRole, void(AdaptationSet::Role role)); MOCK_METHOD1(ForceSetSegmentAlignment, void(bool segment_alignment)); + MOCK_METHOD1(AddTrickPlayReferenceId, void(uint32_t id)); private: // Only for constructing the super class. Not used for testing. diff --git a/packager/mpd/base/mpd_builder.cc b/packager/mpd/base/mpd_builder.cc index d92406e614..739565f009 100644 --- a/packager/mpd/base/mpd_builder.cc +++ b/packager/mpd/base/mpd_builder.cc @@ -824,6 +824,17 @@ xml::scoped_xml_ptr AdaptationSet::GetXml() { return xml::scoped_xml_ptr(); } + if (!trick_play_reference_ids_.empty()) { + std::string id_string; + for (uint32_t id : trick_play_reference_ids_) { + id_string += std::to_string(id) + ","; + } + DCHECK(!id_string.empty()); + id_string.resize(id_string.size() - 1); + adaptation_set.AddEssentialProperty( + "http://dashif.org/guidelines/trickmode", id_string); + } + std::string switching_ids; for (uint32_t id : adaptation_set_switching_ids_) { if (!switching_ids.empty()) @@ -889,6 +900,10 @@ void AdaptationSet::OnSetFrameRateForRepresentation( RecordFrameRate(frame_duration, timescale); } +void AdaptationSet::AddTrickPlayReferenceId(uint32_t id) { + trick_play_reference_ids_.insert(id); +} + bool AdaptationSet::GetEarliestTimestamp(double* timestamp_seconds) { DCHECK(timestamp_seconds); @@ -1279,7 +1294,7 @@ bool Representation::IsContiguous(uint64_t start_time, LOG(ERROR) << "Segments should not be out of order segment. Adding segment " "with start_time == " << start_time << " but the previous segment starts at " - << previous.start_time << "."; + << previous_segment_start_time << "."; return false; } diff --git a/packager/mpd/base/mpd_builder.h b/packager/mpd/base/mpd_builder.h index 965f1a1924..e3a8a6431d 100644 --- a/packager/mpd/base/mpd_builder.h +++ b/packager/mpd/base/mpd_builder.h @@ -267,6 +267,11 @@ class AdaptationSet { uint32_t frame_duration, uint32_t timescale); + /// Add the id of the adaptation set this trick play adaptation set belongs + /// to. + /// @param id the id of the reference (or main) adapation set. + virtual void AddTrickPlayReferenceId(uint32_t id); + protected: /// @param adaptation_set_id is an ID number for this AdaptationSet. /// @param lang is the language of this AdaptationSet. Mainly relevant for @@ -384,6 +389,12 @@ class AdaptationSet { // reasonable and may cause an out-of-memory problem. RepresentationTimeline representation_segment_start_times_; + // Record the reference id for the original adaptation sets the trick play + // stream belongs to. This is a set because the trick play streams may be for + // multiple AdaptationSets (e.g. SD and HD videos in different AdaptationSets + // can share the same trick play stream.) + std::set trick_play_reference_ids_; + DISALLOW_COPY_AND_ASSIGN(AdaptationSet); }; diff --git a/packager/mpd/base/mpd_utils.cc b/packager/mpd/base/mpd_utils.cc index 6fa388ed1f..7baf484402 100644 --- a/packager/mpd/base/mpd_utils.cc +++ b/packager/mpd/base/mpd_utils.cc @@ -136,6 +136,13 @@ std::string GetAdaptationSetKey(const MediaInfo& media_info) { key.append(":"); key.append(GetLanguage(media_info)); + // Trick play streams of the same original stream, but possibly with + // different trick_play_rates, belong to the same trick play AdaptationSet. + if (media_info.has_video_info() && + media_info.video_info().trick_play_rate() > 0) { + key.append(":trick_play"); + } + return key; } diff --git a/packager/mpd/base/xml/xml_node.cc b/packager/mpd/base/xml/xml_node.cc index 3dd571b6d8..8309e33b96 100644 --- a/packager/mpd/base/xml/xml_node.cc +++ b/packager/mpd/base/xml/xml_node.cc @@ -175,6 +175,15 @@ void RepresentationBaseXmlNode::AddSupplementalProperty( AddChild(supplemental_property.PassScopedPtr()); } +void RepresentationBaseXmlNode::AddEssentialProperty( + const std::string& scheme_id_uri, + const std::string& value) { + XmlNode essential_property("EssentialProperty"); + essential_property.SetStringAttribute("schemeIdUri", scheme_id_uri); + essential_property.SetStringAttribute("value", value); + AddChild(essential_property.PassScopedPtr()); +} + bool RepresentationBaseXmlNode::AddContentProtectionElement( const ContentProtectionElement& content_protection_element) { XmlNode content_protection_node("ContentProtection"); @@ -245,6 +254,16 @@ bool RepresentationXmlNode::AddVideoInfo(const VideoInfo& video_info, base::IntToString(video_info.time_scale()) + "/" + base::IntToString(video_info.frame_duration())); } + + if (video_info.has_playback_rate()) { + SetStringAttribute("maxPlayoutRate", + base::IntToString(video_info.playback_rate())); + // Since the trick play stream contains only key frames, there is no coding + // dependency on the main stream. Simply set the codingDependency to false. + // TODO(hmchen): propagate this attribute up to the AdaptationSet, since + // all are set to false. + SetStringAttribute("codingDependency", "false"); + } return true; } diff --git a/packager/mpd/base/xml/xml_node.h b/packager/mpd/base/xml/xml_node.h index 2d5c88ee1b..c841b60768 100644 --- a/packager/mpd/base/xml/xml_node.h +++ b/packager/mpd/base/xml/xml_node.h @@ -105,6 +105,11 @@ class RepresentationBaseXmlNode : public XmlNode { void AddSupplementalProperty(const std::string& scheme_id_uri, const std::string& value); + /// @param scheme_id_uri is content of the schemeIdUri attribute. + /// @param value is the content of value attribute. + void AddEssentialProperty(const std::string& scheme_id_uri, + const std::string& value); + protected: explicit RepresentationBaseXmlNode(const char* name); diff --git a/packager/packager.gyp b/packager/packager.gyp index c91cdc8d28..6d0e9c48aa 100644 --- a/packager/packager.gyp +++ b/packager/packager.gyp @@ -54,6 +54,7 @@ 'media/formats/webm/webm.gyp:webm', 'media/formats/webvtt/webvtt.gyp:webvtt', 'media/formats/wvm/wvm.gyp:wvm', + 'media/trick_play/trick_play.gyp:trick_play', 'mpd/mpd.gyp:mpd_builder', 'third_party/boringssl/boringssl.gyp:boringssl', 'third_party/gflags/gflags.gyp:gflags',