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

Side by Side Diff: content/renderer/media/android/webmediaplayer_android.cc

Issue 416333011: Allow setContentDecryptionModule() to get called when setting is done. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase + android tweaks Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/media/android/webmediaplayer_android.h" 5 #include "content/renderer/media/android/webmediaplayer_android.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "base/android/build_info.h" 9 #include "base/android/build_info.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 23 matching lines...) Expand all
34 #include "gpu/command_buffer/client/gles2_interface.h" 34 #include "gpu/command_buffer/client/gles2_interface.h"
35 #include "gpu/command_buffer/common/mailbox_holder.h" 35 #include "gpu/command_buffer/common/mailbox_holder.h"
36 #include "media/base/android/media_player_android.h" 36 #include "media/base/android/media_player_android.h"
37 #include "media/base/bind_to_current_loop.h" 37 #include "media/base/bind_to_current_loop.h"
38 // TODO(xhwang): Remove when we remove prefixed EME implementation. 38 // TODO(xhwang): Remove when we remove prefixed EME implementation.
39 #include "media/base/media_keys.h" 39 #include "media/base/media_keys.h"
40 #include "media/base/media_switches.h" 40 #include "media/base/media_switches.h"
41 #include "media/base/video_frame.h" 41 #include "media/base/video_frame.h"
42 #include "net/base/mime_util.h" 42 #include "net/base/mime_util.h"
43 #include "third_party/WebKit/public/platform/Platform.h" 43 #include "third_party/WebKit/public/platform/Platform.h"
44 #include "third_party/WebKit/public/platform/WebContentDecryptionModuleResult.h"
44 #include "third_party/WebKit/public/platform/WebGraphicsContext3DProvider.h" 45 #include "third_party/WebKit/public/platform/WebGraphicsContext3DProvider.h"
45 #include "third_party/WebKit/public/platform/WebMediaPlayerClient.h" 46 #include "third_party/WebKit/public/platform/WebMediaPlayerClient.h"
46 #include "third_party/WebKit/public/platform/WebString.h" 47 #include "third_party/WebKit/public/platform/WebString.h"
47 #include "third_party/WebKit/public/platform/WebURL.h" 48 #include "third_party/WebKit/public/platform/WebURL.h"
48 #include "third_party/WebKit/public/web/WebDocument.h" 49 #include "third_party/WebKit/public/web/WebDocument.h"
49 #include "third_party/WebKit/public/web/WebFrame.h" 50 #include "third_party/WebKit/public/web/WebFrame.h"
50 #include "third_party/WebKit/public/web/WebRuntimeFeatures.h" 51 #include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
51 #include "third_party/WebKit/public/web/WebSecurityOrigin.h" 52 #include "third_party/WebKit/public/web/WebSecurityOrigin.h"
52 #include "third_party/WebKit/public/web/WebView.h" 53 #include "third_party/WebKit/public/web/WebView.h"
53 #include "third_party/skia/include/core/SkCanvas.h" 54 #include "third_party/skia/include/core/SkCanvas.h"
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 return web_graphics_context_->insertSyncPoint(); 92 return web_graphics_context_->insertSyncPoint();
92 } 93 }
93 virtual void WaitSyncPoint(uint32 sync_point) OVERRIDE { 94 virtual void WaitSyncPoint(uint32 sync_point) OVERRIDE {
94 web_graphics_context_->waitSyncPoint(sync_point); 95 web_graphics_context_->waitSyncPoint(sync_point);
95 } 96 }
96 97
97 private: 98 private:
98 blink::WebGraphicsContext3D* web_graphics_context_; 99 blink::WebGraphicsContext3D* web_graphics_context_;
99 }; 100 };
100 101
102 // Used for calls to decryptor_ready_cb_ where the result can be ignored.
103 void DoNothing(bool) {
104 }
105
101 } // namespace 106 } // namespace
102 107
103 namespace content { 108 namespace content {
104 109
105 WebMediaPlayerAndroid::WebMediaPlayerAndroid( 110 WebMediaPlayerAndroid::WebMediaPlayerAndroid(
106 blink::WebFrame* frame, 111 blink::WebFrame* frame,
107 blink::WebMediaPlayerClient* client, 112 blink::WebMediaPlayerClient* client,
108 base::WeakPtr<WebMediaPlayerDelegate> delegate, 113 base::WeakPtr<WebMediaPlayerDelegate> delegate,
109 RendererMediaPlayerManager* player_manager, 114 RendererMediaPlayerManager* player_manager,
110 RendererCdmManager* cdm_manager, 115 RendererCdmManager* cdm_manager,
(...skipping 1269 matching lines...) Expand 10 before | Expand all | Expand 10 after
1380 base::Bind(&WebMediaPlayerAndroid::OnKeyMessage, 1385 base::Bind(&WebMediaPlayerAndroid::OnKeyMessage,
1381 weak_factory_.GetWeakPtr()))); 1386 weak_factory_.GetWeakPtr())));
1382 } 1387 }
1383 1388
1384 GURL security_origin(frame_->document().securityOrigin().toString()); 1389 GURL security_origin(frame_->document().securityOrigin().toString());
1385 if (!proxy_decryptor_->InitializeCDM(key_system, security_origin)) 1390 if (!proxy_decryptor_->InitializeCDM(key_system, security_origin))
1386 return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported; 1391 return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported;
1387 1392
1388 if (!decryptor_ready_cb_.is_null()) { 1393 if (!decryptor_ready_cb_.is_null()) {
1389 base::ResetAndReturn(&decryptor_ready_cb_) 1394 base::ResetAndReturn(&decryptor_ready_cb_)
1390 .Run(proxy_decryptor_->GetDecryptor()); 1395 .Run(proxy_decryptor_->GetDecryptor(), base::Bind(DoNothing));
1391 } 1396 }
1392 1397
1393 // Only browser CDMs have CDM ID. Render side CDMs (e.g. ClearKey CDM) do 1398 // Only browser CDMs have CDM ID. Render side CDMs (e.g. ClearKey CDM) do
1394 // not have a CDM ID and there is no need to call player_manager_->SetCdm(). 1399 // not have a CDM ID and there is no need to call player_manager_->SetCdm().
1395 if (proxy_decryptor_->GetCdmId() != RendererCdmManager::kInvalidCdmId) 1400 if (proxy_decryptor_->GetCdmId() != RendererCdmManager::kInvalidCdmId)
1396 player_manager_->SetCdm(player_id_, proxy_decryptor_->GetCdmId()); 1401 player_manager_->SetCdm(player_id_, proxy_decryptor_->GetCdmId());
1397 1402
1398 current_key_system_ = key_system; 1403 current_key_system_ = key_system;
1399 } else if (key_system != current_key_system_) { 1404 } else if (key_system != current_key_system_) {
1400 return WebMediaPlayer::MediaKeyExceptionInvalidPlayerState; 1405 return WebMediaPlayer::MediaKeyExceptionInvalidPlayerState;
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1499 DCHECK(main_thread_checker_.CalledOnValidThread()); 1504 DCHECK(main_thread_checker_.CalledOnValidThread());
1500 1505
1501 // TODO(xhwang): Support setMediaKeys(0) if necessary: http://crbug.com/330324 1506 // TODO(xhwang): Support setMediaKeys(0) if necessary: http://crbug.com/330324
1502 if (!cdm) 1507 if (!cdm)
1503 return; 1508 return;
1504 1509
1505 web_cdm_ = ToWebContentDecryptionModuleImpl(cdm); 1510 web_cdm_ = ToWebContentDecryptionModuleImpl(cdm);
1506 if (!web_cdm_) 1511 if (!web_cdm_)
1507 return; 1512 return;
1508 1513
1509 if (!decryptor_ready_cb_.is_null()) 1514 if (!decryptor_ready_cb_.is_null()) {
1510 base::ResetAndReturn(&decryptor_ready_cb_).Run(web_cdm_->GetDecryptor()); 1515 base::ResetAndReturn(&decryptor_ready_cb_)
1516 .Run(web_cdm_->GetDecryptor(), base::Bind(DoNothing));
1517 }
1511 1518
1512 if (web_cdm_->GetCdmId() != RendererCdmManager::kInvalidCdmId) 1519 if (web_cdm_->GetCdmId() != RendererCdmManager::kInvalidCdmId)
1513 player_manager_->SetCdm(player_id_, web_cdm_->GetCdmId()); 1520 player_manager_->SetCdm(player_id_, web_cdm_->GetCdmId());
1514 } 1521 }
1515 1522
1523 void WebMediaPlayerAndroid::setContentDecryptionModule(
1524 blink::WebContentDecryptionModule* cdm,
1525 blink::WebContentDecryptionModuleResult result) {
1526 DCHECK(main_thread_checker_.CalledOnValidThread());
1527
1528 // TODO(xhwang): Support setMediaKeys(0) if necessary: http://crbug.com/330324
1529 if (!cdm) {
1530 result.completeWithError(
1531 blink::WebContentDecryptionModuleExceptionNotSupportedError,
1532 0,
1533 "Null MediaKeys object is not supported.");
1534 return;
1535 }
1536
1537 web_cdm_ = ToWebContentDecryptionModuleImpl(cdm);
1538 DCHECK(web_cdm_);
1539
1540 if (!decryptor_ready_cb_.is_null()) {
1541 base::ResetAndReturn(&decryptor_ready_cb_).Run(
1542 web_cdm_->GetDecryptor(),
1543 media::BindToCurrentLoop(
1544 base::Bind(&WebMediaPlayerAndroid::ContentDecryptionModuleAttached,
1545 weak_factory_.GetWeakPtr(),
1546 result)));
1547 } else {
1548 // No pipeline/decoder connected, so resolve the promise. When something
1549 // is connected, setting the CDM will happen in SetDecryptorReadyCB().
1550 ContentDecryptionModuleAttached(result, true);
1551 }
1552
1553 if (web_cdm_->GetCdmId() != RendererCdmManager::kInvalidCdmId)
1554 player_manager_->SetCdm(player_id_, web_cdm_->GetCdmId());
1555 }
1556
1557 void WebMediaPlayerAndroid::setContentDecryptionModuleSync(
1558 blink::WebContentDecryptionModule* cdm) {
1559 DCHECK(main_thread_checker_.CalledOnValidThread());
1560
1561 // TODO(xhwang): Support setMediaKeys(0) if necessary: http://crbug.com/330324
1562 if (!cdm)
1563 return;
1564
1565 DCHECK(decryptor_ready_cb_.is_null());
1566
1567 web_cdm_ = ToWebContentDecryptionModuleImpl(cdm);
1568 if (web_cdm_->GetCdmId() != RendererCdmManager::kInvalidCdmId)
1569 player_manager_->SetCdm(player_id_, web_cdm_->GetCdmId());
1570 }
1571
1572 void WebMediaPlayerAndroid::ContentDecryptionModuleAttached(
1573 blink::WebContentDecryptionModuleResult result,
1574 bool success) {
1575 if (success) {
1576 result.complete();
1577 return;
1578 }
1579
1580 result.completeWithError(
1581 blink::WebContentDecryptionModuleExceptionNotSupportedError,
1582 0,
1583 "Unable to set MediaKeys object");
1584 }
1585
1516 void WebMediaPlayerAndroid::OnKeyAdded(const std::string& session_id) { 1586 void WebMediaPlayerAndroid::OnKeyAdded(const std::string& session_id) {
1517 EmeUMAHistogramCounts(current_key_system_, "KeyAdded", 1); 1587 EmeUMAHistogramCounts(current_key_system_, "KeyAdded", 1);
1518 1588
1519 client_->keyAdded( 1589 client_->keyAdded(
1520 WebString::fromUTF8(GetPrefixedKeySystemName(current_key_system_)), 1590 WebString::fromUTF8(GetPrefixedKeySystemName(current_key_system_)),
1521 WebString::fromUTF8(session_id)); 1591 WebString::fromUTF8(session_id));
1522 } 1592 }
1523 1593
1524 void WebMediaPlayerAndroid::OnKeyError(const std::string& session_id, 1594 void WebMediaPlayerAndroid::OnKeyError(const std::string& session_id,
1525 media::MediaKeys::KeyError error_code, 1595 media::MediaKeys::KeyError error_code,
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1580 client_->keyNeeded( 1650 client_->keyNeeded(
1581 WebString::fromUTF8(type), init_data_ptr, init_data.size()); 1651 WebString::fromUTF8(type), init_data_ptr, init_data.size());
1582 } 1652 }
1583 1653
1584 void WebMediaPlayerAndroid::SetDecryptorReadyCB( 1654 void WebMediaPlayerAndroid::SetDecryptorReadyCB(
1585 const media::DecryptorReadyCB& decryptor_ready_cb) { 1655 const media::DecryptorReadyCB& decryptor_ready_cb) {
1586 DCHECK(main_thread_checker_.CalledOnValidThread()); 1656 DCHECK(main_thread_checker_.CalledOnValidThread());
1587 1657
1588 // Cancels the previous decryptor request. 1658 // Cancels the previous decryptor request.
1589 if (decryptor_ready_cb.is_null()) { 1659 if (decryptor_ready_cb.is_null()) {
1590 if (!decryptor_ready_cb_.is_null()) 1660 if (!decryptor_ready_cb_.is_null()) {
1591 base::ResetAndReturn(&decryptor_ready_cb_).Run(NULL); 1661 base::ResetAndReturn(&decryptor_ready_cb_)
1662 .Run(NULL, base::Bind(DoNothing));
1663 }
1592 return; 1664 return;
1593 } 1665 }
1594 1666
1595 // TODO(xhwang): Support multiple decryptor notification request (e.g. from 1667 // TODO(xhwang): Support multiple decryptor notification request (e.g. from
1596 // video and audio). The current implementation is okay for the current 1668 // video and audio). The current implementation is okay for the current
1597 // media pipeline since we initialize audio and video decoders in sequence. 1669 // media pipeline since we initialize audio and video decoders in sequence.
1598 // But WebMediaPlayerImpl should not depend on media pipeline's implementation 1670 // But WebMediaPlayerImpl should not depend on media pipeline's implementation
1599 // detail. 1671 // detail.
1600 DCHECK(decryptor_ready_cb_.is_null()); 1672 DCHECK(decryptor_ready_cb_.is_null());
1601 1673
1602 // Mixed use of prefixed and unprefixed EME APIs is disallowed by Blink. 1674 // Mixed use of prefixed and unprefixed EME APIs is disallowed by Blink.
1603 DCHECK(!proxy_decryptor_ || !web_cdm_); 1675 DCHECK(!proxy_decryptor_ || !web_cdm_);
1604 1676
1605 if (proxy_decryptor_) { 1677 if (proxy_decryptor_) {
1606 decryptor_ready_cb.Run(proxy_decryptor_->GetDecryptor()); 1678 decryptor_ready_cb.Run(proxy_decryptor_->GetDecryptor(),
1679 base::Bind(DoNothing));
1607 return; 1680 return;
1608 } 1681 }
1609 1682
1610 if (web_cdm_) { 1683 if (web_cdm_) {
1611 decryptor_ready_cb.Run(web_cdm_->GetDecryptor()); 1684 decryptor_ready_cb.Run(web_cdm_->GetDecryptor(), base::Bind(DoNothing));
1612 return; 1685 return;
1613 } 1686 }
1614 1687
1615 decryptor_ready_cb_ = decryptor_ready_cb; 1688 decryptor_ready_cb_ = decryptor_ready_cb;
1616 } 1689 }
1617 1690
1618 void WebMediaPlayerAndroid::enterFullscreen() { 1691 void WebMediaPlayerAndroid::enterFullscreen() {
1619 if (player_manager_->CanEnterFullscreen(frame_)) { 1692 if (player_manager_->CanEnterFullscreen(frame_)) {
1620 player_manager_->EnterFullscreen(player_id_, frame_); 1693 player_manager_->EnterFullscreen(player_id_, frame_);
1621 SetNeedsEstablishPeer(false); 1694 SetNeedsEstablishPeer(false);
1622 } 1695 }
1623 } 1696 }
1624 1697
1625 bool WebMediaPlayerAndroid::canEnterFullscreen() const { 1698 bool WebMediaPlayerAndroid::canEnterFullscreen() const {
1626 return player_manager_->CanEnterFullscreen(frame_); 1699 return player_manager_->CanEnterFullscreen(frame_);
1627 } 1700 }
1628 1701
1629 } // namespace content 1702 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/android/webmediaplayer_android.h ('k') | content/renderer/media/webmediaplayer_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698