diff --git a/media/server/main/include/MediaKeySession.h b/media/server/main/include/MediaKeySession.h index 0a05fee9c..d3f2c3745 100644 --- a/media/server/main/include/MediaKeySession.h +++ b/media/server/main/include/MediaKeySession.h @@ -172,6 +172,11 @@ class MediaKeySession : public IMediaKeySession, public firebolt::rialto::wrappe */ std::vector m_selectedKeyId; + /** + * @brief Whether initData contains amazon string + */ + bool m_isAmazonApp; + /** * @brief Whether a Ocdm call is currently ongoing. */ @@ -187,6 +192,11 @@ class MediaKeySession : public IMediaKeySession, public firebolt::rialto::wrappe */ std::mutex m_ocdmErrorMutex; + /** + * @brief Drm header to be set once the session is constructed + */ + std::vector m_queuedDrmHeader; + /** * @brief Posts a getChallenge task onto the main thread. * @@ -207,6 +217,15 @@ class MediaKeySession : public IMediaKeySession, public firebolt::rialto::wrappe * @retval True if an error was received. */ bool checkForOcdmErrors(const char *operationStr); + + /** + * @brief Checks if data contains amazon string in UTF-8 or UTF-16 encoding. + * + * @param[in] data : The data to check. + * + * @retval True if amazon string is found. + */ + bool isAmazonApp(const std::vector &data); }; } // namespace firebolt::rialto::server diff --git a/media/server/main/source/MediaKeySession.cpp b/media/server/main/source/MediaKeySession.cpp index 414856cd8..4642f54fc 100644 --- a/media/server/main/source/MediaKeySession.cpp +++ b/media/server/main/source/MediaKeySession.cpp @@ -65,7 +65,7 @@ MediaKeySession::MediaKeySession(const std::string &keySystem, int32_t keySessio const std::shared_ptr &mainThreadFactory) : m_kKeySystem(keySystem), m_kKeySessionId(keySessionId), m_kSessionType(sessionType), m_mediaKeysClient(client), m_kIsLDL(isLDL), m_isSessionConstructed(false), m_isSessionClosed(false), m_licenseRequested(false), - m_ongoingOcdmOperation(false), m_ocdmError(false) + m_isAmazonApp(false), m_ongoingOcdmOperation(false), m_ocdmError(false) { RIALTO_SERVER_LOG_DEBUG("entry:"); @@ -109,6 +109,10 @@ MediaKeySession::~MediaKeySession() MediaKeyErrorStatus MediaKeySession::generateRequest(InitDataType initDataType, const std::vector &initData) { RIALTO_SERVER_LOG_DEBUG("entry:"); + + // Check if initData contains amazon string + m_isAmazonApp = isAmazonApp(initData); + // Set the request flag for the onLicenseRequest callback m_licenseRequested = true; @@ -127,7 +131,15 @@ MediaKeyErrorStatus MediaKeySession::generateRequest(InitDataType initDataType, else { m_isSessionConstructed = true; - if (isNetflixPlayreadyKeySystem()) + + if (!m_queuedDrmHeader.empty()) + { + RIALTO_SERVER_LOG_DEBUG("Setting queued drm header after session construction"); + setDrmHeader(m_queuedDrmHeader); + m_queuedDrmHeader.clear(); + } + + if (isNetflixPlayreadyKeySystem() || m_isAmazonApp) { // Ocdm-playready does not notify onProcessChallenge when complete. // Fetch the challenge manually. @@ -195,7 +207,7 @@ MediaKeyErrorStatus MediaKeySession::updateSession(const std::vector &r initOcdmErrorChecking(); MediaKeyErrorStatus status; - if (isNetflixPlayreadyKeySystem()) + if (isNetflixPlayreadyKeySystem() || m_isAmazonApp) { status = m_ocdmSession->storeLicenseData(&responseData[0], responseData.size()); if (MediaKeyErrorStatus::OK != status) @@ -243,7 +255,7 @@ MediaKeyErrorStatus MediaKeySession::closeKeySession() initOcdmErrorChecking(); MediaKeyErrorStatus status; - if (isNetflixPlayreadyKeySystem()) + if (isNetflixPlayreadyKeySystem() || m_isAmazonApp) { if (MediaKeyErrorStatus::OK != m_ocdmSession->cancelChallengeData()) { @@ -322,6 +334,13 @@ MediaKeyErrorStatus MediaKeySession::setDrmHeader(const std::vector &re { initOcdmErrorChecking(); + if (!m_isSessionConstructed) + { + RIALTO_SERVER_LOG_INFO("Session not yet constructed, queueing drm header to be set after construction"); + m_queuedDrmHeader = requestData; + return MediaKeyErrorStatus::OK; + } + MediaKeyErrorStatus status = m_ocdmSession->setDrmHeader(requestData.data(), requestData.size()); if (MediaKeyErrorStatus::OK != status) { @@ -472,4 +491,25 @@ bool MediaKeySession::checkForOcdmErrors(const char *operationStr) return error; } +bool MediaKeySession::isAmazonApp(const std::vector &data) +{ + // Check for UTF-8 encoding + std::string dataUtf8(data.begin(), data.end()); + if (dataUtf8.find("amazon") != std::string::npos) + { + return true; + } + + // Check for UTF-16 LE encoding + if (data.size() > 4) + { + std::string dataUtf16(data.begin(), data.end()); + if (dataUtf16.find("a\0m\0a\0z\0o\0n", 0, 12) != std::string::npos) + { + return true; + } + } + + return false; +} }; // namespace firebolt::rialto::server