DASH Media Packaging SDK
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator
segmenter.h
1 // Copyright 2015 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 #ifndef MEDIA_FORMATS_WEBM_SEGMENTER_H_
8 #define MEDIA_FORMATS_WEBM_SEGMENTER_H_
9 
10 #include <memory>
11 #include "packager/media/base/status.h"
12 #include "packager/media/formats/webm/encryptor.h"
13 #include "packager/media/formats/webm/mkv_writer.h"
14 #include "packager/media/formats/webm/seek_head.h"
15 #include "packager/third_party/libwebm/src/mkvmuxer.hpp"
16 
17 namespace shaka {
18 namespace media {
19 
20 struct MuxerOptions;
21 
22 class AudioStreamInfo;
23 class KeySource;
24 class MediaSample;
25 class StreamInfo;
26 class MuxerListener;
27 class ProgressListener;
28 class StreamInfo;
29 class VideoStreamInfo;
30 
31 namespace webm {
32 
33 class Segmenter {
34  public:
35  explicit Segmenter(const MuxerOptions& options);
36  virtual ~Segmenter();
37 
60  ProgressListener* progress_listener,
61  MuxerListener* muxer_listener,
62  KeySource* encryption_key_source,
63  uint32_t max_sd_pixels,
64  uint32_t max_hd_pixels,
65  uint32_t max_uhd1_pixels,
66  double clear_lead_in_seconds);
67 
70  Status Finalize();
71 
75  Status AddSample(std::shared_ptr<MediaSample> sample);
76 
78  virtual Status FinalizeSegment(uint64_t start_timescale,
79  uint64_t duration_timescale,
80  bool is_subsegment) = 0;
81 
84  virtual bool GetInitRangeStartAndEnd(uint64_t* start, uint64_t* end) = 0;
85 
88  virtual bool GetIndexRangeStartAndEnd(uint64_t* start, uint64_t* end) = 0;
89 
91  float GetDuration() const;
92 
93  protected:
96  uint64_t FromBMFFTimescale(uint64_t time_timescale);
98  uint64_t FromWebMTimecode(uint64_t time_webm_timecode);
100  Status WriteSegmentHeader(uint64_t file_size, MkvWriter* writer);
102  Status SetCluster(uint64_t start_webm_timecode,
103  uint64_t position,
104  MkvWriter* writer);
105 
107  void UpdateProgress(uint64_t progress);
108  void set_progress_target(uint64_t target) { progress_target_ = target; }
109 
110  const MuxerOptions& options() const { return options_; }
111  mkvmuxer::Cluster* cluster() { return cluster_.get(); }
112  mkvmuxer::Cues* cues() { return &cues_; }
113  MuxerListener* muxer_listener() { return muxer_listener_; }
114  StreamInfo* info() { return info_; }
115  SeekHead* seek_head() { return &seek_head_; }
116 
117  int track_id() const { return track_id_; }
118  uint64_t segment_payload_pos() const { return segment_payload_pos_; }
119 
120  virtual Status DoInitialize() = 0;
121  virtual Status DoFinalize() = 0;
122 
123  private:
124  Status CreateVideoTrack(VideoStreamInfo* info);
125  Status CreateAudioTrack(AudioStreamInfo* info);
126  Status InitializeEncryptor(KeySource* key_source, uint32_t max_sd_pixels,
127  uint32_t max_hd_pixels, uint32_t max_uhd1_pixels);
128 
129  // Writes the previous frame to the file.
130  Status WriteFrame(bool write_duration);
131 
132  // This is called when there needs to be a new (sub)segment.
133  // In single-segment mode, a Cluster is a segment and there is no subsegment.
134  // In multi-segment mode, a new file is a segment and the clusters in the file
135  // are subsegments.
136  virtual Status NewSegment(uint64_t start_timescale, bool is_subsegment) = 0;
137 
138  // Store the previous sample so we know which one is the last frame.
139  std::shared_ptr<MediaSample> prev_sample_;
140  // The reference frame timestamp; used to populate the ReferenceBlock element
141  // when writing non-keyframe BlockGroups.
142  uint64_t reference_frame_timestamp_ = 0;
143 
144  const MuxerOptions& options_;
145  std::unique_ptr<Encryptor> encryptor_;
146  double clear_lead_ = 0;
147  // Encryption is enabled only after clear_lead_.
148  bool enable_encryption_ = false;
149 
150  std::unique_ptr<mkvmuxer::Cluster> cluster_;
151  mkvmuxer::Cues cues_;
152  SeekHead seek_head_;
153  mkvmuxer::SegmentInfo segment_info_;
154  mkvmuxer::Tracks tracks_;
155 
156  StreamInfo* info_ = nullptr;
157  MuxerListener* muxer_listener_ = nullptr;
158  ProgressListener* progress_listener_ = nullptr;
159  uint64_t progress_target_ = 0;
160  uint64_t accumulated_progress_ = 0;
161  uint64_t first_timestamp_ = 0;
162  int64_t sample_duration_ = 0;
163  // The position (in bytes) of the start of the Segment payload in the init
164  // file. This is also the size of the header before the SeekHead.
165  uint64_t segment_payload_pos_ = 0;
166 
167  // Indicate whether a new segment needed to be created, which is always true
168  // in the beginning.
169  bool new_segment_ = true;
170  // Indicate whether a new subsegment needed to be created.
171  bool new_subsegment_ = false;
172  int track_id_ = 0;
173 
174  DISALLOW_COPY_AND_ASSIGN(Segmenter);
175 };
176 
177 } // namespace webm
178 } // namespace media
179 } // namespace shaka
180 
181 #endif // MEDIA_FORMATS_WEBM_SEGMENTER_H_
Status WriteSegmentHeader(uint64_t file_size, MkvWriter *writer)
Writes the Segment header to writer.
Definition: segmenter.cc:183
Status Initialize(StreamInfo *info, ProgressListener *progress_listener, MuxerListener *muxer_listener, KeySource *encryption_key_source, uint32_t max_sd_pixels, uint32_t max_hd_pixels, uint32_t max_uhd1_pixels, double clear_lead_in_seconds)
Definition: segmenter.cc:36
Abstract class holds stream information.
Definition: stream_info.h:58
This structure contains the list of configuration options for Muxer.
Definition: muxer_options.h:18
Status SetCluster(uint64_t start_webm_timecode, uint64_t position, MkvWriter *writer)
Creates a Cluster object with the given parameters.
Definition: segmenter.cc:221
This class listens to progress updates events.
virtual bool GetIndexRangeStartAndEnd(uint64_t *start, uint64_t *end)=0
Status AddSample(std::shared_ptr< MediaSample > sample)
Definition: segmenter.cc:104
An implementation of IMkvWriter using our File type.
Definition: mkv_writer.h:21
KeySource is responsible for encryption key acquisition.
Definition: key_source.h:30
void UpdateProgress(uint64_t progress)
Update segmentation progress using ProgressListener.
Definition: segmenter.cc:230
virtual bool GetInitRangeStartAndEnd(uint64_t *start, uint64_t *end)=0
uint64_t FromWebMTimecode(uint64_t time_webm_timecode)
Converts the given time in WebM timecode to ISO BMFF timescale.
Definition: segmenter.cc:177
Holds video stream information.
Holds audio stream information.
uint64_t FromBMFFTimescale(uint64_t time_timescale)
Definition: segmenter.cc:170
virtual Status FinalizeSegment(uint64_t start_timescale, uint64_t duration_timescale, bool is_subsegment)=0
Finalize the (sub)segment.
Definition: segmenter.cc:155