7 #include "packager/media/formats/webm/webm_muxer.h"
9 #include "packager/media/base/media_sample.h"
10 #include "packager/media/base/media_stream.h"
11 #include "packager/media/base/stream_info.h"
12 #include "packager/media/formats/webm/mkv_writer.h"
13 #include "packager/media/formats/webm/multi_segment_segmenter.h"
14 #include "packager/media/formats/webm/single_segment_segmenter.h"
15 #include "packager/media/formats/webm/two_pass_single_segment_segmenter.h"
17 namespace edash_packager {
22 WebMMuxer::~WebMMuxer() {}
24 Status WebMMuxer::Initialize() {
25 CHECK_EQ(streams().size(), 1U);
27 scoped_ptr<MkvWriter> writer(
new MkvWriter);
28 Status status = writer->Open(options().output_file_name);
33 segmenter_.reset(
new MultiSegmentSegmenter(options()));
34 }
else if (writer->Seekable()) {
35 segmenter_.reset(
new SingleSegmentSegmenter(options()));
37 segmenter_.reset(
new TwoPassSingleSegmentSegmenter(options()));
41 segmenter_->Initialize(writer.Pass(), streams()[0], progress_listener(),
42 muxer_listener(), encryption_key_source());
44 if (!initialized.ok())
47 FireOnMediaStartEvent();
51 Status WebMMuxer::Finalize() {
53 Status segmenter_finalized = segmenter_->Finalize();
55 if (!segmenter_finalized.ok())
56 return segmenter_finalized;
58 FireOnMediaEndEvent();
63 Status WebMMuxer::DoAddSample(
const MediaStream* stream,
64 scoped_refptr<MediaSample> sample) {
66 DCHECK(stream == streams()[0]);
67 return segmenter_->AddSample(sample);
70 void WebMMuxer::FireOnMediaStartEvent() {
71 if (!muxer_listener())
74 DCHECK(!streams().empty()) <<
"Media started without a stream.";
76 const uint32_t timescale = streams().front()->info()->time_scale();
77 muxer_listener()->OnMediaStart(options(), *streams().front()->info(),
78 timescale, MuxerListener::kContainerWebM);
81 void WebMMuxer::FireOnMediaEndEvent() {
82 if (!muxer_listener())
85 uint32_t init_range_start = 0;
86 uint32_t init_range_end = 0;
87 const bool has_init_range =
88 segmenter_->GetInitRangeStartAndEnd(&init_range_start, &init_range_end);
90 uint32_t index_range_start = 0;
91 uint32_t index_range_end = 0;
92 const bool has_index_range = segmenter_->GetIndexRangeStartAndEnd(
93 &index_range_start, &index_range_end);
95 const float duration_seconds = segmenter_->GetDuration();
97 const int64_t file_size =
100 LOG(ERROR) <<
"Invalid file size: " << file_size;
104 muxer_listener()->OnMediaEnd(has_init_range, init_range_start, init_range_end,
105 has_index_range, index_range_start,
106 index_range_end, duration_seconds, file_size);