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

Side by Side Diff: content/browser/media/cdm/browser_cdm_manager.cc

Issue 1341883003: Prepare MediaDrmBridge to work with MediaCodecPlayer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@bug526755
Patch Set: Removed lock from player_tracker_impl Created 5 years, 3 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/browser/media/cdm/browser_cdm_manager.h" 5 #include "content/browser/media/cdm/browser_cdm_manager.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
11 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
12 #include "base/task_runner.h" 12 #include "base/task_runner.h"
13 #include "content/public/browser/browser_context.h" 13 #include "content/public/browser/browser_context.h"
14 #include "content/public/browser/browser_thread.h" 14 #include "content/public/browser/browser_thread.h"
15 #include "content/public/browser/content_browser_client.h" 15 #include "content/public/browser/content_browser_client.h"
16 #include "content/public/browser/permission_manager.h" 16 #include "content/public/browser/permission_manager.h"
17 #include "content/public/browser/permission_type.h" 17 #include "content/public/browser/permission_type.h"
18 #include "content/public/browser/render_frame_host.h" 18 #include "content/public/browser/render_frame_host.h"
19 #include "content/public/browser/render_process_host.h" 19 #include "content/public/browser/render_process_host.h"
20 #include "content/public/browser/render_process_host_observer.h" 20 #include "content/public/browser/render_process_host_observer.h"
21 #include "content/public/browser/web_contents.h" 21 #include "content/public/browser/web_contents.h"
22 #include "media/base/browser_cdm.h" 22 #include "media/base/browser_cdm.h"
23 #include "media/base/browser_cdm_factory.h" 23 #include "media/base/browser_cdm_factory.h"
24 #include "media/base/cdm_promise.h" 24 #include "media/base/cdm_promise.h"
25 #include "media/base/limits.h" 25 #include "media/base/limits.h"
26 26
27 #if defined(OS_ANDROID) 27 #if defined(OS_ANDROID)
28 #include "content/public/common/renderer_preferences.h" 28 #include "content/public/common/renderer_preferences.h"
29
30 #define POST_ON_UI_THREAD(method, ...) \
qinmin 2015/09/16 18:09:40 nit: maybe RUN_ON_UI_THREAD is more appropriate si
31 do { \
32 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { \
33 if (manager_) \
34 manager_->method(__VA_ARGS__); \
35 } else { \
36 BrowserThread::PostTask( \
37 BrowserThread::UI, FROM_HERE, \
38 base::Bind(&BrowserCdmManager::method, manager_, ##__VA_ARGS__)); \
39 } \
40 } while (0)
29 #endif 41 #endif
30 42
31 namespace content { 43 namespace content {
32 44
33 using media::BrowserCdm; 45 using media::BrowserCdm;
46 using media::BrowserCdmPtr;
34 using media::MediaKeys; 47 using media::MediaKeys;
35 48
36 namespace { 49 namespace {
37 50
38 #if defined(OS_ANDROID) 51 #if defined(OS_ANDROID)
39 // Android only supports 128-bit key IDs. 52 // Android only supports 128-bit key IDs.
40 const size_t kAndroidKeyIdBytes = 128 / 8; 53 const size_t kAndroidKeyIdBytes = 128 / 8;
41 #endif 54 #endif
42 55
43 // The ID used in this class is a concatenation of |render_frame_id| and 56 // The ID used in this class is a concatenation of |render_frame_id| and
(...skipping 25 matching lines...) Expand all
69 82
70 ~CdmPromiseInternal() final {} 83 ~CdmPromiseInternal() final {}
71 84
72 // CdmPromiseTemplate<> implementation. 85 // CdmPromiseTemplate<> implementation.
73 void resolve(const T&... result) final; 86 void resolve(const T&... result) final;
74 87
75 void reject(MediaKeys::Exception exception, 88 void reject(MediaKeys::Exception exception,
76 uint32_t system_code, 89 uint32_t system_code,
77 const std::string& error_message) final { 90 const std::string& error_message) final {
78 MarkPromiseSettled(); 91 MarkPromiseSettled();
92 #if defined(OS_ANDROID)
93 POST_ON_UI_THREAD(RejectPromise, render_frame_id_, cdm_id_, promise_id_,
94 exception, system_code, error_message);
95 #else
79 if (manager_) { 96 if (manager_) {
80 manager_->RejectPromise(render_frame_id_, cdm_id_, promise_id_, exception, 97 manager_->RejectPromise(render_frame_id_, cdm_id_, promise_id_, exception,
81 system_code, error_message); 98 system_code, error_message);
82 } 99 }
100 #endif
83 } 101 }
84 102
85 private: 103 private:
86 using media::CdmPromiseTemplate<T...>::MarkPromiseSettled; 104 using media::CdmPromiseTemplate<T...>::MarkPromiseSettled;
87 105
88 base::WeakPtr<BrowserCdmManager> const manager_; 106 base::WeakPtr<BrowserCdmManager> const manager_;
89 const int render_frame_id_; 107 const int render_frame_id_;
90 const int cdm_id_; 108 const int cdm_id_;
91 const uint32_t promise_id_; 109 const uint32_t promise_id_;
92 }; 110 };
93 111
94 template <> 112 template <>
95 void CdmPromiseInternal<>::resolve() { 113 void CdmPromiseInternal<>::resolve() {
96 MarkPromiseSettled(); 114 MarkPromiseSettled();
115 #if defined(OS_ANDROID)
116 POST_ON_UI_THREAD(ResolvePromise, render_frame_id_, cdm_id_, promise_id_);
117 #else
97 if (manager_) 118 if (manager_)
98 manager_->ResolvePromise(render_frame_id_, cdm_id_, promise_id_); 119 manager_->ResolvePromise(render_frame_id_, cdm_id_, promise_id_);
120 #endif
99 } 121 }
100 122
101 template <> 123 template <>
102 void CdmPromiseInternal<std::string>::resolve(const std::string& session_id) { 124 void CdmPromiseInternal<std::string>::resolve(const std::string& session_id) {
103 MarkPromiseSettled(); 125 MarkPromiseSettled();
126 #if defined(OS_ANDROID)
127 POST_ON_UI_THREAD(ResolvePromiseWithSession, render_frame_id_, cdm_id_,
128 promise_id_, session_id);
129 #else
104 if (manager_) { 130 if (manager_) {
105 manager_->ResolvePromiseWithSession(render_frame_id_, cdm_id_, promise_id_, 131 manager_->ResolvePromiseWithSession(render_frame_id_, cdm_id_, promise_id_,
106 session_id); 132 session_id);
107 } 133 }
134 #endif
108 } 135 }
109 136
110 typedef CdmPromiseInternal<> SimplePromise; 137 typedef CdmPromiseInternal<> SimplePromise;
111 typedef CdmPromiseInternal<std::string> NewSessionPromise; 138 typedef CdmPromiseInternal<std::string> NewSessionPromise;
112 139
113 // Render process ID to BrowserCdmManager map. 140 // Render process ID to BrowserCdmManager map.
114 typedef std::map<int, BrowserCdmManager*> BrowserCdmManagerMap; 141 typedef std::map<int, BrowserCdmManager*> BrowserCdmManagerMap;
115 base::LazyInstance<BrowserCdmManagerMap>::Leaky g_browser_cdm_manager_map = 142 base::LazyInstance<BrowserCdmManagerMap>::Leaky g_browser_cdm_manager_map =
116 LAZY_INSTANCE_INITIALIZER; 143 LAZY_INSTANCE_INITIALIZER;
117 144
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 uint32_t promise_id, 561 uint32_t promise_id,
535 const std::string& key_system, 562 const std::string& key_system,
536 const GURL& security_origin, 563 const GURL& security_origin,
537 bool use_hw_secure_codecs) { 564 bool use_hw_secure_codecs) {
538 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 565 DCHECK(task_runner_->RunsTasksOnCurrentThread());
539 DCHECK(!GetCdm(render_frame_id, cdm_id)); 566 DCHECK(!GetCdm(render_frame_id, cdm_id));
540 567
541 scoped_ptr<SimplePromise> promise(new SimplePromise( 568 scoped_ptr<SimplePromise> promise(new SimplePromise(
542 weak_ptr_factory_.GetWeakPtr(), render_frame_id, cdm_id, promise_id)); 569 weak_ptr_factory_.GetWeakPtr(), render_frame_id, cdm_id, promise_id));
543 570
544 scoped_ptr<BrowserCdm> cdm(media::CreateBrowserCdm( 571 BrowserCdmPtr cdm(media::CreateBrowserCdm(
545 key_system, use_hw_secure_codecs, 572 key_system, use_hw_secure_codecs,
546 BROWSER_CDM_MANAGER_CB(OnSessionMessage), 573 BROWSER_CDM_MANAGER_CB(OnSessionMessage),
547 BROWSER_CDM_MANAGER_CB(OnSessionClosed), 574 BROWSER_CDM_MANAGER_CB(OnSessionClosed),
548 BROWSER_CDM_MANAGER_CB(OnLegacySessionError), 575 BROWSER_CDM_MANAGER_CB(OnLegacySessionError),
549 BROWSER_CDM_MANAGER_CB(OnSessionKeysChange), 576 BROWSER_CDM_MANAGER_CB(OnSessionKeysChange),
550 BROWSER_CDM_MANAGER_CB(OnSessionExpirationUpdate))); 577 BROWSER_CDM_MANAGER_CB(OnSessionExpirationUpdate)));
551 578
552 if (!cdm) { 579 if (!cdm) {
553 DVLOG(1) << "failed to create CDM."; 580 DVLOG(1) << "failed to create CDM.";
554 promise->reject(MediaKeys::INVALID_STATE_ERROR, 0, "Failed to create CDM."); 581 promise->reject(MediaKeys::INVALID_STATE_ERROR, 0, "Failed to create CDM.");
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
680 BrowserCdm* cdm = GetCdm(render_frame_id, cdm_id); 707 BrowserCdm* cdm = GetCdm(render_frame_id, cdm_id);
681 if (!cdm) { 708 if (!cdm) {
682 promise->reject(MediaKeys::INVALID_STATE_ERROR, 0, "CDM not found."); 709 promise->reject(MediaKeys::INVALID_STATE_ERROR, 0, "CDM not found.");
683 return; 710 return;
684 } 711 }
685 712
686 cdm->LoadSession(session_type, session_id, promise.Pass()); 713 cdm->LoadSession(session_type, session_id, promise.Pass());
687 } 714 }
688 715
689 } // namespace content 716 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698