Shaka Packager SDK
muxer.h
1 // Copyright 2014 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 // Defines the muxer interface.
8 
9 #ifndef PACKAGER_MEDIA_BASE_MUXER_H_
10 #define PACKAGER_MEDIA_BASE_MUXER_H_
11 
12 #include <memory>
13 #include <vector>
14 
15 #include "packager/base/time/clock.h"
16 #include "packager/media/base/media_handler.h"
17 #include "packager/media/base/muxer_options.h"
18 #include "packager/media/event/muxer_listener.h"
19 #include "packager/media/event/progress_listener.h"
20 #include "packager/status.h"
21 
22 namespace shaka {
23 namespace media {
24 
25 class MediaSample;
26 
30 class Muxer : public MediaHandler {
31  public:
32  explicit Muxer(const MuxerOptions& options);
33  virtual ~Muxer();
34 
37  void Cancel();
38 
41  void SetMuxerListener(std::unique_ptr<MuxerListener> muxer_listener);
42 
45  void SetProgressListener(std::unique_ptr<ProgressListener> progress_listener);
46 
47  const std::vector<std::shared_ptr<const StreamInfo>>& streams() const {
48  return streams_;
49  }
50 
57  void set_clock(base::Clock* clock) {
58  clock_ = clock;
59  }
60 
61  protected:
64  Status InitializeInternal() override { return Status::OK; }
65  Status Process(std::unique_ptr<StreamData> stream_data) override;
66  Status OnFlushRequest(size_t input_stream_index) override;
68 
69  const MuxerOptions& options() const { return options_; }
70  MuxerListener* muxer_listener() { return muxer_listener_.get(); }
71  ProgressListener* progress_listener() { return progress_listener_.get(); }
72  base::Clock* clock() { return clock_; }
73 
74  private:
75  Muxer(const Muxer&) = delete;
76  Muxer& operator=(const Muxer&) = delete;
77 
78  // Initialize the muxer. InitializeMuxer may be called multiple times with
79  // |options()| updated between calls, which is used to support separate file
80  // per Representation per Period for Ad Insertion.
81  virtual Status InitializeMuxer() = 0;
82 
83  // Final clean up.
84  virtual Status Finalize() = 0;
85 
86  // Add a new sample.
87  virtual Status AddSample(
88  size_t stream_id,
89  const MediaSample& sample) = 0;
90 
91  // Finalize the segment or subsegment.
92  virtual Status FinalizeSegment(
93  size_t stream_id,
94  const SegmentInfo& segment_info) = 0;
95 
96  // Re-initialize Muxer. Could be called on StreamInfo or CueEvent.
97  // |timestamp| may be used to set the output file name.
98  Status ReinitializeMuxer(int64_t timestamp);
99 
100  MuxerOptions options_;
101  std::vector<std::shared_ptr<const StreamInfo>> streams_;
102  std::vector<uint8_t> current_key_id_;
103  bool encryption_started_ = false;
104  bool cancelled_ = false;
105 
106  std::unique_ptr<MuxerListener> muxer_listener_;
107  std::unique_ptr<ProgressListener> progress_listener_;
108  // An external injected clock, can be NULL.
109  base::Clock* clock_ = nullptr;
110 
111  // In VOD single segment case with Ad Cues, |output_file_name| is allowed to
112  // be a template. In this case, there will be NumAdCues + 1 files generated.
113  std::string output_file_template_;
114  size_t output_file_index_ = 0;
115 };
116 
117 } // namespace media
118 } // namespace shaka
119 
120 #endif // PACKAGER_MEDIA_BASE_MUXER_H_
Status OnFlushRequest(size_t input_stream_index) override
Event handler for flush request at the specific input stream index.
Definition: muxer.cc:98
All the methods that are virtual are virtual for mocking.
This structure contains the list of configuration options for Muxer.
Definition: muxer_options.h:20
This class listens to progress updates events.
Class to hold a media sample.
Definition: media_sample.h:22
void SetProgressListener(std::unique_ptr< ProgressListener > progress_listener)
Definition: muxer.cc:39
Status InitializeInternal() override
Definition: muxer.h:64
Status Process(std::unique_ptr< StreamData > stream_data) override
Definition: muxer.cc:44
void set_clock(base::Clock *clock)
Definition: muxer.h:57
void SetMuxerListener(std::unique_ptr< MuxerListener > muxer_listener)
Definition: muxer.cc:35