7 #include "packager/media/formats/webm/webm_muxer.h" 9 #include "packager/media/base/fourccs.h" 10 #include "packager/media/base/media_sample.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" 22 WebMMuxer::~WebMMuxer() {}
24 Status WebMMuxer::InitializeMuxer() {
25 CHECK_EQ(streams().size(), 1U);
27 if (streams()[0]->is_encrypted() &&
28 streams()[0]->encryption_config().protection_scheme != FOURCC_cenc) {
29 LOG(ERROR) <<
"WebM does not support protection scheme other than 'cenc'.";
30 return Status(error::INVALID_ARGUMENT,
31 "WebM does not support protection scheme other than 'cenc'.");
34 if (!options().segment_template.empty()) {
40 Status initialized = segmenter_->Initialize(
41 *streams()[0], progress_listener(), muxer_listener());
42 if (!initialized.ok())
45 FireOnMediaStartEvent();
49 Status WebMMuxer::Finalize() {
51 Status segmenter_finalized = segmenter_->Finalize();
53 if (!segmenter_finalized.ok())
54 return segmenter_finalized;
56 FireOnMediaEndEvent();
63 DCHECK_EQ(stream_id, 0u);
64 if (sample.pts() < 0) {
65 LOG(ERROR) <<
"Seeing negative timestamp " << sample.pts();
66 return Status(error::MUXER_FAILURE,
"Unsupported negative timestamp.");
68 return segmenter_->AddSample(sample);
71 Status WebMMuxer::FinalizeSegment(
size_t stream_id,
74 DCHECK_EQ(stream_id, 0u);
76 if (segment_info.key_rotation_encryption_config) {
77 NOTIMPLEMENTED() <<
"Key rotation is not implemented for WebM.";
78 return Status(error::UNIMPLEMENTED,
79 "Key rotation is not implemented for WebM");
81 return segmenter_->FinalizeSegment(segment_info.start_timestamp,
82 segment_info.duration,
83 segment_info.is_subsegment);
86 void WebMMuxer::FireOnMediaStartEvent() {
87 if (!muxer_listener())
90 DCHECK(!streams().empty()) <<
"Media started without a stream.";
92 const uint32_t timescale = streams().front()->time_scale();
93 muxer_listener()->
OnMediaStart(options(), *streams().front(), timescale,
94 MuxerListener::kContainerWebM);
97 void WebMMuxer::FireOnMediaEndEvent() {
98 if (!muxer_listener())
103 uint64_t init_range_start = 0;
104 uint64_t init_range_end = 0;
105 const bool has_init_range =
106 segmenter_->GetInitRangeStartAndEnd(&init_range_start, &init_range_end);
107 if (has_init_range) {
109 r.start = init_range_start;
110 r.end = init_range_end;
114 uint64_t index_range_start = 0;
115 uint64_t index_range_end = 0;
116 const bool has_index_range = segmenter_->GetIndexRangeStartAndEnd(
117 &index_range_start, &index_range_end);
118 if (has_index_range) {
120 r.start = index_range_start;
121 r.end = index_range_end;
127 const float duration_seconds = segmenter_->GetDurationInSeconds();
128 muxer_listener()->
OnMediaEnd(media_range, duration_seconds);
All the methods that are virtual are virtual for mocking.