From 49933737cd443b3f048c570ee702b0ba06fa3f14 Mon Sep 17 00:00:00 2001 From: Aaron Vaage Date: Wed, 3 Jan 2018 10:16:08 -0800 Subject: [PATCH] Moved MuxerFactory to own file To remove the direct dependencies between packager.cc and the different muxer implementations, this change remove the muxer factory to its own file. Change-Id: I4a1503c493f0f4d10a67e78461f96da3f4238944 --- packager/app/muxer_factory.cc | 68 +++++++++++++++++++++++++++++ packager/app/muxer_factory.h | 57 ++++++++++++++++++++++++ packager/packager.cc | 82 +++-------------------------------- packager/packager.gyp | 2 + 4 files changed, 134 insertions(+), 75 deletions(-) create mode 100644 packager/app/muxer_factory.cc create mode 100644 packager/app/muxer_factory.h diff --git a/packager/app/muxer_factory.cc b/packager/app/muxer_factory.cc new file mode 100644 index 0000000000..618455de70 --- /dev/null +++ b/packager/app/muxer_factory.cc @@ -0,0 +1,68 @@ +// Copyright 2017 Google Inc. 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/muxer_factory.h" + +#include "packager/base/time/clock.h" +#include "packager/media/base/muxer.h" +#include "packager/media/base/muxer_options.h" +#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/packager.h" + +namespace shaka { +namespace media { + +MuxerFactory::MuxerFactory(const PackagingParams& packaging_params) + : mp4_params_(packaging_params.mp4_output_params), + temp_dir_(packaging_params.temp_dir) {} + +std::shared_ptr MuxerFactory::CreateMuxer( + MediaContainerName output_format, + const StreamDescriptor& stream) { + MuxerOptions options; + options.mp4_params = mp4_params_; + options.temp_dir = temp_dir_; + options.output_file_name = stream.output; + options.segment_template = stream.segment_template; + options.bandwidth = stream.bandwidth; + + std::shared_ptr muxer; + + switch (output_format) { + case CONTAINER_WEBM: + muxer = std::make_shared(options); + break; + case CONTAINER_MPEG2TS: + muxer = std::make_shared(options); + break; + case CONTAINER_MOV: + muxer = std::make_shared(options); + break; + default: + LOG(ERROR) << "Cannot support muxing to " << output_format; + break; + } + + if (!muxer) { + return nullptr; + } + + // We successfully created a muxer, then there is a couple settings + // we should set before returning it. + if (clock_) { + muxer->set_clock(clock_); + } + + return muxer; +} + +void MuxerFactory::OverrideClock(base::Clock* clock) { + clock_ = clock; +} +} // namespace media +} // namespace shaka diff --git a/packager/app/muxer_factory.h b/packager/app/muxer_factory.h new file mode 100644 index 0000000000..3014b68f06 --- /dev/null +++ b/packager/app/muxer_factory.h @@ -0,0 +1,57 @@ +// Copyright 2017 Google Inc. 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_MUXER_FACTORY_H_ +#define PACKAGER_APP_MUXER_FACTORY_H_ + +#include +#include + +#include "packager/media/base/container_names.h" +#include "packager/media/public/mp4_output_params.h" + +namespace base { +class Clock; +} // namespace base + +namespace shaka { +struct PackagingParams; +struct StreamDescriptor; + +namespace media { + +class Muxer; +class MuxerListener; + +/// To make it easier to create muxers, this factory allows for all +/// configuration to be set at the factory level so that when a function +/// needs a muxer, it can easily create one with local information. +class MuxerFactory { + public: + MuxerFactory(const PackagingParams& packaging_params); + + /// Create a new muxer using the factory's settings for the given + /// stream. + std::shared_ptr CreateMuxer(MediaContainerName output_format, + const StreamDescriptor& stream); + + /// For testing, if you need to replace the clock that muxers work with + /// this will replace the clock for all muxers created after this call. + void OverrideClock(base::Clock* clock); + + private: + MuxerFactory(const MuxerFactory&) = delete; + MuxerFactory& operator=(const MuxerFactory&) = delete; + + Mp4OutputParams mp4_params_; + std::string temp_dir_; + base::Clock* clock_ = nullptr; +}; + +} // namespace media +} // namespace shaka + +#endif // PACKAGER_APP_MUXER_FACTORY_H_ diff --git a/packager/packager.cc b/packager/packager.cc index 132edbd7ec..01e6072789 100644 --- a/packager/packager.cc +++ b/packager/packager.cc @@ -10,6 +10,7 @@ #include "packager/app/job_manager.h" #include "packager/app/libcrypto_threading.h" +#include "packager/app/muxer_factory.h" #include "packager/app/packager_util.h" #include "packager/app/stream_descriptor.h" #include "packager/base/at_exit.h" @@ -27,6 +28,7 @@ #include "packager/media/base/fourccs.h" #include "packager/media/base/key_source.h" #include "packager/media/base/language_utils.h" +#include "packager/media/base/muxer.h" #include "packager/media/base/muxer_options.h" #include "packager/media/base/muxer_util.h" #include "packager/media/chunking/chunking_handler.h" @@ -36,9 +38,6 @@ #include "packager/media/event/hls_notify_muxer_listener.h" #include "packager/media/event/mpd_notify_muxer_listener.h" #include "packager/media/event/vod_media_info_dump_muxer_listener.h" -#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/formats/webvtt/text_readers.h" #include "packager/media/formats/webvtt/webvtt_output_handler.h" #include "packager/media/formats/webvtt/webvtt_parser.h" @@ -119,73 +118,6 @@ MediaContainerName GetOutputFormat(const StreamDescriptor& descriptor) { return output_format; } -// To make it easier to create muxers, this factory allows for all -// configuration to be set at the factory level so that when a function -// needs a muxer, it can easily create one with local information. -class MuxerFactory { - public: - MuxerFactory(const PackagingParams& packaging_params) - : packaging_params_(packaging_params) {} - - // For testing, if you need to replace the clock that muxers work with - // this will replace the clock for all muxers created after this call. - void OverrideClock(base::Clock* clock) { clock_ = clock; } - - // Create a new muxer using the factory's settings for the given - // stream. |listener| is optional. - std::shared_ptr CreateMuxer(const StreamDescriptor& stream, - std::unique_ptr listener) { - const MediaContainerName format = GetOutputFormat(stream); - - MuxerOptions options; - options.mp4_params = packaging_params_.mp4_output_params; - options.temp_dir = packaging_params_.temp_dir; - options.bandwidth = stream.bandwidth; - options.output_file_name = stream.output; - options.segment_template = stream.segment_template; - - std::shared_ptr muxer; - - switch (format) { - case CONTAINER_WEBM: - muxer = std::make_shared(options); - break; - case CONTAINER_MPEG2TS: - muxer = std::make_shared(options); - break; - case CONTAINER_MOV: - muxer = std::make_shared(options); - break; - default: - LOG(ERROR) << "Cannot support muxing to " << format; - break; - } - - if (!muxer) { - return nullptr; - } - - // We successfully created a muxer, then there is a couple settings - // we should set before returning it. - if (clock_) { - muxer->set_clock(clock_); - } - - if (listener) { - muxer->SetMuxerListener(std::move(listener)); - } - - return muxer; - } - - private: - MuxerFactory(const MuxerFactory&) = delete; - MuxerFactory& operator=(const MuxerFactory&) = delete; - - PackagingParams packaging_params_; - base::Clock* clock_ = nullptr; -}; - Status ValidateStreamDescriptor(bool dump_stream_info, const StreamDescriptor& stream) { if (stream.input.empty()) { @@ -497,7 +429,8 @@ Status CreateMp4ToMp4TextJob(int stream_number, stream, stream_number, packaging_params.output_media_info, mpd_notifier, hls_notifier); std::shared_ptr muxer = - muxer_factory->CreateMuxer(stream, std::move(muxer_listener)); + muxer_factory->CreateMuxer(GetOutputFormat(stream), stream); + muxer->SetMuxerListener(std::move(muxer_listener)); status.Update(chunker->AddHandler(std::move(muxer))); status.Update(demuxer->SetHandler(stream.stream_selector, chunker)); @@ -569,10 +502,8 @@ Status CreateTextJobs( JobManager* job_manager) { DCHECK(job_manager); for (const StreamDescriptor& stream : streams) { - const MediaContainerName output_format = GetOutputFormat(stream); - // TODO(70990714): Support webvtt to mp4 - if (output_format == CONTAINER_MOV) { + if (GetOutputFormat(stream) == CONTAINER_MOV) { std::shared_ptr root; Status status = CreateMp4ToMp4TextJob((*stream_number)++, stream, packaging_params, muxer_factory, @@ -709,7 +640,8 @@ Status CreateAudioVideoJobs( stream, (*stream_number)++, packaging_params.output_media_info, mpd_notifier, hls_notifier); std::shared_ptr muxer = - muxer_factory->CreateMuxer(stream, std::move(muxer_listener)); + muxer_factory->CreateMuxer(GetOutputFormat(stream), stream); + muxer->SetMuxerListener(std::move(muxer_listener)); if (!muxer) { return Status(error::INVALID_ARGUMENT, "Failed to create muxer for " + diff --git a/packager/packager.gyp b/packager/packager.gyp index 2b010ce128..51519fc6ac 100644 --- a/packager/packager.gyp +++ b/packager/packager.gyp @@ -16,6 +16,8 @@ # TODO(kqyang): Clean up the file path. 'app/job_manager.cc', 'app/job_manager.h', + 'app/muxer_factory.cc', + 'app/muxer_factory.h', 'app/libcrypto_threading.cc', 'app/libcrypto_threading.h', 'app/packager_util.cc',