From ad18400528eda96282888985196550cefcce3762 Mon Sep 17 00:00:00 2001 From: Marcin Wojciechowski Date: Tue, 16 Dec 2025 14:59:20 +0100 Subject: [PATCH 01/12] drm header queuing --- media/server/main/include/MediaKeySession.h | 5 ++ media/server/main/source/MediaKeySession.cpp | 14 ++++ .../tests/mediaKeys/MediaKeysTestMethods.cpp | 79 +++++++++++++++++++ .../tests/mediaKeys/MediaKeysTestMethods.h | 10 ++- .../tests/mediaKeys/SetDrmHeaderTest.cpp | 33 +++++++- .../mediaKeySession/GenerateRequestTest.cpp | 32 +------- .../main/mediaKeySession/SetDrmHeaderTest.cpp | 29 ++++++- .../base/MediaKeySessionTestBase.cpp | 16 ++++ .../base/MediaKeySessionTestBase.h | 22 ++++++ 9 files changed, 203 insertions(+), 37 deletions(-) diff --git a/media/server/main/include/MediaKeySession.h b/media/server/main/include/MediaKeySession.h index 0a05fee9c..fdc730756 100644 --- a/media/server/main/include/MediaKeySession.h +++ b/media/server/main/include/MediaKeySession.h @@ -187,6 +187,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. * diff --git a/media/server/main/source/MediaKeySession.cpp b/media/server/main/source/MediaKeySession.cpp index 414856cd8..aebe60f10 100644 --- a/media/server/main/source/MediaKeySession.cpp +++ b/media/server/main/source/MediaKeySession.cpp @@ -127,6 +127,13 @@ MediaKeyErrorStatus MediaKeySession::generateRequest(InitDataType initDataType, else { m_isSessionConstructed = true; + if (!m_queuedDrmHeader.empty()) + { + RIALTO_SERVER_LOG_DEBUG("Setting queued drm header after session construction"); + setDrmHeader(m_queuedDrmHeader); + m_queuedDrmHeader.clear(); + } + if (isNetflixPlayreadyKeySystem()) { // Ocdm-playready does not notify onProcessChallenge when complete. @@ -322,6 +329,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) { diff --git a/tests/componenttests/server/tests/mediaKeys/MediaKeysTestMethods.cpp b/tests/componenttests/server/tests/mediaKeys/MediaKeysTestMethods.cpp index 9bfd4e182..436569b62 100644 --- a/tests/componenttests/server/tests/mediaKeys/MediaKeysTestMethods.cpp +++ b/tests/componenttests/server/tests/mediaKeys/MediaKeysTestMethods.cpp @@ -85,6 +85,68 @@ void MediaKeysTestMethods::ocdmSessionWillBeCreated() })); } +void MediaKeysTestMethods::willGenerateRequestPlayready() +{ + EXPECT_CALL(m_ocdmSessionMock, constructSession(KeySessionType::TEMPORARY, InitDataType::CENC, _, m_kInitData.size())) + .WillOnce(testing::Invoke( + [&](KeySessionType sessionType, InitDataType initDataType, const uint8_t initData[], + uint32_t initDataSize) -> MediaKeyErrorStatus + { + for (uint32_t i = 0; i < initDataSize; ++i) + { + EXPECT_EQ(initData[i], m_kInitData[i]); + } + + return MediaKeyErrorStatus::OK; + })); + + EXPECT_CALL(m_ocdmSessionMock, getChallengeData(false, _, _)) + .WillOnce(testing::Invoke( + [&](bool isLDL, const uint8_t *challenge, uint32_t *challengeSize) -> MediaKeyErrorStatus + { + // This first call asks for the size of the data + EXPECT_EQ(challenge, nullptr); + *challengeSize = m_kLicenseRequestMessage.size(); + return MediaKeyErrorStatus::OK; + })) + .WillOnce(testing::Invoke( + [&](bool isLDL, uint8_t *challenge, const uint32_t *challengeSize) -> MediaKeyErrorStatus + { + // This second call asks for the data + EXPECT_EQ(*challengeSize, m_kLicenseRequestMessage.size()); + for (size_t i = 0; i < m_kLicenseRequestMessage.size(); ++i) + { + challenge[i] = m_kLicenseRequestMessage[i]; + } + return MediaKeyErrorStatus::OK; + })); +} + +void MediaKeysTestMethods::generateRequestPlayready() +{ + auto request{createGenerateRequestRequest(m_mediaKeysHandle, m_mediaKeySessionId, m_kInitData)}; + + ExpectMessage<::firebolt::rialto::LicenseRequestEvent> expectedMessage(m_clientStub); + + ConfigureAction(m_clientStub) + .send(request) + .expectSuccess() + .matchResponse([&](const firebolt::rialto::GenerateRequestResponse &resp) + { EXPECT_EQ(resp.error_status(), ProtoMediaKeyErrorStatus::OK); }); + + auto message = expectedMessage.getMessage(); + ASSERT_TRUE(message); + ASSERT_EQ(message->media_keys_handle(), m_mediaKeysHandle); + ASSERT_EQ(message->key_session_id(), m_mediaKeySessionId); + EXPECT_EQ(message->url(), ""); + const unsigned int kMax = message->license_request_message_size(); + ASSERT_EQ(kMax, m_kLicenseRequestMessage.size()); + for (unsigned int i = 0; i < kMax; ++i) + { + ASSERT_EQ(message->license_request_message(i), m_kLicenseRequestMessage[i]); + } +} + void MediaKeysTestMethods::willUpdateSessionNetflix() { EXPECT_CALL(m_ocdmSessionMock, storeLicenseData(_, m_kUpdateSessionNetflixResponse.size())) @@ -109,6 +171,23 @@ void MediaKeysTestMethods::updateSessionNetflix() { EXPECT_EQ(resp.error_status(), ProtoMediaKeyErrorStatus::OK); }); } +void MediaKeysTestMethods::willCloseKeySessionPlayready() +{ + EXPECT_CALL(m_ocdmSessionMock, cancelChallengeData()).WillOnce(Return(MediaKeyErrorStatus::OK)); + EXPECT_CALL(m_ocdmSessionMock, cleanDecryptContext()).WillOnce(Return(MediaKeyErrorStatus::OK)); +} + +void MediaKeysTestMethods::closeKeySessionPlayready() +{ + auto request{createCloseKeySessionRequest(m_mediaKeysHandle, m_mediaKeySessionId)}; + + ConfigureAction(m_clientStub) + .send(request) + .expectSuccess() + .matchResponse([&](const firebolt::rialto::CloseKeySessionResponse &resp) + { EXPECT_EQ(resp.error_status(), ProtoMediaKeyErrorStatus::OK); }); +} + void MediaKeysTestMethods::willTeardown() { // For teardown... diff --git a/tests/componenttests/server/tests/mediaKeys/MediaKeysTestMethods.h b/tests/componenttests/server/tests/mediaKeys/MediaKeysTestMethods.h index 0cfdea24c..2854d3800 100644 --- a/tests/componenttests/server/tests/mediaKeys/MediaKeysTestMethods.h +++ b/tests/componenttests/server/tests/mediaKeys/MediaKeysTestMethods.h @@ -41,9 +41,15 @@ class MediaKeysTestMethods : public RialtoServerComponentTest void createKeySession(); void ocdmSessionWillBeCreated(); + void willGenerateRequestPlayready(); + void generateRequestPlayready(); + void willUpdateSessionNetflix(); void updateSessionNetflix(); + void willCloseKeySessionPlayready(); + void closeKeySessionPlayready(); + void willTeardown(); void willRelease(); @@ -57,8 +63,10 @@ class MediaKeysTestMethods : public RialtoServerComponentTest std::make_unique>()}; testing::StrictMock &m_ocdmSessionMock{*m_ocdmSession}; firebolt::rialto::wrappers::IOcdmSessionClient *m_ocdmSessionClient{0}; - + const std::vector m_kUpdateSessionNetflixResponse{5, 6}; + const std::vector m_kInitData{1, 2, 7}; + const std::vector m_kLicenseRequestMessage{'d', 'z', 'f'}; }; } // namespace firebolt::rialto::server::ct diff --git a/tests/componenttests/server/tests/mediaKeys/SetDrmHeaderTest.cpp b/tests/componenttests/server/tests/mediaKeys/SetDrmHeaderTest.cpp index a8aaa4de1..92ec543c6 100644 --- a/tests/componenttests/server/tests/mediaKeys/SetDrmHeaderTest.cpp +++ b/tests/componenttests/server/tests/mediaKeys/SetDrmHeaderTest.cpp @@ -87,15 +87,31 @@ void SetDrmHeaderTest::setDrmHeader(const std::vector &kKeyId) * * * Test Steps: - * Step 1: Set the drm header + * Step 1: generateRequest + * client sends generateRequest message to rialtoServer + * rialtoServer passes request to OCDM library + * ocdm lib returns success + * rialtoServer returns a success message to the client + * + * rialtoServer calls OCDM library get_challenge_data() + * rialtoServer should forward this request, via an onLicenceRequest + * message, to the client. The content of this message should match + * the details from the ocdm library + + * Step 2: Set the drm header * setDrmHeader first header. * Expect that setDrmHeader is processed by the server. * Api call returns with success. * - * Step 2: Set the drm header for a second time with different header + * Step 3: Set the drm header for a second time with different header * setDrmHeader second header. * Expect that setDrmHeader is processed by the server. * Api call returns with success. + * + * Step 4: Close session + * closeSession. + * Expect that closeSession is processed by the server. + * Api call returns with success. * * Test Tear-down: * Server is terminated. @@ -111,13 +127,22 @@ TEST_F(SetDrmHeaderTest, multiple) ocdmSessionWillBeCreated(); createKeySession(); - // Step 1: Set the drm header + // Step 1: generateRequest + willGenerateRequestPlayready(); + generateRequestPlayready(); + + // Step 2: Set the drm header willSetDrmHeader(kKeyId1); setDrmHeader(kKeyId1); - // Step 2: Set the drm header for a second time with different header + // Step 3: Set the drm header for a second time with different header willSetDrmHeader(kKeyId2); setDrmHeader(kKeyId2); + + // Step 4: Close session + willCloseKeySessionPlayready(); + closeKeySessionPlayready(); + willRelease(); } } // namespace firebolt::rialto::server::ct diff --git a/tests/unittests/media/server/main/mediaKeySession/GenerateRequestTest.cpp b/tests/unittests/media/server/main/mediaKeySession/GenerateRequestTest.cpp index 2e0cf179d..3502033cc 100644 --- a/tests/unittests/media/server/main/mediaKeySession/GenerateRequestTest.cpp +++ b/tests/unittests/media/server/main/mediaKeySession/GenerateRequestTest.cpp @@ -22,28 +22,9 @@ using ::testing::DoAll; using ::testing::SetArgPointee; -MATCHER(nullptrMatcher, "") -{ - return arg == nullptr; -} - -MATCHER(notNullptrMatcher, "") -{ - return arg != nullptr; -} - -ACTION_P(memcpyChallenge, vec) -{ - memcpy(arg1, &vec[0], vec.size()); -} - class RialtoServerMediaKeySessionGenerateRequestTest : public MediaKeySessionTestBase { protected: - const InitDataType m_kInitDataType = InitDataType::CENC; - const std::vector m_kInitData{1, 2, 3}; - const std::vector m_kChallenge{'d', 'e', 'f'}; - ~RialtoServerMediaKeySessionGenerateRequestTest() { destroyKeySession(); } }; @@ -71,18 +52,7 @@ TEST_F(RialtoServerMediaKeySessionGenerateRequestTest, SuccessNetflix) { createKeySession(kNetflixKeySystem); - EXPECT_CALL(*m_ocdmSessionMock, - constructSession(m_keySessionType, m_kInitDataType, &m_kInitData[0], m_kInitData.size())) - .WillOnce(Return(MediaKeyErrorStatus::OK)); - mainThreadWillEnqueueTask(); - EXPECT_CALL(*m_ocdmSessionMock, getChallengeData(m_isLDL, nullptrMatcher(), _)) - .WillOnce(DoAll(SetArgPointee<2>(m_kChallenge.size()), Return(MediaKeyErrorStatus::OK))); - EXPECT_CALL(*m_ocdmSessionMock, getChallengeData(m_isLDL, notNullptrMatcher(), _)) - .WillOnce(DoAll(memcpyChallenge(m_kChallenge), Return(MediaKeyErrorStatus::OK))); - mainThreadWillEnqueueTask(); - EXPECT_CALL(*m_mediaKeysClientMock, onLicenseRequest(m_kKeySessionId, m_kChallenge, _)); - - EXPECT_EQ(MediaKeyErrorStatus::OK, m_mediaKeySession->generateRequest(m_kInitDataType, m_kInitData)); + generateRequestPlayready(); // Close ocdm before destroying expectCloseKeySession(kNetflixKeySystem); diff --git a/tests/unittests/media/server/main/mediaKeySession/SetDrmHeaderTest.cpp b/tests/unittests/media/server/main/mediaKeySession/SetDrmHeaderTest.cpp index 18b027a32..7969dac84 100644 --- a/tests/unittests/media/server/main/mediaKeySession/SetDrmHeaderTest.cpp +++ b/tests/unittests/media/server/main/mediaKeySession/SetDrmHeaderTest.cpp @@ -19,6 +19,18 @@ #include "MediaKeySessionTestBase.h" +MATCHER_P(drmHeaderMatcher, header, "") +{ + for (size_t i = 0; i < header.size(); ++i) + { + if (arg[i] != header[i]) + { + return false; + } + } + return true; +} + class RialtoServerMediaKeySessionSetDrmHeaderTest : public MediaKeySessionTestBase { protected: @@ -33,10 +45,15 @@ TEST_F(RialtoServerMediaKeySessionSetDrmHeaderTest, Success) { createKeySession(kNetflixKeySystem); + generateRequestPlayready(); + EXPECT_CALL(*m_ocdmSessionMock, setDrmHeader(&m_kDrmHeader[0], m_kDrmHeader.size())) .WillOnce(Return(MediaKeyErrorStatus::OK)); EXPECT_EQ(MediaKeyErrorStatus::OK, m_mediaKeySession->setDrmHeader(m_kDrmHeader)); + + // Close ocdm before destroying + expectCloseKeySession(kNetflixKeySystem); } /** @@ -46,10 +63,15 @@ TEST_F(RialtoServerMediaKeySessionSetDrmHeaderTest, OcdmSessionFailure) { createKeySession(kNetflixKeySystem); + generateRequestPlayready(); + EXPECT_CALL(*m_ocdmSessionMock, setDrmHeader(&m_kDrmHeader[0], m_kDrmHeader.size())) .WillOnce(Return(MediaKeyErrorStatus::FAIL)); EXPECT_EQ(MediaKeyErrorStatus::FAIL, m_mediaKeySession->setDrmHeader(m_kDrmHeader)); + + // Close ocdm before destroying + expectCloseKeySession(kNetflixKeySystem); } /** @@ -57,7 +79,9 @@ TEST_F(RialtoServerMediaKeySessionSetDrmHeaderTest, OcdmSessionFailure) */ TEST_F(RialtoServerMediaKeySessionSetDrmHeaderTest, OnErrorFailure) { - createKeySession(kWidevineKeySystem); + createKeySession(kNetflixKeySystem); + + generateRequestPlayready(); EXPECT_CALL(*m_ocdmSessionMock, setDrmHeader(&m_kDrmHeader[0], m_kDrmHeader.size())) .WillOnce(Invoke( @@ -68,4 +92,7 @@ TEST_F(RialtoServerMediaKeySessionSetDrmHeaderTest, OnErrorFailure) })); EXPECT_EQ(MediaKeyErrorStatus::FAIL, m_mediaKeySession->setDrmHeader(m_kDrmHeader)); + + // Close ocdm before destroying + expectCloseKeySession(kNetflixKeySystem); } diff --git a/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp b/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp index 05f9184cf..c81839615 100644 --- a/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp +++ b/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp @@ -77,6 +77,22 @@ void MediaKeySessionTestBase::generateRequest() EXPECT_EQ(MediaKeyErrorStatus::OK, m_mediaKeySession->generateRequest(m_initDataType, m_initData)); } +void MediaKeySessionTestBase::generateRequestPlayready() +{ + EXPECT_CALL(*m_ocdmSessionMock, + constructSession(m_keySessionType, m_kInitDataType, &m_kInitData[0], m_kInitData.size())) + .WillOnce(Return(MediaKeyErrorStatus::OK)); + mainThreadWillEnqueueTask(); + EXPECT_CALL(*m_ocdmSessionMock, getChallengeData(m_isLDL, nullptrMatcher(), _)) + .WillOnce(DoAll(SetArgPointee<2>(m_kChallenge.size()), Return(MediaKeyErrorStatus::OK))); + EXPECT_CALL(*m_ocdmSessionMock, getChallengeData(m_isLDL, notNullptrMatcher(), _)) + .WillOnce(DoAll(memcpyChallenge(m_kChallenge), Return(MediaKeyErrorStatus::OK))); + mainThreadWillEnqueueTask(); + EXPECT_CALL(*m_mediaKeysClientMock, onLicenseRequest(m_kKeySessionId, m_kChallenge, _)); + + EXPECT_EQ(MediaKeyErrorStatus::OK, m_mediaKeySession->generateRequest(m_kInitDataType, m_kInitData)); +} + void MediaKeySessionTestBase::mainThreadWillEnqueueTask() { EXPECT_CALL(*m_mainThreadMock, enqueueTask(m_kMainThreadClientId, _)) diff --git a/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.h b/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.h index b13514d76..c27da3175 100644 --- a/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.h +++ b/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.h @@ -30,6 +30,7 @@ #include #include #include +#include using namespace firebolt::rialto; using namespace firebolt::rialto::server; @@ -38,10 +39,27 @@ using namespace firebolt::rialto::server::mock; using ::testing::_; using ::testing::ByMove; +using ::testing::DoAll; using ::testing::Invoke; using ::testing::Return; +using ::testing::SetArgPointee; using ::testing::StrictMock; +MATCHER(nullptrMatcher, "") +{ + return arg == nullptr; +} + +MATCHER(notNullptrMatcher, "") +{ + return arg != nullptr; +} + +ACTION_P(memcpyChallenge, vec) +{ + memcpy(arg1, &vec[0], vec.size()); +} + class MediaKeySessionTestBase : public ::testing::Test { public: @@ -65,11 +83,15 @@ class MediaKeySessionTestBase : public ::testing::Test const int32_t m_kMainThreadClientId = {5}; KeySessionType m_keySessionType = KeySessionType::PERSISTENT_RELEASE_MESSAGE; bool m_isLDL = false; + const InitDataType m_kInitDataType{InitDataType::CENC}; + const std::vector m_kInitData{1, 2, 3}; + const std::vector m_kChallenge{'d', 'e', 'f'}; void createKeySession(const std::string &keySystem); void destroyKeySession(); void expectCloseKeySession(const std::string &keySystem); void generateRequest(); + void generateRequestPlayready(); void mainThreadWillEnqueueTask(); }; From 4d0dbc76e5fa4515a9a452ca2e1f36c8bcb16ea2 Mon Sep 17 00:00:00 2001 From: Marcin Wojciechowski Date: Thu, 18 Dec 2025 13:51:01 +0100 Subject: [PATCH 02/12] is ldl removed from createMediaSession --- media/client/ipc/include/MediaKeysIpc.h | 2 +- media/client/ipc/source/MediaKeysIpc.cpp | 3 +-- media/client/main/include/MediaKeys.h | 2 +- media/client/main/source/MediaKeys.cpp | 4 ++-- media/public/include/IMediaKeys.h | 3 +-- media/public/include/MediaCommon.h | 10 ++++++++++ .../ipc/source/MediaKeysModuleService.cpp | 2 +- media/server/main/include/IMediaKeySession.h | 3 +-- media/server/main/include/MediaKeySession.h | 12 ++--------- .../main/include/MediaKeysServerInternal.h | 2 +- media/server/main/source/MediaKeySession.cpp | 20 ++++++++++--------- .../main/source/MediaKeysServerInternal.cpp | 6 +++--- media/server/service/include/ICdmService.h | 2 +- media/server/service/source/CdmService.cpp | 5 ++--- media/server/service/source/CdmService.h | 3 +-- .../matchers/MediaKeysProtoRequestMatchers.h | 5 ++--- .../tests/base/MediaKeysTestMethods.cpp | 12 ++++------- .../tests/mediaKeys/MediaKeysTestMethods.h | 2 +- .../tests/mediaKeys/SetDrmHeaderTest.cpp | 2 +- .../ipc/mediaKeysIpc/CreateKeySessionTest.cpp | 14 ++++++------- .../base/MediaKeysIpcTestBase.cpp | 2 +- .../client/main/mediaKeys/KeySessionTest.cpp | 8 +++----- .../main/mediaKeys/NetflixKeySessionTest.cpp | 8 +++----- .../media/interface/mocks/MediaKeysMock.h | 3 +-- .../MediaKeysModuleServiceTestsFixture.cpp | 10 +++------- .../main/mediaKeySession/CreateTest.cpp | 11 ++++------ .../base/MediaKeySessionTestBase.cpp | 2 +- .../main/mediaKeys/CreateKeySessionTest.cpp | 10 ++++------ .../main/mediaKeys/base/MediaKeysTestBase.cpp | 4 ++-- .../mocks/main/MediaKeySessionFactoryMock.h | 2 +- .../mocks/main/MediaKeysServerInternalMock.h | 3 +-- .../server/mocks/service/CdmServiceMock.h | 2 +- .../cdmService/CdmServiceTestsFixture.cpp | 12 +++++------ 33 files changed, 83 insertions(+), 108 deletions(-) diff --git a/media/client/ipc/include/MediaKeysIpc.h b/media/client/ipc/include/MediaKeysIpc.h index 6302d383a..ddcac2ec7 100644 --- a/media/client/ipc/include/MediaKeysIpc.h +++ b/media/client/ipc/include/MediaKeysIpc.h @@ -69,7 +69,7 @@ class MediaKeysIpc : public IMediaKeys, public IpcModule bool containsKey(int32_t keySessionId, const std::vector &keyId) override; - MediaKeyErrorStatus createKeySession(KeySessionType sessionType, std::weak_ptr client, bool isLDL, + MediaKeyErrorStatus createKeySession(KeySessionType sessionType, std::weak_ptr client, int32_t &keySessionId) override; MediaKeyErrorStatus generateRequest(int32_t keySessionId, InitDataType initDataType, diff --git a/media/client/ipc/source/MediaKeysIpc.cpp b/media/client/ipc/source/MediaKeysIpc.cpp index 24909664e..e2420cde7 100644 --- a/media/client/ipc/source/MediaKeysIpc.cpp +++ b/media/client/ipc/source/MediaKeysIpc.cpp @@ -334,7 +334,7 @@ bool MediaKeysIpc::containsKey(int32_t keySessionId, const std::vector } MediaKeyErrorStatus MediaKeysIpc::createKeySession(KeySessionType sessionType, std::weak_ptr client, - bool isLDL, int32_t &keySessionId) + int32_t &keySessionId) { if (!reattachChannelIfRequired()) { @@ -362,7 +362,6 @@ MediaKeyErrorStatus MediaKeysIpc::createKeySession(KeySessionType sessionType, s firebolt::rialto::CreateKeySessionRequest request; request.set_media_keys_handle(m_mediaKeysHandle); request.set_session_type(protoSessionType); - request.set_is_ldl(isLDL); firebolt::rialto::CreateKeySessionResponse response; // Default error status to FAIL diff --git a/media/client/main/include/MediaKeys.h b/media/client/main/include/MediaKeys.h index 4f27f8ffa..eaa401ba8 100644 --- a/media/client/main/include/MediaKeys.h +++ b/media/client/main/include/MediaKeys.h @@ -79,7 +79,7 @@ class MediaKeys : public IMediaKeys bool containsKey(int32_t keySessionId, const std::vector &keyId) override; - MediaKeyErrorStatus createKeySession(KeySessionType sessionType, std::weak_ptr client, bool isLDL, + MediaKeyErrorStatus createKeySession(KeySessionType sessionType, std::weak_ptr client, int32_t &keySessionId) override; MediaKeyErrorStatus generateRequest(int32_t keySessionId, InitDataType initDataType, diff --git a/media/client/main/source/MediaKeys.cpp b/media/client/main/source/MediaKeys.cpp index 1a60d44e1..639e6bcee 100644 --- a/media/client/main/source/MediaKeys.cpp +++ b/media/client/main/source/MediaKeys.cpp @@ -115,11 +115,11 @@ bool MediaKeys::containsKey(int32_t keySessionId, const std::vector &ke } MediaKeyErrorStatus MediaKeys::createKeySession(KeySessionType sessionType, std::weak_ptr client, - bool isLDL, int32_t &keySessionId) + int32_t &keySessionId) { RIALTO_CLIENT_LOG_DEBUG("entry:"); - auto result{m_mediaKeysIpc->createKeySession(sessionType, client, isLDL, keySessionId)}; + auto result{m_mediaKeysIpc->createKeySession(sessionType, client, keySessionId)}; if (isNetflixPlayready(m_keySystem) && MediaKeyErrorStatus::OK == result) { KeyIdMap::instance().addSession(keySessionId); diff --git a/media/public/include/IMediaKeys.h b/media/public/include/IMediaKeys.h index 6408d0056..84b32eb14 100644 --- a/media/public/include/IMediaKeys.h +++ b/media/public/include/IMediaKeys.h @@ -110,13 +110,12 @@ class IMediaKeys * * @param[in] sessionType : The session type. * @param[in] client : Client object for callbacks - * @param[in] isLDL : Is this an LDL * @param[out] keySessionId: The key session id * * @retval an error status. */ virtual MediaKeyErrorStatus createKeySession(KeySessionType sessionType, std::weak_ptr client, - bool isLDL, int32_t &keySessionId) = 0; + int32_t &keySessionId) = 0; /** * @brief Generates a licence request. diff --git a/media/public/include/MediaCommon.h b/media/public/include/MediaCommon.h index 92b544b8c..0c403b7ca 100644 --- a/media/public/include/MediaCommon.h +++ b/media/public/include/MediaCommon.h @@ -473,6 +473,16 @@ struct PlaybackInfo int64_t currentPosition{-1}; /**< The current playback position */ double volume{1.0}; /**< The current volume */ }; + +/** + * @brief Struct containing current playback information. + */ +enum class LimitedDurationLicense +{ + NOT_SPECIFIED, /**< The license duration is not specified */ + ENABLED, /**< The license has a limited duration */ + DISABLED /**< The license does not have a limited duration */ +}; } // 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..03a8f51b9 100644 --- a/media/server/ipc/source/MediaKeysModuleService.cpp +++ b/media/server/ipc/source/MediaKeysModuleService.cpp @@ -262,7 +262,7 @@ void MediaKeysModuleService::createKeySession(::google::protobuf::RpcController m_cdmService.createKeySession(request->media_keys_handle(), convertKeySessionType(request->session_type()), std::make_shared(request->media_keys_handle(), ipcController->getClient()), - request->is_ldl(), keySessionId); + keySessionId); if (MediaKeyErrorStatus::OK == status) { response->set_key_session_id(keySessionId); diff --git a/media/server/main/include/IMediaKeySession.h b/media/server/main/include/IMediaKeySession.h index bddb27155..6db1167cc 100644 --- a/media/server/main/include/IMediaKeySession.h +++ b/media/server/main/include/IMediaKeySession.h @@ -55,14 +55,13 @@ class IMediaKeySessionFactory * @param[in] ocdmSystem : The ocdm system object to create the session on. * @param[in] sessionType : The session type. * @param[in] client : Client object for callbacks. - * @param[in] isLDL : Is this an LDL. * * @retval the new media keys instance or null on error. */ virtual std::unique_ptr createMediaKeySession(const std::string &keySystem, int32_t keySessionId, const firebolt::rialto::wrappers::IOcdmSystem &ocdmSystem, KeySessionType sessionType, - std::weak_ptr client, bool isLDL) const = 0; + std::weak_ptr client) const = 0; }; /** diff --git a/media/server/main/include/MediaKeySession.h b/media/server/main/include/MediaKeySession.h index fdc730756..4f405dcbd 100644 --- a/media/server/main/include/MediaKeySession.h +++ b/media/server/main/include/MediaKeySession.h @@ -43,8 +43,7 @@ class MediaKeySessionFactory : public IMediaKeySessionFactory std::unique_ptr createMediaKeySession(const std::string &keySystem, int32_t keySessionId, const firebolt::rialto::wrappers::IOcdmSystem &ocdmSystem, KeySessionType sessionType, - std::weak_ptr client, - bool isLDL) const override; + std::weak_ptr client) const override; }; /** @@ -61,13 +60,11 @@ class MediaKeySession : public IMediaKeySession, public firebolt::rialto::wrappe * @param[in] ocdmSystem : The ocdm system object to create the session on. * @param[in] sessionType : The session type. * @param[in] client : Client object for callbacks. - * @param[in] isLDL : Is this an LDL. * @param[in] mainThreadFactory : The main thread factory. */ MediaKeySession(const std::string &keySystem, int32_t keySessionId, const firebolt::rialto::wrappers::IOcdmSystem &ocdmSystem, KeySessionType sessionType, - std::weak_ptr client, bool isLDL, - const std::shared_ptr &mainThreadFactory); + std::weak_ptr client, const std::shared_ptr &mainThreadFactory); /** * @brief Virtual destructor. @@ -137,11 +134,6 @@ class MediaKeySession : public IMediaKeySession, public firebolt::rialto::wrappe */ std::shared_ptr m_mainThread; - /** - * @brief Is the session LDL. - */ - const bool m_kIsLDL; - /** * @brief Is the ocdm session constructed. */ diff --git a/media/server/main/include/MediaKeysServerInternal.h b/media/server/main/include/MediaKeysServerInternal.h index 6e934e004..6514b27f2 100644 --- a/media/server/main/include/MediaKeysServerInternal.h +++ b/media/server/main/include/MediaKeysServerInternal.h @@ -76,7 +76,7 @@ class MediaKeysServerInternal : public IMediaKeysServerInternal bool containsKey(int32_t keySessionId, const std::vector &keyId) override; - MediaKeyErrorStatus createKeySession(KeySessionType sessionType, std::weak_ptr client, bool isLDL, + MediaKeyErrorStatus createKeySession(KeySessionType sessionType, std::weak_ptr client, int32_t &keySessionId) override; MediaKeyErrorStatus generateRequest(int32_t keySessionId, InitDataType initDataType, diff --git a/media/server/main/source/MediaKeySession.cpp b/media/server/main/source/MediaKeySession.cpp index aebe60f10..604da1929 100644 --- a/media/server/main/source/MediaKeySession.cpp +++ b/media/server/main/source/MediaKeySession.cpp @@ -41,15 +41,16 @@ std::shared_ptr IMediaKeySessionFactory::createFactory( return factory; } -std::unique_ptr MediaKeySessionFactory::createMediaKeySession( - const std::string &keySystem, int32_t keySessionId, const firebolt::rialto::wrappers::IOcdmSystem &ocdmSystem, - KeySessionType sessionType, std::weak_ptr client, bool isLDL) const +std::unique_ptr +MediaKeySessionFactory::createMediaKeySession(const std::string &keySystem, int32_t keySessionId, + const firebolt::rialto::wrappers::IOcdmSystem &ocdmSystem, + KeySessionType sessionType, std::weak_ptr client) const { std::unique_ptr mediaKeys; try { mediaKeys = std::make_unique(keySystem, keySessionId, ocdmSystem, sessionType, client, - isLDL, server::IMainThreadFactory::createFactory()); + server::IMainThreadFactory::createFactory()); } catch (const std::exception &e) { @@ -61,11 +62,11 @@ std::unique_ptr MediaKeySessionFactory::createMediaKeySession( MediaKeySession::MediaKeySession(const std::string &keySystem, int32_t keySessionId, const firebolt::rialto::wrappers::IOcdmSystem &ocdmSystem, KeySessionType sessionType, - std::weak_ptr client, bool isLDL, + std::weak_ptr client, 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_isSessionConstructed(false), m_isSessionClosed(false), m_licenseRequested(false), m_ongoingOcdmOperation(false), + m_ocdmError(false) { RIALTO_SERVER_LOG_DEBUG("entry:"); @@ -158,15 +159,16 @@ void MediaKeySession::getChallenge() RIALTO_SERVER_LOG_DEBUG("entry:"); auto task = [&]() { + const bool isLdlTemp{false}; uint32_t challengeSize = 0; - MediaKeyErrorStatus status = m_ocdmSession->getChallengeData(m_kIsLDL, nullptr, &challengeSize); + MediaKeyErrorStatus status = m_ocdmSession->getChallengeData(isLdlTemp, nullptr, &challengeSize); if (challengeSize == 0) { RIALTO_SERVER_LOG_ERROR("Failed to get the challenge data size, no onLicenseRequest will be generated"); return; } std::vector challenge(challengeSize, 0x00); - status = m_ocdmSession->getChallengeData(m_kIsLDL, &challenge[0], &challengeSize); + status = m_ocdmSession->getChallengeData(isLdlTemp, &challenge[0], &challengeSize); if (MediaKeyErrorStatus::OK != status) { RIALTO_SERVER_LOG_ERROR("Failed to get the challenge data, no onLicenseRequest will be generated"); diff --git a/media/server/main/source/MediaKeysServerInternal.cpp b/media/server/main/source/MediaKeysServerInternal.cpp index 7fd1b58bf..d83e7063c 100644 --- a/media/server/main/source/MediaKeysServerInternal.cpp +++ b/media/server/main/source/MediaKeysServerInternal.cpp @@ -210,13 +210,13 @@ bool MediaKeysServerInternal::containsKeyInternal(int32_t keySessionId, const st } MediaKeyErrorStatus MediaKeysServerInternal::createKeySession(KeySessionType sessionType, - std::weak_ptr client, bool isLDL, + std::weak_ptr client, int32_t &keySessionId) { RIALTO_SERVER_LOG_DEBUG("entry:"); MediaKeyErrorStatus status; - auto task = [&]() { status = createKeySessionInternal(sessionType, client, isLDL, keySessionId); }; + auto task = [&]() { status = createKeySessionInternal(sessionType, client, false, keySessionId); }; m_mainThread->enqueueTaskAndWait(m_mainThreadClientId, task); return status; @@ -229,7 +229,7 @@ MediaKeyErrorStatus MediaKeysServerInternal::createKeySessionInternal(KeySession int32_t keySessionIdTemp = generateSessionId(); std::unique_ptr mediaKeySession = m_mediaKeySessionFactory->createMediaKeySession(m_kKeySystem, keySessionIdTemp, *m_ocdmSystem, sessionType, - client, isLDL); + client); if (!mediaKeySession) { RIALTO_SERVER_LOG_ERROR("Failed to create a new media key session"); diff --git a/media/server/service/include/ICdmService.h b/media/server/service/include/ICdmService.h index fdcbc95e5..1b7c36a7c 100644 --- a/media/server/service/include/ICdmService.h +++ b/media/server/service/include/ICdmService.h @@ -48,7 +48,7 @@ class ICdmService virtual bool createMediaKeys(int mediaKeysHandle, std::string keySystem) = 0; virtual bool destroyMediaKeys(int mediaKeysHandle) = 0; virtual MediaKeyErrorStatus createKeySession(int mediaKeysHandle, KeySessionType sessionType, - const std::shared_ptr &client, bool isLDL, + const std::shared_ptr &client, int32_t &keySessionId) = 0; virtual MediaKeyErrorStatus generateRequest(int mediaKeysHandle, int32_t keySessionId, InitDataType initDataType, const std::vector &initData) = 0; diff --git a/media/server/service/source/CdmService.cpp b/media/server/service/source/CdmService.cpp index 8ea716f61..b7fed322a 100644 --- a/media/server/service/source/CdmService.cpp +++ b/media/server/service/source/CdmService.cpp @@ -121,8 +121,7 @@ bool CdmService::destroyMediaKeys(int mediaKeysHandle) } MediaKeyErrorStatus CdmService::createKeySession(int mediaKeysHandle, KeySessionType sessionType, - const std::shared_ptr &client, bool isLDL, - int32_t &keySessionId) + const std::shared_ptr &client, int32_t &keySessionId) { RIALTO_SERVER_LOG_DEBUG("CdmService requested to create key session: %d", mediaKeysHandle); @@ -134,7 +133,7 @@ MediaKeyErrorStatus CdmService::createKeySession(int mediaKeysHandle, KeySession return MediaKeyErrorStatus::FAIL; } - MediaKeyErrorStatus status = mediaKeysIter->second->createKeySession(sessionType, client, isLDL, keySessionId); + MediaKeyErrorStatus status = mediaKeysIter->second->createKeySession(sessionType, client, keySessionId); if (MediaKeyErrorStatus::OK == status) { if (m_mediaKeysClients.find(keySessionId) != m_mediaKeysClients.end()) diff --git a/media/server/service/source/CdmService.h b/media/server/service/source/CdmService.h index 468f6a706..9c777800e 100644 --- a/media/server/service/source/CdmService.h +++ b/media/server/service/source/CdmService.h @@ -54,8 +54,7 @@ class CdmService : public ICdmService, public IDecryptionService bool createMediaKeys(int mediaKeysHandle, std::string keySystem) override; bool destroyMediaKeys(int mediaKeysHandle) override; MediaKeyErrorStatus createKeySession(int mediaKeysHandle, KeySessionType sessionType, - const std::shared_ptr &client, bool isLDL, - int32_t &keySessionId) override; + const std::shared_ptr &client, int32_t &keySessionId) override; MediaKeyErrorStatus generateRequest(int mediaKeysHandle, int32_t keySessionId, InitDataType initDataType, const std::vector &initData) override; MediaKeyErrorStatus loadSession(int mediaKeysHandle, int32_t keySessionId) override; diff --git a/tests/common/matchers/MediaKeysProtoRequestMatchers.h b/tests/common/matchers/MediaKeysProtoRequestMatchers.h index 4784bc0a3..ec147a8ed 100644 --- a/tests/common/matchers/MediaKeysProtoRequestMatchers.h +++ b/tests/common/matchers/MediaKeysProtoRequestMatchers.h @@ -42,12 +42,11 @@ MATCHER_P(destroyMediaKeysRequestMatcher, mediaKeysHandle, "") return (kRequest->media_keys_handle() == mediaKeysHandle); } -MATCHER_P3(createKeySessionRequestMatcher, mediaKeysHandle, sessionType, isLdl, "") +MATCHER_P2(createKeySessionRequestMatcher, mediaKeysHandle, sessionType, "") { const ::firebolt::rialto::CreateKeySessionRequest *kRequest = dynamic_cast(arg); - return ((kRequest->media_keys_handle() == mediaKeysHandle) && (kRequest->session_type() == sessionType) && - (kRequest->is_ldl() == isLdl)); + return ((kRequest->media_keys_handle() == mediaKeysHandle) && (kRequest->session_type() == sessionType)); } MATCHER_P4(generateRequestRequestMatcher, mediaKeysHandle, keySessionId, initDataType, initData, "") diff --git a/tests/componenttests/client/tests/base/MediaKeysTestMethods.cpp b/tests/componenttests/client/tests/base/MediaKeysTestMethods.cpp index 59341e47a..494efd4f1 100644 --- a/tests/componenttests/client/tests/base/MediaKeysTestMethods.cpp +++ b/tests/componenttests/client/tests/base/MediaKeysTestMethods.cpp @@ -32,7 +32,6 @@ const std::string kKeySystemWidevine{"com.widevine.alpha"}; const std::string kKeySystemPlayready{"com.netflix.playready"}; constexpr int32_t kMediaKeysHandle{1}; constexpr firebolt::rialto::KeySessionType kSessionTypeTemp{firebolt::rialto::KeySessionType::TEMPORARY}; -constexpr bool kIsNotLdl{false}; constexpr firebolt::rialto::MediaKeyErrorStatus kStatusOk{firebolt::rialto::MediaKeyErrorStatus::OK}; constexpr firebolt::rialto::MediaKeyErrorStatus kStatusFailed{firebolt::rialto::MediaKeyErrorStatus::FAIL}; constexpr firebolt::rialto::MediaKeyErrorStatus kStatusInterfaceNotImplemented{ @@ -108,8 +107,7 @@ void MediaKeysTestMethods::shouldCreateKeySession() { EXPECT_CALL(*m_mediaKeysModuleMock, createKeySession(_, - createKeySessionRequestMatcher(kMediaKeysHandle, - convertKeySessionType(kSessionTypeTemp), kIsNotLdl), + createKeySessionRequestMatcher(kMediaKeysHandle, convertKeySessionType(kSessionTypeTemp)), _, _)) .WillOnce(DoAll(SetArgPointee<2>(m_mediaKeysModuleMock->createKeySessionResponse(kStatusOk, kKeySessionId)), WithArgs<0, 3>(Invoke(&(*m_mediaKeysModuleMock), &MediaKeysModuleMock::defaultReturn)))); @@ -119,8 +117,7 @@ void MediaKeysTestMethods::shouldCreateKeySessionFailure() { EXPECT_CALL(*m_mediaKeysModuleMock, createKeySession(_, - createKeySessionRequestMatcher(kMediaKeysHandle, - convertKeySessionType(kSessionTypeTemp), kIsNotLdl), + createKeySessionRequestMatcher(kMediaKeysHandle, convertKeySessionType(kSessionTypeTemp)), _, _)) .WillOnce(DoAll(SetArgPointee<2>(m_mediaKeysModuleMock->createKeySessionResponse(kStatusFailed, kKeySessionId)), WithArgs<0, 3>(Invoke(&(*m_mediaKeysModuleMock), &MediaKeysModuleMock::defaultReturn)))); @@ -129,15 +126,14 @@ void MediaKeysTestMethods::shouldCreateKeySessionFailure() void MediaKeysTestMethods::createKeySession() { int32_t keySessionId; - EXPECT_EQ(m_mediaKeys->createKeySession(kSessionTypeTemp, m_mediaKeysClientMock, kIsNotLdl, keySessionId), kStatusOk); + EXPECT_EQ(m_mediaKeys->createKeySession(kSessionTypeTemp, m_mediaKeysClientMock, keySessionId), kStatusOk); EXPECT_EQ(keySessionId, kKeySessionId); } void MediaKeysTestMethods::createKeySessionFailure() { int32_t keySessionId; - EXPECT_EQ(m_mediaKeys->createKeySession(kSessionTypeTemp, m_mediaKeysClientMock, kIsNotLdl, keySessionId), - kStatusFailed); + EXPECT_EQ(m_mediaKeys->createKeySession(kSessionTypeTemp, m_mediaKeysClientMock, keySessionId), kStatusFailed); } void MediaKeysTestMethods::shouldGenerateRequest() diff --git a/tests/componenttests/server/tests/mediaKeys/MediaKeysTestMethods.h b/tests/componenttests/server/tests/mediaKeys/MediaKeysTestMethods.h index 2854d3800..65f16b0fb 100644 --- a/tests/componenttests/server/tests/mediaKeys/MediaKeysTestMethods.h +++ b/tests/componenttests/server/tests/mediaKeys/MediaKeysTestMethods.h @@ -63,7 +63,7 @@ class MediaKeysTestMethods : public RialtoServerComponentTest std::make_unique>()}; testing::StrictMock &m_ocdmSessionMock{*m_ocdmSession}; firebolt::rialto::wrappers::IOcdmSessionClient *m_ocdmSessionClient{0}; - + const std::vector m_kUpdateSessionNetflixResponse{5, 6}; const std::vector m_kInitData{1, 2, 7}; const std::vector m_kLicenseRequestMessage{'d', 'z', 'f'}; diff --git a/tests/componenttests/server/tests/mediaKeys/SetDrmHeaderTest.cpp b/tests/componenttests/server/tests/mediaKeys/SetDrmHeaderTest.cpp index 92ec543c6..e9e6ac27d 100644 --- a/tests/componenttests/server/tests/mediaKeys/SetDrmHeaderTest.cpp +++ b/tests/componenttests/server/tests/mediaKeys/SetDrmHeaderTest.cpp @@ -107,7 +107,7 @@ void SetDrmHeaderTest::setDrmHeader(const std::vector &kKeyId) * setDrmHeader second header. * Expect that setDrmHeader is processed by the server. * Api call returns with success. - * + * * Step 4: Close session * closeSession. * Expect that closeSession is processed by the server. diff --git a/tests/unittests/media/client/ipc/mediaKeysIpc/CreateKeySessionTest.cpp b/tests/unittests/media/client/ipc/mediaKeysIpc/CreateKeySessionTest.cpp index 527f55d4e..c19048ad2 100644 --- a/tests/unittests/media/client/ipc/mediaKeysIpc/CreateKeySessionTest.cpp +++ b/tests/unittests/media/client/ipc/mediaKeysIpc/CreateKeySessionTest.cpp @@ -25,7 +25,6 @@ class RialtoClientMediaKeysIpcCreateKeySessionTest : public MediaKeysIpcTestBase { protected: KeySessionType m_keySessionType = KeySessionType::PERSISTENT_LICENCE; - bool m_isLdl = false; RialtoClientMediaKeysIpcCreateKeySessionTest() { createMediaKeysIpc(); } @@ -51,13 +50,12 @@ TEST_F(RialtoClientMediaKeysIpcCreateKeySessionTest, Success) EXPECT_CALL(*m_channelMock, CallMethod(methodMatcher("createKeySession"), m_controllerMock.get(), - createKeySessionRequestMatcher(m_mediaKeysHandle, convertKeySessionType(m_keySessionType), - m_isLdl), + createKeySessionRequestMatcher(m_mediaKeysHandle, convertKeySessionType(m_keySessionType)), _, m_blockingClosureMock.get())) .WillOnce(WithArgs<3>( Invoke(this, &RialtoClientMediaKeysIpcCreateKeySessionTest::setCreateKeySessionResponseSuccess))); - EXPECT_EQ(m_mediaKeysIpc->createKeySession(m_keySessionType, m_mediaKeysClientMock, m_isLdl, returnKeySessionid), + EXPECT_EQ(m_mediaKeysIpc->createKeySession(m_keySessionType, m_mediaKeysClientMock, returnKeySessionid), MediaKeyErrorStatus::OK); EXPECT_EQ(returnKeySessionid, m_kKeySessionId); @@ -76,7 +74,7 @@ TEST_F(RialtoClientMediaKeysIpcCreateKeySessionTest, ChannelDisconnected) expectIpcApiCallDisconnected(); expectUnsubscribeEvents(); - EXPECT_EQ(m_mediaKeysIpc->createKeySession(m_keySessionType, m_mediaKeysClientMock, m_isLdl, returnKeySessionid), + EXPECT_EQ(m_mediaKeysIpc->createKeySession(m_keySessionType, m_mediaKeysClientMock, returnKeySessionid), MediaKeyErrorStatus::FAIL); // Reattach channel on destroySession @@ -98,7 +96,7 @@ TEST_F(RialtoClientMediaKeysIpcCreateKeySessionTest, ReconnectChannel) .WillOnce(WithArgs<3>( Invoke(this, &RialtoClientMediaKeysIpcCreateKeySessionTest::setCreateKeySessionResponseSuccess))); - EXPECT_EQ(m_mediaKeysIpc->createKeySession(m_keySessionType, m_mediaKeysClientMock, m_isLdl, returnKeySessionid), + EXPECT_EQ(m_mediaKeysIpc->createKeySession(m_keySessionType, m_mediaKeysClientMock, returnKeySessionid), MediaKeyErrorStatus::OK); } @@ -112,7 +110,7 @@ TEST_F(RialtoClientMediaKeysIpcCreateKeySessionTest, Failure) EXPECT_CALL(*m_channelMock, CallMethod(methodMatcher("createKeySession"), _, _, _, _)); - EXPECT_EQ(m_mediaKeysIpc->createKeySession(m_keySessionType, m_mediaKeysClientMock, m_isLdl, returnKeySessionid), + EXPECT_EQ(m_mediaKeysIpc->createKeySession(m_keySessionType, m_mediaKeysClientMock, returnKeySessionid), MediaKeyErrorStatus::FAIL); } @@ -128,6 +126,6 @@ TEST_F(RialtoClientMediaKeysIpcCreateKeySessionTest, ErrorReturn) .WillOnce( WithArgs<3>(Invoke(this, &RialtoClientMediaKeysIpcCreateKeySessionTest::setCreateKeySessionResponseFailed))); - EXPECT_EQ(m_mediaKeysIpc->createKeySession(m_keySessionType, m_mediaKeysClientMock, m_isLdl, returnKeySessionid), + EXPECT_EQ(m_mediaKeysIpc->createKeySession(m_keySessionType, m_mediaKeysClientMock, returnKeySessionid), m_errorStatus); } diff --git a/tests/unittests/media/client/ipc/mediaKeysIpc/base/MediaKeysIpcTestBase.cpp b/tests/unittests/media/client/ipc/mediaKeysIpc/base/MediaKeysIpcTestBase.cpp index e4de26e0d..c0ad54e56 100644 --- a/tests/unittests/media/client/ipc/mediaKeysIpc/base/MediaKeysIpcTestBase.cpp +++ b/tests/unittests/media/client/ipc/mediaKeysIpc/base/MediaKeysIpcTestBase.cpp @@ -103,7 +103,7 @@ void MediaKeysIpcTestBase::createKeySession() EXPECT_CALL(*m_channelMock, CallMethod(methodMatcher("createKeySession"), _, _, _, _)) .WillOnce(WithArgs<3>(Invoke(this, &MediaKeysIpcTestBase::setCreateKeySessionResponseSuccess))); - EXPECT_EQ(m_mediaKeysIpc->createKeySession(KeySessionType::PERSISTENT_LICENCE, m_mediaKeysClientMock, false, + EXPECT_EQ(m_mediaKeysIpc->createKeySession(KeySessionType::PERSISTENT_LICENCE, m_mediaKeysClientMock, returnKeySessionid), MediaKeyErrorStatus::OK); } diff --git a/tests/unittests/media/client/main/mediaKeys/KeySessionTest.cpp b/tests/unittests/media/client/main/mediaKeys/KeySessionTest.cpp index b4040ac2c..7b74c4a79 100644 --- a/tests/unittests/media/client/main/mediaKeys/KeySessionTest.cpp +++ b/tests/unittests/media/client/main/mediaKeys/KeySessionTest.cpp @@ -65,14 +65,12 @@ TEST_F(RialtoClientMediaKeysKeySessionTest, CreateKeySession) KeySessionType sessionType = KeySessionType::PERSISTENT_LICENCE; std::shared_ptr> mediaKeysClientMock = std::make_shared>(); - bool isLDL = false; int32_t returnKeySessionId; - EXPECT_CALL(*m_mediaKeysIpcMock, createKeySession(sessionType, _, isLDL, _)) - .WillOnce(DoAll(SetArgReferee<3>(m_kKeySessionId), Return(m_mediaKeyErrorStatus))); + EXPECT_CALL(*m_mediaKeysIpcMock, createKeySession(sessionType, _, _)) + .WillOnce(DoAll(SetArgReferee<2>(m_kKeySessionId), Return(m_mediaKeyErrorStatus))); - EXPECT_EQ(m_mediaKeys->createKeySession(sessionType, mediaKeysClientMock, isLDL, returnKeySessionId), - m_mediaKeyErrorStatus); + EXPECT_EQ(m_mediaKeys->createKeySession(sessionType, mediaKeysClientMock, returnKeySessionId), m_mediaKeyErrorStatus); EXPECT_EQ(returnKeySessionId, m_kKeySessionId); } diff --git a/tests/unittests/media/client/main/mediaKeys/NetflixKeySessionTest.cpp b/tests/unittests/media/client/main/mediaKeys/NetflixKeySessionTest.cpp index ee2001606..16548c9cf 100644 --- a/tests/unittests/media/client/main/mediaKeys/NetflixKeySessionTest.cpp +++ b/tests/unittests/media/client/main/mediaKeys/NetflixKeySessionTest.cpp @@ -69,14 +69,12 @@ TEST_F(RialtoClientMediaKeysNetflixKeySessionTest, CreateKeySession) KeySessionType sessionType = KeySessionType::PERSISTENT_LICENCE; std::shared_ptr> mediaKeysClientMock = std::make_shared>(); - bool isLDL = false; int32_t returnKeySessionId; - EXPECT_CALL(*m_mediaKeysIpcMock, createKeySession(sessionType, _, isLDL, _)) - .WillOnce(DoAll(SetArgReferee<3>(m_keySessionId), Return(m_mediaKeyErrorStatus))); + EXPECT_CALL(*m_mediaKeysIpcMock, createKeySession(sessionType, _, _)) + .WillOnce(DoAll(SetArgReferee<2>(m_keySessionId), Return(m_mediaKeyErrorStatus))); - EXPECT_EQ(m_mediaKeys->createKeySession(sessionType, mediaKeysClientMock, isLDL, returnKeySessionId), - m_mediaKeyErrorStatus); + EXPECT_EQ(m_mediaKeys->createKeySession(sessionType, mediaKeysClientMock, returnKeySessionId), m_mediaKeyErrorStatus); EXPECT_EQ(returnKeySessionId, m_keySessionId); // Update key should be possible, as keySession should be present in KeyIdMap EXPECT_TRUE(KeyIdMap::instance().updateKey(m_keySessionId, m_keyId)); diff --git a/tests/unittests/media/interface/mocks/MediaKeysMock.h b/tests/unittests/media/interface/mocks/MediaKeysMock.h index 450fd0197..3f639a1fe 100644 --- a/tests/unittests/media/interface/mocks/MediaKeysMock.h +++ b/tests/unittests/media/interface/mocks/MediaKeysMock.h @@ -37,8 +37,7 @@ class MediaKeysMock : public IMediaKeys MOCK_METHOD(MediaKeyErrorStatus, selectKeyId, (int32_t keySessionId, const std::vector &keyId), (override)); MOCK_METHOD(bool, containsKey, (int32_t keySessionId, const std::vector &keyId), (override)); MOCK_METHOD(MediaKeyErrorStatus, createKeySession, - (KeySessionType sessionType, std::weak_ptr client, bool isLDL, int32_t &keySessionId), - (override)); + (KeySessionType sessionType, std::weak_ptr client, int32_t &keySessionId), (override)); MOCK_METHOD(MediaKeyErrorStatus, generateRequest, (int32_t keySessionId, InitDataType initDataType, const std::vector &initData), (override)); MOCK_METHOD(MediaKeyErrorStatus, loadSession, (int32_t keySessionId), (override)); diff --git a/tests/unittests/media/server/ipc/mediaKeysModuleService/MediaKeysModuleServiceTestsFixture.cpp b/tests/unittests/media/server/ipc/mediaKeysModuleService/MediaKeysModuleServiceTestsFixture.cpp index 44720cfae..7ea133b52 100644 --- a/tests/unittests/media/server/ipc/mediaKeysModuleService/MediaKeysModuleServiceTestsFixture.cpp +++ b/tests/unittests/media/server/ipc/mediaKeysModuleService/MediaKeysModuleServiceTestsFixture.cpp @@ -39,7 +39,6 @@ namespace const std::string keySystem{"expectedKeySystem"}; constexpr int kHardcodedMediaKeysHandle{2}; constexpr firebolt::rialto::KeySessionType kKeySessionType{firebolt::rialto::KeySessionType::TEMPORARY}; -constexpr bool kIsLDL{false}; constexpr int kKeySessionId{3}; constexpr firebolt::rialto::MediaKeyErrorStatus kErrorStatus{firebolt::rialto::MediaKeyErrorStatus::FAIL}; constexpr firebolt::rialto::InitDataType kInitDataType{firebolt::rialto::InitDataType::CENC}; @@ -142,15 +141,15 @@ void MediaKeysModuleServiceTests::cdmServiceWillCreateKeySession() { expectRequestSuccess(); EXPECT_CALL(*m_controllerMock, getClient()).WillOnce(Return(m_clientMock)); - EXPECT_CALL(m_cdmServiceMock, createKeySession(kHardcodedMediaKeysHandle, kKeySessionType, _, kIsLDL, _)) - .WillOnce(DoAll(SetArgReferee<4>(kKeySessionId), Return(firebolt::rialto::MediaKeyErrorStatus::OK))); + EXPECT_CALL(m_cdmServiceMock, createKeySession(kHardcodedMediaKeysHandle, kKeySessionType, _, _)) + .WillOnce(DoAll(SetArgReferee<3>(kKeySessionId), Return(firebolt::rialto::MediaKeyErrorStatus::OK))); } void MediaKeysModuleServiceTests::cdmServiceWillFailToCreateKeySession() { expectRequestSuccess(); EXPECT_CALL(*m_controllerMock, getClient()).WillOnce(Return(m_clientMock)); - EXPECT_CALL(m_cdmServiceMock, createKeySession(kHardcodedMediaKeysHandle, kKeySessionType, _, kIsLDL, _)) + EXPECT_CALL(m_cdmServiceMock, createKeySession(kHardcodedMediaKeysHandle, kKeySessionType, _, _)) .WillOnce(Return(kErrorStatus)); } @@ -483,7 +482,6 @@ void MediaKeysModuleServiceTests::sendCreateKeySessionRequestAndReceiveResponse( request.set_media_keys_handle(kHardcodedMediaKeysHandle); request.set_session_type(convertKeySessionType(kKeySessionType)); - request.set_is_ldl(kIsLDL); m_service->createKeySession(m_controllerMock.get(), &request, &response, m_closureMock.get()); EXPECT_GE(response.key_session_id(), -1); @@ -497,7 +495,6 @@ void MediaKeysModuleServiceTests::sendCreateKeySessionRequestAndReceiveErrorResp request.set_media_keys_handle(kHardcodedMediaKeysHandle); request.set_session_type(convertKeySessionType(kKeySessionType)); - request.set_is_ldl(kIsLDL); m_service->createKeySession(m_controllerMock.get(), &request, &response, m_closureMock.get()); EXPECT_GE(response.key_session_id(), -1); @@ -511,7 +508,6 @@ void MediaKeysModuleServiceTests::sendCreateKeySessionRequestWithInvalidIpcAndRe request.set_media_keys_handle(kHardcodedMediaKeysHandle); request.set_session_type(convertKeySessionType(kKeySessionType)); - request.set_is_ldl(kIsLDL); m_service->createKeySession(m_invalidControllerMock.get(), &request, &response, m_closureMock.get()); } diff --git a/tests/unittests/media/server/main/mediaKeySession/CreateTest.cpp b/tests/unittests/media/server/main/mediaKeySession/CreateTest.cpp index 0e70388a2..a0b6c8da8 100644 --- a/tests/unittests/media/server/main/mediaKeySession/CreateTest.cpp +++ b/tests/unittests/media/server/main/mediaKeySession/CreateTest.cpp @@ -34,8 +34,7 @@ TEST_F(RialtoServerCreateMediaKeySessionTest, Create) EXPECT_NO_THROW(m_mediaKeySession = std::make_unique(kNetflixKeySystem, m_kKeySessionId, *m_ocdmSystemMock, m_keySessionType, - m_mediaKeysClientMock, m_isLDL, - m_mainThreadFactoryMock)); + m_mediaKeysClientMock, m_mainThreadFactoryMock)); EXPECT_NE(m_mediaKeySession, nullptr); destroyKeySession(); @@ -52,7 +51,7 @@ TEST_F(RialtoServerCreateMediaKeySessionTest, FactoryCreatesObject) EXPECT_CALL(*m_ocdmSystemMock, createSession(_)).WillOnce(Return(ByMove(std::move(m_ocdmSession)))); EXPECT_NE(factory->createMediaKeySession(kNetflixKeySystem, m_kKeySessionId, *m_ocdmSystemMock, m_keySessionType, - m_mediaKeysClientMock, m_isLDL), + m_mediaKeysClientMock), nullptr); } @@ -66,8 +65,7 @@ TEST_F(RialtoServerCreateMediaKeySessionTest, CreateMainThreadFailure) EXPECT_THROW(m_mediaKeySession = std::make_unique(kNetflixKeySystem, m_kKeySessionId, *m_ocdmSystemMock, m_keySessionType, - m_mediaKeysClientMock, m_isLDL, - m_mainThreadFactoryMock), + m_mediaKeysClientMock, m_mainThreadFactoryMock), std::runtime_error); } @@ -83,7 +81,6 @@ TEST_F(RialtoServerCreateMediaKeySessionTest, CreateOcdmSessionFailure) EXPECT_THROW(m_mediaKeySession = std::make_unique(kNetflixKeySystem, m_kKeySessionId, *m_ocdmSystemMock, m_keySessionType, - m_mediaKeysClientMock, m_isLDL, - m_mainThreadFactoryMock), + m_mediaKeysClientMock, m_mainThreadFactoryMock), std::runtime_error); } diff --git a/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp b/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp index c81839615..26a68c860 100644 --- a/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp +++ b/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp @@ -42,7 +42,7 @@ void MediaKeySessionTestBase::createKeySession(const std::string &keySystem) EXPECT_NO_THROW(m_mediaKeySession = std::make_unique(keySystem, m_kKeySessionId, *m_ocdmSystemMock, m_keySessionType, m_mediaKeysClientMock, - m_isLDL, m_mainThreadFactoryMock)); + m_mainThreadFactoryMock)); EXPECT_NE(m_mediaKeySession, nullptr); } diff --git a/tests/unittests/media/server/main/mediaKeys/CreateKeySessionTest.cpp b/tests/unittests/media/server/main/mediaKeys/CreateKeySessionTest.cpp index 40ea6c374..4ab26341c 100644 --- a/tests/unittests/media/server/main/mediaKeys/CreateKeySessionTest.cpp +++ b/tests/unittests/media/server/main/mediaKeys/CreateKeySessionTest.cpp @@ -34,12 +34,11 @@ TEST_F(RialtoServerMediaKeysCreateKeySessionTest, Success) int32_t returnKeySessionId = -1; mainThreadWillEnqueueTaskAndWait(); - EXPECT_CALL(*m_mediaKeySessionFactoryMock, - createMediaKeySession(kNetflixKeySystem, _, _, m_keySessionType, _, m_isLDL)) + EXPECT_CALL(*m_mediaKeySessionFactoryMock, createMediaKeySession(kNetflixKeySystem, _, _, m_keySessionType, _)) .WillOnce(Return(ByMove(std::move(m_mediaKeySession)))); EXPECT_EQ(MediaKeyErrorStatus::OK, - m_mediaKeys->createKeySession(m_keySessionType, m_mediaKeysClientMock, m_isLDL, returnKeySessionId)); + m_mediaKeys->createKeySession(m_keySessionType, m_mediaKeysClientMock, returnKeySessionId)); EXPECT_GE(returnKeySessionId, -1); } @@ -51,10 +50,9 @@ TEST_F(RialtoServerMediaKeysCreateKeySessionTest, OcdmSystemFailure) int32_t returnKeySessionId = -1; mainThreadWillEnqueueTaskAndWait(); - EXPECT_CALL(*m_mediaKeySessionFactoryMock, - createMediaKeySession(kNetflixKeySystem, _, _, m_keySessionType, _, m_isLDL)) + EXPECT_CALL(*m_mediaKeySessionFactoryMock, createMediaKeySession(kNetflixKeySystem, _, _, m_keySessionType, _)) .WillOnce(Return(ByMove(nullptr))); EXPECT_EQ(MediaKeyErrorStatus::FAIL, - m_mediaKeys->createKeySession(m_keySessionType, m_mediaKeysClientMock, m_isLDL, returnKeySessionId)); + m_mediaKeys->createKeySession(m_keySessionType, m_mediaKeysClientMock, returnKeySessionId)); } diff --git a/tests/unittests/media/server/main/mediaKeys/base/MediaKeysTestBase.cpp b/tests/unittests/media/server/main/mediaKeys/base/MediaKeysTestBase.cpp index d6a9f91f7..d12682c95 100644 --- a/tests/unittests/media/server/main/mediaKeys/base/MediaKeysTestBase.cpp +++ b/tests/unittests/media/server/main/mediaKeys/base/MediaKeysTestBase.cpp @@ -61,11 +61,11 @@ void MediaKeysTestBase::destroyMediaKeys() void MediaKeysTestBase::createKeySession(std::string keySystem) { mainThreadWillEnqueueTaskAndWait(); - EXPECT_CALL(*m_mediaKeySessionFactoryMock, createMediaKeySession(keySystem, _, _, m_keySessionType, _, m_isLDL)) + EXPECT_CALL(*m_mediaKeySessionFactoryMock, createMediaKeySession(keySystem, _, _, m_keySessionType, _)) .WillOnce(Return(ByMove(std::move(m_mediaKeySession)))); EXPECT_EQ(MediaKeyErrorStatus::OK, - m_mediaKeys->createKeySession(m_keySessionType, m_mediaKeysClientMock, m_isLDL, m_kKeySessionId)); + m_mediaKeys->createKeySession(m_keySessionType, m_mediaKeysClientMock, m_kKeySessionId)); } void MediaKeysTestBase::mainThreadWillEnqueueTaskAndWait() diff --git a/tests/unittests/media/server/mocks/main/MediaKeySessionFactoryMock.h b/tests/unittests/media/server/mocks/main/MediaKeySessionFactoryMock.h index d7ada3a1c..fc2835f40 100644 --- a/tests/unittests/media/server/mocks/main/MediaKeySessionFactoryMock.h +++ b/tests/unittests/media/server/mocks/main/MediaKeySessionFactoryMock.h @@ -33,7 +33,7 @@ class MediaKeySessionFactoryMock : public IMediaKeySessionFactory MOCK_METHOD(std::unique_ptr, createMediaKeySession, (const std::string &keySystem, int32_t keySessionId, const firebolt::rialto::wrappers::IOcdmSystem &ocdmSystem, KeySessionType sessionType, - std::weak_ptr client, bool isLDL), + std::weak_ptr client), (const, override)); }; } // namespace firebolt::rialto::server diff --git a/tests/unittests/media/server/mocks/main/MediaKeysServerInternalMock.h b/tests/unittests/media/server/mocks/main/MediaKeysServerInternalMock.h index 7333feede..1d84c540b 100644 --- a/tests/unittests/media/server/mocks/main/MediaKeysServerInternalMock.h +++ b/tests/unittests/media/server/mocks/main/MediaKeysServerInternalMock.h @@ -37,8 +37,7 @@ class MediaKeysServerInternalMock : public IMediaKeysServerInternal MOCK_METHOD(MediaKeyErrorStatus, selectKeyId, (int32_t keySessionId, const std::vector &keyId), (override)); MOCK_METHOD(bool, containsKey, (int32_t keySessionId, const std::vector &keyId), (override)); MOCK_METHOD(MediaKeyErrorStatus, createKeySession, - (KeySessionType sessionType, std::weak_ptr client, bool isLDL, int32_t &keySessionId), - (override)); + (KeySessionType sessionType, std::weak_ptr client, int32_t &keySessionId), (override)); MOCK_METHOD(MediaKeyErrorStatus, generateRequest, (int32_t keySessionId, InitDataType initDataType, const std::vector &initData), (override)); MOCK_METHOD(MediaKeyErrorStatus, loadSession, (int32_t keySessionId), (override)); diff --git a/tests/unittests/media/server/mocks/service/CdmServiceMock.h b/tests/unittests/media/server/mocks/service/CdmServiceMock.h index 4c0699c46..cc16e75b7 100644 --- a/tests/unittests/media/server/mocks/service/CdmServiceMock.h +++ b/tests/unittests/media/server/mocks/service/CdmServiceMock.h @@ -37,7 +37,7 @@ class CdmServiceMock : public ICdmService MOCK_METHOD(bool, destroyMediaKeys, (int mediaKeysHandle), (override)); MOCK_METHOD(MediaKeyErrorStatus, createKeySession, (int mediaKeysHandle, KeySessionType sessionType, const std::shared_ptr &client, - bool isLDL, int32_t &keySessionId), + int32_t &keySessionId), (override)); MOCK_METHOD(MediaKeyErrorStatus, generateRequest, (int mediaKeysHandle, int32_t keySessionId, InitDataType initDataType, diff --git a/tests/unittests/media/server/service/cdmService/CdmServiceTestsFixture.cpp b/tests/unittests/media/server/service/cdmService/CdmServiceTestsFixture.cpp index 73e0a7a43..92c4a2798 100644 --- a/tests/unittests/media/server/service/cdmService/CdmServiceTestsFixture.cpp +++ b/tests/unittests/media/server/service/cdmService/CdmServiceTestsFixture.cpp @@ -35,7 +35,6 @@ const std::vector kKeySystems{"expectedKeySystem1", "expectedKeySys const std::string kVersion{"123"}; constexpr int kMediaKeysHandle{2}; constexpr firebolt::rialto::KeySessionType kKeySessionType{firebolt::rialto::KeySessionType::TEMPORARY}; -constexpr bool kIsLDL{false}; constexpr int kKeySessionId{3}; constexpr firebolt::rialto::InitDataType kInitDataType{firebolt::rialto::InitDataType::CENC}; const std::vector kInitData{6, 7, 2}; @@ -126,8 +125,8 @@ void CdmServiceTests::mediaKeysFactoryWillReturnNullptr() void CdmServiceTests::mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus status) { - EXPECT_CALL(m_mediaKeysMock, createKeySession(kKeySessionType, _, kIsLDL, _)) - .WillOnce(DoAll(SetArgReferee<3>(kKeySessionId), Return(status))); + EXPECT_CALL(m_mediaKeysMock, createKeySession(kKeySessionType, _, _)) + .WillOnce(DoAll(SetArgReferee<2>(kKeySessionId), Return(status))); } void CdmServiceTests::mediaKeysWillGenerateRequestWithStatus(firebolt::rialto::MediaKeyErrorStatus status) @@ -260,16 +259,15 @@ void CdmServiceTests::createKeySessionShouldSucceed() { int32_t returnKeySessionId = -1; EXPECT_EQ(firebolt::rialto::MediaKeyErrorStatus::OK, - m_sut.createKeySession(kMediaKeysHandle, kKeySessionType, m_mediaKeysClientMock, kIsLDL, - returnKeySessionId)); + m_sut.createKeySession(kMediaKeysHandle, kKeySessionType, m_mediaKeysClientMock, returnKeySessionId)); EXPECT_GE(returnKeySessionId, -1); } void CdmServiceTests::createKeySessionShouldFailWithReturnStatus(firebolt::rialto::MediaKeyErrorStatus status) { int32_t returnKeySessionId = -1; - EXPECT_EQ(status, m_sut.createKeySession(kMediaKeysHandle, kKeySessionType, m_mediaKeysClientMock, kIsLDL, - returnKeySessionId)); + EXPECT_EQ(status, + m_sut.createKeySession(kMediaKeysHandle, kKeySessionType, m_mediaKeysClientMock, returnKeySessionId)); } void CdmServiceTests::generateRequestShouldReturnStatus(firebolt::rialto::MediaKeyErrorStatus status) From b22851fbc4e797a2f2632feced200877f28a271f Mon Sep 17 00:00:00 2001 From: Marcin Wojciechowski Date: Fri, 19 Dec 2025 12:48:47 +0100 Subject: [PATCH 03/12] if change --- media/client/ipc/include/MediaKeysIpc.h | 3 +- media/client/ipc/source/MediaKeysIpc.cpp | 22 +++++++- media/client/main/include/MediaKeys.h | 3 +- media/client/main/source/MediaKeys.cpp | 5 +- media/public/include/IMediaKeys.h | 7 ++- .../server/gstplayer/source/GstDecryptor.cpp | 2 +- .../ipc/source/MediaKeysModuleService.cpp | 25 +++++++-- media/server/main/include/IMediaKeySession.h | 12 +--- media/server/main/include/MediaKeySession.h | 14 +++-- .../main/include/MediaKeysServerInternal.h | 9 +-- .../main/interface/IDecryptionService.h | 2 +- .../main/interface/IMediaKeysServerInternal.h | 7 --- media/server/main/source/MediaKeySession.cpp | 37 ++++++------ .../main/source/MediaKeysServerInternal.cpp | 16 ++---- media/server/service/include/ICdmService.h | 3 +- media/server/service/source/CdmService.cpp | 20 ++++--- media/server/service/source/CdmService.h | 7 ++- proto/mediakeysmodule.proto | 8 ++- tests/common/protoUtils/MediaKeysProtoUtils.h | 15 +++++ .../client/main/mediaKeys/KeySessionTest.cpp | 5 +- .../media/interface/mocks/MediaKeysMock.h | 4 +- .../gstplayer/decryptor/DecryptTest.cpp | 4 +- .../MediaKeysModuleServiceTestsFixture.cpp | 9 ++- .../media/server/main/CMakeLists.txt | 2 - .../mediaKeySession/CloseKeySessionTest.cpp | 9 +++ .../mediaKeySession/GenerateRequestTest.cpp | 19 ++++--- .../IsNetflixPlayreadyKeySystemTest.cpp | 56 ------------------- .../mediaKeySession/UpdateSessionTest.cpp | 8 +++ .../base/MediaKeySessionTestBase.cpp | 6 +- .../base/MediaKeySessionTestBase.h | 1 + .../main/mediaKeys/GenerateRequestTest.cpp | 12 ++-- .../IsNetflixPlayreadyKeySystemTest.cpp | 45 --------------- .../server/mocks/main/DecryptionServiceMock.h | 2 +- .../server/mocks/main/MediaKeySessionMock.h | 4 +- .../mocks/main/MediaKeysServerInternalMock.h | 5 +- .../server/mocks/service/CdmServiceMock.h | 2 +- .../service/cdmService/CdmServiceTests.cpp | 54 +++++++----------- .../cdmService/CdmServiceTestsFixture.cpp | 27 ++++++--- .../cdmService/CdmServiceTestsFixture.h | 5 +- 39 files changed, 242 insertions(+), 254 deletions(-) delete mode 100644 tests/unittests/media/server/main/mediaKeySession/IsNetflixPlayreadyKeySystemTest.cpp delete mode 100644 tests/unittests/media/server/main/mediaKeys/IsNetflixPlayreadyKeySystemTest.cpp diff --git a/media/client/ipc/include/MediaKeysIpc.h b/media/client/ipc/include/MediaKeysIpc.h index ddcac2ec7..f962fc85d 100644 --- a/media/client/ipc/include/MediaKeysIpc.h +++ b/media/client/ipc/include/MediaKeysIpc.h @@ -73,7 +73,8 @@ class MediaKeysIpc : public IMediaKeys, public IpcModule int32_t &keySessionId) override; MediaKeyErrorStatus generateRequest(int32_t keySessionId, InitDataType initDataType, - const std::vector &initData) override; + const std::vector &initData, + const LimitedDurationLicense &ldlState) override; MediaKeyErrorStatus loadSession(int32_t keySessionId) override; diff --git a/media/client/ipc/source/MediaKeysIpc.cpp b/media/client/ipc/source/MediaKeysIpc.cpp index e2420cde7..5706bd378 100644 --- a/media/client/ipc/source/MediaKeysIpc.cpp +++ b/media/client/ipc/source/MediaKeysIpc.cpp @@ -386,7 +386,8 @@ MediaKeyErrorStatus MediaKeysIpc::createKeySession(KeySessionType sessionType, s } MediaKeyErrorStatus MediaKeysIpc::generateRequest(int32_t keySessionId, InitDataType initDataType, - const std::vector &initData) + const std::vector &initData, + const LimitedDurationLicense &ldlState) { if (!reattachChannelIfRequired()) { @@ -414,10 +415,29 @@ MediaKeyErrorStatus MediaKeysIpc::generateRequest(int32_t keySessionId, InitData break; } + GenerateRequestRequest_LimitedDurationLicense protoLimitedDurationLicense{ + GenerateRequestRequest_LimitedDurationLicense_NOT_SPECIFIED}; + switch (ldlState) + { + case LimitedDurationLicense::NOT_SPECIFIED: + protoLimitedDurationLicense = GenerateRequestRequest_LimitedDurationLicense_NOT_SPECIFIED; + break; + case LimitedDurationLicense::ENABLED: + protoLimitedDurationLicense = GenerateRequestRequest_LimitedDurationLicense_ENABLED; + break; + case LimitedDurationLicense::DISABLED: + protoLimitedDurationLicense = GenerateRequestRequest_LimitedDurationLicense_DISABLED; + break; + default: + RIALTO_CLIENT_LOG_WARN("Recieved unknown limited duration license state"); + break; + } + firebolt::rialto::GenerateRequestRequest request; request.set_media_keys_handle(m_mediaKeysHandle); request.set_key_session_id(keySessionId); request.set_init_data_type(protoInitDataType); + request.set_ldl_state(protoLimitedDurationLicense); for (auto it = initData.begin(); it != initData.end(); it++) { diff --git a/media/client/main/include/MediaKeys.h b/media/client/main/include/MediaKeys.h index eaa401ba8..c997cd090 100644 --- a/media/client/main/include/MediaKeys.h +++ b/media/client/main/include/MediaKeys.h @@ -83,7 +83,8 @@ class MediaKeys : public IMediaKeys int32_t &keySessionId) override; MediaKeyErrorStatus generateRequest(int32_t keySessionId, InitDataType initDataType, - const std::vector &initData) override; + const std::vector &initData, + const LimitedDurationLicense &ldlState) override; MediaKeyErrorStatus loadSession(int32_t keySessionId) override; diff --git a/media/client/main/source/MediaKeys.cpp b/media/client/main/source/MediaKeys.cpp index 639e6bcee..4d5afa337 100644 --- a/media/client/main/source/MediaKeys.cpp +++ b/media/client/main/source/MediaKeys.cpp @@ -128,11 +128,12 @@ MediaKeyErrorStatus MediaKeys::createKeySession(KeySessionType sessionType, std: } MediaKeyErrorStatus MediaKeys::generateRequest(int32_t keySessionId, InitDataType initDataType, - const std::vector &initData) + const std::vector &initData, + const LimitedDurationLicense &ldlState) { RIALTO_CLIENT_LOG_DEBUG("entry:"); - return m_mediaKeysIpc->generateRequest(keySessionId, initDataType, initData); + return m_mediaKeysIpc->generateRequest(keySessionId, initDataType, initData, ldlState); } MediaKeyErrorStatus MediaKeys::loadSession(int32_t keySessionId) diff --git a/media/public/include/IMediaKeys.h b/media/public/include/IMediaKeys.h index 84b32eb14..c2e4ced3d 100644 --- a/media/public/include/IMediaKeys.h +++ b/media/public/include/IMediaKeys.h @@ -129,11 +129,14 @@ class IMediaKeys * @param[in] keySessionId : The key session id for the session. * @param[in] initDataType : The init data type. * @param[in] initData : The init data. + * @param[in] ldlState : The Limited Duration License state. Most of key systems do not need this parameter, + * so the default value is NOT_SPECIFIED. * * @retval an error status. */ - virtual MediaKeyErrorStatus generateRequest(int32_t keySessionId, InitDataType initDataType, - const std::vector &initData) = 0; + virtual MediaKeyErrorStatus + generateRequest(int32_t keySessionId, InitDataType initDataType, const std::vector &initData, + const LimitedDurationLicense &ldlState = LimitedDurationLicense::NOT_SPECIFIED) = 0; /** * @brief Loads an existing key session diff --git a/media/server/gstplayer/source/GstDecryptor.cpp b/media/server/gstplayer/source/GstDecryptor.cpp index 0882b36d3..d3e499e45 100644 --- a/media/server/gstplayer/source/GstDecryptor.cpp +++ b/media/server/gstplayer/source/GstDecryptor.cpp @@ -280,7 +280,7 @@ GstFlowReturn GstRialtoDecryptorPrivate::decrypt(GstBuffer *buffer, GstCaps *cap } } - if (protectionData->key && m_decryptionService->isNetflixPlayreadyKeySystem(protectionData->keySessionId)) + if (protectionData->key && m_decryptionService->isExtendedInterfaceUsed(protectionData->keySessionId)) { GstMapInfo keyMap; if (m_gstWrapper->gstBufferMap(protectionData->key, &keyMap, GST_MAP_READ)) diff --git a/media/server/ipc/source/MediaKeysModuleService.cpp b/media/server/ipc/source/MediaKeysModuleService.cpp index 03a8f51b9..6f69d69dd 100644 --- a/media/server/ipc/source/MediaKeysModuleService.cpp +++ b/media/server/ipc/source/MediaKeysModuleService.cpp @@ -100,6 +100,22 @@ firebolt::rialto::InitDataType covertInitDataType(firebolt::rialto::GenerateRequ return firebolt::rialto::InitDataType::UNKNOWN; } } + +firebolt::rialto::LimitedDurationLicense +covertLimitedDurationLicense(firebolt::rialto::GenerateRequestRequest_LimitedDurationLicense protoLimitedDurationLicense) +{ + switch (protoLimitedDurationLicense) + { + case firebolt::rialto::GenerateRequestRequest_LimitedDurationLicense::GenerateRequestRequest_LimitedDurationLicense_NOT_SPECIFIED: + return firebolt::rialto::LimitedDurationLicense::NOT_SPECIFIED; + case firebolt::rialto::GenerateRequestRequest_LimitedDurationLicense::GenerateRequestRequest_LimitedDurationLicense_ENABLED: + return firebolt::rialto::LimitedDurationLicense::ENABLED; + case firebolt::rialto::GenerateRequestRequest_LimitedDurationLicense::GenerateRequestRequest_LimitedDurationLicense_DISABLED: + return firebolt::rialto::LimitedDurationLicense::DISABLED; + default: + return firebolt::rialto::LimitedDurationLicense::NOT_SPECIFIED; + } +} } // namespace namespace firebolt::rialto::server::ipc @@ -278,10 +294,11 @@ void MediaKeysModuleService::generateRequest(::google::protobuf::RpcController * { 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()}); + 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()}, + covertLimitedDurationLicense(request->ldl_state())); response->set_error_status(convertMediaKeyErrorStatus(status)); done->Run(); } diff --git a/media/server/main/include/IMediaKeySession.h b/media/server/main/include/IMediaKeySession.h index 6db1167cc..5bb552cc1 100644 --- a/media/server/main/include/IMediaKeySession.h +++ b/media/server/main/include/IMediaKeySession.h @@ -83,11 +83,12 @@ class IMediaKeySession * * @param[in] initDataType : The init data type. * @param[in] initData : The init data. + * @param[in] ldlState : The Limited Duration License state. Most of key systems do not need this parameter. * * @retval an error status. */ - virtual MediaKeyErrorStatus generateRequest(InitDataType initDataType, const std::vector &initData) = 0; - + virtual MediaKeyErrorStatus generateRequest(InitDataType initDataType, const std::vector &initData, + const LimitedDurationLicense &ldlState) = 0; /** * @brief Loads the existing key session. * @@ -178,13 +179,6 @@ class IMediaKeySession * @retval an error status. */ virtual MediaKeyErrorStatus selectKeyId(const std::vector &keyId) = 0; - - /** - * @brief Checks, if key system of media key session is Netflix playready. - * - * @retval true if key system is Netflix playready - */ - virtual bool isNetflixPlayreadyKeySystem() const = 0; }; } // namespace firebolt::rialto::server diff --git a/media/server/main/include/MediaKeySession.h b/media/server/main/include/MediaKeySession.h index 4f405dcbd..e4eeca6a8 100644 --- a/media/server/main/include/MediaKeySession.h +++ b/media/server/main/include/MediaKeySession.h @@ -71,7 +71,8 @@ class MediaKeySession : public IMediaKeySession, public firebolt::rialto::wrappe */ virtual ~MediaKeySession(); - MediaKeyErrorStatus generateRequest(InitDataType initDataType, const std::vector &initData) override; + MediaKeyErrorStatus generateRequest(InitDataType initDataType, const std::vector &initData, + const LimitedDurationLicense &ldlState) override; MediaKeyErrorStatus loadSession() override; @@ -93,8 +94,6 @@ class MediaKeySession : public IMediaKeySession, public firebolt::rialto::wrappe MediaKeyErrorStatus selectKeyId(const std::vector &keyId) override; - bool isNetflixPlayreadyKeySystem() const override; - void onProcessChallenge(const char url[], const uint8_t challenge[], const uint16_t challengeLength) override; void onKeyUpdated(const uint8_t keyId[], const uint8_t keyIdLength) override; @@ -184,12 +183,19 @@ class MediaKeySession : public IMediaKeySession, public firebolt::rialto::wrappe */ std::vector m_queuedDrmHeader; + /** + * @brief Flag used to check if extended interface is used + */ + bool m_extendedInterfaceInUse{false}; + /** * @brief Posts a getChallenge task onto the main thread. * + * @param[in] ldlState : The Limited Duration License state. + * * The challenge data is retrieved from ocdm and notified on a onLicenseRequest. */ - void getChallenge(); + void getChallenge(const LimitedDurationLicense &ldlState); /** * @brief Initalises the ocdm error data which checks for onError callbacks. diff --git a/media/server/main/include/MediaKeysServerInternal.h b/media/server/main/include/MediaKeysServerInternal.h index 6514b27f2..d34ca5fa3 100644 --- a/media/server/main/include/MediaKeysServerInternal.h +++ b/media/server/main/include/MediaKeysServerInternal.h @@ -80,7 +80,8 @@ class MediaKeysServerInternal : public IMediaKeysServerInternal int32_t &keySessionId) override; MediaKeyErrorStatus generateRequest(int32_t keySessionId, InitDataType initDataType, - const std::vector &initData) override; + const std::vector &initData, + const LimitedDurationLicense &ldlState) override; MediaKeyErrorStatus loadSession(int32_t keySessionId) override; @@ -114,8 +115,6 @@ class MediaKeysServerInternal : public IMediaKeysServerInternal MediaKeyErrorStatus getMetricSystemData(std::vector &buffer) override; - bool isNetflixPlayreadyKeySystem() const override; - void ping(std::unique_ptr &&heartbeatHandler) override; private: @@ -168,11 +167,13 @@ class MediaKeysServerInternal : public IMediaKeysServerInternal * @param[in] keySessionId : The key session id for the session. * @param[in] initDataType : The init data type. * @param[in] initData : The init data. + * @param[in] ldlState : The Limited Duration License state. Most of key systems do not need this parameter. * * @retval an error status. */ MediaKeyErrorStatus generateRequestInternal(int32_t keySessionId, InitDataType initDataType, - const std::vector &initData); + const std::vector &initData, + const LimitedDurationLicense &ldlState); /** * @brief Load internally, only to be called on the main thread. diff --git a/media/server/main/interface/IDecryptionService.h b/media/server/main/interface/IDecryptionService.h index 322b7aad4..3d52056f5 100644 --- a/media/server/main/interface/IDecryptionService.h +++ b/media/server/main/interface/IDecryptionService.h @@ -32,7 +32,7 @@ class IDecryptionService public: virtual ~IDecryptionService() = default; virtual MediaKeyErrorStatus decrypt(int32_t keySessionId, GstBuffer *encrypted, GstCaps *caps) = 0; - virtual bool isNetflixPlayreadyKeySystem(int32_t keySessionId) = 0; + virtual bool isExtendedInterfaceUsed(int32_t keySessionId) = 0; virtual MediaKeyErrorStatus selectKeyId(int32_t keySessionId, const std::vector &keyId) = 0; virtual void incrementSessionIdUsageCounter(int32_t keySessionId) = 0; virtual void decrementSessionIdUsageCounter(int32_t keySessionId) = 0; diff --git a/media/server/main/interface/IMediaKeysServerInternal.h b/media/server/main/interface/IMediaKeysServerInternal.h index 45069b19a..5de4ffc60 100644 --- a/media/server/main/interface/IMediaKeysServerInternal.h +++ b/media/server/main/interface/IMediaKeysServerInternal.h @@ -89,13 +89,6 @@ class IMediaKeysServerInternal : public IMediaKeys */ virtual MediaKeyErrorStatus decrypt(int32_t keySessionId, GstBuffer *encrypted, GstCaps *caps) = 0; - /** - * @brief Checks, if key system of media key session is Netflix Playready. - * - * @retval true if key system is Playready - */ - virtual bool isNetflixPlayreadyKeySystem() const = 0; - /** * @brief Checks, if MediaKeys main thread is not deadlocked * diff --git a/media/server/main/source/MediaKeySession.cpp b/media/server/main/source/MediaKeySession.cpp index 604da1929..1244db055 100644 --- a/media/server/main/source/MediaKeySession.cpp +++ b/media/server/main/source/MediaKeySession.cpp @@ -107,7 +107,8 @@ MediaKeySession::~MediaKeySession() m_mainThread->unregisterClient(m_mainThreadClientId); } -MediaKeyErrorStatus MediaKeySession::generateRequest(InitDataType initDataType, const std::vector &initData) +MediaKeyErrorStatus MediaKeySession::generateRequest(InitDataType initDataType, const std::vector &initData, + const LimitedDurationLicense &ldlState) { RIALTO_SERVER_LOG_DEBUG("entry:"); // Set the request flag for the onLicenseRequest callback @@ -134,13 +135,6 @@ MediaKeyErrorStatus MediaKeySession::generateRequest(InitDataType initDataType, setDrmHeader(m_queuedDrmHeader); m_queuedDrmHeader.clear(); } - - if (isNetflixPlayreadyKeySystem()) - { - // Ocdm-playready does not notify onProcessChallenge when complete. - // Fetch the challenge manually. - getChallenge(); - } } if ((checkForOcdmErrors("generateRequest")) && (MediaKeyErrorStatus::OK == status)) @@ -148,27 +142,35 @@ MediaKeyErrorStatus MediaKeySession::generateRequest(InitDataType initDataType, status = MediaKeyErrorStatus::FAIL; } + if (LimitedDurationLicense::NOT_SPECIFIED != ldlState) + { + m_extendedInterfaceInUse = true; + // Ocdm-playready does not notify onProcessChallenge when complete. + // Fetch the challenge manually. + getChallenge(ldlState); + } + return status; } return MediaKeyErrorStatus::OK; } -void MediaKeySession::getChallenge() +void MediaKeySession::getChallenge(const LimitedDurationLicense &ldlState) { RIALTO_SERVER_LOG_DEBUG("entry:"); auto task = [&]() { - const bool isLdlTemp{false}; + const bool kIsLdl{LimitedDurationLicense::ENABLED == ldlState}; uint32_t challengeSize = 0; - MediaKeyErrorStatus status = m_ocdmSession->getChallengeData(isLdlTemp, nullptr, &challengeSize); + MediaKeyErrorStatus status = m_ocdmSession->getChallengeData(kIsLdl, nullptr, &challengeSize); if (challengeSize == 0) { RIALTO_SERVER_LOG_ERROR("Failed to get the challenge data size, no onLicenseRequest will be generated"); return; } std::vector challenge(challengeSize, 0x00); - status = m_ocdmSession->getChallengeData(isLdlTemp, &challenge[0], &challengeSize); + status = m_ocdmSession->getChallengeData(kIsLdl, &challenge[0], &challengeSize); if (MediaKeyErrorStatus::OK != status) { RIALTO_SERVER_LOG_ERROR("Failed to get the challenge data, no onLicenseRequest will be generated"); @@ -204,7 +206,7 @@ MediaKeyErrorStatus MediaKeySession::updateSession(const std::vector &r initOcdmErrorChecking(); MediaKeyErrorStatus status; - if (isNetflixPlayreadyKeySystem()) + if (m_extendedInterfaceInUse) { status = m_ocdmSession->storeLicenseData(&responseData[0], responseData.size()); if (MediaKeyErrorStatus::OK != status) @@ -252,7 +254,7 @@ MediaKeyErrorStatus MediaKeySession::closeKeySession() initOcdmErrorChecking(); MediaKeyErrorStatus status; - if (isNetflixPlayreadyKeySystem()) + if (m_extendedInterfaceInUse) { if (MediaKeyErrorStatus::OK != m_ocdmSession->cancelChallengeData()) { @@ -334,6 +336,7 @@ MediaKeyErrorStatus MediaKeySession::setDrmHeader(const std::vector &re if (!m_isSessionConstructed) { RIALTO_SERVER_LOG_INFO("Session not yet constructed, queueing drm header to be set after construction"); + m_extendedInterfaceInUse = true; m_queuedDrmHeader = requestData; return MediaKeyErrorStatus::OK; } @@ -379,6 +382,7 @@ MediaKeyErrorStatus MediaKeySession::selectKeyId(const std::vector &key initOcdmErrorChecking(); + m_extendedInterfaceInUse = true; MediaKeyErrorStatus status = m_ocdmSession->selectKeyId(keyId.size(), keyId.data()); if (MediaKeyErrorStatus::OK == status) { @@ -394,11 +398,6 @@ MediaKeyErrorStatus MediaKeySession::selectKeyId(const std::vector &key return status; } -bool MediaKeySession::isNetflixPlayreadyKeySystem() const -{ - return m_kKeySystem.find("netflix") != std::string::npos; -} - void MediaKeySession::onProcessChallenge(const char url[], const uint8_t challenge[], const uint16_t challengeLength) { std::string urlStr = url; diff --git a/media/server/main/source/MediaKeysServerInternal.cpp b/media/server/main/source/MediaKeysServerInternal.cpp index d83e7063c..7e433b5f9 100644 --- a/media/server/main/source/MediaKeysServerInternal.cpp +++ b/media/server/main/source/MediaKeysServerInternal.cpp @@ -242,19 +242,21 @@ MediaKeyErrorStatus MediaKeysServerInternal::createKeySessionInternal(KeySession } MediaKeyErrorStatus MediaKeysServerInternal::generateRequest(int32_t keySessionId, InitDataType initDataType, - const std::vector &initData) + const std::vector &initData, + const LimitedDurationLicense &ldlState) { RIALTO_SERVER_LOG_DEBUG("entry:"); MediaKeyErrorStatus status; - auto task = [&]() { status = generateRequestInternal(keySessionId, initDataType, initData); }; + auto task = [&]() { status = generateRequestInternal(keySessionId, initDataType, initData, ldlState); }; m_mainThread->enqueueTaskAndWait(m_mainThreadClientId, task); return status; } MediaKeyErrorStatus MediaKeysServerInternal::generateRequestInternal(int32_t keySessionId, InitDataType initDataType, - const std::vector &initData) + const std::vector &initData, + const LimitedDurationLicense &ldlState) { auto sessionIter = m_mediaKeySessions.find(keySessionId); if (sessionIter == m_mediaKeySessions.end()) @@ -263,7 +265,7 @@ MediaKeyErrorStatus MediaKeysServerInternal::generateRequestInternal(int32_t key return MediaKeyErrorStatus::BAD_SESSION_ID; } - MediaKeyErrorStatus status = sessionIter->second->generateRequest(initDataType, initData); + MediaKeyErrorStatus status = sessionIter->second->generateRequest(initDataType, initData, ldlState); if (MediaKeyErrorStatus::OK != status) { RIALTO_SERVER_LOG_ERROR("Failed to generate request for the key session %d", keySessionId); @@ -598,12 +600,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/media/server/service/include/ICdmService.h b/media/server/service/include/ICdmService.h index 1b7c36a7c..d33d7b17b 100644 --- a/media/server/service/include/ICdmService.h +++ b/media/server/service/include/ICdmService.h @@ -51,7 +51,8 @@ class ICdmService const std::shared_ptr &client, int32_t &keySessionId) = 0; virtual MediaKeyErrorStatus generateRequest(int mediaKeysHandle, int32_t keySessionId, InitDataType initDataType, - const std::vector &initData) = 0; + const std::vector &initData, + const LimitedDurationLicense &ldlState) = 0; virtual MediaKeyErrorStatus loadSession(int mediaKeysHandle, int32_t keySessionId) = 0; virtual MediaKeyErrorStatus updateSession(int mediaKeysHandle, int32_t keySessionId, const std::vector &responseData) = 0; diff --git a/media/server/service/source/CdmService.cpp b/media/server/service/source/CdmService.cpp index b7fed322a..cdf6bc672 100644 --- a/media/server/service/source/CdmService.cpp +++ b/media/server/service/source/CdmService.cpp @@ -142,9 +142,7 @@ MediaKeyErrorStatus CdmService::createKeySession(int mediaKeysHandle, KeySession static_cast(removeKeySessionInternal(mediaKeysHandle, keySessionId)); return MediaKeyErrorStatus::FAIL; } - m_sessionInfo.emplace( - std::make_pair(keySessionId, - MediaKeySessionInfo{mediaKeysHandle, mediaKeysIter->second->isNetflixPlayreadyKeySystem()})); + m_sessionInfo.emplace(std::make_pair(keySessionId, MediaKeySessionInfo{mediaKeysHandle})); m_mediaKeysClients.emplace(std::make_pair(keySessionId, client)); } @@ -152,7 +150,8 @@ MediaKeyErrorStatus CdmService::createKeySession(int mediaKeysHandle, KeySession } MediaKeyErrorStatus CdmService::generateRequest(int mediaKeysHandle, int32_t keySessionId, InitDataType initDataType, - const std::vector &initData) + const std::vector &initData, + const LimitedDurationLicense &ldlState) { RIALTO_SERVER_LOG_DEBUG("CdmService requested to generate request: %d", mediaKeysHandle); @@ -163,7 +162,11 @@ MediaKeyErrorStatus CdmService::generateRequest(int mediaKeysHandle, int32_t key RIALTO_SERVER_LOG_ERROR("Media keys handle: %d does not exists", mediaKeysHandle); return MediaKeyErrorStatus::FAIL; } - return mediaKeysIter->second->generateRequest(keySessionId, initDataType, initData); + if (LimitedDurationLicense::NOT_SPECIFIED != ldlState) + { + m_sessionInfo[keySessionId].isExtendedInterfaceUsed = true; + } + return mediaKeysIter->second->generateRequest(keySessionId, initDataType, initData, ldlState); } MediaKeyErrorStatus CdmService::loadSession(int mediaKeysHandle, int32_t keySessionId) @@ -288,7 +291,7 @@ MediaKeyErrorStatus CdmService::setDrmHeader(int mediaKeysHandle, int32_t keySes RIALTO_SERVER_LOG_ERROR("Media keys handle: %d does not exists", mediaKeysHandle); return MediaKeyErrorStatus::FAIL; } - + m_sessionInfo[keySessionId].isExtendedInterfaceUsed = true; return mediaKeysIter->second->setDrmHeader(keySessionId, requestData); } @@ -503,7 +506,7 @@ MediaKeyErrorStatus CdmService::decrypt(int32_t keySessionId, GstBuffer *encrypt return m_mediaKeys[mediaKeysHandleIter->second.mediaKeysHandle]->decrypt(keySessionId, encrypted, caps); } -bool CdmService::isNetflixPlayreadyKeySystem(int32_t keySessionId) +bool CdmService::isExtendedInterfaceUsed(int32_t keySessionId) { RIALTO_SERVER_LOG_DEBUG("CdmService requested to check if key system is Netflix Playready, key session id: %d", keySessionId); @@ -515,7 +518,7 @@ bool CdmService::isNetflixPlayreadyKeySystem(int32_t keySessionId) RIALTO_SERVER_LOG_ERROR("Media keys handle for mksId: %d does not exists", keySessionId); return false; } - return mediaKeysHandleIter->second.isNetflixPlayready; + return mediaKeysHandleIter->second.isExtendedInterfaceUsed; } MediaKeyErrorStatus CdmService::selectKeyId(int32_t keySessionId, const std::vector &keyId) @@ -529,6 +532,7 @@ MediaKeyErrorStatus CdmService::selectKeyId(int32_t keySessionId, const std::vec RIALTO_SERVER_LOG_ERROR("Media keys handle for mksId: %d does not exists", keySessionId); return MediaKeyErrorStatus::FAIL; } + m_sessionInfo[keySessionId].isExtendedInterfaceUsed = true; return m_mediaKeys[mediaKeysHandleIter->second.mediaKeysHandle]->selectKeyId(keySessionId, keyId); } diff --git a/media/server/service/source/CdmService.h b/media/server/service/source/CdmService.h index 9c777800e..b97639685 100644 --- a/media/server/service/source/CdmService.h +++ b/media/server/service/source/CdmService.h @@ -37,7 +37,7 @@ class CdmService : public ICdmService, public IDecryptionService struct MediaKeySessionInfo { int mediaKeysHandle; - bool isNetflixPlayready{false}; + bool isExtendedInterfaceUsed{false}; uint32_t refCounter{0}; bool shouldBeClosed{false}; bool shouldBeReleased{false}; @@ -56,7 +56,8 @@ class CdmService : public ICdmService, public IDecryptionService MediaKeyErrorStatus createKeySession(int mediaKeysHandle, KeySessionType sessionType, const std::shared_ptr &client, int32_t &keySessionId) override; MediaKeyErrorStatus generateRequest(int mediaKeysHandle, int32_t keySessionId, InitDataType initDataType, - const std::vector &initData) override; + const std::vector &initData, + const LimitedDurationLicense &ldlState) override; MediaKeyErrorStatus loadSession(int mediaKeysHandle, int32_t keySessionId) override; MediaKeyErrorStatus updateSession(int mediaKeysHandle, int32_t keySessionId, const std::vector &responseData) override; @@ -82,7 +83,7 @@ class CdmService : public ICdmService, public IDecryptionService bool getSupportedKeySystemVersion(const std::string &keySystem, std::string &version) override; bool isServerCertificateSupported(const std::string &keySystem) override; MediaKeyErrorStatus decrypt(int32_t keySessionId, GstBuffer *encrypted, GstCaps *caps) override; - bool isNetflixPlayreadyKeySystem(int32_t keySessionId) override; + bool isExtendedInterfaceUsed(int32_t keySessionId) override; MediaKeyErrorStatus selectKeyId(int32_t keySessionId, const std::vector &keyId) override; void incrementSessionIdUsageCounter(int32_t keySessionId) override; void decrementSessionIdUsageCounter(int32_t keySessionId) override; diff --git a/proto/mediakeysmodule.proto b/proto/mediakeysmodule.proto index 0fa4905ad..dc66be2a7 100644 --- a/proto/mediakeysmodule.proto +++ b/proto/mediakeysmodule.proto @@ -215,11 +215,17 @@ message GenerateRequestRequest { DRMHEADER = 4; ///< The init data is in DrmHeader format. }; + enum LimitedDurationLicense { + NOT_SPECIFIED = 0; ///< The license duration is not specified + ENABLED = 1; ///< The license has a limited duration + DISABLED = 2; ///< The license does not have a limited duration + }; + optional int32 media_keys_handle = 1 [default = -1]; optional int32 key_session_id = 2 [default = -1]; optional InitDataType init_data_type = 3; repeated uint32 init_data = 4; - + optional LimitedDurationLicense ldl_state = 5 [default = NOT_SPECIFIED]; } message GenerateRequestResponse { optional ProtoMediaKeyErrorStatus error_status = 1 [default = FAIL]; diff --git a/tests/common/protoUtils/MediaKeysProtoUtils.h b/tests/common/protoUtils/MediaKeysProtoUtils.h index 56ca3e58d..5d8a94132 100644 --- a/tests/common/protoUtils/MediaKeysProtoUtils.h +++ b/tests/common/protoUtils/MediaKeysProtoUtils.h @@ -163,6 +163,21 @@ convertInitDataType(const firebolt::rialto::InitDataType &initDataType) } } +inline firebolt::rialto::GenerateRequestRequest_LimitedDurationLicense +convertLimitedDurationLicense(const firebolt::rialto::LimitedDurationLicense &ldlState) +{ + switch (ldlState) + { + case firebolt::rialto::LimitedDurationLicense::ENABLED: + return firebolt::rialto::GenerateRequestRequest_LimitedDurationLicense_ENABLED; + case firebolt::rialto::LimitedDurationLicense::DISABLED: + return firebolt::rialto::GenerateRequestRequest_LimitedDurationLicense_DISABLED; + case firebolt::rialto::LimitedDurationLicense::NOT_SPECIFIED: + default: + return firebolt::rialto::GenerateRequestRequest_LimitedDurationLicense_NOT_SPECIFIED; + } +} + inline firebolt::rialto::KeyStatus convertKeyStatus(const firebolt::rialto::KeyStatusesChangedEvent_KeyStatus &keyStatus) { switch (keyStatus) diff --git a/tests/unittests/media/client/main/mediaKeys/KeySessionTest.cpp b/tests/unittests/media/client/main/mediaKeys/KeySessionTest.cpp index 7b74c4a79..91f501c43 100644 --- a/tests/unittests/media/client/main/mediaKeys/KeySessionTest.cpp +++ b/tests/unittests/media/client/main/mediaKeys/KeySessionTest.cpp @@ -81,11 +81,12 @@ TEST_F(RialtoClientMediaKeysKeySessionTest, GenerateRequest) { InitDataType initDataType = InitDataType::KEY_IDS; std::vector initData{7, 8, 9}; + LimitedDurationLicense ldlState{LimitedDurationLicense::NOT_SPECIFIED}; - EXPECT_CALL(*m_mediaKeysIpcMock, generateRequest(m_kKeySessionId, initDataType, initData)) + EXPECT_CALL(*m_mediaKeysIpcMock, generateRequest(m_kKeySessionId, initDataType, initData, ldlState)) .WillOnce(Return(m_mediaKeyErrorStatus)); - EXPECT_EQ(m_mediaKeys->generateRequest(m_kKeySessionId, initDataType, initData), m_mediaKeyErrorStatus); + EXPECT_EQ(m_mediaKeys->generateRequest(m_kKeySessionId, initDataType, initData, ldlState), m_mediaKeyErrorStatus); } /** diff --git a/tests/unittests/media/interface/mocks/MediaKeysMock.h b/tests/unittests/media/interface/mocks/MediaKeysMock.h index 3f639a1fe..14d3a6171 100644 --- a/tests/unittests/media/interface/mocks/MediaKeysMock.h +++ b/tests/unittests/media/interface/mocks/MediaKeysMock.h @@ -39,7 +39,9 @@ class MediaKeysMock : public IMediaKeys MOCK_METHOD(MediaKeyErrorStatus, createKeySession, (KeySessionType sessionType, std::weak_ptr client, int32_t &keySessionId), (override)); MOCK_METHOD(MediaKeyErrorStatus, generateRequest, - (int32_t keySessionId, InitDataType initDataType, const std::vector &initData), (override)); + (int32_t keySessionId, InitDataType initDataType, const std::vector &initData, + const LimitedDurationLicense &ldlState), + (override)); MOCK_METHOD(MediaKeyErrorStatus, loadSession, (int32_t keySessionId), (override)); MOCK_METHOD(MediaKeyErrorStatus, updateSession, (int32_t keySessionId, const std::vector &responseData), (override)); diff --git a/tests/unittests/media/server/gstplayer/decryptor/DecryptTest.cpp b/tests/unittests/media/server/gstplayer/decryptor/DecryptTest.cpp index 42d82fc60..ec941d3f4 100644 --- a/tests/unittests/media/server/gstplayer/decryptor/DecryptTest.cpp +++ b/tests/unittests/media/server/gstplayer/decryptor/DecryptTest.cpp @@ -144,12 +144,12 @@ class RialtoServerDecryptorPrivateDecryptTest : public ::testing::Test void expectWidevineKeySystem() { - EXPECT_CALL(*m_decryptionServiceMock, isNetflixPlayreadyKeySystem(m_keySessionId)).WillOnce(Return(false)); + EXPECT_CALL(*m_decryptionServiceMock, isExtendedInterfaceUsed(m_keySessionId)).WillOnce(Return(false)); } void expectPlayreadyKeySystem() { - EXPECT_CALL(*m_decryptionServiceMock, isNetflixPlayreadyKeySystem(m_keySessionId)).WillOnce(Return(true)); + EXPECT_CALL(*m_decryptionServiceMock, isExtendedInterfaceUsed(m_keySessionId)).WillOnce(Return(true)); } void expectKeyMappingFailure() diff --git a/tests/unittests/media/server/ipc/mediaKeysModuleService/MediaKeysModuleServiceTestsFixture.cpp b/tests/unittests/media/server/ipc/mediaKeysModuleService/MediaKeysModuleServiceTestsFixture.cpp index 7ea133b52..e1b3dfd5b 100644 --- a/tests/unittests/media/server/ipc/mediaKeysModuleService/MediaKeysModuleServiceTestsFixture.cpp +++ b/tests/unittests/media/server/ipc/mediaKeysModuleService/MediaKeysModuleServiceTestsFixture.cpp @@ -49,6 +49,7 @@ const std::vector kDrmHeader{6, 3, 8}; const std::vector kLicenseRequestMessage{3, 2, 1}; const std::vector kLicenseRenewalMessage{0, 4, 8}; const std::string kUrl{"http://"}; +constexpr firebolt::rialto::LimitedDurationLicense kLdlState{firebolt::rialto::LimitedDurationLicense::NOT_SPECIFIED}; } // namespace MATCHER_P4(LicenseRequestEventMatcher, kKeySessionId, mediaKeysHandle, requestMessage, kUrl, "") @@ -156,14 +157,16 @@ void MediaKeysModuleServiceTests::cdmServiceWillFailToCreateKeySession() void MediaKeysModuleServiceTests::cdmServiceWillGenerateRequest() { expectRequestSuccess(); - EXPECT_CALL(m_cdmServiceMock, generateRequest(kHardcodedMediaKeysHandle, kKeySessionId, kInitDataType, kInitData)) + EXPECT_CALL(m_cdmServiceMock, + generateRequest(kHardcodedMediaKeysHandle, kKeySessionId, kInitDataType, kInitData, kLdlState)) .WillOnce(Return(firebolt::rialto::MediaKeyErrorStatus::OK)); } void MediaKeysModuleServiceTests::cdmServiceWillFailToGenerateRequest() { expectRequestSuccess(); - EXPECT_CALL(m_cdmServiceMock, generateRequest(kHardcodedMediaKeysHandle, kKeySessionId, kInitDataType, kInitData)) + EXPECT_CALL(m_cdmServiceMock, + generateRequest(kHardcodedMediaKeysHandle, kKeySessionId, kInitDataType, kInitData, kLdlState)) .WillOnce(Return(kErrorStatus)); } @@ -520,6 +523,7 @@ void MediaKeysModuleServiceTests::sendGenerateRequestRequestAndReceiveResponse() request.set_media_keys_handle(kHardcodedMediaKeysHandle); request.set_key_session_id(kKeySessionId); request.set_init_data_type(convertInitDataType(kInitDataType)); + request.set_ldl_state(convertLimitedDurationLicense(kLdlState)); for (auto it = kInitData.begin(); it != kInitData.end(); it++) { @@ -538,6 +542,7 @@ void MediaKeysModuleServiceTests::sendGenerateRequestRequestAndReceiveErrorRespo request.set_media_keys_handle(kHardcodedMediaKeysHandle); request.set_key_session_id(kKeySessionId); request.set_init_data_type(convertInitDataType(kInitDataType)); + request.set_ldl_state(convertLimitedDurationLicense(kLdlState)); for (auto it = kInitData.begin(); it != kInitData.end(); it++) { diff --git a/tests/unittests/media/server/main/CMakeLists.txt b/tests/unittests/media/server/main/CMakeLists.txt index 59d2ded8e..39943cbc4 100644 --- a/tests/unittests/media/server/main/CMakeLists.txt +++ b/tests/unittests/media/server/main/CMakeLists.txt @@ -68,7 +68,6 @@ add_gtests ( mediaKeys/GetDrmTimeTest.cpp mediaKeys/GetLastDrmErrorTest.cpp mediaKeys/SelectKeyIdTest.cpp - mediaKeys/IsNetflixPlayreadyKeySystemTest.cpp mediaKeys/PingTest.cpp mediaKeys/ReleaseKeySessionTest.cpp mediaKeys/GetMetricSystemDataTest.cpp @@ -91,7 +90,6 @@ add_gtests ( mediaKeySession/SetDrmHeaderTest.cpp mediaKeySession/GetLastDrmErrorTest.cpp mediaKeySession/SelectKeyIdTest.cpp - mediaKeySession/IsNetflixPlayreadyKeySystemTest.cpp sharedMemoryBuffer/SharedMemoryBufferTestsFixture.cpp sharedMemoryBuffer/SharedMemoryBufferTests.cpp diff --git a/tests/unittests/media/server/main/mediaKeySession/CloseKeySessionTest.cpp b/tests/unittests/media/server/main/mediaKeySession/CloseKeySessionTest.cpp index 8552b6741..569ee760e 100644 --- a/tests/unittests/media/server/main/mediaKeySession/CloseKeySessionTest.cpp +++ b/tests/unittests/media/server/main/mediaKeySession/CloseKeySessionTest.cpp @@ -31,11 +31,14 @@ class RialtoServerMediaKeySessionCloseKeySessionTest : public MediaKeySessionTes TEST_F(RialtoServerMediaKeySessionCloseKeySessionTest, SuccessNetflix) { createKeySession(kNetflixKeySystem); + generateRequestPlayready(); EXPECT_CALL(*m_ocdmSessionMock, cancelChallengeData()).WillOnce(Return(MediaKeyErrorStatus::OK)); EXPECT_CALL(*m_ocdmSessionMock, cleanDecryptContext()).WillOnce(Return(MediaKeyErrorStatus::OK)); EXPECT_EQ(MediaKeyErrorStatus::OK, m_mediaKeySession->closeKeySession()); + + EXPECT_CALL(*m_ocdmSessionMock, destructSession()).WillOnce(Return(MediaKeyErrorStatus::OK)); } /** @@ -56,11 +59,14 @@ TEST_F(RialtoServerMediaKeySessionCloseKeySessionTest, SuccessNoneNetflix) TEST_F(RialtoServerMediaKeySessionCloseKeySessionTest, OcdmSessionCancelChallengeDataFailure) { createKeySession(kNetflixKeySystem); + generateRequestPlayready(); EXPECT_CALL(*m_ocdmSessionMock, cancelChallengeData()).WillOnce(Return(MediaKeyErrorStatus::INVALID_STATE)); EXPECT_CALL(*m_ocdmSessionMock, cleanDecryptContext()).WillOnce(Return(MediaKeyErrorStatus::OK)); EXPECT_EQ(MediaKeyErrorStatus::OK, m_mediaKeySession->closeKeySession()); + + EXPECT_CALL(*m_ocdmSessionMock, destructSession()).WillOnce(Return(MediaKeyErrorStatus::OK)); } /** @@ -69,11 +75,14 @@ TEST_F(RialtoServerMediaKeySessionCloseKeySessionTest, OcdmSessionCancelChalleng TEST_F(RialtoServerMediaKeySessionCloseKeySessionTest, OcdmSessionCleanDecryptContextFailure) { createKeySession(kNetflixKeySystem); + generateRequestPlayready(); EXPECT_CALL(*m_ocdmSessionMock, cancelChallengeData()).WillOnce(Return(MediaKeyErrorStatus::OK)); EXPECT_CALL(*m_ocdmSessionMock, cleanDecryptContext()).WillOnce(Return(MediaKeyErrorStatus::NOT_SUPPORTED)); EXPECT_EQ(MediaKeyErrorStatus::OK, m_mediaKeySession->closeKeySession()); + + EXPECT_CALL(*m_ocdmSessionMock, destructSession()).WillOnce(Return(MediaKeyErrorStatus::OK)); } /** diff --git a/tests/unittests/media/server/main/mediaKeySession/GenerateRequestTest.cpp b/tests/unittests/media/server/main/mediaKeySession/GenerateRequestTest.cpp index 3502033cc..bcad8249c 100644 --- a/tests/unittests/media/server/main/mediaKeySession/GenerateRequestTest.cpp +++ b/tests/unittests/media/server/main/mediaKeySession/GenerateRequestTest.cpp @@ -39,7 +39,7 @@ TEST_F(RialtoServerMediaKeySessionGenerateRequestTest, SuccessNoneNetflix) constructSession(m_keySessionType, m_kInitDataType, &m_kInitData[0], m_kInitData.size())) .WillOnce(Return(MediaKeyErrorStatus::OK)); - EXPECT_EQ(MediaKeyErrorStatus::OK, m_mediaKeySession->generateRequest(m_kInitDataType, m_kInitData)); + EXPECT_EQ(MediaKeyErrorStatus::OK, m_mediaKeySession->generateRequest(m_kInitDataType, m_kInitData, m_kLdlState)); // Close ocdm before destroying expectCloseKeySession(kWidevineKeySystem); @@ -72,7 +72,9 @@ TEST_F(RialtoServerMediaKeySessionGenerateRequestTest, FailNetflixWhenChallengeD EXPECT_CALL(*m_ocdmSessionMock, getChallengeData(m_isLDL, nullptrMatcher(), _)) .WillOnce(Return(MediaKeyErrorStatus::OK)); - EXPECT_EQ(MediaKeyErrorStatus::OK, m_mediaKeySession->generateRequest(m_kInitDataType, m_kInitData)); + EXPECT_EQ(MediaKeyErrorStatus::OK, + m_mediaKeySession->generateRequest(m_kInitDataType, m_kInitData, + firebolt::rialto::LimitedDurationLicense::DISABLED)); // Close ocdm before destroying expectCloseKeySession(kNetflixKeySystem); @@ -94,7 +96,9 @@ TEST_F(RialtoServerMediaKeySessionGenerateRequestTest, FailNetflixWhenGettingCha EXPECT_CALL(*m_ocdmSessionMock, getChallengeData(m_isLDL, notNullptrMatcher(), _)) .WillOnce(DoAll(memcpyChallenge(m_kChallenge), Return(MediaKeyErrorStatus::FAIL))); - EXPECT_EQ(MediaKeyErrorStatus::OK, m_mediaKeySession->generateRequest(m_kInitDataType, m_kInitData)); + EXPECT_EQ(MediaKeyErrorStatus::OK, + m_mediaKeySession->generateRequest(m_kInitDataType, m_kInitData, + firebolt::rialto::LimitedDurationLicense::DISABLED)); // Close ocdm before destroying expectCloseKeySession(kNetflixKeySystem); @@ -110,10 +114,10 @@ TEST_F(RialtoServerMediaKeySessionGenerateRequestTest, SessionAlreadyConstructed EXPECT_CALL(*m_ocdmSessionMock, constructSession(m_keySessionType, m_kInitDataType, &m_kInitData[0], m_kInitData.size())) .WillOnce(Return(MediaKeyErrorStatus::OK)); - EXPECT_EQ(MediaKeyErrorStatus::OK, m_mediaKeySession->generateRequest(m_kInitDataType, m_kInitData)); + EXPECT_EQ(MediaKeyErrorStatus::OK, m_mediaKeySession->generateRequest(m_kInitDataType, m_kInitData, m_kLdlState)); // Generate request again should just return OK - EXPECT_EQ(MediaKeyErrorStatus::OK, m_mediaKeySession->generateRequest(m_kInitDataType, m_kInitData)); + EXPECT_EQ(MediaKeyErrorStatus::OK, m_mediaKeySession->generateRequest(m_kInitDataType, m_kInitData, m_kLdlState)); // OcdmSession will be closed on destruction expectCloseKeySession(kWidevineKeySystem); @@ -128,7 +132,8 @@ TEST_F(RialtoServerMediaKeySessionGenerateRequestTest, OcdmSessionFailure) EXPECT_CALL(*m_ocdmSessionMock, constructSession(m_keySessionType, m_kInitDataType, &m_kInitData[0], m_kInitData.size())) .WillOnce(Return(MediaKeyErrorStatus::NOT_SUPPORTED)); - EXPECT_EQ(MediaKeyErrorStatus::NOT_SUPPORTED, m_mediaKeySession->generateRequest(m_kInitDataType, m_kInitData)); + EXPECT_EQ(MediaKeyErrorStatus::NOT_SUPPORTED, + m_mediaKeySession->generateRequest(m_kInitDataType, m_kInitData, m_kLdlState)); } /** @@ -146,7 +151,7 @@ TEST_F(RialtoServerMediaKeySessionGenerateRequestTest, OnErrorFailure) return MediaKeyErrorStatus::OK; })); - EXPECT_EQ(MediaKeyErrorStatus::FAIL, m_mediaKeySession->generateRequest(m_kInitDataType, m_kInitData)); + EXPECT_EQ(MediaKeyErrorStatus::FAIL, m_mediaKeySession->generateRequest(m_kInitDataType, m_kInitData, m_kLdlState)); // OcdmSession will be closed on destruction expectCloseKeySession(kWidevineKeySystem); diff --git a/tests/unittests/media/server/main/mediaKeySession/IsNetflixPlayreadyKeySystemTest.cpp b/tests/unittests/media/server/main/mediaKeySession/IsNetflixPlayreadyKeySystemTest.cpp deleted file mode 100644 index 989a4ea2a..000000000 --- a/tests/unittests/media/server/main/mediaKeySession/IsNetflixPlayreadyKeySystemTest.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/* - * If not stated otherwise in this file or this component's LICENSE file the - * following copyright and licenses apply: - * - * Copyright 2023 Sky UK - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "MediaKeySessionTestBase.h" - -class RialtoServerMediaKeySessionIsNetflixPlayreadyKeySystemTest : public MediaKeySessionTestBase -{ -protected: - ~RialtoServerMediaKeySessionIsNetflixPlayreadyKeySystemTest() { destroyKeySession(); } -}; - -/** - * Test that isNetflixPlayreadyKeySystem returns false for microsoft playready key system - */ -TEST_F(RialtoServerMediaKeySessionIsNetflixPlayreadyKeySystemTest, ReturnFalseForMsPlayready) -{ - createKeySession(kPlayreadyKeySystem); - - EXPECT_FALSE(m_mediaKeySession->isNetflixPlayreadyKeySystem()); -} - -/** - * Test that isNetflixPlayreadyKeySystem returns true for netflix key system - */ -TEST_F(RialtoServerMediaKeySessionIsNetflixPlayreadyKeySystemTest, ReturnTrueForNetflix) -{ - createKeySession(kNetflixKeySystem); - - EXPECT_TRUE(m_mediaKeySession->isNetflixPlayreadyKeySystem()); -} - -/** - * Test that isNetflixPlayreadyKeySystem returns false for widevine key system - */ -TEST_F(RialtoServerMediaKeySessionIsNetflixPlayreadyKeySystemTest, ReturnFalseForWidevine) -{ - createKeySession(kWidevineKeySystem); - - EXPECT_FALSE(m_mediaKeySession->isNetflixPlayreadyKeySystem()); -} diff --git a/tests/unittests/media/server/main/mediaKeySession/UpdateSessionTest.cpp b/tests/unittests/media/server/main/mediaKeySession/UpdateSessionTest.cpp index d6ae82c0e..7c826a14f 100644 --- a/tests/unittests/media/server/main/mediaKeySession/UpdateSessionTest.cpp +++ b/tests/unittests/media/server/main/mediaKeySession/UpdateSessionTest.cpp @@ -33,11 +33,15 @@ class RialtoServerMediaKeySessionUpdateSessionTest : public MediaKeySessionTestB TEST_F(RialtoServerMediaKeySessionUpdateSessionTest, SuccessNetflix) { createKeySession(kNetflixKeySystem); + generateRequestPlayready(); EXPECT_CALL(*m_ocdmSessionMock, storeLicenseData(&m_kResponseData[0], m_kResponseData.size())) .WillOnce(Return(MediaKeyErrorStatus::OK)); EXPECT_EQ(MediaKeyErrorStatus::OK, m_mediaKeySession->updateSession(m_kResponseData)); + + // Close ocdm before destroying + expectCloseKeySession(kNetflixKeySystem); } /** @@ -59,11 +63,15 @@ TEST_F(RialtoServerMediaKeySessionUpdateSessionTest, SuccessNoneNetflix) TEST_F(RialtoServerMediaKeySessionUpdateSessionTest, OcdmSessionStoreLicenseDataFailure) { createKeySession(kNetflixKeySystem); + generateRequestPlayready(); EXPECT_CALL(*m_ocdmSessionMock, storeLicenseData(&m_kResponseData[0], m_kResponseData.size())) .WillOnce(Return(MediaKeyErrorStatus::INVALID_STATE)); EXPECT_EQ(MediaKeyErrorStatus::INVALID_STATE, m_mediaKeySession->updateSession(m_kResponseData)); + + // Close ocdm before destroying + expectCloseKeySession(kNetflixKeySystem); } /** diff --git a/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp b/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp index 26a68c860..70757b103 100644 --- a/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp +++ b/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp @@ -74,7 +74,7 @@ void MediaKeySessionTestBase::generateRequest() EXPECT_CALL(*m_ocdmSessionMock, constructSession(m_keySessionType, m_initDataType, &m_initData[0], m_initData.size())) .WillOnce(Return(MediaKeyErrorStatus::OK)); - EXPECT_EQ(MediaKeyErrorStatus::OK, m_mediaKeySession->generateRequest(m_initDataType, m_initData)); + EXPECT_EQ(MediaKeyErrorStatus::OK, m_mediaKeySession->generateRequest(m_initDataType, m_initData, m_kLdlState)); } void MediaKeySessionTestBase::generateRequestPlayready() @@ -90,7 +90,9 @@ void MediaKeySessionTestBase::generateRequestPlayready() mainThreadWillEnqueueTask(); EXPECT_CALL(*m_mediaKeysClientMock, onLicenseRequest(m_kKeySessionId, m_kChallenge, _)); - EXPECT_EQ(MediaKeyErrorStatus::OK, m_mediaKeySession->generateRequest(m_kInitDataType, m_kInitData)); + EXPECT_EQ(MediaKeyErrorStatus::OK, + m_mediaKeySession->generateRequest(m_kInitDataType, m_kInitData, + firebolt::rialto::LimitedDurationLicense::DISABLED)); } void MediaKeySessionTestBase::mainThreadWillEnqueueTask() diff --git a/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.h b/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.h index c27da3175..b8df674cf 100644 --- a/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.h +++ b/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.h @@ -86,6 +86,7 @@ class MediaKeySessionTestBase : public ::testing::Test const InitDataType m_kInitDataType{InitDataType::CENC}; const std::vector m_kInitData{1, 2, 3}; const std::vector m_kChallenge{'d', 'e', 'f'}; + const LimitedDurationLicense m_kLdlState{LimitedDurationLicense::NOT_SPECIFIED}; void createKeySession(const std::string &keySystem); void destroyKeySession(); diff --git a/tests/unittests/media/server/main/mediaKeys/GenerateRequestTest.cpp b/tests/unittests/media/server/main/mediaKeys/GenerateRequestTest.cpp index d69ac3cf8..50becd378 100644 --- a/tests/unittests/media/server/main/mediaKeys/GenerateRequestTest.cpp +++ b/tests/unittests/media/server/main/mediaKeys/GenerateRequestTest.cpp @@ -24,6 +24,7 @@ class RialtoServerMediaKeysGenerateRequestTest : public MediaKeysTestBase protected: InitDataType m_initDataType = InitDataType::CENC; std::vector m_initData{1, 2, 3}; + LimitedDurationLicense m_ldlState{LimitedDurationLicense::NOT_SPECIFIED}; RialtoServerMediaKeysGenerateRequestTest() { @@ -39,10 +40,11 @@ class RialtoServerMediaKeysGenerateRequestTest : public MediaKeysTestBase TEST_F(RialtoServerMediaKeysGenerateRequestTest, Success) { mainThreadWillEnqueueTaskAndWait(); - EXPECT_CALL(*m_mediaKeySessionMock, generateRequest(m_initDataType, m_initData)) + EXPECT_CALL(*m_mediaKeySessionMock, generateRequest(m_initDataType, m_initData, m_ldlState)) .WillOnce(Return(MediaKeyErrorStatus::OK)); - EXPECT_EQ(MediaKeyErrorStatus::OK, m_mediaKeys->generateRequest(m_kKeySessionId, m_initDataType, m_initData)); + EXPECT_EQ(MediaKeyErrorStatus::OK, + m_mediaKeys->generateRequest(m_kKeySessionId, m_initDataType, m_initData, m_ldlState)); } /** @@ -52,7 +54,7 @@ TEST_F(RialtoServerMediaKeysGenerateRequestTest, SessionDoesNotExistFailure) { mainThreadWillEnqueueTaskAndWait(); EXPECT_EQ(MediaKeyErrorStatus::BAD_SESSION_ID, - m_mediaKeys->generateRequest(m_kKeySessionId + 1, m_initDataType, m_initData)); + m_mediaKeys->generateRequest(m_kKeySessionId + 1, m_initDataType, m_initData, m_ldlState)); } /** @@ -61,9 +63,9 @@ TEST_F(RialtoServerMediaKeysGenerateRequestTest, SessionDoesNotExistFailure) TEST_F(RialtoServerMediaKeysGenerateRequestTest, SessionFailure) { mainThreadWillEnqueueTaskAndWait(); - EXPECT_CALL(*m_mediaKeySessionMock, generateRequest(m_initDataType, m_initData)) + EXPECT_CALL(*m_mediaKeySessionMock, generateRequest(m_initDataType, m_initData, m_ldlState)) .WillOnce(Return(MediaKeyErrorStatus::NOT_SUPPORTED)); EXPECT_EQ(MediaKeyErrorStatus::NOT_SUPPORTED, - m_mediaKeys->generateRequest(m_kKeySessionId, m_initDataType, m_initData)); + m_mediaKeys->generateRequest(m_kKeySessionId, m_initDataType, m_initData, m_ldlState)); } diff --git a/tests/unittests/media/server/main/mediaKeys/IsNetflixPlayreadyKeySystemTest.cpp b/tests/unittests/media/server/main/mediaKeys/IsNetflixPlayreadyKeySystemTest.cpp deleted file mode 100644 index f9d1fcbad..000000000 --- a/tests/unittests/media/server/main/mediaKeys/IsNetflixPlayreadyKeySystemTest.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/* - * If not stated otherwise in this file or this component's LICENSE file the - * following copyright and licenses apply: - * - * Copyright 2022 Sky UK - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "MediaKeysTestBase.h" - -class RialtoServerMediaKeysIsNetflixPlayreadyKeySystemTest : public MediaKeysTestBase -{ -protected: - RialtoServerMediaKeysIsNetflixPlayreadyKeySystemTest() = default; - ~RialtoServerMediaKeysIsNetflixPlayreadyKeySystemTest() { destroyMediaKeys(); } -}; - -/** - * Test that isNetflixPlayreadyKeySystem returns true. - */ -TEST_F(RialtoServerMediaKeysIsNetflixPlayreadyKeySystemTest, ReturnTrue) -{ - createMediaKeys(kNetflixKeySystem); - EXPECT_TRUE(m_mediaKeys->isNetflixPlayreadyKeySystem()); -} - -/** - * Test that isNetflixPlayreadyKeySystem returns false - */ -TEST_F(RialtoServerMediaKeysIsNetflixPlayreadyKeySystemTest, ReturnFalse) -{ - createMediaKeys(kWidevineKeySystem); - EXPECT_FALSE(m_mediaKeys->isNetflixPlayreadyKeySystem()); -} diff --git a/tests/unittests/media/server/mocks/main/DecryptionServiceMock.h b/tests/unittests/media/server/mocks/main/DecryptionServiceMock.h index 64f57c40c..c6a600510 100644 --- a/tests/unittests/media/server/mocks/main/DecryptionServiceMock.h +++ b/tests/unittests/media/server/mocks/main/DecryptionServiceMock.h @@ -30,7 +30,7 @@ class DecryptionServiceMock : public IDecryptionService { public: MOCK_METHOD(MediaKeyErrorStatus, decrypt, (int32_t keySessionId, GstBuffer *encrypted, GstCaps *caps), (override)); - MOCK_METHOD(bool, isNetflixPlayreadyKeySystem, (int32_t keySessionId), (override)); + MOCK_METHOD(bool, isExtendedInterfaceUsed, (int32_t keySessionId), (override)); MOCK_METHOD(MediaKeyErrorStatus, selectKeyId, (int32_t keySessionId, const std::vector &keyId), (override)); MOCK_METHOD(void, incrementSessionIdUsageCounter, (int32_t keySessionId), (override)); MOCK_METHOD(void, decrementSessionIdUsageCounter, (int32_t keySessionId), (override)); diff --git a/tests/unittests/media/server/mocks/main/MediaKeySessionMock.h b/tests/unittests/media/server/mocks/main/MediaKeySessionMock.h index b813d80eb..8bbdc8284 100644 --- a/tests/unittests/media/server/mocks/main/MediaKeySessionMock.h +++ b/tests/unittests/media/server/mocks/main/MediaKeySessionMock.h @@ -30,7 +30,8 @@ namespace firebolt::rialto::server class MediaKeySessionMock : public IMediaKeySession { public: - MOCK_METHOD(MediaKeyErrorStatus, generateRequest, (InitDataType initDataType, const std::vector &initData), + MOCK_METHOD(MediaKeyErrorStatus, generateRequest, + (InitDataType initDataType, const std::vector &initData, const LimitedDurationLicense &ldlState), (override)); MOCK_METHOD(MediaKeyErrorStatus, loadSession, (), (override)); MOCK_METHOD(MediaKeyErrorStatus, updateSession, (const std::vector &responseData), (override)); @@ -42,7 +43,6 @@ class MediaKeySessionMock : public IMediaKeySession MOCK_METHOD(MediaKeyErrorStatus, setDrmHeader, (const std::vector &requestData), (override)); MOCK_METHOD(MediaKeyErrorStatus, getLastDrmError, (uint32_t & errorCode), (override)); MOCK_METHOD(MediaKeyErrorStatus, selectKeyId, (const std::vector &keyId), (override)); - MOCK_METHOD(bool, isNetflixPlayreadyKeySystem, (), (const, override)); }; } // namespace firebolt::rialto::server diff --git a/tests/unittests/media/server/mocks/main/MediaKeysServerInternalMock.h b/tests/unittests/media/server/mocks/main/MediaKeysServerInternalMock.h index 1d84c540b..4ee5df08f 100644 --- a/tests/unittests/media/server/mocks/main/MediaKeysServerInternalMock.h +++ b/tests/unittests/media/server/mocks/main/MediaKeysServerInternalMock.h @@ -39,7 +39,9 @@ class MediaKeysServerInternalMock : public IMediaKeysServerInternal MOCK_METHOD(MediaKeyErrorStatus, createKeySession, (KeySessionType sessionType, std::weak_ptr client, int32_t &keySessionId), (override)); MOCK_METHOD(MediaKeyErrorStatus, generateRequest, - (int32_t keySessionId, InitDataType initDataType, const std::vector &initData), (override)); + (int32_t keySessionId, InitDataType initDataType, const std::vector &initData, + const LimitedDurationLicense &ldlState), + (override)); MOCK_METHOD(MediaKeyErrorStatus, loadSession, (int32_t keySessionId), (override)); MOCK_METHOD(MediaKeyErrorStatus, updateSession, (int32_t keySessionId, const std::vector &responseData), (override)); @@ -57,7 +59,6 @@ class MediaKeysServerInternalMock : public IMediaKeysServerInternal MOCK_METHOD(MediaKeyErrorStatus, getCdmKeySessionId, (int32_t keySessionId, std::string &cdmKeySessionId), (override)); MOCK_METHOD(MediaKeyErrorStatus, decrypt, (int32_t keySessionId, GstBuffer *encrypted, GstCaps *caps), (override)); - MOCK_METHOD(bool, isNetflixPlayreadyKeySystem, (), (const, override)); MOCK_METHOD(void, ping, (std::unique_ptr && heartbeatHandler), (override)); MOCK_METHOD(MediaKeyErrorStatus, releaseKeySession, (int32_t keySessionId), (override)); MOCK_METHOD(MediaKeyErrorStatus, getMetricSystemData, (std::vector & buffer), (override)); diff --git a/tests/unittests/media/server/mocks/service/CdmServiceMock.h b/tests/unittests/media/server/mocks/service/CdmServiceMock.h index cc16e75b7..9196ff498 100644 --- a/tests/unittests/media/server/mocks/service/CdmServiceMock.h +++ b/tests/unittests/media/server/mocks/service/CdmServiceMock.h @@ -41,7 +41,7 @@ class CdmServiceMock : public ICdmService (override)); MOCK_METHOD(MediaKeyErrorStatus, generateRequest, (int mediaKeysHandle, int32_t keySessionId, InitDataType initDataType, - const std::vector &initData), + const std::vector &initData, const LimitedDurationLicense &ldlState), (override)); MOCK_METHOD(MediaKeyErrorStatus, loadSession, (int mediaKeysHandle, int32_t keySessionId), (override)); MOCK_METHOD(MediaKeyErrorStatus, updateSession, diff --git a/tests/unittests/media/server/service/cdmService/CdmServiceTests.cpp b/tests/unittests/media/server/service/cdmService/CdmServiceTests.cpp index 2c27cac62..dca969496 100644 --- a/tests/unittests/media/server/service/cdmService/CdmServiceTests.cpp +++ b/tests/unittests/media/server/service/cdmService/CdmServiceTests.cpp @@ -81,7 +81,6 @@ TEST_F(CdmServiceTests, shouldCreateKeySession) triggerSwitchToActiveSuccess(); mediaKeysFactoryWillCreateMediaKeys(); createMediaKeysShouldSucceed(); - mediaKeysWillCheckIfKeySystemIsPlayready(false); mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); createKeySessionShouldSucceed(); destroyMediaKeysShouldSucceed(); @@ -108,7 +107,6 @@ TEST_F(CdmServiceTests, shouldFailToCreateKeySessionWhenMediaKeysClientExists) triggerSwitchToActiveSuccess(); mediaKeysFactoryWillCreateMediaKeys(); createMediaKeysShouldSucceed(); - mediaKeysWillCheckIfKeySystemIsPlayready(false); mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); createKeySessionShouldSucceed(); mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); @@ -123,6 +121,18 @@ TEST_F(CdmServiceTests, shouldGenerateRequest) createMediaKeysShouldSucceed(); mediaKeysWillGenerateRequestWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); generateRequestShouldReturnStatus(firebolt::rialto::MediaKeyErrorStatus::OK); + isExtendedInterfaceUsedShouldReturn(false); + destroyMediaKeysShouldSucceed(); +} + +TEST_F(CdmServiceTests, shouldGenerateRequestWithLdlEnabled) +{ + triggerSwitchToActiveSuccess(); + mediaKeysFactoryWillCreateMediaKeys(); + createMediaKeysShouldSucceed(); + mediaKeysWillGenerateRequestLdlEnabledWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); + generateRequestWithLdlEnabledShouldReturnStatus(firebolt::rialto::MediaKeyErrorStatus::OK); + isExtendedInterfaceUsedShouldReturn(true); destroyMediaKeysShouldSucceed(); } @@ -199,7 +209,6 @@ TEST_F(CdmServiceTests, shouldCloseKeySession) triggerSwitchToActiveSuccess(); mediaKeysFactoryWillCreateMediaKeys(); createMediaKeysShouldSucceed(); - mediaKeysWillCheckIfKeySystemIsPlayready(false); mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); createKeySessionShouldSucceed(); mediaKeysWillCloseKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); @@ -212,7 +221,6 @@ TEST_F(CdmServiceTests, incrementSessionUsage) triggerSwitchToActiveSuccess(); mediaKeysFactoryWillCreateMediaKeys(); createMediaKeysShouldSucceed(); - mediaKeysWillCheckIfKeySystemIsPlayready(false); mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); createKeySessionShouldSucceed(); incrementSessionIdUsageCounter(); @@ -224,7 +232,6 @@ TEST_F(CdmServiceTests, deccrementSessionUsage) triggerSwitchToActiveSuccess(); mediaKeysFactoryWillCreateMediaKeys(); createMediaKeysShouldSucceed(); - mediaKeysWillCheckIfKeySystemIsPlayready(false); mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); createKeySessionShouldSucceed(); decrementSessionIdUsageCounter(); @@ -260,7 +267,6 @@ TEST_F(CdmServiceTests, shouldFailToCloseKeySessionWhenMediaKeysFails) triggerSwitchToActiveSuccess(); mediaKeysFactoryWillCreateMediaKeys(); createMediaKeysShouldSucceed(); - mediaKeysWillCheckIfKeySystemIsPlayready(false); mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); createKeySessionShouldSucceed(); mediaKeysWillCloseKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::INVALID_STATE); @@ -273,7 +279,6 @@ TEST_F(CdmServiceTests, shouldCloseKeySessionDeferred) triggerSwitchToActiveSuccess(); mediaKeysFactoryWillCreateMediaKeys(); createMediaKeysShouldSucceed(); - mediaKeysWillCheckIfKeySystemIsPlayready(false); mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); createKeySessionShouldSucceed(); incrementSessionIdUsageCounter(); @@ -288,7 +293,6 @@ TEST_F(CdmServiceTests, shouldCloseKeySessionDeferredWithFailurePrint) triggerSwitchToActiveSuccess(); mediaKeysFactoryWillCreateMediaKeys(); createMediaKeysShouldSucceed(); - mediaKeysWillCheckIfKeySystemIsPlayready(false); mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); createKeySessionShouldSucceed(); incrementSessionIdUsageCounter(); @@ -355,7 +359,6 @@ TEST_F(CdmServiceTests, shouldDecrypt) triggerSwitchToActiveSuccess(); mediaKeysFactoryWillCreateMediaKeys(); createMediaKeysShouldSucceed(); - mediaKeysWillCheckIfKeySystemIsPlayready(false); mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); createKeySessionShouldSucceed(); mediaKeysWillDecryptWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); @@ -374,7 +377,6 @@ TEST_F(CdmServiceTests, shouldFailToDecryptWhenMediaKeysFails) triggerSwitchToActiveSuccess(); mediaKeysFactoryWillCreateMediaKeys(); createMediaKeysShouldSucceed(); - mediaKeysWillCheckIfKeySystemIsPlayready(false); mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); createKeySessionShouldSucceed(); mediaKeysWillDecryptWithStatus(firebolt::rialto::MediaKeyErrorStatus::INVALID_STATE); @@ -396,11 +398,11 @@ TEST_F(CdmServiceTests, shouldSelectKeyId) triggerSwitchToActiveSuccess(); mediaKeysFactoryWillCreateMediaKeys(); createMediaKeysShouldSucceed(); - mediaKeysWillCheckIfKeySystemIsPlayready(false); mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); createKeySessionShouldSucceed(); mediaKeysWillSelectKeyIdWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); selectKeyIdShouldReturnStatus(firebolt::rialto::MediaKeyErrorStatus::OK); + isExtendedInterfaceUsedShouldReturn(true); destroyMediaKeysShouldSucceed(); } @@ -415,7 +417,6 @@ TEST_F(CdmServiceTests, shouldFailToSelectKeyIdWhenMediaKeysFails) triggerSwitchToActiveSuccess(); mediaKeysFactoryWillCreateMediaKeys(); createMediaKeysShouldSucceed(); - mediaKeysWillCheckIfKeySystemIsPlayready(false); mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); createKeySessionShouldSucceed(); mediaKeysWillSelectKeyIdWithStatus(firebolt::rialto::MediaKeyErrorStatus::INVALID_STATE); @@ -465,6 +466,7 @@ TEST_F(CdmServiceTests, shouldSetDrmHeader) createMediaKeysShouldSucceed(); mediaKeysWillSetDrmHeaderWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); setDrmHeaderShouldReturnStatus(firebolt::rialto::MediaKeyErrorStatus::OK); + isExtendedInterfaceUsedShouldReturn(true); destroyMediaKeysShouldSucceed(); } @@ -671,7 +673,6 @@ TEST_F(CdmServiceTests, shouldReleaseKeySession) triggerSwitchToActiveSuccess(); mediaKeysFactoryWillCreateMediaKeys(); createMediaKeysShouldSucceed(); - mediaKeysWillCheckIfKeySystemIsPlayready(false); mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); createKeySessionShouldSucceed(); mediaKeysWillReleaseKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); @@ -684,7 +685,6 @@ TEST_F(CdmServiceTests, shouldReleaseKeySessionDeferred) triggerSwitchToActiveSuccess(); mediaKeysFactoryWillCreateMediaKeys(); createMediaKeysShouldSucceed(); - mediaKeysWillCheckIfKeySystemIsPlayready(false); mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); createKeySessionShouldSucceed(); incrementSessionIdUsageCounter(); @@ -705,7 +705,6 @@ TEST_F(CdmServiceTests, shouldFailToReleaseKeySessionWhenMediaKeysFails) triggerSwitchToActiveSuccess(); mediaKeysFactoryWillCreateMediaKeys(); createMediaKeysShouldSucceed(); - mediaKeysWillCheckIfKeySystemIsPlayready(false); mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); createKeySessionShouldSucceed(); mediaKeysWillReleaseKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::INVALID_STATE); @@ -801,42 +800,29 @@ TEST_F(CdmServiceTests, shouldGetServerCertificateSupportedIfSupportedInActiveSt supportsServerCertificateReturnTrue(); } -TEST_F(CdmServiceTests, shouldCheckThatKeySystemIsPlayready) -{ - triggerSwitchToActiveSuccess(); - mediaKeysFactoryWillCreateMediaKeys(); - createMediaKeysShouldSucceed(); - mediaKeysWillCheckIfKeySystemIsPlayready(true); - mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); - createKeySessionShouldSucceed(); - isNetflixPlayreadyKeySystemShouldReturn(true); - destroyMediaKeysShouldSucceed(); -} - -TEST_F(CdmServiceTests, shouldReturnFalseWhenCheckingPlayreadyKeySystemWhenNoMediaKeys) +TEST_F(CdmServiceTests, shouldReturnFalseWhenCheckingExtendedInterfaceWhenNoMediaKeys) { triggerSwitchToActiveSuccess(); - isNetflixPlayreadyKeySystemShouldReturn(false); + isExtendedInterfaceUsedShouldReturn(false); } -TEST_F(CdmServiceTests, shouldReturnFalseWhenCheckingPlayreadyKeySystemWhenMediaKeysFails) +TEST_F(CdmServiceTests, shouldReturnFalseWhenCheckingExtendedInterfaceWhenMediaKeysFails) { triggerSwitchToActiveSuccess(); mediaKeysFactoryWillCreateMediaKeys(); createMediaKeysShouldSucceed(); - mediaKeysWillCheckIfKeySystemIsPlayready(false); mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); createKeySessionShouldSucceed(); - isNetflixPlayreadyKeySystemShouldReturn(false); + isExtendedInterfaceUsedShouldReturn(false); destroyMediaKeysShouldSucceed(); } -TEST_F(CdmServiceTests, shouldReturnFalseWhenCheckingPlayreadyKeySystemWhenMediaKeysIsNotFoundForSession) +TEST_F(CdmServiceTests, shouldReturnFalseWhenCheckingExtendedInterfaceWhenMediaKeysIsNotFoundForSession) { triggerSwitchToActiveSuccess(); mediaKeysFactoryWillCreateMediaKeys(); createMediaKeysShouldSucceed(); - isNetflixPlayreadyKeySystemShouldReturn(false); + isExtendedInterfaceUsedShouldReturn(false); destroyMediaKeysShouldSucceed(); } diff --git a/tests/unittests/media/server/service/cdmService/CdmServiceTestsFixture.cpp b/tests/unittests/media/server/service/cdmService/CdmServiceTestsFixture.cpp index 92c4a2798..6243ec01d 100644 --- a/tests/unittests/media/server/service/cdmService/CdmServiceTestsFixture.cpp +++ b/tests/unittests/media/server/service/cdmService/CdmServiceTestsFixture.cpp @@ -43,6 +43,8 @@ const std::vector keyId{1, 4, 7}; const std::vector kDrmHeader{4, 9, 3}; const uint32_t kSubSampleCount{2}; constexpr uint32_t kInitWithLast15{1}; +constexpr firebolt::rialto::LimitedDurationLicense kLdlState{firebolt::rialto::LimitedDurationLicense::NOT_SPECIFIED}; +constexpr firebolt::rialto::LimitedDurationLicense kLdlStateEnabled{firebolt::rialto::LimitedDurationLicense::ENABLED}; } // namespace CdmServiceTests::CdmServiceTests() @@ -131,7 +133,14 @@ void CdmServiceTests::mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto:: void CdmServiceTests::mediaKeysWillGenerateRequestWithStatus(firebolt::rialto::MediaKeyErrorStatus status) { - EXPECT_CALL(m_mediaKeysMock, generateRequest(kKeySessionId, kInitDataType, kInitData)).WillOnce(Return(status)); + EXPECT_CALL(m_mediaKeysMock, generateRequest(kKeySessionId, kInitDataType, kInitData, kLdlState)) + .WillOnce(Return(status)); +} + +void CdmServiceTests::mediaKeysWillGenerateRequestLdlEnabledWithStatus(firebolt::rialto::MediaKeyErrorStatus status) +{ + EXPECT_CALL(m_mediaKeysMock, generateRequest(kKeySessionId, kInitDataType, kInitData, kLdlStateEnabled)) + .WillOnce(Return(status)); } void CdmServiceTests::mediaKeysWillLoadSessionWithStatus(firebolt::rialto::MediaKeyErrorStatus status) @@ -219,11 +228,6 @@ void CdmServiceTests::mediaKeysWillSelectKeyIdWithStatus(firebolt::rialto::Media EXPECT_CALL(m_mediaKeysMock, selectKeyId(kKeySessionId, keyId)).WillOnce(Return(status)); } -void CdmServiceTests::mediaKeysWillCheckIfKeySystemIsPlayready(bool result) -{ - EXPECT_CALL(m_mediaKeysMock, isNetflixPlayreadyKeySystem()).WillOnce(Return(result)); -} - void CdmServiceTests::mediaKeysWillPing() { EXPECT_CALL(*m_heartbeatProcedureMock, createHandler()); @@ -272,7 +276,12 @@ void CdmServiceTests::createKeySessionShouldFailWithReturnStatus(firebolt::rialt void CdmServiceTests::generateRequestShouldReturnStatus(firebolt::rialto::MediaKeyErrorStatus status) { - EXPECT_EQ(status, m_sut.generateRequest(kMediaKeysHandle, kKeySessionId, kInitDataType, kInitData)); + EXPECT_EQ(status, m_sut.generateRequest(kMediaKeysHandle, kKeySessionId, kInitDataType, kInitData, kLdlState)); +} + +void CdmServiceTests::generateRequestWithLdlEnabledShouldReturnStatus(firebolt::rialto::MediaKeyErrorStatus status) +{ + EXPECT_EQ(status, m_sut.generateRequest(kMediaKeysHandle, kKeySessionId, kInitDataType, kInitData, kLdlStateEnabled)); } void CdmServiceTests::loadSessionShouldReturnStatus(firebolt::rialto::MediaKeyErrorStatus status) @@ -368,9 +377,9 @@ void CdmServiceTests::releaseKeySessionShouldReturnStatus(firebolt::rialto::Medi EXPECT_EQ(status, m_sut.releaseKeySession(kMediaKeysHandle, kKeySessionId)); } -void CdmServiceTests::isNetflixPlayreadyKeySystemShouldReturn(bool result) +void CdmServiceTests::isExtendedInterfaceUsedShouldReturn(bool result) { - EXPECT_EQ(result, m_sut.isNetflixPlayreadyKeySystem(kKeySessionId)); + EXPECT_EQ(result, m_sut.isExtendedInterfaceUsed(kKeySessionId)); } void CdmServiceTests::getSupportedKeySystemsShouldSucceed() diff --git a/tests/unittests/media/server/service/cdmService/CdmServiceTestsFixture.h b/tests/unittests/media/server/service/cdmService/CdmServiceTestsFixture.h index 77939fd0b..36a8c3676 100644 --- a/tests/unittests/media/server/service/cdmService/CdmServiceTestsFixture.h +++ b/tests/unittests/media/server/service/cdmService/CdmServiceTestsFixture.h @@ -45,6 +45,7 @@ class CdmServiceTests : public testing::Test void mediaKeysFactoryWillReturnNullptr(); void mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus status); void mediaKeysWillGenerateRequestWithStatus(firebolt::rialto::MediaKeyErrorStatus status); + void mediaKeysWillGenerateRequestLdlEnabledWithStatus(firebolt::rialto::MediaKeyErrorStatus status); void mediaKeysWillLoadSessionWithStatus(firebolt::rialto::MediaKeyErrorStatus status); void mediaKeysWillUpdateSessionWithStatus(firebolt::rialto::MediaKeyErrorStatus status); void mediaKeysWillCloseKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus status); @@ -62,7 +63,6 @@ class CdmServiceTests : public testing::Test void mediaKeysWillReleaseKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus status); void mediaKeysWillDecryptWithStatus(firebolt::rialto::MediaKeyErrorStatus status); void mediaKeysWillSelectKeyIdWithStatus(firebolt::rialto::MediaKeyErrorStatus status); - void mediaKeysWillCheckIfKeySystemIsPlayready(bool result); void mediaKeysWillPing(); void mediaKeysWillGetMetricSystemDataWithStatus(firebolt::rialto::MediaKeyErrorStatus status); @@ -85,6 +85,7 @@ class CdmServiceTests : public testing::Test void createKeySessionShouldSucceed(); void createKeySessionShouldFailWithReturnStatus(firebolt::rialto::MediaKeyErrorStatus status); void generateRequestShouldReturnStatus(firebolt::rialto::MediaKeyErrorStatus status); + void generateRequestWithLdlEnabledShouldReturnStatus(firebolt::rialto::MediaKeyErrorStatus status); void loadSessionShouldReturnStatus(firebolt::rialto::MediaKeyErrorStatus status); void updateSessionShouldReturnStatus(firebolt::rialto::MediaKeyErrorStatus status); void closeKeySessionShouldReturnStatus(firebolt::rialto::MediaKeyErrorStatus status); @@ -102,7 +103,7 @@ class CdmServiceTests : public testing::Test void getLastDrmErrorShouldReturnStatus(firebolt::rialto::MediaKeyErrorStatus status); void getDrmTimeShouldReturnStatus(firebolt::rialto::MediaKeyErrorStatus status); void releaseKeySessionShouldReturnStatus(firebolt::rialto::MediaKeyErrorStatus status); - void isNetflixPlayreadyKeySystemShouldReturn(bool result); + void isExtendedInterfaceUsedShouldReturn(bool result); void incrementSessionIdUsageCounter(); void decrementSessionIdUsageCounter(); void getMetricSystemDataShouldReturnStatus(firebolt::rialto::MediaKeyErrorStatus status); From cdfee431a259896c387be2352823f3ef3b15e40d Mon Sep 17 00:00:00 2001 From: Marcin Wojciechowski Date: Mon, 12 Jan 2026 10:39:02 +0100 Subject: [PATCH 04/12] fix 1 --- media/server/main/source/MediaKeySession.cpp | 25 +++++++++++++++---- .../main/mediaKeySession/CallbacksTest.cpp | 16 ++++++++++++ .../base/MediaKeySessionTestBase.cpp | 1 - 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/media/server/main/source/MediaKeySession.cpp b/media/server/main/source/MediaKeySession.cpp index 1244db055..2c8890b05 100644 --- a/media/server/main/source/MediaKeySession.cpp +++ b/media/server/main/source/MediaKeySession.cpp @@ -111,8 +111,15 @@ MediaKeyErrorStatus MediaKeySession::generateRequest(InitDataType initDataType, const LimitedDurationLicense &ldlState) { RIALTO_SERVER_LOG_DEBUG("entry:"); - // Set the request flag for the onLicenseRequest callback - m_licenseRequested = true; + if (LimitedDurationLicense::NOT_SPECIFIED != ldlState) + { + m_extendedInterfaceInUse = true; + } + else + { + // Set the request flag for the onLicenseRequest callback + m_licenseRequested = true; + } // Only construct session if it hasnt previously been constructed if (!m_isSessionConstructed) @@ -142,9 +149,8 @@ MediaKeyErrorStatus MediaKeySession::generateRequest(InitDataType initDataType, status = MediaKeyErrorStatus::FAIL; } - if (LimitedDurationLicense::NOT_SPECIFIED != ldlState) + if (m_extendedInterfaceInUse) { - m_extendedInterfaceInUse = true; // Ocdm-playready does not notify onProcessChallenge when complete. // Fetch the challenge manually. getChallenge(ldlState); @@ -178,7 +184,11 @@ void MediaKeySession::getChallenge(const LimitedDurationLicense &ldlState) } std::string url; - onProcessChallenge(url.c_str(), &challenge[0], challengeSize); + std::shared_ptr client = m_mediaKeysClient.lock(); + if (client) + { + client->onLicenseRequest(m_kKeySessionId, challenge, url); + } }; m_mainThread->enqueueTask(m_mainThreadClientId, task); } @@ -404,6 +414,11 @@ void MediaKeySession::onProcessChallenge(const char url[], const uint8_t challen std::vector challengeVec = std::vector{challenge, challenge + challengeLength}; auto task = [&, urlStr, challengeVec]() { + if (m_extendedInterfaceInUse) + { + RIALTO_SERVER_LOG_DEBUG("Received onProcessChallenge callback but extended interface is in use"); + return; + } std::shared_ptr client = m_mediaKeysClient.lock(); if (client) { diff --git a/tests/unittests/media/server/main/mediaKeySession/CallbacksTest.cpp b/tests/unittests/media/server/main/mediaKeySession/CallbacksTest.cpp index 948ce3c90..3bf24bad3 100644 --- a/tests/unittests/media/server/main/mediaKeySession/CallbacksTest.cpp +++ b/tests/unittests/media/server/main/mediaKeySession/CallbacksTest.cpp @@ -72,6 +72,22 @@ TEST_F(RialtoServerMediaKeySessionCallbacksTest, ProcessChallengeGenerateRequest expectCloseKeySession(kWidevineKeySystem); } +/** + * Test that onProcessChallenge after a generateRequest for a Netflix key system does not automatically notify the + * licenseRequest. + */ +TEST_F(RialtoServerMediaKeySessionCallbacksTest, ProcessChallengeGenerateRequestNetflix) +{ + generateRequestPlayready(); + mainThreadWillEnqueueTask(); + // EXPECT_CALL(*m_mediaKeysClientMock, onLicenseRequest(m_kKeySessionId, m_kLicenseRequestMessage, m_kUrl)); + + m_mediaKeySession->onProcessChallenge(m_kUrl.c_str(), &m_kLicenseRequestMessage[0], m_kLicenseRequestMessage.size()); + + // OcdmSession will be closed on destruction + expectCloseKeySession(kNetflixKeySystem); +} + /** * Test that onKeyUpdate stores the key status and onAllKeysUpdated notifies the statuses stored. */ diff --git a/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp b/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp index 70757b103..17c320b2c 100644 --- a/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp +++ b/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp @@ -87,7 +87,6 @@ void MediaKeySessionTestBase::generateRequestPlayready() .WillOnce(DoAll(SetArgPointee<2>(m_kChallenge.size()), Return(MediaKeyErrorStatus::OK))); EXPECT_CALL(*m_ocdmSessionMock, getChallengeData(m_isLDL, notNullptrMatcher(), _)) .WillOnce(DoAll(memcpyChallenge(m_kChallenge), Return(MediaKeyErrorStatus::OK))); - mainThreadWillEnqueueTask(); EXPECT_CALL(*m_mediaKeysClientMock, onLicenseRequest(m_kKeySessionId, m_kChallenge, _)); EXPECT_EQ(MediaKeyErrorStatus::OK, From e6a545c415576cf2a4581d58310ed4ec4dd4db70 Mon Sep 17 00:00:00 2001 From: Marcin Wojciechowski Date: Mon, 12 Jan 2026 11:13:43 +0100 Subject: [PATCH 05/12] comment removed --- .../media/server/main/mediaKeySession/CallbacksTest.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/unittests/media/server/main/mediaKeySession/CallbacksTest.cpp b/tests/unittests/media/server/main/mediaKeySession/CallbacksTest.cpp index 3bf24bad3..76abf0bf9 100644 --- a/tests/unittests/media/server/main/mediaKeySession/CallbacksTest.cpp +++ b/tests/unittests/media/server/main/mediaKeySession/CallbacksTest.cpp @@ -80,7 +80,6 @@ TEST_F(RialtoServerMediaKeySessionCallbacksTest, ProcessChallengeGenerateRequest { generateRequestPlayready(); mainThreadWillEnqueueTask(); - // EXPECT_CALL(*m_mediaKeysClientMock, onLicenseRequest(m_kKeySessionId, m_kLicenseRequestMessage, m_kUrl)); m_mediaKeySession->onProcessChallenge(m_kUrl.c_str(), &m_kLicenseRequestMessage[0], m_kLicenseRequestMessage.size()); From b39b5c80e9c6ae0f77cf0159fa61f0ae6d73ed29 Mon Sep 17 00:00:00 2001 From: Marcin Wojciechowski Date: Wed, 4 Feb 2026 15:50:03 +0000 Subject: [PATCH 06/12] fix --- media/server/main/source/MediaKeySession.cpp | 21 +++++++++---------- .../mediaKeySession/GenerateRequestTest.cpp | 13 ++++++++++++ .../base/MediaKeySessionTestBase.cpp | 21 +++++++++++++++++++ .../base/MediaKeySessionTestBase.h | 1 + 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/media/server/main/source/MediaKeySession.cpp b/media/server/main/source/MediaKeySession.cpp index 2c8890b05..f42b32354 100644 --- a/media/server/main/source/MediaKeySession.cpp +++ b/media/server/main/source/MediaKeySession.cpp @@ -121,13 +121,14 @@ MediaKeyErrorStatus MediaKeySession::generateRequest(InitDataType initDataType, m_licenseRequested = true; } + auto status = MediaKeyErrorStatus::OK; + // Only construct session if it hasnt previously been constructed if (!m_isSessionConstructed) { initOcdmErrorChecking(); - MediaKeyErrorStatus status = - m_ocdmSession->constructSession(m_kSessionType, initDataType, &initData[0], initData.size()); + status = m_ocdmSession->constructSession(m_kSessionType, initDataType, &initData[0], initData.size()); if (MediaKeyErrorStatus::OK != status) { RIALTO_SERVER_LOG_ERROR("Failed to construct the key session"); @@ -148,18 +149,16 @@ MediaKeyErrorStatus MediaKeySession::generateRequest(InitDataType initDataType, { status = MediaKeyErrorStatus::FAIL; } + } - if (m_extendedInterfaceInUse) - { - // Ocdm-playready does not notify onProcessChallenge when complete. - // Fetch the challenge manually. - getChallenge(ldlState); - } - - return status; + if (m_extendedInterfaceInUse) + { + // Ocdm-playready does not notify onProcessChallenge when complete. + // Fetch the challenge manually. + getChallenge(ldlState); } - return MediaKeyErrorStatus::OK; + return status; } void MediaKeySession::getChallenge(const LimitedDurationLicense &ldlState) diff --git a/tests/unittests/media/server/main/mediaKeySession/GenerateRequestTest.cpp b/tests/unittests/media/server/main/mediaKeySession/GenerateRequestTest.cpp index bcad8249c..d967ac7de 100644 --- a/tests/unittests/media/server/main/mediaKeySession/GenerateRequestTest.cpp +++ b/tests/unittests/media/server/main/mediaKeySession/GenerateRequestTest.cpp @@ -58,6 +58,19 @@ TEST_F(RialtoServerMediaKeySessionGenerateRequestTest, SuccessNetflix) expectCloseKeySession(kNetflixKeySystem); } +/** + * Test that GenerateRequest can generate request successfully for a netflix keysystem. + */ +TEST_F(RialtoServerMediaKeySessionGenerateRequestTest, SuccessNetflixWithTwoGenerateChallengeCalls) +{ + createKeySession(kNetflixKeySystem); + + generateRequestPlayreadyWithTwoCalls(); + + // Close ocdm before destroying + expectCloseKeySession(kNetflixKeySystem); +} + /** * Test that GenerateRequest fails when returned challenge data size is zero */ diff --git a/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp b/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp index 17c320b2c..86c6c8d54 100644 --- a/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp +++ b/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp @@ -94,6 +94,27 @@ void MediaKeySessionTestBase::generateRequestPlayready() firebolt::rialto::LimitedDurationLicense::DISABLED)); } +void MediaKeySessionTestBase::generateRequestPlayreadyWithTwoCalls() +{ + EXPECT_CALL(*m_ocdmSessionMock, + constructSession(m_keySessionType, m_kInitDataType, &m_kInitData[0], m_kInitData.size())) + .WillOnce(Return(MediaKeyErrorStatus::OK)); + + EXPECT_EQ(MediaKeyErrorStatus::OK, + m_mediaKeySession->generateRequest(m_kInitDataType, m_kInitData, + firebolt::rialto::LimitedDurationLicense::NOT_SPECIFIED)); + mainThreadWillEnqueueTask(); + EXPECT_CALL(*m_ocdmSessionMock, getChallengeData(m_isLDL, nullptrMatcher(), _)) + .WillOnce(DoAll(SetArgPointee<2>(m_kChallenge.size()), Return(MediaKeyErrorStatus::OK))); + EXPECT_CALL(*m_ocdmSessionMock, getChallengeData(m_isLDL, notNullptrMatcher(), _)) + .WillOnce(DoAll(memcpyChallenge(m_kChallenge), Return(MediaKeyErrorStatus::OK))); + EXPECT_CALL(*m_mediaKeysClientMock, onLicenseRequest(m_kKeySessionId, m_kChallenge, _)); + + EXPECT_EQ(MediaKeyErrorStatus::OK, + m_mediaKeySession->generateRequest(m_kInitDataType, m_kInitData, + firebolt::rialto::LimitedDurationLicense::DISABLED)); +} + void MediaKeySessionTestBase::mainThreadWillEnqueueTask() { EXPECT_CALL(*m_mainThreadMock, enqueueTask(m_kMainThreadClientId, _)) diff --git a/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.h b/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.h index b8df674cf..5bf10e5c8 100644 --- a/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.h +++ b/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.h @@ -93,6 +93,7 @@ class MediaKeySessionTestBase : public ::testing::Test void expectCloseKeySession(const std::string &keySystem); void generateRequest(); void generateRequestPlayready(); + void generateRequestPlayreadyWithTwoCalls(); void mainThreadWillEnqueueTask(); }; From abe9be602394baec1e4a8f3b10ca47f7691496e8 Mon Sep 17 00:00:00 2001 From: Marcin Wojciechowski Date: Thu, 5 Feb 2026 10:21:28 +0000 Subject: [PATCH 07/12] ct fix --- .../server/common/MessageBuilders.cpp | 7 +- .../server/common/MessageBuilders.h | 3 +- .../tests/mediaKeys/LicenseRenewalTest.cpp | 74 ++++++++++++++++--- .../tests/mediaKeys/MediaKeysTestMethods.cpp | 3 +- .../SessionReadyForDecryptionTest.cpp | 3 +- 5 files changed, 75 insertions(+), 15 deletions(-) diff --git a/tests/componenttests/server/common/MessageBuilders.cpp b/tests/componenttests/server/common/MessageBuilders.cpp index 848b925f8..a1ae941e1 100644 --- a/tests/componenttests/server/common/MessageBuilders.cpp +++ b/tests/componenttests/server/common/MessageBuilders.cpp @@ -430,7 +430,8 @@ ::firebolt::rialto::CreateKeySessionRequest createCreateKeySessionRequest(int me } ::firebolt::rialto::GenerateRequestRequest createGenerateRequestRequest(int mediaKeysHandle, int keySessionId, - const std::vector &initData) + const std::vector &initData, + bool extendedInterface) { ::firebolt::rialto::GenerateRequestRequest request; request.set_media_keys_handle(mediaKeysHandle); @@ -440,6 +441,10 @@ ::firebolt::rialto::GenerateRequestRequest createGenerateRequestRequest(int medi { request.add_init_data(i); } + if (extendedInterface) + { + request.set_ldl_state(::firebolt::rialto::GenerateRequestRequest_LimitedDurationLicense_DISABLED); + } return request; } diff --git a/tests/componenttests/server/common/MessageBuilders.h b/tests/componenttests/server/common/MessageBuilders.h index dae4679ae..815266713 100644 --- a/tests/componenttests/server/common/MessageBuilders.h +++ b/tests/componenttests/server/common/MessageBuilders.h @@ -89,7 +89,8 @@ ::firebolt::rialto::CreateMediaKeysRequest createCreateMediaKeysRequestWidevine( ::firebolt::rialto::CreateMediaKeysRequest createCreateMediaKeysRequestNetflix(); ::firebolt::rialto::CreateKeySessionRequest createCreateKeySessionRequest(int mediaKeysHandle); ::firebolt::rialto::GenerateRequestRequest createGenerateRequestRequest(int mediaKeysHandle, int keySessionId, - const std::vector &initData); + const std::vector &initData, + bool extendedInterface = false); ::firebolt::rialto::UpdateSessionRequest createUpdateSessionRequest(int mediaKeysHandle, int keySessionId, const std::vector &response); ::firebolt::rialto::ContainsKeyRequest createContainsKeyRequest(int mediaKeysHandle, int keySessionId, diff --git a/tests/componenttests/server/tests/mediaKeys/LicenseRenewalTest.cpp b/tests/componenttests/server/tests/mediaKeys/LicenseRenewalTest.cpp index 68a42b773..49a3249e9 100644 --- a/tests/componenttests/server/tests/mediaKeys/LicenseRenewalTest.cpp +++ b/tests/componenttests/server/tests/mediaKeys/LicenseRenewalTest.cpp @@ -130,12 +130,7 @@ void LicenseRenewalTest::updateOneKey() * Server notifies the client that of license renewal. * Expect that the license renewal notification is processed by the client. * - * Step 2: Update session - * updateSession with the updated license. - * Expect that updateSession is processed by the server. - * Api call returns with success. - * - * Step 3: Notify key statuses changed + * Step 2: Notify key statuses changed * Server notifies the client of key statuses changed. * Expect that the key statuses changed notification is processed by the client. * @@ -149,20 +144,77 @@ void LicenseRenewalTest::updateOneKey() */ TEST_F(LicenseRenewalTest, licenseRenewal) { - createMediaKeysNetflix(); + createMediaKeysWidevine(); ocdmSessionWillBeCreated(); createKeySession(); // Step 1: Notify license renewal licenseRenew(); - // Step 2: Update session + // Step 2: Notify key statuses changed + updateOneKey(); + updateAllKeys(); +} + +/* + * Component Test: License renewal sequence for netflix playready. + * Test Objective: + * Test the notification of license renewal and updating of the new license. + * + * Sequence Diagrams: + * License Renewal - Cobalt/OCDM, Update MKS - Cobalt/OCDM, "Destroy" MKS - Cobalt/OCDM + * - https://wiki.rdkcentral.com/display/ASP/Rialto+Media+Key+Session+Management+Design + * + * Test Setup: + * Language: C++ + * Testing Framework: Google Test + * Components: MediaKeys + * + * Test Initialize: + * RialtoServerComponentTest::RialtoServerComponentTest() will set up wrappers and + * starts rialtoServer running in its own thread + * send a CreateMediaKeys message to rialtoServer + * expect a "createSession" call (to OCDM mock) + * send a CreateKeySession message to rialtoServer + * generate request message for playready and send it to the client + * expect the client to process the generate request message + * + * + * Test Steps: + * Step 1: Update session + * updateSession with the updated license. + * Expect that updateSession is processed by the server. + * Api call returns with success. + * + * Step 2: Close session + * closeSession. + * Expect that closeSession is processed by the server. + * Api call returns with success. + * + * Test Tear-down: + * Server is terminated. + * + * Expected Results: + * Client can be notified of license renewal and update the key session successfully. + * + * Code: + */ +TEST_F(LicenseRenewalTest, licenseRenewalNetflix) +{ + createMediaKeysNetflix(); + ocdmSessionWillBeCreated(); + createKeySession(); + willGenerateRequestPlayready(); + generateRequestPlayready(); + + // Step 1: Update session willUpdateSessionNetflix(); updateSessionNetflix(); - // Step 3: Notify key statuses changed - updateOneKey(); - updateAllKeys(); + // Step 2: Close session + willCloseKeySessionPlayready(); + closeKeySessionPlayready(); + willRelease(); } } // namespace firebolt::rialto::server::ct diff --git a/tests/componenttests/server/tests/mediaKeys/MediaKeysTestMethods.cpp b/tests/componenttests/server/tests/mediaKeys/MediaKeysTestMethods.cpp index 436569b62..b9e91dc4e 100644 --- a/tests/componenttests/server/tests/mediaKeys/MediaKeysTestMethods.cpp +++ b/tests/componenttests/server/tests/mediaKeys/MediaKeysTestMethods.cpp @@ -124,7 +124,8 @@ void MediaKeysTestMethods::willGenerateRequestPlayready() void MediaKeysTestMethods::generateRequestPlayready() { - auto request{createGenerateRequestRequest(m_mediaKeysHandle, m_mediaKeySessionId, m_kInitData)}; + constexpr bool kUseExtendedInterface{true}; + auto request{createGenerateRequestRequest(m_mediaKeysHandle, m_mediaKeySessionId, m_kInitData, kUseExtendedInterface)}; ExpectMessage<::firebolt::rialto::LicenseRequestEvent> expectedMessage(m_clientStub); diff --git a/tests/componenttests/server/tests/mediaKeys/SessionReadyForDecryptionTest.cpp b/tests/componenttests/server/tests/mediaKeys/SessionReadyForDecryptionTest.cpp index bd2e0f97f..40ae4f487 100644 --- a/tests/componenttests/server/tests/mediaKeys/SessionReadyForDecryptionTest.cpp +++ b/tests/componenttests/server/tests/mediaKeys/SessionReadyForDecryptionTest.cpp @@ -149,7 +149,8 @@ void SessionReadyForDecryptionTest::willGenerateRequestNetflix() void SessionReadyForDecryptionTest::generateRequestNetflix() { - auto request{createGenerateRequestRequest(m_mediaKeysHandle, m_mediaKeySessionId, m_kInitData)}; + constexpr bool kUseExtendedInterface{true}; + auto request{createGenerateRequestRequest(m_mediaKeysHandle, m_mediaKeySessionId, m_kInitData, kUseExtendedInterface)}; ExpectMessage<::firebolt::rialto::LicenseRequestEvent> expectedMessage(m_clientStub); From 6d771f9deccfa0dd9073065449a07b8fe597608b Mon Sep 17 00:00:00 2001 From: Marcin Wojciechowski Date: Mon, 16 Feb 2026 15:20:50 +0100 Subject: [PATCH 08/12] added debugs, revert this commit later --- media/server/main/source/MediaKeySession.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/media/server/main/source/MediaKeySession.cpp b/media/server/main/source/MediaKeySession.cpp index f42b32354..7f45d070f 100644 --- a/media/server/main/source/MediaKeySession.cpp +++ b/media/server/main/source/MediaKeySession.cpp @@ -182,6 +182,8 @@ void MediaKeySession::getChallenge(const LimitedDurationLicense &ldlState) return; } + RIALTO_SERVER_LOG_MIL("GET CHALLENGE DATA, size: %u", static_cast(challengeSize)); + std::string url; std::shared_ptr client = m_mediaKeysClient.lock(); if (client) @@ -421,6 +423,7 @@ void MediaKeySession::onProcessChallenge(const char url[], const uint8_t challen std::shared_ptr client = m_mediaKeysClient.lock(); if (client) { + RIALTO_SERVER_LOG_MIL("Received onProcessChallenge callback, size: %u", static_cast(challengeLength)); if (m_licenseRequested) { client->onLicenseRequest(m_kKeySessionId, challengeVec, urlStr); From c640cd2337b58b812e29b6e170763677e9440f26 Mon Sep 17 00:00:00 2001 From: Marcin Wojciechowski Date: Tue, 17 Feb 2026 14:22:10 +0100 Subject: [PATCH 09/12] more debugs --- media/server/ipc/source/MediaKeysClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/media/server/ipc/source/MediaKeysClient.cpp b/media/server/ipc/source/MediaKeysClient.cpp index 040f6f641..062c1ff9c 100644 --- a/media/server/ipc/source/MediaKeysClient.cpp +++ b/media/server/ipc/source/MediaKeysClient.cpp @@ -69,7 +69,7 @@ MediaKeysClient::~MediaKeysClient() {} void MediaKeysClient::onLicenseRequest(int32_t keySessionId, const std::vector &licenseRequestMessage, const std::string &url) { - RIALTO_SERVER_LOG_DEBUG("Sending LicenseRequestEvent"); + RIALTO_SERVER_LOG_MIL("Sending LicenseRequestEvent with license size: %zu", licenseRequestMessage.size()); auto event = std::make_shared(); for (auto it = licenseRequestMessage.begin(); it != licenseRequestMessage.end(); it++) From 2547a17312a614b02e76c4b528acf945259e976b Mon Sep 17 00:00:00 2001 From: Marcin Wojciechowski Date: Thu, 19 Feb 2026 10:57:11 +0100 Subject: [PATCH 10/12] fix --- media/server/main/source/MediaKeySession.cpp | 18 +++++++----------- .../main/mediaKeySession/CallbacksTest.cpp | 17 +---------------- .../base/MediaKeySessionTestBase.cpp | 2 ++ 3 files changed, 10 insertions(+), 27 deletions(-) diff --git a/media/server/main/source/MediaKeySession.cpp b/media/server/main/source/MediaKeySession.cpp index 7f45d070f..888352c77 100644 --- a/media/server/main/source/MediaKeySession.cpp +++ b/media/server/main/source/MediaKeySession.cpp @@ -183,13 +183,13 @@ void MediaKeySession::getChallenge(const LimitedDurationLicense &ldlState) } RIALTO_SERVER_LOG_MIL("GET CHALLENGE DATA, size: %u", static_cast(challengeSize)); + RIALTO_SERVER_LOG_MIL("CHALLENGE DATA VECTOR, size: %u", static_cast(challenge.size())); + const std::vector &challengeVec = std::vector{challenge}; + RIALTO_SERVER_LOG_MIL("CASTED CHALLENGE DATA VECTOR, size: %u", static_cast(challengeVec.size())); std::string url; - std::shared_ptr client = m_mediaKeysClient.lock(); - if (client) - { - client->onLicenseRequest(m_kKeySessionId, challenge, url); - } + m_licenseRequested = true; + onProcessChallenge(url.c_str(), &challenge[0], challengeSize); }; m_mainThread->enqueueTask(m_mainThreadClientId, task); } @@ -415,15 +415,11 @@ void MediaKeySession::onProcessChallenge(const char url[], const uint8_t challen std::vector challengeVec = std::vector{challenge, challenge + challengeLength}; auto task = [&, urlStr, challengeVec]() { - if (m_extendedInterfaceInUse) - { - RIALTO_SERVER_LOG_DEBUG("Received onProcessChallenge callback but extended interface is in use"); - return; - } std::shared_ptr client = m_mediaKeysClient.lock(); if (client) { - RIALTO_SERVER_LOG_MIL("Received onProcessChallenge callback, size: %u", static_cast(challengeLength)); + RIALTO_SERVER_LOG_MIL("Received onProcessChallenge callback, size: %u", + static_cast(challengeLength)); if (m_licenseRequested) { client->onLicenseRequest(m_kKeySessionId, challengeVec, urlStr); diff --git a/tests/unittests/media/server/main/mediaKeySession/CallbacksTest.cpp b/tests/unittests/media/server/main/mediaKeySession/CallbacksTest.cpp index 76abf0bf9..03a4f2d2b 100644 --- a/tests/unittests/media/server/main/mediaKeySession/CallbacksTest.cpp +++ b/tests/unittests/media/server/main/mediaKeySession/CallbacksTest.cpp @@ -60,7 +60,7 @@ TEST_F(RialtoServerMediaKeySessionCallbacksTest, ProcessChallengeNoGenerateReque /** * Test that onProcessChallenge after a generateRequest for none Netflix key system notifies licenseRequest. */ -TEST_F(RialtoServerMediaKeySessionCallbacksTest, ProcessChallengeGenerateRequestNoneNetflix) +TEST_F(RialtoServerMediaKeySessionCallbacksTest, ProcessChallengeGenerateRequest) { generateRequest(); mainThreadWillEnqueueTask(); @@ -72,21 +72,6 @@ TEST_F(RialtoServerMediaKeySessionCallbacksTest, ProcessChallengeGenerateRequest expectCloseKeySession(kWidevineKeySystem); } -/** - * Test that onProcessChallenge after a generateRequest for a Netflix key system does not automatically notify the - * licenseRequest. - */ -TEST_F(RialtoServerMediaKeySessionCallbacksTest, ProcessChallengeGenerateRequestNetflix) -{ - generateRequestPlayready(); - mainThreadWillEnqueueTask(); - - m_mediaKeySession->onProcessChallenge(m_kUrl.c_str(), &m_kLicenseRequestMessage[0], m_kLicenseRequestMessage.size()); - - // OcdmSession will be closed on destruction - expectCloseKeySession(kNetflixKeySystem); -} - /** * Test that onKeyUpdate stores the key status and onAllKeysUpdated notifies the statuses stored. */ diff --git a/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp b/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp index 86c6c8d54..12eb74230 100644 --- a/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp +++ b/tests/unittests/media/server/main/mediaKeySession/base/MediaKeySessionTestBase.cpp @@ -87,6 +87,7 @@ void MediaKeySessionTestBase::generateRequestPlayready() .WillOnce(DoAll(SetArgPointee<2>(m_kChallenge.size()), Return(MediaKeyErrorStatus::OK))); EXPECT_CALL(*m_ocdmSessionMock, getChallengeData(m_isLDL, notNullptrMatcher(), _)) .WillOnce(DoAll(memcpyChallenge(m_kChallenge), Return(MediaKeyErrorStatus::OK))); + mainThreadWillEnqueueTask(); EXPECT_CALL(*m_mediaKeysClientMock, onLicenseRequest(m_kKeySessionId, m_kChallenge, _)); EXPECT_EQ(MediaKeyErrorStatus::OK, @@ -108,6 +109,7 @@ void MediaKeySessionTestBase::generateRequestPlayreadyWithTwoCalls() .WillOnce(DoAll(SetArgPointee<2>(m_kChallenge.size()), Return(MediaKeyErrorStatus::OK))); EXPECT_CALL(*m_ocdmSessionMock, getChallengeData(m_isLDL, notNullptrMatcher(), _)) .WillOnce(DoAll(memcpyChallenge(m_kChallenge), Return(MediaKeyErrorStatus::OK))); + mainThreadWillEnqueueTask(); EXPECT_CALL(*m_mediaKeysClientMock, onLicenseRequest(m_kKeySessionId, m_kChallenge, _)); EXPECT_EQ(MediaKeyErrorStatus::OK, From c624c6ebb6296847d56539759a5b9e05bca01cd9 Mon Sep 17 00:00:00 2001 From: Marcin Wojciechowski Date: Thu, 19 Feb 2026 13:23:29 +0100 Subject: [PATCH 11/12] debugs removed --- media/server/ipc/source/MediaKeysClient.cpp | 2 +- media/server/main/source/MediaKeySession.cpp | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/media/server/ipc/source/MediaKeysClient.cpp b/media/server/ipc/source/MediaKeysClient.cpp index 062c1ff9c..040f6f641 100644 --- a/media/server/ipc/source/MediaKeysClient.cpp +++ b/media/server/ipc/source/MediaKeysClient.cpp @@ -69,7 +69,7 @@ MediaKeysClient::~MediaKeysClient() {} void MediaKeysClient::onLicenseRequest(int32_t keySessionId, const std::vector &licenseRequestMessage, const std::string &url) { - RIALTO_SERVER_LOG_MIL("Sending LicenseRequestEvent with license size: %zu", licenseRequestMessage.size()); + RIALTO_SERVER_LOG_DEBUG("Sending LicenseRequestEvent"); auto event = std::make_shared(); for (auto it = licenseRequestMessage.begin(); it != licenseRequestMessage.end(); it++) diff --git a/media/server/main/source/MediaKeySession.cpp b/media/server/main/source/MediaKeySession.cpp index 888352c77..bd5a59826 100644 --- a/media/server/main/source/MediaKeySession.cpp +++ b/media/server/main/source/MediaKeySession.cpp @@ -182,11 +182,6 @@ void MediaKeySession::getChallenge(const LimitedDurationLicense &ldlState) return; } - RIALTO_SERVER_LOG_MIL("GET CHALLENGE DATA, size: %u", static_cast(challengeSize)); - RIALTO_SERVER_LOG_MIL("CHALLENGE DATA VECTOR, size: %u", static_cast(challenge.size())); - const std::vector &challengeVec = std::vector{challenge}; - RIALTO_SERVER_LOG_MIL("CASTED CHALLENGE DATA VECTOR, size: %u", static_cast(challengeVec.size())); - std::string url; m_licenseRequested = true; onProcessChallenge(url.c_str(), &challenge[0], challengeSize); @@ -418,8 +413,6 @@ void MediaKeySession::onProcessChallenge(const char url[], const uint8_t challen std::shared_ptr client = m_mediaKeysClient.lock(); if (client) { - RIALTO_SERVER_LOG_MIL("Received onProcessChallenge callback, size: %u", - static_cast(challengeLength)); if (m_licenseRequested) { client->onLicenseRequest(m_kKeySessionId, challengeVec, urlStr); From 4511c031cc957d503800b0faaf0aa7e738632adc Mon Sep 17 00:00:00 2001 From: Marcin Wojciechowski Date: Thu, 19 Feb 2026 15:03:12 +0100 Subject: [PATCH 12/12] some fixes --- media/client/ipc/source/MediaKeysIpc.cpp | 2 +- media/public/include/MediaCommon.h | 2 +- .../server/main/include/MediaKeysServerInternal.h | 3 +-- media/server/main/source/MediaKeySession.cpp | 2 +- .../server/main/source/MediaKeysServerInternal.cpp | 4 ++-- media/server/service/source/CdmService.cpp | 14 ++++++++++---- proto/mediakeysmodule.proto | 2 ++ .../server/tests/mediaKeys/MediaKeysTest.cpp | 2 -- .../mediaKeys/SessionReadyForDecryptionTest.cpp | 2 -- .../server/service/cdmService/CdmServiceTests.cpp | 4 ++++ 10 files changed, 22 insertions(+), 15 deletions(-) diff --git a/media/client/ipc/source/MediaKeysIpc.cpp b/media/client/ipc/source/MediaKeysIpc.cpp index 5706bd378..761566218 100644 --- a/media/client/ipc/source/MediaKeysIpc.cpp +++ b/media/client/ipc/source/MediaKeysIpc.cpp @@ -429,7 +429,7 @@ MediaKeyErrorStatus MediaKeysIpc::generateRequest(int32_t keySessionId, InitData protoLimitedDurationLicense = GenerateRequestRequest_LimitedDurationLicense_DISABLED; break; default: - RIALTO_CLIENT_LOG_WARN("Recieved unknown limited duration license state"); + RIALTO_CLIENT_LOG_WARN("Received unknown limited duration license state"); break; } diff --git a/media/public/include/MediaCommon.h b/media/public/include/MediaCommon.h index 0c403b7ca..0dd829f6a 100644 --- a/media/public/include/MediaCommon.h +++ b/media/public/include/MediaCommon.h @@ -475,7 +475,7 @@ struct PlaybackInfo }; /** - * @brief Struct containing current playback information. + * @brief Limited duration license state. */ enum class LimitedDurationLicense { diff --git a/media/server/main/include/MediaKeysServerInternal.h b/media/server/main/include/MediaKeysServerInternal.h index d34ca5fa3..bf9680651 100644 --- a/media/server/main/include/MediaKeysServerInternal.h +++ b/media/server/main/include/MediaKeysServerInternal.h @@ -153,13 +153,12 @@ class MediaKeysServerInternal : public IMediaKeysServerInternal * * @param[in] sessionType : The session type. * @param[in] client : Client object for callbacks - * @param[in] isLDL : Is this an LDL * @param[out] keySessionId: The key session id * * @retval an error status. */ MediaKeyErrorStatus createKeySessionInternal(KeySessionType sessionType, std::weak_ptr client, - bool isLDL, int32_t &keySessionId); + int32_t &keySessionId); /** * @brief Generate internally, only to be called on the main thread. diff --git a/media/server/main/source/MediaKeySession.cpp b/media/server/main/source/MediaKeySession.cpp index bd5a59826..ab23b05a4 100644 --- a/media/server/main/source/MediaKeySession.cpp +++ b/media/server/main/source/MediaKeySession.cpp @@ -151,7 +151,7 @@ MediaKeyErrorStatus MediaKeySession::generateRequest(InitDataType initDataType, } } - if (m_extendedInterfaceInUse) + if (m_isSessionConstructed && m_extendedInterfaceInUse) { // Ocdm-playready does not notify onProcessChallenge when complete. // Fetch the challenge manually. diff --git a/media/server/main/source/MediaKeysServerInternal.cpp b/media/server/main/source/MediaKeysServerInternal.cpp index 7e433b5f9..aa74faa74 100644 --- a/media/server/main/source/MediaKeysServerInternal.cpp +++ b/media/server/main/source/MediaKeysServerInternal.cpp @@ -216,7 +216,7 @@ MediaKeyErrorStatus MediaKeysServerInternal::createKeySession(KeySessionType ses RIALTO_SERVER_LOG_DEBUG("entry:"); MediaKeyErrorStatus status; - auto task = [&]() { status = createKeySessionInternal(sessionType, client, false, keySessionId); }; + auto task = [&]() { status = createKeySessionInternal(sessionType, client, keySessionId); }; m_mainThread->enqueueTaskAndWait(m_mainThreadClientId, task); return status; @@ -224,7 +224,7 @@ MediaKeyErrorStatus MediaKeysServerInternal::createKeySession(KeySessionType ses MediaKeyErrorStatus MediaKeysServerInternal::createKeySessionInternal(KeySessionType sessionType, std::weak_ptr client, - bool isLDL, int32_t &keySessionId) + int32_t &keySessionId) { int32_t keySessionIdTemp = generateSessionId(); std::unique_ptr mediaKeySession = diff --git a/media/server/service/source/CdmService.cpp b/media/server/service/source/CdmService.cpp index cdf6bc672..78ff7eebc 100644 --- a/media/server/service/source/CdmService.cpp +++ b/media/server/service/source/CdmService.cpp @@ -162,7 +162,7 @@ MediaKeyErrorStatus CdmService::generateRequest(int mediaKeysHandle, int32_t key RIALTO_SERVER_LOG_ERROR("Media keys handle: %d does not exists", mediaKeysHandle); return MediaKeyErrorStatus::FAIL; } - if (LimitedDurationLicense::NOT_SPECIFIED != ldlState) + if (LimitedDurationLicense::NOT_SPECIFIED != ldlState && m_sessionInfo.find(keySessionId) != m_sessionInfo.end()) { m_sessionInfo[keySessionId].isExtendedInterfaceUsed = true; } @@ -291,7 +291,10 @@ MediaKeyErrorStatus CdmService::setDrmHeader(int mediaKeysHandle, int32_t keySes RIALTO_SERVER_LOG_ERROR("Media keys handle: %d does not exists", mediaKeysHandle); return MediaKeyErrorStatus::FAIL; } - m_sessionInfo[keySessionId].isExtendedInterfaceUsed = true; + if (m_sessionInfo.find(keySessionId) != m_sessionInfo.end()) + { + m_sessionInfo[keySessionId].isExtendedInterfaceUsed = true; + } return mediaKeysIter->second->setDrmHeader(keySessionId, requestData); } @@ -508,7 +511,7 @@ MediaKeyErrorStatus CdmService::decrypt(int32_t keySessionId, GstBuffer *encrypt bool CdmService::isExtendedInterfaceUsed(int32_t keySessionId) { - RIALTO_SERVER_LOG_DEBUG("CdmService requested to check if key system is Netflix Playready, key session id: %d", + RIALTO_SERVER_LOG_DEBUG("CdmService requested to check if extended interface is used, key session id: %d", keySessionId); std::lock_guard lock{m_mediaKeysMutex}; @@ -532,7 +535,10 @@ MediaKeyErrorStatus CdmService::selectKeyId(int32_t keySessionId, const std::vec RIALTO_SERVER_LOG_ERROR("Media keys handle for mksId: %d does not exists", keySessionId); return MediaKeyErrorStatus::FAIL; } - m_sessionInfo[keySessionId].isExtendedInterfaceUsed = true; + if (m_sessionInfo.find(keySessionId) != m_sessionInfo.end()) + { + m_sessionInfo[keySessionId].isExtendedInterfaceUsed = true; + } return m_mediaKeys[mediaKeysHandleIter->second.mediaKeysHandle]->selectKeyId(keySessionId, keyId); } diff --git a/proto/mediakeysmodule.proto b/proto/mediakeysmodule.proto index dc66be2a7..204b85f48 100644 --- a/proto/mediakeysmodule.proto +++ b/proto/mediakeysmodule.proto @@ -203,6 +203,8 @@ message CreateKeySessionResponse { * @param[in] key_session_id The key session id for the session. * @param[in] init_data_type The init data type. * @param[in] init_data The init data. + * @param[in] ldlState The Limited Duration License state. Most of key systems do not need this parameter, + * so the default value is NOT_SPECIFIED. * * @retval an error status. */ diff --git a/tests/componenttests/server/tests/mediaKeys/MediaKeysTest.cpp b/tests/componenttests/server/tests/mediaKeys/MediaKeysTest.cpp index c954b8af5..def0de62d 100644 --- a/tests/componenttests/server/tests/mediaKeys/MediaKeysTest.cpp +++ b/tests/componenttests/server/tests/mediaKeys/MediaKeysTest.cpp @@ -42,8 +42,6 @@ class MediaKeysTest : public MediaKeysTestMethods void generateRequestFail(); void shouldFailToCreateKeySessionWhenMksIdIsWrong(); - - const std::vector m_kInitData{1, 2, 7}; }; void MediaKeysTest::willGenerateRequestFail() diff --git a/tests/componenttests/server/tests/mediaKeys/SessionReadyForDecryptionTest.cpp b/tests/componenttests/server/tests/mediaKeys/SessionReadyForDecryptionTest.cpp index 40ae4f487..b98e4802d 100644 --- a/tests/componenttests/server/tests/mediaKeys/SessionReadyForDecryptionTest.cpp +++ b/tests/componenttests/server/tests/mediaKeys/SessionReadyForDecryptionTest.cpp @@ -58,8 +58,6 @@ class SessionReadyForDecryptionTest : public virtual MediaKeysTestMethods void destroyMediaKeysRequest(); const std::vector kResponse{4, 1, 3}; - const std::vector m_kInitData{1, 2, 7}; - const std::vector m_kLicenseRequestMessage{'d', 'z', 'f'}; }; void SessionReadyForDecryptionTest::willGenerateRequestWidevine() diff --git a/tests/unittests/media/server/service/cdmService/CdmServiceTests.cpp b/tests/unittests/media/server/service/cdmService/CdmServiceTests.cpp index dca969496..a5f68acf9 100644 --- a/tests/unittests/media/server/service/cdmService/CdmServiceTests.cpp +++ b/tests/unittests/media/server/service/cdmService/CdmServiceTests.cpp @@ -130,6 +130,8 @@ TEST_F(CdmServiceTests, shouldGenerateRequestWithLdlEnabled) triggerSwitchToActiveSuccess(); mediaKeysFactoryWillCreateMediaKeys(); createMediaKeysShouldSucceed(); + mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); + createKeySessionShouldSucceed(); mediaKeysWillGenerateRequestLdlEnabledWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); generateRequestWithLdlEnabledShouldReturnStatus(firebolt::rialto::MediaKeyErrorStatus::OK); isExtendedInterfaceUsedShouldReturn(true); @@ -464,6 +466,8 @@ TEST_F(CdmServiceTests, shouldSetDrmHeader) triggerSwitchToActiveSuccess(); mediaKeysFactoryWillCreateMediaKeys(); createMediaKeysShouldSucceed(); + mediaKeysWillCreateKeySessionWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); + createKeySessionShouldSucceed(); mediaKeysWillSetDrmHeaderWithStatus(firebolt::rialto::MediaKeyErrorStatus::OK); setDrmHeaderShouldReturnStatus(firebolt::rialto::MediaKeyErrorStatus::OK); isExtendedInterfaceUsedShouldReturn(true);