summaryrefslogtreecommitdiff
path: root/chromium/media/cdm
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2018-08-28 15:28:34 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2018-08-28 13:54:51 +0000
commit2a19c63448c84c1805fb1a585c3651318bb86ca7 (patch)
treeeb17888e8531aa6ee5e85721bd553b832a7e5156 /chromium/media/cdm
parentb014812705fc80bff0a5c120dfcef88f349816dc (diff)
downloadqtwebengine-chromium-2a19c63448c84c1805fb1a585c3651318bb86ca7.tar.gz
BASELINE: Update Chromium to 69.0.3497.70
Change-Id: I2b7b56e4e7a8b26656930def0d4575dc32b900a0 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/media/cdm')
-rw-r--r--chromium/media/cdm/BUILD.gn6
-rw-r--r--chromium/media/cdm/aes_decryptor.cc6
-rw-r--r--chromium/media/cdm/aes_decryptor.h2
-rw-r--r--chromium/media/cdm/aes_decryptor_unittest.cc30
-rw-r--r--chromium/media/cdm/api/content_decryption_module.h2
-rw-r--r--chromium/media/cdm/api/content_decryption_module_proxy.h2
-rw-r--r--chromium/media/cdm/cdm_adapter.cc18
-rw-r--r--chromium/media/cdm/cdm_adapter_unittest.cc4
-rw-r--r--chromium/media/cdm/cdm_proxy.h8
-rw-r--r--chromium/media/cdm/cenc_decryptor_unittest.cc30
-rw-r--r--chromium/media/cdm/json_web_key.cc28
-rw-r--r--chromium/media/cdm/json_web_key_unittest.cc42
-rw-r--r--chromium/media/cdm/library_cdm/clear_key_cdm/BUILD.gn5
-rw-r--r--chromium/media/cdm/library_cdm/clear_key_cdm/cdm_proxy_handler.cc (renamed from chromium/media/cdm/library_cdm/clear_key_cdm/cdm_proxy_test.cc)51
-rw-r--r--chromium/media/cdm/library_cdm/clear_key_cdm/cdm_proxy_handler.h (renamed from chromium/media/cdm/library_cdm/clear_key_cdm/cdm_proxy_test.h)30
-rw-r--r--chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm.cc80
-rw-r--r--chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm.h10
-rw-r--r--chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm_proxy.cc54
-rw-r--r--chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm_proxy.h2
-rw-r--r--chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_persistent_session_cdm.cc7
20 files changed, 235 insertions, 182 deletions
diff --git a/chromium/media/cdm/BUILD.gn b/chromium/media/cdm/BUILD.gn
index f3dbef75fb6..deff5005c73 100644
--- a/chromium/media/cdm/BUILD.gn
+++ b/chromium/media/cdm/BUILD.gn
@@ -98,12 +98,6 @@ source_set("cdm") {
"cdm_host_files.cc",
"cdm_host_files.h",
]
- deps += [
- # Needed for finding CDM path from CDM adapter path.
- # TODO(xhwang): Remove this dependency when CDM adapter is deprecated.
- # See http://crbug.com/403462
- "//third_party/widevine/cdm:headers",
- ]
}
}
}
diff --git a/chromium/media/cdm/aes_decryptor.cc b/chromium/media/cdm/aes_decryptor.cc
index b1a95211ef6..2a8c76b43c2 100644
--- a/chromium/media/cdm/aes_decryptor.cc
+++ b/chromium/media/cdm/aes_decryptor.cc
@@ -417,7 +417,7 @@ void AesDecryptor::RemoveSession(const std::string& session_id,
// Let message be a message containing or reflecting the record
// of license destruction.
std::vector<uint8_t> message;
- if (it->second != CdmSessionType::TEMPORARY_SESSION) {
+ if (it->second != CdmSessionType::kTemporary) {
// The license release message is specified in the spec:
// https://w3c.github.io/encrypted-media/#clear-key-release-format.
KeyIdList key_ids;
@@ -486,6 +486,8 @@ void AesDecryptor::RegisterNewKeyCB(StreamType stream_type,
void AesDecryptor::Decrypt(StreamType stream_type,
scoped_refptr<DecoderBuffer> encrypted,
const DecryptCB& decrypt_cb) {
+ DVLOG(3) << __func__ << ": " << encrypted->AsHumanReadableString();
+
if (!encrypted->decrypt_config()) {
// If there is no DecryptConfig, then the data is unencrypted so return it
// immediately.
@@ -575,7 +577,7 @@ std::string AesDecryptor::GetSessionStateAsJWK(const std::string& session_id) {
}
}
}
- return GenerateJWKSet(keys, CdmSessionType::PERSISTENT_LICENSE_SESSION);
+ return GenerateJWKSet(keys, CdmSessionType::kPersistentLicense);
}
bool AesDecryptor::AddDecryptionKey(const std::string& session_id,
diff --git a/chromium/media/cdm/aes_decryptor.h b/chromium/media/cdm/aes_decryptor.h
index 943e76d87cc..3c6cfcb873d 100644
--- a/chromium/media/cdm/aes_decryptor.h
+++ b/chromium/media/cdm/aes_decryptor.h
@@ -85,7 +85,9 @@ class MEDIA_EXPORT AesDecryptor : public ContentDecryptionModule,
void DeinitializeDecoder(StreamType stream_type) override;
private:
+ // Testing classes that needs to manipulate internal states for testing.
friend class ClearKeyPersistentSessionCdm;
+ friend class ClearKeyCdmProxy;
// Internally this class supports persistent license type sessions so that
// it can be used by ClearKeyPersistentSessionCdm. The following methods
diff --git a/chromium/media/cdm/aes_decryptor_unittest.cc b/chromium/media/cdm/aes_decryptor_unittest.cc
index cb06e066713..efeaee1f715 100644
--- a/chromium/media/cdm/aes_decryptor_unittest.cc
+++ b/chromium/media/cdm/aes_decryptor_unittest.cc
@@ -367,7 +367,7 @@ class AesDecryptorTest : public testing::TestWithParam<TestType> {
DCHECK(!key_id.empty());
EXPECT_CALL(cdm_client_,
OnSessionMessage(NotEmpty(), _, IsJSONDictionary()));
- cdm_->CreateSessionAndGenerateRequest(CdmSessionType::TEMPORARY_SESSION,
+ cdm_->CreateSessionAndGenerateRequest(CdmSessionType::kTemporary,
EmeInitDataType::WEBM, key_id,
CreateSessionPromise(RESOLVED));
// This expects the promise to be called synchronously, which is the case
@@ -519,13 +519,13 @@ class AesDecryptorTest : public testing::TestWithParam<TestType> {
TEST_P(AesDecryptorTest, CreateSessionWithEmptyInitData) {
cdm_->CreateSessionAndGenerateRequest(
- CdmSessionType::TEMPORARY_SESSION, EmeInitDataType::WEBM,
- std::vector<uint8_t>(), CreateSessionPromise(REJECTED));
+ CdmSessionType::kTemporary, EmeInitDataType::WEBM, std::vector<uint8_t>(),
+ CreateSessionPromise(REJECTED));
cdm_->CreateSessionAndGenerateRequest(
- CdmSessionType::TEMPORARY_SESSION, EmeInitDataType::CENC,
- std::vector<uint8_t>(), CreateSessionPromise(REJECTED));
+ CdmSessionType::kTemporary, EmeInitDataType::CENC, std::vector<uint8_t>(),
+ CreateSessionPromise(REJECTED));
cdm_->CreateSessionAndGenerateRequest(
- CdmSessionType::TEMPORARY_SESSION, EmeInitDataType::KEYIDS,
+ CdmSessionType::kTemporary, EmeInitDataType::KEYIDS,
std::vector<uint8_t>(), CreateSessionPromise(REJECTED));
}
@@ -534,41 +534,41 @@ TEST_P(AesDecryptorTest, CreateSessionWithVariousLengthInitData_WebM) {
init_data.resize(1);
EXPECT_CALL(cdm_client_, OnSessionMessage(NotEmpty(), _, IsJSONDictionary()));
cdm_->CreateSessionAndGenerateRequest(
- CdmSessionType::TEMPORARY_SESSION, EmeInitDataType::WEBM,
+ CdmSessionType::kTemporary, EmeInitDataType::WEBM,
std::vector<uint8_t>(init_data), CreateSessionPromise(RESOLVED));
init_data.resize(16); // The expected size.
EXPECT_CALL(cdm_client_, OnSessionMessage(NotEmpty(), _, IsJSONDictionary()));
cdm_->CreateSessionAndGenerateRequest(
- CdmSessionType::TEMPORARY_SESSION, EmeInitDataType::WEBM,
+ CdmSessionType::kTemporary, EmeInitDataType::WEBM,
std::vector<uint8_t>(init_data), CreateSessionPromise(RESOLVED));
init_data.resize(512);
EXPECT_CALL(cdm_client_, OnSessionMessage(NotEmpty(), _, IsJSONDictionary()));
cdm_->CreateSessionAndGenerateRequest(
- CdmSessionType::TEMPORARY_SESSION, EmeInitDataType::WEBM,
+ CdmSessionType::kTemporary, EmeInitDataType::WEBM,
std::vector<uint8_t>(init_data), CreateSessionPromise(RESOLVED));
init_data.resize(513);
cdm_->CreateSessionAndGenerateRequest(
- CdmSessionType::TEMPORARY_SESSION, EmeInitDataType::WEBM,
+ CdmSessionType::kTemporary, EmeInitDataType::WEBM,
std::vector<uint8_t>(init_data), CreateSessionPromise(REJECTED));
}
TEST_P(AesDecryptorTest, MultipleCreateSession) {
EXPECT_CALL(cdm_client_, OnSessionMessage(NotEmpty(), _, IsJSONDictionary()));
cdm_->CreateSessionAndGenerateRequest(
- CdmSessionType::TEMPORARY_SESSION, EmeInitDataType::WEBM,
+ CdmSessionType::kTemporary, EmeInitDataType::WEBM,
std::vector<uint8_t>(1), CreateSessionPromise(RESOLVED));
EXPECT_CALL(cdm_client_, OnSessionMessage(NotEmpty(), _, IsJSONDictionary()));
cdm_->CreateSessionAndGenerateRequest(
- CdmSessionType::TEMPORARY_SESSION, EmeInitDataType::WEBM,
+ CdmSessionType::kTemporary, EmeInitDataType::WEBM,
std::vector<uint8_t>(1), CreateSessionPromise(RESOLVED));
EXPECT_CALL(cdm_client_, OnSessionMessage(NotEmpty(), _, IsJSONDictionary()));
cdm_->CreateSessionAndGenerateRequest(
- CdmSessionType::TEMPORARY_SESSION, EmeInitDataType::WEBM,
+ CdmSessionType::kTemporary, EmeInitDataType::WEBM,
std::vector<uint8_t>(1), CreateSessionPromise(RESOLVED));
}
@@ -590,7 +590,7 @@ TEST_P(AesDecryptorTest, CreateSessionWithCencInitData) {
EXPECT_CALL(cdm_client_, OnSessionMessage(NotEmpty(), _, IsJSONDictionary()));
cdm_->CreateSessionAndGenerateRequest(
- CdmSessionType::TEMPORARY_SESSION, EmeInitDataType::CENC,
+ CdmSessionType::kTemporary, EmeInitDataType::CENC,
std::vector<uint8_t>(init_data, init_data + arraysize(init_data)),
CreateSessionPromise(RESOLVED));
}
@@ -601,7 +601,7 @@ TEST_P(AesDecryptorTest, CreateSessionWithKeyIdsInitData) {
EXPECT_CALL(cdm_client_, OnSessionMessage(NotEmpty(), _, IsJSONDictionary()));
cdm_->CreateSessionAndGenerateRequest(
- CdmSessionType::TEMPORARY_SESSION, EmeInitDataType::KEYIDS,
+ CdmSessionType::kTemporary, EmeInitDataType::KEYIDS,
std::vector<uint8_t>(init_data, init_data + arraysize(init_data) - 1),
CreateSessionPromise(RESOLVED));
}
diff --git a/chromium/media/cdm/api/content_decryption_module.h b/chromium/media/cdm/api/content_decryption_module.h
index 0dde3ff4c91..85ffd01ac2e 100644
--- a/chromium/media/cdm/api/content_decryption_module.h
+++ b/chromium/media/cdm/api/content_decryption_module.h
@@ -420,7 +420,7 @@ CHECK_TYPE(InitDataType, 4, 4);
enum SessionType : uint32_t {
kTemporary = 0,
kPersistentLicense = 1,
- kPersistentKeyRelease = 2
+ kPersistentUsageRecord = 2
};
CHECK_TYPE(SessionType, 4, 4);
diff --git a/chromium/media/cdm/api/content_decryption_module_proxy.h b/chromium/media/cdm/api/content_decryption_module_proxy.h
index f41b9f73f98..78751066279 100644
--- a/chromium/media/cdm/api/content_decryption_module_proxy.h
+++ b/chromium/media/cdm/api/content_decryption_module_proxy.h
@@ -80,7 +80,7 @@ class CDM_CLASS_API CdmProxyClient {
enum Protocol : uint32_t {
kNone = 0, // No protocol supported. Can be used in failure cases.
- kIntelConvergedSecurityAndManageabilityEngine, // Method using Intel CSME.
+ kIntel, // Method using Intel CSME.
// There will be more values in the future e.g. kD3D11RsaHardware,
// kD3D11RsaSoftware to use the D3D11 RSA method.
};
diff --git a/chromium/media/cdm/cdm_adapter.cc b/chromium/media/cdm/cdm_adapter.cc
index 6e9cdfb8c6a..c2bad3057e7 100644
--- a/chromium/media/cdm/cdm_adapter.cc
+++ b/chromium/media/cdm/cdm_adapter.cc
@@ -84,12 +84,12 @@ cdm::HdcpVersion ToCdmHdcpVersion(HdcpVersion hdcp_version) {
cdm::SessionType ToCdmSessionType(CdmSessionType session_type) {
switch (session_type) {
- case CdmSessionType::TEMPORARY_SESSION:
+ case CdmSessionType::kTemporary:
return cdm::kTemporary;
- case CdmSessionType::PERSISTENT_LICENSE_SESSION:
+ case CdmSessionType::kPersistentLicense:
return cdm::kPersistentLicense;
- case CdmSessionType::PERSISTENT_RELEASE_MESSAGE_SESSION:
- return cdm::kPersistentKeyRelease;
+ case CdmSessionType::kPersistentUsageRecord:
+ return cdm::kPersistentUsageRecord;
}
NOTREACHED() << "Unexpected session type: " << static_cast<int>(session_type);
@@ -318,11 +318,8 @@ cdm::EncryptionScheme ToCdmEncryptionScheme(const EncryptionScheme& scheme) {
case EncryptionScheme::CIPHER_MODE_UNENCRYPTED:
return cdm::EncryptionScheme::kUnencrypted;
case EncryptionScheme::CIPHER_MODE_AES_CTR:
- if (!scheme.pattern().IsInEffect())
- return cdm::EncryptionScheme::kCenc;
- break;
+ return cdm::EncryptionScheme::kCenc;
case EncryptionScheme::CIPHER_MODE_AES_CBC:
- // Pattern should be required for 'cbcs' but is currently optional.
return cdm::EncryptionScheme::kCbcs;
}
@@ -686,7 +683,10 @@ Decryptor* CdmAdapter::GetDecryptor() {
// When using HW secure codecs, we cannot and should not use the CDM instance
// to do decrypt and/or decode. Instead, we should use the CdmProxy.
- if (cdm_config_.use_hw_secure_codecs)
+ // TODO(xhwang): Fix External Clear Key key system to be able to set
+ // |use_hw_secure_codecs| so that we don't have to check both.
+ // TODO(xhwang): Update this logic to support transcryption.
+ if (cdm_config_.use_hw_secure_codecs || cdm_proxy_created_)
return nullptr;
return this;
diff --git a/chromium/media/cdm/cdm_adapter_unittest.cc b/chromium/media/cdm/cdm_adapter_unittest.cc
index 8ca37d995f8..4ecc77cfec7 100644
--- a/chromium/media/cdm/cdm_adapter_unittest.cc
+++ b/chromium/media/cdm/cdm_adapter_unittest.cc
@@ -229,7 +229,7 @@ class CdmAdapterTestWithClearKeyCdm : public CdmAdapterTestBase {
}
cdm_->CreateSessionAndGenerateRequest(
- CdmSessionType::TEMPORARY_SESSION, data_type, key_id,
+ CdmSessionType::kTemporary, data_type, key_id,
CreateSessionPromise(expected_result));
RunUntilIdle();
}
@@ -241,7 +241,7 @@ class CdmAdapterTestWithClearKeyCdm : public CdmAdapterTestBase {
DCHECK(!session_id.empty());
ASSERT_EQ(expected_result, FAILURE) << "LoadSession not supported.";
- cdm_->LoadSession(CdmSessionType::TEMPORARY_SESSION, session_id,
+ cdm_->LoadSession(CdmSessionType::kTemporary, session_id,
CreateSessionPromise(expected_result));
RunUntilIdle();
}
diff --git a/chromium/media/cdm/cdm_proxy.h b/chromium/media/cdm/cdm_proxy.h
index d735d20cf6f..822e1581f89 100644
--- a/chromium/media/cdm/cdm_proxy.h
+++ b/chromium/media/cdm/cdm_proxy.h
@@ -38,17 +38,17 @@ class MEDIA_EXPORT CdmProxy {
enum class Status {
kOk,
kFail,
- kMax = kFail,
+ kMaxValue = kFail,
};
enum class Protocol {
// No supported protocol. Used in failure cases.
kNone,
// Method using Intel CSME.
- kIntelConvergedSecurityAndManageabilityEngine,
+ kIntel,
// There will be more values in the future e.g. kD3D11RsaHardware,
// kD3D11RsaSoftware to use the D3D11 RSA method.
- kMax = kIntelConvergedSecurityAndManageabilityEngine,
+ kMaxValue = kIntel,
};
enum class Function {
@@ -56,7 +56,7 @@ class MEDIA_EXPORT CdmProxy {
// ID3D11VideoContext::NegotiateCryptoSessionKeyExchange.
kIntelNegotiateCryptoSessionKeyExchange,
// There will be more values in the future e.g. for D3D11 RSA method.
- kMax = kIntelNegotiateCryptoSessionKeyExchange,
+ kMaxValue = kIntelNegotiateCryptoSessionKeyExchange,
};
CdmProxy();
diff --git a/chromium/media/cdm/cenc_decryptor_unittest.cc b/chromium/media/cdm/cenc_decryptor_unittest.cc
index 2fa6b6900e1..441c2c41b7a 100644
--- a/chromium/media/cdm/cenc_decryptor_unittest.cc
+++ b/chromium/media/cdm/cenc_decryptor_unittest.cc
@@ -129,7 +129,8 @@ TEST_F(CencDecryptorTest, OneBlock) {
auto encrypted_block = Encrypt(one_block_, *key_, iv_);
// Only 1 subsample, all encrypted data.
- std::vector<SubsampleEntry> subsamples = {{0, encrypted_block.size()}};
+ std::vector<SubsampleEntry> subsamples = {
+ {0, static_cast<uint32_t>(encrypted_block.size())}};
auto encrypted_buffer =
CreateEncryptedBuffer(encrypted_block, iv_, subsamples);
@@ -140,7 +141,8 @@ TEST_F(CencDecryptorTest, ExtraData) {
auto encrypted_block = Encrypt(one_block_, *key_, iv_);
// Only 1 subsample, all encrypted data.
- std::vector<SubsampleEntry> subsamples = {{0, encrypted_block.size()}};
+ std::vector<SubsampleEntry> subsamples = {
+ {0, static_cast<uint32_t>(encrypted_block.size())}};
auto encrypted_buffer =
CreateEncryptedBuffer(encrypted_block, iv_, subsamples);
@@ -179,7 +181,8 @@ TEST_F(CencDecryptorTest, BadSubsamples) {
auto encrypted_block = Encrypt(one_block_, *key_, iv_);
// Subsample size > data size.
- std::vector<SubsampleEntry> subsamples = {{0, encrypted_block.size() + 1}};
+ std::vector<SubsampleEntry> subsamples = {
+ {0, static_cast<uint32_t>(encrypted_block.size() + 1)}};
auto encrypted_buffer =
CreateEncryptedBuffer(encrypted_block, iv_, subsamples);
@@ -189,7 +192,8 @@ TEST_F(CencDecryptorTest, BadSubsamples) {
TEST_F(CencDecryptorTest, InvalidIv) {
auto encrypted_block = Encrypt(one_block_, *key_, iv_);
- std::vector<SubsampleEntry> subsamples = {{0, encrypted_block.size()}};
+ std::vector<SubsampleEntry> subsamples = {
+ {0, static_cast<uint32_t>(encrypted_block.size())}};
// Use an invalid IV for decryption. Call should succeed, but return
// something other than the original data.
@@ -204,7 +208,8 @@ TEST_F(CencDecryptorTest, InvalidKey) {
crypto::SymmetricKey::AES, std::string(arraysize(kKey), 'b'));
auto encrypted_block = Encrypt(one_block_, *key_, iv_);
- std::vector<SubsampleEntry> subsamples = {{0, encrypted_block.size()}};
+ std::vector<SubsampleEntry> subsamples = {
+ {0, static_cast<uint32_t>(encrypted_block.size())}};
// Use a different key for decryption. Call should succeed, but return
// something other than the original data.
@@ -217,7 +222,8 @@ TEST_F(CencDecryptorTest, PartialBlock) {
auto encrypted_block = Encrypt(partial_block_, *key_, iv_);
// Only 1 subsample, all encrypted data.
- std::vector<SubsampleEntry> subsamples = {{0, encrypted_block.size()}};
+ std::vector<SubsampleEntry> subsamples = {
+ {0, static_cast<uint32_t>(encrypted_block.size())}};
auto encrypted_buffer =
CreateEncryptedBuffer(encrypted_block, iv_, subsamples);
@@ -230,7 +236,9 @@ TEST_F(CencDecryptorTest, MultipleSubsamples) {
// Treat as 3 subsamples.
std::vector<SubsampleEntry> subsamples = {
- {0, one_block_.size()}, {0, one_block_.size()}, {0, one_block_.size()}};
+ {0, static_cast<uint32_t>(one_block_.size())},
+ {0, static_cast<uint32_t>(one_block_.size())},
+ {0, static_cast<uint32_t>(one_block_.size())}};
auto encrypted_buffer =
CreateEncryptedBuffer(encrypted_block, iv_, subsamples);
@@ -258,9 +266,11 @@ TEST_F(CencDecryptorTest, MultipleSubsamplesWithClearBytes) {
auto expected_result = Combine(
{one_block_, partial_block_, partial_block_, one_block_, partial_block_});
std::vector<SubsampleEntry> subsamples = {
- {one_block_.size(), partial_block_.size()},
- {partial_block_.size(), one_block_.size()},
- {partial_block_.size(), 0}};
+ {static_cast<uint32_t>(one_block_.size()),
+ static_cast<uint32_t>(partial_block_.size())},
+ {static_cast<uint32_t>(partial_block_.size()),
+ static_cast<uint32_t>(one_block_.size())},
+ {static_cast<uint32_t>(partial_block_.size()), 0}};
auto encrypted_buffer = CreateEncryptedBuffer(input_data, iv_, subsamples);
EXPECT_EQ(expected_result, DecryptWithKey(encrypted_buffer, *key_));
diff --git a/chromium/media/cdm/json_web_key.cc b/chromium/media/cdm/json_web_key.cc
index d851ff30ef6..aec3796e3cb 100644
--- a/chromium/media/cdm/json_web_key.cc
+++ b/chromium/media/cdm/json_web_key.cc
@@ -32,7 +32,7 @@ const char kKeyIdsTag[] = "kids";
const char kTypeTag[] = "type";
const char kTemporarySession[] = "temporary";
const char kPersistentLicenseSession[] = "persistent-license";
-const char kPersistentReleaseMessageSession[] = "persistent-release-message";
+const char kPersistentUsageRecordSession[] = "persistent-usage-record";
static std::string ShortenTo64Characters(const std::string& input) {
// Convert |input| into a string with escaped characters replacing any
@@ -100,14 +100,14 @@ std::string GenerateJWKSet(const KeyIdAndKeyPairs& keys,
base::DictionaryValue jwk_set;
jwk_set.Set(kKeysTag, std::move(list));
switch (session_type) {
- case CdmSessionType::TEMPORARY_SESSION:
+ case CdmSessionType::kTemporary:
jwk_set.SetString(kTypeTag, kTemporarySession);
break;
- case CdmSessionType::PERSISTENT_LICENSE_SESSION:
+ case CdmSessionType::kPersistentLicense:
jwk_set.SetString(kTypeTag, kPersistentLicenseSession);
break;
- case CdmSessionType::PERSISTENT_RELEASE_MESSAGE_SESSION:
- jwk_set.SetString(kTypeTag, kPersistentReleaseMessageSession);
+ case CdmSessionType::kPersistentUsageRecord:
+ jwk_set.SetString(kTypeTag, kPersistentUsageRecordSession);
break;
}
@@ -212,16 +212,16 @@ bool ExtractKeysFromJWKSet(const std::string& jwk_set,
std::string session_type_id;
if (!dictionary->Get(kTypeTag, &value)) {
// Not specified, so use the default type.
- *session_type = CdmSessionType::TEMPORARY_SESSION;
+ *session_type = CdmSessionType::kTemporary;
} else if (!value->GetAsString(&session_type_id)) {
DVLOG(1) << "Invalid '" << kTypeTag << "' value";
return false;
} else if (session_type_id == kTemporarySession) {
- *session_type = CdmSessionType::TEMPORARY_SESSION;
+ *session_type = CdmSessionType::kTemporary;
} else if (session_type_id == kPersistentLicenseSession) {
- *session_type = CdmSessionType::PERSISTENT_LICENSE_SESSION;
- } else if (session_type_id == kPersistentReleaseMessageSession) {
- *session_type = CdmSessionType::PERSISTENT_RELEASE_MESSAGE_SESSION;
+ *session_type = CdmSessionType::kPersistentLicense;
+ } else if (session_type_id == kPersistentUsageRecordSession) {
+ *session_type = CdmSessionType::kPersistentUsageRecord;
} else {
DVLOG(1) << "Invalid '" << kTypeTag << "' value: " << session_type_id;
return false;
@@ -317,14 +317,14 @@ void CreateLicenseRequest(const KeyIdList& key_ids,
request->Set(kKeyIdsTag, std::move(list));
switch (session_type) {
- case CdmSessionType::TEMPORARY_SESSION:
+ case CdmSessionType::kTemporary:
request->SetString(kTypeTag, kTemporarySession);
break;
- case CdmSessionType::PERSISTENT_LICENSE_SESSION:
+ case CdmSessionType::kPersistentLicense:
request->SetString(kTypeTag, kPersistentLicenseSession);
break;
- case CdmSessionType::PERSISTENT_RELEASE_MESSAGE_SESSION:
- request->SetString(kTypeTag, kPersistentReleaseMessageSession);
+ case CdmSessionType::kPersistentUsageRecord:
+ request->SetString(kTypeTag, kPersistentUsageRecordSession);
break;
}
diff --git a/chromium/media/cdm/json_web_key_unittest.cc b/chromium/media/cdm/json_web_key_unittest.cc
index 689d781ade3..f0c4de25a29 100644
--- a/chromium/media/cdm/json_web_key_unittest.cc
+++ b/chromium/media/cdm/json_web_key_unittest.cc
@@ -112,22 +112,22 @@ TEST_F(JSONWebKeyTest, GenerateJWKSet) {
EXPECT_EQ(
"{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":"
"\"temporary\"}",
- GenerateJWKSet(keys, CdmSessionType::TEMPORARY_SESSION));
+ GenerateJWKSet(keys, CdmSessionType::kTemporary));
keys.push_back(
MakeKeyIdAndKeyPair(data2, arraysize(data2), data2, arraysize(data2)));
EXPECT_EQ(
"{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"},{\"k\":"
"\"AQIDBA\",\"kid\":\"AQIDBA\",\"kty\":\"oct\"}],\"type\":\"persistent-"
"license\"}",
- GenerateJWKSet(keys, CdmSessionType::PERSISTENT_LICENSE_SESSION));
+ GenerateJWKSet(keys, CdmSessionType::kPersistentLicense));
keys.push_back(
MakeKeyIdAndKeyPair(data3, arraysize(data3), data3, arraysize(data3)));
EXPECT_EQ(
"{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"},{\"k\":"
"\"AQIDBA\",\"kid\":\"AQIDBA\",\"kty\":\"oct\"},{\"k\":"
"\"AQIDBAUGBwgJCgsMDQ4PEA\",\"kid\":\"AQIDBAUGBwgJCgsMDQ4PEA\",\"kty\":"
- "\"oct\"}],\"type\":\"persistent-release-message\"}",
- GenerateJWKSet(keys, CdmSessionType::PERSISTENT_RELEASE_MESSAGE_SESSION));
+ "\"oct\"}],\"type\":\"persistent-usage-record\"}",
+ GenerateJWKSet(keys, CdmSessionType::kPersistentUsageRecord));
}
TEST_F(JSONWebKeyTest, ExtractValidJWKKeys) {
@@ -398,26 +398,26 @@ TEST_F(JSONWebKeyTest, Alg) {
TEST_F(JSONWebKeyTest, CdmSessionType) {
ExtractSessionTypeAndExpect(
"{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}]}", true,
- CdmSessionType::TEMPORARY_SESSION);
+ CdmSessionType::kTemporary);
ExtractSessionTypeAndExpect(
"{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":"
"\"temporary\"}",
- true, CdmSessionType::TEMPORARY_SESSION);
+ true, CdmSessionType::kTemporary);
ExtractSessionTypeAndExpect(
"{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":"
"\"persistent-license\"}",
- true, CdmSessionType::PERSISTENT_LICENSE_SESSION);
+ true, CdmSessionType::kPersistentLicense);
ExtractSessionTypeAndExpect(
"{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":"
- "\"persistent-release-message\"}",
- true, CdmSessionType::PERSISTENT_RELEASE_MESSAGE_SESSION);
+ "\"persistent-usage-record\"}",
+ true, CdmSessionType::kPersistentUsageRecord);
ExtractSessionTypeAndExpect(
"{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":"
"\"unknown\"}",
- false, CdmSessionType::TEMPORARY_SESSION);
+ false, CdmSessionType::kTemporary);
ExtractSessionTypeAndExpect(
"{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":3}",
- false, CdmSessionType::TEMPORARY_SESSION);
+ false, CdmSessionType::kTemporary);
}
TEST_F(JSONWebKeyTest, CreateLicense) {
@@ -426,21 +426,18 @@ TEST_F(JSONWebKeyTest, CreateLicense) {
const uint8_t data3[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10};
- CreateLicenseAndExpect(data1, arraysize(data1),
- CdmSessionType::TEMPORARY_SESSION,
+ CreateLicenseAndExpect(data1, arraysize(data1), CdmSessionType::kTemporary,
"{\"kids\":[\"AQI\"],\"type\":\"temporary\"}");
CreateLicenseAndExpect(
- data1, arraysize(data1), CdmSessionType::PERSISTENT_LICENSE_SESSION,
+ data1, arraysize(data1), CdmSessionType::kPersistentLicense,
"{\"kids\":[\"AQI\"],\"type\":\"persistent-license\"}");
CreateLicenseAndExpect(
- data1, arraysize(data1),
- CdmSessionType::PERSISTENT_RELEASE_MESSAGE_SESSION,
- "{\"kids\":[\"AQI\"],\"type\":\"persistent-release-message\"}");
- CreateLicenseAndExpect(data2, arraysize(data2),
- CdmSessionType::TEMPORARY_SESSION,
+ data1, arraysize(data1), CdmSessionType::kPersistentUsageRecord,
+ "{\"kids\":[\"AQI\"],\"type\":\"persistent-usage-record\"}");
+ CreateLicenseAndExpect(data2, arraysize(data2), CdmSessionType::kTemporary,
"{\"kids\":[\"AQIDBA\"],\"type\":\"temporary\"}");
CreateLicenseAndExpect(data3, arraysize(data3),
- CdmSessionType::PERSISTENT_LICENSE_SESSION,
+ CdmSessionType::kPersistentLicense,
"{\"kids\":[\"AQIDBAUGBwgJCgsMDQ4PEA\"],\"type\":"
"\"persistent-license\"}");
}
@@ -506,8 +503,7 @@ TEST_F(JSONWebKeyTest, Base64UrlEncoding) {
EXPECT_EQ(encoded_text.find('-'), std::string::npos);
EXPECT_EQ(encoded_text.find('_'), std::string::npos);
- CreateLicenseAndExpect(data1, arraysize(data1),
- CdmSessionType::TEMPORARY_SESSION,
+ CreateLicenseAndExpect(data1, arraysize(data1), CdmSessionType::kTemporary,
"{\"kids\":[\"-_37_fv9-w\"],\"type\":\"temporary\"}");
ExtractKeyFromLicenseAndExpect(
@@ -526,7 +522,7 @@ TEST_F(JSONWebKeyTest, MultipleKeys) {
key_ids.push_back(std::vector<uint8_t>(data1, data1 + arraysize(data1)));
key_ids.push_back(std::vector<uint8_t>(data2, data2 + arraysize(data2)));
key_ids.push_back(std::vector<uint8_t>(data3, data3 + arraysize(data3)));
- CreateLicenseRequest(key_ids, CdmSessionType::TEMPORARY_SESSION, &result);
+ CreateLicenseRequest(key_ids, CdmSessionType::kTemporary, &result);
std::string s(result.begin(), result.end());
EXPECT_EQ(
"{\"kids\":[\"AQI\",\"AQIDBA\",\"AQIDBAUGBwgJCgsMDQ4PEA\"],\"type\":"
diff --git a/chromium/media/cdm/library_cdm/clear_key_cdm/BUILD.gn b/chromium/media/cdm/library_cdm/clear_key_cdm/BUILD.gn
index c6fe179fc73..932e2bd5a34 100644
--- a/chromium/media/cdm/library_cdm/clear_key_cdm/BUILD.gn
+++ b/chromium/media/cdm/library_cdm/clear_key_cdm/BUILD.gn
@@ -14,8 +14,8 @@ loadable_module("clear_key_cdm") {
"cdm_file_adapter.h",
"cdm_file_io_test.cc",
"cdm_file_io_test.h",
- "cdm_proxy_test.cc",
- "cdm_proxy_test.h",
+ "cdm_proxy_handler.cc",
+ "cdm_proxy_handler.h",
"cdm_video_decoder.cc",
"cdm_video_decoder.h",
"clear_key_cdm.cc",
@@ -32,7 +32,6 @@ loadable_module("clear_key_cdm") {
deps = [
":cdm_proxy_common",
"//base",
- "//build/config:exe_and_shlib_deps",
"//media", # For media::AudioTimestampHelper
"//media:shared_memory_support", # For media::AudioBus.
"//media/cdm:cdm_api", # For content_decryption_module.h
diff --git a/chromium/media/cdm/library_cdm/clear_key_cdm/cdm_proxy_test.cc b/chromium/media/cdm/library_cdm/clear_key_cdm/cdm_proxy_handler.cc
index 152539f4bd6..ebcb163a7fa 100644
--- a/chromium/media/cdm/library_cdm/clear_key_cdm/cdm_proxy_test.cc
+++ b/chromium/media/cdm/library_cdm/clear_key_cdm/cdm_proxy_handler.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "media/cdm/library_cdm/clear_key_cdm/cdm_proxy_test.h"
+#include "media/cdm/library_cdm/clear_key_cdm/cdm_proxy_handler.h"
#include <stdint.h>
#include <algorithm>
@@ -14,43 +14,48 @@
namespace media {
-CdmProxyTest::CdmProxyTest(CdmHostProxy* cdm_host_proxy)
+CdmProxyHandler::CdmProxyHandler(CdmHostProxy* cdm_host_proxy)
: cdm_host_proxy_(cdm_host_proxy) {}
-CdmProxyTest::~CdmProxyTest() {}
+CdmProxyHandler::~CdmProxyHandler() {}
-void CdmProxyTest::Run(CompletionCB completion_cb) {
+void CdmProxyHandler::Initialize(InitCB init_cb) {
DVLOG(1) << __func__;
- completion_cb_ = std::move(completion_cb);
+ init_cb_ = std::move(init_cb);
cdm_proxy_ = cdm_host_proxy_->RequestCdmProxy(this);
if (!cdm_proxy_) {
- OnTestComplete(false);
+ FinishInitialization(false);
return;
}
cdm_proxy_->Initialize();
}
-void CdmProxyTest::OnTestComplete(bool success) {
+void CdmProxyHandler::SetKey(const std::vector<uint8_t>& response) {
+ cdm_proxy_->SetKey(crypto_session_id_, nullptr, 0, response.data(),
+ response.size());
+}
+
+void CdmProxyHandler::FinishInitialization(bool success) {
DVLOG(1) << __func__ << ": success = " << success;
- std::move(completion_cb_).Run(success);
+ std::move(init_cb_).Run(success);
}
-void CdmProxyTest::OnInitialized(Status status,
- Protocol protocol,
- uint32_t crypto_session_id) {
+void CdmProxyHandler::OnInitialized(Status status,
+ Protocol protocol,
+ uint32_t crypto_session_id) {
DVLOG(1) << __func__ << ": status = " << status;
if (status != Status::kOk ||
crypto_session_id != kClearKeyCdmProxyCryptoSessionId) {
- OnTestComplete(false);
+ FinishInitialization(false);
return;
}
// Only one CdmProxy can be created during the lifetime of the CDM instance.
if (cdm_host_proxy_->RequestCdmProxy(this)) {
- OnTestComplete(false);
+ FinishInitialization(false);
return;
}
@@ -59,15 +64,15 @@ void CdmProxyTest::OnInitialized(Status status,
kClearKeyCdmProxyInputData.size(), 0);
}
-void CdmProxyTest::OnProcessed(Status status,
- const uint8_t* output_data,
- uint32_t output_data_size) {
+void CdmProxyHandler::OnProcessed(Status status,
+ const uint8_t* output_data,
+ uint32_t output_data_size) {
DVLOG(1) << __func__ << ": status = " << status;
if (status != Status::kOk ||
!std::equal(output_data, output_data + output_data_size,
kClearKeyCdmProxyOutputData.begin())) {
- OnTestComplete(false);
+ FinishInitialization(false);
return;
}
@@ -75,21 +80,21 @@ void CdmProxyTest::OnProcessed(Status status,
kClearKeyCdmProxyInputData.size());
}
-void CdmProxyTest::OnMediaCryptoSessionCreated(Status status,
- uint32_t crypto_session_id,
- uint64_t output_data) {
+void CdmProxyHandler::OnMediaCryptoSessionCreated(Status status,
+ uint32_t crypto_session_id,
+ uint64_t output_data) {
DVLOG(1) << __func__ << ": status = " << status;
if (status != Status::kOk ||
crypto_session_id != kClearKeyCdmProxyMediaCryptoSessionId) {
- OnTestComplete(false);
+ FinishInitialization(false);
return;
}
- OnTestComplete(true);
+ FinishInitialization(true);
}
-void CdmProxyTest::NotifyHardwareReset() {
+void CdmProxyHandler::NotifyHardwareReset() {
DVLOG(1) << __func__;
NOTREACHED();
}
diff --git a/chromium/media/cdm/library_cdm/clear_key_cdm/cdm_proxy_test.h b/chromium/media/cdm/library_cdm/clear_key_cdm/cdm_proxy_handler.h
index 27237be66ec..dd5badb9952 100644
--- a/chromium/media/cdm/library_cdm/clear_key_cdm/cdm_proxy_test.h
+++ b/chromium/media/cdm/library_cdm/clear_key_cdm/cdm_proxy_handler.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef MEDIA_CDM_LIBRARY_CDM_CLEAR_KEY_CDM_CDM_PROXY_TEST_H_
-#define MEDIA_CDM_LIBRARY_CDM_CLEAR_KEY_CDM_CDM_PROXY_TEST_H_
+#ifndef MEDIA_CDM_LIBRARY_CDM_CLEAR_KEY_CDM_CDM_PROXY_HANDLER_H_
+#define MEDIA_CDM_LIBRARY_CDM_CLEAR_KEY_CDM_CDM_PROXY_HANDLER_H_
#include "base/callback.h"
#include "base/macros.h"
@@ -13,18 +13,23 @@ namespace media {
class CdmHostProxy;
-class CdmProxyTest : public cdm::CdmProxyClient {
+class CdmProxyHandler : public cdm::CdmProxyClient {
public:
- using CompletionCB = base::OnceCallback<void(bool success)>;
+ using InitCB = base::OnceCallback<void(bool success)>;
- explicit CdmProxyTest(CdmHostProxy* cdm_host_proxy);
- ~CdmProxyTest() override;
+ explicit CdmProxyHandler(CdmHostProxy* cdm_host_proxy);
+ ~CdmProxyHandler() override;
- // Runs the test and returns the test result through |completion_cb|.
- void Run(CompletionCB completion_cb);
+ // Initializes the CdmProxyHandler and returns the result through |init_cb|.
+ // This will request and initialize the CdmProxy, create media crypto session
+ // and do some trivial procesing for better test coverage.
+ void Initialize(InitCB init_cb);
+
+ // Push a response that contains a license to the CdmProxy.
+ void SetKey(const std::vector<uint8_t>& response);
private:
- void OnTestComplete(bool success);
+ void FinishInitialization(bool success);
// cdm::CdmProxyClient implementation.
void OnInitialized(Status status,
@@ -39,12 +44,13 @@ class CdmProxyTest : public cdm::CdmProxyClient {
void NotifyHardwareReset() final;
CdmHostProxy* const cdm_host_proxy_ = nullptr;
- CompletionCB completion_cb_;
+ InitCB init_cb_;
cdm::CdmProxy* cdm_proxy_ = nullptr;
+ uint32_t crypto_session_id_ = 0u;
- DISALLOW_COPY_AND_ASSIGN(CdmProxyTest);
+ DISALLOW_COPY_AND_ASSIGN(CdmProxyHandler);
};
} // namespace media
-#endif // MEDIA_CDM_LIBRARY_CDM_CLEAR_KEY_CDM_CDM_PROXY_TEST_H_
+#endif // MEDIA_CDM_LIBRARY_CDM_CLEAR_KEY_CDM_CDM_PROXY_HANDLER_H_
diff --git a/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm.cc b/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm.cc
index 27c7940acc8..35f55902eff 100644
--- a/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm.cc
+++ b/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm.cc
@@ -27,7 +27,7 @@
#include "media/cdm/library_cdm/cdm_host_proxy.h"
#include "media/cdm/library_cdm/cdm_host_proxy_impl.h"
#include "media/cdm/library_cdm/clear_key_cdm/cdm_file_io_test.h"
-#include "media/cdm/library_cdm/clear_key_cdm/cdm_proxy_test.h"
+#include "media/cdm/library_cdm/clear_key_cdm/cdm_proxy_handler.h"
#include "media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.h"
#include "media/media_buildflags.h"
@@ -65,8 +65,8 @@ const char kExternalClearKeyStorageIdTestKeySystem[] =
"org.chromium.externalclearkey.storageidtest";
const char kExternalClearKeyDifferentGuidTestKeySystem[] =
"org.chromium.externalclearkey.differentguid";
-const char kExternalClearKeyCdmProxyTestKeySystem[] =
- "org.chromium.externalclearkey.cdmproxytest";
+const char kExternalClearKeyCdmProxyKeySystem[] =
+ "org.chromium.externalclearkey.cdmproxy";
const int64_t kSecondsPerMinute = 60;
const int64_t kMsPerSecond = 1000;
@@ -151,14 +151,14 @@ static cdm::Exception ConvertException(
static media::CdmSessionType ConvertSessionType(cdm::SessionType session_type) {
switch (session_type) {
case cdm::kTemporary:
- return media::CdmSessionType::TEMPORARY_SESSION;
+ return media::CdmSessionType::kTemporary;
case cdm::kPersistentLicense:
- return media::CdmSessionType::PERSISTENT_LICENSE_SESSION;
- case cdm::kPersistentKeyRelease:
- return media::CdmSessionType::PERSISTENT_RELEASE_MESSAGE_SESSION;
+ return media::CdmSessionType::kPersistentLicense;
+ case cdm::kPersistentUsageRecord:
+ return media::CdmSessionType::kPersistentUsageRecord;
}
NOTREACHED();
- return media::CdmSessionType::TEMPORARY_SESSION;
+ return media::CdmSessionType::kTemporary;
}
static media::EmeInitDataType ConvertInitDataType(
@@ -264,7 +264,7 @@ void* CreateCdmInstance(int cdm_interface_version,
key_system_string != kExternalClearKeyVerifyCdmHostTestKeySystem &&
key_system_string != kExternalClearKeyStorageIdTestKeySystem &&
key_system_string != kExternalClearKeyDifferentGuidTestKeySystem &&
- key_system_string != kExternalClearKeyCdmProxyTestKeySystem) {
+ key_system_string != kExternalClearKeyCdmProxyKeySystem) {
DVLOG(1) << "Unsupported key system:" << key_system_string;
return nullptr;
}
@@ -416,9 +416,9 @@ void ClearKeyCdm::Initialize(bool allow_distinctive_identifier,
allow_persistent_state_ = allow_persistent_state;
// CdmProxy must be created during initialization time. OnInitialized() will
- // be called in OnCdmProxyTestComplete().
- if (key_system_ == kExternalClearKeyCdmProxyTestKeySystem) {
- StartCdmProxyTest();
+ // be called in OnCdmProxyHandlerInitialized().
+ if (key_system_ == kExternalClearKeyCdmProxyKeySystem) {
+ InitializeCdmProxyHandler();
return;
}
@@ -483,8 +483,6 @@ void ClearKeyCdm::CreateSessionAndGenerateRequest(
ReportVerifyCdmHostTestResult();
} else if (key_system_ == kExternalClearKeyStorageIdTestKeySystem) {
StartStorageIdTest();
- } else if (key_system_ == kExternalClearKeyCdmProxyTestKeySystem) {
- ReportCdmProxyTestResult();
}
}
@@ -514,6 +512,16 @@ void ClearKeyCdm::UpdateSession(uint32_t promise_id,
uint32_t response_size) {
DVLOG(1) << __func__;
std::string web_session_str(session_id, session_id_length);
+ std::vector<uint8_t> response_vector(response, response + response_size);
+
+ // Push the license to CdmProxy.
+ // TODO(xhwang): There's a potential race condition here where key status
+ // update is dispatched in the render process first, which triggers the
+ // resume-decryption-after-no-key logic, and by the time we try to decrypt
+ // again in the ClearKeyCdmProxy (GPU process), SetKey() hasn't been
+ // dispatched yet. To solve this, handle no-key in ClearKeyCdmProxy.
+ if (cdm_proxy_handler_)
+ cdm_proxy_handler_->SetKey(response_vector);
std::unique_ptr<media::SimpleCdmPromise> promise(
new media::CdmCallbackPromise<>(
@@ -521,9 +529,7 @@ void ClearKeyCdm::UpdateSession(uint32_t promise_id,
promise_id, web_session_str),
base::Bind(&ClearKeyCdm::OnPromiseFailed, base::Unretained(this),
promise_id)));
- cdm_->UpdateSession(web_session_str,
- std::vector<uint8_t>(response, response + response_size),
- std::move(promise));
+ cdm_->UpdateSession(web_session_str, response_vector, std::move(promise));
}
void ClearKeyCdm::OnUpdateSuccess(uint32_t promise_id,
@@ -649,6 +655,10 @@ cdm::Status ClearKeyCdm::Decrypt(const cdm::InputBuffer_2& encrypted_buffer,
DVLOG(1) << __func__;
DCHECK(encrypted_buffer.data);
+ // When CdmProxy is used, the CDM cannot do any decryption or decoding.
+ if (key_system_ == kExternalClearKeyCdmProxyKeySystem)
+ return cdm::kDecryptError;
+
scoped_refptr<DecoderBuffer> buffer;
cdm::Status status = DecryptToMediaDecoderBuffer(encrypted_buffer, &buffer);
@@ -683,8 +693,10 @@ cdm::Status ClearKeyCdm::InitializeAudioDecoder(
cdm::Status ClearKeyCdm::InitializeAudioDecoder(
const cdm::AudioDecoderConfig_2& audio_decoder_config) {
- if (key_system_ == kExternalClearKeyDecryptOnlyKeySystem)
+ if (key_system_ == kExternalClearKeyDecryptOnlyKeySystem ||
+ key_system_ == kExternalClearKeyCdmProxyKeySystem) {
return cdm::kInitializationError;
+ }
#if defined(CLEAR_KEY_CDM_USE_FFMPEG_DECODER)
if (!audio_decoder_)
@@ -696,8 +708,7 @@ cdm::Status ClearKeyCdm::InitializeAudioDecoder(
return cdm::kSuccess;
#else
- NOTIMPLEMENTED();
- return cdm::kSessionError;
+ return cdm::kInitializationError;
#endif // CLEAR_KEY_CDM_USE_FFMPEG_DECODER
}
@@ -715,8 +726,10 @@ cdm::Status ClearKeyCdm::InitializeVideoDecoder(
cdm::Status ClearKeyCdm::InitializeVideoDecoder(
const cdm::VideoDecoderConfig_2& video_decoder_config) {
- if (key_system_ == kExternalClearKeyDecryptOnlyKeySystem)
+ if (key_system_ == kExternalClearKeyDecryptOnlyKeySystem ||
+ key_system_ == kExternalClearKeyCdmProxyKeySystem) {
return cdm::kInitializationError;
+ }
if (video_decoder_ && video_decoder_->is_initialized()) {
DCHECK(!video_decoder_->is_initialized());
@@ -1071,29 +1084,20 @@ void ClearKeyCdm::StartStorageIdTest() {
cdm_host_proxy_->RequestStorageId(0);
}
-void ClearKeyCdm::StartCdmProxyTest() {
+void ClearKeyCdm::InitializeCdmProxyHandler() {
DVLOG(1) << __func__;
- DCHECK(!cdm_proxy_test_);
+ DCHECK(!cdm_proxy_handler_);
- cdm_proxy_test_.reset(new CdmProxyTest(cdm_host_proxy_.get()));
- cdm_proxy_test_->Run(base::BindOnce(&ClearKeyCdm::OnCdmProxyTestComplete,
- base::Unretained(this)));
+ cdm_proxy_handler_ = std::make_unique<CdmProxyHandler>(cdm_host_proxy_.get());
+ cdm_proxy_handler_->Initialize(base::BindOnce(
+ &ClearKeyCdm::OnCdmProxyHandlerInitialized, base::Unretained(this)));
}
-void ClearKeyCdm::OnCdmProxyTestComplete(bool success) {
+void ClearKeyCdm::OnCdmProxyHandlerInitialized(bool success) {
DVLOG(1) << __func__;
- DCHECK(cdm_proxy_test_);
-
- cdm_proxy_test_.reset();
- has_cdm_proxy_test_passed_ = success;
-
- // Ignore test result here. It will be reported in ReportCdmProxyTestResult().
- cdm_host_proxy_->OnInitialized(true);
-}
+ DCHECK(cdm_proxy_handler_);
-void ClearKeyCdm::ReportCdmProxyTestResult() {
- // StartCdmProxyTest() should have already been called and finished.
- OnUnitTestComplete(has_cdm_proxy_test_passed_);
+ cdm_host_proxy_->OnInitialized(success);
}
} // namespace media
diff --git a/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm.h b/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm.h
index b9c78fa9665..386f2b95d07 100644
--- a/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm.h
+++ b/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm.h
@@ -23,7 +23,7 @@
namespace media {
class CdmHostProxy;
-class CdmProxyTest;
+class CdmProxyHandler;
class CdmVideoDecoder;
class DecoderBuffer;
class FFmpegCdmAudioDecoder;
@@ -159,9 +159,8 @@ class ClearKeyCdm : public cdm::ContentDecryptionModule_9,
void ReportVerifyCdmHostTestResult();
void StartStorageIdTest();
- void StartCdmProxyTest();
- void OnCdmProxyTestComplete(bool success);
- void ReportCdmProxyTestResult();
+ void InitializeCdmProxyHandler();
+ void OnCdmProxyHandlerInitialized(bool success);
int host_interface_version_ = 0;
@@ -189,12 +188,11 @@ class ClearKeyCdm : public cdm::ContentDecryptionModule_9,
std::unique_ptr<CdmVideoDecoder> video_decoder_;
std::unique_ptr<FileIOTestRunner> file_io_test_runner_;
- std::unique_ptr<CdmProxyTest> cdm_proxy_test_;
+ std::unique_ptr<CdmProxyHandler> cdm_proxy_handler_;
bool is_running_output_protection_test_ = false;
bool is_running_platform_verification_test_ = false;
bool is_running_storage_id_test_ = false;
- bool has_cdm_proxy_test_passed_ = false;
DISALLOW_COPY_AND_ASSIGN(ClearKeyCdm);
};
diff --git a/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm_proxy.cc b/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm_proxy.cc
index c251354b535..2a4b2c2e337 100644
--- a/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm_proxy.cc
+++ b/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm_proxy.cc
@@ -11,6 +11,26 @@
namespace media {
+namespace {
+
+constexpr char kDummySessionId[] = "dummy session id";
+
+class IgnoreResponsePromise : public SimpleCdmPromise {
+ public:
+ IgnoreResponsePromise() = default;
+ ~IgnoreResponsePromise() override = default;
+
+ // SimpleCdmPromise implementation.
+ void resolve() final { MarkPromiseSettled(); }
+ void reject(CdmPromise::Exception exception_code,
+ uint32_t system_code,
+ const std::string& error_message) final {
+ MarkPromiseSettled();
+ }
+};
+
+} // namespace
+
ClearKeyCdmProxy::ClearKeyCdmProxy() : weak_factory_(this) {}
ClearKeyCdmProxy::~ClearKeyCdmProxy() {}
@@ -23,9 +43,8 @@ base::WeakPtr<CdmContext> ClearKeyCdmProxy::GetCdmContext() {
void ClearKeyCdmProxy::Initialize(Client* client, InitializeCB init_cb) {
DVLOG(1) << __func__;
- std::move(init_cb).Run(
- Status::kOk, Protocol::kIntelConvergedSecurityAndManageabilityEngine,
- kClearKeyCdmProxyCryptoSessionId);
+ std::move(init_cb).Run(Status::kOk, Protocol::kIntel,
+ kClearKeyCdmProxyCryptoSessionId);
}
void ClearKeyCdmProxy::Process(Function function,
@@ -67,7 +86,15 @@ void ClearKeyCdmProxy::CreateMediaCryptoSession(
void ClearKeyCdmProxy::SetKey(uint32_t crypto_session_id,
const std::vector<uint8_t>& key_id,
- const std::vector<uint8_t>& key_blob) {}
+ const std::vector<uint8_t>& key_blob) {
+ DVLOG(1) << __func__;
+
+ if (!aes_decryptor_)
+ CreateDecryptor();
+
+ aes_decryptor_->UpdateSession(kDummySessionId, key_blob,
+ std::make_unique<IgnoreResponsePromise>());
+}
void ClearKeyCdmProxy::RemoveKey(uint32_t crypto_session_id,
const std::vector<uint8_t>& key_id) {}
@@ -75,13 +102,22 @@ void ClearKeyCdmProxy::RemoveKey(uint32_t crypto_session_id,
Decryptor* ClearKeyCdmProxy::GetDecryptor() {
DVLOG(1) << __func__;
- if (!aes_decryptor_) {
- aes_decryptor_ = base::MakeRefCounted<AesDecryptor>(
- base::DoNothing(), base::DoNothing(), base::DoNothing(),
- base::DoNothing());
- }
+ if (!aes_decryptor_)
+ CreateDecryptor();
return aes_decryptor_.get();
}
+void ClearKeyCdmProxy::CreateDecryptor() {
+ DVLOG(1) << __func__;
+ DCHECK(!aes_decryptor_);
+
+ aes_decryptor_ =
+ base::MakeRefCounted<AesDecryptor>(base::DoNothing(), base::DoNothing(),
+ base::DoNothing(), base::DoNothing());
+
+ // Also create a dummy session to be used for SetKey().
+ aes_decryptor_->CreateSession(kDummySessionId, CdmSessionType::kTemporary);
+}
+
} // namespace media
diff --git a/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm_proxy.h b/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm_proxy.h
index 20f3d99cb35..ac8dce769c9 100644
--- a/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm_proxy.h
+++ b/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm_proxy.h
@@ -42,6 +42,8 @@ class ClearKeyCdmProxy : public CdmProxy, public CdmContext {
Decryptor* GetDecryptor() final;
private:
+ void CreateDecryptor();
+
scoped_refptr<AesDecryptor> aes_decryptor_;
base::WeakPtrFactory<ClearKeyCdmProxy> weak_factory_;
diff --git a/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_persistent_session_cdm.cc b/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_persistent_session_cdm.cc
index aade5d5d23e..f065633e075 100644
--- a/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_persistent_session_cdm.cc
+++ b/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_persistent_session_cdm.cc
@@ -117,7 +117,7 @@ void ClearKeyPersistentSessionCdm::CreateSessionAndGenerateRequest(
const std::vector<uint8_t>& init_data,
std::unique_ptr<NewSessionCdmPromise> promise) {
std::unique_ptr<NewSessionCdmPromise> new_promise;
- if (session_type != CdmSessionType::PERSISTENT_LICENSE_SESSION) {
+ if (session_type != CdmSessionType::kPersistentLicense) {
new_promise = std::move(promise);
} else {
// Since it's a persistent session, we need to save the session ID after
@@ -135,7 +135,7 @@ void ClearKeyPersistentSessionCdm::LoadSession(
CdmSessionType session_type,
const std::string& session_id,
std::unique_ptr<NewSessionCdmPromise> promise) {
- DCHECK_EQ(CdmSessionType::PERSISTENT_LICENSE_SESSION, session_type);
+ DCHECK_EQ(CdmSessionType::kPersistentLicense, session_type);
// Load the saved state for |session_id| and then create the session.
std::unique_ptr<CdmFileAdapter> file(new CdmFileAdapter(cdm_host_proxy_));
@@ -180,8 +180,7 @@ void ClearKeyPersistentSessionCdm::OnFileReadForLoadSession(
}
// Add the session to the list of active sessions.
- if (!cdm_->CreateSession(session_id,
- CdmSessionType::PERSISTENT_LICENSE_SESSION)) {
+ if (!cdm_->CreateSession(session_id, CdmSessionType::kPersistentLicense)) {
// If the session can't be created it's due to an already existing session
// with the same name.
promise->reject(CdmPromise::Exception::QUOTA_EXCEEDED_ERROR, 0,