Home | History | Annotate | Download | only in android
      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