Chromium Code Reviews| 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 |