Index: content/renderer/media/android/webmediaplayer_android.cc |
diff --git a/content/renderer/media/android/webmediaplayer_android.cc b/content/renderer/media/android/webmediaplayer_android.cc |
index 5187d3f81d6358f24b0d326fbd2a8fca54d73c2e..616967921a3544689ff86e23029b67cc4bd60f09 100644 |
--- a/content/renderer/media/android/webmediaplayer_android.cc |
+++ b/content/renderer/media/android/webmediaplayer_android.cc |
@@ -637,8 +637,9 @@ void WebMediaPlayerAndroid::paint(blink::WebCanvas* canvas, |
unsigned textureId = static_cast<unsigned>( |
(bitmap_.getTexture())->getTextureHandle()); |
- if (!copyVideoTextureToPlatformTexture(context3D, textureId, |
- GL_RGBA, GL_UNSIGNED_BYTE, true, false)) { |
+ if (!copyVideoTextureToPlatformTexture(context3D, GL_TEXTURE_2D, textureId, |
+ GL_RGBA, GL_UNSIGNED_BYTE, 0, true, |
+ false)) { |
return; |
} |
@@ -663,6 +664,51 @@ bool WebMediaPlayerAndroid::copyVideoTextureToPlatformTexture( |
unsigned int type, |
bool premultiply_alpha, |
bool flip_y) { |
+ return copyVideoTextureToPlatformTexture(web_graphics_context, GL_TEXTURE_2D, |
+ texture, internal_format, type, 0, |
+ premultiply_alpha, flip_y); |
+} |
+ |
+bool WebMediaPlayerAndroid::copyVideoTextureToPlatformTexture( |
+ blink::WebGraphicsContext3D* web_graphics_context, |
+ unsigned int target, |
+ unsigned int texture, |
+ unsigned int internal_format, |
+ unsigned int type, |
+ int level, |
+ bool premultiply_alpha, |
+ bool flip_y) { |
+ return CopyVideoTextureToPlatformTextureInternal( |
+ web_graphics_context, true, target, texture, internal_format, type, level, |
+ 0, 0, premultiply_alpha, flip_y); |
+} |
+ |
+bool WebMediaPlayerAndroid::copyVideoSubTextureToPlatformTexture( |
+ blink::WebGraphicsContext3D* web_graphics_context, |
+ unsigned int target, |
+ unsigned int texture, |
+ int level, |
+ int xoffset, |
+ int yoffset, |
+ bool premultiply_alpha, |
+ bool flip_y) { |
+ return CopyVideoTextureToPlatformTextureInternal( |
+ web_graphics_context, false, target, texture, GL_FALSE, GL_FALSE, level, |
+ xoffset, yoffset, premultiply_alpha, flip_y); |
+} |
+ |
+bool WebMediaPlayerAndroid::CopyVideoTextureToPlatformTextureInternal( |
+ blink::WebGraphicsContext3D* web_graphics_context, |
+ bool is_full_copy, |
+ unsigned int target, |
+ unsigned int texture, |
+ unsigned int internal_format, |
+ unsigned int type, |
+ int level, |
+ int xoffset, |
+ int yoffset, |
+ bool premultiply_alpha, |
+ bool flip_y) { |
DCHECK(main_thread_checker_.CalledOnValidThread()); |
// Don't allow clients to copy an encrypted video frame. |
if (needs_external_surface_) |
@@ -694,9 +740,16 @@ bool WebMediaPlayerAndroid::copyVideoTextureToPlatformTexture( |
// 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->copyTextureCHROMIUM( |
- GL_TEXTURE_2D, src_texture, texture, internal_format, type, |
- flip_y, premultiply_alpha, false); |
+ if (is_full_copy) { |
piman
2015/09/04 17:34:29
nit: maybe DCHECK that xoffset/yoffset are 0 here?
|
+ web_graphics_context->copyTextureCHROMIUM(target, src_texture, texture, |
+ internal_format, type, flip_y, |
+ premultiply_alpha, false); |
+ } else { |
+ web_graphics_context->copySubTextureCHROMIUM( |
+ target, src_texture, texture, xoffset, yoffset, 0, 0, |
+ video_frame->natural_size().width(), |
+ video_frame->natural_size().height(), flip_y, premultiply_alpha, false); |
+ } |
web_graphics_context->deleteTexture(src_texture); |
web_graphics_context->flush(); |