Skip to content

RDKEMW-15424: [RDKE] Workaround for Audioloss in BCM decoder#461

Open
balasaraswathy-n wants to merge 1 commit intomasterfrom
feature/RDKEMW-15424
Open

RDKEMW-15424: [RDKE] Workaround for Audioloss in BCM decoder#461
balasaraswathy-n wants to merge 1 commit intomasterfrom
feature/RDKEMW-15424

Conversation

@balasaraswathy-n
Copy link
Copy Markdown

Reason for change: Workaround to prevent initial audio loss in bcmaudio decoder for live channel

Priority: P1
Test Procedure: Validate Fast playback in Rogers Broadcom
Risks: None

Copilot AI review requested due to automatic review settings March 13, 2026 08:39
@github-actions
Copy link
Copy Markdown

Pull request must be merged with a description containing the required fields,

Summary:
Type: Feature/Fix/Cleanup
Test Plan:
Jira:

If there is no jira releated to this change, please put 'Jira: NO-JIRA'.

Description can be changed by editing the top comment on your pull request and making a new commit.

Reason for change: Workaround to prevent initial audio loss in bcmaudio
decoder for live channel
Signed-off-by: Balasaraswathy_N <Balasaraswathy_N@comcast.com>
Priority: P1
Test Procedure: Validate Fast playback in Rogers Broadcom
Risks: None
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Implements a workaround to avoid initial audio loss on Broadcom (BRCM) audio decoders by adding decoder detection logic into the playback-rate task, and wires this through the task factory/player interfaces with corresponding unit-test updates.

Changes:

  • Add IGstGenericPlayerPrivate::getDecoder() and expose it on GstGenericPlayer for tasks to query the active decoder.
  • Update SetPlaybackRate task and factory API to accept the player instance, enabling decoder-based rate adjustment.
  • Update mocks and unit tests to match the new interfaces/signatures.

Reviewed changes

Copilot reviewed 13 out of 13 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
media/server/gstplayer/source/tasks/generic/SetPlaybackRate.cpp Adds decoder-dependent “initial rate correction” logic.
media/server/gstplayer/include/tasks/generic/SetPlaybackRate.h Extends task ctor to take IGstGenericPlayerPrivate&.
media/server/gstplayer/source/tasks/generic/GenericPlayerTaskFactory.cpp Passes player into SetPlaybackRate task creation.
media/server/gstplayer/include/tasks/generic/GenericPlayerTaskFactory.h Updates factory method signature for set playback rate.
media/server/gstplayer/include/tasks/IGenericPlayerTaskFactory.h Updates interface signature and Doxygen for set playback rate.
media/server/gstplayer/source/GstGenericPlayer.cpp Passes *this into createSetPlaybackRate(...).
media/server/gstplayer/include/GstGenericPlayer.h Exposes getDecoder() as part of IGstGenericPlayerPrivate.
media/server/gstplayer/include/IGstGenericPlayerPrivate.h Adds new getDecoder() API + doc.
tests/unittests/media/server/mocks/gstplayer/GstGenericPlayerPrivateMock.h Adds mock method for getDecoder().
tests/unittests/media/server/mocks/gstplayer/GenericPlayerTaskFactoryMock.h Updates mock signature for createSetPlaybackRate(...).
tests/unittests/media/server/gstplayer/genericPlayer/GstGenericPlayerTest.cpp Updates expectations for new factory signature.
tests/unittests/media/server/gstplayer/genericPlayer/tasksTests/GenericPlayerTaskFactoryTest.cpp Updates test call to new factory signature.
tests/unittests/media/server/gstplayer/genericPlayer/common/GenericTasksTestsBase.cpp Updates direct construction of SetPlaybackRate task.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +54 to +62
GstElement *decoder{m_player.getDecoder(firebolt::rialto::MediaSourceType::AUDIO)};
if (!decoder || !m_glibWrapper->gStrHasPrefix(GST_ELEMENT_NAME(decoder), "brcm"))
{
rate = 1.0f;
}

