From f2a97fc2b429e20028f51de7e91cbabbe88c1a2e Mon Sep 17 00:00:00 2001 From: "fischman@webrtc.org" Date: Wed, 10 Apr 2013 23:21:10 +0000 Subject: [PATCH] WebRTCDemo: handle stride!=width from first frame. Previously only mid-stream frames handled stride!=width correctly. BUG=1615 Review URL: https://webrtc-codereview.appspot.com/1304009 git-svn-id: http://webrtc.googlecode.com/svn/trunk@3821 4adac7df-926f-26a2-2b94-8c16560cd09d --- .../android/video_render_opengles20.cc | 57 +++++-------------- 1 file changed, 15 insertions(+), 42 deletions(-) diff --git a/webrtc/modules/video_render/android/video_render_opengles20.cc b/webrtc/modules/video_render/android/video_render_opengles20.cc index 2255005620..8e59a250aa 100644 --- a/webrtc/modules/video_render/android/video_render_opengles20.cc +++ b/webrtc/modules/video_render/android/video_render_opengles20.cc @@ -230,9 +230,7 @@ int32_t VideoRenderOpenGles20::Render(const I420VideoFrame& frameToRender) { _textureHeight != (GLsizei) frameToRender.height()) { SetupTextures(frameToRender); } - else { - UpdateTextures(frameToRender); - } + UpdateTextures(frameToRender); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, g_indices); checkGlError("glDrawArrays"); @@ -326,6 +324,17 @@ void VideoRenderOpenGles20::checkGlError(const char* op) { #endif } +static void InitializeTexture(int name, int id, int width, int height) { + glActiveTexture(name); + glBindTexture(GL_TEXTURE_2D, id); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, width, height, 0, + GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL); +} + void VideoRenderOpenGles20::SetupTextures(const I420VideoFrame& frameToRender) { WEBRTC_TRACE(kTraceDebug, kTraceVideoRenderer, _id, "%s: width %d, height %d", __FUNCTION__, @@ -335,46 +344,10 @@ void VideoRenderOpenGles20::SetupTextures(const I420VideoFrame& frameToRender) { const GLsizei height = frameToRender.height(); glGenTextures(3, _textureIds); //Generate the Y, U and V texture - GLuint currentTextureId = _textureIds[0]; // Y - glActiveTexture( GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, currentTextureId); + InitializeTexture(GL_TEXTURE0, _textureIds[0], width, height); + InitializeTexture(GL_TEXTURE1, _textureIds[1], width / 2, height / 2); + InitializeTexture(GL_TEXTURE2, _textureIds[2], width / 2, height / 2); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, width, height, 0, - GL_LUMINANCE, GL_UNSIGNED_BYTE, - (const GLvoid*) frameToRender.buffer(kYPlane)); - - currentTextureId = _textureIds[1]; // U - glActiveTexture( GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, currentTextureId); - - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - const uint8_t* uComponent = frameToRender.buffer(kUPlane); - glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, width / 2, height / 2, 0, - GL_LUMINANCE, GL_UNSIGNED_BYTE, (const GLvoid*) uComponent); - - currentTextureId = _textureIds[2]; // V - glActiveTexture( GL_TEXTURE2); - glBindTexture(GL_TEXTURE_2D, currentTextureId); - - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - const uint8_t* vComponent = frameToRender.buffer(kVPlane); - glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, width / 2, height / 2, 0, - GL_LUMINANCE, GL_UNSIGNED_BYTE, (const GLvoid*) vComponent); checkGlError("SetupTextures"); _textureWidth = width;