| OLD | NEW |
| 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/browser/media/android/browser_media_player_manager.h" | 5 #include "content/browser/media/android/browser_media_player_manager.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "content/browser/android/content_view_core_impl.h" | 8 #include "content/browser/android/content_view_core_impl.h" |
| 9 #include "content/browser/media/android/browser_demuxer_android.h" | 9 #include "content/browser/media/android/browser_demuxer_android.h" |
| 10 #include "content/browser/media/android/media_resource_getter_impl.h" | 10 #include "content/browser/media/android/media_resource_getter_impl.h" |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 if (CommandLine::ForCurrentProcess()->HasSwitch( | 360 if (CommandLine::ForCurrentProcess()->HasSwitch( |
| 361 switches::kDisableGestureRequirementForMediaFullscreen)) { | 361 switches::kDisableGestureRequirementForMediaFullscreen)) { |
| 362 Send(new MediaPlayerMsg_RequestFullscreen(routing_id(), player_id)); | 362 Send(new MediaPlayerMsg_RequestFullscreen(routing_id(), player_id)); |
| 363 } | 363 } |
| 364 } | 364 } |
| 365 | 365 |
| 366 // The following 5 functions are EME MediaKeySession events. | 366 // The following 5 functions are EME MediaKeySession events. |
| 367 | 367 |
| 368 void BrowserMediaPlayerManager::OnSessionCreated( | 368 void BrowserMediaPlayerManager::OnSessionCreated( |
| 369 int media_keys_id, | 369 int media_keys_id, |
| 370 uint32 reference_id, | 370 uint32 session_id, |
| 371 const std::string& session_id) { | 371 const std::string& web_session_id) { |
| 372 Send(new MediaKeysMsg_SetSessionId( | 372 Send(new MediaKeysMsg_SetSessionId( |
| 373 routing_id(), media_keys_id, reference_id, session_id)); | 373 routing_id(), media_keys_id, session_id, web_session_id)); |
| 374 } | 374 } |
| 375 | 375 |
| 376 void BrowserMediaPlayerManager::OnSessionMessage( | 376 void BrowserMediaPlayerManager::OnSessionMessage( |
| 377 int media_keys_id, | 377 int media_keys_id, |
| 378 uint32 reference_id, | 378 uint32 session_id, |
| 379 const std::vector<uint8>& message, | 379 const std::vector<uint8>& message, |
| 380 const std::string& destination_url) { | 380 const std::string& destination_url) { |
| 381 Send(new MediaKeysMsg_KeyMessage( | 381 Send(new MediaKeysMsg_KeyMessage( |
| 382 routing_id(), media_keys_id, reference_id, message, destination_url)); | 382 routing_id(), media_keys_id, session_id, message, destination_url)); |
| 383 } | 383 } |
| 384 | 384 |
| 385 void BrowserMediaPlayerManager::OnSessionReady(int media_keys_id, | 385 void BrowserMediaPlayerManager::OnSessionReady(int media_keys_id, |
| 386 uint32 reference_id) { | 386 uint32 session_id) { |
| 387 Send(new MediaKeysMsg_KeyAdded(routing_id(), media_keys_id, reference_id)); | 387 Send(new MediaKeysMsg_KeyAdded(routing_id(), media_keys_id, session_id)); |
| 388 } | 388 } |
| 389 | 389 |
| 390 void BrowserMediaPlayerManager::OnSessionClosed(int media_keys_id, | 390 void BrowserMediaPlayerManager::OnSessionClosed(int media_keys_id, |
| 391 uint32 reference_id) { | 391 uint32 session_id) { |
| 392 // TODO(jrummell): Update Android calls and IPC names. | 392 // TODO(jrummell): Update Android calls and IPC names. |
| 393 } | 393 } |
| 394 | 394 |
| 395 void BrowserMediaPlayerManager::OnSessionError( | 395 void BrowserMediaPlayerManager::OnSessionError( |
| 396 int media_keys_id, | 396 int media_keys_id, |
| 397 uint32 reference_id, | 397 uint32 session_id, |
| 398 media::MediaKeys::KeyError error_code, | 398 media::MediaKeys::KeyError error_code, |
| 399 int system_code) { | 399 int system_code) { |
| 400 Send(new MediaKeysMsg_KeyError(routing_id(), media_keys_id, | 400 Send(new MediaKeysMsg_KeyError( |
| 401 reference_id, error_code, system_code)); | 401 routing_id(), media_keys_id, session_id, error_code, system_code)); |
| 402 } | 402 } |
| 403 | 403 |
| 404 #if defined(GOOGLE_TV) | 404 #if defined(GOOGLE_TV) |
| 405 void BrowserMediaPlayerManager::AttachExternalVideoSurface(int player_id, | 405 void BrowserMediaPlayerManager::AttachExternalVideoSurface(int player_id, |
| 406 jobject surface) { | 406 jobject surface) { |
| 407 MediaPlayerAndroid* player = GetPlayer(player_id); | 407 MediaPlayerAndroid* player = GetPlayer(player_id); |
| 408 if (player) { | 408 if (player) { |
| 409 player->SetVideoSurface( | 409 player->SetVideoSurface( |
| 410 gfx::ScopedJavaSurface::AcquireExternalSurface(surface)); | 410 gfx::ScopedJavaSurface::AcquireExternalSurface(surface)); |
| 411 } | 411 } |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 547 const std::vector<uint8>& uuid, | 547 const std::vector<uint8>& uuid, |
| 548 const GURL& frame_url) { | 548 const GURL& frame_url) { |
| 549 AddDrmBridge(media_keys_id, uuid, frame_url); | 549 AddDrmBridge(media_keys_id, uuid, frame_url); |
| 550 // In EME v0.1b MediaKeys lives in the media element. So the |media_keys_id| | 550 // In EME v0.1b MediaKeys lives in the media element. So the |media_keys_id| |
| 551 // is the same as the |player_id|. | 551 // is the same as the |player_id|. |
| 552 OnSetMediaKeys(media_keys_id, media_keys_id); | 552 OnSetMediaKeys(media_keys_id, media_keys_id); |
| 553 } | 553 } |
| 554 | 554 |
| 555 void BrowserMediaPlayerManager::OnGenerateKeyRequest( | 555 void BrowserMediaPlayerManager::OnGenerateKeyRequest( |
| 556 int media_keys_id, | 556 int media_keys_id, |
| 557 uint32 reference_id, | 557 uint32 session_id, |
| 558 const std::string& type, | 558 const std::string& type, |
| 559 const std::vector<uint8>& init_data) { | 559 const std::vector<uint8>& init_data) { |
| 560 if (CommandLine::ForCurrentProcess() | 560 if (CommandLine::ForCurrentProcess() |
| 561 ->HasSwitch(switches::kDisableInfobarForProtectedMediaIdentifier)) { | 561 ->HasSwitch(switches::kDisableInfobarForProtectedMediaIdentifier)) { |
| 562 GenerateKeyIfAllowed(media_keys_id, reference_id, type, init_data, true); | 562 GenerateKeyIfAllowed(media_keys_id, session_id, type, init_data, true); |
| 563 return; | 563 return; |
| 564 } | 564 } |
| 565 | 565 |
| 566 MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); | 566 MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); |
| 567 if (!drm_bridge) { | 567 if (!drm_bridge) { |
| 568 DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; | 568 DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; |
| 569 OnSessionError( | 569 OnSessionError( |
| 570 media_keys_id, reference_id, media::MediaKeys::kUnknownError, 0); | 570 media_keys_id, session_id, media::MediaKeys::kUnknownError, 0); |
| 571 return; | 571 return; |
| 572 } | 572 } |
| 573 | 573 |
| 574 if (media_keys_ids_approved_.find(media_keys_id) == | 574 if (media_keys_ids_approved_.find(media_keys_id) == |
| 575 media_keys_ids_approved_.end()) { | 575 media_keys_ids_approved_.end()) { |
| 576 media_keys_ids_pending_approval_.insert(media_keys_id); | 576 media_keys_ids_pending_approval_.insert(media_keys_id); |
| 577 } | 577 } |
| 578 web_contents()->GetDelegate()->RequestProtectedMediaIdentifierPermission( | 578 web_contents()->GetDelegate()->RequestProtectedMediaIdentifierPermission( |
| 579 web_contents(), | 579 web_contents(), |
| 580 drm_bridge->frame_url(), | 580 drm_bridge->frame_url(), |
| 581 base::Bind(&BrowserMediaPlayerManager::GenerateKeyIfAllowed, | 581 base::Bind(&BrowserMediaPlayerManager::GenerateKeyIfAllowed, |
| 582 weak_ptr_factory_.GetWeakPtr(), | 582 weak_ptr_factory_.GetWeakPtr(), |
| 583 media_keys_id, | 583 media_keys_id, |
| 584 reference_id, | 584 session_id, |
| 585 type, | 585 type, |
| 586 init_data)); | 586 init_data)); |
| 587 } | 587 } |
| 588 | 588 |
| 589 void BrowserMediaPlayerManager::OnAddKey(int media_keys_id, | 589 void BrowserMediaPlayerManager::OnAddKey(int media_keys_id, |
| 590 uint32 reference_id, | 590 uint32 session_id, |
| 591 const std::vector<uint8>& key, | 591 const std::vector<uint8>& key, |
| 592 const std::vector<uint8>& init_data) { | 592 const std::vector<uint8>& init_data) { |
| 593 MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); | 593 MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); |
| 594 if (!drm_bridge) { | 594 if (!drm_bridge) { |
| 595 DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; | 595 DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; |
| 596 OnSessionError( | 596 OnSessionError( |
| 597 media_keys_id, reference_id, media::MediaKeys::kUnknownError, 0); | 597 media_keys_id, session_id, media::MediaKeys::kUnknownError, 0); |
| 598 return; | 598 return; |
| 599 } | 599 } |
| 600 | 600 |
| 601 DCHECK(init_data.empty()); | 601 DCHECK(init_data.empty()); |
| 602 drm_bridge->UpdateSession(reference_id, &key[0], key.size()); | 602 drm_bridge->UpdateSession(session_id, &key[0], key.size()); |
| 603 // In EME v0.1b MediaKeys lives in the media element. So the |media_keys_id| | 603 // In EME v0.1b MediaKeys lives in the media element. So the |media_keys_id| |
| 604 // is the same as the |player_id|. | 604 // is the same as the |player_id|. |
| 605 // TODO(xhwang): Separate |media_keys_id| and |player_id|. | 605 // TODO(xhwang): Separate |media_keys_id| and |player_id|. |
| 606 MediaPlayerAndroid* player = GetPlayer(media_keys_id); | 606 MediaPlayerAndroid* player = GetPlayer(media_keys_id); |
| 607 if (player) | 607 if (player) |
| 608 player->OnKeyAdded(); | 608 player->OnKeyAdded(); |
| 609 } | 609 } |
| 610 | 610 |
| 611 void BrowserMediaPlayerManager::OnCancelKeyRequest( | 611 void BrowserMediaPlayerManager::OnCancelKeyRequest(int media_keys_id, |
| 612 int media_keys_id, | 612 uint32 session_id) { |
| 613 uint32 reference_id) { | |
| 614 MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); | 613 MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); |
| 615 if (!drm_bridge) { | 614 if (!drm_bridge) { |
| 616 DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; | 615 DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; |
| 617 OnSessionError( | 616 OnSessionError( |
| 618 media_keys_id, reference_id, media::MediaKeys::kUnknownError, 0); | 617 media_keys_id, session_id, media::MediaKeys::kUnknownError, 0); |
| 619 return; | 618 return; |
| 620 } | 619 } |
| 621 | 620 |
| 622 drm_bridge->ReleaseSession(reference_id); | 621 drm_bridge->ReleaseSession(session_id); |
| 623 } | 622 } |
| 624 | 623 |
| 625 void BrowserMediaPlayerManager::AddPlayer(MediaPlayerAndroid* player) { | 624 void BrowserMediaPlayerManager::AddPlayer(MediaPlayerAndroid* player) { |
| 626 DCHECK(!GetPlayer(player->player_id())); | 625 DCHECK(!GetPlayer(player->player_id())); |
| 627 players_.push_back(player); | 626 players_.push_back(player); |
| 628 if (player->IsRemote()) { | 627 if (player->IsRemote()) { |
| 629 Send(new MediaPlayerMsg_ConnectedToRemoteDevice(routing_id(), | 628 Send(new MediaPlayerMsg_ConnectedToRemoteDevice(routing_id(), |
| 630 player->player_id())); | 629 player->player_id())); |
| 631 } | 630 } |
| 632 } | 631 } |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 709 DVLOG(1) << "OnSetMediaKeys(): Player and MediaKeys must be present."; | 708 DVLOG(1) << "OnSetMediaKeys(): Player and MediaKeys must be present."; |
| 710 return; | 709 return; |
| 711 } | 710 } |
| 712 // TODO(qinmin): add the logic to decide whether we should create the | 711 // TODO(qinmin): add the logic to decide whether we should create the |
| 713 // fullscreen surface for EME lv1. | 712 // fullscreen surface for EME lv1. |
| 714 player->SetDrmBridge(drm_bridge); | 713 player->SetDrmBridge(drm_bridge); |
| 715 } | 714 } |
| 716 | 715 |
| 717 void BrowserMediaPlayerManager::GenerateKeyIfAllowed( | 716 void BrowserMediaPlayerManager::GenerateKeyIfAllowed( |
| 718 int media_keys_id, | 717 int media_keys_id, |
| 719 uint32 reference_id, | 718 uint32 session_id, |
| 720 const std::string& type, | 719 const std::string& type, |
| 721 const std::vector<uint8>& init_data, | 720 const std::vector<uint8>& init_data, |
| 722 bool allowed) { | 721 bool allowed) { |
| 723 if (!allowed) | 722 if (!allowed) |
| 724 return; | 723 return; |
| 725 | 724 |
| 726 MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); | 725 MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); |
| 727 if (!drm_bridge) { | 726 if (!drm_bridge) { |
| 728 DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; | 727 DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; |
| 729 OnSessionError( | 728 OnSessionError( |
| 730 media_keys_id, reference_id, media::MediaKeys::kUnknownError, 0); | 729 media_keys_id, session_id, media::MediaKeys::kUnknownError, 0); |
| 731 return; | 730 return; |
| 732 } | 731 } |
| 733 media_keys_ids_pending_approval_.erase(media_keys_id); | 732 media_keys_ids_pending_approval_.erase(media_keys_id); |
| 734 media_keys_ids_approved_.insert(media_keys_id); | 733 media_keys_ids_approved_.insert(media_keys_id); |
| 735 drm_bridge->CreateSession( | 734 drm_bridge->CreateSession(session_id, type, &init_data[0], init_data.size()); |
| 736 reference_id, type, &init_data[0], init_data.size()); | |
| 737 | 735 |
| 738 // TODO(qinmin): currently |media_keys_id| and player ID are identical. | 736 // TODO(qinmin): currently |media_keys_id| and player ID are identical. |
| 739 // This might not be true in the future. | 737 // This might not be true in the future. |
| 740 if (pending_fullscreen_player_id_ != media_keys_id) | 738 if (pending_fullscreen_player_id_ != media_keys_id) |
| 741 return; | 739 return; |
| 742 | 740 |
| 743 pending_fullscreen_player_id_ = -1; | 741 pending_fullscreen_player_id_ = -1; |
| 744 MediaPlayerAndroid* player = GetPlayer(media_keys_id); | 742 MediaPlayerAndroid* player = GetPlayer(media_keys_id); |
| 745 if (player->IsPlaying()) | 743 if (player->IsPlaying()) |
| 746 OnProtectedSurfaceRequested(media_keys_id); | 744 OnProtectedSurfaceRequested(media_keys_id); |
| 747 } | 745 } |
| 748 | 746 |
| 749 } // namespace content | 747 } // namespace content |
| OLD | NEW |