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

Side by Side Diff: media/base/android/media_drm_proxy.cc

Issue 1341883003: Prepare MediaDrmBridge to work with MediaCodecPlayer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@bug526755
Patch Set: Addressed Min's comments 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
(Empty)
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "media/base/android/media_drm_proxy.h"
6
7 #include "base/bind.h"
8 #include "base/thread_task_runner_handle.h"
9 #include "media/base/android/media_codec_player.h" // for GetMediaTaskRunner()
10 #include "media/base/android/media_drm_bridge.h"
11 #include "media/base/cdm_key_information.h"
12 #include "third_party/widevine/cdm/widevine_cdm_common.h"
13
14 #define POST_ON_MEDIA_THREAD_AND_RETURN(method, ...) \
15 do { \
16 if (!GetMediaTaskRunner()->BelongsToCurrentThread()) { \
17 GetMediaTaskRunner()->PostTask( \
18 FROM_HERE, base::Bind(&MediaDrmProxy::method, media_weak_this_, \
19 ##__VA_ARGS__)); \
20 return; \
21 } \
22 } while (0)
23
24 namespace media {
25
26 // static
27 scoped_ptr<MediaDrmProxy, BrowserCdmDeleter> MediaDrmProxy::Create(
28 const std::string& key_system,
29 MediaDrmBridge::SecurityLevel widevine_security_level,
30 const SessionMessageCB& session_message_cb,
31 const SessionClosedCB& session_closed_cb,
32 const LegacySessionErrorCB& legacy_session_error_cb,
33 const SessionKeysChangeCB& session_keys_change_cb,
34 const SessionExpirationUpdateCB& session_expiration_update_cb) {
35 scoped_ptr<MediaDrmProxy, BrowserCdmDeleter> media_drm_proxy;
36
37 // Perform as many checks as we can on the UI thread before we do
38 // the creation asynchronously on Media thread.
39 if (!MediaDrmBridge::CanCreate(key_system, widevine_security_level))
40 return media_drm_proxy.Pass();
41
42 media_drm_proxy.reset(
43 new MediaDrmProxy(key_system, widevine_security_level, session_message_cb,
44 session_closed_cb, legacy_session_error_cb,
45 session_keys_change_cb, session_expiration_update_cb));
46
47 // The actual work is done on the Media thread and there the creation
48 // might fail, but we are still passing a valid pointer.
49 return media_drm_proxy.Pass();
50 }
51
52 MediaDrmProxy::MediaDrmProxy(
53 const std::string& key_system,
54 MediaDrmBridge::SecurityLevel widevine_security_level,
55 const SessionMessageCB& session_message_cb,
56 const SessionClosedCB& session_closed_cb,
57 const LegacySessionErrorCB& legacy_session_error_cb,
58 const SessionKeysChangeCB& session_keys_change_cb,
59 const SessionExpirationUpdateCB& session_expiration_update_cb)
60 : ui_task_runner_(base::ThreadTaskRunnerHandle::Get()),
61 key_system_(key_system),
62 widevine_security_level_(widevine_security_level),
63 session_message_cb_(session_message_cb),
64 session_closed_cb_(session_closed_cb),
65 legacy_session_error_cb_(legacy_session_error_cb),
66 session_keys_change_cb_(session_keys_change_cb),
67 session_expiration_update_cb_(session_expiration_update_cb),
68 media_weak_factory_(this) {
69 media_weak_this_ = media_weak_factory_.GetWeakPtr();
70
71 internal_session_message_cb_ =
72 base::Bind(&MediaDrmProxy::OnSessionMessage, media_weak_this_);
73 internal_session_closed_cb_ =
74 base::Bind(&MediaDrmProxy::OnSessionClosed, media_weak_this_);
75 internal_legacy_session_error_cb_ =
76 base::Bind(&MediaDrmProxy::OnLegacySessionError, media_weak_this_);
77 internal_session_keys_change_cb_ =
78 base::Bind(&MediaDrmProxy::OnSessionKeysChange, media_weak_this_);
79 internal_session_expiration_update_cb_ =
80 base::Bind(&MediaDrmProxy::OnSessionExpirationUpdate, media_weak_this_);
81
82 // Perform MediaDrmBridge creation on the Media thread.
83 GetMediaTaskRunner()->PostTask(
84 FROM_HERE, base::Bind(&MediaDrmProxy::Initialize, media_weak_this_));
85 }
86
87 MediaDrmProxy::~MediaDrmProxy() {
88 DVLOG(1) << "MediaDrmProxy::" << __FUNCTION__;
89 DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread());
90 }
91
92 void MediaDrmProxy::DeleteOnCorrectThread() {
93 DVLOG(1) << "MediaDrmProxy::" << __FUNCTION__;
94
95 // Post deletion onto Media thread
96 GetMediaTaskRunner()->DeleteSoon(FROM_HERE, this);
97 }
98
99 void MediaDrmProxy::Initialize() {
100 DVLOG(1) << "MediaDrmProxy::" << __FUNCTION__;
101
102 // Pass the original callbacks, those that should be called on UI thread.
103 media_drm_bridge_ =
104 scoped_ptr<MediaDrmBridge, BrowserCdmDeleter>(MediaDrmBridge::Create(
105 key_system_,
106 widevine_security_level_,
107 internal_session_message_cb_,
108 internal_session_closed_cb_,
109 internal_legacy_session_error_cb_,
110 internal_session_keys_change_cb_,
111 internal_session_expiration_update_cb_));
112
113 if (!media_drm_bridge_)
114 DVLOG(1) << __FUNCTION__ << ": MediaDrmBridge::Create() failed";
115 }
116
117 void MediaDrmProxy::SetServerCertificate(
118 const std::vector<uint8_t>& certificate,
119 scoped_ptr<media::SimpleCdmPromise> promise) {
120 POST_ON_MEDIA_THREAD_AND_RETURN(SetServerCertificate, certificate,
121 base::Passed(&promise));
122
123 DVLOG(1) << "MediaDrmProxy::" << __FUNCTION__;
124
125 media_drm_bridge_->SetServerCertificate(certificate, promise.Pass());
126 }
127
128 void MediaDrmProxy::CreateSessionAndGenerateRequest(
129 SessionType session_type,
130 media::EmeInitDataType init_data_type,
131 const std::vector<uint8_t>& init_data,
132 scoped_ptr<media::NewSessionCdmPromise> promise) {
133 POST_ON_MEDIA_THREAD_AND_RETURN(CreateSessionAndGenerateRequest, session_type,
134 init_data_type, init_data,
135 base::Passed(&promise));
136
137 DVLOG(1) << "MediaDrmProxy::" << __FUNCTION__;
138
139 media_drm_bridge_->CreateSessionAndGenerateRequest(
140 session_type, init_data_type, init_data, promise.Pass());
141 }
142
143 void MediaDrmProxy::LoadSession(
144 SessionType session_type,
145 const std::string& session_id,
146 scoped_ptr<media::NewSessionCdmPromise> promise) {
147 POST_ON_MEDIA_THREAD_AND_RETURN(LoadSession, session_type, session_id,
148 base::Passed(&promise));
149
150 DVLOG(1) << "MediaDrmProxy::" << __FUNCTION__;
151
152 media_drm_bridge_->LoadSession(session_type, session_id, promise.Pass());
153 }
154
155 void MediaDrmProxy::UpdateSession(const std::string& session_id,
156 const std::vector<uint8_t>& response,
157 scoped_ptr<media::SimpleCdmPromise> promise) {
158 POST_ON_MEDIA_THREAD_AND_RETURN(UpdateSession, session_id, response,
159 base::Passed(&promise));
160
161 DVLOG(1) << "MediaDrmProxy::" << __FUNCTION__;
162
163 media_drm_bridge_->UpdateSession(session_id, response, promise.Pass());
164 }
165
166 void MediaDrmProxy::CloseSession(const std::string& session_id,
167 scoped_ptr<media::SimpleCdmPromise> promise) {
168 POST_ON_MEDIA_THREAD_AND_RETURN(CloseSession, session_id,
169 base::Passed(&promise));
170
171 DVLOG(1) << "MediaDrmProxy::" << __FUNCTION__;
172
173 media_drm_bridge_->CloseSession(session_id, promise.Pass());
174 }
175
176 void MediaDrmProxy::RemoveSession(const std::string& session_id,
177 scoped_ptr<media::SimpleCdmPromise> promise) {
178 POST_ON_MEDIA_THREAD_AND_RETURN(RemoveSession, session_id,
179 base::Passed(&promise));
180
181 DVLOG(1) << "MediaDrmProxy::" << __FUNCTION__;
182
183 media_drm_bridge_->RemoveSession(session_id, promise.Pass());
184 }
185
186 CdmContext* MediaDrmProxy::GetCdmContext() {
187 NOTREACHED();
188 return nullptr;
189 }
190
191 int MediaDrmProxy::RegisterPlayer(const base::Closure& new_key_cb,
192 const base::Closure& cdm_unset_cb) {
193 NOTREACHED() << __FUNCTION__ << " should be called on MediaDrmBridge";
194 return -1;
195 }
196
197 void MediaDrmProxy::UnregisterPlayer(int registration_id) {
198 NOTREACHED() << __FUNCTION__ << " should be called on MediaDrmBridge";
199 }
200
201 MediaDrmBridge* MediaDrmProxy::GetDrmBridge() {
202 DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread());
203
204 return media_drm_bridge_.get();
205 }
206
207 // Internal callbacks
208
209 void MediaDrmProxy::OnSessionMessage(const std::string& session_id,
210 MediaKeys::MessageType message_type,
211 const std::vector<uint8>& message,
212 const GURL& legacy_destination_url) {
213 DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread());
214
215 ui_task_runner_->PostTask(
216 FROM_HERE, base::Bind(session_message_cb_, session_id, message_type,
217 message, legacy_destination_url));
218 }
219
220 void MediaDrmProxy::OnSessionClosed(const std::string& session_id) {
221 DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread());
222
223 ui_task_runner_->PostTask(FROM_HERE,
224 base::Bind(session_closed_cb_, session_id));
225 }
226
227 void MediaDrmProxy::OnLegacySessionError(const std::string& session_id,
228 MediaKeys::Exception exception_code,
229 uint32 system_code,
230 const std::string& error_message) {
231 DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread());
232
233 ui_task_runner_->PostTask(
234 FROM_HERE, base::Bind(legacy_session_error_cb_, session_id,
235 exception_code, system_code, error_message));
236 }
237
238 void MediaDrmProxy::OnSessionKeysChange(const std::string& session_id,
239 bool has_additional_usable_key,
240 CdmKeysInfo keys_info) {
241 DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread());
242
243 ui_task_runner_->PostTask(
244 FROM_HERE,
245 base::Bind(session_keys_change_cb_, session_id, has_additional_usable_key,
246 base::Passed(&keys_info)));
247 }
248
249 void MediaDrmProxy::OnSessionExpirationUpdate(
250 const std::string& session_id,
251 const base::Time& new_expiry_time) {
252 DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread());
253
254 ui_task_runner_->PostTask(FROM_HERE, base::Bind(session_expiration_update_cb_,
255 session_id, new_expiry_time));
256 }
257
258 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698