DASH Media Packaging SDK
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator
ts_muxer.cc
1 // Copyright 2016 Google Inc. All rights reserved.
2 //
3 // Use of this source code is governed by a BSD-style
4 // license that can be found in the LICENSE file or at
5 // https://developers.google.com/open-source/licenses/bsd
6 
7 #include "packager/media/formats/mp2t/ts_muxer.h"
8 
9 namespace shaka {
10 namespace media {
11 namespace mp2t {
12 
13 namespace {
14 const uint32_t kTsTimescale = 90000;
15 } // namespace
16 
17 TsMuxer::TsMuxer(const MuxerOptions& muxer_options) : Muxer(muxer_options) {}
18 TsMuxer::~TsMuxer() {}
19 
20 Status TsMuxer::InitializeMuxer() {
21  if (streams().size() > 1u)
22  return Status(error::MUXER_FAILURE, "Cannot handle more than one streams.");
23 
24  segmenter_.reset(new TsSegmenter(options(), muxer_listener()));
25  Status status = segmenter_->Initialize(
26  *streams()[0], encryption_key_source(), max_sd_pixels(), max_hd_pixels(),
27  max_uhd1_pixels(), clear_lead_in_seconds());
28  FireOnMediaStartEvent();
29  return status;
30 }
31 
32 Status TsMuxer::Finalize() {
33  FireOnMediaEndEvent();
34  return segmenter_->Finalize();
35 }
36 
37 Status TsMuxer::AddSample(size_t stream_id,
38  std::shared_ptr<MediaSample> sample) {
39  DCHECK_EQ(stream_id, 0u);
40  return segmenter_->AddSample(sample);
41 }
42 
43 Status TsMuxer::FinalizeSegment(size_t stream_id,
44  std::shared_ptr<SegmentInfo> segment_info) {
45  DCHECK_EQ(stream_id, 0u);
46  return segment_info->is_subsegment
47  ? Status::OK
48  : segmenter_->FinalizeSegment(segment_info->start_timestamp,
49  segment_info->duration);
50 }
51 
52 void TsMuxer::FireOnMediaStartEvent() {
53  if (!muxer_listener())
54  return;
55  muxer_listener()->OnMediaStart(options(), *streams().front(), kTsTimescale,
56  MuxerListener::kContainerWebM);
57 }
58 
59 void TsMuxer::FireOnMediaEndEvent() {
60  if (!muxer_listener())
61  return;
62 
63  // For now, there is no single file TS segmenter. So all the values passed
64  // here are false and 0. Called just to notify the MuxerListener.
65  const bool kHasInitRange = true;
66  const bool kHasIndexRange = true;
67  muxer_listener()->OnMediaEnd(!kHasInitRange, 0, 0, !kHasIndexRange, 0, 0, 0,
68  0);
69 }
70 
71 } // namespace mp2t
72 } // namespace media
73 } // namespace shaka
virtual void OnMediaEnd(bool has_init_range, uint64_t init_range_start, uint64_t init_range_end, bool has_index_range, uint64_t index_range_start, uint64_t index_range_end, float duration_seconds, uint64_t file_size)=0
virtual void OnMediaStart(const MuxerOptions &muxer_options, const StreamInfo &stream_info, uint32_t time_scale, ContainerType container_type)=0