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

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: comments resolved 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(audio_frames);
402 DCHECK(frames);
403 EnterResourceNoLock<PPB_Buffer_API> enter(audio_frames, true);
404 if (!enter.succeeded())
405 return false;
406
407 BufferAutoMapper mapper(enter.object());
408 if (!mapper.data() || !mapper.size())
409 return false;
410
411 const uint8* cur = static_cast<uint8*>(mapper.data());
412 int bytes_left = mapper.size();
413
414 do {
415 int64 timestamp = 0;
416 int64 frame_size = -1;
417 const int kHeaderSize = sizeof(timestamp) + sizeof(frame_size);
418
419 if (bytes_left < kHeaderSize)
420 return false;
421
422 timestamp = *(reinterpret_cast<const int64*>(cur));
423 cur += sizeof(timestamp);
424 bytes_left -= sizeof(timestamp);
425
426 frame_size = *(reinterpret_cast<const int64*>(cur));
427 cur += sizeof(frame_size);
428 bytes_left -= sizeof(frame_size);
429
430 if (frame_size < 0 || bytes_left < frame_size)
431 return false;
432
433 scoped_refptr<media::DataBuffer> frame(new media::DataBuffer(frame_size));
434 if (frame_size > 0) {
435 memcpy(frame->GetWritableData(), cur, frame_size);
436 frame->SetTimestamp(base::TimeDelta::FromMicroseconds(timestamp));
437 cur += frame_size;
438 bytes_left -= frame_size;
439 }
440 frames->push_back(frame);
441 } while (bytes_left > 0);
442
443 return true;
444 }
445
395 PP_AudioCodec MediaAudioCodecToPpAudioCodec(media::AudioCodec codec) { 446 PP_AudioCodec MediaAudioCodecToPpAudioCodec(media::AudioCodec codec) {
396 if (codec == media::kCodecVorbis) 447 if (codec == media::kCodecVorbis)
397 return PP_AUDIOCODEC_VORBIS; 448 return PP_AUDIOCODEC_VORBIS;
398 449
399 return PP_AUDIOCODEC_UNKNOWN; 450 return PP_AUDIOCODEC_UNKNOWN;
400 } 451 }
401 452
402 PP_VideoCodec MediaVideoCodecToPpVideoCodec(media::VideoCodec codec) { 453 PP_VideoCodec MediaVideoCodecToPpVideoCodec(media::VideoCodec codec) {
403 if (codec == media::kCodecVP8) 454 if (codec == media::kCodecVP8)
404 return PP_VIDEOCODEC_VP8; 455 return PP_VIDEOCODEC_VP8;
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 text_input_type_(kPluginDefaultTextInputType), 544 text_input_type_(kPluginDefaultTextInputType),
494 text_input_caret_(0, 0, 0, 0), 545 text_input_caret_(0, 0, 0, 0),
495 text_input_caret_bounds_(0, 0, 0, 0), 546 text_input_caret_bounds_(0, 0, 0, 0),
496 text_input_caret_set_(false), 547 text_input_caret_set_(false),
497 selection_caret_(0), 548 selection_caret_(0),
498 selection_anchor_(0), 549 selection_anchor_(0),
499 pending_user_gesture_(0.0), 550 pending_user_gesture_(0.0),
500 flash_impl_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), 551 flash_impl_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
501 decryptor_client_(NULL), 552 decryptor_client_(NULL),
502 next_decryption_request_id_(1), 553 next_decryption_request_id_(1),
554 pending_audio_decrypt_request_id_(0),
555 pending_video_decrypt_request_id_(0),
503 pending_audio_decoder_init_request_id_(0), 556 pending_audio_decoder_init_request_id_(0),
504 pending_video_decoder_init_request_id_(0), 557 pending_video_decoder_init_request_id_(0),
558 pending_audio_decode_request_id_(0),
505 pending_video_decode_request_id_(0) { 559 pending_video_decode_request_id_(0) {
506 pp_instance_ = HostGlobals::Get()->AddInstance(this); 560 pp_instance_ = HostGlobals::Get()->AddInstance(this);
507 561
508 memset(&current_print_settings_, 0, sizeof(current_print_settings_)); 562 memset(&current_print_settings_, 0, sizeof(current_print_settings_));
509 DCHECK(delegate); 563 DCHECK(delegate);
510 module_->InstanceCreated(this); 564 module_->InstanceCreated(this);
511 delegate_->InstanceCreated(this); 565 delegate_->InstanceCreated(this);
512 message_channel_.reset(new MessageChannel(this)); 566 message_channel_.reset(new MessageChannel(this));
513 567
514 view_data_.is_page_visible = delegate->IsPageVisible(); 568 view_data_.is_page_visible = delegate->IsPageVisible();
(...skipping 986 matching lines...) Expand 10 before | Expand all | Expand 10 after
1501 PP_PrivatePageTransformType transform_type = 1555 PP_PrivatePageTransformType transform_type =
1502 type == WebPlugin::RotationType90Clockwise ? 1556 type == WebPlugin::RotationType90Clockwise ?
1503 PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CW : 1557 PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CW :
1504 PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CCW; 1558 PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CCW;
1505 plugin_pdf_interface_->Transform(pp_instance(), transform_type); 1559 plugin_pdf_interface_->Transform(pp_instance(), transform_type);
1506 // NOTE: plugin instance may have been deleted. 1560 // NOTE: plugin instance may have been deleted.
1507 } 1561 }
1508 1562
1509 void PluginInstance::set_decrypt_client( 1563 void PluginInstance::set_decrypt_client(
1510 media::DecryptorClient* decryptor_client) { 1564 media::DecryptorClient* decryptor_client) {
1511 DCHECK(decryptor_client);
1512 decryptor_client_ = decryptor_client; 1565 decryptor_client_ = decryptor_client;
1513 } 1566 }
1514 1567
1515 bool PluginInstance::GenerateKeyRequest(const std::string& key_system, 1568 bool PluginInstance::GenerateKeyRequest(const std::string& key_system,
1516 const std::string& init_data) { 1569 const std::string& init_data) {
1517 if (!LoadContentDecryptorInterface()) 1570 if (!LoadContentDecryptorInterface())
1518 return false; 1571 return false;
1519 if (key_system.empty()) 1572 if (key_system.empty())
1520 return false; 1573 return false;
1521 1574
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1553 1606
1554 bool PluginInstance::CancelKeyRequest(const std::string& session_id) { 1607 bool PluginInstance::CancelKeyRequest(const std::string& session_id) {
1555 if (!LoadContentDecryptorInterface()) 1608 if (!LoadContentDecryptorInterface())
1556 return false; 1609 return false;
1557 plugin_decryption_interface_->CancelKeyRequest( 1610 plugin_decryption_interface_->CancelKeyRequest(
1558 pp_instance(), 1611 pp_instance(),
1559 StringVar::StringToPPVar(session_id)); 1612 StringVar::StringToPPVar(session_id));
1560 return true; 1613 return true;
1561 } 1614 }
1562 1615
1616 // TODO(xhwang): Remove duplication of code in Decrypt(),
1617 // DecryptAndDecodeAudio() and DecryptAndDecodeVideo().
1563 bool PluginInstance::Decrypt( 1618 bool PluginInstance::Decrypt(
1619 media::Decryptor::StreamType stream_type,
1564 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, 1620 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer,
1565 const media::Decryptor::DecryptCB& decrypt_cb) { 1621 const media::Decryptor::DecryptCB& decrypt_cb) {
1566 DVLOG(3) << "Decrypt()"; 1622 DVLOG(3) << "Decrypt() - stream_type: " << stream_type;
1567 if (!LoadContentDecryptorInterface()) 1623 if (!LoadContentDecryptorInterface())
1568 return false; 1624 return false;
1569 1625
1570 ScopedPPResource encrypted_resource( 1626 ScopedPPResource encrypted_resource(
1571 ScopedPPResource::PassRef(), 1627 ScopedPPResource::PassRef(),
1572 MakeBufferResource(pp_instance(), 1628 MakeBufferResource(pp_instance(),
1573 encrypted_buffer->GetData(), 1629 encrypted_buffer->GetData(),
1574 encrypted_buffer->GetDataSize())); 1630 encrypted_buffer->GetDataSize()));
1575 if (!encrypted_resource.get()) 1631 if (!encrypted_resource.get())
1576 return false; 1632 return false;
1577 1633
1578 const uint32_t request_id = next_decryption_request_id_++; 1634 const uint32_t request_id = next_decryption_request_id_++;
1579 DVLOG(2) << "Decrypt() - request_id " << request_id; 1635 DVLOG(2) << "Decrypt() - request_id " << request_id;
1580 1636
1581 PP_EncryptedBlockInfo block_info; 1637 PP_EncryptedBlockInfo block_info;
1582 DCHECK(encrypted_buffer->GetDecryptConfig()); 1638 DCHECK(encrypted_buffer->GetDecryptConfig());
1583 if (!MakeEncryptedBlockInfo(encrypted_buffer->GetDecryptConfig(), 1639 if (!MakeEncryptedBlockInfo(encrypted_buffer->GetDecryptConfig(),
1584 encrypted_buffer->GetTimestamp().InMicroseconds(), 1640 encrypted_buffer->GetTimestamp().InMicroseconds(),
1585 request_id, 1641 request_id,
1586 &block_info)) { 1642 &block_info)) {
1587 return false; 1643 return false;
1588 } 1644 }
1589 1645
1590 DCHECK(!ContainsKey(pending_decryption_cbs_, request_id)); 1646 // There is only one pending decrypt request at any time per stream. This is
1591 pending_decryption_cbs_.insert(std::make_pair(request_id, decrypt_cb)); 1647 // enforced by the media pipeline.
1648 switch (stream_type) {
1649 case media::Decryptor::kAudio:
1650 DCHECK_EQ(pending_audio_decrypt_request_id_, 0u);
1651 DCHECK(pending_audio_decrypt_cb_.is_null());
1652 pending_audio_decrypt_request_id_ = request_id;
1653 pending_audio_decrypt_cb_ = decrypt_cb;
1654 break;
1655 case media::Decryptor::kVideo:
1656 DCHECK_EQ(pending_video_decrypt_request_id_, 0u);
1657 DCHECK(pending_video_decrypt_cb_.is_null());
1658 pending_video_decrypt_request_id_ = request_id;
1659 pending_video_decrypt_cb_ = decrypt_cb;
1660 break;
1661 default:
1662 NOTREACHED();
1663 return false;
1664 }
1592 1665
1593 plugin_decryption_interface_->Decrypt(pp_instance(), 1666 plugin_decryption_interface_->Decrypt(pp_instance(),
1594 encrypted_resource, 1667 encrypted_resource,
1595 &block_info); 1668 &block_info);
1596 return true; 1669 return true;
1597 } 1670 }
1598 1671
1672 bool PluginInstance::CancelDecrypt(media::Decryptor::StreamType stream_type) {
1673 DVLOG(3) << "CancelDecrypt() - stream_type: " << stream_type;
1674
1675 media::Decryptor::DecryptCB decrypt_cb;
1676 switch (stream_type) {
1677 case media::Decryptor::kAudio:
1678 pending_audio_decrypt_request_id_ = 0;
1679 decrypt_cb = base::ResetAndReturn(&pending_audio_decrypt_cb_);
1680 break;
1681 case media::Decryptor::kVideo:
1682 pending_video_decrypt_request_id_ = 0;
1683 decrypt_cb = base::ResetAndReturn(&pending_video_decrypt_cb_);
1684 break;
1685 default:
1686 NOTREACHED();
1687 return false;
1688 }
1689
1690 if (!decrypt_cb.is_null())
1691 decrypt_cb.Run(media::Decryptor::kSuccess, NULL);
1692
1693 return true;
1694 }
1695
1599 bool PluginInstance::InitializeAudioDecoder( 1696 bool PluginInstance::InitializeAudioDecoder(
1600 const media::AudioDecoderConfig& decoder_config, 1697 const media::AudioDecoderConfig& decoder_config,
1601 const media::Decryptor::DecoderInitCB& init_cb) { 1698 const media::Decryptor::DecoderInitCB& init_cb) {
1602 PP_AudioDecoderConfig pp_decoder_config; 1699 PP_AudioDecoderConfig pp_decoder_config;
1603 pp_decoder_config.channel_count = 1700 pp_decoder_config.channel_count =
1604 media::ChannelLayoutToChannelCount(decoder_config.channel_layout()); 1701 media::ChannelLayoutToChannelCount(decoder_config.channel_layout());
1605 pp_decoder_config.bits_per_channel = decoder_config.bits_per_channel(); 1702 pp_decoder_config.bits_per_channel = decoder_config.bits_per_channel();
1606 pp_decoder_config.samples_per_second = decoder_config.samples_per_second(); 1703 pp_decoder_config.samples_per_second = decoder_config.samples_per_second();
1607 pp_decoder_config.request_id = next_decryption_request_id_++; 1704 pp_decoder_config.request_id = next_decryption_request_id_++;
1608 1705
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1647 DCHECK(pending_video_decoder_init_cb_.is_null()); 1744 DCHECK(pending_video_decoder_init_cb_.is_null());
1648 pending_video_decoder_init_request_id_ = pp_decoder_config.request_id; 1745 pending_video_decoder_init_request_id_ = pp_decoder_config.request_id;
1649 pending_video_decoder_init_cb_ = init_cb; 1746 pending_video_decoder_init_cb_ = init_cb;
1650 1747
1651 plugin_decryption_interface_->InitializeVideoDecoder(pp_instance(), 1748 plugin_decryption_interface_->InitializeVideoDecoder(pp_instance(),
1652 &pp_decoder_config, 1749 &pp_decoder_config,
1653 extra_data_resource); 1750 extra_data_resource);
1654 return true; 1751 return true;
1655 } 1752 }
1656 1753
1657 bool PluginInstance::DeinitializeDecoder() { 1754 void PluginInstance::CancelDecode(media::Decryptor::StreamType stream_type) {
1755 switch (stream_type) {
1756 case media::Decryptor::kAudio:
1757 pending_audio_decode_request_id_ = 0;
1758 if (!pending_audio_decode_cb_.is_null())
1759 base::ResetAndReturn(&pending_audio_decode_cb_).Run(
1760 media::Decryptor::kSuccess, media::Decryptor::AudioBuffers());
1761 break;
1762 case media::Decryptor::kVideo:
1763 pending_video_decode_request_id_ = 0;
1764 if (!pending_video_decode_cb_.is_null())
1765 base::ResetAndReturn(&pending_video_decode_cb_).Run(
1766 media::Decryptor::kSuccess, NULL);
1767 break;
1768 default:
1769 NOTREACHED();
1770 }
1771 }
1772
1773 bool PluginInstance::DeinitializeDecoder(
1774 media::Decryptor::StreamType stream_type) {
1658 if (!LoadContentDecryptorInterface()) 1775 if (!LoadContentDecryptorInterface())
1659 return false; 1776 return false;
1660 1777
1778 CancelDecode(stream_type);
1779
1661 // TODO(tomfinegan): Add decoder deinitialize request tracking, and get 1780 // TODO(tomfinegan): Add decoder deinitialize request tracking, and get
1662 // stream type from media stack. 1781 // stream type from media stack.
1663 plugin_decryption_interface_->DeinitializeDecoder( 1782 plugin_decryption_interface_->DeinitializeDecoder(
1664 pp_instance(), 1783 pp_instance(),
1665 PP_DECRYPTORSTREAMTYPE_VIDEO, 1784 PP_DECRYPTORSTREAMTYPE_VIDEO,
1666 0); 1785 0);
1667 return true; 1786 return true;
1668 } 1787 }
1669 1788
1670 bool PluginInstance::ResetDecoder() { 1789 bool PluginInstance::ResetDecoder(media::Decryptor::StreamType stream_type) {
1671 if (!LoadContentDecryptorInterface()) 1790 if (!LoadContentDecryptorInterface())
1672 return false; 1791 return false;
1673 1792
1793 CancelDecode(stream_type);
1794
1674 // TODO(tomfinegan): Add decoder reset request tracking, and get 1795 // TODO(tomfinegan): Add decoder reset request tracking, and get
1675 // stream type from media stack. 1796 // stream type from media stack.
1676 plugin_decryption_interface_->ResetDecoder(pp_instance(), 1797 plugin_decryption_interface_->ResetDecoder(pp_instance(),
1677 PP_DECRYPTORSTREAMTYPE_VIDEO, 1798 PP_DECRYPTORSTREAMTYPE_VIDEO,
1678 0); 1799 0);
1679 return true; 1800 return true;
1680 } 1801 }
1681 1802
1682 bool PluginInstance::DecryptAndDecode( 1803 bool PluginInstance::DecryptAndDecodeAudio(
1804 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer,
1805 const media::Decryptor::AudioDecodeCB& audio_decode_cb) {
1806 if (!LoadContentDecryptorInterface())
1807 return false;
1808
1809 // If |encrypted_buffer| is end-of-stream buffer, GetData() and GetDataSize()
1810 // return NULL and 0 respectively. In that case, we'll just create a 0
1811 // resource.
1812 ScopedPPResource encrypted_resource(
1813 ScopedPPResource::PassRef(),
1814 MakeBufferResource(pp_instance(),
1815 encrypted_buffer->GetData(),
1816 encrypted_buffer->GetDataSize()));
1817 if (!encrypted_buffer->IsEndOfStream() && !encrypted_resource.get())
1818 return false;
1819
1820 const uint32_t request_id = next_decryption_request_id_++;
1821 DVLOG(2) << "DecryptAndDecodeAudio() - request_id " << request_id;
1822
1823 PP_EncryptedBlockInfo block_info;
1824 if (!MakeEncryptedBlockInfo(
1825 encrypted_buffer->GetDecryptConfig(),
1826 encrypted_buffer->GetTimestamp().InMicroseconds(),
1827 request_id,
1828 &block_info)) {
1829 return false;
1830 }
1831
1832 // There is only one pending audio decode request at any time. This is
1833 // enforced by the media pipeline.
1834 DCHECK_EQ(pending_audio_decode_request_id_, 0u);
1835 DCHECK(pending_audio_decode_cb_.is_null());
1836 pending_audio_decode_request_id_ = request_id;
1837 pending_audio_decode_cb_ = audio_decode_cb;
1838
1839 plugin_decryption_interface_->DecryptAndDecode(pp_instance(),
1840 PP_DECRYPTORSTREAMTYPE_AUDIO,
1841 encrypted_resource,
1842 &block_info);
1843 return true;
1844 }
1845
1846 bool PluginInstance::DecryptAndDecodeVideo(
1683 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, 1847 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer,
1684 const media::Decryptor::VideoDecodeCB& video_decode_cb) { 1848 const media::Decryptor::VideoDecodeCB& video_decode_cb) {
1685 if (!LoadContentDecryptorInterface()) 1849 if (!LoadContentDecryptorInterface())
1686 return false; 1850 return false;
1687 1851
1688 // If |encrypted_buffer| is end-of-stream buffer, GetData() and GetDataSize() 1852 // If |encrypted_buffer| is end-of-stream buffer, GetData() and GetDataSize()
1689 // return NULL and 0 respectively. In that case, we'll just create a 0 1853 // return NULL and 0 respectively. In that case, we'll just create a 0
1690 // resource. 1854 // resource.
1691 ScopedPPResource encrypted_resource( 1855 ScopedPPResource encrypted_resource(
1692 ScopedPPResource::PassRef(), 1856 ScopedPPResource::PassRef(),
1693 MakeBufferResource(pp_instance(), 1857 MakeBufferResource(pp_instance(),
1694 encrypted_buffer->GetData(), 1858 encrypted_buffer->GetData(),
1695 encrypted_buffer->GetDataSize())); 1859 encrypted_buffer->GetDataSize()));
1696 if (!encrypted_buffer->IsEndOfStream() && !encrypted_resource.get()) 1860 if (!encrypted_buffer->IsEndOfStream() && !encrypted_resource.get())
1697 return false; 1861 return false;
1698 1862
1699 const uint32_t request_id = next_decryption_request_id_++; 1863 const uint32_t request_id = next_decryption_request_id_++;
1700 DVLOG(2) << "DecryptAndDecode() - request_id " << request_id; 1864 DVLOG(2) << "DecryptAndDecodeVideo() - request_id " << request_id;
1701 1865
1702 PP_EncryptedBlockInfo block_info; 1866 PP_EncryptedBlockInfo block_info;
1703 if (!MakeEncryptedBlockInfo( 1867 if (!MakeEncryptedBlockInfo(
1704 encrypted_buffer->GetDecryptConfig(), 1868 encrypted_buffer->GetDecryptConfig(),
1705 encrypted_buffer->GetTimestamp().InMicroseconds(), 1869 encrypted_buffer->GetTimestamp().InMicroseconds(),
1706 request_id, 1870 request_id,
1707 &block_info)) { 1871 &block_info)) {
1708 return false; 1872 return false;
1709 } 1873 }
1710 1874
(...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after
2341 void PluginInstance::NeedKey(PP_Instance instance, 2505 void PluginInstance::NeedKey(PP_Instance instance,
2342 PP_Var key_system_var, 2506 PP_Var key_system_var,
2343 PP_Var session_id_var, 2507 PP_Var session_id_var,
2344 PP_Var init_data_var) { 2508 PP_Var init_data_var) {
2345 // TODO(tomfinegan): send the data to media stack. 2509 // TODO(tomfinegan): send the data to media stack.
2346 } 2510 }
2347 2511
2348 void PluginInstance::KeyAdded(PP_Instance instance, 2512 void PluginInstance::KeyAdded(PP_Instance instance,
2349 PP_Var key_system_var, 2513 PP_Var key_system_var,
2350 PP_Var session_id_var) { 2514 PP_Var session_id_var) {
2515 if (!decryptor_client_)
2516 return;
2517
2351 StringVar* key_system_string = StringVar::FromPPVar(key_system_var); 2518 StringVar* key_system_string = StringVar::FromPPVar(key_system_var);
2352 StringVar* session_id_string = StringVar::FromPPVar(session_id_var); 2519 StringVar* session_id_string = StringVar::FromPPVar(session_id_var);
2353 if (!key_system_string || !session_id_string) { 2520 if (!key_system_string || !session_id_string) {
2354 decryptor_client_->KeyError("", "", media::Decryptor::kUnknownError, 0); 2521 decryptor_client_->KeyError("", "", media::Decryptor::kUnknownError, 0);
2355 return; 2522 return;
2356 } 2523 }
2357 2524
2358 DCHECK(decryptor_client_);
2359 decryptor_client_->KeyAdded(key_system_string->value(), 2525 decryptor_client_->KeyAdded(key_system_string->value(),
2360 session_id_string->value()); 2526 session_id_string->value());
2361 } 2527 }
2362 2528
2363 void PluginInstance::KeyMessage(PP_Instance instance, 2529 void PluginInstance::KeyMessage(PP_Instance instance,
2364 PP_Var key_system_var, 2530 PP_Var key_system_var,
2365 PP_Var session_id_var, 2531 PP_Var session_id_var,
2366 PP_Resource message_resource, 2532 PP_Resource message_resource,
2367 PP_Var default_url_var) { 2533 PP_Var default_url_var) {
2534 if (!decryptor_client_)
2535 return;
2536
2368 StringVar* key_system_string = StringVar::FromPPVar(key_system_var); 2537 StringVar* key_system_string = StringVar::FromPPVar(key_system_var);
2369 StringVar* session_id_string = StringVar::FromPPVar(session_id_var); 2538 StringVar* session_id_string = StringVar::FromPPVar(session_id_var);
2370 StringVar* default_url_string = StringVar::FromPPVar(default_url_var); 2539 StringVar* default_url_string = StringVar::FromPPVar(default_url_var);
2371 2540
2372 if (!key_system_string || !session_id_string || !default_url_string) { 2541 if (!key_system_string || !session_id_string || !default_url_string) {
2373 decryptor_client_->KeyError("", "", media::Decryptor::kUnknownError, 0); 2542 decryptor_client_->KeyError("", "", media::Decryptor::kUnknownError, 0);
2374 return; 2543 return;
2375 } 2544 }
2376 2545
2377 EnterResourceNoLock<PPB_Buffer_API> enter(message_resource, true); 2546 EnterResourceNoLock<PPB_Buffer_API> enter(message_resource, true);
2378 if (!enter.succeeded()) { 2547 if (!enter.succeeded()) {
2379 decryptor_client_->KeyError(key_system_string->value(), 2548 decryptor_client_->KeyError(key_system_string->value(),
2380 session_id_string->value(), 2549 session_id_string->value(),
2381 media::Decryptor::kUnknownError, 2550 media::Decryptor::kUnknownError,
2382 0); 2551 0);
2383 return; 2552 return;
2384 } 2553 }
2385 2554
2386 BufferAutoMapper mapper(enter.object()); 2555 BufferAutoMapper mapper(enter.object());
2387 scoped_array<uint8> message_array(new uint8[mapper.size()]); 2556 scoped_array<uint8> message_array(new uint8[mapper.size()]);
2388 if (mapper.data() && mapper.size()) 2557 if (mapper.data() && mapper.size())
2389 memcpy(message_array.get(), mapper.data(), mapper.size()); 2558 memcpy(message_array.get(), mapper.data(), mapper.size());
2390 2559
2391 DCHECK(decryptor_client_);
2392 decryptor_client_->KeyMessage(key_system_string->value(), 2560 decryptor_client_->KeyMessage(key_system_string->value(),
2393 session_id_string->value(), 2561 session_id_string->value(),
2394 message_array.Pass(), 2562 message_array.Pass(),
2395 mapper.size(), 2563 mapper.size(),
2396 default_url_string->value()); 2564 default_url_string->value());
2397 } 2565 }
2398 2566
2399 void PluginInstance::KeyError(PP_Instance instance, 2567 void PluginInstance::KeyError(PP_Instance instance,
2400 PP_Var key_system_var, 2568 PP_Var key_system_var,
2401 PP_Var session_id_var, 2569 PP_Var session_id_var,
2402 int32_t media_error, 2570 int32_t media_error,
2403 int32_t system_code) { 2571 int32_t system_code) {
2572 if (!decryptor_client_)
2573 return;
2574
2404 StringVar* key_system_string = StringVar::FromPPVar(key_system_var); 2575 StringVar* key_system_string = StringVar::FromPPVar(key_system_var);
2405 StringVar* session_id_string = StringVar::FromPPVar(session_id_var); 2576 StringVar* session_id_string = StringVar::FromPPVar(session_id_var);
2406 if (!key_system_string || !session_id_string) { 2577 if (!key_system_string || !session_id_string) {
2407 decryptor_client_->KeyError("", "", media::Decryptor::kUnknownError, 0); 2578 decryptor_client_->KeyError("", "", media::Decryptor::kUnknownError, 0);
2408 return; 2579 return;
2409 } 2580 }
2410 2581
2411 DCHECK(decryptor_client_);
2412 decryptor_client_->KeyError( 2582 decryptor_client_->KeyError(
2413 key_system_string->value(), 2583 key_system_string->value(),
2414 session_id_string->value(), 2584 session_id_string->value(),
2415 static_cast<media::Decryptor::KeyError>(media_error), 2585 static_cast<media::Decryptor::KeyError>(media_error),
2416 system_code); 2586 system_code);
2417 } 2587 }
2418 2588
2419 void PluginInstance::DecoderInitializeDone(PP_Instance instance, 2589 void PluginInstance::DecoderInitializeDone(PP_Instance instance,
2420 PP_DecryptorStreamType decoder_type, 2590 PP_DecryptorStreamType decoder_type,
2421 uint32_t request_id, 2591 uint32_t request_id,
(...skipping 30 matching lines...) Expand all
2452 2622
2453 void PluginInstance::DecoderResetDone(PP_Instance instance, 2623 void PluginInstance::DecoderResetDone(PP_Instance instance,
2454 PP_DecryptorStreamType decoder_type, 2624 PP_DecryptorStreamType decoder_type,
2455 uint32_t request_id) { 2625 uint32_t request_id) {
2456 // TODO(tomfinegan): Add decoder reset completion handling. 2626 // TODO(tomfinegan): Add decoder reset completion handling.
2457 } 2627 }
2458 2628
2459 void PluginInstance::DeliverBlock(PP_Instance instance, 2629 void PluginInstance::DeliverBlock(PP_Instance instance,
2460 PP_Resource decrypted_block, 2630 PP_Resource decrypted_block,
2461 const PP_DecryptedBlockInfo* block_info) { 2631 const PP_DecryptedBlockInfo* block_info) {
2462 DVLOG(2) << "DeliverBlock() - request_id: "
2463 << block_info->tracking_info.request_id;
2464 DCHECK(block_info); 2632 DCHECK(block_info);
2465 DecryptionCBMap::iterator found = pending_decryption_cbs_.find( 2633 const uint32_t request_id = block_info->tracking_info.request_id;
2466 block_info->tracking_info.request_id); 2634 DVLOG(2) << "DeliverBlock() - request_id: " << request_id;
2467 if (found == pending_decryption_cbs_.end()) 2635
2636 // If the request ID is not valid or does not match what's saved, do nothing.
2637 if (request_id == 0) {
2638 DVLOG(1) << "DeliverBlock() - invalid request_id " << request_id;
2468 return; 2639 return;
2469 media::Decryptor::DecryptCB decrypt_cb = found->second; 2640 }
2470 pending_decryption_cbs_.erase(found); 2641
2642 media::Decryptor::DecryptCB decrypt_cb;
2643 if (request_id == pending_audio_decrypt_request_id_) {
2644 DCHECK(!pending_audio_decrypt_cb_.is_null());
2645 pending_audio_decrypt_request_id_ = 0;
2646 decrypt_cb = base::ResetAndReturn(&pending_audio_decrypt_cb_);
2647 } else if (request_id == pending_video_decrypt_request_id_) {
2648 DCHECK(!pending_video_decrypt_cb_.is_null());
2649 pending_video_decrypt_request_id_ = 0;
2650 decrypt_cb = base::ResetAndReturn(&pending_video_decrypt_cb_);
2651 } else {
2652 DVLOG(1) << "DeliverBlock() - request_id " << request_id << " not found";
2653 return;
2654 }
2471 2655
2472 if (block_info->result == PP_DECRYPTRESULT_DECRYPT_NOKEY) { 2656 if (block_info->result == PP_DECRYPTRESULT_DECRYPT_NOKEY) {
2473 decrypt_cb.Run(media::Decryptor::kNoKey, NULL); 2657 decrypt_cb.Run(media::Decryptor::kNoKey, NULL);
2474 return; 2658 return;
2475 } 2659 }
2476 2660
2477 if (block_info->result != PP_DECRYPTRESULT_SUCCESS) { 2661 if (block_info->result != PP_DECRYPTRESULT_SUCCESS) {
2478 decrypt_cb.Run(media::Decryptor::kError, NULL); 2662 decrypt_cb.Run(media::Decryptor::kError, NULL);
2479 return; 2663 return;
2480 } 2664 }
(...skipping 15 matching lines...) Expand all
2496 media::DecoderBuffer::CopyFrom( 2680 media::DecoderBuffer::CopyFrom(
2497 static_cast<uint8*>(mapper.data()), mapper.size())); 2681 static_cast<uint8*>(mapper.data()), mapper.size()));
2498 decrypted_buffer->SetTimestamp(base::TimeDelta::FromMicroseconds( 2682 decrypted_buffer->SetTimestamp(base::TimeDelta::FromMicroseconds(
2499 block_info->tracking_info.timestamp)); 2683 block_info->tracking_info.timestamp));
2500 decrypt_cb.Run(media::Decryptor::kSuccess, decrypted_buffer); 2684 decrypt_cb.Run(media::Decryptor::kSuccess, decrypted_buffer);
2501 } 2685 }
2502 2686
2503 void PluginInstance::DeliverFrame(PP_Instance instance, 2687 void PluginInstance::DeliverFrame(PP_Instance instance,
2504 PP_Resource decrypted_frame, 2688 PP_Resource decrypted_frame,
2505 const PP_DecryptedFrameInfo* frame_info) { 2689 const PP_DecryptedFrameInfo* frame_info) {
2506 DVLOG(2) << "DeliverFrame() - request_id: "
2507 << frame_info->tracking_info.request_id;
2508 DCHECK(frame_info); 2690 DCHECK(frame_info);
2691 const uint32_t request_id = frame_info->tracking_info.request_id;
2692 DVLOG(2) << "DeliverFrame() - request_id: " << request_id;
2509 2693
2510 // If the request ID is not valid or does not match what's saved, do nothing. 2694 // If the request ID is not valid or does not match what's saved, do nothing.
2511 if (frame_info->tracking_info.request_id == 0 || 2695 if (request_id == 0 || request_id != pending_video_decode_request_id_) {
2512 frame_info->tracking_info.request_id != 2696 DVLOG(1) << "DeliverFrame() - request_id " << request_id << " not found";
2513 pending_video_decode_request_id_) {
2514 DCHECK(pending_video_decode_cb_.is_null()); 2697 DCHECK(pending_video_decode_cb_.is_null());
2515 return; 2698 return;
2516 } 2699 }
2517 2700
2518 DCHECK(!pending_video_decode_cb_.is_null()); 2701 DCHECK(!pending_video_decode_cb_.is_null());
2519 pending_video_decode_request_id_ = 0; 2702 pending_video_decode_request_id_ = 0;
2520 media::Decryptor::VideoDecodeCB video_decode_cb = 2703 media::Decryptor::VideoDecodeCB video_decode_cb =
2521 base::ResetAndReturn(&pending_video_decode_cb_); 2704 base::ResetAndReturn(&pending_video_decode_cb_);
2522 2705
2523 if (frame_info->result == PP_DECRYPTRESULT_DECRYPT_NOKEY) { 2706 if (frame_info->result == PP_DECRYPTRESULT_DECRYPT_NOKEY) {
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
2578 frame_info->strides[PP_DECRYPTEDFRAMEPLANES_V], 2761 frame_info->strides[PP_DECRYPTEDFRAMEPLANES_V],
2579 frame_info->height, 2762 frame_info->height,
2580 decoded_frame.get()); 2763 decoded_frame.get());
2581 2764
2582 video_decode_cb.Run(media::Decryptor::kSuccess, decoded_frame); 2765 video_decode_cb.Run(media::Decryptor::kSuccess, decoded_frame);
2583 } 2766 }
2584 2767
2585 void PluginInstance::DeliverSamples(PP_Instance instance, 2768 void PluginInstance::DeliverSamples(PP_Instance instance,
2586 PP_Resource audio_frames, 2769 PP_Resource audio_frames,
2587 const PP_DecryptedBlockInfo* block_info) { 2770 const PP_DecryptedBlockInfo* block_info) {
2588 DVLOG(2) << "DeliverSamples() - request_id: " 2771 DCHECK(block_info);
2589 << block_info->tracking_info.request_id; 2772 const uint32_t request_id = block_info->tracking_info.request_id;
2590 // TODO(tomfinegan): To be implemented after completion of v0.1 of the 2773 DVLOG(2) << "DeliverSamples() - request_id: " << request_id;
2591 // EME/CDM work. 2774
2775 // If the request ID is not valid or does not match what's saved, do nothing.
2776 if (request_id == 0 || request_id != pending_audio_decode_request_id_) {
2777 DVLOG(1) << "DeliverSamples() - request_id " << request_id << " not found";
2778 DCHECK(pending_audio_decode_cb_.is_null());
2779 return;
2780 }
2781
2782 DCHECK(!pending_audio_decode_cb_.is_null());
2783 pending_audio_decode_request_id_ = 0;
2784 media::Decryptor::AudioDecodeCB audio_decode_cb =
2785 base::ResetAndReturn(&pending_audio_decode_cb_);
2786
2787 const media::Decryptor::AudioBuffers empty_frames;
2788
2789 if (block_info->result == PP_DECRYPTRESULT_DECRYPT_NOKEY) {
2790 audio_decode_cb.Run(media::Decryptor::kNoKey, empty_frames);
2791 return;
2792 }
2793
2794 if (block_info->result != PP_DECRYPTRESULT_SUCCESS) {
2795 audio_decode_cb.Run(media::Decryptor::kError, empty_frames);
2796 return;
2797 }
2798
2799 if (audio_frames == 0) { // End-of-stream frame.
2800 audio_decode_cb.Run(media::Decryptor::kSuccess, empty_frames);
2801 return;
2802 }
2803
2804 media::Decryptor::AudioBuffers audio_frame_list;
2805 if (!DeserializeAudioFrames(audio_frames, &audio_frame_list)) {
2806 audio_decode_cb.Run(media::Decryptor::kError, empty_frames);
2807 return;
ddorwin 2012/10/23 02:37:51 as discussed offline, NOTREACHED()
xhwang 2012/10/23 02:46:54 Done.
2808 }
2809
2810 audio_decode_cb.Run(media::Decryptor::kSuccess, audio_frame_list);
2592 } 2811 }
2593 2812
2594 void PluginInstance::NumberOfFindResultsChanged(PP_Instance instance, 2813 void PluginInstance::NumberOfFindResultsChanged(PP_Instance instance,
2595 int32_t total, 2814 int32_t total,
2596 PP_Bool final_result) { 2815 PP_Bool final_result) {
2597 DCHECK_NE(find_identifier_, -1); 2816 DCHECK_NE(find_identifier_, -1);
2598 delegate_->NumberOfFindResultsChanged(find_identifier_, total, 2817 delegate_->NumberOfFindResultsChanged(find_identifier_, total,
2599 PP_ToBool(final_result)); 2818 PP_ToBool(final_result));
2600 } 2819 }
2601 2820
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after
2971 screen_size_for_fullscreen_ = gfx::Size(); 3190 screen_size_for_fullscreen_ = gfx::Size();
2972 WebElement element = container_->element(); 3191 WebElement element = container_->element();
2973 element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_); 3192 element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_);
2974 element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_); 3193 element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_);
2975 element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_); 3194 element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_);
2976 element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_); 3195 element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_);
2977 } 3196 }
2978 3197
2979 } // namespace ppapi 3198 } // namespace ppapi
2980 } // namespace webkit 3199 } // 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