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 |