Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions media/client/ipc/include/MediaKeysIpc.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,12 @@ class MediaKeysIpc : public IMediaKeys, public IpcModule

bool containsKey(int32_t keySessionId, const std::vector<uint8_t> &keyId) override;

MediaKeyErrorStatus createKeySession(KeySessionType sessionType, std::weak_ptr<IMediaKeysClient> client, bool isLDL,
MediaKeyErrorStatus createKeySession(KeySessionType sessionType, std::weak_ptr<IMediaKeysClient> client,
int32_t &keySessionId) override;

MediaKeyErrorStatus generateRequest(int32_t keySessionId, InitDataType initDataType,
const std::vector<uint8_t> &initData) override;
const std::vector<uint8_t> &initData,
const LimitedDurationLicense &ldlState) override;

MediaKeyErrorStatus loadSession(int32_t keySessionId) override;

Expand Down
25 changes: 22 additions & 3 deletions media/client/ipc/source/MediaKeysIpc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,7 @@ bool MediaKeysIpc::containsKey(int32_t keySessionId, const std::vector<uint8_t>
}

MediaKeyErrorStatus MediaKeysIpc::createKeySession(KeySessionType sessionType, std::weak_ptr<IMediaKeysClient> client,
bool isLDL, int32_t &keySessionId)
int32_t &keySessionId)
{
if (!reattachChannelIfRequired())
{
Expand Down Expand Up @@ -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
Expand All @@ -387,7 +386,8 @@ MediaKeyErrorStatus MediaKeysIpc::createKeySession(KeySessionType sessionType, s
}

MediaKeyErrorStatus MediaKeysIpc::generateRequest(int32_t keySessionId, InitDataType initDataType,
const std::vector<uint8_t> &initData)
const std::vector<uint8_t> &initData,
const LimitedDurationLicense &ldlState)
{
if (!reattachChannelIfRequired())
{
Expand Down Expand Up @@ -415,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("Received 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++)
{
Expand Down
5 changes: 3 additions & 2 deletions media/client/main/include/MediaKeys.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,11 +79,12 @@ class MediaKeys : public IMediaKeys

bool containsKey(int32_t keySessionId, const std::vector<uint8_t> &keyId) override;

MediaKeyErrorStatus createKeySession(KeySessionType sessionType, std::weak_ptr<IMediaKeysClient> client, bool isLDL,
MediaKeyErrorStatus createKeySession(KeySessionType sessionType, std::weak_ptr<IMediaKeysClient> client,
int32_t &keySessionId) override;

MediaKeyErrorStatus generateRequest(int32_t keySessionId, InitDataType initDataType,
const std::vector<uint8_t> &initData) override;
const std::vector<uint8_t> &initData,
const LimitedDurationLicense &ldlState) override;

MediaKeyErrorStatus loadSession(int32_t keySessionId) override;

Expand Down
9 changes: 5 additions & 4 deletions media/client/main/source/MediaKeys.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -115,11 +115,11 @@ bool MediaKeys::containsKey(int32_t keySessionId, const std::vector<uint8_t> &ke
}

MediaKeyErrorStatus MediaKeys::createKeySession(KeySessionType sessionType, std::weak_ptr<IMediaKeysClient> 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);
Expand All @@ -128,11 +128,12 @@ MediaKeyErrorStatus MediaKeys::createKeySession(KeySessionType sessionType, std:
}

MediaKeyErrorStatus MediaKeys::generateRequest(int32_t keySessionId, InitDataType initDataType,
const std::vector<uint8_t> &initData)
const std::vector<uint8_t> &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)
Expand Down
10 changes: 6 additions & 4 deletions media/public/include/IMediaKeys.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<IMediaKeysClient> client,
bool isLDL, int32_t &keySessionId) = 0;
int32_t &keySessionId) = 0;

/**
* @brief Generates a licence request.
Expand All @@ -130,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<uint8_t> &initData) = 0;
virtual MediaKeyErrorStatus
generateRequest(int32_t keySessionId, InitDataType initDataType, const std::vector<uint8_t> &initData,
const LimitedDurationLicense &ldlState = LimitedDurationLicense::NOT_SPECIFIED) = 0;

/**
* @brief Loads an existing key session
Expand Down
10 changes: 10 additions & 0 deletions media/public/include/MediaCommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,16 @@ struct PlaybackInfo
int64_t currentPosition{-1}; /**< The current playback position */
double volume{1.0}; /**< The current volume */
};

/**
* @brief Limited duration license state.
*/
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_
2 changes: 1 addition & 1 deletion media/server/gstplayer/source/GstDecryptor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
27 changes: 22 additions & 5 deletions media/server/ipc/source/MediaKeysModuleService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -262,7 +278,7 @@ void MediaKeysModuleService::createKeySession(::google::protobuf::RpcController
m_cdmService.createKeySession(request->media_keys_handle(), convertKeySessionType(request->session_type()),
std::make_shared<MediaKeysClient>(request->media_keys_handle(),
ipcController->getClient()),
request->is_ldl(), keySessionId);
keySessionId);
if (MediaKeyErrorStatus::OK == status)
{
response->set_key_session_id(keySessionId);
Expand All @@ -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<std::uint8_t>{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<std::uint8_t>{request->init_data().begin(), request->init_data().end()},
covertLimitedDurationLicense(request->ldl_state()));
response->set_error_status(convertMediaKeyErrorStatus(status));
done->Run();
}
Expand Down
15 changes: 4 additions & 11 deletions media/server/main/include/IMediaKeySession.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<IMediaKeySession>
createMediaKeySession(const std::string &keySystem, int32_t keySessionId,
const firebolt::rialto::wrappers::IOcdmSystem &ocdmSystem, KeySessionType sessionType,
std::weak_ptr<IMediaKeysClient> client, bool isLDL) const = 0;
std::weak_ptr<IMediaKeysClient> client) const = 0;
};

