OLD | NEW |
---|---|
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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 "media/base/android/media_drm_bridge.h" | 5 #include "media/base/android/media_drm_bridge.h" |
6 | 6 |
7 #include "base/android/build_info.h" | 7 #include "base/android/build_info.h" |
8 #include "base/android/jni_array.h" | 8 #include "base/android/jni_array.h" |
9 #include "base/android/jni_string.h" | 9 #include "base/android/jni_string.h" |
10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
229 env, j_scheme_uuid.obj(), j_security_level.obj(), | 229 env, j_scheme_uuid.obj(), j_security_level.obj(), |
230 reinterpret_cast<intptr_t>(this))); | 230 reinterpret_cast<intptr_t>(this))); |
231 } | 231 } |
232 | 232 |
233 MediaDrmBridge::~MediaDrmBridge() { | 233 MediaDrmBridge::~MediaDrmBridge() { |
234 JNIEnv* env = AttachCurrentThread(); | 234 JNIEnv* env = AttachCurrentThread(); |
235 if (!j_media_drm_.is_null()) | 235 if (!j_media_drm_.is_null()) |
236 Java_MediaDrmBridge_release(env, j_media_drm_.obj()); | 236 Java_MediaDrmBridge_release(env, j_media_drm_.obj()); |
237 } | 237 } |
238 | 238 |
239 bool MediaDrmBridge::CreateSession(uint32 reference_id, | 239 bool MediaDrmBridge::CreateSession(uint32 session_id, |
240 const std::string& type, | 240 const std::string& type, |
241 const uint8* init_data, | 241 const uint8* init_data, |
242 int init_data_length) { | 242 int init_data_length) { |
243 std::vector<uint8> pssh_data; | 243 std::vector<uint8> pssh_data; |
244 if (!GetPsshData(init_data, init_data_length, scheme_uuid_, &pssh_data)) | 244 if (!GetPsshData(init_data, init_data_length, scheme_uuid_, &pssh_data)) |
245 return false; | 245 return false; |
246 | 246 |
247 JNIEnv* env = AttachCurrentThread(); | 247 JNIEnv* env = AttachCurrentThread(); |
248 ScopedJavaLocalRef<jbyteArray> j_pssh_data = | 248 ScopedJavaLocalRef<jbyteArray> j_pssh_data = |
249 base::android::ToJavaByteArray(env, &pssh_data[0], pssh_data.size()); | 249 base::android::ToJavaByteArray(env, &pssh_data[0], pssh_data.size()); |
250 ScopedJavaLocalRef<jstring> j_mime = ConvertUTF8ToJavaString(env, type); | 250 ScopedJavaLocalRef<jstring> j_mime = ConvertUTF8ToJavaString(env, type); |
251 pending_key_request_reference_ids_.push(reference_id); | 251 pending_key_request_session_ids_.push(session_id); |
252 Java_MediaDrmBridge_generateKeyRequest( | 252 Java_MediaDrmBridge_generateKeyRequest( |
253 env, j_media_drm_.obj(), j_pssh_data.obj(), j_mime.obj()); | 253 env, j_media_drm_.obj(), j_pssh_data.obj(), j_mime.obj()); |
254 return true; | 254 return true; |
255 } | 255 } |
256 | 256 |
257 void MediaDrmBridge::UpdateSession(uint32 reference_id, | 257 void MediaDrmBridge::UpdateSession(uint32 session_id, |
258 const uint8* response, | 258 const uint8* response, |
259 int response_length) { | 259 int response_length) { |
260 DVLOG(1) << __FUNCTION__; | 260 DVLOG(1) << __FUNCTION__; |
261 JNIEnv* env = AttachCurrentThread(); | 261 JNIEnv* env = AttachCurrentThread(); |
262 ScopedJavaLocalRef<jbyteArray> j_response = | 262 ScopedJavaLocalRef<jbyteArray> j_response = |
263 base::android::ToJavaByteArray(env, response, response_length); | 263 base::android::ToJavaByteArray(env, response, response_length); |
264 ScopedJavaLocalRef<jstring> j_session_id = | 264 ScopedJavaLocalRef<jstring> j_session_id = |
265 ConvertUTF8ToJavaString(env, LookupSessionId(reference_id)); | 265 ConvertUTF8ToJavaString(env, LookupSessionId(session_id)); |
266 // TODO(jrummell): Update Android names to match new functionality. | 266 // TODO(jrummell): Update Android names to match new functionality. |
267 Java_MediaDrmBridge_addKey( | 267 Java_MediaDrmBridge_addKey( |
268 env, j_media_drm_.obj(), j_session_id.obj(), j_response.obj()); | 268 env, j_media_drm_.obj(), j_session_id.obj(), j_response.obj()); |
269 } | 269 } |
270 | 270 |
271 void MediaDrmBridge::ReleaseSession(uint32 reference_id) { | 271 void MediaDrmBridge::ReleaseSession(uint32 session_id) { |
272 JNIEnv* env = AttachCurrentThread(); | 272 JNIEnv* env = AttachCurrentThread(); |
273 ScopedJavaLocalRef<jstring> j_session_id = | 273 ScopedJavaLocalRef<jstring> j_session_id = |
274 ConvertUTF8ToJavaString(env, LookupSessionId(reference_id)); | 274 ConvertUTF8ToJavaString(env, LookupSessionId(session_id)); |
275 Java_MediaDrmBridge_cancelKeyRequest( | 275 Java_MediaDrmBridge_cancelKeyRequest( |
276 env, j_media_drm_.obj(), j_session_id.obj()); | 276 env, j_media_drm_.obj(), j_session_id.obj()); |
277 } | 277 } |
278 | 278 |
279 void MediaDrmBridge::SetMediaCryptoReadyCB(const base::Closure& closure) { | 279 void MediaDrmBridge::SetMediaCryptoReadyCB(const base::Closure& closure) { |
280 if (closure.is_null()) { | 280 if (closure.is_null()) { |
281 media_crypto_ready_cb_.Reset(); | 281 media_crypto_ready_cb_.Reset(); |
282 return; | 282 return; |
283 } | 283 } |
284 | 284 |
(...skipping 11 matching lines...) Expand all Loading... | |
296 DCHECK(!GetMediaCrypto().is_null()); | 296 DCHECK(!GetMediaCrypto().is_null()); |
297 if (!media_crypto_ready_cb_.is_null()) | 297 if (!media_crypto_ready_cb_.is_null()) |
298 base::ResetAndReturn(&media_crypto_ready_cb_).Run(); | 298 base::ResetAndReturn(&media_crypto_ready_cb_).Run(); |
299 } | 299 } |
300 | 300 |
301 void MediaDrmBridge::OnKeyMessage(JNIEnv* env, | 301 void MediaDrmBridge::OnKeyMessage(JNIEnv* env, |
302 jobject j_media_drm, | 302 jobject j_media_drm, |
303 jstring j_session_id, | 303 jstring j_session_id, |
304 jbyteArray j_message, | 304 jbyteArray j_message, |
305 jstring j_destination_url) { | 305 jstring j_destination_url) { |
306 std::string session_id = ConvertJavaStringToUTF8(env, j_session_id); | 306 std::string web_session_id = ConvertJavaStringToUTF8(env, j_session_id); |
307 uint32_t reference_id = DetermineReferenceId(session_id); | 307 uint32_t session_id = DetermineReferenceId(web_session_id); |
308 std::vector<uint8> message; | 308 std::vector<uint8> message; |
309 JavaByteArrayToByteVector(env, j_message, &message); | 309 JavaByteArrayToByteVector(env, j_message, &message); |
310 std::string destination_url = ConvertJavaStringToUTF8(env, j_destination_url); | 310 std::string destination_url = ConvertJavaStringToUTF8(env, j_destination_url); |
311 | 311 |
312 manager_->OnSessionCreated(media_keys_id_, reference_id, session_id); | 312 manager_->OnSessionCreated(media_keys_id_, session_id, web_session_id); |
313 manager_->OnSessionMessage( | 313 manager_->OnSessionMessage( |
314 media_keys_id_, reference_id, message, destination_url); | 314 media_keys_id_, session_id, message, destination_url); |
315 } | 315 } |
316 | 316 |
317 void MediaDrmBridge::OnKeyAdded(JNIEnv* env, jobject, jstring j_session_id) { | 317 void MediaDrmBridge::OnKeyAdded(JNIEnv* env, jobject, jstring j_session_id) { |
318 std::string session_id = ConvertJavaStringToUTF8(env, j_session_id); | 318 std::string web_session_id = ConvertJavaStringToUTF8(env, j_session_id); |
ddorwin
2013/12/05 00:44:52
Is MediaDrm passing us sessionId instead of "refer
xhwang
2013/12/05 18:51:37
I'll fix MediaDrmBridge so that it'll pass back a
| |
319 uint32_t reference_id = DetermineReferenceId(session_id); | 319 uint32_t session_id = DetermineReferenceId(web_session_id); |
320 manager_->OnSessionReady(media_keys_id_, reference_id); | 320 manager_->OnSessionReady(media_keys_id_, session_id); |
321 } | 321 } |
322 | 322 |
323 void MediaDrmBridge::OnKeyError(JNIEnv* env, jobject, jstring j_session_id) { | 323 void MediaDrmBridge::OnKeyError(JNIEnv* env, jobject, jstring j_session_id) { |
324 // |j_session_id| can be NULL, in which case we'll return an empty string. | 324 // |j_session_id| can be NULL, in which case we'll return an empty string. |
325 std::string session_id = ConvertJavaStringToUTF8(env, j_session_id); | 325 std::string web_session_id = ConvertJavaStringToUTF8(env, j_session_id); |
326 uint32 reference_id = DetermineReferenceId(session_id); | 326 uint32 session_id = DetermineReferenceId(web_session_id); |
327 manager_->OnSessionError( | 327 manager_->OnSessionError( |
328 media_keys_id_, reference_id, MediaKeys::kUnknownError, 0); | 328 media_keys_id_, session_id, MediaKeys::kUnknownError, 0); |
329 } | 329 } |
330 | 330 |
331 ScopedJavaLocalRef<jobject> MediaDrmBridge::GetMediaCrypto() { | 331 ScopedJavaLocalRef<jobject> MediaDrmBridge::GetMediaCrypto() { |
332 JNIEnv* env = AttachCurrentThread(); | 332 JNIEnv* env = AttachCurrentThread(); |
333 return Java_MediaDrmBridge_getMediaCrypto(env, j_media_drm_.obj()); | 333 return Java_MediaDrmBridge_getMediaCrypto(env, j_media_drm_.obj()); |
334 } | 334 } |
335 | 335 |
336 // static | 336 // static |
337 bool MediaDrmBridge::IsSecureDecoderRequired(SecurityLevel security_level) { | 337 bool MediaDrmBridge::IsSecureDecoderRequired(SecurityLevel security_level) { |
338 return MediaDrmBridge::SECURITY_LEVEL_1 == security_level; | 338 return MediaDrmBridge::SECURITY_LEVEL_1 == security_level; |
(...skipping 28 matching lines...) Expand all Loading... | |
367 uint32_t MediaDrmBridge::DetermineReferenceId(const std::string& session_id) { | 367 uint32_t MediaDrmBridge::DetermineReferenceId(const std::string& session_id) { |
368 for (SessionMap::iterator it = session_map_.begin(); | 368 for (SessionMap::iterator it = session_map_.begin(); |
369 it != session_map_.end(); | 369 it != session_map_.end(); |
370 ++it) { | 370 ++it) { |
371 if (it->second == session_id) | 371 if (it->second == session_id) |
372 return it->first; | 372 return it->first; |
373 } | 373 } |
374 | 374 |
375 // There is no entry in the map; assume it came from the oldest | 375 // There is no entry in the map; assume it came from the oldest |
376 // GenerateKeyRequest() call. | 376 // GenerateKeyRequest() call. |
377 DCHECK(!pending_key_request_reference_ids_.empty()); | 377 DCHECK(!pending_key_request_session_ids_.empty()); |
378 uint32 reference_id = pending_key_request_reference_ids_.front(); | 378 uint32 session_reference_id = pending_key_request_session_ids_.front(); |
379 pending_key_request_reference_ids_.pop(); | 379 pending_key_request_session_ids_.pop(); |
380 | 380 |
381 // If this is a valid |session_id|, add it to the list. Otherwise, avoid | 381 // If this is a valid |session_id|, add it to the list. Otherwise, avoid |
382 // adding empty string as a mapping to prevent future calls with an empty | 382 // adding empty string as a mapping to prevent future calls with an empty |
383 // string from using the wrong reference_id. | 383 // string from using the wrong session_reference_id. |
384 if (!session_id.empty()) { | 384 if (!session_id.empty()) { |
385 DCHECK(session_map_.find(reference_id) == session_map_.end()); | 385 DCHECK(session_map_.find(session_reference_id) == session_map_.end()); |
386 DCHECK(!session_id.empty()); | 386 session_map_[session_reference_id] = session_id; |
387 session_map_[reference_id] = session_id; | |
388 } | 387 } |
389 | 388 |
390 return reference_id; | 389 return session_reference_id; |
391 } | 390 } |
392 | 391 |
393 const std::string& MediaDrmBridge::LookupSessionId(uint32 reference_id) { | 392 const std::string& MediaDrmBridge::LookupSessionId(uint32 session_id) { |
394 // Session may not exist if error happens during GenerateKeyRequest(). | 393 // Session may not exist if error happens during GenerateKeyRequest(). |
395 SessionMap::iterator it = session_map_.find(reference_id); | 394 SessionMap::iterator it = session_map_.find(session_id); |
396 return (it != session_map_.end()) ? it->second : base::EmptyString(); | 395 return (it != session_map_.end()) ? it->second : base::EmptyString(); |
397 } | 396 } |
398 | 397 |
399 } // namespace media | 398 } // namespace media |
OLD | NEW |