| 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 "webkit/renderer/media/crypto/ppapi/clear_key_cdm.h" | 5 #include "webkit/renderer/media/crypto/ppapi/clear_key_cdm.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <sstream> | 8 #include <sstream> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 } | 91 } |
| 92 | 92 |
| 93 scoped_ptr<media::DecryptConfig> decrypt_config(new media::DecryptConfig( | 93 scoped_ptr<media::DecryptConfig> decrypt_config(new media::DecryptConfig( |
| 94 std::string(reinterpret_cast<const char*>(input_buffer.key_id), | 94 std::string(reinterpret_cast<const char*>(input_buffer.key_id), |
| 95 input_buffer.key_id_size), | 95 input_buffer.key_id_size), |
| 96 std::string(reinterpret_cast<const char*>(input_buffer.iv), | 96 std::string(reinterpret_cast<const char*>(input_buffer.iv), |
| 97 input_buffer.iv_size), | 97 input_buffer.iv_size), |
| 98 input_buffer.data_offset, | 98 input_buffer.data_offset, |
| 99 subsamples)); | 99 subsamples)); |
| 100 | 100 |
| 101 output_buffer->SetDecryptConfig(decrypt_config.Pass()); | 101 output_buffer->set_decrypt_config(decrypt_config.Pass()); |
| 102 output_buffer->SetTimestamp( | 102 output_buffer->set_timestamp( |
| 103 base::TimeDelta::FromMicroseconds(input_buffer.timestamp)); | 103 base::TimeDelta::FromMicroseconds(input_buffer.timestamp)); |
| 104 | 104 |
| 105 return output_buffer; | 105 return output_buffer; |
| 106 } | 106 } |
| 107 | 107 |
| 108 template<typename Type> | 108 template<typename Type> |
| 109 class ScopedResetter { | 109 class ScopedResetter { |
| 110 public: | 110 public: |
| 111 explicit ScopedResetter(Type* object) : object_(object) {} | 111 explicit ScopedResetter(Type* object) : object_(object) {} |
| 112 ~ScopedResetter() { object_->Reset(); } | 112 ~ScopedResetter() { object_->Reset(); } |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 cdm::DecryptedBlock* decrypted_block) { | 292 cdm::DecryptedBlock* decrypted_block) { |
| 293 DVLOG(1) << "Decrypt()"; | 293 DVLOG(1) << "Decrypt()"; |
| 294 DCHECK(encrypted_buffer.data); | 294 DCHECK(encrypted_buffer.data); |
| 295 | 295 |
| 296 scoped_refptr<media::DecoderBuffer> buffer; | 296 scoped_refptr<media::DecoderBuffer> buffer; |
| 297 cdm::Status status = DecryptToMediaDecoderBuffer(encrypted_buffer, &buffer); | 297 cdm::Status status = DecryptToMediaDecoderBuffer(encrypted_buffer, &buffer); |
| 298 | 298 |
| 299 if (status != cdm::kSuccess) | 299 if (status != cdm::kSuccess) |
| 300 return status; | 300 return status; |
| 301 | 301 |
| 302 DCHECK(buffer->GetData()); | 302 DCHECK(buffer->data()); |
| 303 decrypted_block->SetDecryptedBuffer( | 303 decrypted_block->SetDecryptedBuffer( |
| 304 host_->Allocate(buffer->GetDataSize())); | 304 host_->Allocate(buffer->data_size())); |
| 305 memcpy(reinterpret_cast<void*>(decrypted_block->DecryptedBuffer()->Data()), | 305 memcpy(reinterpret_cast<void*>(decrypted_block->DecryptedBuffer()->Data()), |
| 306 buffer->GetData(), | 306 buffer->data(), |
| 307 buffer->GetDataSize()); | 307 buffer->data_size()); |
| 308 decrypted_block->DecryptedBuffer()->SetSize(buffer->GetDataSize()); | 308 decrypted_block->DecryptedBuffer()->SetSize(buffer->data_size()); |
| 309 decrypted_block->SetTimestamp(buffer->GetTimestamp().InMicroseconds()); | 309 decrypted_block->SetTimestamp(buffer->timestamp().InMicroseconds()); |
| 310 | 310 |
| 311 return cdm::kSuccess; | 311 return cdm::kSuccess; |
| 312 } | 312 } |
| 313 | 313 |
| 314 cdm::Status ClearKeyCdm::InitializeAudioDecoder( | 314 cdm::Status ClearKeyCdm::InitializeAudioDecoder( |
| 315 const cdm::AudioDecoderConfig& audio_decoder_config) { | 315 const cdm::AudioDecoderConfig& audio_decoder_config) { |
| 316 #if defined(CLEAR_KEY_CDM_USE_FFMPEG_DECODER) | 316 #if defined(CLEAR_KEY_CDM_USE_FFMPEG_DECODER) |
| 317 if (!audio_decoder_) | 317 if (!audio_decoder_) |
| 318 audio_decoder_.reset(new webkit_media::FFmpegCdmAudioDecoder(host_)); | 318 audio_decoder_.reset(new webkit_media::FFmpegCdmAudioDecoder(host_)); |
| 319 | 319 |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 | 395 |
| 396 scoped_refptr<media::DecoderBuffer> buffer; | 396 scoped_refptr<media::DecoderBuffer> buffer; |
| 397 cdm::Status status = DecryptToMediaDecoderBuffer(encrypted_buffer, &buffer); | 397 cdm::Status status = DecryptToMediaDecoderBuffer(encrypted_buffer, &buffer); |
| 398 | 398 |
| 399 if (status != cdm::kSuccess) | 399 if (status != cdm::kSuccess) |
| 400 return status; | 400 return status; |
| 401 | 401 |
| 402 const uint8_t* data = NULL; | 402 const uint8_t* data = NULL; |
| 403 int32_t size = 0; | 403 int32_t size = 0; |
| 404 int64_t timestamp = 0; | 404 int64_t timestamp = 0; |
| 405 if (!buffer->IsEndOfStream()) { | 405 if (!buffer->end_of_stream()) { |
| 406 data = buffer->GetData(); | 406 data = buffer->data(); |
| 407 size = buffer->GetDataSize(); | 407 size = buffer->data_size(); |
| 408 timestamp = encrypted_buffer.timestamp; | 408 timestamp = encrypted_buffer.timestamp; |
| 409 } | 409 } |
| 410 | 410 |
| 411 return video_decoder_->DecodeFrame(data, size, timestamp, decoded_frame); | 411 return video_decoder_->DecodeFrame(data, size, timestamp, decoded_frame); |
| 412 } | 412 } |
| 413 | 413 |
| 414 cdm::Status ClearKeyCdm::DecryptAndDecodeSamples( | 414 cdm::Status ClearKeyCdm::DecryptAndDecodeSamples( |
| 415 const cdm::InputBuffer& encrypted_buffer, | 415 const cdm::InputBuffer& encrypted_buffer, |
| 416 cdm::AudioFrames* audio_frames) { | 416 cdm::AudioFrames* audio_frames) { |
| 417 DVLOG(1) << "DecryptAndDecodeSamples()"; | 417 DVLOG(1) << "DecryptAndDecodeSamples()"; |
| 418 | 418 |
| 419 scoped_refptr<media::DecoderBuffer> buffer; | 419 scoped_refptr<media::DecoderBuffer> buffer; |
| 420 cdm::Status status = DecryptToMediaDecoderBuffer(encrypted_buffer, &buffer); | 420 cdm::Status status = DecryptToMediaDecoderBuffer(encrypted_buffer, &buffer); |
| 421 | 421 |
| 422 if (status != cdm::kSuccess) | 422 if (status != cdm::kSuccess) |
| 423 return status; | 423 return status; |
| 424 | 424 |
| 425 #if defined(CLEAR_KEY_CDM_USE_FFMPEG_DECODER) | 425 #if defined(CLEAR_KEY_CDM_USE_FFMPEG_DECODER) |
| 426 const uint8_t* data = NULL; | 426 const uint8_t* data = NULL; |
| 427 int32_t size = 0; | 427 int32_t size = 0; |
| 428 int64_t timestamp = 0; | 428 int64_t timestamp = 0; |
| 429 if (!buffer->IsEndOfStream()) { | 429 if (!buffer->end_of_stream()) { |
| 430 data = buffer->GetData(); | 430 data = buffer->data(); |
| 431 size = buffer->GetDataSize(); | 431 size = buffer->data_size(); |
| 432 timestamp = encrypted_buffer.timestamp; | 432 timestamp = encrypted_buffer.timestamp; |
| 433 } | 433 } |
| 434 | 434 |
| 435 return audio_decoder_->DecodeBuffer(data, size, timestamp, audio_frames); | 435 return audio_decoder_->DecodeBuffer(data, size, timestamp, audio_frames); |
| 436 #elif defined(CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER) | 436 #elif defined(CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER) |
| 437 int64 timestamp_in_microseconds = kNoTimestamp; | 437 int64 timestamp_in_microseconds = kNoTimestamp; |
| 438 if (!buffer->IsEndOfStream()) { | 438 if (!buffer->end_of_stream()) { |
| 439 timestamp_in_microseconds = buffer->GetTimestamp().InMicroseconds(); | 439 timestamp_in_microseconds = buffer->GetTimestamp().InMicroseconds(); |
| 440 DCHECK(timestamp_in_microseconds != kNoTimestamp); | 440 DCHECK(timestamp_in_microseconds != kNoTimestamp); |
| 441 } | 441 } |
| 442 return GenerateFakeAudioFrames(timestamp_in_microseconds, audio_frames); | 442 return GenerateFakeAudioFrames(timestamp_in_microseconds, audio_frames); |
| 443 #else | 443 #else |
| 444 return cdm::kSuccess; | 444 return cdm::kSuccess; |
| 445 #endif // CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER | 445 #endif // CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER |
| 446 } | 446 } |
| 447 | 447 |
| 448 void ClearKeyCdm::Destroy() { | 448 void ClearKeyCdm::Destroy() { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 465 timer_delay_ms_ = std::min(2 * timer_delay_ms_, kMaxTimerDelayMs); | 465 timer_delay_ms_ = std::min(2 * timer_delay_ms_, kMaxTimerDelayMs); |
| 466 } | 466 } |
| 467 | 467 |
| 468 cdm::Status ClearKeyCdm::DecryptToMediaDecoderBuffer( | 468 cdm::Status ClearKeyCdm::DecryptToMediaDecoderBuffer( |
| 469 const cdm::InputBuffer& encrypted_buffer, | 469 const cdm::InputBuffer& encrypted_buffer, |
| 470 scoped_refptr<media::DecoderBuffer>* decrypted_buffer) { | 470 scoped_refptr<media::DecoderBuffer>* decrypted_buffer) { |
| 471 DCHECK(decrypted_buffer); | 471 DCHECK(decrypted_buffer); |
| 472 scoped_refptr<media::DecoderBuffer> buffer = | 472 scoped_refptr<media::DecoderBuffer> buffer = |
| 473 CopyDecoderBufferFrom(encrypted_buffer); | 473 CopyDecoderBufferFrom(encrypted_buffer); |
| 474 | 474 |
| 475 if (buffer->IsEndOfStream()) { | 475 if (buffer->end_of_stream()) { |
| 476 *decrypted_buffer = buffer; | 476 *decrypted_buffer = buffer; |
| 477 return cdm::kSuccess; | 477 return cdm::kSuccess; |
| 478 } | 478 } |
| 479 | 479 |
| 480 // Callback is called synchronously, so we can use variables on the stack. | 480 // Callback is called synchronously, so we can use variables on the stack. |
| 481 media::Decryptor::Status status = media::Decryptor::kError; | 481 media::Decryptor::Status status = media::Decryptor::kError; |
| 482 // The AesDecryptor does not care what the stream type is. Pass kVideo | 482 // The AesDecryptor does not care what the stream type is. Pass kVideo |
| 483 // for both audio and video decryption. | 483 // for both audio and video decryption. |
| 484 decryptor_.Decrypt( | 484 decryptor_.Decrypt( |
| 485 media::Decryptor::kVideo, | 485 media::Decryptor::kVideo, |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 549 int samples_generated = GenerateFakeAudioFramesFromDuration( | 549 int samples_generated = GenerateFakeAudioFramesFromDuration( |
| 550 timestamp_in_microseconds - CurrentTimeStampInMicroseconds(), | 550 timestamp_in_microseconds - CurrentTimeStampInMicroseconds(), |
| 551 audio_frames); | 551 audio_frames); |
| 552 total_samples_generated_ += samples_generated; | 552 total_samples_generated_ += samples_generated; |
| 553 | 553 |
| 554 return samples_generated == 0 ? cdm::kNeedMoreData : cdm::kSuccess; | 554 return samples_generated == 0 ? cdm::kNeedMoreData : cdm::kSuccess; |
| 555 } | 555 } |
| 556 #endif // CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER | 556 #endif // CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER |
| 557 | 557 |
| 558 } // namespace webkit_media | 558 } // namespace webkit_media |
| OLD | NEW |