| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/tools/player_x11/gl_video_renderer.h" | 5 #include "media/tools/player_x11/gl_video_renderer.h" |
| 6 | 6 |
| 7 #include <X11/Xutil.h> | 7 #include <X11/Xutil.h> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 gl_context_(NULL) { | 114 gl_context_(NULL) { |
| 115 } | 115 } |
| 116 | 116 |
| 117 GlVideoRenderer::~GlVideoRenderer() { | 117 GlVideoRenderer::~GlVideoRenderer() { |
| 118 glXMakeCurrent(display_, 0, NULL); | 118 glXMakeCurrent(display_, 0, NULL); |
| 119 glXDestroyContext(display_, gl_context_); | 119 glXDestroyContext(display_, gl_context_); |
| 120 } | 120 } |
| 121 | 121 |
| 122 void GlVideoRenderer::Paint(media::VideoFrame* video_frame) { | 122 void GlVideoRenderer::Paint(media::VideoFrame* video_frame) { |
| 123 if (!gl_context_) | 123 if (!gl_context_) |
| 124 Initialize(video_frame->data_size().width(), | 124 Initialize(video_frame->coded_size(), video_frame->visible_rect()); |
| 125 video_frame->data_size().height()); | |
| 126 | 125 |
| 127 // Convert YUV frame to RGB. | 126 // Convert YUV frame to RGB. |
| 128 DCHECK(video_frame->format() == media::VideoFrame::YV12 || | 127 DCHECK(video_frame->format() == media::VideoFrame::YV12 || |
| 129 video_frame->format() == media::VideoFrame::YV16); | 128 video_frame->format() == media::VideoFrame::YV16); |
| 130 DCHECK(video_frame->stride(media::VideoFrame::kUPlane) == | 129 DCHECK(video_frame->stride(media::VideoFrame::kUPlane) == |
| 131 video_frame->stride(media::VideoFrame::kVPlane)); | 130 video_frame->stride(media::VideoFrame::kVPlane)); |
| 132 | 131 |
| 133 if (glXGetCurrentContext() != gl_context_ || | 132 if (glXGetCurrentContext() != gl_context_ || |
| 134 glXGetCurrentDrawable() != window_) { | 133 glXGetCurrentDrawable() != window_) { |
| 135 glXMakeCurrent(display_, window_, gl_context_); | 134 glXMakeCurrent(display_, window_, gl_context_); |
| 136 } | 135 } |
| 137 for (unsigned int i = 0; i < kNumYUVPlanes; ++i) { | 136 for (unsigned int i = 0; i < kNumYUVPlanes; ++i) { |
| 138 unsigned int width = video_frame->stride(i); | 137 unsigned int width = video_frame->stride(i); |
| 139 unsigned int height = video_frame->rows(i); | 138 unsigned int height = video_frame->rows(i); |
| 140 glActiveTexture(GL_TEXTURE0 + i); | 139 glActiveTexture(GL_TEXTURE0 + i); |
| 141 glPixelStorei(GL_UNPACK_ROW_LENGTH, video_frame->stride(i)); | 140 glPixelStorei(GL_UNPACK_ROW_LENGTH, video_frame->stride(i)); |
| 142 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, width, height, 0, | 141 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, width, height, 0, |
| 143 GL_LUMINANCE, GL_UNSIGNED_BYTE, video_frame->data(i)); | 142 GL_LUMINANCE, GL_UNSIGNED_BYTE, video_frame->data(i)); |
| 144 } | 143 } |
| 145 | 144 |
| 146 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); | 145 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); |
| 147 glXSwapBuffers(display_, window_); | 146 glXSwapBuffers(display_, window_); |
| 148 } | 147 } |
| 149 | 148 |
| 150 void GlVideoRenderer::Initialize(int width, int height) { | 149 void GlVideoRenderer::Initialize(gfx::Size coded_size, gfx::Rect visible_rect) { |
| 151 CHECK(!gl_context_); | 150 CHECK(!gl_context_); |
| 152 LOG(INFO) << "Initializing GL Renderer..."; | 151 LOG(INFO) << "Initializing GL Renderer..."; |
| 153 | 152 |
| 154 // Resize the window to fit that of the video. | 153 // Resize the window to fit that of the video. |
| 155 XResizeWindow(display_, window_, width, height); | 154 XResizeWindow(display_, window_, visible_rect.width(), visible_rect.height()); |
| 156 | 155 |
| 157 gl_context_ = InitGLContext(display_, window_); | 156 gl_context_ = InitGLContext(display_, window_); |
| 158 CHECK(gl_context_) << "Failed to initialize GL context"; | 157 CHECK(gl_context_) << "Failed to initialize GL context"; |
| 159 | 158 |
| 160 // Create 3 textures, one for each plane, and bind them to different | 159 // Create 3 textures, one for each plane, and bind them to different |
| 161 // texture units. | 160 // texture units. |
| 162 glGenTextures(3, textures_); | 161 glGenTextures(3, textures_); |
| 163 glActiveTexture(GL_TEXTURE0); | 162 glActiveTexture(GL_TEXTURE0); |
| 164 glBindTexture(GL_TEXTURE_2D, textures_[0]); | 163 glBindTexture(GL_TEXTURE_2D, textures_[0]); |
| 165 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | 164 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 234 glUniform1i(glGetUniformLocation(program, "v_tex"), 2); | 233 glUniform1i(glGetUniformLocation(program, "v_tex"), 2); |
| 235 int yuv2rgb_location = glGetUniformLocation(program, "yuv2rgb"); | 234 int yuv2rgb_location = glGetUniformLocation(program, "yuv2rgb"); |
| 236 glUniformMatrix3fv(yuv2rgb_location, 1, GL_TRUE, kYUV2RGB); | 235 glUniformMatrix3fv(yuv2rgb_location, 1, GL_TRUE, kYUV2RGB); |
| 237 | 236 |
| 238 int pos_location = glGetAttribLocation(program, "in_pos"); | 237 int pos_location = glGetAttribLocation(program, "in_pos"); |
| 239 glEnableVertexAttribArray(pos_location); | 238 glEnableVertexAttribArray(pos_location); |
| 240 glVertexAttribPointer(pos_location, 2, GL_FLOAT, GL_FALSE, 0, kVertices); | 239 glVertexAttribPointer(pos_location, 2, GL_FLOAT, GL_FALSE, 0, kVertices); |
| 241 | 240 |
| 242 int tc_location = glGetAttribLocation(program, "in_tc"); | 241 int tc_location = glGetAttribLocation(program, "in_tc"); |
| 243 glEnableVertexAttribArray(tc_location); | 242 glEnableVertexAttribArray(tc_location); |
| 244 glVertexAttribPointer(tc_location, 2, GL_FLOAT, GL_FALSE, 0, | 243 float verts[8]; |
| 245 kTextureCoords); | 244 float x0 = static_cast<float>(visible_rect.x()) / coded_size.width(); |
| 245 float y0 = static_cast<float>(visible_rect.y()) / coded_size.height(); |
| 246 float x1 = static_cast<float>(visible_rect.right()) / coded_size.width(); |
| 247 float y1 = static_cast<float>(visible_rect.bottom()) / coded_size.height(); |
| 248 verts[0] = x0; verts[1] = y0; |
| 249 verts[2] = x0; verts[3] = y1; |
| 250 verts[4] = x1; verts[5] = y0; |
| 251 verts[6] = x1; verts[7] = y1; |
| 252 glVertexAttribPointer(tc_location, 2, GL_FLOAT, GL_FALSE, 0, verts); |
| 246 | 253 |
| 247 // We are getting called on a thread. Release the context so that it can be | 254 // We are getting called on a thread. Release the context so that it can be |
| 248 // made current on the main thread. | 255 // made current on the main thread. |
| 249 glXMakeCurrent(display_, 0, NULL); | 256 glXMakeCurrent(display_, 0, NULL); |
| 250 } | 257 } |
| OLD | NEW |