| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/cdm/ppapi/external_clear_key/clear_key_cdm.h" | 5 #include "media/cdm/ppapi/external_clear_key/clear_key_cdm.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cstring> | 8 #include <cstring> |
| 9 #include <sstream> | 9 #include <sstream> |
| 10 #include <utility> |
| 10 | 11 |
| 11 #include "base/bind.h" | 12 #include "base/bind.h" |
| 12 #include "base/logging.h" | 13 #include "base/logging.h" |
| 13 #include "base/macros.h" | 14 #include "base/macros.h" |
| 14 #include "base/time/time.h" | 15 #include "base/time/time.h" |
| 15 #include "base/trace_event/trace_event.h" | 16 #include "base/trace_event/trace_event.h" |
| 16 #include "media/base/cdm_callback_promise.h" | 17 #include "media/base/cdm_callback_promise.h" |
| 17 #include "media/base/cdm_key_information.h" | 18 #include "media/base/cdm_key_information.h" |
| 18 #include "media/base/decoder_buffer.h" | 19 #include "media/base/decoder_buffer.h" |
| 19 #include "media/base/decrypt_config.h" | 20 #include "media/base/decrypt_config.h" |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 input_buffer.subsamples[i].cipher_bytes)); | 106 input_buffer.subsamples[i].cipher_bytes)); |
| 106 } | 107 } |
| 107 | 108 |
| 108 scoped_ptr<media::DecryptConfig> decrypt_config(new media::DecryptConfig( | 109 scoped_ptr<media::DecryptConfig> decrypt_config(new media::DecryptConfig( |
| 109 std::string(reinterpret_cast<const char*>(input_buffer.key_id), | 110 std::string(reinterpret_cast<const char*>(input_buffer.key_id), |
| 110 input_buffer.key_id_size), | 111 input_buffer.key_id_size), |
| 111 std::string(reinterpret_cast<const char*>(input_buffer.iv), | 112 std::string(reinterpret_cast<const char*>(input_buffer.iv), |
| 112 input_buffer.iv_size), | 113 input_buffer.iv_size), |
| 113 subsamples)); | 114 subsamples)); |
| 114 | 115 |
| 115 output_buffer->set_decrypt_config(decrypt_config.Pass()); | 116 output_buffer->set_decrypt_config(std::move(decrypt_config)); |
| 116 output_buffer->set_timestamp( | 117 output_buffer->set_timestamp( |
| 117 base::TimeDelta::FromMicroseconds(input_buffer.timestamp)); | 118 base::TimeDelta::FromMicroseconds(input_buffer.timestamp)); |
| 118 | 119 |
| 119 return output_buffer; | 120 return output_buffer; |
| 120 } | 121 } |
| 121 | 122 |
| 122 static std::string GetFileIOTestResultMessage(bool success) { | 123 static std::string GetFileIOTestResultMessage(bool success) { |
| 123 std::string message(kFileIOTestResultHeader); | 124 std::string message(kFileIOTestResultHeader); |
| 124 message += success ? '1' : '0'; | 125 message += success ? '1' : '0'; |
| 125 return message; | 126 return message; |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 299 new media::CdmCallbackPromise<std::string>( | 300 new media::CdmCallbackPromise<std::string>( |
| 300 base::Bind(&ClearKeyCdm::OnSessionCreated, | 301 base::Bind(&ClearKeyCdm::OnSessionCreated, |
| 301 base::Unretained(this), | 302 base::Unretained(this), |
| 302 promise_id), | 303 promise_id), |
| 303 base::Bind(&ClearKeyCdm::OnPromiseFailed, | 304 base::Bind(&ClearKeyCdm::OnPromiseFailed, |
| 304 base::Unretained(this), | 305 base::Unretained(this), |
| 305 promise_id))); | 306 promise_id))); |
| 306 decryptor_->CreateSessionAndGenerateRequest( | 307 decryptor_->CreateSessionAndGenerateRequest( |
| 307 ConvertSessionType(session_type), ConvertInitDataType(init_data_type), | 308 ConvertSessionType(session_type), ConvertInitDataType(init_data_type), |
| 308 std::vector<uint8_t>(init_data, init_data + init_data_size), | 309 std::vector<uint8_t>(init_data, init_data + init_data_size), |
| 309 promise.Pass()); | 310 std::move(promise)); |
| 310 | 311 |
| 311 if (key_system_ == kExternalClearKeyFileIOTestKeySystem) | 312 if (key_system_ == kExternalClearKeyFileIOTestKeySystem) |
| 312 StartFileIOTest(); | 313 StartFileIOTest(); |
| 313 } | 314 } |
| 314 | 315 |
| 315 // Loads a emulated stored session. Currently only |kLoadableSessionId| | 316 // Loads a emulated stored session. Currently only |kLoadableSessionId| |
| 316 // (containing a |kLoadableSessionKey| for |kLoadableSessionKeyId|) is | 317 // (containing a |kLoadableSessionKey| for |kLoadableSessionKeyId|) is |
| 317 // supported. | 318 // supported. |
| 318 void ClearKeyCdm::LoadSession(uint32_t promise_id, | 319 void ClearKeyCdm::LoadSession(uint32_t promise_id, |
| 319 cdm::SessionType session_type, | 320 cdm::SessionType session_type, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 334 scoped_ptr<media::NewSessionCdmPromise> promise( | 335 scoped_ptr<media::NewSessionCdmPromise> promise( |
| 335 new media::CdmCallbackPromise<std::string>( | 336 new media::CdmCallbackPromise<std::string>( |
| 336 base::Bind(&ClearKeyCdm::OnSessionLoaded, | 337 base::Bind(&ClearKeyCdm::OnSessionLoaded, |
| 337 base::Unretained(this), | 338 base::Unretained(this), |
| 338 promise_id), | 339 promise_id), |
| 339 base::Bind(&ClearKeyCdm::OnPromiseFailed, | 340 base::Bind(&ClearKeyCdm::OnPromiseFailed, |
| 340 base::Unretained(this), | 341 base::Unretained(this), |
| 341 promise_id))); | 342 promise_id))); |
| 342 decryptor_->CreateSessionAndGenerateRequest( | 343 decryptor_->CreateSessionAndGenerateRequest( |
| 343 MediaKeys::TEMPORARY_SESSION, EmeInitDataType::WEBM, | 344 MediaKeys::TEMPORARY_SESSION, EmeInitDataType::WEBM, |
| 344 std::vector<uint8_t>(), promise.Pass()); | 345 std::vector<uint8_t>(), std::move(promise)); |
| 345 } | 346 } |
| 346 | 347 |
| 347 void ClearKeyCdm::UpdateSession(uint32_t promise_id, | 348 void ClearKeyCdm::UpdateSession(uint32_t promise_id, |
| 348 const char* session_id, | 349 const char* session_id, |
| 349 uint32_t session_id_length, | 350 uint32_t session_id_length, |
| 350 const uint8_t* response, | 351 const uint8_t* response, |
| 351 uint32_t response_size) { | 352 uint32_t response_size) { |
| 352 DVLOG(1) << __FUNCTION__; | 353 DVLOG(1) << __FUNCTION__; |
| 353 std::string web_session_str(session_id, session_id_length); | 354 std::string web_session_str(session_id, session_id_length); |
| 354 | 355 |
| 355 // If updating the loadable session, use the actual session id generated. | 356 // If updating the loadable session, use the actual session id generated. |
| 356 if (web_session_str == std::string(kLoadableSessionId)) | 357 if (web_session_str == std::string(kLoadableSessionId)) |
| 357 web_session_str = session_id_for_emulated_loadsession_; | 358 web_session_str = session_id_for_emulated_loadsession_; |
| 358 | 359 |
| 359 scoped_ptr<media::SimpleCdmPromise> promise(new media::CdmCallbackPromise<>( | 360 scoped_ptr<media::SimpleCdmPromise> promise(new media::CdmCallbackPromise<>( |
| 360 base::Bind(&ClearKeyCdm::OnPromiseResolved, base::Unretained(this), | 361 base::Bind(&ClearKeyCdm::OnPromiseResolved, base::Unretained(this), |
| 361 promise_id), | 362 promise_id), |
| 362 base::Bind(&ClearKeyCdm::OnPromiseFailed, base::Unretained(this), | 363 base::Bind(&ClearKeyCdm::OnPromiseFailed, base::Unretained(this), |
| 363 promise_id))); | 364 promise_id))); |
| 364 decryptor_->UpdateSession( | 365 decryptor_->UpdateSession( |
| 365 web_session_str, std::vector<uint8_t>(response, response + response_size), | 366 web_session_str, std::vector<uint8_t>(response, response + response_size), |
| 366 promise.Pass()); | 367 std::move(promise)); |
| 367 | 368 |
| 368 if (!renewal_timer_set_) { | 369 if (!renewal_timer_set_) { |
| 369 ScheduleNextRenewal(); | 370 ScheduleNextRenewal(); |
| 370 renewal_timer_set_ = true; | 371 renewal_timer_set_ = true; |
| 371 } | 372 } |
| 372 } | 373 } |
| 373 | 374 |
| 374 void ClearKeyCdm::CloseSession(uint32_t promise_id, | 375 void ClearKeyCdm::CloseSession(uint32_t promise_id, |
| 375 const char* session_id, | 376 const char* session_id, |
| 376 uint32_t session_id_length) { | 377 uint32_t session_id_length) { |
| 377 DVLOG(1) << __FUNCTION__; | 378 DVLOG(1) << __FUNCTION__; |
| 378 std::string web_session_str(session_id, session_id_length); | 379 std::string web_session_str(session_id, session_id_length); |
| 379 | 380 |
| 380 // If closing the loadable session, use the actual session id generated. | 381 // If closing the loadable session, use the actual session id generated. |
| 381 if (web_session_str == std::string(kLoadableSessionId)) | 382 if (web_session_str == std::string(kLoadableSessionId)) |
| 382 web_session_str = session_id_for_emulated_loadsession_; | 383 web_session_str = session_id_for_emulated_loadsession_; |
| 383 | 384 |
| 384 scoped_ptr<media::SimpleCdmPromise> promise(new media::CdmCallbackPromise<>( | 385 scoped_ptr<media::SimpleCdmPromise> promise(new media::CdmCallbackPromise<>( |
| 385 base::Bind( | 386 base::Bind( |
| 386 &ClearKeyCdm::OnPromiseResolved, base::Unretained(this), promise_id), | 387 &ClearKeyCdm::OnPromiseResolved, base::Unretained(this), promise_id), |
| 387 base::Bind( | 388 base::Bind( |
| 388 &ClearKeyCdm::OnPromiseFailed, base::Unretained(this), promise_id))); | 389 &ClearKeyCdm::OnPromiseFailed, base::Unretained(this), promise_id))); |
| 389 decryptor_->CloseSession(web_session_str, promise.Pass()); | 390 decryptor_->CloseSession(web_session_str, std::move(promise)); |
| 390 } | 391 } |
| 391 | 392 |
| 392 void ClearKeyCdm::RemoveSession(uint32_t promise_id, | 393 void ClearKeyCdm::RemoveSession(uint32_t promise_id, |
| 393 const char* session_id, | 394 const char* session_id, |
| 394 uint32_t session_id_length) { | 395 uint32_t session_id_length) { |
| 395 DVLOG(1) << __FUNCTION__; | 396 DVLOG(1) << __FUNCTION__; |
| 396 std::string web_session_str(session_id, session_id_length); | 397 std::string web_session_str(session_id, session_id_length); |
| 397 | 398 |
| 398 // RemoveSession only allowed for the loadable session. | 399 // RemoveSession only allowed for the loadable session. |
| 399 if (web_session_str == std::string(kLoadableSessionId)) { | 400 if (web_session_str == std::string(kLoadableSessionId)) { |
| 400 web_session_str = session_id_for_emulated_loadsession_; | 401 web_session_str = session_id_for_emulated_loadsession_; |
| 401 } else { | 402 } else { |
| 402 // TODO(jrummell): This should be a DCHECK once blink does the proper | 403 // TODO(jrummell): This should be a DCHECK once blink does the proper |
| 403 // checks. | 404 // checks. |
| 404 std::string message("Not supported for non-persistent sessions."); | 405 std::string message("Not supported for non-persistent sessions."); |
| 405 host_->OnRejectPromise(promise_id, | 406 host_->OnRejectPromise(promise_id, |
| 406 cdm::kInvalidAccessError, | 407 cdm::kInvalidAccessError, |
| 407 0, | 408 0, |
| 408 message.data(), | 409 message.data(), |
| 409 message.length()); | 410 message.length()); |
| 410 return; | 411 return; |
| 411 } | 412 } |
| 412 | 413 |
| 413 scoped_ptr<media::SimpleCdmPromise> promise(new media::CdmCallbackPromise<>( | 414 scoped_ptr<media::SimpleCdmPromise> promise(new media::CdmCallbackPromise<>( |
| 414 base::Bind(&ClearKeyCdm::OnPromiseResolved, base::Unretained(this), | 415 base::Bind(&ClearKeyCdm::OnPromiseResolved, base::Unretained(this), |
| 415 promise_id), | 416 promise_id), |
| 416 base::Bind(&ClearKeyCdm::OnPromiseFailed, base::Unretained(this), | 417 base::Bind(&ClearKeyCdm::OnPromiseFailed, base::Unretained(this), |
| 417 promise_id))); | 418 promise_id))); |
| 418 decryptor_->RemoveSession(web_session_str, promise.Pass()); | 419 decryptor_->RemoveSession(web_session_str, std::move(promise)); |
| 419 } | 420 } |
| 420 | 421 |
| 421 void ClearKeyCdm::SetServerCertificate(uint32_t promise_id, | 422 void ClearKeyCdm::SetServerCertificate(uint32_t promise_id, |
| 422 const uint8_t* server_certificate_data, | 423 const uint8_t* server_certificate_data, |
| 423 uint32_t server_certificate_data_size) { | 424 uint32_t server_certificate_data_size) { |
| 424 // ClearKey doesn't use a server certificate. | 425 // ClearKey doesn't use a server certificate. |
| 425 host_->OnResolvePromise(promise_id); | 426 host_->OnResolvePromise(promise_id); |
| 426 } | 427 } |
| 427 | 428 |
| 428 void ClearKeyCdm::TimerExpired(void* context) { | 429 void ClearKeyCdm::TimerExpired(void* context) { |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 693 std::string jwk_set = GenerateJWKSet(kLoadableSessionKey, | 694 std::string jwk_set = GenerateJWKSet(kLoadableSessionKey, |
| 694 sizeof(kLoadableSessionKey), | 695 sizeof(kLoadableSessionKey), |
| 695 kLoadableSessionKeyId, | 696 kLoadableSessionKeyId, |
| 696 sizeof(kLoadableSessionKeyId) - 1); | 697 sizeof(kLoadableSessionKeyId) - 1); |
| 697 scoped_ptr<media::SimpleCdmPromise> promise(new media::CdmCallbackPromise<>( | 698 scoped_ptr<media::SimpleCdmPromise> promise(new media::CdmCallbackPromise<>( |
| 698 base::Bind(&ClearKeyCdm::OnLoadSessionUpdated, base::Unretained(this)), | 699 base::Bind(&ClearKeyCdm::OnLoadSessionUpdated, base::Unretained(this)), |
| 699 base::Bind(&ClearKeyCdm::OnPromiseFailed, base::Unretained(this), | 700 base::Bind(&ClearKeyCdm::OnPromiseFailed, base::Unretained(this), |
| 700 promise_id_for_emulated_loadsession_))); | 701 promise_id_for_emulated_loadsession_))); |
| 701 decryptor_->UpdateSession( | 702 decryptor_->UpdateSession( |
| 702 session_id_for_emulated_loadsession_, | 703 session_id_for_emulated_loadsession_, |
| 703 std::vector<uint8_t>(jwk_set.begin(), jwk_set.end()), promise.Pass()); | 704 std::vector<uint8_t>(jwk_set.begin(), jwk_set.end()), std::move(promise)); |
| 704 } | 705 } |
| 705 | 706 |
| 706 void ClearKeyCdm::OnSessionMessage(const std::string& session_id, | 707 void ClearKeyCdm::OnSessionMessage(const std::string& session_id, |
| 707 MediaKeys::MessageType message_type, | 708 MediaKeys::MessageType message_type, |
| 708 const std::vector<uint8_t>& message, | 709 const std::vector<uint8_t>& message, |
| 709 const GURL& legacy_destination_url) { | 710 const GURL& legacy_destination_url) { |
| 710 DVLOG(1) << "OnSessionMessage: " << message.size(); | 711 DVLOG(1) << "OnSessionMessage: " << message.size(); |
| 711 | 712 |
| 712 // Ignore the message when we are waiting to update the loadable session. | 713 // Ignore the message when we are waiting to update the loadable session. |
| 713 if (session_id == session_id_for_emulated_loadsession_) | 714 if (session_id == session_id_for_emulated_loadsession_) |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 903 void ClearKeyCdm::OnFileIOTestComplete(bool success) { | 904 void ClearKeyCdm::OnFileIOTestComplete(bool success) { |
| 904 DVLOG(1) << __FUNCTION__ << ": " << success; | 905 DVLOG(1) << __FUNCTION__ << ": " << success; |
| 905 std::string message = GetFileIOTestResultMessage(success); | 906 std::string message = GetFileIOTestResultMessage(success); |
| 906 host_->OnSessionMessage(last_session_id_.data(), last_session_id_.length(), | 907 host_->OnSessionMessage(last_session_id_.data(), last_session_id_.length(), |
| 907 cdm::kLicenseRequest, message.data(), | 908 cdm::kLicenseRequest, message.data(), |
| 908 message.length(), NULL, 0); | 909 message.length(), NULL, 0); |
| 909 file_io_test_runner_.reset(); | 910 file_io_test_runner_.reset(); |
| 910 } | 911 } |
| 911 | 912 |
| 912 } // namespace media | 913 } // namespace media |
| OLD | NEW |