RDKEMW-15424: [RDKE] Workaround for Audioloss in BCM decoder#461
RDKEMW-15424: [RDKE] Workaround for Audioloss in BCM decoder#461balasaraswathy-n wants to merge 1 commit intomasterfrom
Conversation
|
Pull request must be merged with a description containing the required fields, Summary: 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
There was a problem hiding this comment.
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 onGstGenericPlayerfor tasks to query the active decoder. - Update
SetPlaybackRatetask 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.
| 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); |
| 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); | ||
| } | ||
| } |
| * @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; |
| /** | ||
| * @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; |
294c47f to
8cc884a
Compare
|
Coverage statistics of your commit: |
|
Coverage statistics of your commit: |
| 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} |
There was a problem hiding this comment.
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} |
There was a problem hiding this comment.
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".
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