@@ -254,7 +254,8 @@ StateChangeResult GStreamerMSEMediaPlayerClient::play(int32_t sourceId)
254254 return ;
255255 }
256256
257- if (m_serverPlaybackState == firebolt::rialto::PlaybackState::PLAYING)
257+ if (m_serverPlaybackState == firebolt::rialto::PlaybackState::PLAYING ||
258+ (m_serverPlaybackState == firebolt::rialto::PlaybackState::END_OF_STREAM && wasPlayingBeforeEos))
258259 {
259260 GST_INFO (" Server is already playing" );
260261 sourceIt->second .m_state = ClientState::PLAYING;
@@ -296,7 +297,8 @@ StateChangeResult GStreamerMSEMediaPlayerClient::play(int32_t sourceId)
296297 }
297298 else
298299 {
299- GST_WARNING (" Not in PAUSED state in %u state" , static_cast <uint32_t >(m_clientState));
300+ GST_WARNING (" Not in PAUSED state in client state %u state; server playback state: %u" ,
301+ static_cast <uint32_t >(m_clientState), static_cast <uint32_t >(m_serverPlaybackState));
300302 }
301303
302304 result = StateChangeResult::SUCCESS_ASYNC;
@@ -387,9 +389,11 @@ void GStreamerMSEMediaPlayerClient::setPlaybackRate(double rate)
387389
388390void GStreamerMSEMediaPlayerClient::flush (int32_t sourceId, bool resetTime)
389391{
392+ m_flushAndDataSynchronizer.notifyFlushStarted (sourceId);
390393 m_backendQueue->callInEventLoop (
391394 [&]()
392395 {
396+ wasPlayingBeforeEos = false ;
393397 bool async{true };
394398 auto sourceIt = m_attachedSources.find (sourceId);
395399 if (sourceIt == m_attachedSources.end ())
@@ -519,6 +523,7 @@ bool GStreamerMSEMediaPlayerClient::attachSource(std::unique_ptr<firebolt::rialt
519523 m_attachedSources.emplace (source->getId (),
520524 AttachedSource (rialtoSink, bufferPuller, delegate, source->getType ()));
521525 delegate->setSourceId (source->getId ());
526+ m_flushAndDataSynchronizer.addSource (source->getId ());
522527 bufferPuller->start ();
523528 }
524529 }
@@ -566,6 +571,7 @@ void GStreamerMSEMediaPlayerClient::removeSource(int32_t sourceId)
566571 GST_WARNING (" Remove source %d failed" , sourceId);
567572 }
568573 m_attachedSources.erase (sourceId);
574+ m_flushAndDataSynchronizer.removeSource (sourceId);
569575 });
570576}
571577
@@ -575,12 +581,14 @@ void GStreamerMSEMediaPlayerClient::handlePlaybackStateChange(firebolt::rialto::
575581 m_backendQueue->callInEventLoop (
576582 [&]()
577583 {
584+ const auto kPreviousState {m_serverPlaybackState};
578585 m_serverPlaybackState = state;
579586 switch (state)
580587 {
581588 case firebolt::rialto::PlaybackState::PAUSED:
582589 case firebolt::rialto::PlaybackState::PLAYING:
583590 {
591+ wasPlayingBeforeEos = false ;
584592 if (state == firebolt::rialto::PlaybackState::PAUSED && m_clientState == ClientState::AWAITING_PAUSED)
585593 {
586594 m_clientState = ClientState::PAUSED;
@@ -616,6 +624,10 @@ void GStreamerMSEMediaPlayerClient::handlePlaybackStateChange(firebolt::rialto::
616624 }
617625 case firebolt::rialto::PlaybackState::END_OF_STREAM:
618626 {
627+ if (!wasPlayingBeforeEos && firebolt::rialto::PlaybackState::PLAYING == kPreviousState )
628+ {
629+ wasPlayingBeforeEos = true ;
630+ }
619631 for (const auto &source : m_attachedSources)
620632 {
621633 source.second .m_delegate ->handleEos ();
@@ -629,6 +641,7 @@ void GStreamerMSEMediaPlayerClient::handlePlaybackStateChange(firebolt::rialto::
629641 }
630642 case firebolt::rialto::PlaybackState::FAILURE:
631643 {
644+ wasPlayingBeforeEos = false ;
632645 for (const auto &source : m_attachedSources)
633646 {
634647 source.second .m_delegate ->handleError (" Rialto server playback failed" );
@@ -669,6 +682,7 @@ void GStreamerMSEMediaPlayerClient::handleSourceFlushed(int32_t sourceId)
669682 }
670683 sourceIt->second .m_isFlushing = false ;
671684 sourceIt->second .m_delegate ->handleFlushCompleted ();
685+ m_flushAndDataSynchronizer.notifyFlushCompleted (sourceId);
672686 });
673687}
674688
@@ -925,6 +939,11 @@ bool GStreamerMSEMediaPlayerClient::switchSource(const std::unique_ptr<firebolt:
925939 return result;
926940}
927941
942+ IFlushAndDataSynchronizer &GStreamerMSEMediaPlayerClient::getFlushAndDataSynchronizer ()
943+ {
944+ return m_flushAndDataSynchronizer;
945+ }
946+
928947bool GStreamerMSEMediaPlayerClient::checkIfAllAttachedSourcesInStates (const std::vector<ClientState> &states)
929948{
930949 return std::all_of (m_attachedSources.begin (), m_attachedSources.end (), [states](const auto &source)
@@ -1177,6 +1196,11 @@ void PullBufferMessage::handle()
11771196 status = firebolt::rialto::MediaSourceStatus::NO_AVAILABLE_SAMPLES;
11781197 }
11791198
1199+ if (firebolt::rialto::MediaSourceStatus::OK == status || firebolt::rialto::MediaSourceStatus::EOS == status)
1200+ {
1201+ m_player->getFlushAndDataSynchronizer ().notifyDataPushed (m_sourceId);
1202+ }
1203+
11801204 m_player->m_backendQueue ->postMessage (
11811205 std::make_shared<HaveDataMessage>(status, m_sourceId, m_needDataRequestId, m_player));
11821206}
0 commit comments