Don't send repeated 'needs data' decoder status

This could happen after seek triggered after underflow

Change-Id: I94837f7f4f37cd94becaa52d262d85000aca006b
Signed-off-by: Eugene Mutavchi <Ievgen_Mutavchi@comcast.com>
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 da90974..dca2160 100644
--- a/src/third_party/starboard/rdk/shared/player/player_internal.cc
+++ b/src/third_party/starboard/rdk/shared/player/player_internal.cc
@@ -1098,6 +1098,19 @@
     kPresenting,
   };
 
+  static const char* PrivatePlayerStateToStr(State state) {
+#define CASE(x) case x: return #x
+    switch(state) {
+        CASE(State::kNull);
+        CASE(State::kInitial);
+        CASE(State::kInitialPreroll);
+        CASE(State::kPrerollAfterSeek);
+        CASE(State::kPresenting);
+    }
+#undef CASE
+    return "unknown";
+  }
+
   enum MediaTimestampIndex {
     kAudioIndex,
     kVideoIndex,
@@ -1215,19 +1228,22 @@
   SbTime MinTimestamp(MediaType* origin) const;
 
   void DecoderNeedsData(::starboard::ScopedLock&, MediaType media) const {
-    int need_data = static_cast<int>(media);
-    if (media != MediaType::kNone && (decoder_state_data_ & need_data) == need_data) {
-      GST_LOG("Already sent 'kSbPlayerDecoderStateNeedsData', ignoring new request");
+    SB_DCHECK(media != MediaType::kNone);
+
+    int need_data = static_cast<int>(media) & ~decoder_state_data_;
+    if (need_data == 0) {
+      GST_LOG("Already sent 'kSbPlayerDecoderStateNeedsData' for media type: %d, ignoring new request", media);
       return;
     }
-    if (media != MediaType::kNone && (eos_data_ & need_data) == need_data) {
+    if ((eos_data_ & need_data) == need_data) {
       GST_LOG("Stream(%d) already ended, ignoring needs data request", need_data);
       return;
     }
+
     decoder_state_data_ |= need_data;
     DispatchOnWorkerThread(new DecoderStatusTask(
       decoder_status_func_, player_, ticket_, context_,
-      kSbPlayerDecoderStateNeedsData, media));
+      kSbPlayerDecoderStateNeedsData, static_cast<MediaType>(need_data)));
   }
 
   void HandleApplicationMessage(GstBus* bus, GstMessage* message);
@@ -1665,9 +1681,9 @@
 
     case GST_MESSAGE_ASYNC_DONE: {
       if (GST_MESSAGE_SRC(message) == GST_OBJECT(self->pipeline_)) {
-        GST_INFO("===> ASYNC-DONE %s %d",
+        GST_INFO("===> ASYNC-DONE, pipeline state: %s, player state: %s",
                  gst_element_state_get_name(GST_STATE(self->pipeline_)),
-                 static_cast<int>(self->state_));
+                 PrivatePlayerStateToStr(self->state_));
 
         ::starboard::Mutex &mutex = self->mutex_;
         ::starboard::ScopedLock lock(mutex);