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/numerics/safe_conversions.h" | 10 #include "base/numerics/safe_conversions.h" |
(...skipping 25 matching lines...) Expand all Loading... |
36 | 36 |
37 namespace content { | 37 namespace content { |
38 | 38 |
39 namespace { | 39 namespace { |
40 | 40 |
41 // Fills |resource| with a PPB_Buffer_Impl and copies |data| into the buffer | 41 // Fills |resource| with a PPB_Buffer_Impl and copies |data| into the buffer |
42 // resource. The |*resource|, if valid, will be in the ResourceTracker with a | 42 // resource. The |*resource|, if valid, will be in the ResourceTracker with a |
43 // reference-count of 0. If |data| is NULL, sets |*resource| to NULL. Returns | 43 // reference-count of 0. If |data| is NULL, sets |*resource| to NULL. Returns |
44 // true upon success and false if any error happened. | 44 // true upon success and false if any error happened. |
45 bool MakeBufferResource(PP_Instance instance, | 45 bool MakeBufferResource(PP_Instance instance, |
46 const uint8* data, uint32_t size, | 46 const uint8* data, |
| 47 uint32_t size, |
47 scoped_refptr<PPB_Buffer_Impl>* resource) { | 48 scoped_refptr<PPB_Buffer_Impl>* resource) { |
48 TRACE_EVENT0("media", "ContentDecryptorDelegate - MakeBufferResource"); | 49 TRACE_EVENT0("media", "ContentDecryptorDelegate - MakeBufferResource"); |
49 DCHECK(resource); | 50 DCHECK(resource); |
50 | 51 |
51 if (!data || !size) { | 52 if (!data || !size) { |
52 DCHECK(!data && !size); | 53 DCHECK(!data && !size); |
53 resource = NULL; | 54 resource = NULL; |
54 return true; | 55 return true; |
55 } | 56 } |
56 | 57 |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 case Decryptor::kVideo: | 362 case Decryptor::kVideo: |
362 video_decrypt_cb_.Set(request_id, decrypt_cb); | 363 video_decrypt_cb_.Set(request_id, decrypt_cb); |
363 break; | 364 break; |
364 default: | 365 default: |
365 NOTREACHED(); | 366 NOTREACHED(); |
366 return false; | 367 return false; |
367 } | 368 } |
368 | 369 |
369 SetBufferToFreeInTrackingInfo(&block_info.tracking_info); | 370 SetBufferToFreeInTrackingInfo(&block_info.tracking_info); |
370 | 371 |
371 plugin_decryption_interface_->Decrypt(pp_instance_, | 372 plugin_decryption_interface_->Decrypt(pp_instance_, pp_resource, &block_info); |
372 pp_resource, | |
373 &block_info); | |
374 return true; | 373 return true; |
375 } | 374 } |
376 | 375 |
377 bool ContentDecryptorDelegate::CancelDecrypt( | 376 bool ContentDecryptorDelegate::CancelDecrypt( |
378 Decryptor::StreamType stream_type) { | 377 Decryptor::StreamType stream_type) { |
379 DVLOG(3) << "CancelDecrypt() - stream_type: " << stream_type; | 378 DVLOG(3) << "CancelDecrypt() - stream_type: " << stream_type; |
380 | 379 |
381 Decryptor::DecryptCB decrypt_cb; | 380 Decryptor::DecryptCB decrypt_cb; |
382 switch (stream_type) { | 381 switch (stream_type) { |
383 case Decryptor::kAudio: | 382 case Decryptor::kAudio: |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
424 scoped_refptr<PPB_Buffer_Impl> extra_data_resource; | 423 scoped_refptr<PPB_Buffer_Impl> extra_data_resource; |
425 if (!MakeBufferResource(pp_instance_, | 424 if (!MakeBufferResource(pp_instance_, |
426 decoder_config.extra_data(), | 425 decoder_config.extra_data(), |
427 decoder_config.extra_data_size(), | 426 decoder_config.extra_data_size(), |
428 &extra_data_resource)) { | 427 &extra_data_resource)) { |
429 return false; | 428 return false; |
430 } | 429 } |
431 ScopedPPResource pp_resource(extra_data_resource.get()); | 430 ScopedPPResource pp_resource(extra_data_resource.get()); |
432 | 431 |
433 audio_decoder_init_cb_.Set(pp_decoder_config.request_id, init_cb); | 432 audio_decoder_init_cb_.Set(pp_decoder_config.request_id, init_cb); |
434 plugin_decryption_interface_->InitializeAudioDecoder(pp_instance_, | 433 plugin_decryption_interface_->InitializeAudioDecoder( |
435 &pp_decoder_config, | 434 pp_instance_, &pp_decoder_config, pp_resource); |
436 pp_resource); | |
437 return true; | 435 return true; |
438 } | 436 } |
439 | 437 |
440 bool ContentDecryptorDelegate::InitializeVideoDecoder( | 438 bool ContentDecryptorDelegate::InitializeVideoDecoder( |
441 const media::VideoDecoderConfig& decoder_config, | 439 const media::VideoDecoderConfig& decoder_config, |
442 const Decryptor::DecoderInitCB& init_cb) { | 440 const Decryptor::DecoderInitCB& init_cb) { |
443 PP_VideoDecoderConfig pp_decoder_config; | 441 PP_VideoDecoderConfig pp_decoder_config; |
444 pp_decoder_config.codec = | 442 pp_decoder_config.codec = |
445 MediaVideoCodecToPpVideoCodec(decoder_config.codec()); | 443 MediaVideoCodecToPpVideoCodec(decoder_config.codec()); |
446 pp_decoder_config.profile = | 444 pp_decoder_config.profile = |
447 MediaVideoCodecProfileToPpVideoCodecProfile(decoder_config.profile()); | 445 MediaVideoCodecProfileToPpVideoCodecProfile(decoder_config.profile()); |
448 pp_decoder_config.format = | 446 pp_decoder_config.format = |
449 MediaVideoFormatToPpDecryptedFrameFormat(decoder_config.format()); | 447 MediaVideoFormatToPpDecryptedFrameFormat(decoder_config.format()); |
450 pp_decoder_config.width = decoder_config.coded_size().width(); | 448 pp_decoder_config.width = decoder_config.coded_size().width(); |
451 pp_decoder_config.height = decoder_config.coded_size().height(); | 449 pp_decoder_config.height = decoder_config.coded_size().height(); |
452 pp_decoder_config.request_id = next_decryption_request_id_++; | 450 pp_decoder_config.request_id = next_decryption_request_id_++; |
453 | 451 |
454 scoped_refptr<PPB_Buffer_Impl> extra_data_resource; | 452 scoped_refptr<PPB_Buffer_Impl> extra_data_resource; |
455 if (!MakeBufferResource(pp_instance_, | 453 if (!MakeBufferResource(pp_instance_, |
456 decoder_config.extra_data(), | 454 decoder_config.extra_data(), |
457 decoder_config.extra_data_size(), | 455 decoder_config.extra_data_size(), |
458 &extra_data_resource)) { | 456 &extra_data_resource)) { |
459 return false; | 457 return false; |
460 } | 458 } |
461 ScopedPPResource pp_resource(extra_data_resource.get()); | 459 ScopedPPResource pp_resource(extra_data_resource.get()); |
462 | 460 |
463 video_decoder_init_cb_.Set(pp_decoder_config.request_id, init_cb); | 461 video_decoder_init_cb_.Set(pp_decoder_config.request_id, init_cb); |
464 natural_size_ = decoder_config.natural_size(); | 462 natural_size_ = decoder_config.natural_size(); |
465 | 463 |
466 plugin_decryption_interface_->InitializeVideoDecoder(pp_instance_, | 464 plugin_decryption_interface_->InitializeVideoDecoder( |
467 &pp_decoder_config, | 465 pp_instance_, &pp_decoder_config, pp_resource); |
468 pp_resource); | |
469 return true; | 466 return true; |
470 } | 467 } |
471 | 468 |
472 bool ContentDecryptorDelegate::DeinitializeDecoder( | 469 bool ContentDecryptorDelegate::DeinitializeDecoder( |
473 Decryptor::StreamType stream_type) { | 470 Decryptor::StreamType stream_type) { |
474 CancelDecode(stream_type); | 471 CancelDecode(stream_type); |
475 | 472 |
476 if (stream_type == Decryptor::kVideo) | 473 if (stream_type == Decryptor::kVideo) |
477 natural_size_ = gfx::Size(); | 474 natural_size_ = gfx::Size(); |
478 | 475 |
(...skipping 14 matching lines...) Expand all Loading... |
493 } | 490 } |
494 | 491 |
495 bool ContentDecryptorDelegate::DecryptAndDecodeAudio( | 492 bool ContentDecryptorDelegate::DecryptAndDecodeAudio( |
496 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, | 493 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, |
497 const Decryptor::AudioDecodeCB& audio_decode_cb) { | 494 const Decryptor::AudioDecodeCB& audio_decode_cb) { |
498 // |audio_input_resource_| is not being used by the plugin now | 495 // |audio_input_resource_| is not being used by the plugin now |
499 // because there is only one pending audio decode request at any time. | 496 // because there is only one pending audio decode request at any time. |
500 // This is enforced by the media pipeline. | 497 // This is enforced by the media pipeline. |
501 scoped_refptr<PPB_Buffer_Impl> encrypted_resource; | 498 scoped_refptr<PPB_Buffer_Impl> encrypted_resource; |
502 if (!MakeMediaBufferResource( | 499 if (!MakeMediaBufferResource( |
503 Decryptor::kAudio, encrypted_buffer, &encrypted_resource)) { | 500 Decryptor::kAudio, encrypted_buffer, &encrypted_resource)) { |
504 return false; | 501 return false; |
505 } | 502 } |
506 | 503 |
507 // The resource should not be NULL for non-EOS buffer. | 504 // The resource should not be NULL for non-EOS buffer. |
508 if (!encrypted_buffer->end_of_stream() && !encrypted_resource.get()) | 505 if (!encrypted_buffer->end_of_stream() && !encrypted_resource.get()) |
509 return false; | 506 return false; |
510 | 507 |
511 const uint32_t request_id = next_decryption_request_id_++; | 508 const uint32_t request_id = next_decryption_request_id_++; |
512 DVLOG(2) << "DecryptAndDecodeAudio() - request_id " << request_id; | 509 DVLOG(2) << "DecryptAndDecodeAudio() - request_id " << request_id; |
513 | 510 |
514 PP_EncryptedBlockInfo block_info = {}; | 511 PP_EncryptedBlockInfo block_info = {}; |
515 if (!MakeEncryptedBlockInfo(encrypted_buffer, request_id, &block_info)) { | 512 if (!MakeEncryptedBlockInfo(encrypted_buffer, request_id, &block_info)) { |
516 return false; | 513 return false; |
517 } | 514 } |
518 | 515 |
519 SetBufferToFreeInTrackingInfo(&block_info.tracking_info); | 516 SetBufferToFreeInTrackingInfo(&block_info.tracking_info); |
520 | 517 |
521 // There is only one pending audio decode request at any time. This is | 518 // There is only one pending audio decode request at any time. This is |
522 // enforced by the media pipeline. If this DCHECK is violated, our buffer | 519 // enforced by the media pipeline. If this DCHECK is violated, our buffer |
523 // reuse policy is not valid, and we may have race problems for the shared | 520 // reuse policy is not valid, and we may have race problems for the shared |
524 // buffer. | 521 // buffer. |
525 audio_decode_cb_.Set(request_id, audio_decode_cb); | 522 audio_decode_cb_.Set(request_id, audio_decode_cb); |
526 | 523 |
527 ScopedPPResource pp_resource(encrypted_resource.get()); | 524 ScopedPPResource pp_resource(encrypted_resource.get()); |
528 plugin_decryption_interface_->DecryptAndDecode(pp_instance_, | 525 plugin_decryption_interface_->DecryptAndDecode( |
529 PP_DECRYPTORSTREAMTYPE_AUDIO, | 526 pp_instance_, PP_DECRYPTORSTREAMTYPE_AUDIO, pp_resource, &block_info); |
530 pp_resource, | |
531 &block_info); | |
532 return true; | 527 return true; |
533 } | 528 } |
534 | 529 |
535 bool ContentDecryptorDelegate::DecryptAndDecodeVideo( | 530 bool ContentDecryptorDelegate::DecryptAndDecodeVideo( |
536 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, | 531 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, |
537 const Decryptor::VideoDecodeCB& video_decode_cb) { | 532 const Decryptor::VideoDecodeCB& video_decode_cb) { |
538 // |video_input_resource_| is not being used by the plugin now | 533 // |video_input_resource_| is not being used by the plugin now |
539 // because there is only one pending video decode request at any time. | 534 // because there is only one pending video decode request at any time. |
540 // This is enforced by the media pipeline. | 535 // This is enforced by the media pipeline. |
541 scoped_refptr<PPB_Buffer_Impl> encrypted_resource; | 536 scoped_refptr<PPB_Buffer_Impl> encrypted_resource; |
542 if (!MakeMediaBufferResource( | 537 if (!MakeMediaBufferResource( |
543 Decryptor::kVideo, encrypted_buffer, &encrypted_resource)) { | 538 Decryptor::kVideo, encrypted_buffer, &encrypted_resource)) { |
544 return false; | 539 return false; |
545 } | 540 } |
546 | 541 |
547 // The resource should not be 0 for non-EOS buffer. | 542 // The resource should not be 0 for non-EOS buffer. |
548 if (!encrypted_buffer->end_of_stream() && !encrypted_resource.get()) | 543 if (!encrypted_buffer->end_of_stream() && !encrypted_resource.get()) |
549 return false; | 544 return false; |
550 | 545 |
551 const uint32_t request_id = next_decryption_request_id_++; | 546 const uint32_t request_id = next_decryption_request_id_++; |
552 DVLOG(2) << "DecryptAndDecodeVideo() - request_id " << request_id; | 547 DVLOG(2) << "DecryptAndDecodeVideo() - request_id " << request_id; |
553 TRACE_EVENT_ASYNC_BEGIN0( | 548 TRACE_EVENT_ASYNC_BEGIN0( |
554 "media", "ContentDecryptorDelegate::DecryptAndDecodeVideo", request_id); | 549 "media", "ContentDecryptorDelegate::DecryptAndDecodeVideo", request_id); |
555 | 550 |
556 PP_EncryptedBlockInfo block_info = {}; | 551 PP_EncryptedBlockInfo block_info = {}; |
557 if (!MakeEncryptedBlockInfo(encrypted_buffer, request_id, &block_info)) { | 552 if (!MakeEncryptedBlockInfo(encrypted_buffer, request_id, &block_info)) { |
558 return false; | 553 return false; |
559 } | 554 } |
560 | 555 |
561 SetBufferToFreeInTrackingInfo(&block_info.tracking_info); | 556 SetBufferToFreeInTrackingInfo(&block_info.tracking_info); |
562 | 557 |
563 // Only one pending video decode request at any time. This is enforced by the | 558 // Only one pending video decode request at any time. This is enforced by the |
564 // media pipeline. If this DCHECK is violated, our buffer | 559 // media pipeline. If this DCHECK is violated, our buffer |
565 // reuse policy is not valid, and we may have race problems for the shared | 560 // reuse policy is not valid, and we may have race problems for the shared |
566 // buffer. | 561 // buffer. |
567 video_decode_cb_.Set(request_id, video_decode_cb); | 562 video_decode_cb_.Set(request_id, video_decode_cb); |
568 | 563 |
569 // TODO(tomfinegan): Need to get stream type from media stack. | 564 // TODO(tomfinegan): Need to get stream type from media stack. |
570 ScopedPPResource pp_resource(encrypted_resource.get()); | 565 ScopedPPResource pp_resource(encrypted_resource.get()); |
571 plugin_decryption_interface_->DecryptAndDecode(pp_instance_, | 566 plugin_decryption_interface_->DecryptAndDecode( |
572 PP_DECRYPTORSTREAMTYPE_VIDEO, | 567 pp_instance_, PP_DECRYPTORSTREAMTYPE_VIDEO, pp_resource, &block_info); |
573 pp_resource, | |
574 &block_info); | |
575 return true; | 568 return true; |
576 } | 569 } |
577 | 570 |
578 void ContentDecryptorDelegate::OnSessionCreated(uint32 session_id, | 571 void ContentDecryptorDelegate::OnSessionCreated(uint32 session_id, |
579 PP_Var web_session_id_var) { | 572 PP_Var web_session_id_var) { |
580 if (session_created_cb_.is_null()) | 573 if (session_created_cb_.is_null()) |
581 return; | 574 return; |
582 | 575 |
583 StringVar* session_id_string = StringVar::FromPPVar(web_session_id_var); | 576 StringVar* session_id_string = StringVar::FromPPVar(web_session_id_var); |
584 | 577 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
633 uint32_t system_code) { | 626 uint32_t system_code) { |
634 if (session_error_cb_.is_null()) | 627 if (session_error_cb_.is_null()) |
635 return; | 628 return; |
636 | 629 |
637 session_error_cb_.Run(session_id, | 630 session_error_cb_.Run(session_id, |
638 static_cast<media::MediaKeys::KeyError>(media_error), | 631 static_cast<media::MediaKeys::KeyError>(media_error), |
639 system_code); | 632 system_code); |
640 } | 633 } |
641 | 634 |
642 void ContentDecryptorDelegate::DecoderInitializeDone( | 635 void ContentDecryptorDelegate::DecoderInitializeDone( |
643 PP_DecryptorStreamType decoder_type, | 636 PP_DecryptorStreamType decoder_type, |
644 uint32_t request_id, | 637 uint32_t request_id, |
645 PP_Bool success) { | 638 PP_Bool success) { |
646 if (decoder_type == PP_DECRYPTORSTREAMTYPE_AUDIO) { | 639 if (decoder_type == PP_DECRYPTORSTREAMTYPE_AUDIO) { |
647 // If the request ID is not valid or does not match what's saved, do | 640 // If the request ID is not valid or does not match what's saved, do |
648 // nothing. | 641 // nothing. |
649 if (request_id == 0 || !audio_decoder_init_cb_.Matches(request_id)) | 642 if (request_id == 0 || !audio_decoder_init_cb_.Matches(request_id)) |
650 return; | 643 return; |
651 | 644 |
652 audio_decoder_init_cb_.ResetAndReturn().Run(PP_ToBool(success)); | 645 audio_decoder_init_cb_.ResetAndReturn().Run(PP_ToBool(success)); |
653 } else { | 646 } else { |
654 if (request_id == 0 || !video_decoder_init_cb_.Matches(request_id)) | 647 if (request_id == 0 || !video_decoder_init_cb_.Matches(request_id)) |
655 return; | 648 return; |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
714 BufferAutoMapper mapper(enter.object()); | 707 BufferAutoMapper mapper(enter.object()); |
715 if (!mapper.data() || !mapper.size() || | 708 if (!mapper.data() || !mapper.size() || |
716 mapper.size() < block_info->data_size) { | 709 mapper.size() < block_info->data_size) { |
717 decrypt_cb.Run(Decryptor::kError, NULL); | 710 decrypt_cb.Run(Decryptor::kError, NULL); |
718 return; | 711 return; |
719 } | 712 } |
720 | 713 |
721 // TODO(tomfinegan): Find a way to take ownership of the shared memory | 714 // TODO(tomfinegan): Find a way to take ownership of the shared memory |
722 // managed by the PPB_Buffer_Dev, and avoid the extra copy. | 715 // managed by the PPB_Buffer_Dev, and avoid the extra copy. |
723 scoped_refptr<media::DecoderBuffer> decrypted_buffer( | 716 scoped_refptr<media::DecoderBuffer> decrypted_buffer( |
724 media::DecoderBuffer::CopyFrom( | 717 media::DecoderBuffer::CopyFrom(static_cast<uint8*>(mapper.data()), |
725 static_cast<uint8*>(mapper.data()), block_info->data_size)); | 718 block_info->data_size)); |
726 decrypted_buffer->set_timestamp(base::TimeDelta::FromMicroseconds( | 719 decrypted_buffer->set_timestamp( |
727 block_info->tracking_info.timestamp)); | 720 base::TimeDelta::FromMicroseconds(block_info->tracking_info.timestamp)); |
728 decrypt_cb.Run(Decryptor::kSuccess, decrypted_buffer); | 721 decrypt_cb.Run(Decryptor::kSuccess, decrypted_buffer); |
729 } | 722 } |
730 | 723 |
731 // Use a non-class-member function here so that if for some reason | 724 // Use a non-class-member function here so that if for some reason |
732 // ContentDecryptorDelegate is destroyed before VideoFrame calls this callback, | 725 // ContentDecryptorDelegate is destroyed before VideoFrame calls this callback, |
733 // we can still get the shared memory unmapped. | 726 // we can still get the shared memory unmapped. |
734 static void BufferNoLongerNeeded( | 727 static void BufferNoLongerNeeded( |
735 const scoped_refptr<PPB_Buffer_Impl>& ppb_buffer, | 728 const scoped_refptr<PPB_Buffer_Impl>& ppb_buffer, |
736 base::Closure buffer_no_longer_needed_cb) { | 729 base::Closure buffer_no_longer_needed_cb) { |
737 ppb_buffer->Unmap(); | 730 ppb_buffer->Unmap(); |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
922 const uint32_t kMinimumMediaBufferSize = 1024; | 915 const uint32_t kMinimumMediaBufferSize = 1024; |
923 uint32_t media_resource_size = | 916 uint32_t media_resource_size = |
924 media_resource.get() ? media_resource->size() : kMinimumMediaBufferSize; | 917 media_resource.get() ? media_resource->size() : kMinimumMediaBufferSize; |
925 while (media_resource_size < data_size) | 918 while (media_resource_size < data_size) |
926 media_resource_size *= 2; | 919 media_resource_size *= 2; |
927 | 920 |
928 DVLOG(2) << "Size of media buffer for " | 921 DVLOG(2) << "Size of media buffer for " |
929 << ((stream_type == Decryptor::kAudio) ? "audio" : "video") | 922 << ((stream_type == Decryptor::kAudio) ? "audio" : "video") |
930 << " stream bumped to " << media_resource_size | 923 << " stream bumped to " << media_resource_size |
931 << " bytes to fit input."; | 924 << " bytes to fit input."; |
932 media_resource = PPB_Buffer_Impl::CreateResource(pp_instance_, | 925 media_resource = |
933 media_resource_size); | 926 PPB_Buffer_Impl::CreateResource(pp_instance_, media_resource_size); |
934 if (!media_resource.get()) | 927 if (!media_resource.get()) |
935 return false; | 928 return false; |
936 } | 929 } |
937 | 930 |
938 BufferAutoMapper mapper(media_resource.get()); | 931 BufferAutoMapper mapper(media_resource.get()); |
939 if (!mapper.data() || mapper.size() < data_size) { | 932 if (!mapper.data() || mapper.size() < data_size) { |
940 media_resource = NULL; | 933 media_resource = NULL; |
941 return false; | 934 return false; |
942 } | 935 } |
943 memcpy(mapper.data(), encrypted_buffer->data(), data_size); | 936 memcpy(mapper.data(), encrypted_buffer->data(), data_size); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
983 const uint8* cur = static_cast<uint8*>(mapper.data()); | 976 const uint8* cur = static_cast<uint8*>(mapper.data()); |
984 size_t bytes_left = data_size; | 977 size_t bytes_left = data_size; |
985 | 978 |
986 const int audio_bytes_per_frame = | 979 const int audio_bytes_per_frame = |
987 media::SampleFormatToBytesPerChannel(sample_format) * | 980 media::SampleFormatToBytesPerChannel(sample_format) * |
988 audio_channel_count_; | 981 audio_channel_count_; |
989 if (audio_bytes_per_frame <= 0) | 982 if (audio_bytes_per_frame <= 0) |
990 return false; | 983 return false; |
991 | 984 |
992 // Allocate space for the channel pointers given to AudioBuffer. | 985 // Allocate space for the channel pointers given to AudioBuffer. |
993 std::vector<const uint8*> channel_ptrs( | 986 std::vector<const uint8*> channel_ptrs(audio_channel_count_, |
994 audio_channel_count_, static_cast<const uint8*>(NULL)); | 987 static_cast<const uint8*>(NULL)); |
995 do { | 988 do { |
996 int64 timestamp = 0; | 989 int64 timestamp = 0; |
997 int64 frame_size = -1; | 990 int64 frame_size = -1; |
998 const size_t kHeaderSize = sizeof(timestamp) + sizeof(frame_size); | 991 const size_t kHeaderSize = sizeof(timestamp) + sizeof(frame_size); |
999 | 992 |
1000 if (bytes_left < kHeaderSize) | 993 if (bytes_left < kHeaderSize) |
1001 return false; | 994 return false; |
1002 | 995 |
1003 memcpy(×tamp, cur, sizeof(timestamp)); | 996 memcpy(×tamp, cur, sizeof(timestamp)); |
1004 cur += sizeof(timestamp); | 997 cur += sizeof(timestamp); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1060 const media::Decryptor::AudioBuffers empty_frames; | 1053 const media::Decryptor::AudioBuffers empty_frames; |
1061 audio_decode_cb_.ResetAndReturn().Run(media::Decryptor::kError, | 1054 audio_decode_cb_.ResetAndReturn().Run(media::Decryptor::kError, |
1062 empty_frames); | 1055 empty_frames); |
1063 } | 1056 } |
1064 | 1057 |
1065 if (!video_decode_cb_.is_null()) | 1058 if (!video_decode_cb_.is_null()) |
1066 video_decode_cb_.ResetAndReturn().Run(media::Decryptor::kError, NULL); | 1059 video_decode_cb_.ResetAndReturn().Run(media::Decryptor::kError, NULL); |
1067 } | 1060 } |
1068 | 1061 |
1069 } // namespace content | 1062 } // namespace content |
OLD | NEW |