Skip to content

Commit 40aeeca

Browse files
Disable synchronous play in RialtoServer as it caused some race conditions (#501)
Summary: Disable synchronous play in RialtoServer as it caused some race conditions Type: Fix Test Plan: UT/CT, Fullstack Jira: RDKEMW-18286 Co-authored-by: Marcin Wojciechowski <105790697+skywojciechowskim@users.noreply.github.com>
1 parent ae413b0 commit 40aeeca

7 files changed

Lines changed: 6 additions & 62 deletions

File tree

media/server/gstplayer/include/GstGenericPlayer.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -481,11 +481,6 @@ class GstGenericPlayer : public IGstGenericPlayer, public IGstGenericPlayerPriva
481481
* @brief The object used to check flushing state for all sources
482482
*/
483483
std::unique_ptr<IFlushWatcher> m_flushWatcher;
484-
485-
/**
486-
* @brief The ongoing state change operations counter
487-
*/
488-
std::atomic<uint32_t> m_ongoingStateChangesNumber{0};
489484
};
490485

491486
} // namespace firebolt::rialto::server

media/server/gstplayer/source/GstGenericPlayer.cpp

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1659,30 +1659,15 @@ void GstGenericPlayer::cancelUnderflow(firebolt::rialto::MediaSourceType mediaSo
16591659

16601660
void GstGenericPlayer::play(bool &async)
16611661
{
1662-
if (0 == m_ongoingStateChangesNumber)
1663-
{
1664-
// Operation called on main thread, because PAUSED->PLAYING change is synchronous and needs to be done fast.
1665-
//
1666-
// m_context.pipeline can be used, because it's modified only in GstGenericPlayer
1667-
// constructor and destructor. GstGenericPlayer is created/destructed on main thread, so we won't have a crash here.
1668-
++m_ongoingStateChangesNumber;
1669-
async = (changePipelineState(GST_STATE_PLAYING) == GST_STATE_CHANGE_ASYNC);
1670-
RIALTO_SERVER_LOG_MIL("State change to PLAYING requested");
1671-
}
1672-
else
1662+
async = true;
1663+
if (m_workerThread)
16731664
{
1674-
++m_ongoingStateChangesNumber;
1675-
async = true;
1676-
if (m_workerThread)
1677-
{
1678-
m_workerThread->enqueueTask(m_taskFactory->createPlay(*this));
1679-
}
1665+
m_workerThread->enqueueTask(m_taskFactory->createPlay(*this));
16801666
}
16811667
}
16821668

16831669
void GstGenericPlayer::pause()
16841670
{
1685-
++m_ongoingStateChangesNumber;
16861671
if (m_workerThread)
16871672
{
16881673
m_workerThread->enqueueTask(m_taskFactory->createPause(m_context, *this));
@@ -1691,7 +1676,6 @@ void GstGenericPlayer::pause()
16911676

16921677
void GstGenericPlayer::stop()
16931678
{
1694-
++m_ongoingStateChangesNumber;
16951679
if (m_workerThread)
16961680
{
16971681
m_workerThread->enqueueTask(m_taskFactory->createStop(m_context, *this));
@@ -1705,7 +1689,6 @@ GstStateChangeReturn GstGenericPlayer::changePipelineState(GstState newState)
17051689
RIALTO_SERVER_LOG_ERROR("Change state failed - pipeline is nullptr");
17061690
if (m_gstPlayerClient)
17071691
m_gstPlayerClient->notifyPlaybackState(PlaybackState::FAILURE);
1708-
--m_ongoingStateChangesNumber;
17091692
return GST_STATE_CHANGE_FAILURE;
17101693
}
17111694
m_context.flushOnPrerollController->setTargetState(newState);
@@ -1716,7 +1699,6 @@ GstStateChangeReturn GstGenericPlayer::changePipelineState(GstState newState)
17161699
if (m_gstPlayerClient)
17171700
m_gstPlayerClient->notifyPlaybackState(PlaybackState::FAILURE);
17181701
}
1719-
--m_ongoingStateChangesNumber;
17201702
return result;
17211703
}
17221704

media/server/main/source/MediaPipelineServerInternal.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ bool MediaPipelineServerInternal::play(bool &async)
341341
bool result;
342342
auto task = [&]() { result = playInternal(async); };
343343

344-
m_mainThread->enqueuePriorityTaskAndWait(m_mainThreadClientId, task);
344+
m_mainThread->enqueueTaskAndWait(m_mainThreadClientId, task);
345345
return result;
346346
}
347347

tests/unittests/media/server/gstplayer/genericPlayer/GstGenericPlayerTest.cpp

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -157,15 +157,6 @@ TEST_F(GstGenericPlayerTest, shouldAllSourcesAttached)
157157

158158
TEST_F(GstGenericPlayerTest, shouldPlayOnWorkerThread)
159159
{
160-
// Pause first
161-
std::unique_ptr<IPlayerTask> pauseTask{std::make_unique<StrictMock<PlayerTaskMock>>()};
162-
EXPECT_CALL(dynamic_cast<StrictMock<PlayerTaskMock> &>(*pauseTask), execute());
163-
EXPECT_CALL(m_taskFactoryMock, createPause(_, _)).WillOnce(Return(ByMove(std::move(pauseTask))));
164-
165-
m_sut->pause();
166-
167-
// ...
168-
169160
bool async = false;
170161
std::unique_ptr<IPlayerTask> task{std::make_unique<StrictMock<PlayerTaskMock>>()};
171162
EXPECT_CALL(dynamic_cast<StrictMock<PlayerTaskMock> &>(*task), execute());
@@ -175,22 +166,6 @@ TEST_F(GstGenericPlayerTest, shouldPlayOnWorkerThread)
175166
EXPECT_TRUE(async);
176167
}
177168

178-
TEST_F(GstGenericPlayerTest, shouldPlayImmediatelySynchronously)
179-
{
180-
bool async = false;
181-
EXPECT_CALL(*m_gstWrapperMock, gstElementSetState(_, GST_STATE_PLAYING)).WillOnce(Return(GST_STATE_CHANGE_SUCCESS));
182-
m_sut->play(async);
183-
EXPECT_FALSE(async);
184-
}
185-
186-
TEST_F(GstGenericPlayerTest, shouldPlayImmediatelyAsynchronously)
187-
{
188-
bool async = false;
189-
EXPECT_CALL(*m_gstWrapperMock, gstElementSetState(_, GST_STATE_PLAYING)).WillOnce(Return(GST_STATE_CHANGE_ASYNC));
190-
m_sut->play(async);
191-
EXPECT_TRUE(async);
192-
}
193-
194169
TEST_F(GstGenericPlayerTest, shouldPause)
195170
{
196171
std::unique_ptr<IPlayerTask> task{std::make_unique<StrictMock<PlayerTaskMock>>()};

tests/unittests/media/server/main/mediaPipeline/MiscellaneousFunctionsTest.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ TEST_F(RialtoServerMediaPipelineMiscellaneousFunctionsTest, PlaySuccess)
4545
{
4646
bool async{false};
4747
loadGstPlayer();
48-
mainThreadWillEnqueuePriorityTaskAndWait();
48+
mainThreadWillEnqueueTaskAndWait();
4949

5050
EXPECT_CALL(*m_gstPlayerMock, play(_));
5151
EXPECT_TRUE(m_mediaPipeline->play(async));
@@ -57,7 +57,7 @@ TEST_F(RialtoServerMediaPipelineMiscellaneousFunctionsTest, PlaySuccess)
5757
TEST_F(RialtoServerMediaPipelineMiscellaneousFunctionsTest, PlayFailureDueToUninitializedPlayer)
5858
{
5959
bool async{false};
60-
mainThreadWillEnqueuePriorityTaskAndWait();
60+
mainThreadWillEnqueueTaskAndWait();
6161
EXPECT_FALSE(m_mediaPipeline->play(async));
6262
}
6363

tests/unittests/media/server/main/mediaPipeline/base/MediaPipelineTestBase.cpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,6 @@ void MediaPipelineTestBase::mainThreadWillEnqueueTaskAndWait()
8282
.RetiresOnSaturation();
8383
}
8484

85-
void MediaPipelineTestBase::mainThreadWillEnqueuePriorityTaskAndWait()
86-
{
87-
EXPECT_CALL(*m_mainThreadMock, enqueuePriorityTaskAndWait(m_kMainThreadClientId, _))
88-
.WillOnce(Invoke([](uint32_t clientId, firebolt::rialto::server::IMainThread::Task task) { task(); }))
89-
.RetiresOnSaturation();
90-
}
91-
9285
void MediaPipelineTestBase::loadGstPlayer()
9386
{
9487
mainThreadWillEnqueueTaskAndWait();

tests/unittests/media/server/main/mediaPipeline/base/MediaPipelineTestBase.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@ class MediaPipelineTestBase : public ::testing::Test
9090
void destroyMediaPipeline();
9191
void mainThreadWillEnqueueTask();
9292
void mainThreadWillEnqueueTaskAndWait();
93-
void mainThreadWillEnqueuePriorityTaskAndWait();
9493
void loadGstPlayer();
9594
int attachSource(MediaSourceType sourceType, const std::string &mimeType);
9695
void setEos(MediaSourceType sourceType);

0 commit comments

Comments
 (0)