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..017c44c10ab8baf8e63817f10276fddd08b8574b 100644 |
| --- a/webkit/media/android/webmediaplayer_manager_android.cc |
| +++ b/webkit/media/android/webmediaplayer_manager_android.cc |
| @@ -6,10 +6,14 @@ |
| #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() {} |
| @@ -17,6 +21,7 @@ WebMediaPlayerManagerAndroid::~WebMediaPlayerManagerAndroid() {} |
| int WebMediaPlayerManagerAndroid::RegisterMediaPlayer( |
| WebMediaPlayerAndroid* player) { |
| MediaPlayerInfo info; |
| + info.is_active_ = false; |
| info.player = player; |
| media_players_[next_media_player_id_] = info; |
| return next_media_player_id_++; |
| @@ -27,15 +32,48 @@ void WebMediaPlayerManagerAndroid::UnregisterMediaPlayer(int player_id) { |
| media_players_.find(player_id); |
| DCHECK(iter != media_players_.end()); |
| + if ((iter->second).is_active_) |
| + num_active_players_--; |
| media_players_.erase(player_id); |
| } |
| +void WebMediaPlayerManagerAndroid::RequestMediaResources(int player_id) { |
| + std::map<int32, MediaPlayerInfo>::iterator iter = |
| + media_players_.find(player_id); |
| + DCHECK(iter != media_players_.end()); |
| + |
| + if ((iter->second).is_active_) |
| + 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, MediaPlayerInfo>::iterator player_it; |
| + for (player_it = media_players_.begin(); |
| + player_it != media_players_.end(); ++player_it) { |
| + if ((player_it->second).is_active_ |
| + && (player_it->second).player->paused()) { |
| + (player_it->second).player->ReleaseMediaResources(); |
| + (player_it->second).is_active_ = false; |
|
scherkus (not reviewing)
2012/06/07 19:33:17
do we need to track this state externally? doesn't
qinmin
2012/06/07 20:58:22
Not necessarily. I made the change to use WMPA::Is
|
| + num_active_players_--; |
| + } |
| + } |
| + } |
| + |
| + (iter->second).is_active_ = true; |
| + num_active_players_++; |
| +} |
| + |
| void WebMediaPlayerManagerAndroid::ReleaseMediaResources() { |
| std::map<int32, MediaPlayerInfo>::iterator player_it; |
| for (player_it = media_players_.begin(); |
| player_it != media_players_.end(); ++player_it) { |
| + (player_it->second).is_active_ = false; |
| (player_it->second).player->ReleaseMediaResources(); |
| } |
| + num_active_players_ = 0; |
| } |
| WebMediaPlayerAndroid* WebMediaPlayerManagerAndroid::GetMediaPlayer( |