diff options
Diffstat (limited to 'webkit')
7 files changed, 84 insertions, 5 deletions
diff --git a/webkit/media/android/webmediaplayer_android.cc b/webkit/media/android/webmediaplayer_android.cc index 78461ce..3dfa9f8 100644 --- a/webkit/media/android/webmediaplayer_android.cc +++ b/webkit/media/android/webmediaplayer_android.cc @@ -95,10 +95,12 @@ void WebMediaPlayerAndroid::cancelLoad() { } void WebMediaPlayerAndroid::play() { +#if defined(GOOGLE_TV) if (hasVideo() && needs_external_surface_) { DCHECK(!needs_establish_peer_); RequestExternalSurface(); } +#endif if (hasVideo() && needs_establish_peer_) EstablishSurfaceTexturePeer(); @@ -414,6 +416,7 @@ void WebMediaPlayerAndroid::OnVideoSizeChanged(int width, int height) { if (natural_size_.width == width && natural_size_.height == height) return; +#if defined(GOOGLE_TV) static bool has_switch = CommandLine::ForCurrentProcess()->HasSwitch( switches::kUseExternalVideoSurfaceThresholdInPixels); static int threshold = 0; @@ -430,6 +433,7 @@ void WebMediaPlayerAndroid::OnVideoSizeChanged(int width, int height) { if (!paused()) RequestExternalSurface(); } +#endif natural_size_.width = width; natural_size_.height = height; @@ -554,4 +558,27 @@ void WebMediaPlayerAndroid::UpdatePlayingState(bool is_playing) { is_playing_ = is_playing; } +#if defined(GOOGLE_TV) +bool WebMediaPlayerAndroid::RetrieveGeometryChange(gfx::RectF* rect) { + if (!video_weblayer_) + return false; + + // Compute the geometry of video frame layer. + cc::Layer* layer = video_weblayer_->layer(); + rect->set_size(layer->bounds()); + while (layer) { + rect->Offset(layer->position().OffsetFromOrigin()); + layer = layer->parent(); + } + + // Return false when the geometry hasn't been changed from the last time. + if (last_computed_rect_ == *rect) + return false; + + // Store the changed geometry information when it is actually changed. + last_computed_rect_ = *rect; + return true; +} +#endif + } // namespace webkit_media diff --git a/webkit/media/android/webmediaplayer_android.h b/webkit/media/android/webmediaplayer_android.h index 22c3895..b0371d5 100644 --- a/webkit/media/android/webmediaplayer_android.h +++ b/webkit/media/android/webmediaplayer_android.h @@ -17,6 +17,7 @@ #include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" #include "third_party/WebKit/Source/Platform/chromium/public/WebURL.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaPlayer.h" +#include "ui/gfx/rect_f.h" #include "webkit/media/android/stream_texture_factory_android.h" namespace webkit { @@ -149,6 +150,13 @@ class WebMediaPlayerAndroid // Detach the player from its manager. void Detach(); +#if defined(GOOGLE_TV) + // Retrieve geometry of the media player (i.e. location and size of the video + // frame) if changed. Returns true only if the geometry has been changed since + // the last call. + bool RetrieveGeometryChange(gfx::RectF* rect); +#endif + protected: // Construct a WebMediaPlayerAndroid object with reference to the // client, manager and stream texture factory. @@ -199,8 +207,10 @@ class WebMediaPlayerAndroid WebMediaPlayerManagerAndroid* manager() const { return manager_; } +#if defined(GOOGLE_TV) // Request external surface for out-of-band composition. virtual void RequestExternalSurface() = 0; +#endif private: void ReallocateVideoFrame(); @@ -275,6 +285,12 @@ class WebMediaPlayerAndroid scoped_ptr<webkit::WebLayerImpl> video_weblayer_; +#if defined(GOOGLE_TV) + // A rectangle represents the geometry of video frame, when computed last + // time. + gfx::RectF last_computed_rect_; +#endif + DISALLOW_COPY_AND_ASSIGN(WebMediaPlayerAndroid); }; diff --git a/webkit/media/android/webmediaplayer_impl_android.cc b/webkit/media/android/webmediaplayer_impl_android.cc index 083edd7..4011885 100644 --- a/webkit/media/android/webmediaplayer_impl_android.cc +++ b/webkit/media/android/webmediaplayer_impl_android.cc @@ -129,10 +129,12 @@ void WebMediaPlayerImplAndroid::Destroy() { proxy_ = NULL; } +#if defined(GOOGLE_TV) void WebMediaPlayerImplAndroid::RequestExternalSurface() { if (proxy_) proxy_->RequestExternalSurface(player_id()); } +#endif void WebMediaPlayerImplAndroid::SetVideoSurface(jobject j_surface) {} diff --git a/webkit/media/android/webmediaplayer_impl_android.h b/webkit/media/android/webmediaplayer_impl_android.h index aef6db4..ba2ef4d 100644 --- a/webkit/media/android/webmediaplayer_impl_android.h +++ b/webkit/media/android/webmediaplayer_impl_android.h @@ -68,7 +68,9 @@ class WebMediaPlayerImplAndroid : public WebMediaPlayerAndroid { virtual double GetCurrentTimeInternal() const OVERRIDE; virtual void ReleaseResourcesInternal() OVERRIDE; virtual void Destroy() OVERRIDE; +#if defined(GOOGLE_TV) virtual void RequestExternalSurface() OVERRIDE; +#endif WebKit::WebFrame* const frame_; diff --git a/webkit/media/android/webmediaplayer_manager_android.cc b/webkit/media/android/webmediaplayer_manager_android.cc index c64de25..80296d9 100644 --- a/webkit/media/android/webmediaplayer_manager_android.cc +++ b/webkit/media/android/webmediaplayer_manager_android.cc @@ -4,6 +4,7 @@ #include "webkit/media/android/webmediaplayer_manager_android.h" +#include "ui/gfx/rect_f.h" #include "webkit/media/android/webmediaplayer_android.h" namespace webkit_media { @@ -14,7 +15,7 @@ WebMediaPlayerManagerAndroid::WebMediaPlayerManagerAndroid() } WebMediaPlayerManagerAndroid::~WebMediaPlayerManagerAndroid() { - std::map<int32, WebMediaPlayerAndroid*>::iterator player_it; + std::map<int, WebMediaPlayerAndroid*>::iterator player_it; for (player_it = media_players_.begin(); player_it != media_players_.end(); ++player_it) { WebMediaPlayerAndroid* player = player_it->second; @@ -33,7 +34,7 @@ void WebMediaPlayerManagerAndroid::UnregisterMediaPlayer(int player_id) { } void WebMediaPlayerManagerAndroid::ReleaseMediaResources() { - std::map<int32, WebMediaPlayerAndroid*>::iterator player_it; + std::map<int, WebMediaPlayerAndroid*>::iterator player_it; for (player_it = media_players_.begin(); player_it != media_players_.end(); ++player_it) { WebMediaPlayerAndroid* player = player_it->second; @@ -46,7 +47,7 @@ void WebMediaPlayerManagerAndroid::ReleaseMediaResources() { WebMediaPlayerAndroid* WebMediaPlayerManagerAndroid::GetMediaPlayer( int player_id) { - std::map<int32, WebMediaPlayerAndroid*>::iterator iter = + std::map<int, WebMediaPlayerAndroid*>::iterator iter = media_players_.find(player_id); if (iter != media_players_.end()) return iter->second; @@ -69,4 +70,24 @@ bool WebMediaPlayerManagerAndroid::IsInFullscreen(WebKit::WebFrame* frame) { return fullscreen_frame_ == frame; } +#if defined(GOOGLE_TV) +void WebMediaPlayerManagerAndroid::RetrieveGeometryChanges( + std::map<int, gfx::RectF>* changes) { + DCHECK(changes->empty()); + for (std::map<int, WebMediaPlayerAndroid*>::iterator player_it = + media_players_.begin(); + player_it != media_players_.end(); + ++player_it) { + WebMediaPlayerAndroid* player = player_it->second; + + if (player && player->hasVideo()) { + gfx::RectF rect; + if (player->RetrieveGeometryChange(&rect)) { + (*changes)[player_it->first] = rect; + } + } + } +} +#endif + } // namespace webkit_media diff --git a/webkit/media/android/webmediaplayer_manager_android.h b/webkit/media/android/webmediaplayer_manager_android.h index ce345b7..30de485 100644 --- a/webkit/media/android/webmediaplayer_manager_android.h +++ b/webkit/media/android/webmediaplayer_manager_android.h @@ -13,6 +13,10 @@ namespace WebKit { class WebFrame; } +namespace gfx { +class RectF; +} + namespace webkit_media { class WebMediaPlayerAndroid; @@ -45,12 +49,17 @@ class WebMediaPlayerManagerAndroid { // Get the pointer to WebMediaPlayerAndroid given the |player_id|. WebMediaPlayerAndroid* GetMediaPlayer(int player_id); +#if defined(GOOGLE_TV) + // Get the list of media players with video geometry changes. + void RetrieveGeometryChanges(std::map<int, gfx::RectF>* changes); +#endif + private: // Info for all available WebMediaPlayerAndroid on a page; kept so that // we can enumerate them to send updates about tab focus and visibily. - std::map<int32, WebMediaPlayerAndroid*> media_players_; + std::map<int, WebMediaPlayerAndroid*> media_players_; - int32 next_media_player_id_; + int next_media_player_id_; // WebFrame of the fullscreen video. WebKit::WebFrame* fullscreen_frame_; diff --git a/webkit/media/android/webmediaplayer_proxy_android.h b/webkit/media/android/webmediaplayer_proxy_android.h index 9d7c9ad..2961c2f 100644 --- a/webkit/media/android/webmediaplayer_proxy_android.h +++ b/webkit/media/android/webmediaplayer_proxy_android.h @@ -45,8 +45,10 @@ class WebMediaPlayerProxyAndroid { // Request the player to exit fullscreen. virtual void ExitFullscreen(int player_id) = 0; +#if defined(GOOGLE_TV) // Request an external surface for out-of-band compositing. virtual void RequestExternalSurface(int player_id) = 0; +#endif }; } // namespace webkit_media |