From 84496a2499ad757774d9308714dbf8dc2abfc966 Mon Sep 17 00:00:00 2001 From: LekshmiMR Date: Wed, 20 May 2026 18:31:00 +0000 Subject: [PATCH 01/18] HDCP retry to rialto --- media/client/ipc/source/MediaKeysIpc.cpp | 7 +- media/public/include/MediaCommon.h | 4 +- .../ipc/source/MediaKeysModuleService.cpp | 8 +- .../main/source/MediaKeysCapabilities.cpp | 2 + .../main/source/MediaKeysServerInternal.cpp | 86 ++++++++++++++++--- wrappers/CMakeLists.txt | 2 + wrappers/include/OcdmSession.h | 2 + wrappers/source/OcdmSession.cpp | 65 ++++++++++++++ 8 files changed, 163 insertions(+), 13 deletions(-) diff --git a/media/client/ipc/source/MediaKeysIpc.cpp b/media/client/ipc/source/MediaKeysIpc.cpp index 24909664e..aa664fc55 100644 --- a/media/client/ipc/source/MediaKeysIpc.cpp +++ b/media/client/ipc/source/MediaKeysIpc.cpp @@ -123,6 +123,10 @@ const char *toString(const firebolt::rialto::MediaKeyErrorStatus &errorStatus) { return "FAIL"; } + case firebolt::rialto::MediaKeyErrorStatus::OUTPUT_RESTRICTED: + { + return "OUTPUT_RESTRICTED"; + } } return "UNKNOWN"; } @@ -334,7 +338,7 @@ bool MediaKeysIpc::containsKey(int32_t keySessionId, const std::vector } MediaKeyErrorStatus MediaKeysIpc::createKeySession(KeySessionType sessionType, std::weak_ptr client, - bool isLDL, int32_t &keySessionId) + bool isLDL, int32_t &keySessionId) { if (!reattachChannelIfRequired()) { @@ -415,6 +419,7 @@ MediaKeyErrorStatus MediaKeysIpc::generateRequest(int32_t keySessionId, InitData break; } + firebolt::rialto::GenerateRequestRequest request; request.set_media_keys_handle(m_mediaKeysHandle); request.set_key_session_id(keySessionId); diff --git a/media/public/include/MediaCommon.h b/media/public/include/MediaCommon.h index 92b544b8c..50252b01b 100644 --- a/media/public/include/MediaCommon.h +++ b/media/public/include/MediaCommon.h @@ -292,7 +292,8 @@ enum class MediaKeyErrorStatus NOT_SUPPORTED, /**< The request parameters are not supported. */ INVALID_STATE, /**< The object is in an invalid state for the operation. */ INTERFACE_NOT_IMPLEMENTED, /**< The interface is not implemented. */ - BUFFER_TOO_SMALL /**< The size of the buffer is too small. */ + BUFFER_TOO_SMALL, /**< The size of the buffer is too small. */ + OUTPUT_RESTRICTED }; /** @@ -473,6 +474,7 @@ struct PlaybackInfo int64_t currentPosition{-1}; /**< The current playback position */ double volume{1.0}; /**< The current volume */ }; + } // namespace firebolt::rialto #endif // FIREBOLT_RIALTO_MEDIA_COMMON_H_ diff --git a/media/server/ipc/source/MediaKeysModuleService.cpp b/media/server/ipc/source/MediaKeysModuleService.cpp index 4cb5f6293..68cc5772e 100644 --- a/media/server/ipc/source/MediaKeysModuleService.cpp +++ b/media/server/ipc/source/MediaKeysModuleService.cpp @@ -66,6 +66,10 @@ convertMediaKeyErrorStatus(const firebolt::rialto::MediaKeyErrorStatus &errorSta { return firebolt::rialto::ProtoMediaKeyErrorStatus::FAIL; } + case firebolt::rialto::MediaKeyErrorStatus::OUTPUT_RESTRICTED: + { + // TODO + } } return firebolt::rialto::ProtoMediaKeyErrorStatus::FAIL; } @@ -100,6 +104,7 @@ firebolt::rialto::InitDataType covertInitDataType(firebolt::rialto::GenerateRequ return firebolt::rialto::InitDataType::UNKNOWN; } } + } // namespace namespace firebolt::rialto::server::ipc @@ -277,11 +282,12 @@ void MediaKeysModuleService::generateRequest(::google::protobuf::RpcController * ::google::protobuf::Closure *done) { RIALTO_SERVER_LOG_DEBUG("entry:"); - MediaKeyErrorStatus status = m_cdmService.generateRequest(request->media_keys_handle(), request->key_session_id(), covertInitDataType(request->init_data_type()), std::vector{request->init_data().begin(), request->init_data().end()}); + + response->set_error_status(convertMediaKeyErrorStatus(status)); done->Run(); } diff --git a/media/server/main/source/MediaKeysCapabilities.cpp b/media/server/main/source/MediaKeysCapabilities.cpp index f0ad87a81..9988d61eb 100644 --- a/media/server/main/source/MediaKeysCapabilities.cpp +++ b/media/server/main/source/MediaKeysCapabilities.cpp @@ -47,6 +47,8 @@ const char *toString(const firebolt::rialto::MediaKeyErrorStatus &status) return "NOT_SUPPORTED"; case firebolt::rialto::MediaKeyErrorStatus::INVALID_STATE: return "INVALID_STATE"; + case firebolt::rialto::MediaKeyErrorStatus::OUTPUT_RESTRICTED: + return "OUTPUT_RESTRICTED"; } return "Unknown"; } diff --git a/media/server/main/source/MediaKeysServerInternal.cpp b/media/server/main/source/MediaKeysServerInternal.cpp index 7fd1b58bf..3f5d69b28 100644 --- a/media/server/main/source/MediaKeysServerInternal.cpp +++ b/media/server/main/source/MediaKeysServerInternal.cpp @@ -18,10 +18,40 @@ */ #include +#include +#include #include "MediaKeysServerInternal.h" #include "RialtoServerLogging.h" +/*namespace +{ +const char *toString(const firebolt::rialto::MediaKeyErrorStatus &status) +{ + switch (status) + { + case firebolt::rialto::MediaKeyErrorStatus::OK: + return "OK"; + case firebolt::rialto::MediaKeyErrorStatus::FAIL: + return "FAIL"; + case firebolt::rialto::MediaKeyErrorStatus::BAD_SESSION_ID: + return "BAD_SESSION_ID"; + case firebolt::rialto::MediaKeyErrorStatus::INTERFACE_NOT_IMPLEMENTED: + return "INTERFACE_NOT_IMPLEMENTED"; + case firebolt::rialto::MediaKeyErrorStatus::BUFFER_TOO_SMALL: + return "BUFFER_TOO_SMALL"; + case firebolt::rialto::MediaKeyErrorStatus::NOT_SUPPORTED: + return "NOT_SUPPORTED"; + case firebolt::rialto::MediaKeyErrorStatus::INVALID_STATE: + return "INVALID_STATE"; + case firebolt::rialto::MediaKeyErrorStatus::OUTPUT_RESTRICTED: + return "OUTPUT_RESTRICTED"; + } + return "Unknown"; +} +} */// namespace + + namespace firebolt::rialto { const char *mediaKeyErrorStatusToString(const MediaKeyErrorStatus &status) @@ -51,6 +81,9 @@ std::shared_ptr IMediaKeysFactory::createFactory() namespace firebolt::rialto::server { +constexpr std::chrono::milliseconds kOutputRestrictedRetryInterval{250}; +constexpr std::chrono::seconds kOutputRestrictedRetryTimeout{6}; + int32_t generateSessionId() { static int32_t keySessionId{0}; @@ -569,12 +602,51 @@ MediaKeyErrorStatus MediaKeysServerInternal::getCdmKeySessionIdInternal(int32_t MediaKeyErrorStatus MediaKeysServerInternal::decrypt(int32_t keySessionId, GstBuffer *encrypted, GstCaps *caps) { - RIALTO_SERVER_LOG_DEBUG("entry:"); + RIALTO_SERVER_LOG_ERROR("DEBUG PURPOSE: entry:decrypt"); - MediaKeyErrorStatus status; - auto task = [&]() { status = decryptInternal(keySessionId, encrypted, caps); }; + MediaKeyErrorStatus status{MediaKeyErrorStatus::FAIL}; + const auto deadline = std::chrono::steady_clock::now() + kOutputRestrictedRetryTimeout; + do + { + auto task = [&]() { status = decryptInternal(keySessionId, encrypted, caps); }; + m_mainThread->enqueueTaskAndWait(m_mainThreadClientId, task); + RIALTO_SERVER_LOG_ERROR("DEBUG PURPOSE : Key session id :%d", keySessionId); + switch (status) + { + case firebolt::rialto::MediaKeyErrorStatus::OK: + RIALTO_SERVER_LOG_ERROR("DEBUG PURPOSE : Key session status : OK"); + break; + case firebolt::rialto::MediaKeyErrorStatus::FAIL: + RIALTO_SERVER_LOG_ERROR("DEBUG PURPOSE : Key session status : FAIL"); + break; + case firebolt::rialto::MediaKeyErrorStatus::BAD_SESSION_ID: + RIALTO_SERVER_LOG_ERROR("DEBUG PURPOSE : Key session status : BAD_SESSION_ID"); + break; + case firebolt::rialto::MediaKeyErrorStatus::INTERFACE_NOT_IMPLEMENTED: + RIALTO_SERVER_LOG_ERROR("DEBUG PURPOSE : Key session status : INTERFACE_NOT_IMPLEMENTED"); + break; + case firebolt::rialto::MediaKeyErrorStatus::BUFFER_TOO_SMALL: + RIALTO_SERVER_LOG_ERROR("DEBUG PURPOSE : Key session status : BUFFER_TOO_SMALL"); + break; + case firebolt::rialto::MediaKeyErrorStatus::NOT_SUPPORTED: + RIALTO_SERVER_LOG_ERROR("DEBUG PURPOSE : Key session status : NOT_SUPPORTED"); + break; + case firebolt::rialto::MediaKeyErrorStatus::INVALID_STATE: + RIALTO_SERVER_LOG_ERROR("DEBUG PURPOSE : Key session status : INVALID_STATE"); + break; + case firebolt::rialto::MediaKeyErrorStatus::OUTPUT_RESTRICTED: + RIALTO_SERVER_LOG_ERROR("DEBUG PURPOSE : Key session status : OUTPUT_RESTRICTED"); + break; + } + + if (status != MediaKeyErrorStatus::OUTPUT_RESTRICTED) + { + break; + } + RIALTO_SERVER_LOG_WARN("Decrypt returned OUTPUT_RESTRICTED, retrying after delay"); + std::this_thread::sleep_for(kOutputRestrictedRetryInterval); + } while (std::chrono::steady_clock::now() < deadline); - m_mainThread->enqueueTaskAndWait(m_mainThreadClientId, task); return status; } @@ -598,12 +670,6 @@ MediaKeyErrorStatus MediaKeysServerInternal::decryptInternal(int32_t keySessionI return status; } -bool MediaKeysServerInternal::isNetflixPlayreadyKeySystem() const -{ - RIALTO_SERVER_LOG_DEBUG("entry:"); - return m_kKeySystem.find("netflix") != std::string::npos; -} - void MediaKeysServerInternal::ping(std::unique_ptr &&heartbeatHandler) { RIALTO_SERVER_LOG_DEBUG("entry:"); diff --git a/wrappers/CMakeLists.txt b/wrappers/CMakeLists.txt index 3be841fd1..d70a28037 100644 --- a/wrappers/CMakeLists.txt +++ b/wrappers/CMakeLists.txt @@ -110,6 +110,8 @@ target_include_directories( PRIVATE include + ../common/interface/ + ../logging/include/ ${GStreamerApp_INCLUDE_DIRS} $ ${WRAPPER_INCLUDES} diff --git a/wrappers/include/OcdmSession.h b/wrappers/include/OcdmSession.h index 51841f701..c76716106 100644 --- a/wrappers/include/OcdmSession.h +++ b/wrappers/include/OcdmSession.h @@ -94,6 +94,7 @@ class OcdmSession : public IOcdmSession private: using OcdmGstSessionDecryptExFn = OpenCDMError (*)(struct OpenCDMSession *, GstBuffer *, GstBuffer *, const uint32_t, GstBuffer *, GstBuffer *, uint32_t, GstCaps *); + using OcdmGstSessionDecryptBufferOnceFn = OpenCDMError (*)(struct OpenCDMSession *, GstBuffer *, GstCaps *); /** * @brief The System handle. */ @@ -115,6 +116,7 @@ class OcdmSession : public IOcdmSession struct OpenCDMSession *m_session; static OcdmGstSessionDecryptExFn m_ocdmGstSessionDecryptEx; + static OcdmGstSessionDecryptBufferOnceFn m_ocdmGstSessionDecryptBufferOnce; /** * @brief Requests the processing of the challenge data. diff --git a/wrappers/source/OcdmSession.cpp b/wrappers/source/OcdmSession.cpp index a236826a9..821cd3043 100644 --- a/wrappers/source/OcdmSession.cpp +++ b/wrappers/source/OcdmSession.cpp @@ -23,6 +23,8 @@ #include "opencdm/open_cdm_ext.h" #include #include +#include +#include "RialtoCommonLogging.h" namespace { @@ -109,6 +111,7 @@ const firebolt::rialto::KeyStatus convertKeyStatus(const KeyStatus &ocdmKeyStatu namespace firebolt::rialto::wrappers { OcdmSession::OcdmGstSessionDecryptExFn OcdmSession::m_ocdmGstSessionDecryptEx{nullptr}; +OcdmSession::OcdmGstSessionDecryptBufferOnceFn OcdmSession::m_ocdmGstSessionDecryptBufferOnce{nullptr}; OcdmSession::OcdmSession(struct OpenCDMSystem *systemHandle, IOcdmSessionClient *client) : m_systemHandle(systemHandle), m_ocdmSessionClient(client), m_session(nullptr) @@ -121,6 +124,11 @@ OcdmSession::OcdmSession(struct OpenCDMSystem *systemHandle, IOcdmSessionClient { m_ocdmGstSessionDecryptEx = (OcdmGstSessionDecryptExFn)dlsym(RTLD_DEFAULT, "opencdm_gstreamer_session_decrypt_ex"); + m_ocdmGstSessionDecryptBufferOnce = + (OcdmGstSessionDecryptBufferOnceFn)dlsym(RTLD_DEFAULT, "opencdm_gstreamer_session_decrypt_buffer_once"); + if(m_ocdmGstSessionDecryptBufferOnce != NULL){ + RIALTO_COMMON_LOG_ERROR("DEBUG PURPOSE : m_ocdmGstSessionDecryptBufferOnce exists\n"); + } }); } @@ -190,11 +198,68 @@ MediaKeyErrorStatus OcdmSession::update(const uint8_t response[], uint32_t respo MediaKeyErrorStatus OcdmSession::decryptBuffer(GstBuffer *encrypted, GstCaps *caps) { + RIALTO_COMMON_LOG_ERROR("DEBUG PURPOSE : OcdmSession::decryptBuffer()\n"); if (!m_session) { return MediaKeyErrorStatus::FAIL; } + if (m_ocdmGstSessionDecryptBufferOnce) + { + // Extract key ID from the buffer's protection metadata + std::vector keyId; + GstProtectionMeta *pm = reinterpret_cast(gst_buffer_get_protection_meta(encrypted)); + if (pm) + { + const GValue *kidValue = gst_structure_get_value(pm->info, "kid"); + if (kidValue) + { + GstBuffer *kidBuf = gst_value_get_buffer(kidValue); + if (kidBuf) + { + GstMapInfo kidMap; + if (gst_buffer_map(kidBuf, &kidMap, GST_MAP_READ)) + { + keyId.assign(kidMap.data, kidMap.data + kidMap.size); + gst_buffer_unmap(kidBuf, &kidMap); + } + } + } + } + + // Pre-decrypt key status check: return OUTPUT_RESTRICTED immediately (no sleep) so + // the caller (MediaKeysServerInternal::decrypt) can retry from the GStreamer thread. + if (!keyId.empty()) + { + const ::KeyStatus preStatus = + opencdm_session_status(m_session, keyId.data(), static_cast(keyId.size())); + if (preStatus == OutputRestricted || preStatus == OutputRestrictedHDCP22) + { + + RIALTO_COMMON_LOG_ERROR("DEBUG PURPOSE : OcdmSession::decryptBuffer() : returning MediaKeyErrorStatus::OUTPUT_RESTRICTED(Pre decrypt)\n"); + return MediaKeyErrorStatus::OUTPUT_RESTRICTED; + } + } + + OpenCDMError result = m_ocdmGstSessionDecryptBufferOnce(m_session, encrypted, caps); + + // Post-decrypt status check: a failed decrypt during HDCP reauth may not carry a + // specific error code, so confirm via key status before signalling the caller to retry. + if (result != ERROR_NONE && !keyId.empty()) + { + const ::KeyStatus postStatus = + opencdm_session_status(m_session, keyId.data(), static_cast(keyId.size())); + if (postStatus == OutputRestricted || postStatus == OutputRestrictedHDCP22) + { + RIALTO_COMMON_LOG_ERROR("DEBUG PURPOSE : OcdmSession::decryptBuffer() : returning MediaKeyErrorStatus::OUTPUT_RESTRICTED(Post decrypt)\n"); + return MediaKeyErrorStatus::OUTPUT_RESTRICTED; + } + } + + return convertOpenCdmError(result); + } + + // Fallback: adapter without _once handles retries internally. OpenCDMError status = opencdm_gstreamer_session_decrypt_buffer(m_session, encrypted, caps); return convertOpenCdmError(status); } From 31c94c5083175cd22c15ab7ab270d6067960dc2b Mon Sep 17 00:00:00 2001 From: LekshmiMR Date: Wed, 20 May 2026 22:20:21 +0000 Subject: [PATCH 02/18] Adding dlopen() --- media/server/main/source/MediaKeysServerInternal.cpp | 7 +++++++ wrappers/source/OcdmSession.cpp | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/media/server/main/source/MediaKeysServerInternal.cpp b/media/server/main/source/MediaKeysServerInternal.cpp index 3f5d69b28..a6ccf09ee 100644 --- a/media/server/main/source/MediaKeysServerInternal.cpp +++ b/media/server/main/source/MediaKeysServerInternal.cpp @@ -670,6 +670,13 @@ MediaKeyErrorStatus MediaKeysServerInternal::decryptInternal(int32_t keySessionI return status; } +bool MediaKeysServerInternal::isNetflixPlayreadyKeySystem() const +{ + RIALTO_SERVER_LOG_DEBUG("entry:"); + return m_kKeySystem.find("netflix") != std::string::npos; +} + + void MediaKeysServerInternal::ping(std::unique_ptr &&heartbeatHandler) { RIALTO_SERVER_LOG_DEBUG("entry:"); diff --git a/wrappers/source/OcdmSession.cpp b/wrappers/source/OcdmSession.cpp index 821cd3043..80e8a1954 100644 --- a/wrappers/source/OcdmSession.cpp +++ b/wrappers/source/OcdmSession.cpp @@ -122,10 +122,10 @@ OcdmSession::OcdmSession(struct OpenCDMSystem *systemHandle, IOcdmSessionClient std::call_once(flag, []() { + void* handle = dlopen("libocdm.so", RTLD_LAZY); m_ocdmGstSessionDecryptEx = (OcdmGstSessionDecryptExFn)dlsym(RTLD_DEFAULT, "opencdm_gstreamer_session_decrypt_ex"); - m_ocdmGstSessionDecryptBufferOnce = - (OcdmGstSessionDecryptBufferOnceFn)dlsym(RTLD_DEFAULT, "opencdm_gstreamer_session_decrypt_buffer_once"); + m_ocdmGstSessionDecryptBufferOnce = (OcdmGstSessionDecryptBufferOnceFn)dlsym(handle,"opencdm_gstreamer_session_decrypt_buffer_once"); if(m_ocdmGstSessionDecryptBufferOnce != NULL){ RIALTO_COMMON_LOG_ERROR("DEBUG PURPOSE : m_ocdmGstSessionDecryptBufferOnce exists\n"); } From 1467ce83682addc9aa51c41c0ace55dda0c09a12 Mon Sep 17 00:00:00 2001 From: LekshmiMR Date: Wed, 20 May 2026 22:36:36 +0000 Subject: [PATCH 03/18] More logging for keyStatus --- wrappers/source/OcdmSession.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/wrappers/source/OcdmSession.cpp b/wrappers/source/OcdmSession.cpp index 80e8a1954..1c1b33638 100644 --- a/wrappers/source/OcdmSession.cpp +++ b/wrappers/source/OcdmSession.cpp @@ -238,7 +238,10 @@ MediaKeyErrorStatus OcdmSession::decryptBuffer(GstBuffer *encrypted, GstCaps *ca RIALTO_COMMON_LOG_ERROR("DEBUG PURPOSE : OcdmSession::decryptBuffer() : returning MediaKeyErrorStatus::OUTPUT_RESTRICTED(Pre decrypt)\n"); return MediaKeyErrorStatus::OUTPUT_RESTRICTED; + } else { + RIALTO_COMMON_LOG_ERROR("DEBUG PURPOSE : OcdmSession::decryptBuffer() : returning error(Pre decrypt)\n"); } + } OpenCDMError result = m_ocdmGstSessionDecryptBufferOnce(m_session, encrypted, caps); @@ -253,7 +256,9 @@ MediaKeyErrorStatus OcdmSession::decryptBuffer(GstBuffer *encrypted, GstCaps *ca { RIALTO_COMMON_LOG_ERROR("DEBUG PURPOSE : OcdmSession::decryptBuffer() : returning MediaKeyErrorStatus::OUTPUT_RESTRICTED(Post decrypt)\n"); return MediaKeyErrorStatus::OUTPUT_RESTRICTED; - } + } else { + RIALTO_COMMON_LOG_ERROR("DEBUG PURPOSE : OcdmSession::decryptBuffer() : returning error(Post decrypt)\n"); + } } return convertOpenCdmError(result); From ffee15ba1c458545bdf05bc469486da8a894b6bc Mon Sep 17 00:00:00 2001 From: balasaraswathy-n Date: Thu, 21 May 2026 15:38:41 +0530 Subject: [PATCH 04/18] Update MediaKeysServerInternal.cpp --- media/server/main/source/MediaKeysServerInternal.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/media/server/main/source/MediaKeysServerInternal.cpp b/media/server/main/source/MediaKeysServerInternal.cpp index a6ccf09ee..fa66f7b9a 100644 --- a/media/server/main/source/MediaKeysServerInternal.cpp +++ b/media/server/main/source/MediaKeysServerInternal.cpp @@ -81,8 +81,8 @@ std::shared_ptr IMediaKeysFactory::createFactory() namespace firebolt::rialto::server { -constexpr std::chrono::milliseconds kOutputRestrictedRetryInterval{250}; -constexpr std::chrono::seconds kOutputRestrictedRetryTimeout{6}; +constexpr std::chrono::seconds kOutputRestrictedRetryInterval{1}; +constexpr std::chrono::seconds kOutputRestrictedRetryTimeout{4}; int32_t generateSessionId() { From 881e8434cc3052a105264a554cbfe7fed43fad63 Mon Sep 17 00:00:00 2001 From: LekshmiMR Date: Thu, 21 May 2026 14:53:16 +0000 Subject: [PATCH 05/18] Revert interval time changes --- media/server/main/source/MediaKeysServerInternal.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/media/server/main/source/MediaKeysServerInternal.cpp b/media/server/main/source/MediaKeysServerInternal.cpp index fa66f7b9a..a309332fa 100644 --- a/media/server/main/source/MediaKeysServerInternal.cpp +++ b/media/server/main/source/MediaKeysServerInternal.cpp @@ -81,8 +81,8 @@ std::shared_ptr IMediaKeysFactory::createFactory() namespace firebolt::rialto::server { -constexpr std::chrono::seconds kOutputRestrictedRetryInterval{1}; -constexpr std::chrono::seconds kOutputRestrictedRetryTimeout{4}; +constexpr std::chrono::seconds kOutputRestrictedRetryInterval{250}; +constexpr std::chrono::seconds kOutputRestrictedRetryTimeout{6}; int32_t generateSessionId() { From f9fd54af80e336b8f60df141233056b63b009484 Mon Sep 17 00:00:00 2001 From: LekshmiMR Date: Thu, 21 May 2026 17:45:18 +0000 Subject: [PATCH 06/18] Reverting the interval change --- media/server/main/source/MediaKeysServerInternal.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/media/server/main/source/MediaKeysServerInternal.cpp b/media/server/main/source/MediaKeysServerInternal.cpp index a309332fa..a6ccf09ee 100644 --- a/media/server/main/source/MediaKeysServerInternal.cpp +++ b/media/server/main/source/MediaKeysServerInternal.cpp @@ -81,7 +81,7 @@ std::shared_ptr IMediaKeysFactory::createFactory() namespace firebolt::rialto::server { -constexpr std::chrono::seconds kOutputRestrictedRetryInterval{250}; +constexpr std::chrono::milliseconds kOutputRestrictedRetryInterval{250}; constexpr std::chrono::seconds kOutputRestrictedRetryTimeout{6}; int32_t generateSessionId() From c60ab3c193c4d16696f8e4707d208cddf5254b69 Mon Sep 17 00:00:00 2001 From: LekshmiMR Date: Fri, 22 May 2026 00:27:30 +0000 Subject: [PATCH 07/18] Increase the priority of ping routine --- media/server/main/source/MediaKeysServerInternal.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/media/server/main/source/MediaKeysServerInternal.cpp b/media/server/main/source/MediaKeysServerInternal.cpp index a6ccf09ee..72c920055 100644 --- a/media/server/main/source/MediaKeysServerInternal.cpp +++ b/media/server/main/source/MediaKeysServerInternal.cpp @@ -682,7 +682,7 @@ void MediaKeysServerInternal::ping(std::unique_ptr &&heartbea RIALTO_SERVER_LOG_DEBUG("entry:"); auto task = [&]() { heartbeatHandler.reset(); }; - m_mainThread->enqueueTaskAndWait(m_mainThreadClientId, task); + m_mainThread->enqueuePriorityTaskAndWait(m_mainThreadClientId, task); } MediaKeyErrorStatus MediaKeysServerInternal::getMetricSystemData(std::vector &buffer) From 004ba6d2539f1670c07c741a67e88f000a3c0040 Mon Sep 17 00:00:00 2001 From: varatharajan568 <130632918+varatharajan568@users.noreply.github.com> Date: Fri, 22 May 2026 07:41:49 +0530 Subject: [PATCH 08/18] Update MediaKeysServerInternal.cpp --- media/server/main/source/MediaKeysServerInternal.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/media/server/main/source/MediaKeysServerInternal.cpp b/media/server/main/source/MediaKeysServerInternal.cpp index 72c920055..82283d982 100644 --- a/media/server/main/source/MediaKeysServerInternal.cpp +++ b/media/server/main/source/MediaKeysServerInternal.cpp @@ -679,7 +679,7 @@ bool MediaKeysServerInternal::isNetflixPlayreadyKeySystem() const void MediaKeysServerInternal::ping(std::unique_ptr &&heartbeatHandler) { - RIALTO_SERVER_LOG_DEBUG("entry:"); + RIALTO_SERVER_LOG_ERROR("entry:"); auto task = [&]() { heartbeatHandler.reset(); }; m_mainThread->enqueuePriorityTaskAndWait(m_mainThreadClientId, task); From 06af3626f83375fec26e691ae039c7e7d97c65c9 Mon Sep 17 00:00:00 2001 From: varatharajan568 <130632918+varatharajan568@users.noreply.github.com> Date: Fri, 22 May 2026 07:43:16 +0530 Subject: [PATCH 09/18] Update MediaKeysServerInternal.cpp --- media/server/main/source/MediaKeysServerInternal.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/media/server/main/source/MediaKeysServerInternal.cpp b/media/server/main/source/MediaKeysServerInternal.cpp index 82283d982..2f1cb7ee7 100644 --- a/media/server/main/source/MediaKeysServerInternal.cpp +++ b/media/server/main/source/MediaKeysServerInternal.cpp @@ -683,6 +683,7 @@ void MediaKeysServerInternal::ping(std::unique_ptr &&heartbea auto task = [&]() { heartbeatHandler.reset(); }; m_mainThread->enqueuePriorityTaskAndWait(m_mainThreadClientId, task); + RIALTO_SERVER_LOG_ERROR("exit:"); } MediaKeyErrorStatus MediaKeysServerInternal::getMetricSystemData(std::vector &buffer) From 83e214701d2607da2789ced81e5ceaa46ee357bb Mon Sep 17 00:00:00 2001 From: varatharajan568 <130632918+varatharajan568@users.noreply.github.com> Date: Fri, 22 May 2026 08:02:28 +0530 Subject: [PATCH 10/18] Update MediaKeysServerInternal.cpp --- media/server/main/source/MediaKeysServerInternal.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/media/server/main/source/MediaKeysServerInternal.cpp b/media/server/main/source/MediaKeysServerInternal.cpp index 2f1cb7ee7..7653f5ab6 100644 --- a/media/server/main/source/MediaKeysServerInternal.cpp +++ b/media/server/main/source/MediaKeysServerInternal.cpp @@ -639,7 +639,7 @@ MediaKeyErrorStatus MediaKeysServerInternal::decrypt(int32_t keySessionId, GstBu break; } - if (status != MediaKeyErrorStatus::OUTPUT_RESTRICTED) + //if (status != MediaKeyErrorStatus::OUTPUT_RESTRICTED) { break; } @@ -682,7 +682,7 @@ void MediaKeysServerInternal::ping(std::unique_ptr &&heartbea RIALTO_SERVER_LOG_ERROR("entry:"); auto task = [&]() { heartbeatHandler.reset(); }; - m_mainThread->enqueuePriorityTaskAndWait(m_mainThreadClientId, task); + m_mainThread->enqueueTaskAndWait(m_mainThreadClientId, task); RIALTO_SERVER_LOG_ERROR("exit:"); } From e64612bb9a6aeb31f9d0981f768cb0abc3182d0f Mon Sep 17 00:00:00 2001 From: balasaraswathy-n Date: Fri, 22 May 2026 14:58:16 +0530 Subject: [PATCH 11/18] Update ControlServerInternal.cpp --- media/server/main/source/ControlServerInternal.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/media/server/main/source/ControlServerInternal.cpp b/media/server/main/source/ControlServerInternal.cpp index 49ae2e78a..012e7bc4b 100644 --- a/media/server/main/source/ControlServerInternal.cpp +++ b/media/server/main/source/ControlServerInternal.cpp @@ -98,7 +98,7 @@ ControlServerInternal::~ControlServerInternal() void ControlServerInternal::ack(int32_t ackId) { - RIALTO_SERVER_LOG_DEBUG("Control with id: %d received ack for ping: %d", m_controlId, ackId); + RIALTO_SERVER_LOG_ERROR("Control with id: %d received ack for ping: %d", m_controlId, ackId); auto task = [&]() { if (!m_heartbeatHandler) @@ -114,6 +114,7 @@ void ControlServerInternal::ack(int32_t ackId) m_heartbeatHandler.reset(); }; m_mainThread->enqueueTaskAndWait(m_mainThreadClientId, task); + RIALTO_SERVER_LOG_ERROR("Control with id: %d received ack for ping: %d task exit", m_controlId, ackId); } void ControlServerInternal::setApplicationState(const ApplicationState &state) From 4b18e8115b1d0e01189a8f737b2e074b916f2349 Mon Sep 17 00:00:00 2001 From: balasaraswathy-n Date: Fri, 22 May 2026 15:01:55 +0530 Subject: [PATCH 12/18] Update MediaKeysServerInternal.cpp --- media/server/main/source/MediaKeysServerInternal.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/media/server/main/source/MediaKeysServerInternal.cpp b/media/server/main/source/MediaKeysServerInternal.cpp index 7653f5ab6..33222f6da 100644 --- a/media/server/main/source/MediaKeysServerInternal.cpp +++ b/media/server/main/source/MediaKeysServerInternal.cpp @@ -639,7 +639,7 @@ MediaKeyErrorStatus MediaKeysServerInternal::decrypt(int32_t keySessionId, GstBu break; } - //if (status != MediaKeyErrorStatus::OUTPUT_RESTRICTED) + if (status != MediaKeyErrorStatus::OUTPUT_RESTRICTED) { break; } From 546a1f4a0058784fa2d14c191aa192611241b884 Mon Sep 17 00:00:00 2001 From: balasaraswathy-n Date: Fri, 22 May 2026 18:46:47 +0530 Subject: [PATCH 13/18] Update CdmService.cpp --- media/server/service/source/CdmService.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/media/server/service/source/CdmService.cpp b/media/server/service/source/CdmService.cpp index 8ea716f61..a84c82c84 100644 --- a/media/server/service/source/CdmService.cpp +++ b/media/server/service/source/CdmService.cpp @@ -580,7 +580,7 @@ void CdmService::decrementSessionIdUsageCounter(int32_t keySessionId) void CdmService::ping(const std::shared_ptr &heartbeatProcedure) { - std::lock_guard lock{m_mediaKeysMutex}; + // std::lock_guard lock{m_mediaKeysMutex}; for (const auto &mediaKeyPair : m_mediaKeys) { auto &mediaKeys = mediaKeyPair.second; From f403066a69eabd4a6de91f88165ec7e9ba5b303d Mon Sep 17 00:00:00 2001 From: balasaraswathy-n Date: Fri, 22 May 2026 18:52:34 +0530 Subject: [PATCH 14/18] Update CdmService.cpp --- media/server/service/source/CdmService.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/media/server/service/source/CdmService.cpp b/media/server/service/source/CdmService.cpp index a84c82c84..6ea58db66 100644 --- a/media/server/service/source/CdmService.cpp +++ b/media/server/service/source/CdmService.cpp @@ -501,7 +501,9 @@ MediaKeyErrorStatus CdmService::decrypt(int32_t keySessionId, GstBuffer *encrypt RIALTO_SERVER_LOG_ERROR("Media keys handle for mksId: %d does not exists", keySessionId); return MediaKeyErrorStatus::FAIL; } + RIALTO_SERVER_LOG_ERROR("ping_cmd_service_is_entry"); return m_mediaKeys[mediaKeysHandleIter->second.mediaKeysHandle]->decrypt(keySessionId, encrypted, caps); + RIALTO_SERVER_LOG_ERROR("ping_cmd_service_is_exit"); } bool CdmService::isNetflixPlayreadyKeySystem(int32_t keySessionId) @@ -581,11 +583,13 @@ void CdmService::decrementSessionIdUsageCounter(int32_t keySessionId) void CdmService::ping(const std::shared_ptr &heartbeatProcedure) { // std::lock_guard lock{m_mediaKeysMutex}; + RIALTO_SERVER_LOG_ERROR("ping_cmd_service_is_entry"); for (const auto &mediaKeyPair : m_mediaKeys) { auto &mediaKeys = mediaKeyPair.second; mediaKeys->ping(heartbeatProcedure->createHandler()); } + RIALTO_SERVER_LOG_ERROR("ping_cmd_service_is_exited"); } MediaKeyErrorStatus CdmService::getMetricSystemData(int mediaKeysHandle, std::vector &buffer) From 38db705dad3778040edc19a6bac0f1ff8f9e82a1 Mon Sep 17 00:00:00 2001 From: balasaraswathy-n Date: Tue, 26 May 2026 18:24:44 +0530 Subject: [PATCH 15/18] Update CdmService.cpp --- media/server/service/source/CdmService.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/media/server/service/source/CdmService.cpp b/media/server/service/source/CdmService.cpp index 6ea58db66..aaad2fde2 100644 --- a/media/server/service/source/CdmService.cpp +++ b/media/server/service/source/CdmService.cpp @@ -582,7 +582,7 @@ void CdmService::decrementSessionIdUsageCounter(int32_t keySessionId) void CdmService::ping(const std::shared_ptr &heartbeatProcedure) { - // std::lock_guard lock{m_mediaKeysMutex}; + std::lock_guard lock{m_mediaKeysMutex}; RIALTO_SERVER_LOG_ERROR("ping_cmd_service_is_entry"); for (const auto &mediaKeyPair : m_mediaKeys) { From 831462973df1002d5a47859f31b68d02ec74e2cf Mon Sep 17 00:00:00 2001 From: balasaraswathy-n Date: Tue, 26 May 2026 18:39:11 +0530 Subject: [PATCH 16/18] Update MediaKeysServerInternal.cpp --- .../main/source/MediaKeysServerInternal.cpp | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/media/server/main/source/MediaKeysServerInternal.cpp b/media/server/main/source/MediaKeysServerInternal.cpp index 33222f6da..d53a86887 100644 --- a/media/server/main/source/MediaKeysServerInternal.cpp +++ b/media/server/main/source/MediaKeysServerInternal.cpp @@ -82,7 +82,7 @@ std::shared_ptr IMediaKeysFactory::createFactory() namespace firebolt::rialto::server { constexpr std::chrono::milliseconds kOutputRestrictedRetryInterval{250}; -constexpr std::chrono::seconds kOutputRestrictedRetryTimeout{6}; +//constexpr std::chrono::seconds kOutputRestrictedRetryTimeout{6}; int32_t generateSessionId() { @@ -606,10 +606,9 @@ MediaKeyErrorStatus MediaKeysServerInternal::decrypt(int32_t keySessionId, GstBu MediaKeyErrorStatus status{MediaKeyErrorStatus::FAIL}; const auto deadline = std::chrono::steady_clock::now() + kOutputRestrictedRetryTimeout; - do - { - auto task = [&]() { status = decryptInternal(keySessionId, encrypted, caps); }; - m_mainThread->enqueueTaskAndWait(m_mainThreadClientId, task); + + auto task = [&]() { status = decryptInternal(keySessionId, encrypted, caps); }; + m_mainThread->enqueueTaskAndWait(m_mainThreadClientId, task); RIALTO_SERVER_LOG_ERROR("DEBUG PURPOSE : Key session id :%d", keySessionId); switch (status) { @@ -639,14 +638,13 @@ MediaKeyErrorStatus MediaKeysServerInternal::decrypt(int32_t keySessionId, GstBu break; } - if (status != MediaKeyErrorStatus::OUTPUT_RESTRICTED) + if (status == MediaKeyErrorStatus::OUTPUT_RESTRICTED) { - break; + std::this_thread::sleep_for(kOutputRestrictedRetryInterval); + auto task = [&]() { status = decryptInternal(keySessionId, encrypted, caps); }; + m_mainThread->enqueueTaskAndWait(m_mainThreadClientId, task); + RIALTO_SERVER_LOG_WARN("Decrypt returned OUTPUT_RESTRICTED, retrying once after delay"); } - RIALTO_SERVER_LOG_WARN("Decrypt returned OUTPUT_RESTRICTED, retrying after delay"); - std::this_thread::sleep_for(kOutputRestrictedRetryInterval); - } while (std::chrono::steady_clock::now() < deadline); - return status; } From b8b252620b82cdb3cf050a93e4facdb4870f344e Mon Sep 17 00:00:00 2001 From: LekshmiMR Date: Tue, 26 May 2026 13:48:20 +0000 Subject: [PATCH 17/18] Fixing build issue --- media/server/main/source/MediaKeysServerInternal.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/media/server/main/source/MediaKeysServerInternal.cpp b/media/server/main/source/MediaKeysServerInternal.cpp index d53a86887..087b1e148 100644 --- a/media/server/main/source/MediaKeysServerInternal.cpp +++ b/media/server/main/source/MediaKeysServerInternal.cpp @@ -605,7 +605,6 @@ MediaKeyErrorStatus MediaKeysServerInternal::decrypt(int32_t keySessionId, GstBu RIALTO_SERVER_LOG_ERROR("DEBUG PURPOSE: entry:decrypt"); MediaKeyErrorStatus status{MediaKeyErrorStatus::FAIL}; - const auto deadline = std::chrono::steady_clock::now() + kOutputRestrictedRetryTimeout; auto task = [&]() { status = decryptInternal(keySessionId, encrypted, caps); }; m_mainThread->enqueueTaskAndWait(m_mainThreadClientId, task); From 1d2971550bd31ecf824fc4c1fd91ea3500ddc150 Mon Sep 17 00:00:00 2001 From: LekshmiMR Date: Tue, 26 May 2026 13:54:21 +0000 Subject: [PATCH 18/18] Rialto retry loop for 100ms --- media/server/main/source/MediaKeysServerInternal.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/media/server/main/source/MediaKeysServerInternal.cpp b/media/server/main/source/MediaKeysServerInternal.cpp index 087b1e148..7c0ed79ff 100644 --- a/media/server/main/source/MediaKeysServerInternal.cpp +++ b/media/server/main/source/MediaKeysServerInternal.cpp @@ -81,7 +81,7 @@ std::shared_ptr IMediaKeysFactory::createFactory() namespace firebolt::rialto::server { -constexpr std::chrono::milliseconds kOutputRestrictedRetryInterval{250}; +constexpr std::chrono::milliseconds kOutputRestrictedRetryInterval{100}; //constexpr std::chrono::seconds kOutputRestrictedRetryTimeout{6}; int32_t generateSessionId()