From 1464e0e6cbaecde434b2ddcb1510cd8c63ec844f Mon Sep 17 00:00:00 2001 From: Alsameema Date: Mon, 4 May 2026 19:27:02 +0530 Subject: [PATCH 1/4] RDKEMW-16301: FAST Channel Audio cuts out on each tune (#1385) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reason for Change: address FAST channel audio cutting out on tune when live latency/rate correction engages by passing a “live latency correction enabled” signal down to the Rialto sink via a GStreamer context. - Extend InterfacePlayerRDK::ConfigurePipeline to accept a new boolean flag for live latency correction. - Propagate the flag from AAMPGstPlayer::Configure based on eAAMPConfig_EnableLiveLatencyCorrection and live-stream state. - Add enable-live-latency into the streams-info GstContext sent to the Rialto pipeline. * Fix ConfigurePipeline Doxygen, gboolean cast, and NULL varargs terminator - Update Doxygen block in InterfacePlayerRDK.cpp and .h to document FirstFrameFlag, manifestUrl, and enableLiveLatency parameters - Cast enableLiveLatency to gboolean in gst_structure_set call to avoid varargs type/size mismatch on some platforms/ABIs - Replace nullptr terminator with NULL in gst_structure_set call to avoid undefined behavior through C variadic interface - Give enableLiveLatency a default value of false in the header declaration so existing call sites remain source-compatible Risks: Low Test Guidance: refer ticket --------- Co-authored-by: pstroffolino Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- aampgstplayer.cpp | 3 +- middleware/InterfacePlayerRDK.cpp | 39 +++++++++++-------- middleware/InterfacePlayerRDK.h | 6 ++- .../tests/GstPlayer/FunctionalTests.cpp | 2 +- .../tests/GstPlayer/PauseOnPlaybackTests.cpp | 8 ++-- .../InterfacePlayerFunctionTests.cpp | 10 ++--- 6 files changed, 40 insertions(+), 28 deletions(-) diff --git a/aampgstplayer.cpp b/aampgstplayer.cpp index 9bcd53dfdc..1f6261fe7e 100644 --- a/aampgstplayer.cpp +++ b/aampgstplayer.cpp @@ -840,10 +840,11 @@ void AAMPGstPlayer::Configure(StreamOutputFormat format, StreamOutputFormat audi PipelinePriority = envVal ? atoi(envVal) : -1; bool FirstFrameFlag = aamp->IsFirstVideoFrameDisplayedRequired(); + bool isLiveRateCorrection = aamp->mConfig->IsConfigSet(eAAMPConfig_EnableLiveLatencyCorrection) && aamp->IsLive(); /*Configure and create the pipeline*/ playerInstance->ConfigurePipeline(static_cast(format),static_cast(audioFormat),static_cast(subFormat), bESChangeStatus,setReadyAfterPipelineCreation, - isSubEnable, trackId, rate, PIPELINE_NAME, PipelinePriority, FirstFrameFlag, aamp->GetManifestUrl().c_str()); + isSubEnable, trackId, rate, PIPELINE_NAME, PipelinePriority, FirstFrameFlag, aamp->GetManifestUrl().c_str(), isLiveRateCorrection); AAMPLOG_TRACE("exiting AAMPGstPlayer"); StartMonitorAvTimer(); } diff --git a/middleware/InterfacePlayerRDK.cpp b/middleware/InterfacePlayerRDK.cpp index 895bd094ab..00d06514a2 100644 --- a/middleware/InterfacePlayerRDK.cpp +++ b/middleware/InterfacePlayerRDK.cpp @@ -282,10 +282,14 @@ static void DecorateGstBufferWithDrmMetadata(GstBuffer *buffer, const MediaDrmMe * @param rate Bitrate. * @param pipelineName Pipeline name. * @param PipelinePriority Pipeline priority. + * @param FirstFrameFlag Whether the first-frame callback is required. + * @param manifestUrl URL of the manifest used to configure stream setup. + * @param enableLiveLatency Whether to enable live-latency mode in the + * RialtoSink streams-info context (passed as enable-live-latency). */ void InterfacePlayerRDK::ConfigurePipeline(int format, int audioFormat, int subFormat, bool bESChangeStatus, bool setReadyAfterPipelineCreation, - bool isSubEnable, int32_t trackId, gint rate, const char *pipelineName, int PipelinePriority, bool FirstFrameFlag, std::string manifestUrl) + bool isSubEnable, int32_t trackId, gint rate, const char *pipelineName, int PipelinePriority, bool FirstFrameFlag, std::string manifestUrl, bool enableLiveLatency) { mFirstFrameRequired = FirstFrameFlag; GstStreamOutputFormat gstFormat = static_cast(format); @@ -471,6 +475,24 @@ void InterfacePlayerRDK::ConfigurePipeline(int format, int audioFormat, int subF MW_LOG_WARN("Couldn't get video-sink"); } } + + if (interfacePlayerPriv->gstPrivateContext->usingRialtoSink) + { + MW_LOG_INFO("RialtoSink subtitle_sink = %p ",interfacePlayerPriv->gstPrivateContext->subtitle_sink); + GstContext *context = gst_context_new("streams-info", false); + GstStructure *contextStructure = gst_context_writable_structure(context); + if( !interfacePlayerPriv->gstPrivateContext->subtitle_sink ) MW_LOG_WARN( "subtitle_sink==NULL" ); + gst_structure_set( + contextStructure, + "video-streams", G_TYPE_UINT, (interfacePlayerPriv->gstPrivateContext->video_sink)?0x1u:0x0u, + "audio-streams", G_TYPE_UINT, (interfacePlayerPriv->gstPrivateContext->audio_sink)?0x1u:0x0u, + "text-streams", G_TYPE_UINT, (interfacePlayerPriv->gstPrivateContext->subtitle_sink)?0x1u:0x0u, + "enable-live-latency", G_TYPE_BOOLEAN, (gboolean)enableLiveLatency, + NULL ); + gst_element_set_context(GST_ELEMENT(interfacePlayerPriv->gstPrivateContext->pipeline), context); + gst_context_unref(context); + } + if (interfacePlayerPriv->gstPrivateContext->pauseOnStartPlayback && GST_NORMAL_PLAY_RATE == interfacePlayerPriv->gstPrivateContext->rate) { MW_LOG_INFO("Setting state to GST_STATE_PAUSED - pause on playback enabled"); @@ -510,21 +532,6 @@ void InterfacePlayerRDK::ConfigurePipeline(int format, int audioFormat, int subF interfacePlayerPriv->gstPrivateContext->numberOfVideoBuffersSent = 0; interfacePlayerPriv->gstPrivateContext->decodeErrorMsgTimeMS = 0; interfacePlayerPriv->gstPrivateContext->decodeErrorCBCount = 0; - if (interfacePlayerPriv->gstPrivateContext->usingRialtoSink) - { - MW_LOG_INFO("RialtoSink subtitle_sink = %p ",interfacePlayerPriv->gstPrivateContext->subtitle_sink); - GstContext *context = gst_context_new("streams-info", false); - GstStructure *contextStructure = gst_context_writable_structure(context); - if( !interfacePlayerPriv->gstPrivateContext->subtitle_sink ) MW_LOG_WARN( "subtitle_sink==NULL" ); - gst_structure_set( - contextStructure, - "video-streams", G_TYPE_UINT, (interfacePlayerPriv->gstPrivateContext->video_sink)?0x1u:0x0u, - "audio-streams", G_TYPE_UINT, (interfacePlayerPriv->gstPrivateContext->audio_sink)?0x1u:0x0u, - "text-streams", G_TYPE_UINT, (interfacePlayerPriv->gstPrivateContext->subtitle_sink)?0x1u:0x0u, - nullptr ); - gst_element_set_context(GST_ELEMENT(interfacePlayerPriv->gstPrivateContext->pipeline), context); - gst_context_unref(context); - } } /** diff --git a/middleware/InterfacePlayerRDK.h b/middleware/InterfacePlayerRDK.h index ec07f804af..4c224699bd 100644 --- a/middleware/InterfacePlayerRDK.h +++ b/middleware/InterfacePlayerRDK.h @@ -340,8 +340,12 @@ class InterfacePlayerRDK * @param rate Bitrate. * @param pipelineName Pipeline name. * @param PipelinePriority Pipeline priority. + * @param FirstFrameFlag Whether the first-frame callback is required. + * @param url URL of the manifest used to configure stream setup. + * @param enableLiveLatency Whether to enable live-latency mode in the + * RialtoSink streams-info context. Defaults to false. */ - void ConfigurePipeline(int, int, int, bool, bool, bool, int32_t, gint, const char *, int, bool, std::string url); + void ConfigurePipeline(int, int, int, bool, bool, bool, int32_t, gint, const char *, int, bool, std::string url, bool enableLiveLatency = false); /** * @brief Enables or disables pausing on playback start. * @param enable True to enable pausing, false to disable. diff --git a/middleware/test/utests/tests/GstPlayer/FunctionalTests.cpp b/middleware/test/utests/tests/GstPlayer/FunctionalTests.cpp index a5b400df59..1c7c7f66ca 100644 --- a/middleware/test/utests/tests/GstPlayer/FunctionalTests.cpp +++ b/middleware/test/utests/tests/GstPlayer/FunctionalTests.cpp @@ -245,7 +245,7 @@ class GstPlayerTests : public ::testing::Test GST_FORMAT_SUBTITLE_WEBVTT, setup->bESChangeStatus, setup->setReadyAfterPipelineCreation, - false, 0, GST_NORMAL_PLAY_RATE, "testPipeline", 0, false, "testManifest"); + false, 0, GST_NORMAL_PLAY_RATE, "testPipeline", 0, false, "testManifest", false); ASSERT_TRUE(bus_sync_func != nullptr); ASSERT_TRUE(bus_message_func != nullptr); diff --git a/middleware/test/utests/tests/GstPlayer/PauseOnPlaybackTests.cpp b/middleware/test/utests/tests/GstPlayer/PauseOnPlaybackTests.cpp index 6e1d99e4f0..a9c6d7b720 100644 --- a/middleware/test/utests/tests/GstPlayer/PauseOnPlaybackTests.cpp +++ b/middleware/test/utests/tests/GstPlayer/PauseOnPlaybackTests.cpp @@ -141,7 +141,7 @@ TEST_F(PauseOnPlaybackTests, EnteredPausedSteHandler_ConfigurePauseOnPlayback) // Enable PauseOnPlayback mInterfaceGstPlayer->SetPauseOnStartPlayback(true); - mInterfaceGstPlayer->ConfigurePipeline(GST_FORMAT_VIDEO_ES_H264, GST_FORMAT_AUDIO_ES_AAC, GST_FORMAT_SUBTITLE_WEBVTT, false, false, false, 0, GST_NORMAL_PLAY_RATE, "testPipeline", 0, false, "testManifest"); + mInterfaceGstPlayer->ConfigurePipeline(GST_FORMAT_VIDEO_ES_H264, GST_FORMAT_AUDIO_ES_AAC, GST_FORMAT_SUBTITLE_WEBVTT, false, false, false, 0, GST_NORMAL_PLAY_RATE, "testPipeline", 0, false, "testManifest", false); } // Test configuration of pipeline with PauseOnPlayback not enabled @@ -176,7 +176,7 @@ TEST_F(PauseOnPlaybackTests, EnteredPausedSteHandler_ConfigureNormalPlayback) EXPECT_CALL(*g_mockGStreamer, gst_element_set_state(&gst_element_pipeline, GST_STATE_PLAYING)) .WillOnce(Return(GST_STATE_CHANGE_SUCCESS)); - mInterfaceGstPlayer->ConfigurePipeline(GST_FORMAT_VIDEO_ES_H264, GST_FORMAT_AUDIO_ES_AAC, GST_FORMAT_SUBTITLE_WEBVTT, false, false, false, 0, GST_NORMAL_PLAY_RATE, "testPipeline", 0, false, "testManifest"); + mInterfaceGstPlayer->ConfigurePipeline(GST_FORMAT_VIDEO_ES_H264, GST_FORMAT_AUDIO_ES_AAC, GST_FORMAT_SUBTITLE_WEBVTT, false, false, false, 0, GST_NORMAL_PLAY_RATE, "testPipeline", 0, false, "testManifest", false); } // Test bus_message callback when PauseOnPlayback has been enabled, and sink @@ -236,7 +236,7 @@ TEST_F(PauseOnPlaybackTests, bus_messsage_FrameStepPropertyAvailable) mInterfaceGstPlayer->SetPauseOnStartPlayback(true); - mInterfaceGstPlayer->ConfigurePipeline(GST_FORMAT_VIDEO_ES_H264, GST_FORMAT_AUDIO_ES_AAC, GST_FORMAT_SUBTITLE_WEBVTT, false, false, false, 0, GST_NORMAL_PLAY_RATE, "testPipeline", 0, false, "testManifest"); + mInterfaceGstPlayer->ConfigurePipeline(GST_FORMAT_VIDEO_ES_H264, GST_FORMAT_AUDIO_ES_AAC, GST_FORMAT_SUBTITLE_WEBVTT, false, false, false, 0, GST_NORMAL_PLAY_RATE, "testPipeline", 0, false, "testManifest", false); ASSERT_TRUE(bus_sync_func != nullptr); ASSERT_TRUE(bus_message_func != nullptr); @@ -338,7 +338,7 @@ TEST_F(PauseOnPlaybackTests, bus_message_FrameStepPropertyNotAvailable) mInterfaceGstPlayer->SetPauseOnStartPlayback(true); - mInterfaceGstPlayer->ConfigurePipeline(GST_FORMAT_VIDEO_ES_H264, GST_FORMAT_AUDIO_ES_AAC, GST_FORMAT_SUBTITLE_WEBVTT, false, false, false, 0, GST_NORMAL_PLAY_RATE, "testPipeline", 0, false, "testManifest"); + mInterfaceGstPlayer->ConfigurePipeline(GST_FORMAT_VIDEO_ES_H264, GST_FORMAT_AUDIO_ES_AAC, GST_FORMAT_SUBTITLE_WEBVTT, false, false, false, 0, GST_NORMAL_PLAY_RATE, "testPipeline", 0, false, "testManifest", false); ASSERT_TRUE(bus_sync_func != nullptr); ASSERT_TRUE(bus_message_func != nullptr); diff --git a/middleware/test/utests/tests/InterfacePlayerTests/InterfacePlayerFunctionTests.cpp b/middleware/test/utests/tests/InterfacePlayerTests/InterfacePlayerFunctionTests.cpp index f69b8230c5..ddcb68eb6a 100644 --- a/middleware/test/utests/tests/InterfacePlayerTests/InterfacePlayerFunctionTests.cpp +++ b/middleware/test/utests/tests/InterfacePlayerTests/InterfacePlayerFunctionTests.cpp @@ -128,7 +128,7 @@ TEST_F(InterfacePlayerTests, ConfigurePipeline_WithWesterosAndRealtoSink) mPlayerConfigParams->useRialtoSink = true; EXPECT_EQ(mPlayerContext->usingRialtoSink, false); - mInterfaceGstPlayer->ConfigurePipeline(GST_FORMAT_INVALID, GST_FORMAT_INVALID, GST_FORMAT_INVALID, false, false, false, 0, GST_NORMAL_PLAY_RATE, "testPipeline", 0, false, "testManifest"); + mInterfaceGstPlayer->ConfigurePipeline(GST_FORMAT_INVALID, GST_FORMAT_INVALID, GST_FORMAT_INVALID, false, false, false, 0, GST_NORMAL_PLAY_RATE, "testPipeline", 0, false, "testManifest", false); EXPECT_EQ(mPlayerContext->using_westerossink, true); EXPECT_EQ(mPlayerContext->usingRialtoSink, true); @@ -137,7 +137,7 @@ TEST_F(InterfacePlayerTests, ConfigurePipeline_WithWesterosAndRealtoSink) TEST_F(InterfacePlayerTests, ConfigurePipeline_WithSubtitlesEnabled) { g_mockGStreamer = nullptr; - mInterfaceGstPlayer->ConfigurePipeline(GST_FORMAT_INVALID, GST_FORMAT_INVALID, GST_FORMAT_INVALID, false, false, true, 0, GST_NORMAL_PLAY_RATE, "testPipeline", 0, false, "testManifest"); + mInterfaceGstPlayer->ConfigurePipeline(GST_FORMAT_INVALID, GST_FORMAT_INVALID, GST_FORMAT_INVALID, false, false, true, 0, GST_NORMAL_PLAY_RATE, "testPipeline", 0, false, "testManifest", false); EXPECT_EQ(mPlayerContext->stream[eGST_MEDIATYPE_SUBTITLE].format, GST_FORMAT_INVALID); } @@ -148,7 +148,7 @@ TEST_F(InterfacePlayerTests, ConfigurePipeline_WithBufferingEnabled) mPlayerContext->buffering_enabled = true; mPlayerContext->rate = GST_NORMAL_PLAY_RATE; - mInterfaceGstPlayer->ConfigurePipeline(GST_FORMAT_MPEGTS, GST_FORMAT_INVALID, GST_FORMAT_INVALID, false, false, false, 0, GST_NORMAL_PLAY_RATE, "testPipeline", 0, false, "testManifest"); + mInterfaceGstPlayer->ConfigurePipeline(GST_FORMAT_MPEGTS, GST_FORMAT_INVALID, GST_FORMAT_INVALID, false, false, false, 0, GST_NORMAL_PLAY_RATE, "testPipeline", 0, false, "testManifest", false); EXPECT_EQ(mPlayerContext->buffering_in_progress, true); EXPECT_EQ(mPlayerContext->buffering_target_state, GST_STATE_PLAYING); @@ -163,7 +163,7 @@ TEST_F(InterfacePlayerTests, ConfigurePipeline_StreamConfiguration) EXPECT_EQ(mPlayerContext->NumberOfTracks, 0); - mInterfaceGstPlayer->ConfigurePipeline(GST_FORMAT_ISO_BMFF, GST_FORMAT_AUDIO_ES_AC3, GST_FORMAT_SUBTITLE_MP4, false, false, false, 0, GST_NORMAL_PLAY_RATE, "testPipeline", 0, false, "testManifest"); + mInterfaceGstPlayer->ConfigurePipeline(GST_FORMAT_ISO_BMFF, GST_FORMAT_AUDIO_ES_AC3, GST_FORMAT_SUBTITLE_MP4, false, false, false, 0, GST_NORMAL_PLAY_RATE, "testPipeline", 0, false, "testManifest", false); EXPECT_EQ(mPlayerContext->NumberOfTracks, 2); EXPECT_EQ(cbResponse, 5); //callback was called @@ -178,7 +178,7 @@ TEST_F(InterfacePlayerTests, ConfigurePipeline_ESChange) EXPECT_EQ(mPlayerContext->NumberOfTracks, 0); - mInterfaceGstPlayer->ConfigurePipeline(GST_FORMAT_ISO_BMFF, GST_FORMAT_AUDIO_ES_AC3, GST_FORMAT_SUBTITLE_MP4, true, false, false, 0, GST_NORMAL_PLAY_RATE, "testPipeline", 0, false, "testManifest"); + mInterfaceGstPlayer->ConfigurePipeline(GST_FORMAT_ISO_BMFF, GST_FORMAT_AUDIO_ES_AC3, GST_FORMAT_SUBTITLE_MP4, true, false, false, 0, GST_NORMAL_PLAY_RATE, "testPipeline", 0, false, "testManifest", false); EXPECT_EQ(mPlayerContext->NumberOfTracks, 1); EXPECT_EQ(cbResponse, 5); From a3a203dd3ed7bb3f8bcc18d2bbf1c6ab2d76eaf8 Mon Sep 17 00:00:00 2001 From: pstroffolino Date: Mon, 4 May 2026 11:37:10 -0400 Subject: [PATCH 2/4] VPAAMP-246 config rename to eAAMPConfig_EnableLiveLatencyRateCorrection for clarity (#1406) * VPAAMP-246 config rename to eAAMPConfig_EnableLiveLatencyRateCorrection for clarity Reason for Change: better renaming for configuration paramaeter to emphasize that we're using rate as part of live latency correction * Add rename note comment to eAAMPConfig_EnableLiveLatencyRateCorrection in AampConfig.h * Remove internal VPAAMP ticket references from source code Risk: Low (left the external facing API name unchanged) Test Guidance: no tests breaking --------- Signed-off-by: Philip Stroffolino Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: pstroffolino <20442081+pstroffolino@users.noreply.github.com> Co-authored-by: Vinish K B Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- AampConfig.cpp | 2 +- AampConfig.h | 2 +- aampgstplayer.cpp | 4 ++-- priv_aamp.cpp | 18 +++++++++--------- simnet/README.md | 2 +- .../tests/AampAbrTests/HybridAbrTests.cpp | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/AampConfig.cpp b/AampConfig.cpp index 9139b719ec..98c65dc38f 100644 --- a/AampConfig.cpp +++ b/AampConfig.cpp @@ -298,7 +298,7 @@ static const ConfigLookupEntryBool mConfigLookupTableBool[AAMPCONFIG_BOOL_COUNT] {false,"useMatchingBaseUrl",eAAMPConfig_MatchBaseUrl,false}, {false,"wifiCurlHeader",eAAMPConfig_WifiCurlHeader,false}, {false,"enableSeekableRange",eAAMPConfig_EnableSeekRange,false}, - {false,"enableLiveLatencyCorrection",eAAMPConfig_EnableLiveLatencyCorrection,true}, + {false,"enableLiveLatencyCorrection",eAAMPConfig_EnableLiveLatencyRateCorrection,true}, {true,"dashParallelFragDownload",eAAMPConfig_DashParallelFragDownload,false}, {false,"persistBitrateOverSeek",eAAMPConfig_PersistentBitRateOverSeek,true}, {true,"setLicenseCaching",eAAMPConfig_SetLicenseCaching,false}, diff --git a/AampConfig.h b/AampConfig.h index dc9f05a980..bad40b4f92 100644 --- a/AampConfig.h +++ b/AampConfig.h @@ -143,7 +143,7 @@ typedef enum eAAMPConfig_MatchBaseUrl, /**< Enable host of main url will be matched with host of base url*/ eAAMPConfig_WifiCurlHeader, eAAMPConfig_EnableSeekRange, /**< Enable seekable range reporting via progress events */ - eAAMPConfig_EnableLiveLatencyCorrection, /**< Enable the live latency (drift) correction by adjusting the playback speed */ + eAAMPConfig_EnableLiveLatencyRateCorrection, /**< Enable the live latency (drift) correction by adjusting the playback speed (renamed from eAAMPConfig_EnableLiveLatencyCorrection) */ eAAMPConfig_DashParallelFragDownload, /**< Enable dash fragment parallel download*/ eAAMPConfig_PersistentBitRateOverSeek, /**< ABR profile persistence during Seek/Trickplay/Audio switching*/ eAAMPConfig_SetLicenseCaching, /**< License caching*/ diff --git a/aampgstplayer.cpp b/aampgstplayer.cpp index 1f6261fe7e..9512db260b 100644 --- a/aampgstplayer.cpp +++ b/aampgstplayer.cpp @@ -463,7 +463,7 @@ static void HandleBufferingTimeoutCb(bool isBufferingTimeoutConditionMet, bool i if(isRateCorrectionDefaultOnPlaying) { // Setting first fractional rate as DEFAULT_INITIAL_RATE_CORRECTION_SPEED right away on PLAYING to avoid audio drop - if (aamp->mConfig->IsConfigSet(eAAMPConfig_EnableLiveLatencyCorrection) && aamp->IsLive()) + if (aamp->mConfig->IsConfigSet(eAAMPConfig_EnableLiveLatencyRateCorrection) && aamp->IsLive()) { AAMPLOG_WARN("Setting first fractional rate %.6f right after moving to PLAYING", DEFAULT_INITIAL_RATE_CORRECTION_SPEED); _this->SetPlayBackRate(DEFAULT_INITIAL_RATE_CORRECTION_SPEED); @@ -840,7 +840,7 @@ void AAMPGstPlayer::Configure(StreamOutputFormat format, StreamOutputFormat audi PipelinePriority = envVal ? atoi(envVal) : -1; bool FirstFrameFlag = aamp->IsFirstVideoFrameDisplayedRequired(); - bool isLiveRateCorrection = aamp->mConfig->IsConfigSet(eAAMPConfig_EnableLiveLatencyCorrection) && aamp->IsLive(); + bool isLiveRateCorrection = aamp->mConfig->IsConfigSet(eAAMPConfig_EnableLiveLatencyRateCorrection) && aamp->IsLive(); /*Configure and create the pipeline*/ playerInstance->ConfigurePipeline(static_cast(format),static_cast(audioFormat),static_cast(subFormat), bESChangeStatus,setReadyAfterPipelineCreation, diff --git a/priv_aamp.cpp b/priv_aamp.cpp index 88bac01a47..174fdd3624 100644 --- a/priv_aamp.cpp +++ b/priv_aamp.cpp @@ -2423,7 +2423,7 @@ void PrivateInstanceAAMP::StartRateCorrectionWorkerThread(void) try { bool newTune = IsNewTune(); - bool enabled = ISCONFIGSET_PRIV(eAAMPConfig_EnableLiveLatencyCorrection); + bool enabled = ISCONFIGSET_PRIV(eAAMPConfig_EnableLiveLatencyRateCorrection); /** Spawn the rate Correction thread if it is live, new tune, thread not started yet, and rate correction enabled **/ if(IsLive() && newTune && !mRateCorrectionThread.joinable() && enabled ) { @@ -2444,7 +2444,7 @@ void PrivateInstanceAAMP::StartRateCorrectionWorkerThread(void) */ void PrivateInstanceAAMP::RateCorrectionWorkerThread(void) { - if(ISCONFIGSET_PRIV(eAAMPConfig_EnableLiveLatencyCorrection)) + if(ISCONFIGSET_PRIV(eAAMPConfig_EnableLiveLatencyRateCorrection)) { int latencyMonitorInterval = GETCONFIGVALUE_PRIV(eAAMPConfig_LatencyMonitorIntervalMs); double normalPlaybackRate = GETCONFIGVALUE_PRIV(eAAMPConfig_NormalLatencyCorrectionPlaybackRate); @@ -2565,8 +2565,8 @@ void PrivateInstanceAAMP::RateCorrectionWorkerThread(void) } else { - AAMPLOG_WARN("Rate Correction Ignored Due to Rate Correction disabled from config; EnableLiveLatencyCorrection [%d]", - ISCONFIGSET_PRIV(eAAMPConfig_EnableLiveLatencyCorrection)); + AAMPLOG_WARN("Rate Correction Ignored Due to Rate Correction disabled from config; EnableLiveLatencyRateCorrection [%d]", + ISCONFIGSET_PRIV(eAAMPConfig_EnableLiveLatencyRateCorrection)); } } @@ -2758,7 +2758,7 @@ void PrivateInstanceAAMP::MonitorProgress(bool sync, bool beginningOfStream) { currentRate = mLatencyMonitor->GetCurrentRate(); } - else if (!mAampLLDashServiceData.lowLatencyMode && ISCONFIGSET_PRIV(eAAMPConfig_EnableLiveLatencyCorrection) ) + else if (!mAampLLDashServiceData.lowLatencyMode && ISCONFIGSET_PRIV(eAAMPConfig_EnableLiveLatencyRateCorrection) ) { currentRate = mCorrectionRate; } @@ -3811,7 +3811,7 @@ bool PrivateInstanceAAMP::ProcessPendingDiscontinuity() mpStreamAbstractionAAMP->ResetESChangeStatus(); mpStreamAbstractionAAMP->ReSetPipelineFlushStatus(); - bool isRateCorrectionEnabled = ISCONFIGSET_PRIV(eAAMPConfig_EnableLiveLatencyCorrection); + bool isRateCorrectionEnabled = ISCONFIGSET_PRIV(eAAMPConfig_EnableLiveLatencyRateCorrection); int disableRateCorrectionTimeInSeconds = GETCONFIGVALUE_PRIV(eAAMPConfig_RateCorrectionDelay); if( disableRateCorrectionTimeInSeconds > 0 && isRateCorrectionEnabled ) { @@ -6406,7 +6406,7 @@ void PrivateInstanceAAMP::TuneHelper(TuneType tuneType, bool seekWhilePaused) mMediaFormat = eMEDIAFORMAT_HLS_MP4; } - if (ISCONFIGSET_PRIV(eAAMPConfig_EnableLiveLatencyCorrection)) + if (ISCONFIGSET_PRIV(eAAMPConfig_EnableLiveLatencyRateCorrection)) { StartRateCorrectionWorkerThread(); } @@ -6822,10 +6822,10 @@ void PrivateInstanceAAMP::Tune(const char *mainManifestUrl, //temporary hack if (strcasestr(mAppName.c_str(), "peacock")) { - // Enable PTS Restamping + // Enable live latency rate correction, PTS Restamping and other app-specific configurations if(SocUtils::EnableLiveLatencyCorrection()) { - SETCONFIGVALUE_PRIV(AAMP_DEFAULT_SETTING, eAAMPConfig_EnableLiveLatencyCorrection, true); + SETCONFIGVALUE_PRIV(AAMP_DEFAULT_SETTING, eAAMPConfig_EnableLiveLatencyRateCorrection, true); } SETCONFIGVALUE_PRIV(AAMP_DEFAULT_SETTING, eAAMPConfig_EnablePTSReStamp, SocUtils::EnablePTSRestamp()); SETCONFIGVALUE_PRIV(AAMP_DEFAULT_SETTING, eAAMPConfig_DisableWebVTT, true); diff --git a/simnet/README.md b/simnet/README.md index 5143dcdec9..735891943b 100644 --- a/simnet/README.md +++ b/simnet/README.md @@ -1,4 +1,4 @@ -# Network Persona Fitter (VPAAMP-129) +# Network Persona Fitter Automatic generation of a simnet **network persona JSON** directly from a live AAMP playback session — no external Python tool or post-processing step required. diff --git a/test/utests/tests/AampAbrTests/HybridAbrTests.cpp b/test/utests/tests/AampAbrTests/HybridAbrTests.cpp index 405c66d224..e6d5b8b5f5 100644 --- a/test/utests/tests/AampAbrTests/HybridAbrTests.cpp +++ b/test/utests/tests/AampAbrTests/HybridAbrTests.cpp @@ -53,7 +53,7 @@ TEST_F(HybridAbrTests, UpdateABRBitrateDataBasedOnCacheOutlierEven) /** * @brief Two HybridABRManager instances must have independent rampup loop * counters. Verifies the per-instance mRampupFromSteadyStateLoop fix - * in HybridABRManager (VPAAMP-173). + * in HybridABRManager. */ TEST_F(HybridAbrTests, CheckRampupFromSteadyState_LoopIsPerInstance) { From 12c635a82ccc12ca7e4c1a8322939e4cbfcfe675 Mon Sep 17 00:00:00 2001 From: pstroffolino Date: Mon, 4 May 2026 13:00:05 -0400 Subject: [PATCH 3/4] VPAAMP-248 Fix godspell warnings: correct misspellings and spelling variants (#1407) * Fix godspell warnings: correct misspellings and spelling variants - Fix 'Ethen' -> 'Ethan' in PlayerLogManager.cpp comment --- middleware/playerLogManager/PlayerLogManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/middleware/playerLogManager/PlayerLogManager.cpp b/middleware/playerLogManager/PlayerLogManager.cpp index b0dbc80fd2..6351aa1ed3 100644 --- a/middleware/playerLogManager/PlayerLogManager.cpp +++ b/middleware/playerLogManager/PlayerLogManager.cpp @@ -157,7 +157,7 @@ void logprintf(MW_LogLevel logLevelIndex, const char* func, int line, const char ethanLogLevel = ETHAN_LOG_MILESTONE; break; } - format_ptr[format_bytes-1] = 0x00; // strip explicit newline, since Ethen logger will add one and we don't want it doubled + format_ptr[format_bytes-1] = 0x00; // strip explicit newline, since Ethan logger will add one and we don't want it doubled vethanlog(ethanLogLevel,NULL,NULL,-1,format_ptr, args); } else From d08031179e8c7a6514dc52d2e7a314be5351be9d Mon Sep 17 00:00:00 2001 From: pstroffolino Date: Mon, 4 May 2026 14:44:02 -0400 Subject: [PATCH 4/4] VPAAMP-242 l1test build failures after osx updates (#1395) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reason for Change: Surgical change in aamp/test/utests/run.sh to address l1test build failure seen after Homebrew OpenSSL upgrade on OSX Tahoe. Updates the L1 unit test runner script on macOS to ensure CMake’s pkg_check_modules(OPENSSL REQUIRED openssl)can reliably locate the Homebrew OpenSSL pkg-config metadata after Homebrew OpenSSL upgrades. Changes: Add a Homebrew-derived OpenSSL pkg-config directory to PKG_CONFIG_PATH for macOS builds in test/utests/run.sh. Test Guidance: no simulator/l1test build failures, on OSX or elsewhere. --- test/utests/run.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/test/utests/run.sh b/test/utests/run.sh index 75654e65a6..17fc0834d3 100755 --- a/test/utests/run.sh +++ b/test/utests/run.sh @@ -105,7 +105,15 @@ mkdir -p build cd build if [[ "$OSTYPE" == "darwin"* ]]; then - PKG_CONFIG_PATH=/Library/Frameworks/GStreamer.framework/Versions/1.0/lib/pkgconfig:${AAMPDIR}/.libs/lib/pkgconfig:/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH cmake -DCOVERAGE_ENABLED=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_RDKE_TEST_RUN=$rdke_build ../ + # Resolve Homebrew OpenSSL pkgconfig dir (openssl@3 is the repo default). + # brew --prefix openssl resolves to openssl@3 on standard Homebrew setups. + _ssl_prefix=$(brew --prefix openssl@3 2>/dev/null) + if [[ ! -f "${_ssl_prefix}/lib/pkgconfig/openssl.pc" ]]; then + echo "ERROR: Could not find a Homebrew OpenSSL pkgconfig file." + echo "Please install it with: brew install openssl@3" + exit 1 + fi + PKG_CONFIG_PATH=/Library/Frameworks/GStreamer.framework/Versions/1.0/lib/pkgconfig:${AAMPDIR}/.libs/lib/pkgconfig:/usr/local/lib/pkgconfig:${_ssl_prefix}/lib/pkgconfig:$PKG_CONFIG_PATH cmake -DCOVERAGE_ENABLED=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_RDKE_TEST_RUN=$rdke_build ../ elif [[ "$OSTYPE" == "linux"* ]]; then PKG_CONFIG_PATH=${AAMPDIR}/.libs/lib/pkgconfig cmake --no-warn-unused-cli -DCMAKE_INSTALL_PREFIX=${AAMPDIR}/.libs -DCMAKE_PLATFORM_UBUNTU=1 -DCOVERAGE_ENABLED=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_LIBRARY_PATH=${AAMPDIR}/.libs/lib -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_C_COMPILER:FILEPATH=/usr/bin/gcc -DCMAKE_CXX_COMPILER:FILEPATH=/usr/bin/g++ -DCMAKE_RDKE_TEST_RUN=$rdke_build -S../ -B$PWD -G "Unix Makefiles" export LD_LIBRARY_PATH=${AAMPDIR}/.libs/lib