From ce1e9e58f828e2e485f6949005ff16e8d72c42b1 Mon Sep 17 00:00:00 2001 From: Adam Czynszak <92790185+aczs@users.noreply.github.com> Date: Wed, 14 Jan 2026 15:14:55 +0000 Subject: [PATCH 1/3] Fixed playback info reporting for not asynchronous playbacks (#435) Summary: Fixed playback info reporting for not asynchronous playbacks Type: Fix Test Plan: UT/CT, Fullstack Jira: ENTDAI-2231 --- .../gstplayer/include/GstGenericPlayer.h | 2 + .../include/IGstGenericPlayerPrivate.h | 10 ++++ .../gstplayer/source/GstGenericPlayer.cpp | 26 +++++--- .../gstplayer/source/tasks/generic/Flush.cpp | 1 - .../source/tasks/generic/HandleBusMessage.cpp | 8 ++- .../gstplayer/source/tasks/generic/Stop.cpp | 1 + .../server/fixtures/MediaPipelineTest.cpp | 29 +++++++-- .../server/fixtures/MediaPipelineTest.h | 3 + .../server/tests/mediaPipeline/FlushTest.cpp | 11 +--- .../GstGenericPlayerPrivateTest.cpp | 59 +++++++++++++++---- .../common/GenericTasksTestsBase.cpp | 9 ++- .../common/GenericTasksTestsBase.h | 1 + .../tasksTests/HandleBusMessageTest.cpp | 12 +++- .../gstplayer/GstGenericPlayerPrivateMock.h | 2 + 14 files changed, 132 insertions(+), 42 deletions(-) diff --git a/media/server/gstplayer/include/GstGenericPlayer.h b/media/server/gstplayer/include/GstGenericPlayer.h index b094039e5..98a516cfa 100644 --- a/media/server/gstplayer/include/GstGenericPlayer.h +++ b/media/server/gstplayer/include/GstGenericPlayer.h @@ -174,6 +174,8 @@ class GstGenericPlayer : public IGstGenericPlayer, public IGstGenericPlayerPriva int64_t getPosition(GstElement *element) override; void startPositionReportingAndCheckAudioUnderflowTimer() override; void stopPositionReportingAndCheckAudioUnderflowTimer() override; + void startNotifyPlaybackInfoTimer() override; + void stopNotifyPlaybackInfoTimer() override; void startSubtitleClockResyncTimer() override; void stopSubtitleClockResyncTimer() override; void stopWorkerThread() override; diff --git a/media/server/gstplayer/include/IGstGenericPlayerPrivate.h b/media/server/gstplayer/include/IGstGenericPlayerPrivate.h index ff6edc74f..5480ad40b 100644 --- a/media/server/gstplayer/include/IGstGenericPlayerPrivate.h +++ b/media/server/gstplayer/include/IGstGenericPlayerPrivate.h @@ -202,6 +202,16 @@ class IGstGenericPlayerPrivate */ virtual void stopPositionReportingAndCheckAudioUnderflowTimer() = 0; + /** + * @brief Starts notify playback info timer. Called by the worker thread. + */ + virtual void startNotifyPlaybackInfoTimer() = 0; + + /** + * @brief Stops notify playback info timer. Called by the worker thread. + */ + virtual void stopNotifyPlaybackInfoTimer() = 0; + /** * @brief Starts subtitle clock resync. Called by the worker thread. */ diff --git a/media/server/gstplayer/source/GstGenericPlayer.cpp b/media/server/gstplayer/source/GstGenericPlayer.cpp index f04e9a172..8d2a28a5b 100644 --- a/media/server/gstplayer/source/GstGenericPlayer.cpp +++ b/media/server/gstplayer/source/GstGenericPlayer.cpp @@ -427,7 +427,6 @@ bool GstGenericPlayer::getPosition(std::int64_t &position) position = getPosition(m_context.pipeline); if (position == -1) { - RIALTO_SERVER_LOG_WARN("Query position failed"); return false; } @@ -2214,7 +2213,6 @@ bool GstGenericPlayer::setErmContext() void GstGenericPlayer::startPositionReportingAndCheckAudioUnderflowTimer() { - static constexpr std::chrono::milliseconds kPlaybackInfoTimerMs{32}; if (m_positionReportingAndCheckAudioUnderflowTimer && m_positionReportingAndCheckAudioUnderflowTimer->isActive()) { return; @@ -2231,12 +2229,6 @@ void GstGenericPlayer::startPositionReportingAndCheckAudioUnderflowTimer() } }, firebolt::rialto::common::TimerType::PERIODIC); - - notifyPlaybackInfo(); - - m_playbackInfoTimer = - m_timerFactory - ->createTimer(kPlaybackInfoTimerMs, [this]() { notifyPlaybackInfo(); }, firebolt::rialto::common::TimerType::PERIODIC); } void GstGenericPlayer::stopPositionReportingAndCheckAudioUnderflowTimer() @@ -2246,7 +2238,25 @@ void GstGenericPlayer::stopPositionReportingAndCheckAudioUnderflowTimer() m_positionReportingAndCheckAudioUnderflowTimer->cancel(); m_positionReportingAndCheckAudioUnderflowTimer.reset(); } +} +void GstGenericPlayer::startNotifyPlaybackInfoTimer() +{ + static constexpr std::chrono::milliseconds kPlaybackInfoTimerMs{32}; + if (m_playbackInfoTimer && m_playbackInfoTimer->isActive()) + { + return; + } + + notifyPlaybackInfo(); + + m_playbackInfoTimer = + m_timerFactory + ->createTimer(kPlaybackInfoTimerMs, [this]() { notifyPlaybackInfo(); }, firebolt::rialto::common::TimerType::PERIODIC); +} + +void GstGenericPlayer::stopNotifyPlaybackInfoTimer() +{ if (m_playbackInfoTimer && m_playbackInfoTimer->isActive()) { m_playbackInfoTimer->cancel(); diff --git a/media/server/gstplayer/source/tasks/generic/Flush.cpp b/media/server/gstplayer/source/tasks/generic/Flush.cpp index bca3d4418..225c06b04 100644 --- a/media/server/gstplayer/source/tasks/generic/Flush.cpp +++ b/media/server/gstplayer/source/tasks/generic/Flush.cpp @@ -76,7 +76,6 @@ void Flush::execute() const if (GST_STATE(m_context.pipeline) >= GST_STATE_PAUSED) { - m_player.stopPositionReportingAndCheckAudioUnderflowTimer(); m_context.flushOnPrerollController->waitIfRequired(m_type); RIALTO_SERVER_LOG_MIL("Sending flush event for %s source.", common::convertMediaSourceType(m_type)); diff --git a/media/server/gstplayer/source/tasks/generic/HandleBusMessage.cpp b/media/server/gstplayer/source/tasks/generic/HandleBusMessage.cpp index 69d1bb1d1..ce00a0f4c 100644 --- a/media/server/gstplayer/source/tasks/generic/HandleBusMessage.cpp +++ b/media/server/gstplayer/source/tasks/generic/HandleBusMessage.cpp @@ -76,6 +76,8 @@ void HandleBusMessage::execute() const } case GST_STATE_PAUSED: { + m_player.startNotifyPlaybackInfoTimer(); + m_player.stopPositionReportingAndCheckAudioUnderflowTimer(); if (pending != GST_STATE_PAUSED) { // If async flush was requested before HandleBusMessage task creation (but it was not executed yet) @@ -91,8 +93,8 @@ void HandleBusMessage::execute() const // Subsequent newState==GST_STATE_PAUSED, pending!=GST_STATE_PAUSED transition will // indicate that the pipeline is prerolled and it reached GST_STATE_PAUSED state after seek. m_gstPlayerClient->notifyPlaybackState(PlaybackState::PAUSED); - m_player.notifyPlaybackInfo(); } + if (m_player.hasSourceType(MediaSourceType::SUBTITLE)) { m_player.stopSubtitleClockResyncTimer(); @@ -124,8 +126,12 @@ void HandleBusMessage::execute() const break; } case GST_STATE_VOID_PENDING: + { + break; + } case GST_STATE_READY: { + m_player.stopNotifyPlaybackInfoTimer(); break; } } diff --git a/media/server/gstplayer/source/tasks/generic/Stop.cpp b/media/server/gstplayer/source/tasks/generic/Stop.cpp index 3f82478b5..bc566d6a7 100644 --- a/media/server/gstplayer/source/tasks/generic/Stop.cpp +++ b/media/server/gstplayer/source/tasks/generic/Stop.cpp @@ -38,6 +38,7 @@ void Stop::execute() const { RIALTO_SERVER_LOG_DEBUG("Executing Stop"); m_player.stopPositionReportingAndCheckAudioUnderflowTimer(); + m_player.stopNotifyPlaybackInfoTimer(); m_player.changePipelineState(GST_STATE_NULL); for (auto &streamInfo : m_context.streamInfo) { diff --git a/tests/componenttests/server/fixtures/MediaPipelineTest.cpp b/tests/componenttests/server/fixtures/MediaPipelineTest.cpp index 32547126a..fbaf5d87b 100644 --- a/tests/componenttests/server/fixtures/MediaPipelineTest.cpp +++ b/tests/componenttests/server/fixtures/MediaPipelineTest.cpp @@ -67,6 +67,7 @@ MediaPipelineTest::MediaPipelineTest() MediaPipelineTest::~MediaPipelineTest() { positionUpdatesShouldNotBeReceivedFromNow(); + playbackInfoUpdatesShouldNotBeReceivedFromNow(); } void MediaPipelineTest::gstPlayerWillBeCreated() @@ -109,7 +110,14 @@ void MediaPipelineTest::gstPlayerWillBeCreated() return true; })); - EXPECT_CALL(*m_glibWrapperMock, gObjectGetStub(_, StrEq("audio-sink"), _)).Times(AtLeast(0)); + EXPECT_CALL(*m_glibWrapperMock, gObjectGetStub(_, StrEq("audio-sink"), _)) + .WillRepeatedly(Invoke( + [&](gpointer object, const gchar *first_property_name, void *element) + { + GstElement **elementPtr = reinterpret_cast(element); + *elementPtr = m_audioSink; + })); + EXPECT_CALL(*m_gstWrapperMock, gstStreamVolumeGetVolume(_, GST_STREAM_VOLUME_FORMAT_LINEAR)) .Times(AtLeast(0)) .WillRepeatedly(Return(kVolume)); @@ -504,6 +512,8 @@ void MediaPipelineTest::indicateAllSourcesAttached(const std::vector(m_clientStub).send(pauseReq).expectSuccess(); positionUpdatesShouldNotBeReceivedFromNow(); @@ -796,6 +806,7 @@ void MediaPipelineTest::stop() EXPECT_EQ(receivedPlaybackStateChange->state(), ::firebolt::rialto::PlaybackStateChangeEvent_PlaybackState_STOPPED); positionUpdatesShouldNotBeReceivedFromNow(); + playbackInfoUpdatesShouldNotBeReceivedFromNow(); } void MediaPipelineTest::destroySession() @@ -819,11 +830,6 @@ void MediaPipelineTest::mayReceivePositionUpdates() { m_positionChangeEventSuppressionId = m_clientStub.addSuppression(); } - - if (-1 == m_playbackInfoEventSuppressionId) - { - m_playbackInfoEventSuppressionId = m_clientStub.addSuppression(); - } } void MediaPipelineTest::positionUpdatesShouldNotBeReceivedFromNow() @@ -833,7 +839,18 @@ void MediaPipelineTest::positionUpdatesShouldNotBeReceivedFromNow() m_clientStub.removeSuppression(m_positionChangeEventSuppressionId); m_positionChangeEventSuppressionId = -1; } +} +void MediaPipelineTest::mayReceivePlaybackInfoUpdates() +{ + if (-1 == m_playbackInfoEventSuppressionId) + { + m_playbackInfoEventSuppressionId = m_clientStub.addSuppression(); + } +} + +void MediaPipelineTest::playbackInfoUpdatesShouldNotBeReceivedFromNow() +{ if (-1 != m_playbackInfoEventSuppressionId) { m_clientStub.removeSuppression(m_playbackInfoEventSuppressionId); diff --git a/tests/componenttests/server/fixtures/MediaPipelineTest.h b/tests/componenttests/server/fixtures/MediaPipelineTest.h index 82808ac56..b87393ee3 100644 --- a/tests/componenttests/server/fixtures/MediaPipelineTest.h +++ b/tests/componenttests/server/fixtures/MediaPipelineTest.h @@ -86,6 +86,8 @@ class MediaPipelineTest : public RialtoServerComponentTest void initShm(); void mayReceivePositionUpdates(); void positionUpdatesShouldNotBeReceivedFromNow(); + void mayReceivePlaybackInfoUpdates(); + void playbackInfoUpdatesShouldNotBeReceivedFromNow(); protected: int m_sessionId{-1}; @@ -118,6 +120,7 @@ class MediaPipelineTest : public RialtoServerComponentTest GstSample *m_sample{nullptr}; std::shared_ptr<::firebolt::rialto::NeedMediaDataEvent> m_lastAudioNeedData{nullptr}; std::shared_ptr<::firebolt::rialto::NeedMediaDataEvent> m_lastVideoNeedData{nullptr}; + GstElement *m_audioSink{nullptr}; // Position Update events may be received in PLAYING state. We have to suppress them // to avoid occassional test failures diff --git a/tests/componenttests/server/tests/mediaPipeline/FlushTest.cpp b/tests/componenttests/server/tests/mediaPipeline/FlushTest.cpp index ceaf2129f..132aebe3a 100644 --- a/tests/componenttests/server/tests/mediaPipeline/FlushTest.cpp +++ b/tests/componenttests/server/tests/mediaPipeline/FlushTest.cpp @@ -45,7 +45,6 @@ class FlushTest : public MediaPipelineTest GstEvent m_flushStartEvent{}; GstEvent m_flushStopEvent{}; GstSegment m_segment{}; - GstElement *m_audioSink{nullptr}; public: FlushTest() @@ -59,14 +58,6 @@ class FlushTest : public MediaPipelineTest void willFlush() { - EXPECT_CALL(*m_glibWrapperMock, gObjectGetStub(_, StrEq("audio-sink"), _)) - .WillOnce(Invoke( - [&](gpointer object, const gchar *first_property_name, void *element) - { - GstElement **elementPtr = reinterpret_cast(element); - *elementPtr = m_audioSink; - })); - EXPECT_CALL(*m_glibWrapperMock, gTypeName(_)).WillRepeatedly(Return("GstStreamVolume")); EXPECT_CALL(*m_glibWrapperMock, gObjectGetStub(m_audioSink, StrEq("async"), _)) .WillOnce(Invoke( @@ -241,7 +232,7 @@ class FlushTest : public MediaPipelineTest * * Code: */ -TEST_F(FlushTest, flushAudioSourceSuccess) +TEST_F(FlushTest, DISABLED_flushAudioSourceSuccess) { // Step 1: Create a new media session createSession(); diff --git a/tests/unittests/media/server/gstplayer/genericPlayer/GstGenericPlayerPrivateTest.cpp b/tests/unittests/media/server/gstplayer/genericPlayer/GstGenericPlayerPrivateTest.cpp index 8459d58c0..e6f638f23 100644 --- a/tests/unittests/media/server/gstplayer/genericPlayer/GstGenericPlayerPrivateTest.cpp +++ b/tests/unittests/media/server/gstplayer/genericPlayer/GstGenericPlayerPrivateTest.cpp @@ -1669,13 +1669,19 @@ TEST_F(GstGenericPlayerPrivateTest, shouldStartPositionReportingTimer) std::unique_ptr audioUnderflowTimerMock = std::make_unique>(); EXPECT_CALL(*m_timerFactoryMock, createTimer(kPositionReportTimerMs, _, common::TimerType::PERIODIC)) .WillOnce(Return(ByMove(std::move(audioUnderflowTimerMock)))); + + m_sut->startPositionReportingAndCheckAudioUnderflowTimer(); +} + +TEST_F(GstGenericPlayerPrivateTest, shouldStartPlaybackInfoTimer) +{ willNotifyPlaybackInfo(); std::unique_ptr playbackInfoTimerMock = std::make_unique>(); EXPECT_CALL(dynamic_cast &>(*playbackInfoTimerMock), isActive()).WillRepeatedly(Return(false)); EXPECT_CALL(*m_timerFactoryMock, createTimer(kPlaybackInfoTimerMs, _, common::TimerType::PERIODIC)) .WillOnce(Return(ByMove(std::move(playbackInfoTimerMock)))); - m_sut->startPositionReportingAndCheckAudioUnderflowTimer(); + m_sut->startNotifyPlaybackInfoTimer(); } TEST_F(GstGenericPlayerPrivateTest, shouldNotStartPositionReportingTimerWhenItIsActive) @@ -1684,15 +1690,24 @@ TEST_F(GstGenericPlayerPrivateTest, shouldNotStartPositionReportingTimerWhenItIs EXPECT_CALL(dynamic_cast &>(*timerMock), isActive()).WillOnce(Return(true)); EXPECT_CALL(*m_timerFactoryMock, createTimer(kPositionReportTimerMs, _, common::TimerType::PERIODIC)) .WillOnce(Return(ByMove(std::move(timerMock)))); - willNotifyPlaybackInfo(); - std::unique_ptr playbackInfoTimerMock = std::make_unique>(); - EXPECT_CALL(dynamic_cast &>(*playbackInfoTimerMock), isActive()).WillRepeatedly(Return(false)); - EXPECT_CALL(*m_timerFactoryMock, createTimer(kPlaybackInfoTimerMs, _, common::TimerType::PERIODIC)) - .WillOnce(Return(ByMove(std::move(playbackInfoTimerMock)))); + m_sut->startPositionReportingAndCheckAudioUnderflowTimer(); m_sut->startPositionReportingAndCheckAudioUnderflowTimer(); } +TEST_F(GstGenericPlayerPrivateTest, shouldNotStartPlaybackInfoTimerWhenItIsActive) +{ + std::unique_ptr timerMock = std::make_unique>(); + EXPECT_CALL(dynamic_cast &>(*timerMock), isActive()) + .WillOnce(Return(true)) + .WillRepeatedly(Return(false)); + EXPECT_CALL(*m_timerFactoryMock, createTimer(kPlaybackInfoTimerMs, _, common::TimerType::PERIODIC)) + .WillOnce(Return(ByMove(std::move(timerMock)))); + willNotifyPlaybackInfo(); + m_sut->startNotifyPlaybackInfoTimer(); + m_sut->startNotifyPlaybackInfoTimer(); +} + TEST_F(GstGenericPlayerPrivateTest, shouldScheduleReportPositionWhenPositionReportingTimerIsFired) { std::unique_ptr timerMock = std::make_unique>(); @@ -1709,6 +1724,12 @@ TEST_F(GstGenericPlayerPrivateTest, shouldScheduleReportPositionWhenPositionRepo callback(); return std::move(timerMock); })); + m_sut->startPositionReportingAndCheckAudioUnderflowTimer(); +} + +TEST_F(GstGenericPlayerPrivateTest, shouldSchedulePlaybackInfoWhenPlaybackInfoTimerIsFired) +{ + std::unique_ptr timerMock = std::make_unique>(); willNotifyPlaybackInfo(); std::unique_ptr playbackInfoTimerMock = std::make_unique>(); EXPECT_CALL(dynamic_cast &>(*playbackInfoTimerMock), isActive()).WillRepeatedly(Return(false)); @@ -1720,7 +1741,7 @@ TEST_F(GstGenericPlayerPrivateTest, shouldScheduleReportPositionWhenPositionRepo callback(); return std::move(playbackInfoTimerMock); })); - m_sut->startPositionReportingAndCheckAudioUnderflowTimer(); + m_sut->startNotifyPlaybackInfoTimer(); } TEST_F(GstGenericPlayerPrivateTest, shouldStopActivePositionReportingTimer) @@ -1730,6 +1751,13 @@ TEST_F(GstGenericPlayerPrivateTest, shouldStopActivePositionReportingTimer) EXPECT_CALL(dynamic_cast &>(*timerMock), cancel()); EXPECT_CALL(*m_timerFactoryMock, createTimer(kPositionReportTimerMs, _, common::TimerType::PERIODIC)) .WillOnce(Return(ByMove(std::move(timerMock)))); + + m_sut->startPositionReportingAndCheckAudioUnderflowTimer(); + m_sut->stopPositionReportingAndCheckAudioUnderflowTimer(); +} + +TEST_F(GstGenericPlayerPrivateTest, shouldStopActivePlaybackInfoTimerTimer) +{ willNotifyPlaybackInfo(); std::unique_ptr playbackInfoTimerMock = std::make_unique>(); EXPECT_CALL(dynamic_cast &>(*playbackInfoTimerMock), isActive()) @@ -1738,8 +1766,9 @@ TEST_F(GstGenericPlayerPrivateTest, shouldStopActivePositionReportingTimer) EXPECT_CALL(dynamic_cast &>(*playbackInfoTimerMock), cancel()); EXPECT_CALL(*m_timerFactoryMock, createTimer(kPlaybackInfoTimerMs, _, common::TimerType::PERIODIC)) .WillOnce(Return(ByMove(std::move(playbackInfoTimerMock)))); - m_sut->startPositionReportingAndCheckAudioUnderflowTimer(); - m_sut->stopPositionReportingAndCheckAudioUnderflowTimer(); + + m_sut->startNotifyPlaybackInfoTimer(); + m_sut->stopNotifyPlaybackInfoTimer(); } TEST_F(GstGenericPlayerPrivateTest, shouldNotStopInactivePositionReportingTimer) @@ -1748,13 +1777,21 @@ TEST_F(GstGenericPlayerPrivateTest, shouldNotStopInactivePositionReportingTimer) EXPECT_CALL(dynamic_cast &>(*timerMock), isActive()).WillOnce(Return(false)); EXPECT_CALL(*m_timerFactoryMock, createTimer(kPositionReportTimerMs, _, common::TimerType::PERIODIC)) .WillOnce(Return(ByMove(std::move(timerMock)))); + + m_sut->startPositionReportingAndCheckAudioUnderflowTimer(); + m_sut->stopPositionReportingAndCheckAudioUnderflowTimer(); +} + +TEST_F(GstGenericPlayerPrivateTest, shouldNotStopInactivePlaybackInfoTimer) +{ willNotifyPlaybackInfo(); std::unique_ptr playbackInfoTimerMock = std::make_unique>(); EXPECT_CALL(dynamic_cast &>(*playbackInfoTimerMock), isActive()).WillRepeatedly(Return(false)); EXPECT_CALL(*m_timerFactoryMock, createTimer(kPlaybackInfoTimerMs, _, common::TimerType::PERIODIC)) .WillOnce(Return(ByMove(std::move(playbackInfoTimerMock)))); - m_sut->startPositionReportingAndCheckAudioUnderflowTimer(); - m_sut->stopPositionReportingAndCheckAudioUnderflowTimer(); + + m_sut->startNotifyPlaybackInfoTimer(); + m_sut->stopNotifyPlaybackInfoTimer(); } TEST_F(GstGenericPlayerPrivateTest, shouldNotStopInactivePositionReportingTimerWhenThereIsNoTimer) diff --git a/tests/unittests/media/server/gstplayer/genericPlayer/common/GenericTasksTestsBase.cpp b/tests/unittests/media/server/gstplayer/genericPlayer/common/GenericTasksTestsBase.cpp index d12dc694f..53c5d639b 100644 --- a/tests/unittests/media/server/gstplayer/genericPlayer/common/GenericTasksTestsBase.cpp +++ b/tests/unittests/media/server/gstplayer/genericPlayer/common/GenericTasksTestsBase.cpp @@ -2366,9 +2366,15 @@ void GenericTasksTestsBase::shouldStopGstPlayer() videoStreamIt->second.isDataNeeded = true; audioStreamIt->second.isDataNeeded = true; EXPECT_CALL(testContext->m_gstPlayer, stopPositionReportingAndCheckAudioUnderflowTimer()); + EXPECT_CALL(testContext->m_gstPlayer, stopNotifyPlaybackInfoTimer()); EXPECT_CALL(testContext->m_gstPlayer, changePipelineState(GST_STATE_NULL)).WillOnce(Return(GST_STATE_CHANGE_SUCCESS)); } +void GenericTasksTestsBase::shouldStopPositionReportingAndCheckAudioUnderflowTimer() +{ + EXPECT_CALL(testContext->m_gstPlayer, stopPositionReportingAndCheckAudioUnderflowTimer()); +} + void GenericTasksTestsBase::triggerStop() { firebolt::rialto::server::tasks::generic::Stop task{testContext->m_context, testContext->m_gstPlayer}; @@ -3133,7 +3139,6 @@ void GenericTasksTestsBase::checkAudioSourceNotRemoved() void GenericTasksTestsBase::shouldFlushAudioSrcSuccess() { - EXPECT_CALL(testContext->m_gstPlayer, stopPositionReportingAndCheckAudioUnderflowTimer()); EXPECT_CALL(*testContext->m_gstWrapper, gstEventNewFlushStart()).WillOnce(Return(&testContext->m_event)); EXPECT_CALL(*testContext->m_gstWrapper, gstElementSendEvent(&testContext->m_appSrcAudio, &testContext->m_event)) .WillOnce(Return(TRUE)); @@ -3144,7 +3149,6 @@ void GenericTasksTestsBase::shouldFlushAudioSrcSuccess() void GenericTasksTestsBase::shouldFlushAudioSrcFailure() { - EXPECT_CALL(testContext->m_gstPlayer, stopPositionReportingAndCheckAudioUnderflowTimer()); EXPECT_CALL(*testContext->m_gstWrapper, gstEventNewFlushStart()).WillOnce(Return(&testContext->m_event)); EXPECT_CALL(*testContext->m_gstWrapper, gstElementSendEvent(&testContext->m_appSrcAudio, &testContext->m_event)) .WillOnce(Return(FALSE)); @@ -3282,7 +3286,6 @@ void GenericTasksTestsBase::checkVideoFlushed() void GenericTasksTestsBase::shouldFlushVideoSrcSuccess() { - EXPECT_CALL(testContext->m_gstPlayer, stopPositionReportingAndCheckAudioUnderflowTimer()); EXPECT_CALL(*testContext->m_gstWrapper, gstEventNewFlushStart()).WillOnce(Return(&testContext->m_event)); EXPECT_CALL(*testContext->m_gstWrapper, gstElementSendEvent(&testContext->m_appSrcVideo, &testContext->m_event)) .WillOnce(Return(TRUE)); diff --git a/tests/unittests/media/server/gstplayer/genericPlayer/common/GenericTasksTestsBase.h b/tests/unittests/media/server/gstplayer/genericPlayer/common/GenericTasksTestsBase.h index 5d77fe871..c4cc2ac60 100644 --- a/tests/unittests/media/server/gstplayer/genericPlayer/common/GenericTasksTestsBase.h +++ b/tests/unittests/media/server/gstplayer/genericPlayer/common/GenericTasksTestsBase.h @@ -413,6 +413,7 @@ class GenericTasksTestsBase : public ::testing::Test void triggerRemoveSourceVideo(); void checkAudioSourceRemoved(); void checkAudioSourceNotRemoved(); + void shouldStopPositionReportingAndCheckAudioUnderflowTimer(); // Flush test methods void shouldFlushAudio(); diff --git a/tests/unittests/media/server/gstplayer/genericPlayer/tasksTests/HandleBusMessageTest.cpp b/tests/unittests/media/server/gstplayer/genericPlayer/tasksTests/HandleBusMessageTest.cpp index d9b1c09e2..783c88cd1 100644 --- a/tests/unittests/media/server/gstplayer/genericPlayer/tasksTests/HandleBusMessageTest.cpp +++ b/tests/unittests/media/server/gstplayer/genericPlayer/tasksTests/HandleBusMessageTest.cpp @@ -281,7 +281,8 @@ TEST_F(HandleBusMessageTest, shouldHandleStateChangedToPausedMessage) EXPECT_CALL(*m_gstWrapper, gstElementStateGetName(pending)).WillOnce(Return("Void")); EXPECT_CALL(*m_gstWrapper, gstDebugBinToDotFileWithTs(GST_BIN(&m_pipeline), _, _)); EXPECT_CALL(m_gstPlayerClient, notifyPlaybackState(firebolt::rialto::PlaybackState::PAUSED)); - EXPECT_CALL(m_gstPlayer, notifyPlaybackInfo()); + EXPECT_CALL(m_gstPlayer, stopPositionReportingAndCheckAudioUnderflowTimer()); + EXPECT_CALL(m_gstPlayer, startNotifyPlaybackInfoTimer()); EXPECT_CALL(*m_gstWrapper, gstMessageUnref(&m_message)); EXPECT_CALL(m_flushWatcherMock, isFlushOngoing()).WillRepeatedly(Return(kNoFlushOngoing)); EXPECT_CALL(m_flushWatcherMock, isAsyncFlushOngoing()).WillRepeatedly(Return(kNoFlushOngoing)); @@ -310,7 +311,8 @@ TEST_F(HandleBusMessageTest, shouldHandleStateChangedToPausedMessageWhenSyncFlus EXPECT_CALL(*m_gstWrapper, gstElementStateGetName(pending)).WillOnce(Return("Void")); EXPECT_CALL(*m_gstWrapper, gstDebugBinToDotFileWithTs(GST_BIN(&m_pipeline), _, _)); EXPECT_CALL(m_gstPlayerClient, notifyPlaybackState(firebolt::rialto::PlaybackState::PAUSED)); - EXPECT_CALL(m_gstPlayer, notifyPlaybackInfo()); + EXPECT_CALL(m_gstPlayer, stopPositionReportingAndCheckAudioUnderflowTimer()); + EXPECT_CALL(m_gstPlayer, startNotifyPlaybackInfoTimer()); EXPECT_CALL(*m_gstWrapper, gstMessageUnref(&m_message)); EXPECT_CALL(m_flushWatcherMock, isFlushOngoing()).WillRepeatedly(Return(kFlushOngoing)); EXPECT_CALL(m_flushWatcherMock, isAsyncFlushOngoing()).WillRepeatedly(Return(kNoFlushOngoing)); @@ -337,6 +339,8 @@ TEST_F(HandleBusMessageTest, shouldSkipHandlingStateChangedToPausedMessageWhenAs EXPECT_CALL(*m_gstWrapper, gstElementStateGetName(newState)).Times(2).WillRepeatedly(Return("Paused")); EXPECT_CALL(*m_gstWrapper, gstElementStateGetName(pending)).WillOnce(Return("Void")); EXPECT_CALL(*m_gstWrapper, gstDebugBinToDotFileWithTs(GST_BIN(&m_pipeline), _, _)); + EXPECT_CALL(m_gstPlayer, stopPositionReportingAndCheckAudioUnderflowTimer()); + EXPECT_CALL(m_gstPlayer, startNotifyPlaybackInfoTimer()); EXPECT_CALL(*m_gstWrapper, gstMessageUnref(&m_message)); EXPECT_CALL(m_flushWatcherMock, isFlushOngoing()).WillOnce(Return(kFlushOngoing)); EXPECT_CALL(m_flushWatcherMock, isAsyncFlushOngoing()).WillOnce(Return(kFlushOngoing)); @@ -363,6 +367,8 @@ TEST_F(HandleBusMessageTest, shouldSkipHandlingStateChangedToPausedMessageWhenAs EXPECT_CALL(*m_gstWrapper, gstElementStateGetName(newState)).Times(2).WillRepeatedly(Return("Paused")); EXPECT_CALL(*m_gstWrapper, gstElementStateGetName(pending)).WillOnce(Return("Void")); EXPECT_CALL(*m_gstWrapper, gstDebugBinToDotFileWithTs(GST_BIN(&m_pipeline), _, _)); + EXPECT_CALL(m_gstPlayer, stopPositionReportingAndCheckAudioUnderflowTimer()); + EXPECT_CALL(m_gstPlayer, startNotifyPlaybackInfoTimer()); EXPECT_CALL(*m_gstWrapper, gstMessageUnref(&m_message)); EXPECT_CALL(m_flushWatcherMock, isFlushOngoing()).WillOnce(Return(kFlushOngoing)); EXPECT_CALL(m_flushWatcherMock, isAsyncFlushOngoing()).WillOnce(Return(kNoFlushOngoing)).WillOnce(Return(kFlushOngoing)); @@ -386,6 +392,8 @@ TEST_F(HandleBusMessageTest, shouldHandleStateChangedToPausedAndPendingPausedMes EXPECT_CALL(m_gstPlayer, hasSourceType(firebolt::rialto::MediaSourceType::SUBTITLE)).WillOnce(Return(false)); EXPECT_CALL(*m_gstWrapper, gstElementStateGetName(GST_STATE_PAUSED)).WillRepeatedly(Return("Paused")); EXPECT_CALL(*m_gstWrapper, gstDebugBinToDotFileWithTs(GST_BIN(&m_pipeline), _, _)); + EXPECT_CALL(m_gstPlayer, stopPositionReportingAndCheckAudioUnderflowTimer()); + EXPECT_CALL(m_gstPlayer, startNotifyPlaybackInfoTimer()); EXPECT_CALL(*m_gstWrapper, gstMessageUnref(&m_message)); EXPECT_CALL(m_flushWatcherMock, isFlushOngoing()).WillRepeatedly(Return(kNoFlushOngoing)); EXPECT_CALL(m_flushWatcherMock, isAsyncFlushOngoing()).WillRepeatedly(Return(kNoFlushOngoing)); diff --git a/tests/unittests/media/server/mocks/gstplayer/GstGenericPlayerPrivateMock.h b/tests/unittests/media/server/mocks/gstplayer/GstGenericPlayerPrivateMock.h index 4881b86a6..f42bfdd8f 100644 --- a/tests/unittests/media/server/mocks/gstplayer/GstGenericPlayerPrivateMock.h +++ b/tests/unittests/media/server/mocks/gstplayer/GstGenericPlayerPrivateMock.h @@ -60,6 +60,8 @@ class GstGenericPlayerPrivateMock : public IGstGenericPlayerPrivate MOCK_METHOD(int64_t, getPosition, (GstElement * element), (override)); MOCK_METHOD(void, startPositionReportingAndCheckAudioUnderflowTimer, (), (override)); MOCK_METHOD(void, stopPositionReportingAndCheckAudioUnderflowTimer, (), (override)); + MOCK_METHOD(void, startNotifyPlaybackInfoTimer, (), (override)); + MOCK_METHOD(void, stopNotifyPlaybackInfoTimer, (), (override)); MOCK_METHOD(void, stopWorkerThread, (), (override)); MOCK_METHOD(void, cancelUnderflow, (firebolt::rialto::MediaSourceType mediaSource), (override)); MOCK_METHOD(void, setPendingPlaybackRate, (), (override)); From d6bd8c4e356e527e81e74102395299f0ac66d9d7 Mon Sep 17 00:00:00 2001 From: Sasa Mudri Date: Fri, 23 Oct 2026 19:58:43 +0200 Subject: [PATCH 2/3] Remove unused shouldStopPositionReportingAndCheckAudioUnderflowTimer test helper The helper came with the #435 backport, where it is used only by RemoveSourceTest. On v0.15.2 RemoveSource does not stop the position reporting timer, so the v0.15.2 version of RemoveSourceTest was kept and the helper was left unused, failing cppcheck [unusedFunction]. Co-Authored-By: Claude Opus 5.5 --- .../gstplayer/genericPlayer/common/GenericTasksTestsBase.cpp | 5 ----- .../gstplayer/genericPlayer/common/GenericTasksTestsBase.h | 1 - 2 files changed, 6 deletions(-) diff --git a/tests/unittests/media/server/gstplayer/genericPlayer/common/GenericTasksTestsBase.cpp b/tests/unittests/media/server/gstplayer/genericPlayer/common/GenericTasksTestsBase.cpp index 53c5d639b..13c57bd33 100644 --- a/tests/unittests/media/server/gstplayer/genericPlayer/common/GenericTasksTestsBase.cpp +++ b/tests/unittests/media/server/gstplayer/genericPlayer/common/GenericTasksTestsBase.cpp @@ -2370,11 +2370,6 @@ void GenericTasksTestsBase::shouldStopGstPlayer() EXPECT_CALL(testContext->m_gstPlayer, changePipelineState(GST_STATE_NULL)).WillOnce(Return(GST_STATE_CHANGE_SUCCESS)); } -void GenericTasksTestsBase::shouldStopPositionReportingAndCheckAudioUnderflowTimer() -{ - EXPECT_CALL(testContext->m_gstPlayer, stopPositionReportingAndCheckAudioUnderflowTimer()); -} - void GenericTasksTestsBase::triggerStop() { firebolt::rialto::server::tasks::generic::Stop task{testContext->m_context, testContext->m_gstPlayer}; diff --git a/tests/unittests/media/server/gstplayer/genericPlayer/common/GenericTasksTestsBase.h b/tests/unittests/media/server/gstplayer/genericPlayer/common/GenericTasksTestsBase.h index c4cc2ac60..5d77fe871 100644 --- a/tests/unittests/media/server/gstplayer/genericPlayer/common/GenericTasksTestsBase.h +++ b/tests/unittests/media/server/gstplayer/genericPlayer/common/GenericTasksTestsBase.h @@ -413,7 +413,6 @@ class GenericTasksTestsBase : public ::testing::Test void triggerRemoveSourceVideo(); void checkAudioSourceRemoved(); void checkAudioSourceNotRemoved(); - void shouldStopPositionReportingAndCheckAudioUnderflowTimer(); // Flush test methods void shouldFlushAudio(); From 6f0d202ca48cedc2eb8863a392ab69b1ccb845d1 Mon Sep 17 00:00:00 2001 From: Sasa Mudri Date: Fri, 23 Oct 2026 20:10:48 +0200 Subject: [PATCH 3/3] Fix cppcheck error.