7 #ifndef PACKAGER_MEDIA_BASE_MEDIA_HANDLER_H_
8 #define PACKAGER_MEDIA_BASE_MEDIA_HANDLER_H_
14 #include <packager/media/base/media_sample.h>
15 #include <packager/media/base/stream_info.h>
16 #include <packager/media/base/text_sample.h>
17 #include <packager/status.h>
22 enum class StreamDataType {
32 std::string StreamDataTypeToString(StreamDataType type);
40 double start_time_in_seconds = 0;
41 double duration_in_seconds = 0;
45 enum class CueEventType { kCueIn, kCueOut, kCuePoint };
50 CueEventType type = CueEventType::kCuePoint;
51 double time_in_seconds;
56 bool is_subsegment =
false;
57 bool is_chunk =
false;
58 bool is_final_chunk_in_seg =
false;
59 bool is_encrypted =
false;
60 int64_t start_timestamp = -1;
62 int64_t segment_number = 1;
66 std::shared_ptr<EncryptionConfig> key_rotation_encryption_config;
71 size_t stream_index =
static_cast<size_t>(-1);
72 StreamDataType stream_data_type = StreamDataType::kUnknown;
74 std::shared_ptr<const StreamInfo> stream_info;
75 std::shared_ptr<const MediaSample> media_sample;
76 std::shared_ptr<const TextSample> text_sample;
77 std::shared_ptr<const SegmentInfo> segment_info;
78 std::shared_ptr<const Scte35Event> scte35_event;
79 std::shared_ptr<const CueEvent> cue_event;
81 static std::unique_ptr<StreamData> FromStreamInfo(
83 std::shared_ptr<const StreamInfo> stream_info) {
84 std::unique_ptr<StreamData> stream_data(
new StreamData);
85 stream_data->stream_index = stream_index;
86 stream_data->stream_data_type = StreamDataType::kStreamInfo;
87 stream_data->stream_info = std::move(stream_info);
91 static std::unique_ptr<StreamData> FromMediaSample(
93 std::shared_ptr<const MediaSample> media_sample) {
94 std::unique_ptr<StreamData> stream_data(
new StreamData);
95 stream_data->stream_index = stream_index;
96 stream_data->stream_data_type = StreamDataType::kMediaSample;
97 stream_data->media_sample = std::move(media_sample);
101 static std::unique_ptr<StreamData> FromTextSample(
103 std::shared_ptr<const TextSample> text_sample) {
104 std::unique_ptr<StreamData> stream_data(
new StreamData);
105 stream_data->stream_index = stream_index;
106 stream_data->stream_data_type = StreamDataType::kTextSample;
107 stream_data->text_sample = std::move(text_sample);
111 static std::unique_ptr<StreamData> FromSegmentInfo(
113 std::shared_ptr<const SegmentInfo> segment_info) {
114 std::unique_ptr<StreamData> stream_data(
new StreamData);
115 stream_data->stream_index = stream_index;
116 stream_data->stream_data_type = StreamDataType::kSegmentInfo;
117 stream_data->segment_info = std::move(segment_info);
121 static std::unique_ptr<StreamData> FromScte35Event(
123 std::shared_ptr<const Scte35Event> scte35_event) {
124 std::unique_ptr<StreamData> stream_data(
new StreamData);
125 stream_data->stream_index = stream_index;
126 stream_data->stream_data_type = StreamDataType::kScte35Event;
127 stream_data->scte35_event = std::move(scte35_event);
131 static std::unique_ptr<StreamData> FromCueEvent(
133 std::shared_ptr<const CueEvent> cue_event) {
134 std::unique_ptr<StreamData> stream_data(
new StreamData);
135 stream_data->stream_index = stream_index;
136 stream_data->stream_data_type = StreamDataType::kCueEvent;
137 stream_data->cue_event = std::move(cue_event);
164 std::shared_ptr<MediaHandler> handler);
168 return SetHandler(next_output_stream_index_, handler);
178 static Status Chain(
const std::vector<std::shared_ptr<MediaHandler>>& list);
189 virtual Status
Process(std::unique_ptr<StreamData> stream_data) = 0;
199 Status
Dispatch(std::unique_ptr<StreamData> stream_data)
const;
204 std::shared_ptr<const StreamInfo> stream_info)
const {
206 StreamData::FromStreamInfo(stream_index, std::move(stream_info)));
212 std::shared_ptr<const MediaSample> media_sample)
const {
214 StreamData::FromMediaSample(stream_index, std::move(media_sample)));
221 std::shared_ptr<const TextSample> text_sample)
const {
223 StreamData::FromTextSample(stream_index, std::move(text_sample)));
229 std::shared_ptr<const SegmentInfo> segment_info)
const {
231 StreamData::FromSegmentInfo(stream_index, std::move(segment_info)));
237 std::shared_ptr<const Scte35Event> scte35_event)
const {
239 StreamData::FromScte35Event(stream_index, std::move(scte35_event)));
244 std::shared_ptr<const CueEvent> cue_event)
const {
246 StreamData::FromCueEvent(stream_index, std::move(cue_event)));
255 bool initialized() {
return initialized_; }
256 size_t num_input_streams()
const {
return num_input_streams_; }
257 size_t next_output_stream_index()
const {
return next_output_stream_index_; }
258 const std::map<size_t, std::pair<std::shared_ptr<MediaHandler>,
size_t>>&
260 return output_handlers_;
264 MediaHandler(
const MediaHandler&) =
delete;
265 MediaHandler& operator=(
const MediaHandler&) =
delete;
267 bool initialized_ =
false;
269 size_t num_input_streams_ = 0;
271 size_t next_output_stream_index_ = 0;
274 std::map<size_t, std::pair<std::shared_ptr<MediaHandler>,
size_t>>
All the methods that are virtual are virtual for mocking.