From cd6162e08136ebb2abc489f9b007ac85d81a3f51 Mon Sep 17 00:00:00 2001 From: dp0000 <53818367+dp0000@users.noreply.github.com> Date: Tue, 20 Oct 2026 12:47:18 +0530 Subject: [PATCH 1/9] Update AampDRMLicManager.h --- drm/AampDRMLicManager.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drm/AampDRMLicManager.h b/drm/AampDRMLicManager.h index b1cf5c1b16..043dba3ba5 100644 --- a/drm/AampDRMLicManager.h +++ b/drm/AampDRMLicManager.h @@ -30,6 +30,11 @@ #include "DrmSession.h" #include "AampCurlDownloader.h" #include "DrmSessionManager.h" +#include +#include +#include +#include +#include enum ProfilerAction { @@ -344,4 +349,15 @@ class AampDRMLicenseManager const unsigned char* contentMetadataPtr = nullptr, bool isPrimarySession = false); AAMPTuneFailure MapDrmToAampTuneFailure(DrmTuneFailure drmError); + +private: + void WatermarkWorkerThread(); + bool EnqueueWatermarkTask(std::function task); + void StopWatermarkWorker(); + + std::mutex mWatermarkTaskMutex; + std::condition_variable mWatermarkTaskCondition; + std::deque> mWatermarkTaskQueue; + bool mWatermarkWorkerStopping{false}; + std::thread mWatermarkWorker; }; From 98808ef0b65ec57da7a6df51b6abb94c538987ac Mon Sep 17 00:00:00 2001 From: dp0000 <53818367+dp0000@users.noreply.github.com> Date: Tue, 20 Oct 2026 12:48:13 +0530 Subject: [PATCH 2/9] Update AampDRMLicManager.cpp --- drm/AampDRMLicManager.cpp | 93 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 89 insertions(+), 4 deletions(-) diff --git a/drm/AampDRMLicManager.cpp b/drm/AampDRMLicManager.cpp index 2c2c77e3ee..48e219daf7 100644 --- a/drm/AampDRMLicManager.cpp +++ b/drm/AampDRMLicManager.cpp @@ -123,6 +123,7 @@ AampDRMLicenseManager::AampDRMLicenseManager(int maxDrmSessions, PrivateInstance mLicensePrefetcher = new AampLicensePreFetcher(aampInstance); ContentSecurityManager::UseFireboltSDK(aampInstance->mConfig->IsConfigSet(eAAMPConfig_UseFireboltSDK)); mLicensePrefetcher->Init(); + mWatermarkWorker = std::thread(&AampDRMLicenseManager::WatermarkWorkerThread, this); } /** @@ -130,6 +131,7 @@ AampDRMLicenseManager::AampDRMLicenseManager(int maxDrmSessions, PrivateInstance */ AampDRMLicenseManager::~AampDRMLicenseManager() { + StopWatermarkWorker(); SAFE_DELETE(mLicensePrefetcher); SAFE_DELETE(mDrmSessionManager); releaseLicenseRenewalThreads(); @@ -1420,7 +1422,12 @@ void AampDRMLicenseManager::QueueProtectionEvent(std::shared_ptr drmH */ void AampDRMLicenseManager::setPlaybackSpeedState(bool live, double currentLatency, bool livepoint , double liveOffsetMs,int speed, double positionMs, bool firstFrameSeen) { - mDrmSessionManager->setPlaybackSpeedState(live, currentLatency, livepoint, liveOffsetMs, speed, positionMs, firstFrameSeen); + if (!EnqueueWatermarkTask([this, live, currentLatency, livepoint, liveOffsetMs, speed, positionMs, firstFrameSeen]() { + mDrmSessionManager->setPlaybackSpeedState(live, currentLatency, livepoint, liveOffsetMs, speed, positionMs, firstFrameSeen); + })) + { + mDrmSessionManager->setPlaybackSpeedState(live, currentLatency, livepoint, liveOffsetMs, speed, positionMs, firstFrameSeen); + } } /** @@ -1428,7 +1435,12 @@ void AampDRMLicenseManager::setPlaybackSpeedState(bool live, double currentLaten */ void AampDRMLicenseManager::hideWatermarkOnDetach(void) { - mDrmSessionManager->hideWatermarkOnDetach( ); + if (!EnqueueWatermarkTask([this]() { + mDrmSessionManager->hideWatermarkOnDetach(); + })) + { + mDrmSessionManager->hideWatermarkOnDetach(); + } } /** @@ -1436,12 +1448,85 @@ void AampDRMLicenseManager::hideWatermarkOnDetach(void) */ void AampDRMLicenseManager::setVideoMute(bool live, double currentLatency, bool livepoint , double liveOffsetMs,bool isVideoOnMute, double positionMs) { - mDrmSessionManager->setVideoMute(live, currentLatency, livepoint, liveOffsetMs,isVideoOnMute, positionMs); + if (!EnqueueWatermarkTask([this, live, currentLatency, livepoint, liveOffsetMs, isVideoOnMute, positionMs]() { + mDrmSessionManager->setVideoMute(live, currentLatency, livepoint, liveOffsetMs, isVideoOnMute, positionMs); + })) + { + mDrmSessionManager->setVideoMute(live, currentLatency, livepoint, liveOffsetMs, isVideoOnMute, positionMs); + } } void AampDRMLicenseManager::setVideoWindowSize(int width, int height) { - mDrmSessionManager->setVideoWindowSize(width, height); + if (!EnqueueWatermarkTask([this, width, height]() { + mDrmSessionManager->setVideoWindowSize(width, height); + })) + { + mDrmSessionManager->setVideoWindowSize(width, height); + } +} + +/** + * @brief Queue and process watermarking state updates serially away from caller threads. + */ +bool AampDRMLicenseManager::EnqueueWatermarkTask(std::function task) +{ + { + std::lock_guard lock(mWatermarkTaskMutex); + if (mWatermarkWorkerStopping) + { + return false; + } + mWatermarkTaskQueue.emplace_back(std::move(task)); + } + mWatermarkTaskCondition.notify_one(); + return true; +} + +void AampDRMLicenseManager::WatermarkWorkerThread() +{ + for (;;) + { + std::function task; + { + std::unique_lock lock(mWatermarkTaskMutex); + mWatermarkTaskCondition.wait(lock, [this]() { + return mWatermarkWorkerStopping || !mWatermarkTaskQueue.empty(); + }); + if (mWatermarkTaskQueue.empty()) + { + if (mWatermarkWorkerStopping) + { + return; + } + continue; + } + task = std::move(mWatermarkTaskQueue.front()); + mWatermarkTaskQueue.pop_front(); + } + + try + { + task(); + } + catch (...) + { + MW_LOG_ERR("Watermark worker task threw an exception"); + } + } +} + +void AampDRMLicenseManager::StopWatermarkWorker() +{ + { + std::lock_guard lock(mWatermarkTaskMutex); + mWatermarkWorkerStopping = true; + } + mWatermarkTaskCondition.notify_all(); + if (mWatermarkWorker.joinable()) + { + mWatermarkWorker.join(); + } } /** From 8aa98ea5893291a3fad73f014771db20e031c79d Mon Sep 17 00:00:00 2001 From: dp0000 <53818367+dp0000@users.noreply.github.com> Date: Mon, 26 Oct 2026 15:56:45 +0530 Subject: [PATCH 3/9] Update AampDRMLicManager.cpp --- drm/AampDRMLicManager.cpp | 75 +++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 26 deletions(-) diff --git a/drm/AampDRMLicManager.cpp b/drm/AampDRMLicManager.cpp index 48e219daf7..9b049bb0f0 100644 --- a/drm/AampDRMLicManager.cpp +++ b/drm/AampDRMLicManager.cpp @@ -34,10 +34,23 @@ #include "AampConfig.h" #include "PlayerUtils.h" #include "PlayerSecInterface.h" +#include +#include #include "AAMPAnomalyMessageType.h" #include "AuthTokenErrors.h" +namespace +{ +using WatermarkTimingClock = std::chrono::steady_clock; +static std::atomic gWatermarkTimingId{0}; + +static long long WatermarkElapsedUs(WatermarkTimingClock::time_point start, WatermarkTimingClock::time_point end) +{ + return std::chrono::duration_cast(end - start).count(); +} +} + #define SESSION_TOKEN_URL "http://localhost:50050/authService/getSessionToken" #define LICENCE_REQUEST_HEADER_ACCEPT "Accept:" @@ -1422,12 +1435,9 @@ void AampDRMLicenseManager::QueueProtectionEvent(std::shared_ptr drmH */ void AampDRMLicenseManager::setPlaybackSpeedState(bool live, double currentLatency, bool livepoint , double liveOffsetMs,int speed, double positionMs, bool firstFrameSeen) { - if (!EnqueueWatermarkTask([this, live, currentLatency, livepoint, liveOffsetMs, speed, positionMs, firstFrameSeen]() { + EnqueueWatermarkTask("setPlaybackSpeedState", [this, live, currentLatency, livepoint, liveOffsetMs, speed, positionMs, firstFrameSeen]() { mDrmSessionManager->setPlaybackSpeedState(live, currentLatency, livepoint, liveOffsetMs, speed, positionMs, firstFrameSeen); - })) - { - mDrmSessionManager->setPlaybackSpeedState(live, currentLatency, livepoint, liveOffsetMs, speed, positionMs, firstFrameSeen); - } + }); } /** @@ -1435,12 +1445,9 @@ void AampDRMLicenseManager::setPlaybackSpeedState(bool live, double currentLaten */ void AampDRMLicenseManager::hideWatermarkOnDetach(void) { - if (!EnqueueWatermarkTask([this]() { + EnqueueWatermarkTask("hideWatermarkOnDetach", [this]() { mDrmSessionManager->hideWatermarkOnDetach(); - })) - { - mDrmSessionManager->hideWatermarkOnDetach(); - } + }); } /** @@ -1448,39 +1455,55 @@ void AampDRMLicenseManager::hideWatermarkOnDetach(void) */ void AampDRMLicenseManager::setVideoMute(bool live, double currentLatency, bool livepoint , double liveOffsetMs,bool isVideoOnMute, double positionMs) { - if (!EnqueueWatermarkTask([this, live, currentLatency, livepoint, liveOffsetMs, isVideoOnMute, positionMs]() { + EnqueueWatermarkTask("setVideoMute", [this, live, currentLatency, livepoint, liveOffsetMs, isVideoOnMute, positionMs]() { mDrmSessionManager->setVideoMute(live, currentLatency, livepoint, liveOffsetMs, isVideoOnMute, positionMs); - })) - { - mDrmSessionManager->setVideoMute(live, currentLatency, livepoint, liveOffsetMs, isVideoOnMute, positionMs); - } + }); } void AampDRMLicenseManager::setVideoWindowSize(int width, int height) { - if (!EnqueueWatermarkTask([this, width, height]() { + EnqueueWatermarkTask("setVideoWindowSize", [this, width, height]() { mDrmSessionManager->setVideoWindowSize(width, height); - })) - { - mDrmSessionManager->setVideoWindowSize(width, height); - } + }); } /** * @brief Queue and process watermarking state updates serially away from caller threads. */ -bool AampDRMLicenseManager::EnqueueWatermarkTask(std::function task) +void AampDRMLicenseManager::EnqueueWatermarkTask(const char *operation, std::function task) { + const auto callerStart = WatermarkTimingClock::now(); + const auto timingId = ++gWatermarkTimingId; + const auto dispatchStart = WatermarkTimingClock::now(); + auto timedTask = [operation, timingId, dispatchStart, task = std::move(task)]() mutable { + const auto taskStart = WatermarkTimingClock::now(); + MW_LOG_INFO("[WM_TIMING] id=%llu op=%s phase=task_start dispatch_delay_us=%lld", + timingId, operation, WatermarkElapsedUs(dispatchStart, taskStart)); + task(); + const auto taskEnd = WatermarkTimingClock::now(); + MW_LOG_INFO("[WM_TIMING] id=%llu op=%s phase=task_end operation_us=%lld", + timingId, operation, WatermarkElapsedUs(taskStart, taskEnd)); + }; + bool queued = false; { std::lock_guard lock(mWatermarkTaskMutex); - if (mWatermarkWorkerStopping) + if (!mWatermarkWorkerStopping) { - return false; + mWatermarkTaskQueue.emplace_back(std::move(timedTask)); + queued = true; } - mWatermarkTaskQueue.emplace_back(std::move(task)); } - mWatermarkTaskCondition.notify_one(); - return true; + if (queued) + { + mWatermarkTaskCondition.notify_one(); + } + else + { + MW_LOG_WARN("[WM_TIMING] id=%llu op=%s phase=caller_fallback", timingId, operation); + timedTask(); + } + MW_LOG_INFO("[WM_TIMING] id=%llu op=%s phase=caller_return dispatch=%s caller_us=%lld", + timingId, operation, queued ? "queued" : "fallback", WatermarkElapsedUs(callerStart, WatermarkTimingClock::now())); } void AampDRMLicenseManager::WatermarkWorkerThread() From a5d45a767ce01ce70679739425f1ce1ea63f4e70 Mon Sep 17 00:00:00 2001 From: dp0000 <53818367+dp0000@users.noreply.github.com> Date: Mon, 26 Oct 2026 15:57:56 +0530 Subject: [PATCH 4/9] Update AampDRMLicManager.h --- drm/AampDRMLicManager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drm/AampDRMLicManager.h b/drm/AampDRMLicManager.h index 043dba3ba5..772a36f87f 100644 --- a/drm/AampDRMLicManager.h +++ b/drm/AampDRMLicManager.h @@ -352,7 +352,7 @@ class AampDRMLicenseManager private: void WatermarkWorkerThread(); - bool EnqueueWatermarkTask(std::function task); + void EnqueueWatermarkTask(const char *operation, std::function task); void StopWatermarkWorker(); std::mutex mWatermarkTaskMutex; From 4e0e74ffafcbdf0276f29ae01d9e2d634dbd0c2d Mon Sep 17 00:00:00 2001 From: dp0000 <53818367+dp0000@users.noreply.github.com> Date: Mon, 26 Oct 2026 15:58:33 +0530 Subject: [PATCH 5/9] Update DrmSessionManager.cpp --- middleware/drm/DrmSessionManager.cpp | 29 ++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/middleware/drm/DrmSessionManager.cpp b/middleware/drm/DrmSessionManager.cpp index 65fe1d5dad..fcb23a20cb 100755 --- a/middleware/drm/DrmSessionManager.cpp +++ b/middleware/drm/DrmSessionManager.cpp @@ -30,6 +30,7 @@ #include #include "PlayerUtils.h" #include "ContentSecurityManager.h" +#include #define DRM_METADATA_TAG_START "" #define DRM_METADATA_TAG_END "" #define SESSION_TOKEN_URL "http://localhost:50050/authService/getSessionToken" @@ -37,6 +38,14 @@ #define INVALID_SESSION_SLOT -1 #define DEFAULT_CDM_WAIT_TIMEOUT_MS 2000 +namespace +{ +static long long SecurityManagerElapsedUs(std::chrono::steady_clock::time_point start, std::chrono::steady_clock::time_point end) +{ + return std::chrono::duration_cast(end - start).count(); +} +} + /** * @brief KeyIdEntries constructor. */ @@ -221,7 +230,10 @@ void DrmSessionManager::setVideoWindowSize(int width, int height) if(localSession.isSessionValid()) { MW_LOG_WARN("In DrmSessionManager:: valid session ID. Calling setVideoWindowSize()."); - ContentSecurityManager::GetInstance()->setVideoWindowSize(localSession.getSessionID(), width, height); + auto apiStart = std::chrono::steady_clock::now(); + bool result = ContentSecurityManager::GetInstance()->setVideoWindowSize(localSession.getSessionID(), width, height); + MW_LOG_INFO("[WM_TIMING] op=setVideoWindowSize phase=api_end api_us=%lld result=%d", + SecurityManagerElapsedUs(apiStart, std::chrono::steady_clock::now()), result); } } /** @@ -235,7 +247,10 @@ void DrmSessionManager::setVideoMute(bool live, double currentLatency, bool live auto localSession = mContentSecurityManagerSession; //Remove potential isSessionValid(), getSessionID() race by using a local copy if(localSession.isSessionValid()) { - ContentSecurityManager::GetInstance()->UpdateSessionState(localSession.getSessionID(), !mIsVideoOnMute.load()); + auto apiStart = std::chrono::steady_clock::now(); + bool result = ContentSecurityManager::GetInstance()->UpdateSessionState(localSession.getSessionID(), !mIsVideoOnMute.load()); + MW_LOG_INFO("[WM_TIMING] op=setVideoMute.UpdateSessionState phase=api_end api_us=%lld result=%d", + SecurityManagerElapsedUs(apiStart, std::chrono::steady_clock::now()), result); if(!mIsVideoOnMute.load()) { //this is required as secmanager waits for speed update to show wm once session is active @@ -255,7 +270,10 @@ void DrmSessionManager::hideWatermarkOnDetach(void) auto localSession = mContentSecurityManagerSession; //Remove potential isSessionValid(), getSessionID() race by using a local copy if(localSession.isSessionValid()) { - ContentSecurityManager::GetInstance()->UpdateSessionState(localSession.getSessionID(), false); + auto apiStart = std::chrono::steady_clock::now(); + bool result = ContentSecurityManager::GetInstance()->UpdateSessionState(localSession.getSessionID(), false); + MW_LOG_INFO("[WM_TIMING] op=hideWatermarkOnDetach.UpdateSessionState phase=api_end api_us=%lld result=%d", + SecurityManagerElapsedUs(apiStart, std::chrono::steady_clock::now()), result); } mFirstFrameSeen.store(false); } @@ -297,7 +315,10 @@ void DrmSessionManager::setPlaybackSpeedState(bool live, double currentLatency, } MW_LOG_INFO("setPlaybackSpeedState pos=%fs speed=%d", adjustedPos/1000, speed ); - ContentSecurityManager::GetInstance()->setPlaybackSpeedState(localSession.getSessionID(), speed, adjustedPos); + auto apiStart = std::chrono::steady_clock::now(); + bool result = ContentSecurityManager::GetInstance()->setPlaybackSpeedState(localSession.getSessionID(), speed, adjustedPos); + MW_LOG_INFO("[WM_TIMING] op=setPlaybackSpeedState phase=api_end api_us=%lld result=%d", + SecurityManagerElapsedUs(apiStart, std::chrono::steady_clock::now()), result); } else { From ade373af864144122a3d8dee7394e107aeb6916b Mon Sep 17 00:00:00 2001 From: dp0000 <53818367+dp0000@users.noreply.github.com> Date: Mon, 26 Oct 2026 18:00:35 +0530 Subject: [PATCH 6/9] Update DrmSessionManager.cpp --- middleware/drm/DrmSessionManager.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/middleware/drm/DrmSessionManager.cpp b/middleware/drm/DrmSessionManager.cpp index fcb23a20cb..13df97c438 100755 --- a/middleware/drm/DrmSessionManager.cpp +++ b/middleware/drm/DrmSessionManager.cpp @@ -232,7 +232,7 @@ void DrmSessionManager::setVideoWindowSize(int width, int height) MW_LOG_WARN("In DrmSessionManager:: valid session ID. Calling setVideoWindowSize()."); auto apiStart = std::chrono::steady_clock::now(); bool result = ContentSecurityManager::GetInstance()->setVideoWindowSize(localSession.getSessionID(), width, height); - MW_LOG_INFO("[WM_TIMING] op=setVideoWindowSize phase=api_end api_us=%lld result=%d", + MW_LOG_ERR("[WM_TIMING] op=setVideoWindowSize phase=api_end api_us=%lld result=%d", SecurityManagerElapsedUs(apiStart, std::chrono::steady_clock::now()), result); } } @@ -249,7 +249,7 @@ void DrmSessionManager::setVideoMute(bool live, double currentLatency, bool live { auto apiStart = std::chrono::steady_clock::now(); bool result = ContentSecurityManager::GetInstance()->UpdateSessionState(localSession.getSessionID(), !mIsVideoOnMute.load()); - MW_LOG_INFO("[WM_TIMING] op=setVideoMute.UpdateSessionState phase=api_end api_us=%lld result=%d", + MW_LOG_ERR("[WM_TIMING] op=setVideoMute.UpdateSessionState phase=api_end api_us=%lld result=%d", SecurityManagerElapsedUs(apiStart, std::chrono::steady_clock::now()), result); if(!mIsVideoOnMute.load()) { @@ -272,7 +272,7 @@ void DrmSessionManager::hideWatermarkOnDetach(void) { auto apiStart = std::chrono::steady_clock::now(); bool result = ContentSecurityManager::GetInstance()->UpdateSessionState(localSession.getSessionID(), false); - MW_LOG_INFO("[WM_TIMING] op=hideWatermarkOnDetach.UpdateSessionState phase=api_end api_us=%lld result=%d", + MW_LOG_ERR("[WM_TIMING] op=hideWatermarkOnDetach.UpdateSessionState phase=api_end api_us=%lld result=%d", SecurityManagerElapsedUs(apiStart, std::chrono::steady_clock::now()), result); } mFirstFrameSeen.store(false); @@ -317,7 +317,7 @@ void DrmSessionManager::setPlaybackSpeedState(bool live, double currentLatency, MW_LOG_INFO("setPlaybackSpeedState pos=%fs speed=%d", adjustedPos/1000, speed ); auto apiStart = std::chrono::steady_clock::now(); bool result = ContentSecurityManager::GetInstance()->setPlaybackSpeedState(localSession.getSessionID(), speed, adjustedPos); - MW_LOG_INFO("[WM_TIMING] op=setPlaybackSpeedState phase=api_end api_us=%lld result=%d", + MW_LOG_ERR("[WM_TIMING] op=setPlaybackSpeedState phase=api_end api_us=%lld result=%d", SecurityManagerElapsedUs(apiStart, std::chrono::steady_clock::now()), result); } else From 76285c5d816e346d101715a8a56dc080f417fc05 Mon Sep 17 00:00:00 2001 From: dp0000 <53818367+dp0000@users.noreply.github.com> Date: Mon, 26 Oct 2026 18:01:25 +0530 Subject: [PATCH 7/9] Update AampDRMLicManager.cpp --- drm/AampDRMLicManager.cpp | 114 +++++++++++++++++++++++++------------- 1 file changed, 76 insertions(+), 38 deletions(-) diff --git a/drm/AampDRMLicManager.cpp b/drm/AampDRMLicManager.cpp index 9b049bb0f0..c0712cf54c 100644 --- a/drm/AampDRMLicManager.cpp +++ b/drm/AampDRMLicManager.cpp @@ -34,11 +34,11 @@ #include "AampConfig.h" #include "PlayerUtils.h" #include "PlayerSecInterface.h" -#include -#include #include "AAMPAnomalyMessageType.h" #include "AuthTokenErrors.h" +#include +#include namespace { @@ -1435,9 +1435,24 @@ void AampDRMLicenseManager::QueueProtectionEvent(std::shared_ptr drmH */ void AampDRMLicenseManager::setPlaybackSpeedState(bool live, double currentLatency, bool livepoint , double liveOffsetMs,int speed, double positionMs, bool firstFrameSeen) { - EnqueueWatermarkTask("setPlaybackSpeedState", [this, live, currentLatency, livepoint, liveOffsetMs, speed, positionMs, firstFrameSeen]() { + const auto callerStart = WatermarkTimingClock::now(); + const auto timingId = ++gWatermarkTimingId; + auto task = [this, live, currentLatency, livepoint, liveOffsetMs, speed, positionMs, firstFrameSeen, callerStart, timingId]() { + const auto taskStart = WatermarkTimingClock::now(); + MW_LOG_ERR("[WM_TIMING] id=%llu op=setPlaybackSpeedState phase=task_start dispatch_delay_us=%lld", + timingId, WatermarkElapsedUs(callerStart, taskStart)); mDrmSessionManager->setPlaybackSpeedState(live, currentLatency, livepoint, liveOffsetMs, speed, positionMs, firstFrameSeen); - }); + MW_LOG_ERR("[WM_TIMING] id=%llu op=setPlaybackSpeedState phase=task_end operation_us=%lld", + timingId, WatermarkElapsedUs(taskStart, WatermarkTimingClock::now())); + }; + const bool queued = EnqueueWatermarkTask(task); + if (!queued) + { + MW_LOG_ERR("[WM_TIMING] id=%llu op=setPlaybackSpeedState phase=caller_fallback", timingId); + task(); + } + MW_LOG_ERR("[WM_TIMING] id=%llu op=setPlaybackSpeedState phase=caller_return dispatch=%s caller_us=%lld", + timingId, queued ? "queued" : "fallback", WatermarkElapsedUs(callerStart, WatermarkTimingClock::now())); } /** @@ -1445,9 +1460,24 @@ void AampDRMLicenseManager::setPlaybackSpeedState(bool live, double currentLaten */ void AampDRMLicenseManager::hideWatermarkOnDetach(void) { - EnqueueWatermarkTask("hideWatermarkOnDetach", [this]() { + const auto callerStart = WatermarkTimingClock::now(); + const auto timingId = ++gWatermarkTimingId; + auto task = [this, callerStart, timingId]() { + const auto taskStart = WatermarkTimingClock::now(); + MW_LOG_ERR("[WM_TIMING] id=%llu op=hideWatermarkOnDetach phase=task_start dispatch_delay_us=%lld", + timingId, WatermarkElapsedUs(callerStart, taskStart)); mDrmSessionManager->hideWatermarkOnDetach(); - }); + MW_LOG_ERR("[WM_TIMING] id=%llu op=hideWatermarkOnDetach phase=task_end operation_us=%lld", + timingId, WatermarkElapsedUs(taskStart, WatermarkTimingClock::now())); + }; + const bool queued = EnqueueWatermarkTask(task); + if (!queued) + { + MW_LOG_ERR("[WM_TIMING] id=%llu op=hideWatermarkOnDetach phase=caller_fallback", timingId); + task(); + } + MW_LOG_ERR("[WM_TIMING] id=%llu op=hideWatermarkOnDetach phase=caller_return dispatch=%s caller_us=%lld", + timingId, queued ? "queued" : "fallback", WatermarkElapsedUs(callerStart, WatermarkTimingClock::now())); } /** @@ -1455,55 +1485,63 @@ void AampDRMLicenseManager::hideWatermarkOnDetach(void) */ void AampDRMLicenseManager::setVideoMute(bool live, double currentLatency, bool livepoint , double liveOffsetMs,bool isVideoOnMute, double positionMs) { - EnqueueWatermarkTask("setVideoMute", [this, live, currentLatency, livepoint, liveOffsetMs, isVideoOnMute, positionMs]() { + const auto callerStart = WatermarkTimingClock::now(); + const auto timingId = ++gWatermarkTimingId; + auto task = [this, live, currentLatency, livepoint, liveOffsetMs, isVideoOnMute, positionMs, callerStart, timingId]() { + const auto taskStart = WatermarkTimingClock::now(); + MW_LOG_ERR("[WM_TIMING] id=%llu op=setVideoMute phase=task_start dispatch_delay_us=%lld", + timingId, WatermarkElapsedUs(callerStart, taskStart)); mDrmSessionManager->setVideoMute(live, currentLatency, livepoint, liveOffsetMs, isVideoOnMute, positionMs); - }); + MW_LOG_ERR("[WM_TIMING] id=%llu op=setVideoMute phase=task_end operation_us=%lld", + timingId, WatermarkElapsedUs(taskStart, WatermarkTimingClock::now())); + }; + const bool queued = EnqueueWatermarkTask(task); + if (!queued) + { + MW_LOG_ERR("[WM_TIMING] id=%llu op=setVideoMute phase=caller_fallback", timingId); + task(); + } + MW_LOG_ERR("[WM_TIMING] id=%llu op=setVideoMute phase=caller_return dispatch=%s caller_us=%lld", + timingId, queued ? "queued" : "fallback", WatermarkElapsedUs(callerStart, WatermarkTimingClock::now())); } void AampDRMLicenseManager::setVideoWindowSize(int width, int height) { - EnqueueWatermarkTask("setVideoWindowSize", [this, width, height]() { + const auto callerStart = WatermarkTimingClock::now(); + const auto timingId = ++gWatermarkTimingId; + auto task = [this, width, height, callerStart, timingId]() { + const auto taskStart = WatermarkTimingClock::now(); + MW_LOG_ERR("[WM_TIMING] id=%llu op=setVideoWindowSize phase=task_start dispatch_delay_us=%lld", + timingId, WatermarkElapsedUs(callerStart, taskStart)); mDrmSessionManager->setVideoWindowSize(width, height); - }); + MW_LOG_ERR("[WM_TIMING] id=%llu op=setVideoWindowSize phase=task_end operation_us=%lld", + timingId, WatermarkElapsedUs(taskStart, WatermarkTimingClock::now())); + }; + const bool queued = EnqueueWatermarkTask(task); + if (!queued) + { + MW_LOG_ERR("[WM_TIMING] id=%llu op=setVideoWindowSize phase=caller_fallback", timingId); + task(); + } + MW_LOG_ERR("[WM_TIMING] id=%llu op=setVideoWindowSize phase=caller_return dispatch=%s caller_us=%lld", + timingId, queued ? "queued" : "fallback", WatermarkElapsedUs(callerStart, WatermarkTimingClock::now())); } /** * @brief Queue and process watermarking state updates serially away from caller threads. */ -void AampDRMLicenseManager::EnqueueWatermarkTask(const char *operation, std::function task) +bool AampDRMLicenseManager::EnqueueWatermarkTask(std::function task) { - const auto callerStart = WatermarkTimingClock::now(); - const auto timingId = ++gWatermarkTimingId; - const auto dispatchStart = WatermarkTimingClock::now(); - auto timedTask = [operation, timingId, dispatchStart, task = std::move(task)]() mutable { - const auto taskStart = WatermarkTimingClock::now(); - MW_LOG_INFO("[WM_TIMING] id=%llu op=%s phase=task_start dispatch_delay_us=%lld", - timingId, operation, WatermarkElapsedUs(dispatchStart, taskStart)); - task(); - const auto taskEnd = WatermarkTimingClock::now(); - MW_LOG_INFO("[WM_TIMING] id=%llu op=%s phase=task_end operation_us=%lld", - timingId, operation, WatermarkElapsedUs(taskStart, taskEnd)); - }; - bool queued = false; { std::lock_guard lock(mWatermarkTaskMutex); - if (!mWatermarkWorkerStopping) + if (mWatermarkWorkerStopping) { - mWatermarkTaskQueue.emplace_back(std::move(timedTask)); - queued = true; + return false; } + mWatermarkTaskQueue.emplace_back(std::move(task)); } - if (queued) - { - mWatermarkTaskCondition.notify_one(); - } - else - { - MW_LOG_WARN("[WM_TIMING] id=%llu op=%s phase=caller_fallback", timingId, operation); - timedTask(); - } - MW_LOG_INFO("[WM_TIMING] id=%llu op=%s phase=caller_return dispatch=%s caller_us=%lld", - timingId, operation, queued ? "queued" : "fallback", WatermarkElapsedUs(callerStart, WatermarkTimingClock::now())); + mWatermarkTaskCondition.notify_one(); + return true; } void AampDRMLicenseManager::WatermarkWorkerThread() From ffbedba7d5cbe697954494fe380c05107271a000 Mon Sep 17 00:00:00 2001 From: dp0000 <53818367+dp0000@users.noreply.github.com> Date: Thu, 29 Oct 2026 15:39:24 +0530 Subject: [PATCH 8/9] Update AampDRMLicManager.cpp --- drm/AampDRMLicManager.cpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/drm/AampDRMLicManager.cpp b/drm/AampDRMLicManager.cpp index c0712cf54c..36501b2ba8 100644 --- a/drm/AampDRMLicManager.cpp +++ b/drm/AampDRMLicManager.cpp @@ -1445,7 +1445,7 @@ void AampDRMLicenseManager::setPlaybackSpeedState(bool live, double currentLaten MW_LOG_ERR("[WM_TIMING] id=%llu op=setPlaybackSpeedState phase=task_end operation_us=%lld", timingId, WatermarkElapsedUs(taskStart, WatermarkTimingClock::now())); }; - const bool queued = EnqueueWatermarkTask(task); + const bool queued = EnqueueWatermarkTask("setPlaybackSpeedState", timingId, task); if (!queued) { MW_LOG_ERR("[WM_TIMING] id=%llu op=setPlaybackSpeedState phase=caller_fallback", timingId); @@ -1470,7 +1470,7 @@ void AampDRMLicenseManager::hideWatermarkOnDetach(void) MW_LOG_ERR("[WM_TIMING] id=%llu op=hideWatermarkOnDetach phase=task_end operation_us=%lld", timingId, WatermarkElapsedUs(taskStart, WatermarkTimingClock::now())); }; - const bool queued = EnqueueWatermarkTask(task); + const bool queued = EnqueueWatermarkTask("hideWatermarkOnDetach", timingId, task); if (!queued) { MW_LOG_ERR("[WM_TIMING] id=%llu op=hideWatermarkOnDetach phase=caller_fallback", timingId); @@ -1495,7 +1495,7 @@ void AampDRMLicenseManager::setVideoMute(bool live, double currentLatency, bool MW_LOG_ERR("[WM_TIMING] id=%llu op=setVideoMute phase=task_end operation_us=%lld", timingId, WatermarkElapsedUs(taskStart, WatermarkTimingClock::now())); }; - const bool queued = EnqueueWatermarkTask(task); + const bool queued = EnqueueWatermarkTask("setVideoMute", timingId, task); if (!queued) { MW_LOG_ERR("[WM_TIMING] id=%llu op=setVideoMute phase=caller_fallback", timingId); @@ -1517,7 +1517,7 @@ void AampDRMLicenseManager::setVideoWindowSize(int width, int height) MW_LOG_ERR("[WM_TIMING] id=%llu op=setVideoWindowSize phase=task_end operation_us=%lld", timingId, WatermarkElapsedUs(taskStart, WatermarkTimingClock::now())); }; - const bool queued = EnqueueWatermarkTask(task); + const bool queued = EnqueueWatermarkTask("setVideoWindowSize", timingId, task); if (!queued) { MW_LOG_ERR("[WM_TIMING] id=%llu op=setVideoWindowSize phase=caller_fallback", timingId); @@ -1530,17 +1530,20 @@ void AampDRMLicenseManager::setVideoWindowSize(int width, int height) /** * @brief Queue and process watermarking state updates serially away from caller threads. */ -bool AampDRMLicenseManager::EnqueueWatermarkTask(std::function task) +bool AampDRMLicenseManager::EnqueueWatermarkTask(const char *operation, unsigned long long timingId, std::function task) { + size_t queueDepth; { std::lock_guard lock(mWatermarkTaskMutex); if (mWatermarkWorkerStopping) { return false; } - mWatermarkTaskQueue.emplace_back(std::move(task)); + mWatermarkTaskQueue.push_back({operation, timingId, WatermarkTimingClock::now(), std::move(task)}); + queueDepth = mWatermarkTaskQueue.size(); } mWatermarkTaskCondition.notify_one(); + MW_LOG_ERR("[WM_TIMING] id=%llu op=%s phase=enqueue queue_depth=%zu", timingId, operation, queueDepth); return true; } @@ -1548,7 +1551,8 @@ void AampDRMLicenseManager::WatermarkWorkerThread() { for (;;) { - std::function task; + WatermarkTask queuedTask; + size_t queueDepth; { std::unique_lock lock(mWatermarkTaskMutex); mWatermarkTaskCondition.wait(lock, [this]() { @@ -1562,13 +1566,17 @@ void AampDRMLicenseManager::WatermarkWorkerThread() } continue; } - task = std::move(mWatermarkTaskQueue.front()); + queuedTask = std::move(mWatermarkTaskQueue.front()); mWatermarkTaskQueue.pop_front(); + queueDepth = mWatermarkTaskQueue.size(); } + MW_LOG_ERR("[WM_TIMING] id=%llu op=%s phase=dequeue queue_depth=%zu queue_wait_us=%lld", + queuedTask.timingId, queuedTask.operation, queueDepth, + WatermarkElapsedUs(queuedTask.enqueueTime, WatermarkTimingClock::now())); try { - task(); + queuedTask.task(); } catch (...) { From 4552949b9f6a2a712677f724dcb47c841e176270 Mon Sep 17 00:00:00 2001 From: dp0000 <53818367+dp0000@users.noreply.github.com> Date: Thu, 29 Oct 2026 15:40:14 +0530 Subject: [PATCH 9/9] Update AampDRMLicManager.h --- drm/AampDRMLicManager.h | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/drm/AampDRMLicManager.h b/drm/AampDRMLicManager.h index 772a36f87f..14d7d97606 100644 --- a/drm/AampDRMLicManager.h +++ b/drm/AampDRMLicManager.h @@ -31,6 +31,7 @@ #include "AampCurlDownloader.h" #include "DrmSessionManager.h" #include +#include #include #include #include @@ -351,13 +352,21 @@ class AampDRMLicenseManager AAMPTuneFailure MapDrmToAampTuneFailure(DrmTuneFailure drmError); private: + struct WatermarkTask + { + const char *operation; + unsigned long long timingId; + std::chrono::steady_clock::time_point enqueueTime; + std::function task; + }; + void WatermarkWorkerThread(); - void EnqueueWatermarkTask(const char *operation, std::function task); + bool EnqueueWatermarkTask(const char *operation, unsigned long long timingId, std::function task); void StopWatermarkWorker(); std::mutex mWatermarkTaskMutex; std::condition_variable mWatermarkTaskCondition; - std::deque> mWatermarkTaskQueue; + std::deque mWatermarkTaskQueue; bool mWatermarkWorkerStopping{false}; std::thread mWatermarkWorker; };