Improve handling on NoInput test cases Change-Id: Ia2ceb07c42aa6b73ffa6d6e96ef1b3464e586e3a 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 6a6ff4a..9c792c2 100644 --- a/src/third_party/starboard/rdk/shared/player/player_internal.cc +++ b/src/third_party/starboard/rdk/shared/player/player_internal.cc
@@ -1104,6 +1104,7 @@ kInitialPreroll, kPrerollAfterSeek, kPresenting, + kEnded, }; static const char* PrivatePlayerStateToStr(State state) { @@ -1261,6 +1262,7 @@ void SchedulePlayingStateUpdate(); void AddBufferingProbe(GstClockTime target, int ticket); void HandleInititialSeek(::starboard::ScopedLock&); + void DidEnd(); SbPlayer player_; SbWindow window_; @@ -1572,9 +1574,7 @@ case GST_MESSAGE_EOS: if (GST_MESSAGE_SRC(message) == GST_OBJECT(self->pipeline_)) { GST_INFO("EOS"); - self->DispatchOnWorkerThread(new PlayerStatusTask( - self->player_status_func_, self->player_, self->ticket_, - self->context_, kSbPlayerStateEndOfStream)); + self->DidEnd(); } break; @@ -1596,15 +1596,7 @@ if (err->domain == GST_STREAM_ERROR && is_eos) { GST_WARNING("Got stream error. But all streams are ended, so reporting EOS. Error code %d: %s (%s).", err->code, err->message, debug); - if (self->state_ < State::kPresenting) { - self->DispatchOnWorkerThread(new PlayerStatusTask( - self->player_status_func_, self->player_, self->ticket_, - self->context_, kSbPlayerStatePresenting)); - self->state_ = State::kPresenting; - } - self->DispatchOnWorkerThread(new PlayerStatusTask( - self->player_status_func_, self->player_, self->ticket_, - self->context_, kSbPlayerStateEndOfStream)); + self->DidEnd(); } else { GST_ERROR("Error %d: %s (%s)", err->code, err->message, debug); self->DispatchOnWorkerThread(new PlayerErrorTask( @@ -1990,8 +1982,14 @@ else eos_data_ |= static_cast<int>(MediaType::kAudio); - gst_app_src_end_of_stream(GST_APP_SRC(src)); RecordTimestamp(stream_type, kSbTimeMax); + + if (eos_data_ == static_cast<int>(GetBothMediaTypeTakingCodecsIntoAccount())) { + if (audio_codec_ != kSbMediaAudioCodecNone) + gst_app_src_end_of_stream(GST_APP_SRC(audio_appsrc_)); + if (video_codec_ != kSbMediaVideoCodecNone) + gst_app_src_end_of_stream(GST_APP_SRC(video_appsrc_)); + } } bool PlayerImpl::WriteSample(SbMediaType sample_type, GstBuffer* buffer, uint64_t serial_id) { @@ -3031,6 +3029,24 @@ g_source_unref(src); } +void PlayerImpl::DidEnd() { + if (state_ < State::kPresenting) { + DispatchOnWorkerThread( + new PlayerStatusTask( + player_status_func_, player_, ticket_, + context_, kSbPlayerStatePresenting)); + state_ = State::kPresenting; + } + + if (state_ == State::kPresenting) { + DispatchOnWorkerThread( + new PlayerStatusTask( + player_status_func_, player_, ticket_, + context_, kSbPlayerStateEndOfStream)); + state_ = State::kEnded; + } +} + } // namespace void ForceStop() {