Commit 8f501160 authored by jrummell's avatar jrummell Committed by Commit bot

Add support for cdm::ContentDecryptionModule_8, remove CDM_6

BUG=450861
TEST=existing EME layout tests pass

Review URL: https://codereview.chromium.org/1023003002

Cr-Commit-Position: refs/heads/master@{#321617}
parent 39f970af
......@@ -274,7 +274,7 @@ deps = {
Var('chromium_git') + '/chromium/deps/opus.git' + '@' + 'cae696156f1e60006e39821e79a1811ae1933c69',
'src/media/cdm/ppapi/api':
Var('chromium_git') + '/chromium/cdm.git' + '@' + '7b7c6cc620e13c8057b4b6bff19e5955feb2c8fa', # from svn revision 293617
Var('chromium_git') + '/chromium/cdm.git' + '@' + '7377023e384f296cbb27644eb2c485275f1f92e8', # from svn revision 294518
'src/third_party/mesa/src':
Var('chromium_git') + '/chromium/deps/mesa.git' + '@' + '071d25db04c23821a12a8b260ab9d96a097402f0',
......
......@@ -232,6 +232,19 @@ cdm::SessionType PpSessionTypeToCdmSessionType(PP_SessionType session_type) {
return cdm::kTemporary;
}
cdm::InitDataType InitDataTypeToCdmInitDataType(
const std::string& init_data_type) {
if (init_data_type == "cenc")
return cdm::kCenc;
if (init_data_type == "webm")
return cdm::kWebM;
if (init_data_type == "keyids")
return cdm::kKeyIds;
PP_NOTREACHED();
return cdm::kKeyIds;
}
PP_CdmExceptionCode CdmExceptionTypeToPpCdmExceptionType(cdm::Error error) {
switch (error) {
case cdm::kNotSupportedError:
......@@ -278,6 +291,10 @@ PP_CdmKeyStatus CdmKeyStatusToPpKeyStatus(cdm::KeyStatus status) {
return PP_CDMKEYSTATUS_EXPIRED;
case cdm::kOutputNotAllowed:
return PP_CDMKEYSTATUS_OUTPUTNOTALLOWED;
case cdm::kOutputDownscaled:
return PP_CDMKEYSTATUS_OUTPUTDOWNSCALED;
case cdm::kStatusPending:
return PP_CDMKEYSTATUS_STATUSPENDING;
}
PP_NOTREACHED();
......@@ -340,6 +357,8 @@ void CdmAdapter::Initialize(const std::string& key_system,
bool allow_distinctive_identifier,
bool allow_persistent_state) {
PP_DCHECK(!key_system.empty());
// TODO(jrummell): Remove this check when CDM creation is asynchronous.
// http://crbug.com/469003
PP_DCHECK(key_system_.empty() || (key_system_ == key_system && cdm_));
#if defined(CHECK_DOCUMENT_URL)
......@@ -368,6 +387,7 @@ void CdmAdapter::Initialize(const std::string& key_system,
key_system_ = key_system;
allow_distinctive_identifier_ = allow_distinctive_identifier;
allow_persistent_state_ = allow_persistent_state;
cdm_->Initialize(allow_distinctive_identifier, allow_persistent_state);
}
void CdmAdapter::SetServerCertificate(uint32_t promise_id,
......@@ -399,6 +419,8 @@ void CdmAdapter::SetServerCertificate(uint32_t promise_id,
promise_id, server_certificate_ptr, server_certificate_size);
}
// TODO(jrummell): |init_data_type| should be an enum all the way through
// Chromium. http://crbug.com/469228
void CdmAdapter::CreateSessionAndGenerateRequest(
uint32_t promise_id,
PP_SessionType session_type,
......@@ -419,7 +441,7 @@ void CdmAdapter::CreateSessionAndGenerateRequest(
cdm_->CreateSessionAndGenerateRequest(
promise_id, PpSessionTypeToCdmSessionType(session_type),
init_data_type.data(), init_data_type.size(),
InitDataTypeToCdmInitDataType(init_data_type),
static_cast<const uint8_t*>(init_data.Map()), init_data.ByteLength());
}
......@@ -678,14 +700,6 @@ void CdmAdapter::OnResolvePromise(uint32_t promise_id) {
&CdmAdapter::SendPromiseResolvedInternal, promise_id));
}
// cdm::Host_6 only
void CdmAdapter::OnResolveKeyIdsPromise(uint32_t promise_id,
const cdm::BinaryData* usable_key_ids,
uint32_t usable_key_ids_size) {
// This should never be called as GetUsableKeyIds() has been removed.
PP_NOTREACHED();
}
void CdmAdapter::OnRejectPromise(uint32_t promise_id,
cdm::Error error,
uint32_t system_code,
......@@ -716,7 +730,6 @@ void CdmAdapter::RejectPromise(uint32_t promise_id,
SessionError(error, system_code, error_message)));
}
// cdm::Host_7 only.
void CdmAdapter::OnSessionMessage(const char* session_id,
uint32_t session_id_size,
cdm::MessageType message_type,
......@@ -738,27 +751,6 @@ void CdmAdapter::OnSessionMessage(const char* session_id,
std::string(legacy_destination_url, legacy_destination_url_size))));
}
// cdm::Host_6 only.
void CdmAdapter::OnSessionMessage(const char* session_id,
uint32_t session_id_size,
const char* message,
uint32_t message_size,
const char* destination_url,
uint32_t destination_url_size) {
// |destination_url| is no longer passed to unprefixed EME applications,
// so it will be dropped. All messages will appear as license renewals
// if |destination_url| is provided, license request if not.
cdm::MessageType message_type = (destination_url_size > 0)
? cdm::MessageType::kLicenseRenewal
: cdm::MessageType::kLicenseRequest;
PostOnMain(callback_factory_.NewCallback(
&CdmAdapter::SendSessionMessageInternal,
SessionMessage(std::string(session_id, session_id_size), message_type,
message, message_size,
std::string(destination_url, destination_url_size))));
}
// cdm::Host_7 only.
void CdmAdapter::OnSessionKeysChange(const char* session_id,
uint32_t session_id_size,
bool has_additional_usable_key,
......@@ -790,16 +782,6 @@ void CdmAdapter::OnSessionKeysChange(const char* session_id,
key_information));
}
// cdm::Host_6 only.
void CdmAdapter::OnSessionUsableKeysChange(const char* session_id,
uint32_t session_id_size,
bool has_additional_usable_key) {
PostOnMain(callback_factory_.NewCallback(
&CdmAdapter::SendSessionKeysChangeInternal,
std::string(session_id, session_id_size), has_additional_usable_key,
std::vector<PP_KeyInformation>()));
}
void CdmAdapter::OnExpirationChange(const char* session_id,
uint32_t session_id_size,
cdm::Time new_expiry_time) {
......@@ -815,29 +797,17 @@ void CdmAdapter::OnSessionClosed(const char* session_id,
std::string(session_id, session_id_size)));
}
// cdm::Host_6 only.
void CdmAdapter::OnSessionError(const char* session_id,
uint32_t session_id_size,
cdm::Error error,
uint32_t system_code,
const char* error_message,
uint32_t error_message_size) {
PostOnMain(callback_factory_.NewCallback(
&CdmAdapter::SendSessionErrorInternal,
std::string(session_id, session_id_size),
SessionError(error, system_code,
std::string(error_message, error_message_size))));
}
// cdm::Host_7 only.
void CdmAdapter::OnLegacySessionError(const char* session_id,
uint32_t session_id_size,
cdm::Error error,
uint32_t system_code,
const char* error_message,
uint32_t error_message_size) {
OnSessionError(session_id, session_id_size, error, system_code, error_message,
error_message_size);
PostOnMain(callback_factory_.NewCallback(
&CdmAdapter::SendSessionErrorInternal,
std::string(session_id, session_id_size),
SessionError(error, system_code,
std::string(error_message, error_message_size))));
}
// Helpers to pass the event to Pepper.
......@@ -1346,7 +1316,7 @@ void* GetCdmHost(int host_interface_version, void* user_data) {
return NULL;
static_assert(
cdm::ContentDecryptionModule::Host::kVersion == cdm::Host_7::kVersion,
cdm::ContentDecryptionModule::Host::kVersion == cdm::Host_8::kVersion,
"update the code below");
// Ensure IsSupportedCdmHostVersion matches implementation of this function.
......@@ -1356,22 +1326,22 @@ void* GetCdmHost(int host_interface_version, void* user_data) {
PP_DCHECK(
// Future version is not supported.
!IsSupportedCdmHostVersion(cdm::Host_7::kVersion + 1) &&
!IsSupportedCdmHostVersion(cdm::Host_8::kVersion + 1) &&
// Current version is supported.
IsSupportedCdmHostVersion(cdm::Host_7::kVersion) &&
IsSupportedCdmHostVersion(cdm::Host_8::kVersion) &&
// Include all previous supported versions (if any) here.
IsSupportedCdmHostVersion(cdm::Host_6::kVersion) &&
IsSupportedCdmHostVersion(cdm::Host_7::kVersion) &&
// One older than the oldest supported version is not supported.
!IsSupportedCdmHostVersion(cdm::Host_6::kVersion - 1));
!IsSupportedCdmHostVersion(cdm::Host_7::kVersion - 1));
PP_DCHECK(IsSupportedCdmHostVersion(host_interface_version));
CdmAdapter* cdm_adapter = static_cast<CdmAdapter*>(user_data);
CDM_DLOG() << "Create CDM Host with version " << host_interface_version;
switch (host_interface_version) {
case cdm::Host_8::kVersion:
return static_cast<cdm::Host_8*>(cdm_adapter);
case cdm::Host_7::kVersion:
return static_cast<cdm::Host_7*>(cdm_adapter);
case cdm::Host_6::kVersion:
return static_cast<cdm::Host_6*>(cdm_adapter);
default:
PP_NOTREACHED();
return NULL;
......
......@@ -37,8 +37,8 @@ void* GetCdmHost(int host_interface_version, void* user_data);
// Content Decryption Module (CDM).
class CdmAdapter : public pp::Instance,
public pp::ContentDecryptor_Private,
public cdm::Host_6,
public cdm::Host_7 {
public cdm::Host_7,
public cdm::Host_8 {
public:
CdmAdapter(PP_Instance instance, pp::Module* module);
virtual ~CdmAdapter();
......@@ -84,7 +84,7 @@ class CdmAdapter : public pp::Instance,
pp::Buffer_Dev encrypted_buffer,
const PP_EncryptedBlockInfo& encrypted_block_info) override;
// cdm::Host_6 and cdm::Host_7 implementation.
// cdm::Host_7 and cdm::Host_8 implementation.
cdm::Buffer* Allocate(uint32_t capacity) override;
void SetTimer(int64_t delay_ms, void* context) override;
cdm::Time GetCurrentWallTime() override;
......@@ -97,22 +97,6 @@ class CdmAdapter : public pp::Instance,
uint32_t system_code,
const char* error_message,
uint32_t error_message_size) override;
void OnExpirationChange(const char* session_id,
uint32_t session_id_size,
cdm::Time new_expiry_time) override;
void OnSessionClosed(const char* session_id,
uint32_t session_id_size) override;
void SendPlatformChallenge(const char* service_id,
uint32_t service_id_size,
const char* challenge,
uint32_t challenge_size) override;
void EnableOutputProtection(uint32_t desired_protection_mask) override;
void QueryOutputProtectionStatus() override;
void OnDeferredInitializationDone(cdm::StreamType stream_type,
cdm::Status decoder_status) override;
cdm::FileIO* CreateFileIO(cdm::FileIOClient* client) override;
// cdm::Host_7 implementation.
void OnSessionMessage(const char* session_id,
uint32_t session_id_size,
cdm::MessageType message_type,
......@@ -125,32 +109,26 @@ class CdmAdapter : public pp::Instance,
bool has_additional_usable_key,
const cdm::KeyInformation* keys_info,
uint32_t keys_info_count) override;
void OnExpirationChange(const char* session_id,
uint32_t session_id_size,
cdm::Time new_expiry_time) override;
void OnSessionClosed(const char* session_id,
uint32_t session_id_size) override;
void OnLegacySessionError(const char* session_id,
uint32_t session_id_size,
cdm::Error error,
uint32_t system_code,
const char* error_message,
uint32_t error_message_size) override;
// cdm::Host_6 implementation.
void OnResolveKeyIdsPromise(uint32_t promise_id,
const cdm::BinaryData* usable_key_ids,
uint32_t usable_key_ids_size) override;
void OnSessionMessage(const char* session_id,
uint32_t session_id_size,
const char* message,
uint32_t message_size,
const char* destination_url,
uint32_t destination_url_size) override;
void OnSessionUsableKeysChange(const char* session_id,
uint32_t session_id_size,
bool has_additional_usable_key) override;
void OnSessionError(const char* session_id,
uint32_t session_id_size,
cdm::Error error,
uint32_t system_code,
const char* error_message,
uint32_t error_message_size) override;
void SendPlatformChallenge(const char* service_id,
uint32_t service_id_size,
const char* challenge,
uint32_t challenge_size) override;
void EnableOutputProtection(uint32_t desired_protection_mask) override;
void QueryOutputProtectionStatus() override;
void OnDeferredInitializationDone(cdm::StreamType stream_type,
cdm::Status decoder_status) override;
cdm::FileIO* CreateFileIO(cdm::FileIOClient* client) override;
private:
// These are reported to UMA server. Do not change the existing values!
......
......@@ -42,13 +42,14 @@ class CdmWrapper {
virtual ~CdmWrapper() {};
virtual void Initialize(bool allow_distinctive_identifier,
bool allow_persistent_state) = 0;
virtual void SetServerCertificate(uint32_t promise_id,
const uint8_t* server_certificate_data,
uint32_t server_certificate_data_size) = 0;
virtual void CreateSessionAndGenerateRequest(uint32_t promise_id,
cdm::SessionType session_type,
const char* init_data_type,
uint32_t init_data_type_size,
cdm::InitDataType init_data_type,
const uint8_t* init_data,
uint32_t init_data_size) = 0;
virtual void LoadSession(uint32_t promise_id,
......@@ -119,6 +120,11 @@ class CdmWrapperImpl : public CdmWrapper {
cdm_->Destroy();
}
virtual void Initialize(bool allow_distinctive_identifier,
bool allow_persistent_state) override {
cdm_->Initialize(allow_distinctive_identifier, allow_persistent_state);
}
virtual void SetServerCertificate(
uint32_t promise_id,
const uint8_t* server_certificate_data,
......@@ -130,13 +136,11 @@ class CdmWrapperImpl : public CdmWrapper {
virtual void CreateSessionAndGenerateRequest(
uint32_t promise_id,
cdm::SessionType session_type,
const char* init_data_type,
uint32_t init_data_type_size,
cdm::InitDataType init_data_type,
const uint8_t* init_data,
uint32_t init_data_size) override {
cdm_->CreateSessionAndGenerateRequest(promise_id, session_type,
init_data_type, init_data_type_size,
init_data, init_data_size);
cdm_->CreateSessionAndGenerateRequest(
promise_id, session_type, init_data_type, init_data, init_data_size);
}
virtual void LoadSession(uint32_t promise_id,
......@@ -229,42 +233,38 @@ class CdmWrapperImpl : public CdmWrapper {
DISALLOW_COPY_AND_ASSIGN(CdmWrapperImpl);
};
// Overrides for the cdm::Host_6 methods.
// TODO(jrummell): Remove these once Host_6 interface is removed.
// Overrides for the cdm::Host_7 methods.
// TODO(jrummell): Remove these once Host_7 interface is removed.
template <>
void CdmWrapperImpl<cdm::ContentDecryptionModule_6>::
void CdmWrapperImpl<cdm::ContentDecryptionModule_7>::Initialize(
bool allow_distinctive_identifier,
bool allow_persistent_state) {
}
template <>
void CdmWrapperImpl<cdm::ContentDecryptionModule_7>::
CreateSessionAndGenerateRequest(uint32_t promise_id,
cdm::SessionType session_type,
const char* init_data_type,
uint32_t init_data_type_size,
cdm::InitDataType init_data_type,
const uint8_t* init_data,
uint32_t init_data_size) {
cdm_->CreateSession(promise_id, init_data_type, init_data_type_size,
init_data, init_data_size, session_type);
}
template <>
void CdmWrapperImpl<cdm::ContentDecryptionModule_6>::LoadSession(
uint32_t promise_id,
cdm::SessionType session_type,
const char* session_id,
uint32_t session_id_size) {
cdm_->LoadSession(promise_id, session_id, session_id_size);
}
template <>
void CdmWrapperImpl<cdm::ContentDecryptionModule_6>::
OnQueryOutputProtectionStatus(cdm::QueryResult result,
uint32_t link_mask,
uint32_t output_protection_mask) {
if (result == cdm::kQuerySucceeded) {
cdm_->OnQueryOutputProtectionStatus(link_mask, output_protection_mask);
return;
std::string init_data_type_as_string = "unknown";
switch (init_data_type) {
case cdm::kCenc:
init_data_type_as_string = "cenc";
break;
case cdm::kKeyIds:
init_data_type_as_string = "keyids";
break;
case cdm::kWebM:
init_data_type_as_string = "webm";
break;
}
// Invalid results, so return 0, 0 to indicate failure.
cdm_->OnQueryOutputProtectionStatus(0, 0);
cdm_->CreateSessionAndGenerateRequest(
promise_id, session_type, &init_data_type_as_string[0],
init_data_type_as_string.length(), init_data, init_data_size);
}
CdmWrapper* CdmWrapper::Create(const char* key_system,
......@@ -272,7 +272,7 @@ CdmWrapper* CdmWrapper::Create(const char* key_system,
GetCdmHostFunc get_cdm_host_func,
void* user_data) {
static_assert(cdm::ContentDecryptionModule::kVersion ==
cdm::ContentDecryptionModule_7::kVersion,
cdm::ContentDecryptionModule_8::kVersion,
"update the code below");
// Ensure IsSupportedCdmInterfaceVersion() matches this implementation.
......@@ -280,13 +280,13 @@ CdmWrapper* CdmWrapper::Create(const char* key_system,
// If this check fails, update this function and DCHECK or update
// IsSupportedCdmInterfaceVersion().
PP_DCHECK(!IsSupportedCdmInterfaceVersion(
cdm::ContentDecryptionModule_7::kVersion + 1) &&
cdm::ContentDecryptionModule_8::kVersion + 1) &&
IsSupportedCdmInterfaceVersion(
cdm::ContentDecryptionModule_7::kVersion) &&
cdm::ContentDecryptionModule_8::kVersion) &&
IsSupportedCdmInterfaceVersion(
cdm::ContentDecryptionModule_6::kVersion) &&
cdm::ContentDecryptionModule_7::kVersion) &&
!IsSupportedCdmInterfaceVersion(
cdm::ContentDecryptionModule_6::kVersion - 1));
cdm::ContentDecryptionModule_7::kVersion - 1));
// Try to create the CDM using the latest CDM interface version.
CdmWrapper* cdm_wrapper =
......@@ -296,7 +296,7 @@ CdmWrapper* CdmWrapper::Create(const char* key_system,
// If |cdm_wrapper| is NULL, try to create the CDM using older supported
// versions of the CDM interface here.
if (!cdm_wrapper) {
cdm_wrapper = CdmWrapperImpl<cdm::ContentDecryptionModule_6>::Create(
cdm_wrapper = CdmWrapperImpl<cdm::ContentDecryptionModule_7>::Create(
key_system, key_system_size, get_cdm_host_func, user_data);
}
......@@ -308,7 +308,7 @@ CdmWrapper* CdmWrapper::Create(const char* key_system,
// does not have.
// Also update supported_cdm_versions.h.
static_assert(cdm::ContentDecryptionModule::kVersion ==
cdm::ContentDecryptionModule_7::kVersion,
cdm::ContentDecryptionModule_8::kVersion,
"ensure cdm wrapper templates have old version support");
} // namespace media
......
......@@ -171,8 +171,6 @@ static media::MediaKeys::SessionType ConvertSessionType(
}
cdm::KeyStatus ConvertKeyStatus(media::CdmKeyInformation::KeyStatus status) {
// TODO(jrummell): Update OUTPUT_DOWNSCALED and KEY_STATUS_PENDING once CDM
// interface supports them. http://crbug.com/450861
switch (status) {
case media::CdmKeyInformation::KeyStatus::USABLE:
return cdm::kUsable;
......@@ -183,9 +181,9 @@ cdm::KeyStatus ConvertKeyStatus(media::CdmKeyInformation::KeyStatus status) {
case media::CdmKeyInformation::KeyStatus::OUTPUT_NOT_ALLOWED:
return cdm::kOutputNotAllowed;
case media::CdmKeyInformation::KeyStatus::OUTPUT_DOWNSCALED:
return cdm::kInternalError;
return cdm::kOutputDownscaled;
case media::CdmKeyInformation::KeyStatus::KEY_STATUS_PENDING:
return cdm::kInternalError;
return cdm::kStatusPending;
}
NOTIMPLEMENTED();
return cdm::kInternalError;
......
......@@ -21,12 +21,12 @@ bool IsSupportedCdmModuleVersion(int version) {
bool IsSupportedCdmInterfaceVersion(int version) {
static_assert(cdm::ContentDecryptionModule::kVersion ==
cdm::ContentDecryptionModule_7::kVersion,
cdm::ContentDecryptionModule_8::kVersion,
"update the code below");
switch(version) {
// Supported versions in decreasing order.
case cdm::ContentDecryptionModule_8::kVersion:
case cdm::ContentDecryptionModule_7::kVersion:
case cdm::ContentDecryptionModule_6::kVersion:
return true;
default:
return false;
......@@ -35,12 +35,12 @@ bool IsSupportedCdmInterfaceVersion(int version) {
bool IsSupportedCdmHostVersion(int version) {
static_assert(cdm::ContentDecryptionModule::Host::kVersion ==
cdm::ContentDecryptionModule_7::Host::kVersion,
cdm::ContentDecryptionModule_8::Host::kVersion,
"update the code below");
switch(version) {
// Supported versions in decreasing order.
case cdm::Host_8::kVersion:
case cdm::Host_7::kVersion:
case cdm::Host_6::kVersion:
return true;
default:
return false;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment