| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/renderer/pepper/content_decryptor_delegate.h" | 5 #include "content/renderer/pepper/content_decryptor_delegate.h" |
| 6 | 6 |
| 7 #include "base/callback_helpers.h" | 7 #include "base/callback_helpers.h" |
| 8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
| 9 #include "base/message_loop/message_loop_proxy.h" | 9 #include "base/message_loop/message_loop_proxy.h" |
| 10 #include "base/safe_numerics.h" | 10 #include "base/safe_numerics.h" |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 249 : pp_instance_(pp_instance), | 249 : pp_instance_(pp_instance), |
| 250 plugin_decryption_interface_(plugin_decryption_interface), | 250 plugin_decryption_interface_(plugin_decryption_interface), |
| 251 next_decryption_request_id_(1), | 251 next_decryption_request_id_(1), |
| 252 audio_samples_per_second_(0), | 252 audio_samples_per_second_(0), |
| 253 audio_channel_count_(0), | 253 audio_channel_count_(0), |
| 254 weak_ptr_factory_(this) { | 254 weak_ptr_factory_(this) { |
| 255 weak_this_ = weak_ptr_factory_.GetWeakPtr(); | 255 weak_this_ = weak_ptr_factory_.GetWeakPtr(); |
| 256 } | 256 } |
| 257 | 257 |
| 258 ContentDecryptorDelegate::~ContentDecryptorDelegate() { | 258 ContentDecryptorDelegate::~ContentDecryptorDelegate() { |
| 259 SatisfyAllPendingCallbacksOnError(); |
| 259 } | 260 } |
| 260 | 261 |
| 261 void ContentDecryptorDelegate::Initialize(const std::string& key_system) { | 262 void ContentDecryptorDelegate::Initialize( |
| 263 const std::string& key_system, |
| 264 const media::SessionCreatedCB& session_created_cb, |
| 265 const media::SessionMessageCB& session_message_cb, |
| 266 const media::SessionReadyCB& session_ready_cb, |
| 267 const media::SessionClosedCB& session_closed_cb, |
| 268 const media::SessionErrorCB& session_error_cb, |
| 269 const base::Closure& fatal_plugin_error_cb) { |
| 262 DCHECK(!key_system.empty()); | 270 DCHECK(!key_system.empty()); |
| 263 DCHECK(key_system_.empty()); | 271 DCHECK(key_system_.empty()); |
| 264 key_system_ = key_system; | 272 key_system_ = key_system; |
| 265 | 273 |
| 266 plugin_decryption_interface_->Initialize( | |
| 267 pp_instance_, | |
| 268 StringVar::StringToPPVar(key_system_)); | |
| 269 } | |
| 270 | |
| 271 void ContentDecryptorDelegate::SetSessionEventCallbacks( | |
| 272 const media::SessionCreatedCB& session_created_cb, | |
| 273 const media::SessionMessageCB& session_message_cb, | |
| 274 const media::SessionReadyCB& session_ready_cb, | |
| 275 const media::SessionClosedCB& session_closed_cb, | |
| 276 const media::SessionErrorCB& session_error_cb) { | |
| 277 session_created_cb_ = session_created_cb; | 274 session_created_cb_ = session_created_cb; |
| 278 session_message_cb_ = session_message_cb; | 275 session_message_cb_ = session_message_cb; |
| 279 session_ready_cb_ = session_ready_cb; | 276 session_ready_cb_ = session_ready_cb; |
| 280 session_closed_cb_ = session_closed_cb; | 277 session_closed_cb_ = session_closed_cb; |
| 281 session_error_cb_ = session_error_cb; | 278 session_error_cb_ = session_error_cb; |
| 279 fatal_plugin_error_cb_ = fatal_plugin_error_cb; |
| 280 |
| 281 plugin_decryption_interface_->Initialize( |
| 282 pp_instance_, StringVar::StringToPPVar(key_system_)); |
| 283 } |
| 284 |
| 285 void ContentDecryptorDelegate::InstanceCrashed() { |
| 286 fatal_plugin_error_cb_.Run(); |
| 287 SatisfyAllPendingCallbacksOnError(); |
| 282 } | 288 } |
| 283 | 289 |
| 284 bool ContentDecryptorDelegate::CreateSession(uint32 session_id, | 290 bool ContentDecryptorDelegate::CreateSession(uint32 session_id, |
| 285 const std::string& type, | 291 const std::string& type, |
| 286 const uint8* init_data, | 292 const uint8* init_data, |
| 287 int init_data_length) { | 293 int init_data_length) { |
| 288 PP_Var init_data_array = | 294 PP_Var init_data_array = |
| 289 PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar( | 295 PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar( |
| 290 init_data_length, init_data); | 296 init_data_length, init_data); |
| 291 | 297 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 312 return true; | 318 return true; |
| 313 } | 319 } |
| 314 | 320 |
| 315 // TODO(xhwang): Remove duplication of code in Decrypt(), | 321 // TODO(xhwang): Remove duplication of code in Decrypt(), |
| 316 // DecryptAndDecodeAudio() and DecryptAndDecodeVideo(). | 322 // DecryptAndDecodeAudio() and DecryptAndDecodeVideo(). |
| 317 bool ContentDecryptorDelegate::Decrypt( | 323 bool ContentDecryptorDelegate::Decrypt( |
| 318 Decryptor::StreamType stream_type, | 324 Decryptor::StreamType stream_type, |
| 319 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, | 325 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, |
| 320 const Decryptor::DecryptCB& decrypt_cb) { | 326 const Decryptor::DecryptCB& decrypt_cb) { |
| 321 DVLOG(3) << "Decrypt() - stream_type: " << stream_type; | 327 DVLOG(3) << "Decrypt() - stream_type: " << stream_type; |
| 328 |
| 322 // |{audio|video}_input_resource_| is not being used by the plugin | 329 // |{audio|video}_input_resource_| is not being used by the plugin |
| 323 // now because there is only one pending audio/video decrypt request at any | 330 // now because there is only one pending audio/video decrypt request at any |
| 324 // time. This is enforced by the media pipeline. | 331 // time. This is enforced by the media pipeline. |
| 325 scoped_refptr<PPB_Buffer_Impl> encrypted_resource; | 332 scoped_refptr<PPB_Buffer_Impl> encrypted_resource; |
| 326 if (!MakeMediaBufferResource( | 333 if (!MakeMediaBufferResource( |
| 327 stream_type, encrypted_buffer, &encrypted_resource) || | 334 stream_type, encrypted_buffer, &encrypted_resource) || |
| 328 !encrypted_resource.get()) { | 335 !encrypted_resource.get()) { |
| 329 return false; | 336 return false; |
| 330 } | 337 } |
| 331 ScopedPPResource pp_resource(encrypted_resource.get()); | 338 ScopedPPResource pp_resource(encrypted_resource.get()); |
| (...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1015 frame_count)); | 1022 frame_count)); |
| 1016 frames->push_back(frame); | 1023 frames->push_back(frame); |
| 1017 | 1024 |
| 1018 cur += frame_size; | 1025 cur += frame_size; |
| 1019 bytes_left -= frame_size; | 1026 bytes_left -= frame_size; |
| 1020 } while (bytes_left > 0); | 1027 } while (bytes_left > 0); |
| 1021 | 1028 |
| 1022 return true; | 1029 return true; |
| 1023 } | 1030 } |
| 1024 | 1031 |
| 1032 void ContentDecryptorDelegate::SatisfyAllPendingCallbacksOnError() { |
| 1033 if (!audio_decoder_init_cb_.is_null()) |
| 1034 audio_decoder_init_cb_.ResetAndReturn().Run(false); |
| 1035 |
| 1036 if (!video_decoder_init_cb_.is_null()) |
| 1037 video_decoder_init_cb_.ResetAndReturn().Run(false); |
| 1038 |
| 1039 audio_input_resource_ = NULL; |
| 1040 video_input_resource_ = NULL; |
| 1041 |
| 1042 if (!audio_decrypt_cb_.is_null()) |
| 1043 audio_decrypt_cb_.ResetAndReturn().Run(media::Decryptor::kError, NULL); |
| 1044 |
| 1045 if (!video_decrypt_cb_.is_null()) |
| 1046 video_decrypt_cb_.ResetAndReturn().Run(media::Decryptor::kError, NULL); |
| 1047 |
| 1048 if (!audio_decode_cb_.is_null()) { |
| 1049 const media::Decryptor::AudioBuffers empty_frames; |
| 1050 audio_decode_cb_.ResetAndReturn().Run(media::Decryptor::kError, |
| 1051 empty_frames); |
| 1052 } |
| 1053 |
| 1054 if (!video_decode_cb_.is_null()) |
| 1055 video_decode_cb_.ResetAndReturn().Run(media::Decryptor::kError, NULL); |
| 1056 } |
| 1057 |
| 1025 } // namespace content | 1058 } // namespace content |
| OLD | NEW |