if (state_ == State::kStopped) return false;
if (!pipeline_) return false;
- uint64_t curtime_in_msec = 0;
-
- GetPlayingTime_(&curtime_in_msec);
-
TRACKRENDERER_INFO("Set audio mute property as [%d], rate [%lf]", audio_mute,
playback_rate);
- auto is_audio_track = [](const Track& item) noexcept -> bool {
- return item.mimetype.find("audio") != std::string::npos;
- };
- auto target = find_if(trackinfo_.begin(), trackinfo_.end(), is_audio_track);
- if (target != trackinfo_.end())
- pipeline_->SetProperty(Elements::kSinkAudio, "mute", audio_mute);
- Elements audio_probe_element = Elements::kDecAudio;
- Elements video_probe_element = Elements::kDecVideo;
- Elements subtitle_probe_element = Elements::kAppSrcSubtitle;
- Elements close_caption_probe_element = Elements::kQueueCaption;
-
- std::map<Elements, std::pair<std::string, std::string>> probe_map = {
- {audio_probe_element,
- {"AUDIO_RATE_IDLE_PROBE", "AUDIO_RATE_BLOCK_PROBE"}},
- {video_probe_element,
- {"VIDEO_RATE_IDLE_PROBE", "VIDEO_RATE_BLOCK_PROBE"}},
- {subtitle_probe_element,
- {"SUBTITLE_RATE_IDLE_PROBE", "SUBTITLE_RATE_BLOCK_PROBE"}},
- {close_caption_probe_element,
- {"CLOSE_CAPTION_RATE_IDLE_PROBE", "CLOSE_CAPTION_RATE_BLOCK_PROBE"}}};
-
- std::map<Elements, Elements> probe_sink_map = {
- {audio_probe_element, Elements::kSinkAudio},
- {video_probe_element, Elements::kSinkVideo},
- {subtitle_probe_element, Elements::kSinkSubtitle},
- {close_caption_probe_element, Elements::kSinkCaption}};
-
- for (auto& kv : probe_map) {
- const Elements& element = kv.first;
- std::pair<std::string, std::string>& probe = kv.second;
- pipeline_->PadAddProbe(element, (probe.second).c_str(), "src",
- GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM, nullptr,
- nullptr, nullptr);
- gboolean is_sync = FALSE;
- pipeline_->GetProperty(probe_sink_map[element], "sync", &is_sync);
- pipeline_->SetProperty(probe_sink_map[element], "sync", FALSE);
- FlushDownStream_(element, (probe.first).c_str(), TRUE);
- if (is_sync) pipeline_->SetProperty(probe_sink_map[element], "sync", TRUE);
- }
+ if (find_if(trackinfo_.begin(), trackinfo_.end(),
+ [](const Track& item) {
+ return item.mimetype.find("audio") != std::string::npos;
+ }) != trackinfo_.end())
+ pipeline_->SetProperty(Elements::kSinkAudio, "mute", audio_mute);
- TRACKRENDERER_INFO("target %" PRIu64 " ms rate [%lf] mute [%d]", curtime_in_msec,
- playback_rate, audio_mute);
+ std::vector<Elements> targetElements {
+ Elements::kDecAudio,
+ Elements::kDecVideo,
+ Elements::kAppSrcSubtitle,
+ Elements::kQueueCaption
+ };
- for (auto& kv : probe_map) {
- const Elements& element = kv.first;
- std::pair<std::string, std::string>& probe = kv.second;
- pipeline_->PushSegmentEvent(element, curtime_in_msec * GST_MSECOND,
- playback_rate);
- pipeline_->PadRemoveProbe((probe.second).c_str());
+ for (const auto& element : targetElements) {
+ pipeline_->PushInstantRateChangeEvent(element, playback_rate,
+ (GstSegmentFlags)GST_SEGMENT_INSTANT_FLAGS);
}
playback_rate_ = playback_rate;