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 <sstream> | 9 #include <sstream> |
9 #include <string> | 10 #include <string> |
10 #include <vector> | 11 #include <vector> |
11 | 12 |
12 #include "base/bind.h" | 13 #include "base/bind.h" |
13 #include "base/debug/trace_event.h" | 14 #include "base/debug/trace_event.h" |
14 #include "base/logging.h" | 15 #include "base/logging.h" |
15 #include "base/time/time.h" | 16 #include "base/time/time.h" |
16 #include "media/base/decoder_buffer.h" | 17 #include "media/base/decoder_buffer.h" |
17 #include "media/base/decrypt_config.h" | 18 #include "media/base/decrypt_config.h" |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
189 base::Bind(&ClearKeyCdm::OnSessionCreated, base::Unretained(this)), | 190 base::Bind(&ClearKeyCdm::OnSessionCreated, base::Unretained(this)), |
190 base::Bind(&ClearKeyCdm::OnSessionMessage, base::Unretained(this)), | 191 base::Bind(&ClearKeyCdm::OnSessionMessage, base::Unretained(this)), |
191 base::Bind(&ClearKeyCdm::OnSessionReady, base::Unretained(this)), | 192 base::Bind(&ClearKeyCdm::OnSessionReady, base::Unretained(this)), |
192 base::Bind(&ClearKeyCdm::OnSessionClosed, base::Unretained(this)), | 193 base::Bind(&ClearKeyCdm::OnSessionClosed, base::Unretained(this)), |
193 base::Bind(&ClearKeyCdm::OnSessionError, base::Unretained(this))), | 194 base::Bind(&ClearKeyCdm::OnSessionError, base::Unretained(this))), |
194 host_(host), | 195 host_(host), |
195 key_system_(key_system), | 196 key_system_(key_system), |
196 last_session_id_(MediaKeys::kInvalidSessionId), | 197 last_session_id_(MediaKeys::kInvalidSessionId), |
197 session_id_for_emulated_loadsession_(MediaKeys::kInvalidSessionId), | 198 session_id_for_emulated_loadsession_(MediaKeys::kInvalidSessionId), |
198 timer_delay_ms_(kInitialTimerDelayMs), | 199 timer_delay_ms_(kInitialTimerDelayMs), |
199 timer_set_(false) { | 200 heartbeat_timer_set_(false) { |
200 #if defined(CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER) | 201 #if defined(CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER) |
201 channel_count_ = 0; | 202 channel_count_ = 0; |
202 bits_per_channel_ = 0; | 203 bits_per_channel_ = 0; |
203 samples_per_second_ = 0; | 204 samples_per_second_ = 0; |
204 output_timestamp_base_in_microseconds_ = kNoTimestamp; | 205 output_timestamp_base_in_microseconds_ = kNoTimestamp; |
205 total_samples_generated_ = 0; | 206 total_samples_generated_ = 0; |
206 #endif // CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER | 207 #endif // CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER |
207 } | 208 } |
208 | 209 |
209 ClearKeyCdm::~ClearKeyCdm() {} | 210 ClearKeyCdm::~ClearKeyCdm() {} |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
243 | 244 |
244 decryptor_.CreateSession(session_id, kLoadableSessionContentType, NULL, 0); | 245 decryptor_.CreateSession(session_id, kLoadableSessionContentType, NULL, 0); |
245 } | 246 } |
246 | 247 |
247 void ClearKeyCdm::UpdateSession(uint32 session_id, | 248 void ClearKeyCdm::UpdateSession(uint32 session_id, |
248 const uint8* response, | 249 const uint8* response, |
249 uint32 response_size) { | 250 uint32 response_size) { |
250 DVLOG(1) << __FUNCTION__; | 251 DVLOG(1) << __FUNCTION__; |
251 decryptor_.UpdateSession(session_id, response, response_size); | 252 decryptor_.UpdateSession(session_id, response, response_size); |
252 | 253 |
253 if (!timer_set_) { | 254 if (!heartbeat_timer_set_) { |
254 ScheduleNextHeartBeat(); | 255 ScheduleNextHeartBeat(); |
255 timer_set_ = true; | 256 heartbeat_timer_set_ = true; |
256 } | 257 } |
257 } | 258 } |
258 | 259 |
259 void ClearKeyCdm::ReleaseSession(uint32 session_id) { | 260 void ClearKeyCdm::ReleaseSession(uint32 session_id) { |
260 DVLOG(1) << __FUNCTION__; | 261 DVLOG(1) << __FUNCTION__; |
261 decryptor_.ReleaseSession(session_id); | 262 decryptor_.ReleaseSession(session_id); |
262 } | 263 } |
263 | 264 |
264 void ClearKeyCdm::TimerExpired(void* context) { | 265 void ClearKeyCdm::TimerExpired(void* context) { |
266 if (context == &session_id_for_emulated_loadsession_) { | |
267 UpdateLoadableSession(); | |
268 return; | |
269 } | |
270 | |
265 std::string heartbeat_message; | 271 std::string heartbeat_message; |
ddorwin
2014/02/19 00:04:09
Should we add this before this line?
DCHECK(heartb
xhwang
2014/02/19 00:24:23
Done.
| |
266 if (!next_heartbeat_message_.empty() && | 272 if (!next_heartbeat_message_.empty() && |
267 context == &next_heartbeat_message_[0]) { | 273 context == &next_heartbeat_message_[0]) { |
268 heartbeat_message = next_heartbeat_message_; | 274 heartbeat_message = next_heartbeat_message_; |
269 } else { | 275 } else { |
270 heartbeat_message = "ERROR: Invalid timer context found!"; | 276 heartbeat_message = "ERROR: Invalid timer context found!"; |
271 } | 277 } |
272 | 278 |
273 // This URL is only used for testing the code path for defaultURL. | 279 // This URL is only used for testing the code path for defaultURL. |
274 // There is no service at this URL, so applications should ignore it. | 280 // There is no service at this URL, so applications should ignore it. |
275 const char url[] = "http://test.externalclearkey.chromium.org"; | 281 const char url[] = "http://test.externalclearkey.chromium.org"; |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
514 void ClearKeyCdm::OnPlatformChallengeResponse( | 520 void ClearKeyCdm::OnPlatformChallengeResponse( |
515 const cdm::PlatformChallengeResponse& response) { | 521 const cdm::PlatformChallengeResponse& response) { |
516 NOTIMPLEMENTED(); | 522 NOTIMPLEMENTED(); |
517 } | 523 } |
518 | 524 |
519 void ClearKeyCdm::OnQueryOutputProtectionStatus( | 525 void ClearKeyCdm::OnQueryOutputProtectionStatus( |
520 uint32_t link_mask, uint32_t output_protection_mask) { | 526 uint32_t link_mask, uint32_t output_protection_mask) { |
521 NOTIMPLEMENTED(); | 527 NOTIMPLEMENTED(); |
522 }; | 528 }; |
523 | 529 |
524 void ClearKeyCdm::UpdateLoadableSession() { | 530 void ClearKeyCdm::UpdateLoadableSession() { |
ddorwin
2014/02/19 00:04:09
I think we need a better name for this. Update() i
xhwang
2014/02/19 00:24:23
Done.
| |
525 std::string jwk_set = GenerateJWKSet(kLoadableSessionKey, | 531 std::string jwk_set = GenerateJWKSet(kLoadableSessionKey, |
526 sizeof(kLoadableSessionKey), | 532 sizeof(kLoadableSessionKey), |
527 kLoadableSessionKeyId, | 533 kLoadableSessionKeyId, |
528 sizeof(kLoadableSessionKeyId) - 1); | 534 sizeof(kLoadableSessionKeyId) - 1); |
529 // TODO(xhwang): This triggers OnSessionUpdated(). For prefixed EME support, | 535 // TODO(xhwang): This triggers OnSessionUpdated(). For prefixed EME support, |
530 // this is okay. Check WD EME support. | 536 // this is okay. Check WD EME support. |
531 decryptor_.UpdateSession(session_id_for_emulated_loadsession_, | 537 decryptor_.UpdateSession(session_id_for_emulated_loadsession_, |
532 reinterpret_cast<const uint8*>(jwk_set.data()), | 538 reinterpret_cast<const uint8*>(jwk_set.data()), |
533 jwk_set.size()); | 539 jwk_set.size()); |
534 } | 540 } |
535 | 541 |
536 void ClearKeyCdm::OnSessionCreated(uint32 session_id, | 542 void ClearKeyCdm::OnSessionCreated(uint32 session_id, |
537 const std::string& web_session_id) { | 543 const std::string& web_session_id) { |
538 std::string new_web_session_id = web_session_id; | 544 std::string new_web_session_id = web_session_id; |
539 | 545 |
540 if (session_id == session_id_for_emulated_loadsession_) { | 546 if (session_id == session_id_for_emulated_loadsession_) { |
541 new_web_session_id = kLoadableWebSessionId; | 547 // Delay UpdateLoadableSession() to test the case where Decrypt*() calls are |
542 UpdateLoadableSession(); | 548 // made before the session is fully loaded. |
543 session_id_for_emulated_loadsession_ = MediaKeys::kInvalidSessionId; | 549 const int64 kDelayToLoadSessionMs = 500; |
xhwang
2014/02/18 23:19:16
Ideally we should keep the old test (where the del
| |
550 host_->SetTimer(kDelayToLoadSessionMs, | |
551 &session_id_for_emulated_loadsession_); | |
ddorwin
2014/02/19 00:04:09
It might be nice to clarify somewhere that we're u
xhwang
2014/02/19 00:24:23
Done.
| |
552 // Defer OnSessionCreated until the session is updated with | |
ddorwin
2014/02/19 00:04:09
... until the loadable session is initialized?
xhwang
2014/02/19 00:24:23
Done.
| |
553 // kLoadableSessionKey. | |
554 return; | |
544 } | 555 } |
545 | 556 |
546 host_->OnSessionCreated( | 557 host_->OnSessionCreated( |
547 session_id, new_web_session_id.data(), new_web_session_id.size()); | 558 session_id, web_session_id.data(), web_session_id.size()); |
548 } | 559 } |
549 | 560 |
550 void ClearKeyCdm::OnSessionMessage(uint32 session_id, | 561 void ClearKeyCdm::OnSessionMessage(uint32 session_id, |
551 const std::vector<uint8>& message, | 562 const std::vector<uint8>& message, |
552 const std::string& destination_url) { | 563 const std::string& destination_url) { |
564 DVLOG(1) << "OnSessionMessage: " << message.size(); | |
565 | |
566 // Ignore the Message when we are waiting to update the loadable session. | |
ddorwin
2014/02/19 00:04:09
nit: Is upper case 'M' intentional?
xhwang
2014/02/19 00:24:23
Done.
| |
567 if (session_id == session_id_for_emulated_loadsession_) | |
568 return; | |
569 | |
553 host_->OnSessionMessage(session_id, | 570 host_->OnSessionMessage(session_id, |
554 reinterpret_cast<const char*>(message.data()), | 571 reinterpret_cast<const char*>(message.data()), |
555 message.size(), | 572 message.size(), |
556 destination_url.data(), | 573 destination_url.data(), |
557 destination_url.size()); | 574 destination_url.size()); |
558 } | 575 } |
559 | 576 |
560 void ClearKeyCdm::OnSessionReady(uint32 session_id) { | 577 void ClearKeyCdm::OnSessionReady(uint32 session_id) { |
578 if (session_id == session_id_for_emulated_loadsession_) { | |
579 session_id_for_emulated_loadsession_ = MediaKeys::kInvalidSessionId; | |
580 host_->OnSessionCreated( | |
581 session_id, kLoadableWebSessionId, strlen(kLoadableWebSessionId)); | |
582 } | |
583 | |
561 host_->OnSessionReady(session_id); | 584 host_->OnSessionReady(session_id); |
562 } | 585 } |
563 | 586 |
564 void ClearKeyCdm::OnSessionClosed(uint32 session_id) { | 587 void ClearKeyCdm::OnSessionClosed(uint32 session_id) { |
565 host_->OnSessionClosed(session_id); | 588 host_->OnSessionClosed(session_id); |
566 } | 589 } |
567 | 590 |
568 void ClearKeyCdm::OnSessionError(uint32 session_id, | 591 void ClearKeyCdm::OnSessionError(uint32 session_id, |
569 media::MediaKeys::KeyError error_code, | 592 media::MediaKeys::KeyError error_code, |
570 int system_code) { | 593 int system_code) { |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
640 | 663 |
641 void ClearKeyCdm::OnFileIOTestComplete(bool success) { | 664 void ClearKeyCdm::OnFileIOTestComplete(bool success) { |
642 DVLOG(1) << __FUNCTION__ << ": " << success; | 665 DVLOG(1) << __FUNCTION__ << ": " << success; |
643 std::string message = GetFileIOTestResultMessage(success); | 666 std::string message = GetFileIOTestResultMessage(success); |
644 host_->OnSessionMessage( | 667 host_->OnSessionMessage( |
645 last_session_id_, message.data(), message.size(), NULL, 0); | 668 last_session_id_, message.data(), message.size(), NULL, 0); |
646 file_io_test_runner_.reset(); | 669 file_io_test_runner_.reset(); |
647 } | 670 } |
648 | 671 |
649 } // namespace media | 672 } // namespace media |
OLD | NEW |