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;