Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(140)

Side by Side Diff: webkit/plugins/ppapi/content_decryptor_delegate.cc

Issue 17315021: Refactored DataBuffer to use unix_hacker style methods. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed accidental renaming of test cases. Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "webkit/plugins/ppapi/content_decryptor_delegate.h" 5 #include "webkit/plugins/ppapi/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 "media/base/audio_decoder_config.h" 10 #include "media/base/audio_decoder_config.h"
(...skipping 22 matching lines...) Expand all
33 33
34 namespace webkit { 34 namespace webkit {
35 namespace ppapi { 35 namespace ppapi {
36 36
37 namespace { 37 namespace {
38 38
39 // Fills |resource| with a PPB_Buffer_Impl and copies |data| into the buffer 39 // Fills |resource| with a PPB_Buffer_Impl and copies |data| into the buffer
40 // resource. The |*resource|, if valid, will be in the ResourceTracker with a 40 // resource. The |*resource|, if valid, will be in the ResourceTracker with a
41 // reference-count of 0. If |data| is NULL, sets |*resource| to NULL. Returns 41 // reference-count of 0. If |data| is NULL, sets |*resource| to NULL. Returns
42 // true upon success and false if any error happened. 42 // true upon success and false if any error happened.
43 bool MakeBufferResource(PP_Instance instance, 43 bool MakeBufferResource(PP_Instance instance, const uint8* data, uint32_t size,
44 const uint8* data, uint32_t size,
45 scoped_refptr<PPB_Buffer_Impl>* resource) { 44 scoped_refptr<PPB_Buffer_Impl>* resource) {
46 TRACE_EVENT0("eme", "ContentDecryptorDelegate - MakeBufferResource"); 45 TRACE_EVENT0("eme", "ContentDecryptorDelegate - MakeBufferResource");
47 DCHECK(resource); 46 DCHECK(resource);
48 47
49 if (!data || !size) { 48 if (!data || !size) {
50 DCHECK(!data && !size); 49 DCHECK(!data && !size);
51 resource = NULL; 50 resource = NULL;
52 return true; 51 return true;
53 } 52 }
54 53
55 scoped_refptr<PPB_Buffer_Impl> buffer( 54 scoped_refptr<PPB_Buffer_Impl> buffer(
56 PPB_Buffer_Impl::CreateResource(instance, size)); 55 PPB_Buffer_Impl::CreateResource(instance, size));
57 if (!buffer.get()) 56 if (!buffer.get()) return false;
58 return false;
59 57
60 BufferAutoMapper mapper(buffer.get()); 58 BufferAutoMapper mapper(buffer.get());
61 if (!mapper.data() || mapper.size() < size) 59 if (!mapper.data() || mapper.size() < size) return false;
62 return false;
63 memcpy(mapper.data(), data, size); 60 memcpy(mapper.data(), data, size);
64 61
65 *resource = buffer; 62 *resource = buffer;
66 return true; 63 return true;
67 } 64 }
68 65
69 // Copies the content of |str| into |array|. 66 // Copies the content of |str| into |array|.
70 // Returns true if copy succeeded. Returns false if copy failed, e.g. if the 67 // Returns true if copy succeeded. Returns false if copy failed, e.g. if the
71 // |array_size| is smaller than the |str| length. 68 // |array_size| is smaller than the |str| length.
72 template <uint32_t array_size> 69 template <uint32_t array_size>
73 bool CopyStringToArray(const std::string& str, uint8 (&array)[array_size]) { 70 bool CopyStringToArray(const std::string& str, uint8 (&array)[array_size]) {
74 if (array_size < str.size()) 71 if (array_size < str.size()) return false;
75 return false;
76 72
77 memcpy(array, str.data(), str.size()); 73 memcpy(array, str.data(), str.size());
78 return true; 74 return true;
79 } 75 }
80 76
81 // Fills the |block_info| with information from |encrypted_buffer|. 77 // Fills the |block_info| with information from |encrypted_buffer|.
82 // 78 //
83 // Returns true if |block_info| is successfully filled. Returns false 79 // Returns true if |block_info| is successfully filled. Returns false
84 // otherwise. 80 // otherwise.
85 static bool MakeEncryptedBlockInfo( 81 static bool MakeEncryptedBlockInfo(
86 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, 82 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer,
87 uint32_t request_id, 83 uint32_t request_id, PP_EncryptedBlockInfo* block_info) {
88 PP_EncryptedBlockInfo* block_info) {
89 // TODO(xhwang): Fix initialization of PP_EncryptedBlockInfo here and 84 // TODO(xhwang): Fix initialization of PP_EncryptedBlockInfo here and
90 // anywhere else. 85 // anywhere else.
91 memset(block_info, 0, sizeof(*block_info)); 86 memset(block_info, 0, sizeof(*block_info));
92 block_info->tracking_info.request_id = request_id; 87 block_info->tracking_info.request_id = request_id;
93 88
94 // EOS buffers need a request ID and nothing more. 89 // EOS buffers need a request ID and nothing more.
95 if (encrypted_buffer->IsEndOfStream()) 90 if (encrypted_buffer->IsEndOfStream()) return true;
96 return true;
97 91
98 DCHECK(encrypted_buffer->GetDataSize()) 92 DCHECK(encrypted_buffer->GetDataSize())
99 << "DecryptConfig is set on an empty buffer"; 93 << "DecryptConfig is set on an empty buffer";
100 94
101 block_info->tracking_info.timestamp = 95 block_info->tracking_info.timestamp =
102 encrypted_buffer->GetTimestamp().InMicroseconds(); 96 encrypted_buffer->GetTimestamp().InMicroseconds();
103 block_info->data_size = encrypted_buffer->GetDataSize(); 97 block_info->data_size = encrypted_buffer->GetDataSize();
104 98
105 const media::DecryptConfig* decrypt_config = 99 const media::DecryptConfig* decrypt_config =
106 encrypted_buffer->GetDecryptConfig(); 100 encrypted_buffer->GetDecryptConfig();
(...skipping 15 matching lines...) Expand all
122 decrypt_config->subsamples()[i].clear_bytes; 116 decrypt_config->subsamples()[i].clear_bytes;
123 block_info->subsamples[i].cipher_bytes = 117 block_info->subsamples[i].cipher_bytes =
124 decrypt_config->subsamples()[i].cypher_bytes; 118 decrypt_config->subsamples()[i].cypher_bytes;
125 } 119 }
126 120
127 return true; 121 return true;
128 } 122 }
129 123
130 // Deserializes audio data stored in |audio_frames| into individual audio 124 // Deserializes audio data stored in |audio_frames| into individual audio
131 // buffers in |frames|. Returns true upon success. 125 // buffers in |frames|. Returns true upon success.
132 bool DeserializeAudioFrames(PP_Resource audio_frames, 126 bool DeserializeAudioFrames(PP_Resource audio_frames, int data_size,
133 int data_size,
134 media::Decryptor::AudioBuffers* frames) { 127 media::Decryptor::AudioBuffers* frames) {
135 DCHECK(frames); 128 DCHECK(frames);
136 EnterResourceNoLock<PPB_Buffer_API> enter(audio_frames, true); 129 EnterResourceNoLock<PPB_Buffer_API> enter(audio_frames, true);
137 if (!enter.succeeded()) 130 if (!enter.succeeded()) return false;
scherkus (not reviewing) 2013/06/21 19:48:38 revert this change -- we don't do single-line ifs
138 return false;
139 131
140 BufferAutoMapper mapper(enter.object()); 132 BufferAutoMapper mapper(enter.object());
141 if (!mapper.data() || !mapper.size() || 133 if (!mapper.data() || !mapper.size() ||
142 mapper.size() < static_cast<uint32_t>(data_size)) 134 mapper.size() < static_cast<uint32_t>(data_size))
143 return false; 135 return false;
144 136
145 const uint8* cur = static_cast<uint8*>(mapper.data()); 137 const uint8* cur = static_cast<uint8*>(mapper.data());
146 int bytes_left = data_size; 138 int bytes_left = data_size;
147 139
148 do { 140 do {
149 int64 timestamp = 0; 141 int64 timestamp = 0;
150 int64 frame_size = -1; 142 int64 frame_size = -1;
151 const int kHeaderSize = sizeof(timestamp) + sizeof(frame_size); 143 const int kHeaderSize = sizeof(timestamp) + sizeof(frame_size);
152 144
153 if (bytes_left < kHeaderSize) 145 if (bytes_left < kHeaderSize) return false;
scherkus (not reviewing) 2013/06/21 19:48:38 revert this change -- we don't do single-line ifs
154 return false;
155 146
156 memcpy(&timestamp, cur, sizeof(timestamp)); 147 memcpy(&timestamp, cur, sizeof(timestamp));
157 cur += sizeof(timestamp); 148 cur += sizeof(timestamp);
158 bytes_left -= sizeof(timestamp); 149 bytes_left -= sizeof(timestamp);
159 150
160 memcpy(&frame_size, cur, sizeof(frame_size)); 151 memcpy(&frame_size, cur, sizeof(frame_size));
161 cur += sizeof(frame_size); 152 cur += sizeof(frame_size);
162 bytes_left -= sizeof(frame_size); 153 bytes_left -= sizeof(frame_size);
163 154
164 // We should *not* have empty frame in the list. 155 // We should *not* have empty frame in the list.
165 if (frame_size <= 0 || bytes_left < frame_size) 156 if (frame_size <= 0 || bytes_left < frame_size) return false;
scherkus (not reviewing) 2013/06/21 19:48:38 revert this change -- we don't do single-line ifs
166 return false;
167 157
168 scoped_refptr<media::DataBuffer> frame = 158 scoped_refptr<media::DataBuffer> frame =
169 media::DataBuffer::CopyFrom(cur, frame_size); 159 media::DataBuffer::CopyFrom(cur, frame_size);
170 frame->SetTimestamp(base::TimeDelta::FromMicroseconds(timestamp)); 160 frame->set_timestamp(base::TimeDelta::FromMicroseconds(timestamp));
171 frames->push_back(frame); 161 frames->push_back(frame);
172 162
173 cur += frame_size; 163 cur += frame_size;
174 bytes_left -= frame_size; 164 bytes_left -= frame_size;
175 } while (bytes_left > 0); 165 } while (bytes_left > 0);
176 166
177 return true; 167 return true;
178 } 168 }
179 169
180 PP_AudioCodec MediaAudioCodecToPpAudioCodec(media::AudioCodec codec) { 170 PP_AudioCodec MediaAudioCodecToPpAudioCodec(media::AudioCodec codec) {
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 : pp_instance_(pp_instance), 265 : pp_instance_(pp_instance),
276 plugin_decryption_interface_(plugin_decryption_interface), 266 plugin_decryption_interface_(plugin_decryption_interface),
277 next_decryption_request_id_(1), 267 next_decryption_request_id_(1),
278 pending_audio_decrypt_request_id_(0), 268 pending_audio_decrypt_request_id_(0),
279 pending_video_decrypt_request_id_(0), 269 pending_video_decrypt_request_id_(0),
280 pending_audio_decoder_init_request_id_(0), 270 pending_audio_decoder_init_request_id_(0),
281 pending_video_decoder_init_request_id_(0), 271 pending_video_decoder_init_request_id_(0),
282 pending_audio_decode_request_id_(0), 272 pending_audio_decode_request_id_(0),
283 pending_video_decode_request_id_(0), 273 pending_video_decode_request_id_(0),
284 weak_ptr_factory_(this), 274 weak_ptr_factory_(this),
285 weak_this_(weak_ptr_factory_.GetWeakPtr()) { 275 weak_this_(weak_ptr_factory_.GetWeakPtr()) {}
286 }
287 276
288 void ContentDecryptorDelegate::Initialize(const std::string& key_system) { 277 void ContentDecryptorDelegate::Initialize(const std::string& key_system) {
289 // TODO(ddorwin): Add an Initialize method to PPP_ContentDecryptor_Private. 278 // TODO(ddorwin): Add an Initialize method to PPP_ContentDecryptor_Private.
290 DCHECK(!key_system.empty()); 279 DCHECK(!key_system.empty());
291 key_system_ = key_system; 280 key_system_ = key_system;
292 } 281 }
293 282
294 void ContentDecryptorDelegate::SetKeyEventCallbacks( 283 void ContentDecryptorDelegate::SetKeyEventCallbacks(
295 const media::KeyAddedCB& key_added_cb, 284 const media::KeyAddedCB& key_added_cb,
296 const media::KeyErrorCB& key_error_cb, 285 const media::KeyErrorCB& key_error_cb,
297 const media::KeyMessageCB& key_message_cb, 286 const media::KeyMessageCB& key_message_cb,
298 const media::NeedKeyCB& need_key_cb) { 287 const media::NeedKeyCB& need_key_cb) {
299 key_added_cb_ = key_added_cb; 288 key_added_cb_ = key_added_cb;
300 key_error_cb_ = key_error_cb; 289 key_error_cb_ = key_error_cb;
301 key_message_cb_ = key_message_cb; 290 key_message_cb_ = key_message_cb;
302 need_key_cb_ = need_key_cb; 291 need_key_cb_ = need_key_cb;
303 } 292 }
304 293
305 bool ContentDecryptorDelegate::GenerateKeyRequest(const std::string& type, 294 bool ContentDecryptorDelegate::GenerateKeyRequest(const std::string& type,
306 const uint8* init_data, 295 const uint8* init_data,
307 int init_data_length) { 296 int init_data_length) {
308 PP_Var init_data_array = 297 PP_Var init_data_array = PpapiGlobals::Get()->GetVarTracker()
309 PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar( 298 ->MakeArrayBufferPPVar(init_data_length, init_data);
310 init_data_length, init_data);
311 299
312 plugin_decryption_interface_->GenerateKeyRequest( 300 plugin_decryption_interface_->GenerateKeyRequest(
313 pp_instance_, 301 pp_instance_,
314 StringVar::StringToPPVar(key_system_), // TODO(ddorwin): Remove. 302 StringVar::StringToPPVar(key_system_), // TODO(ddorwin): Remove.
315 StringVar::StringToPPVar(type), 303 StringVar::StringToPPVar(type), init_data_array);
316 init_data_array);
317 return true; 304 return true;
318 } 305 }
319 306
320 bool ContentDecryptorDelegate::AddKey(const std::string& session_id, 307 bool ContentDecryptorDelegate::AddKey(const std::string& session_id,
321 const uint8* key, 308 const uint8* key, int key_length,
322 int key_length,
323 const uint8* init_data, 309 const uint8* init_data,
324 int init_data_length) { 310 int init_data_length) {
325 PP_Var key_array = 311 PP_Var key_array = PpapiGlobals::Get()->GetVarTracker()
326 PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar(key_length, 312 ->MakeArrayBufferPPVar(key_length, key);
327 key); 313 PP_Var init_data_array = PpapiGlobals::Get()->GetVarTracker()
328 PP_Var init_data_array = 314 ->MakeArrayBufferPPVar(init_data_length, init_data);
329 PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar(
330 init_data_length, init_data);
331 315
332 plugin_decryption_interface_->AddKey( 316 plugin_decryption_interface_->AddKey(
333 pp_instance_, 317 pp_instance_, StringVar::StringToPPVar(session_id), key_array,
334 StringVar::StringToPPVar(session_id),
335 key_array,
336 init_data_array); 318 init_data_array);
337 return true; 319 return true;
338 } 320 }
339 321
340 bool ContentDecryptorDelegate::CancelKeyRequest(const std::string& session_id) { 322 bool ContentDecryptorDelegate::CancelKeyRequest(const std::string& session_id) {
341 plugin_decryption_interface_->CancelKeyRequest( 323 plugin_decryption_interface_->CancelKeyRequest(
342 pp_instance_, 324 pp_instance_, StringVar::StringToPPVar(session_id));
343 StringVar::StringToPPVar(session_id));
344 return true; 325 return true;
345 } 326 }
346 327
347 // TODO(xhwang): Remove duplication of code in Decrypt(), 328 // TODO(xhwang): Remove duplication of code in Decrypt(),
348 // DecryptAndDecodeAudio() and DecryptAndDecodeVideo(). 329 // DecryptAndDecodeAudio() and DecryptAndDecodeVideo().
349 bool ContentDecryptorDelegate::Decrypt( 330 bool ContentDecryptorDelegate::Decrypt(
350 media::Decryptor::StreamType stream_type, 331 media::Decryptor::StreamType stream_type,
351 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, 332 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer,
352 const media::Decryptor::DecryptCB& decrypt_cb) { 333 const media::Decryptor::DecryptCB& decrypt_cb) {
353 DVLOG(3) << "Decrypt() - stream_type: " << stream_type; 334 DVLOG(3) << "Decrypt() - stream_type: " << stream_type;
354 // |{audio|video}_input_resource_| is not being used by the plugin 335 // |{audio|video}_input_resource_| is not being used by the plugin
355 // now because there is only one pending audio/video decrypt request at any 336 // now because there is only one pending audio/video decrypt request at any
356 // time. This is enforced by the media pipeline. 337 // time. This is enforced by the media pipeline.
357 scoped_refptr<PPB_Buffer_Impl> encrypted_resource; 338 scoped_refptr<PPB_Buffer_Impl> encrypted_resource;
358 if (!MakeMediaBufferResource( 339 if (!MakeMediaBufferResource(stream_type, encrypted_buffer,
359 stream_type, encrypted_buffer, &encrypted_resource) || 340 &encrypted_resource) ||
360 !encrypted_resource.get()) { 341 !encrypted_resource.get()) {
361 return false; 342 return false;
362 } 343 }
363 ScopedPPResource pp_resource(encrypted_resource.get()); 344 ScopedPPResource pp_resource(encrypted_resource.get());
364 345
365 const uint32_t request_id = next_decryption_request_id_++; 346 const uint32_t request_id = next_decryption_request_id_++;
366 DVLOG(2) << "Decrypt() - request_id " << request_id; 347 DVLOG(2) << "Decrypt() - request_id " << request_id;
367 348
368 PP_EncryptedBlockInfo block_info = {}; 349 PP_EncryptedBlockInfo block_info = {};
369 DCHECK(encrypted_buffer->GetDecryptConfig()); 350 DCHECK(encrypted_buffer->GetDecryptConfig());
(...skipping 16 matching lines...) Expand all
386 pending_video_decrypt_request_id_ = request_id; 367 pending_video_decrypt_request_id_ = request_id;
387 pending_video_decrypt_cb_ = decrypt_cb; 368 pending_video_decrypt_cb_ = decrypt_cb;
388 break; 369 break;
389 default: 370 default:
390 NOTREACHED(); 371 NOTREACHED();
391 return false; 372 return false;
392 } 373 }
393 374
394 SetBufferToFreeInTrackingInfo(&block_info.tracking_info); 375 SetBufferToFreeInTrackingInfo(&block_info.tracking_info);
395 376
396 plugin_decryption_interface_->Decrypt(pp_instance_, 377 plugin_decryption_interface_->Decrypt(pp_instance_, pp_resource, &block_info);
397 pp_resource,
398 &block_info);
399 return true; 378 return true;
400 } 379 }
401 380
402 bool ContentDecryptorDelegate::CancelDecrypt( 381 bool ContentDecryptorDelegate::CancelDecrypt(
403 media::Decryptor::StreamType stream_type) { 382 media::Decryptor::StreamType stream_type) {
404 DVLOG(3) << "CancelDecrypt() - stream_type: " << stream_type; 383 DVLOG(3) << "CancelDecrypt() - stream_type: " << stream_type;
405 384
406 media::Decryptor::DecryptCB decrypt_cb; 385 media::Decryptor::DecryptCB decrypt_cb;
407 switch (stream_type) { 386 switch (stream_type) {
408 case media::Decryptor::kAudio: 387 case media::Decryptor::kAudio:
(...skipping 10 matching lines...) Expand all
419 // buffer. 398 // buffer.
420 video_input_resource_ = NULL; 399 video_input_resource_ = NULL;
421 pending_video_decrypt_request_id_ = 0; 400 pending_video_decrypt_request_id_ = 0;
422 decrypt_cb = base::ResetAndReturn(&pending_video_decrypt_cb_); 401 decrypt_cb = base::ResetAndReturn(&pending_video_decrypt_cb_);
423 break; 402 break;
424 default: 403 default:
425 NOTREACHED(); 404 NOTREACHED();
426 return false; 405 return false;
427 } 406 }
428 407
429 if (!decrypt_cb.is_null()) 408 if (!decrypt_cb.is_null()) decrypt_cb.Run(media::Decryptor::kSuccess, NULL);
scherkus (not reviewing) 2013/06/21 19:48:38 revert this change -- we don't do single-line ifs
430 decrypt_cb.Run(media::Decryptor::kSuccess, NULL);
431 409
432 return true; 410 return true;
433 } 411 }
434 412
435 bool ContentDecryptorDelegate::InitializeAudioDecoder( 413 bool ContentDecryptorDelegate::InitializeAudioDecoder(
436 const media::AudioDecoderConfig& decoder_config, 414 const media::AudioDecoderConfig& decoder_config,
437 const media::Decryptor::DecoderInitCB& init_cb) { 415 const media::Decryptor::DecoderInitCB& init_cb) {
438 PP_AudioDecoderConfig pp_decoder_config; 416 PP_AudioDecoderConfig pp_decoder_config;
439 pp_decoder_config.codec = 417 pp_decoder_config.codec =
440 MediaAudioCodecToPpAudioCodec(decoder_config.codec()); 418 MediaAudioCodecToPpAudioCodec(decoder_config.codec());
441 pp_decoder_config.channel_count = 419 pp_decoder_config.channel_count =
442 media::ChannelLayoutToChannelCount(decoder_config.channel_layout()); 420 media::ChannelLayoutToChannelCount(decoder_config.channel_layout());
443 pp_decoder_config.bits_per_channel = decoder_config.bits_per_channel(); 421 pp_decoder_config.bits_per_channel = decoder_config.bits_per_channel();
444 pp_decoder_config.samples_per_second = decoder_config.samples_per_second(); 422 pp_decoder_config.samples_per_second = decoder_config.samples_per_second();
445 pp_decoder_config.request_id = next_decryption_request_id_++; 423 pp_decoder_config.request_id = next_decryption_request_id_++;
446 424
447 scoped_refptr<PPB_Buffer_Impl> extra_data_resource; 425 scoped_refptr<PPB_Buffer_Impl> extra_data_resource;
448 if (!MakeBufferResource(pp_instance_, 426 if (!MakeBufferResource(pp_instance_, decoder_config.extra_data(),
449 decoder_config.extra_data(),
450 decoder_config.extra_data_size(), 427 decoder_config.extra_data_size(),
451 &extra_data_resource)) { 428 &extra_data_resource)) {
452 return false; 429 return false;
453 } 430 }
454 ScopedPPResource pp_resource(extra_data_resource.get()); 431 ScopedPPResource pp_resource(extra_data_resource.get());
455 432
456 DCHECK_EQ(pending_audio_decoder_init_request_id_, 0u); 433 DCHECK_EQ(pending_audio_decoder_init_request_id_, 0u);
457 DCHECK(pending_audio_decoder_init_cb_.is_null()); 434 DCHECK(pending_audio_decoder_init_cb_.is_null());
458 pending_audio_decoder_init_request_id_ = pp_decoder_config.request_id; 435 pending_audio_decoder_init_request_id_ = pp_decoder_config.request_id;
459 pending_audio_decoder_init_cb_ = init_cb; 436 pending_audio_decoder_init_cb_ = init_cb;
460 437
461 plugin_decryption_interface_->InitializeAudioDecoder(pp_instance_, 438 plugin_decryption_interface_->InitializeAudioDecoder(
462 &pp_decoder_config, 439 pp_instance_, &pp_decoder_config, pp_resource);
463 pp_resource);
464 return true; 440 return true;
465 } 441 }
466 442
467 bool ContentDecryptorDelegate::InitializeVideoDecoder( 443 bool ContentDecryptorDelegate::InitializeVideoDecoder(
468 const media::VideoDecoderConfig& decoder_config, 444 const media::VideoDecoderConfig& decoder_config,
469 const media::Decryptor::DecoderInitCB& init_cb) { 445 const media::Decryptor::DecoderInitCB& init_cb) {
470 PP_VideoDecoderConfig pp_decoder_config; 446 PP_VideoDecoderConfig pp_decoder_config;
471 pp_decoder_config.codec = 447 pp_decoder_config.codec =
472 MediaVideoCodecToPpVideoCodec(decoder_config.codec()); 448 MediaVideoCodecToPpVideoCodec(decoder_config.codec());
473 pp_decoder_config.profile = 449 pp_decoder_config.profile =
474 MediaVideoCodecProfileToPpVideoCodecProfile(decoder_config.profile()); 450 MediaVideoCodecProfileToPpVideoCodecProfile(decoder_config.profile());
475 pp_decoder_config.format = 451 pp_decoder_config.format =
476 MediaVideoFormatToPpDecryptedFrameFormat(decoder_config.format()); 452 MediaVideoFormatToPpDecryptedFrameFormat(decoder_config.format());
477 pp_decoder_config.width = decoder_config.coded_size().width(); 453 pp_decoder_config.width = decoder_config.coded_size().width();
478 pp_decoder_config.height = decoder_config.coded_size().height(); 454 pp_decoder_config.height = decoder_config.coded_size().height();
479 pp_decoder_config.request_id = next_decryption_request_id_++; 455 pp_decoder_config.request_id = next_decryption_request_id_++;
480 456
481 scoped_refptr<PPB_Buffer_Impl> extra_data_resource; 457 scoped_refptr<PPB_Buffer_Impl> extra_data_resource;
482 if (!MakeBufferResource(pp_instance_, 458 if (!MakeBufferResource(pp_instance_, decoder_config.extra_data(),
483 decoder_config.extra_data(),
484 decoder_config.extra_data_size(), 459 decoder_config.extra_data_size(),
485 &extra_data_resource)) { 460 &extra_data_resource)) {
486 return false; 461 return false;
487 } 462 }
488 ScopedPPResource pp_resource(extra_data_resource.get()); 463 ScopedPPResource pp_resource(extra_data_resource.get());
489 464
490 DCHECK_EQ(pending_video_decoder_init_request_id_, 0u); 465 DCHECK_EQ(pending_video_decoder_init_request_id_, 0u);
491 DCHECK(pending_video_decoder_init_cb_.is_null()); 466 DCHECK(pending_video_decoder_init_cb_.is_null());
492 pending_video_decoder_init_request_id_ = pp_decoder_config.request_id; 467 pending_video_decoder_init_request_id_ = pp_decoder_config.request_id;
493 pending_video_decoder_init_cb_ = init_cb; 468 pending_video_decoder_init_cb_ = init_cb;
494 469
495 natural_size_ = decoder_config.natural_size(); 470 natural_size_ = decoder_config.natural_size();
496 471
497 plugin_decryption_interface_->InitializeVideoDecoder(pp_instance_, 472 plugin_decryption_interface_->InitializeVideoDecoder(
498 &pp_decoder_config, 473 pp_instance_, &pp_decoder_config, pp_resource);
499 pp_resource);
500 return true; 474 return true;
501 } 475 }
502 476
503 bool ContentDecryptorDelegate::DeinitializeDecoder( 477 bool ContentDecryptorDelegate::DeinitializeDecoder(
504 media::Decryptor::StreamType stream_type) { 478 media::Decryptor::StreamType stream_type) {
505 CancelDecode(stream_type); 479 CancelDecode(stream_type);
506 480
507 natural_size_ = gfx::Size(); 481 natural_size_ = gfx::Size();
508 482
509 // TODO(tomfinegan): Add decoder deinitialize request tracking, and get 483 // TODO(tomfinegan): Add decoder deinitialize request tracking, and get
(...skipping 13 matching lines...) Expand all
523 return true; 497 return true;
524 } 498 }
525 499
526 bool ContentDecryptorDelegate::DecryptAndDecodeAudio( 500 bool ContentDecryptorDelegate::DecryptAndDecodeAudio(
527 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, 501 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer,
528 const media::Decryptor::AudioDecodeCB& audio_decode_cb) { 502 const media::Decryptor::AudioDecodeCB& audio_decode_cb) {
529 // |audio_input_resource_| is not being used by the plugin now 503 // |audio_input_resource_| is not being used by the plugin now
530 // because there is only one pending audio decode request at any time. 504 // because there is only one pending audio decode request at any time.
531 // This is enforced by the media pipeline. 505 // This is enforced by the media pipeline.
532 scoped_refptr<PPB_Buffer_Impl> encrypted_resource; 506 scoped_refptr<PPB_Buffer_Impl> encrypted_resource;
533 if (!MakeMediaBufferResource(media::Decryptor::kAudio, 507 if (!MakeMediaBufferResource(media::Decryptor::kAudio, encrypted_buffer,
534 encrypted_buffer,
535 &encrypted_resource)) { 508 &encrypted_resource)) {
536 return false; 509 return false;
537 } 510 }
538 511
539 // The resource should not be NULL for non-EOS buffer. 512 // The resource should not be NULL for non-EOS buffer.
540 if (!encrypted_buffer->IsEndOfStream() && !encrypted_resource.get()) 513 if (!encrypted_buffer->IsEndOfStream() && !encrypted_resource.get())
541 return false; 514 return false;
542 515
543 const uint32_t request_id = next_decryption_request_id_++; 516 const uint32_t request_id = next_decryption_request_id_++;
544 DVLOG(2) << "DecryptAndDecodeAudio() - request_id " << request_id; 517 DVLOG(2) << "DecryptAndDecodeAudio() - request_id " << request_id;
545 518
546 PP_EncryptedBlockInfo block_info = {}; 519 PP_EncryptedBlockInfo block_info = {};
547 if (!MakeEncryptedBlockInfo(encrypted_buffer, request_id, &block_info)) { 520 if (!MakeEncryptedBlockInfo(encrypted_buffer, request_id, &block_info)) {
548 return false; 521 return false;
549 } 522 }
550 523
551 SetBufferToFreeInTrackingInfo(&block_info.tracking_info); 524 SetBufferToFreeInTrackingInfo(&block_info.tracking_info);
552 525
553 // There is only one pending audio decode request at any time. This is 526 // There is only one pending audio decode request at any time. This is
554 // enforced by the media pipeline. If this DCHECK is violated, our buffer 527 // enforced by the media pipeline. If this DCHECK is violated, our buffer
555 // reuse policy is not valid, and we may have race problems for the shared 528 // reuse policy is not valid, and we may have race problems for the shared
556 // buffer. 529 // buffer.
557 DCHECK_EQ(pending_audio_decode_request_id_, 0u); 530 DCHECK_EQ(pending_audio_decode_request_id_, 0u);
558 DCHECK(pending_audio_decode_cb_.is_null()); 531 DCHECK(pending_audio_decode_cb_.is_null());
559 pending_audio_decode_request_id_ = request_id; 532 pending_audio_decode_request_id_ = request_id;
560 pending_audio_decode_cb_ = audio_decode_cb; 533 pending_audio_decode_cb_ = audio_decode_cb;
561 534
562 ScopedPPResource pp_resource(encrypted_resource.get()); 535 ScopedPPResource pp_resource(encrypted_resource.get());
563 plugin_decryption_interface_->DecryptAndDecode(pp_instance_, 536 plugin_decryption_interface_->DecryptAndDecode(
564 PP_DECRYPTORSTREAMTYPE_AUDIO, 537 pp_instance_, PP_DECRYPTORSTREAMTYPE_AUDIO, pp_resource, &block_info);
565 pp_resource,
566 &block_info);
567 return true; 538 return true;
568 } 539 }
569 540
570 bool ContentDecryptorDelegate::DecryptAndDecodeVideo( 541 bool ContentDecryptorDelegate::DecryptAndDecodeVideo(
571 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, 542 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer,
572 const media::Decryptor::VideoDecodeCB& video_decode_cb) { 543 const media::Decryptor::VideoDecodeCB& video_decode_cb) {
573 // |video_input_resource_| is not being used by the plugin now 544 // |video_input_resource_| is not being used by the plugin now
574 // because there is only one pending video decode request at any time. 545 // because there is only one pending video decode request at any time.
575 // This is enforced by the media pipeline. 546 // This is enforced by the media pipeline.
576 scoped_refptr<PPB_Buffer_Impl> encrypted_resource; 547 scoped_refptr<PPB_Buffer_Impl> encrypted_resource;
577 if (!MakeMediaBufferResource(media::Decryptor::kVideo, 548 if (!MakeMediaBufferResource(media::Decryptor::kVideo, encrypted_buffer,
578 encrypted_buffer,
579 &encrypted_resource)) { 549 &encrypted_resource)) {
580 return false; 550 return false;
581 } 551 }
582 552
583 // The resource should not be 0 for non-EOS buffer. 553 // The resource should not be 0 for non-EOS buffer.
584 if (!encrypted_buffer->IsEndOfStream() && !encrypted_resource.get()) 554 if (!encrypted_buffer->IsEndOfStream() && !encrypted_resource.get())
585 return false; 555 return false;
586 556
587 const uint32_t request_id = next_decryption_request_id_++; 557 const uint32_t request_id = next_decryption_request_id_++;
588 DVLOG(2) << "DecryptAndDecodeVideo() - request_id " << request_id; 558 DVLOG(2) << "DecryptAndDecodeVideo() - request_id " << request_id;
(...skipping 11 matching lines...) Expand all
600 // media pipeline. If this DCHECK is violated, our buffer 570 // media pipeline. If this DCHECK is violated, our buffer
601 // reuse policy is not valid, and we may have race problems for the shared 571 // reuse policy is not valid, and we may have race problems for the shared
602 // buffer. 572 // buffer.
603 DCHECK_EQ(pending_video_decode_request_id_, 0u); 573 DCHECK_EQ(pending_video_decode_request_id_, 0u);
604 DCHECK(pending_video_decode_cb_.is_null()); 574 DCHECK(pending_video_decode_cb_.is_null());
605 pending_video_decode_request_id_ = request_id; 575 pending_video_decode_request_id_ = request_id;
606 pending_video_decode_cb_ = video_decode_cb; 576 pending_video_decode_cb_ = video_decode_cb;
607 577
608 // TODO(tomfinegan): Need to get stream type from media stack. 578 // TODO(tomfinegan): Need to get stream type from media stack.
609 ScopedPPResource pp_resource(encrypted_resource.get()); 579 ScopedPPResource pp_resource(encrypted_resource.get());
610 plugin_decryption_interface_->DecryptAndDecode(pp_instance_, 580 plugin_decryption_interface_->DecryptAndDecode(
611 PP_DECRYPTORSTREAMTYPE_VIDEO, 581 pp_instance_, PP_DECRYPTORSTREAMTYPE_VIDEO, pp_resource, &block_info);
612 pp_resource,
613 &block_info);
614 return true; 582 return true;
615 } 583 }
616 584
617 void ContentDecryptorDelegate::NeedKey(PP_Var key_system_var, 585 void ContentDecryptorDelegate::NeedKey(PP_Var key_system_var,
618 PP_Var session_id_var, 586 PP_Var session_id_var,
619 PP_Var init_data_var) { 587 PP_Var init_data_var) {
620 // TODO(ddorwin): Remove from PPB_ContentDecryptor_Private. 588 // TODO(ddorwin): Remove from PPB_ContentDecryptor_Private.
621 NOTREACHED(); 589 NOTREACHED();
622 } 590 }
623 591
624 void ContentDecryptorDelegate::KeyAdded(PP_Var key_system_var, 592 void ContentDecryptorDelegate::KeyAdded(PP_Var key_system_var,
625 PP_Var session_id_var) { 593 PP_Var session_id_var) {
626 if (key_added_cb_.is_null()) 594 if (key_added_cb_.is_null()) return;
scherkus (not reviewing) 2013/06/21 19:48:38 revert this change -- we don't do single-line ifs
627 return;
628 595
629 StringVar* session_id_string = StringVar::FromPPVar(session_id_var); 596 StringVar* session_id_string = StringVar::FromPPVar(session_id_var);
630 if (!session_id_string) { 597 if (!session_id_string) {
631 key_error_cb_.Run(std::string(), media::MediaKeys::kUnknownError, 0); 598 key_error_cb_.Run(std::string(), media::MediaKeys::kUnknownError, 0);
632 return; 599 return;
633 } 600 }
634 601
635 key_added_cb_.Run(session_id_string->value()); 602 key_added_cb_.Run(session_id_string->value());
636 } 603 }
637 604
638 void ContentDecryptorDelegate::KeyMessage(PP_Var key_system_var, 605 void ContentDecryptorDelegate::KeyMessage(PP_Var key_system_var,
639 PP_Var session_id_var, 606 PP_Var session_id_var,
640 PP_Var message_var, 607 PP_Var message_var,
641 PP_Var default_url_var) { 608 PP_Var default_url_var) {
642 if (key_message_cb_.is_null()) 609 if (key_message_cb_.is_null()) return;
scherkus (not reviewing) 2013/06/21 19:48:38 revert this change -- we don't do single-line ifs
643 return;
644 610
645 StringVar* session_id_string = StringVar::FromPPVar(session_id_var); 611 StringVar* session_id_string = StringVar::FromPPVar(session_id_var);
646 612
647 ArrayBufferVar* message_array_buffer = 613 ArrayBufferVar* message_array_buffer = ArrayBufferVar::FromPPVar(message_var);
648 ArrayBufferVar::FromPPVar(message_var);
649 614
650 std::string message; 615 std::string message;
651 if (message_array_buffer) { 616 if (message_array_buffer) {
652 const char* data = static_cast<const char*>(message_array_buffer->Map()); 617 const char* data = static_cast<const char*>(message_array_buffer->Map());
653 message.assign(data, message_array_buffer->ByteLength()); 618 message.assign(data, message_array_buffer->ByteLength());
654 } 619 }
655 620
656 StringVar* default_url_string = StringVar::FromPPVar(default_url_var); 621 StringVar* default_url_string = StringVar::FromPPVar(default_url_var);
657 622
658 if (!session_id_string || !default_url_string) { 623 if (!session_id_string || !default_url_string) {
659 key_error_cb_.Run(std::string(), media::MediaKeys::kUnknownError, 0); 624 key_error_cb_.Run(std::string(), media::MediaKeys::kUnknownError, 0);
660 return; 625 return;
661 } 626 }
662 627
663 key_message_cb_.Run(session_id_string->value(), 628 key_message_cb_.Run(session_id_string->value(), message,
664 message,
665 default_url_string->value()); 629 default_url_string->value());
666 } 630 }
667 631
668 void ContentDecryptorDelegate::KeyError(PP_Var key_system_var, 632 void ContentDecryptorDelegate::KeyError(PP_Var key_system_var,
669 PP_Var session_id_var, 633 PP_Var session_id_var,
670 int32_t media_error, 634 int32_t media_error,
671 int32_t system_code) { 635 int32_t system_code) {
672 if (key_error_cb_.is_null()) 636 if (key_error_cb_.is_null()) return;
scherkus (not reviewing) 2013/06/21 19:48:38 revert this change -- we don't do single-line ifs
673 return;
674 637
675 StringVar* session_id_string = StringVar::FromPPVar(session_id_var); 638 StringVar* session_id_string = StringVar::FromPPVar(session_id_var);
676 if (!session_id_string) { 639 if (!session_id_string) {
677 key_error_cb_.Run(std::string(), media::MediaKeys::kUnknownError, 0); 640 key_error_cb_.Run(std::string(), media::MediaKeys::kUnknownError, 0);
678 return; 641 return;
679 } 642 }
680 643
681 key_error_cb_.Run(session_id_string->value(), 644 key_error_cb_.Run(session_id_string->value(),
682 static_cast<media::MediaKeys::KeyError>(media_error), 645 static_cast<media::MediaKeys::KeyError>(media_error),
683 system_code); 646 system_code);
684 } 647 }
685 648
686 void ContentDecryptorDelegate::DecoderInitializeDone( 649 void ContentDecryptorDelegate::DecoderInitializeDone(
687 PP_DecryptorStreamType decoder_type, 650 PP_DecryptorStreamType decoder_type, uint32_t request_id, PP_Bool success) {
688 uint32_t request_id,
689 PP_Bool success) {
690 if (decoder_type == PP_DECRYPTORSTREAMTYPE_AUDIO) { 651 if (decoder_type == PP_DECRYPTORSTREAMTYPE_AUDIO) {
691 // If the request ID is not valid or does not match what's saved, do 652 // If the request ID is not valid or does not match what's saved, do
692 // nothing. 653 // nothing.
693 if (request_id == 0 || 654 if (request_id == 0 || request_id != pending_audio_decoder_init_request_id_)
694 request_id != pending_audio_decoder_init_request_id_)
695 return; 655 return;
696 656
697 DCHECK(!pending_audio_decoder_init_cb_.is_null()); 657 DCHECK(!pending_audio_decoder_init_cb_.is_null());
698 pending_audio_decoder_init_request_id_ = 0; 658 pending_audio_decoder_init_request_id_ = 0;
699 base::ResetAndReturn( 659 base::ResetAndReturn(&pending_audio_decoder_init_cb_)
700 &pending_audio_decoder_init_cb_).Run(PP_ToBool(success)); 660 .Run(PP_ToBool(success));
701 } else { 661 } else {
702 if (request_id == 0 || 662 if (request_id == 0 || request_id != pending_video_decoder_init_request_id_)
703 request_id != pending_video_decoder_init_request_id_)
704 return; 663 return;
705 664
706 if (!success) 665 if (!success) natural_size_ = gfx::Size();
707 natural_size_ = gfx::Size();
708 666
709 DCHECK(!pending_video_decoder_init_cb_.is_null()); 667 DCHECK(!pending_video_decoder_init_cb_.is_null());
710 pending_video_decoder_init_request_id_ = 0; 668 pending_video_decoder_init_request_id_ = 0;
711 base::ResetAndReturn( 669 base::ResetAndReturn(&pending_video_decoder_init_cb_)
712 &pending_video_decoder_init_cb_).Run(PP_ToBool(success)); 670 .Run(PP_ToBool(success));
713 } 671 }
714 } 672 }
715 673
716 void ContentDecryptorDelegate::DecoderDeinitializeDone( 674 void ContentDecryptorDelegate::DecoderDeinitializeDone(
717 PP_DecryptorStreamType decoder_type, 675 PP_DecryptorStreamType decoder_type, uint32_t request_id) {
718 uint32_t request_id) {
719 // TODO(tomfinegan): Add decoder stop completion handling. 676 // TODO(tomfinegan): Add decoder stop completion handling.
720 } 677 }
721 678
722 void ContentDecryptorDelegate::DecoderResetDone( 679 void ContentDecryptorDelegate::DecoderResetDone(
723 PP_DecryptorStreamType decoder_type, 680 PP_DecryptorStreamType decoder_type, uint32_t request_id) {
724 uint32_t request_id) {
725 // TODO(tomfinegan): Add decoder reset completion handling. 681 // TODO(tomfinegan): Add decoder reset completion handling.
726 } 682 }
727 683
728 void ContentDecryptorDelegate::DeliverBlock( 684 void ContentDecryptorDelegate::DeliverBlock(
729 PP_Resource decrypted_block, 685 PP_Resource decrypted_block, const PP_DecryptedBlockInfo* block_info) {
730 const PP_DecryptedBlockInfo* block_info) {
731 DCHECK(block_info); 686 DCHECK(block_info);
732 687
733 FreeBuffer(block_info->tracking_info.buffer_id); 688 FreeBuffer(block_info->tracking_info.buffer_id);
734 689
735 const uint32_t request_id = block_info->tracking_info.request_id; 690 const uint32_t request_id = block_info->tracking_info.request_id;
736 DVLOG(2) << "DeliverBlock() - request_id: " << request_id; 691 DVLOG(2) << "DeliverBlock() - request_id: " << request_id;
737 692
738 // If the request ID is not valid or does not match what's saved, do nothing. 693 // If the request ID is not valid or does not match what's saved, do nothing.
739 if (request_id == 0) { 694 if (request_id == 0) {
740 DVLOG(1) << "DeliverBlock() - invalid request_id " << request_id; 695 DVLOG(1) << "DeliverBlock() - invalid request_id " << request_id;
(...skipping 29 matching lines...) Expand all
770 BufferAutoMapper mapper(enter.object()); 725 BufferAutoMapper mapper(enter.object());
771 if (!mapper.data() || !mapper.size() || 726 if (!mapper.data() || !mapper.size() ||
772 mapper.size() < block_info->data_size) { 727 mapper.size() < block_info->data_size) {
773 decrypt_cb.Run(media::Decryptor::kError, NULL); 728 decrypt_cb.Run(media::Decryptor::kError, NULL);
774 return; 729 return;
775 } 730 }
776 731
777 // TODO(tomfinegan): Find a way to take ownership of the shared memory 732 // TODO(tomfinegan): Find a way to take ownership of the shared memory
778 // managed by the PPB_Buffer_Dev, and avoid the extra copy. 733 // managed by the PPB_Buffer_Dev, and avoid the extra copy.
779 scoped_refptr<media::DecoderBuffer> decrypted_buffer( 734 scoped_refptr<media::DecoderBuffer> decrypted_buffer(
780 media::DecoderBuffer::CopyFrom( 735 media::DecoderBuffer::CopyFrom(static_cast<uint8*>(mapper.data()),
781 static_cast<uint8*>(mapper.data()), block_info->data_size)); 736 block_info->data_size));
782 decrypted_buffer->SetTimestamp(base::TimeDelta::FromMicroseconds( 737 decrypted_buffer->SetTimestamp(
783 block_info->tracking_info.timestamp)); 738 base::TimeDelta::FromMicroseconds(block_info->tracking_info.timestamp));
784 decrypt_cb.Run(media::Decryptor::kSuccess, decrypted_buffer); 739 decrypt_cb.Run(media::Decryptor::kSuccess, decrypted_buffer);
785 } 740 }
786 741
787 // Use a non-class-member function here so that if for some reason 742 // Use a non-class-member function here so that if for some reason
788 // ContentDecryptorDelegate is destroyed before VideoFrame calls this callback, 743 // ContentDecryptorDelegate is destroyed before VideoFrame calls this callback,
789 // we can still get the shared memory unmapped. 744 // we can still get the shared memory unmapped.
790 static void BufferNoLongerNeeded( 745 static void BufferNoLongerNeeded(
791 const scoped_refptr<PPB_Buffer_Impl>& ppb_buffer, 746 const scoped_refptr<PPB_Buffer_Impl>& ppb_buffer,
792 base::Closure buffer_no_longer_needed_cb) { 747 base::Closure buffer_no_longer_needed_cb) {
793 ppb_buffer->Unmap(); 748 ppb_buffer->Unmap();
794 buffer_no_longer_needed_cb.Run(); 749 buffer_no_longer_needed_cb.Run();
795 } 750 }
796 751
797 // Enters |resource|, maps shared memory and returns pointer of mapped data. 752 // Enters |resource|, maps shared memory and returns pointer of mapped data.
798 // Returns NULL if any error occurs. 753 // Returns NULL if any error occurs.
799 static uint8* GetMappedBuffer(PP_Resource resource, 754 static uint8* GetMappedBuffer(PP_Resource resource,
800 scoped_refptr<PPB_Buffer_Impl>* ppb_buffer) { 755 scoped_refptr<PPB_Buffer_Impl>* ppb_buffer) {
801 EnterResourceNoLock<PPB_Buffer_API> enter(resource, true); 756 EnterResourceNoLock<PPB_Buffer_API> enter(resource, true);
802 if (!enter.succeeded()) 757 if (!enter.succeeded()) return NULL;
scherkus (not reviewing) 2013/06/21 19:48:38 revert this change -- we don't do single-line ifs
803 return NULL;
804 758
805 uint8* mapped_data = static_cast<uint8*>(enter.object()->Map()); 759 uint8* mapped_data = static_cast<uint8*>(enter.object()->Map());
806 if (!enter.object()->IsMapped() || !mapped_data) 760 if (!enter.object()->IsMapped() || !mapped_data) return NULL;
807 return NULL;
808 761
809 uint32_t mapped_size = 0; 762 uint32_t mapped_size = 0;
810 if (!enter.object()->Describe(&mapped_size) || !mapped_size) { 763 if (!enter.object()->Describe(&mapped_size) || !mapped_size) {
811 enter.object()->Unmap(); 764 enter.object()->Unmap();
812 return NULL; 765 return NULL;
813 } 766 }
814 767
815 *ppb_buffer = static_cast<PPB_Buffer_Impl*>(enter.object()); 768 *ppb_buffer = static_cast<PPB_Buffer_Impl*>(enter.object());
816 769
817 return mapped_data; 770 return mapped_data;
818 } 771 }
819 772
820 void ContentDecryptorDelegate::DeliverFrame( 773 void ContentDecryptorDelegate::DeliverFrame(
821 PP_Resource decrypted_frame, 774 PP_Resource decrypted_frame, const PP_DecryptedFrameInfo* frame_info) {
822 const PP_DecryptedFrameInfo* frame_info) {
823 DCHECK(frame_info); 775 DCHECK(frame_info);
824 776
825 const uint32_t request_id = frame_info->tracking_info.request_id; 777 const uint32_t request_id = frame_info->tracking_info.request_id;
826 DVLOG(2) << "DeliverFrame() - request_id: " << request_id; 778 DVLOG(2) << "DeliverFrame() - request_id: " << request_id;
827 779
828 // If the request ID is not valid or does not match what's saved, do nothing. 780 // If the request ID is not valid or does not match what's saved, do nothing.
829 if (request_id == 0 || request_id != pending_video_decode_request_id_) { 781 if (request_id == 0 || request_id != pending_video_decode_request_id_) {
830 DVLOG(1) << "DeliverFrame() - request_id " << request_id << " not found"; 782 DVLOG(1) << "DeliverFrame() - request_id " << request_id << " not found";
831 FreeBuffer(frame_info->tracking_info.buffer_id); 783 FreeBuffer(frame_info->tracking_info.buffer_id);
832 return; 784 return;
(...skipping 21 matching lines...) Expand all
854 FreeBuffer(frame_info->tracking_info.buffer_id); 806 FreeBuffer(frame_info->tracking_info.buffer_id);
855 video_decode_cb.Run(media::Decryptor::kError, NULL); 807 video_decode_cb.Run(media::Decryptor::kError, NULL);
856 return; 808 return;
857 } 809 }
858 810
859 gfx::Size frame_size(frame_info->width, frame_info->height); 811 gfx::Size frame_size(frame_info->width, frame_info->height);
860 DCHECK_EQ(frame_info->format, PP_DECRYPTEDFRAMEFORMAT_YV12); 812 DCHECK_EQ(frame_info->format, PP_DECRYPTEDFRAMEFORMAT_YV12);
861 813
862 scoped_refptr<media::VideoFrame> decoded_frame = 814 scoped_refptr<media::VideoFrame> decoded_frame =
863 media::VideoFrame::WrapExternalYuvData( 815 media::VideoFrame::WrapExternalYuvData(
864 media::VideoFrame::YV12, 816 media::VideoFrame::YV12, frame_size, gfx::Rect(frame_size),
865 frame_size, gfx::Rect(frame_size), natural_size_, 817 natural_size_, frame_info->strides[PP_DECRYPTEDFRAMEPLANES_Y],
866 frame_info->strides[PP_DECRYPTEDFRAMEPLANES_Y],
867 frame_info->strides[PP_DECRYPTEDFRAMEPLANES_U], 818 frame_info->strides[PP_DECRYPTEDFRAMEPLANES_U],
868 frame_info->strides[PP_DECRYPTEDFRAMEPLANES_V], 819 frame_info->strides[PP_DECRYPTEDFRAMEPLANES_V],
869 frame_data + frame_info->plane_offsets[PP_DECRYPTEDFRAMEPLANES_Y], 820 frame_data + frame_info->plane_offsets[PP_DECRYPTEDFRAMEPLANES_Y],
870 frame_data + frame_info->plane_offsets[PP_DECRYPTEDFRAMEPLANES_U], 821 frame_data + frame_info->plane_offsets[PP_DECRYPTEDFRAMEPLANES_U],
871 frame_data + frame_info->plane_offsets[PP_DECRYPTEDFRAMEPLANES_V], 822 frame_data + frame_info->plane_offsets[PP_DECRYPTEDFRAMEPLANES_V],
872 base::TimeDelta::FromMicroseconds( 823 base::TimeDelta::FromMicroseconds(
873 frame_info->tracking_info.timestamp), 824 frame_info->tracking_info.timestamp),
874 media::BindToLoop( 825 media::BindToLoop(
875 base::MessageLoopProxy::current(), 826 base::MessageLoopProxy::current(),
876 base::Bind(&BufferNoLongerNeeded, ppb_buffer, 827 base::Bind(
877 base::Bind(&ContentDecryptorDelegate::FreeBuffer, 828 &BufferNoLongerNeeded, ppb_buffer,
878 weak_this_, 829 base::Bind(&ContentDecryptorDelegate::FreeBuffer, weak_this_,
879 frame_info->tracking_info.buffer_id)))); 830 frame_info->tracking_info.buffer_id))));
880 831
881 video_decode_cb.Run(media::Decryptor::kSuccess, decoded_frame); 832 video_decode_cb.Run(media::Decryptor::kSuccess, decoded_frame);
882 } 833 }
883 834
884 void ContentDecryptorDelegate::DeliverSamples( 835 void ContentDecryptorDelegate::DeliverSamples(
885 PP_Resource audio_frames, 836 PP_Resource audio_frames, const PP_DecryptedBlockInfo* block_info) {
886 const PP_DecryptedBlockInfo* block_info) {
887 DCHECK(block_info); 837 DCHECK(block_info);
888 838
889 FreeBuffer(block_info->tracking_info.buffer_id); 839 FreeBuffer(block_info->tracking_info.buffer_id);
890 840
891 const uint32_t request_id = block_info->tracking_info.request_id; 841 const uint32_t request_id = block_info->tracking_info.request_id;
892 DVLOG(2) << "DeliverSamples() - request_id: " << request_id; 842 DVLOG(2) << "DeliverSamples() - request_id: " << request_id;
893 843
894 // If the request ID is not valid or does not match what's saved, do nothing. 844 // If the request ID is not valid or does not match what's saved, do nothing.
895 if (request_id == 0 || request_id != pending_audio_decode_request_id_) { 845 if (request_id == 0 || request_id != pending_audio_decode_request_id_) {
896 DVLOG(1) << "DeliverSamples() - request_id " << request_id << " not found"; 846 DVLOG(1) << "DeliverSamples() - request_id " << request_id << " not found";
897 return; 847 return;
898 } 848 }
899 849
900 DCHECK(!pending_audio_decode_cb_.is_null()); 850 DCHECK(!pending_audio_decode_cb_.is_null());
901 pending_audio_decode_request_id_ = 0; 851 pending_audio_decode_request_id_ = 0;
902 media::Decryptor::AudioDecodeCB audio_decode_cb = 852 media::Decryptor::AudioDecodeCB audio_decode_cb =
903 base::ResetAndReturn(&pending_audio_decode_cb_); 853 base::ResetAndReturn(&pending_audio_decode_cb_);
904 854
905 const media::Decryptor::AudioBuffers empty_frames; 855 const media::Decryptor::AudioBuffers empty_frames;
906 856
907 media::Decryptor::Status status = 857 media::Decryptor::Status status =
908 PpDecryptResultToMediaDecryptorStatus(block_info->result); 858 PpDecryptResultToMediaDecryptorStatus(block_info->result);
909 if (status != media::Decryptor::kSuccess) { 859 if (status != media::Decryptor::kSuccess) {
910 audio_decode_cb.Run(status, empty_frames); 860 audio_decode_cb.Run(status, empty_frames);
911 return; 861 return;
912 } 862 }
913 863
914 media::Decryptor::AudioBuffers audio_frame_list; 864 media::Decryptor::AudioBuffers audio_frame_list;
915 if (!DeserializeAudioFrames(audio_frames, 865 if (!DeserializeAudioFrames(audio_frames, block_info->data_size,
916 block_info->data_size,
917 &audio_frame_list)) { 866 &audio_frame_list)) {
918 NOTREACHED() << "CDM did not serialize the buffer correctly."; 867 NOTREACHED() << "CDM did not serialize the buffer correctly.";
919 audio_decode_cb.Run(media::Decryptor::kError, empty_frames); 868 audio_decode_cb.Run(media::Decryptor::kError, empty_frames);
920 return; 869 return;
921 } 870 }
922 871
923 audio_decode_cb.Run(media::Decryptor::kSuccess, audio_frame_list); 872 audio_decode_cb.Run(media::Decryptor::kSuccess, audio_frame_list);
924 } 873 }
925 874
926 // TODO(xhwang): Try to remove duplicate logic here and in CancelDecrypt(). 875 // TODO(xhwang): Try to remove duplicate logic here and in CancelDecrypt().
927 void ContentDecryptorDelegate::CancelDecode( 876 void ContentDecryptorDelegate::CancelDecode(
928 media::Decryptor::StreamType stream_type) { 877 media::Decryptor::StreamType stream_type) {
929 switch (stream_type) { 878 switch (stream_type) {
930 case media::Decryptor::kAudio: 879 case media::Decryptor::kAudio:
931 // Release the shared memory as it can still be in use by the plugin. 880 // Release the shared memory as it can still be in use by the plugin.
932 // The next DecryptAndDecode() call will need to allocate a new shared 881 // The next DecryptAndDecode() call will need to allocate a new shared
933 // memory buffer. 882 // memory buffer.
934 audio_input_resource_ = NULL; 883 audio_input_resource_ = NULL;
935 pending_audio_decode_request_id_ = 0; 884 pending_audio_decode_request_id_ = 0;
936 if (!pending_audio_decode_cb_.is_null()) 885 if (!pending_audio_decode_cb_.is_null())
937 base::ResetAndReturn(&pending_audio_decode_cb_).Run( 886 base::ResetAndReturn(&pending_audio_decode_cb_)
938 media::Decryptor::kSuccess, media::Decryptor::AudioBuffers()); 887 .Run(media::Decryptor::kSuccess, media::Decryptor::AudioBuffers());
939 break; 888 break;
940 case media::Decryptor::kVideo: 889 case media::Decryptor::kVideo:
941 // Release the shared memory as it can still be in use by the plugin. 890 // Release the shared memory as it can still be in use by the plugin.
942 // The next DecryptAndDecode() call will need to allocate a new shared 891 // The next DecryptAndDecode() call will need to allocate a new shared
943 // memory buffer. 892 // memory buffer.
944 video_input_resource_ = NULL; 893 video_input_resource_ = NULL;
945 pending_video_decode_request_id_ = 0; 894 pending_video_decode_request_id_ = 0;
946 if (!pending_video_decode_cb_.is_null()) 895 if (!pending_video_decode_cb_.is_null())
947 base::ResetAndReturn(&pending_video_decode_cb_).Run( 896 base::ResetAndReturn(&pending_video_decode_cb_)
948 media::Decryptor::kSuccess, NULL); 897 .Run(media::Decryptor::kSuccess, NULL);
949 break; 898 break;
950 default: 899 default:
951 NOTREACHED(); 900 NOTREACHED();
952 } 901 }
953 } 902 }
954 903
955 bool ContentDecryptorDelegate::MakeMediaBufferResource( 904 bool ContentDecryptorDelegate::MakeMediaBufferResource(
956 media::Decryptor::StreamType stream_type, 905 media::Decryptor::StreamType stream_type,
957 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, 906 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer,
958 scoped_refptr<PPB_Buffer_Impl>* resource) { 907 scoped_refptr<PPB_Buffer_Impl>* resource) {
959 TRACE_EVENT0("eme", "ContentDecryptorDelegate::MakeMediaBufferResource"); 908 TRACE_EVENT0("eme", "ContentDecryptorDelegate::MakeMediaBufferResource");
960 909
961 // End of stream buffers are represented as null resources. 910 // End of stream buffers are represented as null resources.
962 if (encrypted_buffer->IsEndOfStream()) { 911 if (encrypted_buffer->IsEndOfStream()) {
963 *resource = NULL; 912 *resource = NULL;
964 return true; 913 return true;
965 } 914 }
966 915
967 DCHECK(stream_type == media::Decryptor::kAudio || 916 DCHECK(stream_type == media::Decryptor::kAudio ||
968 stream_type == media::Decryptor::kVideo); 917 stream_type == media::Decryptor::kVideo);
969 scoped_refptr<PPB_Buffer_Impl>& media_resource = 918 scoped_refptr<PPB_Buffer_Impl>& media_resource =
970 (stream_type == media::Decryptor::kAudio) ? audio_input_resource_ : 919 (stream_type == media::Decryptor::kAudio) ? audio_input_resource_
971 video_input_resource_; 920 : video_input_resource_;
972 921
973 const size_t data_size = static_cast<size_t>(encrypted_buffer->GetDataSize()); 922 const size_t data_size = static_cast<size_t>(encrypted_buffer->GetDataSize());
974 if (!media_resource.get() || media_resource->size() < data_size) { 923 if (!media_resource.get() || media_resource->size() < data_size) {
975 // Either the buffer hasn't been created yet, or we have one that isn't big 924 // Either the buffer hasn't been created yet, or we have one that isn't big
976 // enough to fit |size| bytes. 925 // enough to fit |size| bytes.
977 926
978 // Media resource size starts from |kMinimumMediaBufferSize| and grows 927 // Media resource size starts from |kMinimumMediaBufferSize| and grows
979 // exponentially to avoid frequent re-allocation of PPB_Buffer_Impl, 928 // exponentially to avoid frequent re-allocation of PPB_Buffer_Impl,
980 // which is usually expensive. Since input media buffers are compressed, 929 // which is usually expensive. Since input media buffers are compressed,
981 // they are usually small (compared to outputs). The over-allocated memory 930 // they are usually small (compared to outputs). The over-allocated memory
982 // should be negligible. 931 // should be negligible.
983 const uint32_t kMinimumMediaBufferSize = 1024; 932 const uint32_t kMinimumMediaBufferSize = 1024;
984 uint32_t media_resource_size = 933 uint32_t media_resource_size =
985 media_resource.get() ? media_resource->size() : kMinimumMediaBufferSize; 934 media_resource.get() ? media_resource->size() : kMinimumMediaBufferSize;
986 while (media_resource_size < data_size) 935 while (media_resource_size < data_size) media_resource_size *= 2;
scherkus (not reviewing) 2013/06/21 19:48:38 revert this change -- we don't do single-line whil
987 media_resource_size *= 2;
988 936
989 DVLOG(2) << "Size of media buffer for " 937 DVLOG(2) << "Size of media buffer for "
990 << ((stream_type == media::Decryptor::kAudio) ? "audio" : "video") 938 << ((stream_type == media::Decryptor::kAudio) ? "audio" : "video")
991 << " stream bumped to " << media_resource_size 939 << " stream bumped to " << media_resource_size
992 << " bytes to fit input."; 940 << " bytes to fit input.";
993 media_resource = PPB_Buffer_Impl::CreateResource(pp_instance_, 941 media_resource =
994 media_resource_size); 942 PPB_Buffer_Impl::CreateResource(pp_instance_, media_resource_size);
995 if (!media_resource.get()) 943 if (!media_resource.get()) return false;
996 return false;
997 } 944 }
998 945
999 BufferAutoMapper mapper(media_resource.get()); 946 BufferAutoMapper mapper(media_resource.get());
1000 if (!mapper.data() || mapper.size() < data_size) { 947 if (!mapper.data() || mapper.size() < data_size) {
1001 media_resource = NULL; 948 media_resource = NULL;
1002 return false; 949 return false;
1003 } 950 }
1004 memcpy(mapper.data(), encrypted_buffer->GetData(), data_size); 951 memcpy(mapper.data(), encrypted_buffer->GetData(), data_size);
1005 952
1006 *resource = media_resource; 953 *resource = media_resource;
1007 return true; 954 return true;
1008 } 955 }
1009 956
1010 void ContentDecryptorDelegate::FreeBuffer(uint32_t buffer_id) { 957 void ContentDecryptorDelegate::FreeBuffer(uint32_t buffer_id) {
1011 if (buffer_id) 958 if (buffer_id) free_buffers_.push(buffer_id);
scherkus (not reviewing) 2013/06/21 19:48:38 revert this change -- we don't do single-line ifs
1012 free_buffers_.push(buffer_id);
1013 } 959 }
1014 960
1015 void ContentDecryptorDelegate::SetBufferToFreeInTrackingInfo( 961 void ContentDecryptorDelegate::SetBufferToFreeInTrackingInfo(
1016 PP_DecryptTrackingInfo* tracking_info) { 962 PP_DecryptTrackingInfo* tracking_info) {
1017 DCHECK_EQ(tracking_info->buffer_id, 0u); 963 DCHECK_EQ(tracking_info->buffer_id, 0u);
1018 964
1019 if (free_buffers_.empty()) 965 if (free_buffers_.empty()) return;
scherkus (not reviewing) 2013/06/21 19:48:38 revert this change -- we don't do single-line ifs
1020 return;
1021 966
1022 tracking_info->buffer_id = free_buffers_.front(); 967 tracking_info->buffer_id = free_buffers_.front();
1023 free_buffers_.pop(); 968 free_buffers_.pop();
1024 } 969 }
1025 970
1026 } // namespace ppapi 971 } // namespace ppapi
1027 } // namespace webkit 972 } // namespace webkit
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698