/**
Expand All @@ -84,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<uint8_t> &initData) = 0;

virtual MediaKeyErrorStatus generateRequest(InitDataType initDataType, const std::vector<uint8_t> &initData,
const LimitedDurationLicense &ldlState) = 0;
/**
* @brief Loads the existing key session.
*
Expand Down Expand Up @@ -179,13 +179,6 @@ class IMediaKeySession
* @retval an error status.
*/
virtual MediaKeyErrorStatus selectKeyId(const std::vector<uint8_t> &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

Expand Down
31 changes: 17 additions & 14 deletions media/server/main/include/MediaKeySession.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,7 @@ class MediaKeySessionFactory : public IMediaKeySessionFactory
std::unique_ptr<IMediaKeySession> createMediaKeySession(const std::string &keySystem, int32_t keySessionId,
const firebolt::rialto::wrappers::IOcdmSystem &ocdmSystem,
KeySessionType sessionType,
std::weak_ptr<IMediaKeysClient> client,
bool isLDL) const override;
std::weak_ptr<IMediaKeysClient> client) const override;
};

/**
Expand All @@ -61,20 +60,19 @@ 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<IMediaKeysClient> client, bool isLDL,
const std::shared_ptr<IMainThreadFactory> &mainThreadFactory);
std::weak_ptr<IMediaKeysClient> client, const std::shared_ptr<IMainThreadFactory> &mainThreadFactory);

/**
* @brief Virtual destructor.
*/
virtual ~MediaKeySession();

MediaKeyErrorStatus generateRequest(InitDataType initDataType, const std::vector<uint8_t> &initData) override;
MediaKeyErrorStatus generateRequest(InitDataType initDataType, const std::vector<uint8_t> &initData,
const LimitedDurationLicense &ldlState) override;

MediaKeyErrorStatus loadSession() override;

Expand All @@ -96,8 +94,6 @@ class MediaKeySession : public IMediaKeySession, public firebolt::rialto::wrappe

MediaKeyErrorStatus selectKeyId(const std::vector<uint8_t> &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;
Expand Down Expand Up @@ -137,11 +133,6 @@ class MediaKeySession : public IMediaKeySession, public firebolt::rialto::wrappe
*/
std::shared_ptr<IMainThread> m_mainThread;

/**
* @brief Is the session LDL.
*/
const bool m_kIsLDL;

/**
* @brief Is the ocdm session constructed.
*/
Expand Down Expand Up @@ -187,12 +178,24 @@ 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<uint8_t> 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.
Expand Down
Loading
Loading