Improve forced stop
Change-Id: Ic7e7382850b0bce08a97aff4efba087a4bc94a97
diff --git a/src/third_party/starboard/rdk/shared/player/player_internal.cc b/src/third_party/starboard/rdk/shared/player/player_internal.cc
index b026a0b..297a6ec 100644
--- a/src/third_party/starboard/rdk/shared/player/player_internal.cc
+++ b/src/third_party/starboard/rdk/shared/player/player_internal.cc
@@ -1041,6 +1041,7 @@
mutable SbTime position_update_time_us_{0};
PendingBounds pending_bounds_;
SbMediaColorMetadata color_metadata_{};
+ bool force_stop_ { false };
};
PlayerImpl::PlayerImpl(SbPlayer player,
@@ -1177,7 +1178,14 @@
const GstStructure* structure = gst_message_get_structure(message);
if (gst_structure_has_name(structure, "force-stop")) {
GST_INFO("Received Force STOP!!!");
- self->ChangePipelineState(GST_STATE_NULL);
+ self->force_stop_ = true;
+ self->ChangePipelineState(GST_STATE_READY);
+ g_signal_handlers_disconnect_by_func(self->pipeline_, reinterpret_cast<gpointer>(&PlayerImpl::SetupSource), self);
+ ::starboard::ScopedLock lock(self->source_setup_mutex_);
+ if (self->source_setup_id_ > -1) {
+ GSource* src = g_main_context_find_source_by_id(self->main_loop_context_, self->source_setup_id_);
+ g_source_destroy(src);
+ }
}
break;
}
@@ -1968,6 +1976,10 @@
}
bool PlayerImpl::ChangePipelineState(GstState state) const {
+ if (force_stop_ && state > GST_STATE_READY) {
+ GST_INFO_OBJECT(pipeline_, "Ignore state change due to forced stop");
+ return false;
+ }
GST_DEBUG_OBJECT(pipeline_, "Changing state to %s",
gst_element_state_get_name(state));
return gst_element_set_state(pipeline_, state) != GST_STATE_CHANGE_FAILURE;