60Status Muxer::Process(std::unique_ptr<StreamData> stream_data) {
62 switch (stream_data->stream_data_type) {
63 case StreamDataType::kStreamInfo:
64 streams_.push_back(std::move(stream_data->stream_info));
65 return ReinitializeMuxer(kStartTime);
66 case StreamDataType::kSegmentInfo: {
67 const auto& segment_info = *stream_data->segment_info;
68 if (muxer_listener_ && segment_info.is_encrypted) {
70 segment_info.key_rotation_encryption_config.get();
72 if (encryption_config && encryption_config->key_id != current_key_id_) {
73 muxer_listener_->OnEncryptionInfoReady(
74 !kInitialEncryptionInfo, encryption_config->protection_scheme,
75 encryption_config->key_id, encryption_config->constant_iv,
76 encryption_config->key_system_info);
77 current_key_id_ = encryption_config->key_id;
79 if (!encryption_started_) {
80 encryption_started_ =
true;
81 muxer_listener_->OnEncryptionStart();
84 return FinalizeSegment(stream_data->stream_index, segment_info);
86 case StreamDataType::kMediaSample:
87 return AddMediaSample(stream_data->stream_index,
88 *stream_data->media_sample);
89 case StreamDataType::kTextSample:
90 return AddTextSample(stream_data->stream_index,
91 *stream_data->text_sample);
92 case StreamDataType::kCueEvent:
93 if (muxer_listener_) {
94 const int64_t time_scale =
95 streams_[stream_data->stream_index]->time_scale();
96 const double time_in_seconds = stream_data->cue_event->time_in_seconds;
97 const int64_t scaled_time =
98 static_cast<int64_t
>(time_in_seconds * time_scale);
99 muxer_listener_->OnCueEvent(scaled_time,
100 stream_data->cue_event->cue_data);
103 if (!output_file_template_.empty()) {
104 RETURN_IF_ERROR(Finalize());
105 RETURN_IF_ERROR(ReinitializeMuxer(scaled_time));
110 VLOG(3) <<
"Stream data type "
111 <<
static_cast<int>(stream_data->stream_data_type) <<
" ignored.";
149 GetSegmentName(output_file_template_, timestamp, output_file_index_++,