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

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

Issue 11189082: Update PluginInstance for audio support for content decryption. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 8 years, 1 month 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 | Annotate | Revision Log
« no previous file with comments | « webkit/plugins/ppapi/ppapi_plugin_instance.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/ppapi_plugin_instance.h" 5 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback_helpers.h" 8 #include "base/callback_helpers.h"
9 #include "base/debug/trace_event.h" 9 #include "base/debug/trace_event.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/memory/linked_ptr.h" 11 #include "base/memory/linked_ptr.h"
12 #include "base/message_loop.h" 12 #include "base/message_loop.h"
13 #include "base/stl_util.h" 13 #include "base/stl_util.h"
14 #include "base/stringprintf.h" 14 #include "base/stringprintf.h"
15 #include "base/time.h" 15 #include "base/time.h"
16 #include "base/utf_offset_string_conversions.h" 16 #include "base/utf_offset_string_conversions.h"
17 #include "base/utf_string_conversions.h" 17 #include "base/utf_string_conversions.h"
18 // TODO(xhwang): Move media specific code out of this class. 18 // TODO(xhwang): Move media specific code out of this class.
19 #include "media/base/audio_decoder_config.h" 19 #include "media/base/audio_decoder_config.h"
20 #include "media/base/channel_layout.h"
21 #include "media/base/data_buffer.h"
20 #include "media/base/decoder_buffer.h" 22 #include "media/base/decoder_buffer.h"
21 #include "media/base/decryptor_client.h" 23 #include "media/base/decryptor_client.h"
22 #include "media/base/video_decoder_config.h" 24 #include "media/base/video_decoder_config.h"
23 #include "media/base/video_frame.h" 25 #include "media/base/video_frame.h"
24 #include "media/base/video_util.h" 26 #include "media/base/video_util.h"
25 #include "ppapi/c/dev/ppb_find_dev.h" 27 #include "ppapi/c/dev/ppb_find_dev.h"
26 #include "ppapi/c/dev/ppb_zoom_dev.h" 28 #include "ppapi/c/dev/ppb_zoom_dev.h"
27 #include "ppapi/c/dev/ppp_find_dev.h" 29 #include "ppapi/c/dev/ppp_find_dev.h"
28 #include "ppapi/c/dev/ppp_selection_dev.h" 30 #include "ppapi/c/dev/ppp_selection_dev.h"
29 #include "ppapi/c/dev/ppp_text_input_dev.h" 31 #include "ppapi/c/dev/ppp_text_input_dev.h"
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 for (uint32_t i = 0; i < block_info->num_subsamples; ++i) { 387 for (uint32_t i = 0; i < block_info->num_subsamples; ++i) {
386 block_info->subsamples[i].clear_bytes = 388 block_info->subsamples[i].clear_bytes =
387 decrypt_config->subsamples()[i].clear_bytes; 389 decrypt_config->subsamples()[i].clear_bytes;
388 block_info->subsamples[i].cipher_bytes = 390 block_info->subsamples[i].cipher_bytes =
389 decrypt_config->subsamples()[i].cypher_bytes; 391 decrypt_config->subsamples()[i].cypher_bytes;
390 } 392 }
391 393
392 return true; 394 return true;
393 } 395 }
394 396
397 // Deserializes audio data stored in |audio_frames| into individual audio
398 // buffers in |frames|. Returns true upon success.
399 bool DeserializeAudioFrames(PP_Resource audio_frames,
400 media::Decryptor::AudioBuffers* frames) {
401 DCHECK(frames);
402 EnterResourceNoLock<PPB_Buffer_API> enter(audio_frames, true);
403 if (!enter.succeeded())
404 return false;
405
406 BufferAutoMapper mapper(enter.object());
407 if (!mapper.data() || !mapper.size())
408 return false;
409
410 const uint8* cur = static_cast<uint8*>(mapper.data());
411 int bytes_left = mapper.size();
412
413 do {
414 int64 timestamp = 0;
415 int64 frame_size = -1;
416 const int kHeaderSize = sizeof(timestamp) + sizeof(frame_size);
417
418 if (bytes_left < kHeaderSize)
419 return false;
420
421 timestamp = *(reinterpret_cast<const int64*>(cur));
viettrungluu 2012/10/24 16:59:20 You should probably use bit_cast (see basictypes.h
xhwang 2012/10/24 18:57:14 It seems bit_cast only works on casting two types
422 cur += sizeof(timestamp);
423 bytes_left -= sizeof(timestamp);
424
425 frame_size = *(reinterpret_cast<const int64*>(cur));
viettrungluu 2012/10/24 16:59:20 "
xhwang 2012/10/24 18:57:14 ditto
426 cur += sizeof(frame_size);
427 bytes_left -= sizeof(frame_size);
428
429 if (frame_size < 0 || bytes_left < frame_size)
430 return false;
431
432 scoped_refptr<media::DataBuffer> frame(new media::DataBuffer(frame_size));
433 if (frame_size > 0) {
434 memcpy(frame->GetWritableData(), cur, frame_size);
435 frame->SetTimestamp(base::TimeDelta::FromMicroseconds(timestamp));
viettrungluu 2012/10/24 16:59:20 You don't set the timestamp if frame_size == 0 (ev
xhwang 2012/10/24 18:57:14 It's okay not to set timestamp to an empty frame.
436 cur += frame_size;
437 bytes_left -= frame_size;
438 }
439 frames->push_back(frame);
440 } while (bytes_left > 0);
441
442 return true;
443 }
444
395 PP_AudioCodec MediaAudioCodecToPpAudioCodec(media::AudioCodec codec) { 445 PP_AudioCodec MediaAudioCodecToPpAudioCodec(media::AudioCodec codec) {
396 switch (codec) { 446 switch (codec) {
397 case media::kCodecVorbis: 447 case media::kCodecVorbis:
398 return PP_AUDIOCODEC_VORBIS; 448 return PP_AUDIOCODEC_VORBIS;
399 default: 449 default:
400 return PP_AUDIOCODEC_UNKNOWN; 450 return PP_AUDIOCODEC_UNKNOWN;
401 } 451 }
402 } 452 }
403 453
404 PP_VideoCodec MediaVideoCodecToPpVideoCodec(media::VideoCodec codec) { 454 PP_VideoCodec MediaVideoCodecToPpVideoCodec(media::VideoCodec codec) {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 case PP_DECRYPTRESULT_DECRYPT_ERROR: 494 case PP_DECRYPTRESULT_DECRYPT_ERROR:
445 return media::Decryptor::kError; 495 return media::Decryptor::kError;
446 case PP_DECRYPTRESULT_DECODE_ERROR: 496 case PP_DECRYPTRESULT_DECODE_ERROR:
447 return media::Decryptor::kError; 497 return media::Decryptor::kError;
448 default: 498 default:
449 NOTREACHED(); 499 NOTREACHED();
450 return media::Decryptor::kError; 500 return media::Decryptor::kError;
451 } 501 }
452 } 502 }
453 503
504 PP_DecryptorStreamType MediaDecryptorStreamTypeToPpStreamType(
505 media::Decryptor::StreamType stream_type) {
506 switch (stream_type) {
507 case media::Decryptor::kAudio:
508 return PP_DECRYPTORSTREAMTYPE_AUDIO;
509 case media::Decryptor::kVideo:
510 return PP_DECRYPTORSTREAMTYPE_VIDEO;
511 default:
512 NOTREACHED();
513 return PP_DECRYPTORSTREAMTYPE_VIDEO;
514 }
515 }
516
454 } // namespace 517 } // namespace
455 518
456 // static 519 // static
457 PluginInstance* PluginInstance::Create(PluginDelegate* delegate, 520 PluginInstance* PluginInstance::Create(PluginDelegate* delegate,
458 PluginModule* module) { 521 PluginModule* module) {
459 base::Callback<const void*(const char*)> get_plugin_interface_func = 522 base::Callback<const void*(const char*)> get_plugin_interface_func =
460 base::Bind(&PluginModule::GetPluginInterface, module); 523 base::Bind(&PluginModule::GetPluginInterface, module);
461 PPP_Instance_Combined* ppp_instance_combined = 524 PPP_Instance_Combined* ppp_instance_combined =
462 PPP_Instance_Combined::Create(get_plugin_interface_func); 525 PPP_Instance_Combined::Create(get_plugin_interface_func);
463 if (!ppp_instance_combined) 526 if (!ppp_instance_combined)
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
518 text_input_type_(kPluginDefaultTextInputType), 581 text_input_type_(kPluginDefaultTextInputType),
519 text_input_caret_(0, 0, 0, 0), 582 text_input_caret_(0, 0, 0, 0),
520 text_input_caret_bounds_(0, 0, 0, 0), 583 text_input_caret_bounds_(0, 0, 0, 0),
521 text_input_caret_set_(false), 584 text_input_caret_set_(false),
522 selection_caret_(0), 585 selection_caret_(0),
523 selection_anchor_(0), 586 selection_anchor_(0),
524 pending_user_gesture_(0.0), 587 pending_user_gesture_(0.0),
525 flash_impl_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), 588 flash_impl_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
526 decryptor_client_(NULL), 589 decryptor_client_(NULL),
527 next_decryption_request_id_(1), 590 next_decryption_request_id_(1),
591 pending_audio_decrypt_request_id_(0),
592 pending_video_decrypt_request_id_(0),
528 pending_audio_decoder_init_request_id_(0), 593 pending_audio_decoder_init_request_id_(0),
529 pending_video_decoder_init_request_id_(0), 594 pending_video_decoder_init_request_id_(0),
595 pending_audio_decode_request_id_(0),
530 pending_video_decode_request_id_(0) { 596 pending_video_decode_request_id_(0) {
531 pp_instance_ = HostGlobals::Get()->AddInstance(this); 597 pp_instance_ = HostGlobals::Get()->AddInstance(this);
532 598
533 memset(&current_print_settings_, 0, sizeof(current_print_settings_)); 599 memset(&current_print_settings_, 0, sizeof(current_print_settings_));
534 DCHECK(delegate); 600 DCHECK(delegate);
535 module_->InstanceCreated(this); 601 module_->InstanceCreated(this);
536 delegate_->InstanceCreated(this); 602 delegate_->InstanceCreated(this);
537 message_channel_.reset(new MessageChannel(this)); 603 message_channel_.reset(new MessageChannel(this));
538 604
539 view_data_.is_page_visible = delegate->IsPageVisible(); 605 view_data_.is_page_visible = delegate->IsPageVisible();
(...skipping 989 matching lines...) Expand 10 before | Expand all | Expand 10 after
1529 PP_PrivatePageTransformType transform_type = 1595 PP_PrivatePageTransformType transform_type =
1530 type == WebPlugin::RotationType90Clockwise ? 1596 type == WebPlugin::RotationType90Clockwise ?
1531 PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CW : 1597 PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CW :
1532 PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CCW; 1598 PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CCW;
1533 plugin_pdf_interface_->Transform(pp_instance(), transform_type); 1599 plugin_pdf_interface_->Transform(pp_instance(), transform_type);
1534 // NOTE: plugin instance may have been deleted. 1600 // NOTE: plugin instance may have been deleted.
1535 } 1601 }
1536 1602
1537 void PluginInstance::set_decrypt_client( 1603 void PluginInstance::set_decrypt_client(
1538 media::DecryptorClient* decryptor_client) { 1604 media::DecryptorClient* decryptor_client) {
1539 DCHECK(decryptor_client);
1540 decryptor_client_ = decryptor_client; 1605 decryptor_client_ = decryptor_client;
1541 } 1606 }
1542 1607
1543 bool PluginInstance::GenerateKeyRequest(const std::string& key_system, 1608 bool PluginInstance::GenerateKeyRequest(const std::string& key_system,
1544 const std::string& init_data) { 1609 const std::string& init_data) {
1545 if (!LoadContentDecryptorInterface()) 1610 if (!LoadContentDecryptorInterface())
1546 return false; 1611 return false;
1547 if (key_system.empty()) 1612 if (key_system.empty())
1548 return false; 1613 return false;
1549 1614
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1581 1646
1582 bool PluginInstance::CancelKeyRequest(const std::string& session_id) { 1647 bool PluginInstance::CancelKeyRequest(const std::string& session_id) {
1583 if (!LoadContentDecryptorInterface()) 1648 if (!LoadContentDecryptorInterface())
1584 return false; 1649 return false;
1585 plugin_decryption_interface_->CancelKeyRequest( 1650 plugin_decryption_interface_->CancelKeyRequest(
1586 pp_instance(), 1651 pp_instance(),
1587 StringVar::StringToPPVar(session_id)); 1652 StringVar::StringToPPVar(session_id));
1588 return true; 1653 return true;
1589 } 1654 }
1590 1655
1656 // TODO(xhwang): Remove duplication of code in Decrypt(),
1657 // DecryptAndDecodeAudio() and DecryptAndDecodeVideo().
1591 bool PluginInstance::Decrypt( 1658 bool PluginInstance::Decrypt(
1659 media::Decryptor::StreamType stream_type,
1592 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, 1660 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer,
1593 const media::Decryptor::DecryptCB& decrypt_cb) { 1661 const media::Decryptor::DecryptCB& decrypt_cb) {
1594 DVLOG(3) << "Decrypt()"; 1662 DVLOG(3) << "Decrypt() - stream_type: " << stream_type;
1595 if (!LoadContentDecryptorInterface()) 1663 if (!LoadContentDecryptorInterface())
1596 return false; 1664 return false;
1597 1665
1598 ScopedPPResource encrypted_resource( 1666 ScopedPPResource encrypted_resource(
1599 ScopedPPResource::PassRef(), 1667 ScopedPPResource::PassRef(),
1600 MakeBufferResource(pp_instance(), 1668 MakeBufferResource(pp_instance(),
1601 encrypted_buffer->GetData(), 1669 encrypted_buffer->GetData(),
1602 encrypted_buffer->GetDataSize())); 1670 encrypted_buffer->GetDataSize()));
1603 if (!encrypted_resource.get()) 1671 if (!encrypted_resource.get())
1604 return false; 1672 return false;
1605 1673
1606 const uint32_t request_id = next_decryption_request_id_++; 1674 const uint32_t request_id = next_decryption_request_id_++;
1607 DVLOG(2) << "Decrypt() - request_id " << request_id; 1675 DVLOG(2) << "Decrypt() - request_id " << request_id;
1608 1676
1609 PP_EncryptedBlockInfo block_info; 1677 PP_EncryptedBlockInfo block_info;
1610 DCHECK(encrypted_buffer->GetDecryptConfig()); 1678 DCHECK(encrypted_buffer->GetDecryptConfig());
1611 if (!MakeEncryptedBlockInfo(encrypted_buffer->GetDecryptConfig(), 1679 if (!MakeEncryptedBlockInfo(encrypted_buffer->GetDecryptConfig(),
1612 encrypted_buffer->GetTimestamp().InMicroseconds(), 1680 encrypted_buffer->GetTimestamp().InMicroseconds(),
1613 request_id, 1681 request_id,
1614 &block_info)) { 1682 &block_info)) {
1615 return false; 1683 return false;
1616 } 1684 }
1617 1685
1618 DCHECK(!ContainsKey(pending_decryption_cbs_, request_id)); 1686 // There is only one pending decrypt request at any time per stream. This is
1619 pending_decryption_cbs_.insert(std::make_pair(request_id, decrypt_cb)); 1687 // enforced by the media pipeline.
1688 switch (stream_type) {
1689 case media::Decryptor::kAudio:
1690 DCHECK_EQ(pending_audio_decrypt_request_id_, 0u);
1691 DCHECK(pending_audio_decrypt_cb_.is_null());
1692 pending_audio_decrypt_request_id_ = request_id;
1693 pending_audio_decrypt_cb_ = decrypt_cb;
1694 break;
1695 case media::Decryptor::kVideo:
1696 DCHECK_EQ(pending_video_decrypt_request_id_, 0u);
1697 DCHECK(pending_video_decrypt_cb_.is_null());
1698 pending_video_decrypt_request_id_ = request_id;
1699 pending_video_decrypt_cb_ = decrypt_cb;
1700 break;
1701 default:
1702 NOTREACHED();
1703 return false;
1704 }
1620 1705
1621 plugin_decryption_interface_->Decrypt(pp_instance(), 1706 plugin_decryption_interface_->Decrypt(pp_instance(),
1622 encrypted_resource, 1707 encrypted_resource,
1623 &block_info); 1708 &block_info);
1624 return true; 1709 return true;
1625 } 1710 }
1626 1711
1712 bool PluginInstance::CancelDecrypt(media::Decryptor::StreamType stream_type) {
1713 DVLOG(3) << "CancelDecrypt() - stream_type: " << stream_type;
1714
1715 media::Decryptor::DecryptCB decrypt_cb;
1716 switch (stream_type) {
1717 case media::Decryptor::kAudio:
1718 pending_audio_decrypt_request_id_ = 0;
1719 decrypt_cb = base::ResetAndReturn(&pending_audio_decrypt_cb_);
1720 break;
1721 case media::Decryptor::kVideo:
1722 pending_video_decrypt_request_id_ = 0;
1723 decrypt_cb = base::ResetAndReturn(&pending_video_decrypt_cb_);
1724 break;
1725 default:
1726 NOTREACHED();
1727 return false;
1728 }
1729
1730 if (!decrypt_cb.is_null())
1731 decrypt_cb.Run(media::Decryptor::kSuccess, NULL);
1732
1733 return true;
1734 }
1735
1627 bool PluginInstance::InitializeAudioDecoder( 1736 bool PluginInstance::InitializeAudioDecoder(
1628 const media::AudioDecoderConfig& decoder_config, 1737 const media::AudioDecoderConfig& decoder_config,
1629 const media::Decryptor::DecoderInitCB& init_cb) { 1738 const media::Decryptor::DecoderInitCB& init_cb) {
1630 PP_AudioDecoderConfig pp_decoder_config; 1739 PP_AudioDecoderConfig pp_decoder_config;
1631 pp_decoder_config.codec = 1740 pp_decoder_config.codec =
1632 MediaAudioCodecToPpAudioCodec(decoder_config.codec()); 1741 MediaAudioCodecToPpAudioCodec(decoder_config.codec());
1633 pp_decoder_config.channel_count = 1742 pp_decoder_config.channel_count =
1634 media::ChannelLayoutToChannelCount(decoder_config.channel_layout()); 1743 media::ChannelLayoutToChannelCount(decoder_config.channel_layout());
1635 pp_decoder_config.bits_per_channel = decoder_config.bits_per_channel(); 1744 pp_decoder_config.bits_per_channel = decoder_config.bits_per_channel();
1636 pp_decoder_config.samples_per_second = decoder_config.samples_per_second(); 1745 pp_decoder_config.samples_per_second = decoder_config.samples_per_second();
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1677 DCHECK(pending_video_decoder_init_cb_.is_null()); 1786 DCHECK(pending_video_decoder_init_cb_.is_null());
1678 pending_video_decoder_init_request_id_ = pp_decoder_config.request_id; 1787 pending_video_decoder_init_request_id_ = pp_decoder_config.request_id;
1679 pending_video_decoder_init_cb_ = init_cb; 1788 pending_video_decoder_init_cb_ = init_cb;
1680 1789
1681 plugin_decryption_interface_->InitializeVideoDecoder(pp_instance(), 1790 plugin_decryption_interface_->InitializeVideoDecoder(pp_instance(),
1682 &pp_decoder_config, 1791 &pp_decoder_config,
1683 extra_data_resource); 1792 extra_data_resource);
1684 return true; 1793 return true;
1685 } 1794 }
1686 1795
1687 bool PluginInstance::DeinitializeDecoder() { 1796 void PluginInstance::CancelDecode(media::Decryptor::StreamType stream_type) {
1797 switch (stream_type) {
viettrungluu 2012/10/24 16:59:20 It'd be nice (in the future) to figure out a way t
xhwang 2012/10/24 18:57:14 Added TODO.
1798 case media::Decryptor::kAudio:
1799 pending_audio_decode_request_id_ = 0;
1800 if (!pending_audio_decode_cb_.is_null())
1801 base::ResetAndReturn(&pending_audio_decode_cb_).Run(
1802 media::Decryptor::kSuccess, media::Decryptor::AudioBuffers());
1803 break;
1804 case media::Decryptor::kVideo:
1805 pending_video_decode_request_id_ = 0;
1806 if (!pending_video_decode_cb_.is_null())
1807 base::ResetAndReturn(&pending_video_decode_cb_).Run(
1808 media::Decryptor::kSuccess, NULL);
1809 break;
1810 default:
1811 NOTREACHED();
1812 }
1813 }
1814
1815 bool PluginInstance::DeinitializeDecoder(
1816 media::Decryptor::StreamType stream_type) {
1688 if (!LoadContentDecryptorInterface()) 1817 if (!LoadContentDecryptorInterface())
1689 return false; 1818 return false;
1690 1819
1820 CancelDecode(stream_type);
1821
1691 // TODO(tomfinegan): Add decoder deinitialize request tracking, and get 1822 // TODO(tomfinegan): Add decoder deinitialize request tracking, and get
1692 // stream type from media stack. 1823 // stream type from media stack.
1693 plugin_decryption_interface_->DeinitializeDecoder( 1824 plugin_decryption_interface_->DeinitializeDecoder(
1694 pp_instance(), 1825 pp_instance(), MediaDecryptorStreamTypeToPpStreamType(stream_type), 0);
1695 PP_DECRYPTORSTREAMTYPE_VIDEO,
1696 0);
1697 return true; 1826 return true;
1698 } 1827 }
1699 1828
1700 bool PluginInstance::ResetDecoder() { 1829 bool PluginInstance::ResetDecoder(media::Decryptor::StreamType stream_type) {
1701 if (!LoadContentDecryptorInterface()) 1830 if (!LoadContentDecryptorInterface())
1702 return false; 1831 return false;
1703 1832
1704 // TODO(tomfinegan): Add decoder reset request tracking, and get 1833 CancelDecode(stream_type);
1705 // stream type from media stack. 1834
1706 plugin_decryption_interface_->ResetDecoder(pp_instance(), 1835 // TODO(tomfinegan): Add decoder reset request tracking.
1707 PP_DECRYPTORSTREAMTYPE_VIDEO, 1836 plugin_decryption_interface_->ResetDecoder(
1708 0); 1837 pp_instance(), MediaDecryptorStreamTypeToPpStreamType(stream_type), 0);
1709 return true; 1838 return true;
1710 } 1839 }
1711 1840
1712 bool PluginInstance::DecryptAndDecode( 1841 bool PluginInstance::DecryptAndDecodeAudio(
1842 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer,
1843 const media::Decryptor::AudioDecodeCB& audio_decode_cb) {
1844 if (!LoadContentDecryptorInterface())
1845 return false;
1846
1847 // If |encrypted_buffer| is end-of-stream buffer, GetData() and GetDataSize()
1848 // return NULL and 0 respectively. In that case, we'll just create a 0
1849 // resource.
1850 ScopedPPResource encrypted_resource(
1851 ScopedPPResource::PassRef(),
1852 MakeBufferResource(pp_instance(),
1853 encrypted_buffer->GetData(),
1854 encrypted_buffer->GetDataSize()));
1855 if (!encrypted_buffer->IsEndOfStream() && !encrypted_resource.get())
1856 return false;
1857
1858 const uint32_t request_id = next_decryption_request_id_++;
1859 DVLOG(2) << "DecryptAndDecodeAudio() - request_id " << request_id;
1860
1861 PP_EncryptedBlockInfo block_info;
1862 if (!MakeEncryptedBlockInfo(
1863 encrypted_buffer->GetDecryptConfig(),
1864 encrypted_buffer->GetTimestamp().InMicroseconds(),
1865 request_id,
1866 &block_info)) {
1867 return false;
1868 }
1869
1870 // There is only one pending audio decode request at any time. This is
1871 // enforced by the media pipeline.
1872 DCHECK_EQ(pending_audio_decode_request_id_, 0u);
1873 DCHECK(pending_audio_decode_cb_.is_null());
1874 pending_audio_decode_request_id_ = request_id;
1875 pending_audio_decode_cb_ = audio_decode_cb;
1876
1877 plugin_decryption_interface_->DecryptAndDecode(pp_instance(),
1878 PP_DECRYPTORSTREAMTYPE_AUDIO,
1879 encrypted_resource,
1880 &block_info);
1881 return true;
1882 }
1883
1884 bool PluginInstance::DecryptAndDecodeVideo(
1713 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, 1885 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer,
1714 const media::Decryptor::VideoDecodeCB& video_decode_cb) { 1886 const media::Decryptor::VideoDecodeCB& video_decode_cb) {
1715 if (!LoadContentDecryptorInterface()) 1887 if (!LoadContentDecryptorInterface())
1716 return false; 1888 return false;
1717 1889
1718 // If |encrypted_buffer| is end-of-stream buffer, GetData() and GetDataSize() 1890 // If |encrypted_buffer| is end-of-stream buffer, GetData() and GetDataSize()
1719 // return NULL and 0 respectively. In that case, we'll just create a 0 1891 // return NULL and 0 respectively. In that case, we'll just create a 0
1720 // resource. 1892 // resource.
1721 ScopedPPResource encrypted_resource( 1893 ScopedPPResource encrypted_resource(
1722 ScopedPPResource::PassRef(), 1894 ScopedPPResource::PassRef(),
1723 MakeBufferResource(pp_instance(), 1895 MakeBufferResource(pp_instance(),
1724 encrypted_buffer->GetData(), 1896 encrypted_buffer->GetData(),
1725 encrypted_buffer->GetDataSize())); 1897 encrypted_buffer->GetDataSize()));
1726 if (!encrypted_buffer->IsEndOfStream() && !encrypted_resource.get()) 1898 if (!encrypted_buffer->IsEndOfStream() && !encrypted_resource.get())
1727 return false; 1899 return false;
1728 1900
1729 const uint32_t request_id = next_decryption_request_id_++; 1901 const uint32_t request_id = next_decryption_request_id_++;
1730 DVLOG(2) << "DecryptAndDecode() - request_id " << request_id; 1902 DVLOG(2) << "DecryptAndDecodeVideo() - request_id " << request_id;
1731 1903
1732 PP_EncryptedBlockInfo block_info; 1904 PP_EncryptedBlockInfo block_info;
1733 if (!MakeEncryptedBlockInfo( 1905 if (!MakeEncryptedBlockInfo(
1734 encrypted_buffer->GetDecryptConfig(), 1906 encrypted_buffer->GetDecryptConfig(),
1735 encrypted_buffer->GetTimestamp().InMicroseconds(), 1907 encrypted_buffer->GetTimestamp().InMicroseconds(),
1736 request_id, 1908 request_id,
1737 &block_info)) { 1909 &block_info)) {
1738 return false; 1910 return false;
1739 } 1911 }
1740 1912
(...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after
2371 void PluginInstance::NeedKey(PP_Instance instance, 2543 void PluginInstance::NeedKey(PP_Instance instance,
2372 PP_Var key_system_var, 2544 PP_Var key_system_var,
2373 PP_Var session_id_var, 2545 PP_Var session_id_var,
2374 PP_Var init_data_var) { 2546 PP_Var init_data_var) {
2375 // TODO(tomfinegan): send the data to media stack. 2547 // TODO(tomfinegan): send the data to media stack.
2376 } 2548 }
2377 2549
2378 void PluginInstance::KeyAdded(PP_Instance instance, 2550 void PluginInstance::KeyAdded(PP_Instance instance,
2379 PP_Var key_system_var, 2551 PP_Var key_system_var,
2380 PP_Var session_id_var) { 2552 PP_Var session_id_var) {
2553 if (!decryptor_client_)
2554 return;
2555
2381 StringVar* key_system_string = StringVar::FromPPVar(key_system_var); 2556 StringVar* key_system_string = StringVar::FromPPVar(key_system_var);
2382 StringVar* session_id_string = StringVar::FromPPVar(session_id_var); 2557 StringVar* session_id_string = StringVar::FromPPVar(session_id_var);
2383 if (!key_system_string || !session_id_string) { 2558 if (!key_system_string || !session_id_string) {
2384 decryptor_client_->KeyError("", "", media::Decryptor::kUnknownError, 0); 2559 decryptor_client_->KeyError("", "", media::Decryptor::kUnknownError, 0);
2385 return; 2560 return;
2386 } 2561 }
2387 2562
2388 DCHECK(decryptor_client_);
2389 decryptor_client_->KeyAdded(key_system_string->value(), 2563 decryptor_client_->KeyAdded(key_system_string->value(),
2390 session_id_string->value()); 2564 session_id_string->value());
2391 } 2565 }
2392 2566
2393 void PluginInstance::KeyMessage(PP_Instance instance, 2567 void PluginInstance::KeyMessage(PP_Instance instance,
2394 PP_Var key_system_var, 2568 PP_Var key_system_var,
2395 PP_Var session_id_var, 2569 PP_Var session_id_var,
2396 PP_Resource message_resource, 2570 PP_Resource message_resource,
2397 PP_Var default_url_var) { 2571 PP_Var default_url_var) {
2572 if (!decryptor_client_)
2573 return;
2574
2398 StringVar* key_system_string = StringVar::FromPPVar(key_system_var); 2575 StringVar* key_system_string = StringVar::FromPPVar(key_system_var);
2399 StringVar* session_id_string = StringVar::FromPPVar(session_id_var); 2576 StringVar* session_id_string = StringVar::FromPPVar(session_id_var);
2400 StringVar* default_url_string = StringVar::FromPPVar(default_url_var); 2577 StringVar* default_url_string = StringVar::FromPPVar(default_url_var);
2401 2578
2402 if (!key_system_string || !session_id_string || !default_url_string) { 2579 if (!key_system_string || !session_id_string || !default_url_string) {
2403 decryptor_client_->KeyError("", "", media::Decryptor::kUnknownError, 0); 2580 decryptor_client_->KeyError("", "", media::Decryptor::kUnknownError, 0);
2404 return; 2581 return;
2405 } 2582 }
2406 2583
2407 EnterResourceNoLock<PPB_Buffer_API> enter(message_resource, true); 2584 EnterResourceNoLock<PPB_Buffer_API> enter(message_resource, true);
2408 if (!enter.succeeded()) { 2585 if (!enter.succeeded()) {
2409 decryptor_client_->KeyError(key_system_string->value(), 2586 decryptor_client_->KeyError(key_system_string->value(),
2410 session_id_string->value(), 2587 session_id_string->value(),
2411 media::Decryptor::kUnknownError, 2588 media::Decryptor::kUnknownError,
2412 0); 2589 0);
2413 return; 2590 return;
2414 } 2591 }
2415 2592
2416 BufferAutoMapper mapper(enter.object()); 2593 BufferAutoMapper mapper(enter.object());
2417 scoped_array<uint8> message_array(new uint8[mapper.size()]); 2594 scoped_array<uint8> message_array(new uint8[mapper.size()]);
2418 if (mapper.data() && mapper.size()) 2595 if (mapper.data() && mapper.size())
2419 memcpy(message_array.get(), mapper.data(), mapper.size()); 2596 memcpy(message_array.get(), mapper.data(), mapper.size());
2420 2597
2421 DCHECK(decryptor_client_);
2422 decryptor_client_->KeyMessage(key_system_string->value(), 2598 decryptor_client_->KeyMessage(key_system_string->value(),
2423 session_id_string->value(), 2599 session_id_string->value(),
2424 message_array.Pass(), 2600 message_array.Pass(),
2425 mapper.size(), 2601 mapper.size(),
2426 default_url_string->value()); 2602 default_url_string->value());
2427 } 2603 }
2428 2604
2429 void PluginInstance::KeyError(PP_Instance instance, 2605 void PluginInstance::KeyError(PP_Instance instance,
2430 PP_Var key_system_var, 2606 PP_Var key_system_var,
2431 PP_Var session_id_var, 2607 PP_Var session_id_var,
2432 int32_t media_error, 2608 int32_t media_error,
2433 int32_t system_code) { 2609 int32_t system_code) {
2610 if (!decryptor_client_)
2611 return;
2612
2434 StringVar* key_system_string = StringVar::FromPPVar(key_system_var); 2613 StringVar* key_system_string = StringVar::FromPPVar(key_system_var);
2435 StringVar* session_id_string = StringVar::FromPPVar(session_id_var); 2614 StringVar* session_id_string = StringVar::FromPPVar(session_id_var);
2436 if (!key_system_string || !session_id_string) { 2615 if (!key_system_string || !session_id_string) {
2437 decryptor_client_->KeyError("", "", media::Decryptor::kUnknownError, 0); 2616 decryptor_client_->KeyError("", "", media::Decryptor::kUnknownError, 0);
2438 return; 2617 return;
2439 } 2618 }
2440 2619
2441 DCHECK(decryptor_client_);
2442 decryptor_client_->KeyError( 2620 decryptor_client_->KeyError(
2443 key_system_string->value(), 2621 key_system_string->value(),
2444 session_id_string->value(), 2622 session_id_string->value(),
2445 static_cast<media::Decryptor::KeyError>(media_error), 2623 static_cast<media::Decryptor::KeyError>(media_error),
2446 system_code); 2624 system_code);
2447 } 2625 }
2448 2626
2449 void PluginInstance::DecoderInitializeDone(PP_Instance instance, 2627 void PluginInstance::DecoderInitializeDone(PP_Instance instance,
2450 PP_DecryptorStreamType decoder_type, 2628 PP_DecryptorStreamType decoder_type,
2451 uint32_t request_id, 2629 uint32_t request_id,
(...skipping 30 matching lines...) Expand all
2482 2660
2483 void PluginInstance::DecoderResetDone(PP_Instance instance, 2661 void PluginInstance::DecoderResetDone(PP_Instance instance,
2484 PP_DecryptorStreamType decoder_type, 2662 PP_DecryptorStreamType decoder_type,
2485 uint32_t request_id) { 2663 uint32_t request_id) {
2486 // TODO(tomfinegan): Add decoder reset completion handling. 2664 // TODO(tomfinegan): Add decoder reset completion handling.
2487 } 2665 }
2488 2666
2489 void PluginInstance::DeliverBlock(PP_Instance instance, 2667 void PluginInstance::DeliverBlock(PP_Instance instance,
2490 PP_Resource decrypted_block, 2668 PP_Resource decrypted_block,
2491 const PP_DecryptedBlockInfo* block_info) { 2669 const PP_DecryptedBlockInfo* block_info) {
2492 DVLOG(2) << "DeliverBlock() - request_id: "
2493 << block_info->tracking_info.request_id;
2494 DCHECK(block_info); 2670 DCHECK(block_info);
2495 DecryptionCBMap::iterator found = pending_decryption_cbs_.find( 2671 const uint32_t request_id = block_info->tracking_info.request_id;
2496 block_info->tracking_info.request_id); 2672 DVLOG(2) << "DeliverBlock() - request_id: " << request_id;
2497 if (found == pending_decryption_cbs_.end()) 2673
2674 // If the request ID is not valid or does not match what's saved, do nothing.
2675 if (request_id == 0) {
2676 DVLOG(1) << "DeliverBlock() - invalid request_id " << request_id;
2498 return; 2677 return;
2499 media::Decryptor::DecryptCB decrypt_cb = found->second; 2678 }
2500 pending_decryption_cbs_.erase(found); 2679
2680 media::Decryptor::DecryptCB decrypt_cb;
2681 if (request_id == pending_audio_decrypt_request_id_) {
2682 DCHECK(!pending_audio_decrypt_cb_.is_null());
2683 pending_audio_decrypt_request_id_ = 0;
2684 decrypt_cb = base::ResetAndReturn(&pending_audio_decrypt_cb_);
2685 } else if (request_id == pending_video_decrypt_request_id_) {
2686 DCHECK(!pending_video_decrypt_cb_.is_null());
2687 pending_video_decrypt_request_id_ = 0;
2688 decrypt_cb = base::ResetAndReturn(&pending_video_decrypt_cb_);
2689 } else {
2690 DVLOG(1) << "DeliverBlock() - request_id " << request_id << " not found";
2691 return;
2692 }
2501 2693
2502 media::Decryptor::Status status = 2694 media::Decryptor::Status status =
2503 PpDecryptResultToMediaDecryptorStatus(block_info->result); 2695 PpDecryptResultToMediaDecryptorStatus(block_info->result);
2504 if (status != media::Decryptor::kSuccess) { 2696 if (status != media::Decryptor::kSuccess) {
2505 decrypt_cb.Run(status, NULL); 2697 decrypt_cb.Run(status, NULL);
2506 return; 2698 return;
2507 } 2699 }
2508 2700
2509 EnterResourceNoLock<PPB_Buffer_API> enter(decrypted_block, true); 2701 EnterResourceNoLock<PPB_Buffer_API> enter(decrypted_block, true);
2510 if (!enter.succeeded()) { 2702 if (!enter.succeeded()) {
(...skipping 12 matching lines...) Expand all
2523 media::DecoderBuffer::CopyFrom( 2715 media::DecoderBuffer::CopyFrom(
2524 static_cast<uint8*>(mapper.data()), mapper.size())); 2716 static_cast<uint8*>(mapper.data()), mapper.size()));
2525 decrypted_buffer->SetTimestamp(base::TimeDelta::FromMicroseconds( 2717 decrypted_buffer->SetTimestamp(base::TimeDelta::FromMicroseconds(
2526 block_info->tracking_info.timestamp)); 2718 block_info->tracking_info.timestamp));
2527 decrypt_cb.Run(media::Decryptor::kSuccess, decrypted_buffer); 2719 decrypt_cb.Run(media::Decryptor::kSuccess, decrypted_buffer);
2528 } 2720 }
2529 2721
2530 void PluginInstance::DeliverFrame(PP_Instance instance, 2722 void PluginInstance::DeliverFrame(PP_Instance instance,
2531 PP_Resource decrypted_frame, 2723 PP_Resource decrypted_frame,
2532 const PP_DecryptedFrameInfo* frame_info) { 2724 const PP_DecryptedFrameInfo* frame_info) {
2533 DVLOG(2) << "DeliverFrame() - request_id: "
2534 << frame_info->tracking_info.request_id;
2535 DCHECK(frame_info); 2725 DCHECK(frame_info);
2726 const uint32_t request_id = frame_info->tracking_info.request_id;
2727 DVLOG(2) << "DeliverFrame() - request_id: " << request_id;
2536 2728
2537 // If the request ID is not valid or does not match what's saved, do nothing. 2729 // If the request ID is not valid or does not match what's saved, do nothing.
2538 if (frame_info->tracking_info.request_id == 0 || 2730 if (request_id == 0 || request_id != pending_video_decode_request_id_) {
2539 frame_info->tracking_info.request_id != 2731 DVLOG(1) << "DeliverFrame() - request_id " << request_id << " not found";
2540 pending_video_decode_request_id_) {
2541 DCHECK(pending_video_decode_cb_.is_null()); 2732 DCHECK(pending_video_decode_cb_.is_null());
2542 return; 2733 return;
2543 } 2734 }
2544 2735
2545 DCHECK(!pending_video_decode_cb_.is_null()); 2736 DCHECK(!pending_video_decode_cb_.is_null());
2546 pending_video_decode_request_id_ = 0; 2737 pending_video_decode_request_id_ = 0;
2547 media::Decryptor::VideoDecodeCB video_decode_cb = 2738 media::Decryptor::VideoDecodeCB video_decode_cb =
2548 base::ResetAndReturn(&pending_video_decode_cb_); 2739 base::ResetAndReturn(&pending_video_decode_cb_);
2549 2740
2550 media::Decryptor::Status status = 2741 media::Decryptor::Status status =
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
2596 frame_info->strides[PP_DECRYPTEDFRAMEPLANES_V], 2787 frame_info->strides[PP_DECRYPTEDFRAMEPLANES_V],
2597 frame_info->height, 2788 frame_info->height,
2598 decoded_frame.get()); 2789 decoded_frame.get());
2599 2790
2600 video_decode_cb.Run(media::Decryptor::kSuccess, decoded_frame); 2791 video_decode_cb.Run(media::Decryptor::kSuccess, decoded_frame);
2601 } 2792 }
2602 2793
2603 void PluginInstance::DeliverSamples(PP_Instance instance, 2794 void PluginInstance::DeliverSamples(PP_Instance instance,
2604 PP_Resource audio_frames, 2795 PP_Resource audio_frames,
2605 const PP_DecryptedBlockInfo* block_info) { 2796 const PP_DecryptedBlockInfo* block_info) {
2606 DVLOG(2) << "DeliverSamples() - request_id: " 2797 DCHECK(block_info);
2607 << block_info->tracking_info.request_id; 2798 const uint32_t request_id = block_info->tracking_info.request_id;
2608 // TODO(tomfinegan): To be implemented after completion of v0.1 of the 2799 DVLOG(2) << "DeliverSamples() - request_id: " << request_id;
2609 // EME/CDM work. 2800
2801 // If the request ID is not valid or does not match what's saved, do nothing.
2802 if (request_id == 0 || request_id != pending_audio_decode_request_id_) {
2803 DVLOG(1) << "DeliverSamples() - request_id " << request_id << " not found";
2804 DCHECK(pending_audio_decode_cb_.is_null());
2805 return;
2806 }
2807
2808 DCHECK(!pending_audio_decode_cb_.is_null());
2809 pending_audio_decode_request_id_ = 0;
2810 media::Decryptor::AudioDecodeCB audio_decode_cb =
2811 base::ResetAndReturn(&pending_audio_decode_cb_);
2812
2813 const media::Decryptor::AudioBuffers empty_frames;
2814
2815 media::Decryptor::Status status =
2816 PpDecryptResultToMediaDecryptorStatus(block_info->result);
2817 if (status != media::Decryptor::kSuccess) {
2818 audio_decode_cb.Run(status, empty_frames);
2819 return;
2820 }
2821
2822 media::Decryptor::AudioBuffers audio_frame_list;
2823 if (!DeserializeAudioFrames(audio_frames, &audio_frame_list)) {
2824 NOTREACHED() << "CDM did not serialize the buffer correctly.";
2825 audio_decode_cb.Run(media::Decryptor::kError, empty_frames);
2826 return;
2827 }
2828
2829 audio_decode_cb.Run(media::Decryptor::kSuccess, audio_frame_list);
2610 } 2830 }
2611 2831
2612 void PluginInstance::NumberOfFindResultsChanged(PP_Instance instance, 2832 void PluginInstance::NumberOfFindResultsChanged(PP_Instance instance,
2613 int32_t total, 2833 int32_t total,
2614 PP_Bool final_result) { 2834 PP_Bool final_result) {
2615 DCHECK_NE(find_identifier_, -1); 2835 DCHECK_NE(find_identifier_, -1);
2616 delegate_->NumberOfFindResultsChanged(find_identifier_, total, 2836 delegate_->NumberOfFindResultsChanged(find_identifier_, total,
2617 PP_ToBool(final_result)); 2837 PP_ToBool(final_result));
2618 } 2838 }
2619 2839
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after
2989 screen_size_for_fullscreen_ = gfx::Size(); 3209 screen_size_for_fullscreen_ = gfx::Size();
2990 WebElement element = container_->element(); 3210 WebElement element = container_->element();
2991 element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_); 3211 element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_);
2992 element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_); 3212 element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_);
2993 element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_); 3213 element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_);
2994 element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_); 3214 element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_);
2995 } 3215 }
2996 3216
2997 } // namespace ppapi 3217 } // namespace ppapi
2998 } // namespace webkit 3218 } // namespace webkit
OLDNEW
« no previous file with comments | « webkit/plugins/ppapi/ppapi_plugin_instance.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698