shaka-packager/packager/media/formats/mp2t/ts_muxer.cc

74 lines
2.1 KiB
C++
Raw Normal View History

// Copyright 2016 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/media/formats/mp2t/ts_muxer.h"
namespace shaka {
namespace media {
namespace mp2t {
namespace {
const uint32_t kTsTimescale = 90000;
} // namespace
TsMuxer::TsMuxer(const MuxerOptions& muxer_options) : Muxer(muxer_options) {}
TsMuxer::~TsMuxer() {}
Status TsMuxer::InitializeMuxer() {
if (streams().size() > 1u)
return Status(error::MUXER_FAILURE, "Cannot handle more than one streams.");
segmenter_.reset(new TsSegmenter(options(), muxer_listener()));
Status status = segmenter_->Initialize(*streams()[0]);
FireOnMediaStartEvent();
return status;
}
Status TsMuxer::Finalize() {
FireOnMediaEndEvent();
return segmenter_->Finalize();
}
Status TsMuxer::AddSample(size_t stream_id, const MediaSample& sample) {
DCHECK_EQ(stream_id, 0u);
if (sample_duration_ == 0) {
sample_duration_ = sample.duration() * kTsTimescale / streams().front()->time_scale();
if (muxer_listener())
muxer_listener()->OnSampleDurationReady(sample_duration_);
}
return segmenter_->AddSample(sample);
}
Status TsMuxer::FinalizeSegment(size_t stream_id,
const SegmentInfo& segment_info) {
DCHECK_EQ(stream_id, 0u);
return segment_info.is_subsegment
? Status::OK
: segmenter_->FinalizeSegment(segment_info.start_timestamp,
segment_info.duration);
}
void TsMuxer::FireOnMediaStartEvent() {
if (!muxer_listener())
return;
muxer_listener()->OnMediaStart(options(), *streams().front(), kTsTimescale,
MuxerListener::kContainerMpeg2ts);
}
void TsMuxer::FireOnMediaEndEvent() {
if (!muxer_listener())
return;
// For now, there is no single file TS segmenter. So all the values passed
// here are left empty.
MuxerListener::MediaRanges range;
muxer_listener()->OnMediaEnd(range, 0);
}
} // namespace mp2t
} // namespace media
} // namespace shaka