if (decoder)
{
m_gstWrapper->gstObjectUnref(decoder);
Comment on lines +51 to +64
double rate{m_rate};
if (rate == DEFAULT_INITIAL_RATE_CORRECTION_SPEED)
{
RIALTO_SERVER_LOG_DEBUG("No need to change playback rate - it is already %lf", m_rate);
GstElement *decoder{m_player.getDecoder(firebolt::rialto::MediaSourceType::AUDIO)};
if (!decoder || !m_glibWrapper->gStrHasPrefix(GST_ELEMENT_NAME(decoder), "brcm"))
{
rate = 1.0f;
}

if (decoder)
{
m_gstWrapper->gstObjectUnref(decoder);
}
}
Comment on lines 204 to +212
* @param[in] context : The GstGenericPlayer context
* @param[in] player : The GstGenericPlayer instance
* @param[in] rate : The new playback rate.
*
* @retval the new SetPlaybackRate task instance.
*/
virtual std::unique_ptr<IPlayerTask> createSetPlaybackRate(GenericPlayerContext &context, double rate) const = 0;
virtual std::unique_ptr<IPlayerTask> createSetPlaybackRate(GenericPlayerContext &context,
IGstGenericPlayerPrivate &player,
double rate) const = 0;
Comment on lines +291 to +298
/**
* @brief Gets the decoder element for source type.
*
* @param[in] mediaSourceType : the source type to obtain the decoder for
*
* @retval The decoder, NULL if not found. Please call getObjectUnref() if it's non-null
*/
virtual GstElement *getDecoder(const MediaSourceType &mediaSourceType) = 0;
*
* @retval The decoder, NULL if not found. Please call getObjectUnref() if it's non-null
*/
virtual GstElement *getDecoder(const MediaSourceType &mediaSourceType) = 0;
@github-actions
Copy link
Copy Markdown

Coverage statistics of your commit:
WARNING: Lines coverage decreased from: 84.5% to 84.4%
Functions coverage stays unchanged and is: 92.6%

@github-actions
Copy link
Copy Markdown

Coverage statistics of your commit:
Lines coverage stays unchanged and is: 84.5%
Functions coverage stays unchanged and is: 92.6%

std::shared_ptr<firebolt::rialto::wrappers::IGstWrapper> gstWrapper,
std::shared_ptr<firebolt::rialto::wrappers::IGlibWrapper> glibWrapper, double rate)
: m_context{context}, m_gstWrapper{gstWrapper}, m_glibWrapper{glibWrapper}, m_rate{rate}
: m_context{context}, m_player{player}, m_gstWrapper{gstWrapper}, m_glibWrapper{glibWrapper}, m_rate{rate}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coverity Issue - Variable copied when it could be moved

"glibWrapper" is passed-by-value as parameter to "std::shared_ptrfirebolt::rialto::wrappers::IGlibWrapper::shared_ptr(std::shared_ptrfirebolt::rialto::wrappers::IGlibWrapper const &) /explicit =default/", when it could be moved instead.

Low Impact, CWE-none
COPY_INSTEAD_OF_MOVE

How to fix

Use "std::move(""glibWrapper"")" instead of "glibWrapper".

std::shared_ptr<firebolt::rialto::wrappers::IGstWrapper> gstWrapper,
std::shared_ptr<firebolt::rialto::wrappers::IGlibWrapper> glibWrapper, double rate)
: m_context{context}, m_gstWrapper{gstWrapper}, m_glibWrapper{glibWrapper}, m_rate{rate}
: m_context{context}, m_player{player}, m_gstWrapper{gstWrapper}, m_glibWrapper{glibWrapper}, m_rate{rate}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coverity Issue - Variable copied when it could be moved

"gstWrapper" is passed-by-value as parameter to "std::shared_ptrfirebolt::rialto::wrappers::IGstWrapper::shared_ptr(std::shared_ptrfirebolt::rialto::wrappers::IGstWrapper const &) /explicit =default/", when it could be moved instead.

Low Impact, CWE-none
COPY_INSTEAD_OF_MOVE

How to fix

Use "std::move(""gstWrapper"")" instead of "gstWrapper".

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants