Index: webkit/media/android/webmediaplayer_manager_android.cc |
diff --git a/webkit/media/android/webmediaplayer_manager_android.cc b/webkit/media/android/webmediaplayer_manager_android.cc |
index 93c9733d20d0be68aac4b2738da7b0620203bd4e..4d2ae88ef6f3b07ebe9aefd7f26fd4d8ea24638b 100644 |
--- a/webkit/media/android/webmediaplayer_manager_android.cc |
+++ b/webkit/media/android/webmediaplayer_manager_android.cc |
@@ -6,44 +6,82 @@ |
#include "webkit/media/android/webmediaplayer_android.h" |
+// Threshold on the number of media players per renderer before we start |
+// attempting to release inactive media players. |
+static const int kMediaPlayerThreshold = 2; |
+ |
namespace webkit_media { |
WebMediaPlayerManagerAndroid::WebMediaPlayerManagerAndroid() |
: next_media_player_id_(0) { |
} |
-WebMediaPlayerManagerAndroid::~WebMediaPlayerManagerAndroid() {} |
+WebMediaPlayerManagerAndroid::~WebMediaPlayerManagerAndroid() { |
+ ReleaseMediaResources(); |
+} |
int WebMediaPlayerManagerAndroid::RegisterMediaPlayer( |
WebMediaPlayerAndroid* player) { |
- MediaPlayerInfo info; |
- info.player = player; |
- media_players_[next_media_player_id_] = info; |
+ media_players_[next_media_player_id_] = player; |
return next_media_player_id_++; |
} |
void WebMediaPlayerManagerAndroid::UnregisterMediaPlayer(int player_id) { |
- std::map<int32, MediaPlayerInfo>::iterator iter = |
+ std::map<int32, WebMediaPlayerAndroid*>::iterator iter = |
media_players_.find(player_id); |
DCHECK(iter != media_players_.end()); |
media_players_.erase(player_id); |
} |
+void WebMediaPlayerManagerAndroid::RequestMediaResources(int player_id) { |
+ std::map<int32, WebMediaPlayerAndroid*>::iterator iter = |
+ media_players_.find(player_id); |
+ DCHECK(iter != media_players_.end()); |
+ |
+ if ((iter->second)->IsInitialized()) |
+ return; |
+ |
+ // Release active players that are paused. Because we only release paused |
+ // players, the number of running players could go beyond the limit. |
+ // TODO(qinmin): we should use LRU to release the oldest player if we are |
+ // reaching hardware limit. |
+ if (GetActivePlayerCount() < kMediaPlayerThreshold) |
+ return; |
+ |
+ std::map<int32, WebMediaPlayerAndroid*>::iterator player_it; |
+ for (player_it = media_players_.begin(); |
+ player_it != media_players_.end(); ++player_it) { |
+ WebMediaPlayerAndroid* player = player_it->second; |
+ if (player->IsInitialized() && player->paused()) |
+ player->ReleaseMediaResources(); |
+ } |
+} |
+ |
void WebMediaPlayerManagerAndroid::ReleaseMediaResources() { |
- std::map<int32, MediaPlayerInfo>::iterator player_it; |
+ std::map<int32, WebMediaPlayerAndroid*>::iterator player_it; |
for (player_it = media_players_.begin(); |
player_it != media_players_.end(); ++player_it) { |
- (player_it->second).player->ReleaseMediaResources(); |
+ (player_it->second)->ReleaseMediaResources(); |
+ } |
+} |
+ |
+int32 WebMediaPlayerManagerAndroid::GetActivePlayerCount() { |
+ int32 count = 0; |
+ std::map<int32, WebMediaPlayerAndroid*>::iterator iter; |
+ for (iter = media_players_.begin(); iter != media_players_.end(); ++iter) { |
+ if ((iter->second)->IsInitialized()) |
+ count++; |
} |
+ return count; |
} |
WebMediaPlayerAndroid* WebMediaPlayerManagerAndroid::GetMediaPlayer( |
int player_id) { |
- std::map<int32, MediaPlayerInfo>::iterator iter = |
+ std::map<int32, WebMediaPlayerAndroid*>::iterator iter = |
media_players_.find(player_id); |
if (iter != media_players_.end()) |
- return (iter->second).player; |
+ return iter->second; |
return NULL; |
} |