Chromium Code Reviews| 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..14f12ce5a3cc2887543566e826f957ee3b10b045 100644 |
| --- a/webkit/media/android/webmediaplayer_manager_android.cc |
| +++ b/webkit/media/android/webmediaplayer_manager_android.cc |
| @@ -6,44 +6,76 @@ |
| #include "webkit/media/android/webmediaplayer_android.h" |
| +// The number of maximum active player allowed in a renderer. |
| +static const int kMaxMediaPlayerLimit = 2; |
| + |
| namespace webkit_media { |
| WebMediaPlayerManagerAndroid::WebMediaPlayerManagerAndroid() |
| - : next_media_player_id_(0) { |
| + : next_media_player_id_(0), |
| + num_active_players_(0) { |
| } |
| WebMediaPlayerManagerAndroid::~WebMediaPlayerManagerAndroid() {} |
|
scherkus (not reviewing)
2012/06/07 21:44:34
based on our discussion doesn't this rely on the s
qinmin
2012/06/08 17:09:06
Done.
|
| 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()); |
| + if ((iter->second)->IsInitialized()) |
| + num_active_players_--; |
| 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 (num_active_players_ >= kMaxMediaPlayerLimit) { |
| + 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(); |
| + num_active_players_--; |
| + } |
| + } |
| + } |
| + |
| + num_active_players_++; |
| +} |
| + |
| 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(); |
| } |
| + num_active_players_ = 0; |
|
scherkus (not reviewing)
2012/06/07 21:44:34
this is a scary/bug-prone design as you're manuall
qinmin
2012/06/08 17:09:06
Done.
|
| } |
| 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; |
| } |