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 3 // found in the LICENSE file. 4 5 #include "content/renderer/media/android/renderer_media_player_manager.h" 6 7 #include "content/renderer/media/android/webmediaplayer_android.h" 8 #include "ui/gfx/rect_f.h" 9 10 namespace content { 11 12 RendererMediaPlayerManager::RendererMediaPlayerManager() 13 : next_media_player_id_(0), 14 fullscreen_frame_(NULL) { 15 } 16 17 RendererMediaPlayerManager::~RendererMediaPlayerManager() { 18 std::map<int, WebMediaPlayerAndroid*>::iterator player_it; 19 for (player_it = media_players_.begin(); 20 player_it != media_players_.end(); ++player_it) { 21 WebMediaPlayerAndroid* player = player_it->second; 22 player->Detach(); 23 } 24 } 25 26 int RendererMediaPlayerManager::RegisterMediaPlayer( 27 WebMediaPlayerAndroid* player) { 28 media_players_[next_media_player_id_] = player; 29 return next_media_player_id_++; 30 } 31 32 void RendererMediaPlayerManager::UnregisterMediaPlayer(int player_id) { 33 media_players_.erase(player_id); 34 } 35 36 void RendererMediaPlayerManager::ReleaseVideoResources() { 37 std::map<int, WebMediaPlayerAndroid*>::iterator player_it; 38 for (player_it = media_players_.begin(); 39 player_it != media_players_.end(); ++player_it) { 40 WebMediaPlayerAndroid* player = player_it->second; 41 42 // Do not release if an audio track is still playing 43 if (player && (player->paused() || player->hasVideo())) 44 player->ReleaseMediaResources(); 45 } 46 } 47 48 WebMediaPlayerAndroid* RendererMediaPlayerManager::GetMediaPlayer( 49 int player_id) { 50 std::map<int, WebMediaPlayerAndroid*>::iterator iter = 51 media_players_.find(player_id); 52 if (iter != media_players_.end()) 53 return iter->second; 54 return NULL; 55 } 56 57 bool RendererMediaPlayerManager::CanEnterFullscreen(WebKit::WebFrame* frame) { 58 return !fullscreen_frame_ || IsInFullscreen(frame); 59 } 60 61 void RendererMediaPlayerManager::DidEnterFullscreen(WebKit::WebFrame* frame) { 62 fullscreen_frame_ = frame; 63 } 64 65 void RendererMediaPlayerManager::DidExitFullscreen() { 66 fullscreen_frame_ = NULL; 67 } 68 69 bool RendererMediaPlayerManager::IsInFullscreen(WebKit::WebFrame* frame) { 70 return fullscreen_frame_ == frame; 71 } 72 73 #if defined(GOOGLE_TV) 74 void RendererMediaPlayerManager::RetrieveGeometryChanges( 75 std::map<int, gfx::RectF>* changes) { 76 DCHECK(changes->empty()); 77 for (std::map<int, WebMediaPlayerAndroid*>::iterator player_it = 78 media_players_.begin(); 79 player_it != media_players_.end(); 80 ++player_it) { 81 WebMediaPlayerAndroid* player = player_it->second; 82 83 if (player && player->hasVideo()) { 84 gfx::RectF rect; 85 if (player->RetrieveGeometryChange(&rect)) { 86 (*changes)[player_it->first] = rect; 87 } 88 } 89 } 90 } 91 #endif 92 93 } // namespace content 94