Index: webkit/media/webmediaplayer_impl.cc |
diff --git a/webkit/media/webmediaplayer_impl.cc b/webkit/media/webmediaplayer_impl.cc |
index 804135b658bcfefad732d60d2c56c35e0580e914..a4bfe397248e9feb02e4b5dc46c83605228a566c 100644 |
--- a/webkit/media/webmediaplayer_impl.cc |
+++ b/webkit/media/webmediaplayer_impl.cc |
@@ -15,6 +15,7 @@ |
#include "base/metrics/histogram.h" |
#include "base/string_number_conversions.h" |
#include "base/synchronization/waitable_event.h" |
+#include "gpu/GLES2/gl2extchromium.h" |
#include "media/audio/null_audio_sink.h" |
#include "media/base/bind_to_loop.h" |
#include "media/base/filter_collection.h" |
@@ -670,6 +671,44 @@ void WebMediaPlayerImpl::putCurrentFrame( |
delete web_video_frame; |
} |
+bool WebMediaPlayerImpl::copyVideoTextureToPlatformTexture( |
+ WebKit::WebGraphicsContext3D* web_graphics_context, |
+ unsigned int texture, |
+ unsigned int level, |
+ unsigned int internal_format, |
+ bool premultiply_alpha, |
+ bool flip_y) { |
+ scoped_refptr<media::VideoFrame> video_frame; |
+ { |
+ base::AutoLock auto_lock(lock_); |
+ video_frame = current_frame_; |
+ } |
+ if (video_frame && |
+ video_frame->format() == media::VideoFrame::NATIVE_TEXTURE && |
+ video_frame->texture_target() == GL_TEXTURE_2D) { |
+ uint32 source_texture = video_frame->texture_id(); |
+ // The video is stored in a unmultiplied format, so premultiply |
+ // if necessary. |
+ web_graphics_context->pixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, |
+ premultiply_alpha); |
+ // Application itself needs to take care of setting the right flip_y |
+ // value down to get the expected result. |
+ // flip_y==true means to reverse the video orientation while |
+ // flip_y==false means to keep the intrinsic orientation. |
+ web_graphics_context->pixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, flip_y); |
+ web_graphics_context->copyTextureCHROMIUM(GL_TEXTURE_2D, |
+ source_texture, texture, level, internal_format); |
+ web_graphics_context->pixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, false); |
+ web_graphics_context->pixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, |
+ false); |
+ // The flush() operation is not necessary here. It is kept since the |
+ // performance will be better when it is added than not. |
+ web_graphics_context->flush(); |
+ return true; |
+ } |
+ return false; |
+} |
+ |
// Helper enum for reporting generateKeyRequest/addKey histograms. |
enum MediaKeyException { |
kUnknownResultId, |