Chromium Code Reviews| 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 <string> | 10 #include <string> |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 88 const int64 kMaxTimerDelayMs = 1 * kSecondsPerMinute * kMsPerSecond; | 88 const int64 kMaxTimerDelayMs = 1 * kSecondsPerMinute * kMsPerSecond; |
| 89 // Heart beat message header. If a key message starts with |kHeartBeatHeader|, | 89 // Heart beat message header. If a key message starts with |kHeartBeatHeader|, |
| 90 // it's a heart beat message. Otherwise, it's a key request. | 90 // it's a heart beat message. Otherwise, it's a key request. |
| 91 const char kHeartBeatHeader[] = "HEARTBEAT"; | 91 const char kHeartBeatHeader[] = "HEARTBEAT"; |
| 92 // CDM file IO test result header. | 92 // CDM file IO test result header. |
| 93 const char kFileIOTestResultHeader[] = "FILEIOTESTRESULT"; | 93 const char kFileIOTestResultHeader[] = "FILEIOTESTRESULT"; |
| 94 | 94 |
| 95 // Copies |input_buffer| into a media::DecoderBuffer. If the |input_buffer| is | 95 // Copies |input_buffer| into a media::DecoderBuffer. If the |input_buffer| is |
| 96 // empty, an empty (end-of-stream) media::DecoderBuffer is returned. | 96 // empty, an empty (end-of-stream) media::DecoderBuffer is returned. |
| 97 static scoped_refptr<media::DecoderBuffer> CopyDecoderBufferFrom( | 97 static scoped_refptr<media::DecoderBuffer> CopyDecoderBufferFrom( |
| 98 const cdm::InputBuffer_1& input_buffer) { | 98 const cdm::InputBuffer& input_buffer) { |
| 99 if (!input_buffer.data) { | 99 if (!input_buffer.data) { |
| 100 DCHECK(!input_buffer.data_size); | 100 DCHECK(!input_buffer.data_size); |
| 101 return media::DecoderBuffer::CreateEOSBuffer(); | 101 return media::DecoderBuffer::CreateEOSBuffer(); |
| 102 } | 102 } |
| 103 | 103 |
| 104 // TODO(xhwang): Get rid of this copy. | 104 // TODO(xhwang): Get rid of this copy. |
| 105 scoped_refptr<media::DecoderBuffer> output_buffer = | 105 scoped_refptr<media::DecoderBuffer> output_buffer = |
| 106 media::DecoderBuffer::CopyFrom(input_buffer.data, input_buffer.data_size); | 106 media::DecoderBuffer::CopyFrom(input_buffer.data, input_buffer.data_size); |
| 107 | 107 |
| 108 std::vector<media::SubsampleEntry> subsamples; | 108 std::vector<media::SubsampleEntry> subsamples; |
| 109 for (uint32_t i = 0; i < input_buffer.num_subsamples; ++i) { | 109 for (uint32_t i = 0; i < input_buffer.num_subsamples; ++i) { |
| 110 media::SubsampleEntry subsample; | 110 media::SubsampleEntry subsample; |
| 111 subsample.clear_bytes = input_buffer.subsamples[i].clear_bytes; | 111 subsample.clear_bytes = input_buffer.subsamples[i].clear_bytes; |
| 112 subsample.cypher_bytes = input_buffer.subsamples[i].cipher_bytes; | 112 subsample.cypher_bytes = input_buffer.subsamples[i].cipher_bytes; |
| 113 subsamples.push_back(subsample); | 113 subsamples.push_back(subsample); |
| 114 } | 114 } |
| 115 | 115 |
| 116 DCHECK_EQ(input_buffer.data_offset, 0u); | |
| 117 scoped_ptr<media::DecryptConfig> decrypt_config(new media::DecryptConfig( | 116 scoped_ptr<media::DecryptConfig> decrypt_config(new media::DecryptConfig( |
| 118 std::string(reinterpret_cast<const char*>(input_buffer.key_id), | 117 std::string(reinterpret_cast<const char*>(input_buffer.key_id), |
| 119 input_buffer.key_id_size), | 118 input_buffer.key_id_size), |
| 120 std::string(reinterpret_cast<const char*>(input_buffer.iv), | 119 std::string(reinterpret_cast<const char*>(input_buffer.iv), |
| 121 input_buffer.iv_size), | 120 input_buffer.iv_size), |
| 122 subsamples)); | 121 subsamples)); |
| 123 | 122 |
| 124 output_buffer->set_decrypt_config(decrypt_config.Pass()); | 123 output_buffer->set_decrypt_config(decrypt_config.Pass()); |
| 125 output_buffer->set_timestamp( | 124 output_buffer->set_timestamp( |
| 126 base::TimeDelta::FromMicroseconds(input_buffer.timestamp)); | 125 base::TimeDelta::FromMicroseconds(input_buffer.timestamp)); |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 267 // (containing a |kLoadableSessionKey| for |kLoadableSessionKeyId|) is | 266 // (containing a |kLoadableSessionKey| for |kLoadableSessionKeyId|) is |
| 268 // supported. | 267 // supported. |
| 269 void ClearKeyCdm::LoadSession(uint32 promise_id, | 268 void ClearKeyCdm::LoadSession(uint32 promise_id, |
| 270 const char* web_session_id, | 269 const char* web_session_id, |
| 271 uint32_t web_session_id_length) { | 270 uint32_t web_session_id_length) { |
| 272 DVLOG(1) << __FUNCTION__; | 271 DVLOG(1) << __FUNCTION__; |
| 273 | 272 |
| 274 if (std::string(kLoadableWebSessionId) != | 273 if (std::string(kLoadableWebSessionId) != |
| 275 std::string(web_session_id, web_session_id_length)) { | 274 std::string(web_session_id, web_session_id_length)) { |
| 276 std::string message("Incorrect session id specified for LoadSession()."); | 275 std::string message("Incorrect session id specified for LoadSession()."); |
| 277 host_->OnRejectPromise(promise_id, | 276 host_->OnRejectPromise(promise_id, |
|
ddorwin
2014/08/08 23:36:25
Separate CL: This should be resolved with undefine
jrummell
2014/08/11 18:59:04
Added TODO.
| |
| 278 cdm::kInvalidAccessError, | 277 cdm::kInvalidAccessError, |
| 279 0, | 278 0, |
| 280 message.data(), | 279 message.data(), |
| 281 message.length()); | 280 message.length()); |
| 282 return; | 281 return; |
| 283 } | 282 } |
| 284 | 283 |
| 285 scoped_ptr<media::NewSessionCdmPromise> promise( | 284 scoped_ptr<media::NewSessionCdmPromise> promise( |
| 286 new media::NewSessionCdmPromise(base::Bind(&ClearKeyCdm::OnSessionLoaded, | 285 new media::NewSessionCdmPromise(base::Bind(&ClearKeyCdm::OnSessionLoaded, |
| 287 base::Unretained(this), | 286 base::Unretained(this), |
| 288 promise_id), | 287 promise_id), |
| 289 base::Bind(&ClearKeyCdm::OnPromiseFailed, | 288 base::Bind(&ClearKeyCdm::OnPromiseFailed, |
| 290 base::Unretained(this), | 289 base::Unretained(this), |
| 291 promise_id))); | 290 promise_id))); |
| 292 decryptor_.CreateSession(std::string(kLoadableSessionContentType), | 291 decryptor_.CreateSession(std::string(kLoadableSessionContentType), |
| 293 NULL, | 292 NULL, |
| 294 0, | 293 0, |
| 295 MediaKeys::TEMPORARY_SESSION, | 294 MediaKeys::TEMPORARY_SESSION, |
| 296 promise.Pass()); | 295 promise.Pass()); |
| 297 } | 296 } |
| 298 | 297 |
| 299 void ClearKeyCdm::UpdateSession(uint32 promise_id, | 298 void ClearKeyCdm::UpdateSession(uint32 promise_id, |
| 300 const char* web_session_id, | 299 const char* web_session_id, |
| 301 uint32_t web_session_id_size, | 300 uint32_t web_session_id_length, |
| 302 const uint8* response, | 301 const uint8* response, |
| 303 uint32 response_size) { | 302 uint32 response_size) { |
| 304 DVLOG(1) << __FUNCTION__; | 303 DVLOG(1) << __FUNCTION__; |
| 305 std::string web_session_str(web_session_id, web_session_id_size); | 304 std::string web_session_str(web_session_id, web_session_id_length); |
| 306 | 305 |
| 307 scoped_ptr<media::SimpleCdmPromise> promise(new media::SimpleCdmPromise( | 306 scoped_ptr<media::SimpleCdmPromise> promise(new media::SimpleCdmPromise( |
| 308 base::Bind(&ClearKeyCdm::OnSessionUpdated, | 307 base::Bind(&ClearKeyCdm::OnSessionUpdated, |
| 309 base::Unretained(this), | 308 base::Unretained(this), |
| 310 promise_id, | 309 promise_id, |
| 311 web_session_str), | 310 web_session_str), |
| 312 base::Bind( | 311 base::Bind( |
| 313 &ClearKeyCdm::OnPromiseFailed, base::Unretained(this), promise_id))); | 312 &ClearKeyCdm::OnPromiseFailed, base::Unretained(this), promise_id))); |
| 314 decryptor_.UpdateSession( | 313 decryptor_.UpdateSession( |
| 315 web_session_str, response, response_size, promise.Pass()); | 314 web_session_str, response, response_size, promise.Pass()); |
| 316 | 315 |
| 317 if (!heartbeat_timer_set_) { | 316 if (!heartbeat_timer_set_) { |
| 318 ScheduleNextHeartBeat(); | 317 ScheduleNextHeartBeat(); |
| 319 heartbeat_timer_set_ = true; | 318 heartbeat_timer_set_ = true; |
| 320 } | 319 } |
| 321 } | 320 } |
| 322 | 321 |
| 323 void ClearKeyCdm::ReleaseSession(uint32 promise_id, | 322 void ClearKeyCdm::CloseSession(uint32 promise_id, |
| 324 const char* web_session_id, | 323 const char* web_session_id, |
| 325 uint32_t web_session_id_size) { | 324 uint32_t web_session_id_length) { |
| 326 DVLOG(1) << __FUNCTION__; | 325 DVLOG(1) << __FUNCTION__; |
| 327 std::string web_session_str(web_session_id, web_session_id_size); | 326 std::string web_session_str(web_session_id, web_session_id_length); |
| 328 | 327 |
| 329 scoped_ptr<media::SimpleCdmPromise> promise(new media::SimpleCdmPromise( | 328 scoped_ptr<media::SimpleCdmPromise> promise(new media::SimpleCdmPromise( |
| 330 base::Bind(&ClearKeyCdm::OnSessionReleased, | 329 base::Bind(&ClearKeyCdm::OnSessionReleased, |
| 331 base::Unretained(this), | 330 base::Unretained(this), |
| 332 promise_id, | 331 promise_id, |
| 333 web_session_str), | 332 web_session_str), |
| 334 base::Bind( | 333 base::Bind( |
| 335 &ClearKeyCdm::OnPromiseFailed, base::Unretained(this), promise_id))); | 334 &ClearKeyCdm::OnPromiseFailed, base::Unretained(this), promise_id))); |
| 336 decryptor_.ReleaseSession(web_session_str, promise.Pass()); | 335 decryptor_.ReleaseSession(web_session_str, promise.Pass()); |
| 337 } | 336 } |
| 338 | 337 |
| 338 void ClearKeyCdm::RemoveSession(uint32 promise_id, | |
| 339 const char* web_session_id, | |
| 340 uint32_t web_session_id_length) { | |
| 341 DVLOG(1) << __FUNCTION__; | |
| 342 // RemoveSession only allowed for the simulated loadable session. | |
|
ddorwin
2014/08/08 23:36:25
Really, the session must be persistent. How about
jrummell
2014/08/11 18:59:04
Done.
| |
| 343 if (std::string(kLoadableWebSessionId) == | |
| 344 std::string(web_session_id, web_session_id_length)) { | |
| 345 host_->OnResolvePromise(promise_id); | |
| 346 } else { | |
| 347 std::string message("Incorrect session id specified for RemoveSession()."); | |
|
ddorwin
2014/08/08 23:36:25
"Not supported for non-persistent sessions."
jrummell
2014/08/11 18:59:04
Done.
| |
| 348 host_->OnRejectPromise(promise_id, | |
| 349 cdm::kInvalidAccessError, | |
| 350 0, | |
| 351 message.data(), | |
| 352 message.length()); | |
| 353 } | |
| 354 } | |
| 355 | |
| 339 void ClearKeyCdm::SetServerCertificate(uint32 promise_id, | 356 void ClearKeyCdm::SetServerCertificate(uint32 promise_id, |
| 340 const uint8_t* server_certificate_data, | 357 const uint8_t* server_certificate_data, |
| 341 uint32_t server_certificate_data_size) { | 358 uint32_t server_certificate_data_size) { |
| 342 // ClearKey doesn't use a server certificate. | 359 // ClearKey doesn't use a server certificate. |
| 343 host_->OnResolvePromise(promise_id); | 360 host_->OnResolvePromise(promise_id); |
| 344 } | 361 } |
| 345 | 362 |
| 363 void ClearKeyCdm::GetUsableKeyIds(uint32_t promise_id, | |
| 364 const char* web_session_id, | |
| 365 uint32_t web_session_id_length) { | |
| 366 std::string web_session_str(web_session_id, web_session_id_length); | |
| 367 scoped_ptr<media::KeyIdsPromise> promise(new media::KeyIdsPromise( | |
| 368 base::Bind(&ClearKeyCdm::OnUsableKeyIdsObtained, | |
| 369 base::Unretained(this), | |
| 370 promise_id), | |
| 371 base::Bind( | |
| 372 &ClearKeyCdm::OnPromiseFailed, base::Unretained(this), promise_id))); | |
| 373 decryptor_.GetUsableKeyIds(web_session_str, promise.Pass()); | |
| 374 } | |
| 375 | |
| 346 void ClearKeyCdm::TimerExpired(void* context) { | 376 void ClearKeyCdm::TimerExpired(void* context) { |
| 347 if (context == &session_id_for_emulated_loadsession_) { | 377 if (context == &session_id_for_emulated_loadsession_) { |
| 348 LoadLoadableSession(); | 378 LoadLoadableSession(); |
| 349 return; | 379 return; |
| 350 } | 380 } |
| 351 | 381 |
| 352 DCHECK(heartbeat_timer_set_); | 382 DCHECK(heartbeat_timer_set_); |
| 353 std::string heartbeat_message; | 383 std::string heartbeat_message; |
| 354 if (!next_heartbeat_message_.empty() && | 384 if (!next_heartbeat_message_.empty() && |
| 355 context == &next_heartbeat_message_[0]) { | 385 context == &next_heartbeat_message_[0]) { |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 374 | 404 |
| 375 static void CopyDecryptResults( | 405 static void CopyDecryptResults( |
| 376 media::Decryptor::Status* status_copy, | 406 media::Decryptor::Status* status_copy, |
| 377 scoped_refptr<media::DecoderBuffer>* buffer_copy, | 407 scoped_refptr<media::DecoderBuffer>* buffer_copy, |
| 378 media::Decryptor::Status status, | 408 media::Decryptor::Status status, |
| 379 const scoped_refptr<media::DecoderBuffer>& buffer) { | 409 const scoped_refptr<media::DecoderBuffer>& buffer) { |
| 380 *status_copy = status; | 410 *status_copy = status; |
| 381 *buffer_copy = buffer; | 411 *buffer_copy = buffer; |
| 382 } | 412 } |
| 383 | 413 |
| 384 cdm::Status ClearKeyCdm::Decrypt(const cdm::InputBuffer_1& encrypted_buffer, | 414 cdm::Status ClearKeyCdm::Decrypt(const cdm::InputBuffer& encrypted_buffer, |
| 385 cdm::DecryptedBlock* decrypted_block) { | 415 cdm::DecryptedBlock* decrypted_block) { |
| 386 DVLOG(1) << "Decrypt()"; | 416 DVLOG(1) << "Decrypt()"; |
| 387 DCHECK(encrypted_buffer.data); | 417 DCHECK(encrypted_buffer.data); |
| 388 | 418 |
| 389 scoped_refptr<media::DecoderBuffer> buffer; | 419 scoped_refptr<media::DecoderBuffer> buffer; |
| 390 cdm::Status status = DecryptToMediaDecoderBuffer(encrypted_buffer, &buffer); | 420 cdm::Status status = DecryptToMediaDecoderBuffer(encrypted_buffer, &buffer); |
| 391 | 421 |
| 392 if (status != cdm::kSuccess) | 422 if (status != cdm::kSuccess) |
| 393 return status; | 423 return status; |
| 394 | 424 |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 480 output_timestamp_base_in_microseconds_ = kNoTimestamp; | 510 output_timestamp_base_in_microseconds_ = kNoTimestamp; |
| 481 total_samples_generated_ = 0; | 511 total_samples_generated_ = 0; |
| 482 #endif | 512 #endif |
| 483 break; | 513 break; |
| 484 default: | 514 default: |
| 485 NOTREACHED() << "DeinitializeDecoder(): invalid cdm::StreamType"; | 515 NOTREACHED() << "DeinitializeDecoder(): invalid cdm::StreamType"; |
| 486 } | 516 } |
| 487 } | 517 } |
| 488 | 518 |
| 489 cdm::Status ClearKeyCdm::DecryptAndDecodeFrame( | 519 cdm::Status ClearKeyCdm::DecryptAndDecodeFrame( |
| 490 const cdm::InputBuffer_1& encrypted_buffer, | 520 const cdm::InputBuffer& encrypted_buffer, |
| 491 cdm::VideoFrame* decoded_frame) { | 521 cdm::VideoFrame* decoded_frame) { |
| 492 DVLOG(1) << "DecryptAndDecodeFrame()"; | 522 DVLOG(1) << "DecryptAndDecodeFrame()"; |
| 493 TRACE_EVENT0("media", "ClearKeyCdm::DecryptAndDecodeFrame"); | 523 TRACE_EVENT0("media", "ClearKeyCdm::DecryptAndDecodeFrame"); |
| 494 | 524 |
| 495 scoped_refptr<media::DecoderBuffer> buffer; | 525 scoped_refptr<media::DecoderBuffer> buffer; |
| 496 cdm::Status status = DecryptToMediaDecoderBuffer(encrypted_buffer, &buffer); | 526 cdm::Status status = DecryptToMediaDecoderBuffer(encrypted_buffer, &buffer); |
| 497 | 527 |
| 498 if (status != cdm::kSuccess) | 528 if (status != cdm::kSuccess) |
| 499 return status; | 529 return status; |
| 500 | 530 |
| 501 const uint8_t* data = NULL; | 531 const uint8_t* data = NULL; |
| 502 int32_t size = 0; | 532 int32_t size = 0; |
| 503 int64_t timestamp = 0; | 533 int64_t timestamp = 0; |
| 504 if (!buffer->end_of_stream()) { | 534 if (!buffer->end_of_stream()) { |
| 505 data = buffer->data(); | 535 data = buffer->data(); |
| 506 size = buffer->data_size(); | 536 size = buffer->data_size(); |
| 507 timestamp = encrypted_buffer.timestamp; | 537 timestamp = encrypted_buffer.timestamp; |
| 508 } | 538 } |
| 509 | 539 |
| 510 return video_decoder_->DecodeFrame(data, size, timestamp, decoded_frame); | 540 return video_decoder_->DecodeFrame(data, size, timestamp, decoded_frame); |
| 511 } | 541 } |
| 512 | 542 |
| 513 cdm::Status ClearKeyCdm::DecryptAndDecodeSamples( | 543 cdm::Status ClearKeyCdm::DecryptAndDecodeSamples( |
| 514 const cdm::InputBuffer_1& encrypted_buffer, | 544 const cdm::InputBuffer& encrypted_buffer, |
| 515 cdm::AudioFrames* audio_frames) { | 545 cdm::AudioFrames* audio_frames) { |
| 516 DVLOG(1) << "DecryptAndDecodeSamples()"; | 546 DVLOG(1) << "DecryptAndDecodeSamples()"; |
| 517 | 547 |
| 518 // Trigger a crash on purpose for testing purpose. | 548 // Trigger a crash on purpose for testing purpose. |
| 519 if (key_system_ == kExternalClearKeyCrashKeySystem) | 549 if (key_system_ == kExternalClearKeyCrashKeySystem) |
| 520 CHECK(false); | 550 CHECK(false); |
| 521 | 551 |
| 522 scoped_refptr<media::DecoderBuffer> buffer; | 552 scoped_refptr<media::DecoderBuffer> buffer; |
| 523 cdm::Status status = DecryptToMediaDecoderBuffer(encrypted_buffer, &buffer); | 553 cdm::Status status = DecryptToMediaDecoderBuffer(encrypted_buffer, &buffer); |
| 524 | 554 |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 550 | 580 |
| 551 void ClearKeyCdm::Destroy() { | 581 void ClearKeyCdm::Destroy() { |
| 552 DVLOG(1) << "Destroy()"; | 582 DVLOG(1) << "Destroy()"; |
| 553 delete this; | 583 delete this; |
| 554 } | 584 } |
| 555 | 585 |
| 556 void ClearKeyCdm::ScheduleNextHeartBeat() { | 586 void ClearKeyCdm::ScheduleNextHeartBeat() { |
| 557 // Prepare the next heartbeat message and set timer. | 587 // Prepare the next heartbeat message and set timer. |
| 558 std::ostringstream msg_stream; | 588 std::ostringstream msg_stream; |
| 559 msg_stream << kHeartBeatHeader << " from ClearKey CDM set at time " | 589 msg_stream << kHeartBeatHeader << " from ClearKey CDM set at time " |
| 560 << host_->GetCurrentTime() << "."; | 590 << host_->GetCurrentWallTime() << "."; |
| 561 next_heartbeat_message_ = msg_stream.str(); | 591 next_heartbeat_message_ = msg_stream.str(); |
| 562 | 592 |
| 563 host_->SetTimer(timer_delay_ms_, &next_heartbeat_message_[0]); | 593 host_->SetTimer(timer_delay_ms_, &next_heartbeat_message_[0]); |
| 564 | 594 |
| 565 // Use a smaller timer delay at start-up to facilitate testing. Increase the | 595 // Use a smaller timer delay at start-up to facilitate testing. Increase the |
| 566 // timer delay up to a limit to avoid message spam. | 596 // timer delay up to a limit to avoid message spam. |
| 567 if (timer_delay_ms_ < kMaxTimerDelayMs) | 597 if (timer_delay_ms_ < kMaxTimerDelayMs) |
| 568 timer_delay_ms_ = std::min(2 * timer_delay_ms_, kMaxTimerDelayMs); | 598 timer_delay_ms_ = std::min(2 * timer_delay_ms_, kMaxTimerDelayMs); |
| 569 } | 599 } |
| 570 | 600 |
| 571 cdm::Status ClearKeyCdm::DecryptToMediaDecoderBuffer( | 601 cdm::Status ClearKeyCdm::DecryptToMediaDecoderBuffer( |
| 572 const cdm::InputBuffer_1& encrypted_buffer, | 602 const cdm::InputBuffer& encrypted_buffer, |
| 573 scoped_refptr<media::DecoderBuffer>* decrypted_buffer) { | 603 scoped_refptr<media::DecoderBuffer>* decrypted_buffer) { |
| 574 DCHECK(decrypted_buffer); | 604 DCHECK(decrypted_buffer); |
| 575 scoped_refptr<media::DecoderBuffer> buffer = | 605 scoped_refptr<media::DecoderBuffer> buffer = |
| 576 CopyDecoderBufferFrom(encrypted_buffer); | 606 CopyDecoderBufferFrom(encrypted_buffer); |
| 577 | 607 |
| 578 if (buffer->end_of_stream()) { | 608 if (buffer->end_of_stream()) { |
| 579 *decrypted_buffer = buffer; | 609 *decrypted_buffer = buffer; |
| 580 return cdm::kSuccess; | 610 return cdm::kSuccess; |
| 581 } | 611 } |
| 582 | 612 |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 680 // Defer resolving the promise until the session is loaded. | 710 // Defer resolving the promise until the session is loaded. |
| 681 promise_id_for_emulated_loadsession_ = promise_id; | 711 promise_id_for_emulated_loadsession_ = promise_id; |
| 682 | 712 |
| 683 // Use the address of |session_id_for_emulated_loadsession_| as the timer | 713 // Use the address of |session_id_for_emulated_loadsession_| as the timer |
| 684 // context so that we can call LoadLoadableSession() when the timer expires. | 714 // context so that we can call LoadLoadableSession() when the timer expires. |
| 685 host_->SetTimer(kDelayToLoadSessionMs, &session_id_for_emulated_loadsession_); | 715 host_->SetTimer(kDelayToLoadSessionMs, &session_id_for_emulated_loadsession_); |
| 686 } | 716 } |
| 687 | 717 |
| 688 void ClearKeyCdm::OnSessionUpdated(uint32 promise_id, | 718 void ClearKeyCdm::OnSessionUpdated(uint32 promise_id, |
| 689 const std::string& web_session_id) { | 719 const std::string& web_session_id) { |
| 690 // OnSessionReady() only called as success for UpdateSession(). However, | 720 // UpdateSession() may be called to finish loading sessions, so handle |
|
ddorwin
2014/08/08 23:36:25
I wonder what this means. Is itan artifact of the
jrummell
2014/08/11 18:59:04
It's part of simulating LoadSession().
| |
| 691 // UpdateSession() also called to finish loading sessions, so handle | |
| 692 // appropriately. | 721 // appropriately. |
| 693 if (web_session_id == session_id_for_emulated_loadsession_) { | 722 if (web_session_id == session_id_for_emulated_loadsession_) { |
| 694 session_id_for_emulated_loadsession_ = std::string(); | 723 session_id_for_emulated_loadsession_ = std::string(); |
|
ddorwin
2014/08/08 23:36:25
Separate CL: Do we need session_id_for_emulated_lo
jrummell
2014/08/11 18:59:03
I think this is needed by the simulated LoadSessio
| |
| 695 // |promise_id| is the LoadSession() promise, so resolve appropriately. | 724 // |promise_id| is the LoadSession() promise, so resolve appropriately. |
| 696 host_->OnResolveNewSessionPromise( | 725 host_->OnResolveNewSessionPromise( |
| 697 promise_id, kLoadableWebSessionId, strlen(kLoadableWebSessionId)); | 726 promise_id, kLoadableWebSessionId, strlen(kLoadableWebSessionId)); |
| 698 host_->OnSessionReady(kLoadableWebSessionId, strlen(kLoadableWebSessionId)); | |
| 699 return; | 727 return; |
| 700 } | 728 } |
| 701 | 729 |
| 702 host_->OnResolvePromise(promise_id); | 730 host_->OnResolvePromise(promise_id); |
| 703 } | 731 } |
| 704 | 732 |
| 705 void ClearKeyCdm::OnSessionReleased(uint32 promise_id, | 733 void ClearKeyCdm::OnSessionReleased(uint32 promise_id, |
| 706 const std::string& web_session_id) { | 734 const std::string& web_session_id) { |
| 707 host_->OnResolvePromise(promise_id); | 735 host_->OnResolvePromise(promise_id); |
| 708 } | 736 } |
| 709 | 737 |
| 738 void ClearKeyCdm::OnUsableKeyIdsObtained(uint32 promise_id, | |
| 739 const KeyIdsVector& key_ids) { | |
| 740 scoped_ptr<cdm::BinaryData[]> result(new cdm::BinaryData[key_ids.size()]); | |
| 741 for (uint32 i = 0; i < key_ids.size(); ++i) { | |
| 742 result[i].data = key_ids[i].data(); | |
| 743 result[i].length = key_ids[i].size(); | |
| 744 } | |
| 745 host_->OnResolveKeyIdsPromise(promise_id, result.get(), key_ids.size()); | |
|
ddorwin
2014/08/08 23:36:25
result.size()
jrummell
2014/08/11 18:59:03
Not done. No operators on scoped_ptr<T[]> return t
| |
| 746 } | |
| 747 | |
| 710 void ClearKeyCdm::OnPromiseFailed(uint32 promise_id, | 748 void ClearKeyCdm::OnPromiseFailed(uint32 promise_id, |
| 711 MediaKeys::Exception exception_code, | 749 MediaKeys::Exception exception_code, |
| 712 uint32 system_code, | 750 uint32 system_code, |
| 713 const std::string& error_message) { | 751 const std::string& error_message) { |
| 714 host_->OnRejectPromise(promise_id, | 752 host_->OnRejectPromise(promise_id, |
| 715 ConvertException(exception_code), | 753 ConvertException(exception_code), |
| 716 system_code, | 754 system_code, |
| 717 error_message.data(), | 755 error_message.data(), |
| 718 error_message.length()); | 756 error_message.length()); |
| 719 } | 757 } |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 790 host_->OnSessionMessage(last_session_id_.data(), | 828 host_->OnSessionMessage(last_session_id_.data(), |
| 791 last_session_id_.length(), | 829 last_session_id_.length(), |
| 792 message.data(), | 830 message.data(), |
| 793 message.length(), | 831 message.length(), |
| 794 NULL, | 832 NULL, |
| 795 0); | 833 0); |
| 796 file_io_test_runner_.reset(); | 834 file_io_test_runner_.reset(); |
| 797 } | 835 } |
| 798 | 836 |
| 799 } // namespace media | 837 } // namespace media |
| OLD | NEW |