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 |