| Index: media/cdm/ppapi/clear_key_cdm.cc
|
| diff --git a/media/cdm/ppapi/clear_key_cdm.cc b/media/cdm/ppapi/clear_key_cdm.cc
|
| index 6d3a68ce5ace11d71d1d10b1ba8343e957cd2d17..ef777191e3f9f16c1e914e203c7ef3972463648b 100644
|
| --- a/media/cdm/ppapi/clear_key_cdm.cc
|
| +++ b/media/cdm/ppapi/clear_key_cdm.cc
|
| @@ -15,6 +15,7 @@
|
| #include "base/time/time.h"
|
| #include "media/base/decoder_buffer.h"
|
| #include "media/base/decrypt_config.h"
|
| +#include "media/cdm/ppapi/cdm_file_io_test.h"
|
| #include "media/cdm/ppapi/cdm_video_decoder.h"
|
|
|
| #if defined(CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER)
|
| @@ -63,6 +64,8 @@ const char kClearKeyCdmVersion[] = "0.1.0.1";
|
| const char kExternalClearKeyKeySystem[] = "org.chromium.externalclearkey";
|
| const char kExternalClearKeyDecryptOnlyKeySystem[] =
|
| "org.chromium.externalclearkey.decryptonly";
|
| +const char kExternalClearKeyFileIOTestKeySystem[] =
|
| + "org.chromium.externalclearkey.fileiotest";
|
| const int64 kSecondsPerMinute = 60;
|
| const int64 kMsPerSecond = 1000;
|
| const int64 kInitialTimerDelayMs = 200;
|
| @@ -70,6 +73,8 @@ const int64 kMaxTimerDelayMs = 1 * kSecondsPerMinute * kMsPerSecond;
|
| // Heart beat message header. If a key message starts with |kHeartBeatHeader|,
|
| // it's a heart beat message. Otherwise, it's a key request.
|
| const char kHeartBeatHeader[] = "HEARTBEAT";
|
| +// CDM file IO test result header.
|
| +const char kFileIOTestResultHeader[] = "FILEIOTESTRESULT";
|
|
|
| // Copies |input_buffer| into a media::DecoderBuffer. If the |input_buffer| is
|
| // empty, an empty (end-of-stream) media::DecoderBuffer is returned.
|
| @@ -107,6 +112,12 @@ static scoped_refptr<media::DecoderBuffer> CopyDecoderBufferFrom(
|
| return output_buffer;
|
| }
|
|
|
| +static std::string GetFileIOTestResultMessage(bool success) {
|
| + std::string message(kFileIOTestResultHeader);
|
| + message += success ? '1' : '0';
|
| + return message;
|
| +}
|
| +
|
| template<typename Type>
|
| class ScopedResetter {
|
| public:
|
| @@ -135,7 +146,8 @@ void* CreateCdmInstance(int cdm_interface_version,
|
|
|
| std::string key_system_string(key_system, key_system_size);
|
| if (key_system_string != kExternalClearKeyKeySystem &&
|
| - key_system_string != kExternalClearKeyDecryptOnlyKeySystem) {
|
| + key_system_string != kExternalClearKeyDecryptOnlyKeySystem &&
|
| + key_system_string != kExternalClearKeyFileIOTestKeySystem) {
|
| DVLOG(1) << "Unsupported key system:" << key_system_string;
|
| return NULL;
|
| }
|
| @@ -149,7 +161,9 @@ void* CreateCdmInstance(int cdm_interface_version,
|
| return NULL;
|
|
|
| return new media::ClearKeyCdm(
|
| - host, key_system_string == kExternalClearKeyDecryptOnlyKeySystem);
|
| + host,
|
| + key_system_string == kExternalClearKeyDecryptOnlyKeySystem,
|
| + key_system_string == kExternalClearKeyFileIOTestKeySystem);
|
| }
|
|
|
| const char* GetCdmVersion() {
|
| @@ -207,7 +221,9 @@ void ClearKeyCdm::Client::OnSessionError(uint32 session_id,
|
| system_code_ = system_code;
|
| }
|
|
|
| -ClearKeyCdm::ClearKeyCdm(ClearKeyCdmHost* host, bool is_decrypt_only)
|
| +ClearKeyCdm::ClearKeyCdm(ClearKeyCdmHost* host,
|
| + bool is_decrypt_only,
|
| + bool test_file_io)
|
| : decryptor_(
|
| base::Bind(&Client::OnSessionCreated, base::Unretained(&client_)),
|
| base::Bind(&Client::OnSessionMessage, base::Unretained(&client_)),
|
| @@ -216,6 +232,7 @@ ClearKeyCdm::ClearKeyCdm(ClearKeyCdmHost* host, bool is_decrypt_only)
|
| base::Bind(&Client::OnSessionError, base::Unretained(&client_))),
|
| host_(host),
|
| is_decrypt_only_(is_decrypt_only),
|
| + test_file_io_(test_file_io),
|
| timer_delay_ms_(kInitialTimerDelayMs),
|
| timer_set_(false) {
|
| #if defined(CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER)
|
| @@ -249,14 +266,19 @@ cdm::Status ClearKeyCdm::GenerateKeyRequest(const char* type,
|
| return cdm::kSessionError;
|
| }
|
|
|
| + std::string web_session_id = client_.web_session_id();
|
| +
|
| host_->SendKeyMessage(
|
| - client_.web_session_id().data(), client_.web_session_id().size(),
|
| + web_session_id.data(), web_session_id.size(),
|
| reinterpret_cast<const char*>(&client_.message()[0]),
|
| client_.message().size(),
|
| client_.destination_url().data(), client_.destination_url().size());
|
|
|
| - // Only save the latest session ID for heartbeat messages.
|
| - heartbeat_session_id_ = client_.web_session_id();
|
| + // Save the latest session ID for heartbeat and file IO test messages.
|
| + last_session_id_ = web_session_id;
|
| +
|
| + if (test_file_io_)
|
| + StartFileIOTest();
|
|
|
| return cdm::kSuccess;
|
| }
|
| @@ -321,7 +343,7 @@ void ClearKeyCdm::TimerExpired(void* context) {
|
| const char url[] = "http://test.externalclearkey.chromium.org";
|
|
|
| host_->SendKeyMessage(
|
| - heartbeat_session_id_.data(), heartbeat_session_id_.size(),
|
| + last_session_id_.data(), last_session_id_.size(),
|
| heartbeat_message.data(), heartbeat_message.size(),
|
| url, arraysize(url) - 1);
|
|
|
| @@ -621,4 +643,20 @@ cdm::Status ClearKeyCdm::GenerateFakeAudioFrames(
|
| }
|
| #endif // CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER
|
|
|
| +void ClearKeyCdm::StartFileIOTest() {
|
| + cdm_file_io_test_.reset(new FileIOTestRunner(
|
| + base::Bind(&ClearKeyCdmHost::CreateFileIO, base::Unretained(host_))));
|
| + cdm_file_io_test_->RunAllTests(
|
| + base::Bind(&ClearKeyCdm::OnFileIOTestComplete, base::Unretained(this)));
|
| +}
|
| +
|
| +void ClearKeyCdm::OnFileIOTestComplete(bool success) {
|
| + DVLOG(1) << __FUNCTION__ << ": " << success;
|
| + std::string message = GetFileIOTestResultMessage(success);
|
| + host_->SendKeyMessage(last_session_id_.data(), last_session_id_.size(),
|
| + message.data(), message.size(),
|
| + NULL, 0);
|
| + cdm_file_io_test_.reset();
|
| +}
|
| +
|
| } // namespace media
|
|
|