Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(267)

Side by Side Diff: media/tools/player_x11/gl_video_renderer.cc

Issue 2724005: player_x11 : change X/GL thread to message loop for injecting task (Closed)
Patch Set: fixing nits Created 10 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 <dlfcn.h> 7 #include <dlfcn.h>
8 #include <X11/Xutil.h> 8 #include <X11/Xutil.h>
9 #include <X11/extensions/Xrender.h> 9 #include <X11/extensions/Xrender.h>
10 #include <X11/extensions/Xcomposite.h> 10 #include <X11/extensions/Xcomposite.h>
11 11
12 #include "media/base/buffers.h" 12 #include "media/base/buffers.h"
13 #include "media/base/video_frame.h" 13 #include "media/base/video_frame.h"
14 #include "media/base/yuv_convert.h" 14 #include "media/base/yuv_convert.h"
15 15
16 GlVideoRenderer* GlVideoRenderer::instance_ = NULL; 16 GlVideoRenderer* GlVideoRenderer::instance_ = NULL;
17 17
18 GlVideoRenderer::GlVideoRenderer(Display* display, Window window) 18 GlVideoRenderer::GlVideoRenderer(Display* display, Window window)
19 : display_(display), 19 : display_(display),
20 window_(window), 20 window_(window),
21 new_frame_(false), 21 gl_context_(NULL),
22 gl_context_(NULL) { 22 glx_thread_message_loop_(NULL) {
23 } 23 }
24 24
25 GlVideoRenderer::~GlVideoRenderer() { 25 GlVideoRenderer::~GlVideoRenderer() {
26 } 26 }
27 27
28 // static 28 // static
29 bool GlVideoRenderer::IsMediaFormatSupported( 29 bool GlVideoRenderer::IsMediaFormatSupported(
30 const media::MediaFormat& media_format) { 30 const media::MediaFormat& media_format) {
31 int width = 0; 31 int width = 0;
32 int height = 0; 32 int height = 0;
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 // made current on the main thread. 256 // made current on the main thread.
257 glXMakeCurrent(display_, 0, NULL); 257 glXMakeCurrent(display_, 0, NULL);
258 258
259 // Save this instance. 259 // Save this instance.
260 DCHECK(!instance_); 260 DCHECK(!instance_);
261 instance_ = this; 261 instance_ = this;
262 return true; 262 return true;
263 } 263 }
264 264
265 void GlVideoRenderer::OnFrameAvailable() { 265 void GlVideoRenderer::OnFrameAvailable() {
266 AutoLock auto_lock(lock_); 266 if (glx_thread_message_loop()) {
267 new_frame_ = true; 267 glx_thread_message_loop()->PostTask(FROM_HERE,
268 NewRunnableMethod(this, &GlVideoRenderer::Paint));
269 }
268 } 270 }
269 271
270 void GlVideoRenderer::Paint() { 272 void GlVideoRenderer::Paint() {
271 // Use |new_frame_| to prevent overdraw since Paint() is called more
272 // often than needed. It is OK to lock only this flag and we don't
273 // want to lock the whole function because this method takes a long
274 // time to complete.
275 {
276 AutoLock auto_lock(lock_);
277 if (!new_frame_)
278 return;
279 new_frame_ = false;
280 }
281
282 scoped_refptr<media::VideoFrame> video_frame; 273 scoped_refptr<media::VideoFrame> video_frame;
283 GetCurrentFrame(&video_frame); 274 GetCurrentFrame(&video_frame);
284 275
285 if (!video_frame) 276 if (!video_frame)
286 return; 277 return;
287 278
288 // Convert YUV frame to RGB. 279 // Convert YUV frame to RGB.
289 DCHECK(video_frame->format() == media::VideoFrame::YV12 || 280 DCHECK(video_frame->format() == media::VideoFrame::YV12 ||
290 video_frame->format() == media::VideoFrame::YV16); 281 video_frame->format() == media::VideoFrame::YV16);
291 DCHECK(video_frame->stride(media::VideoFrame::kUPlane) == 282 DCHECK(video_frame->stride(media::VideoFrame::kUPlane) ==
(...skipping 12 matching lines...) Expand all
304 video_frame->height() : video_frame->height() / 2; 295 video_frame->height() : video_frame->height() / 2;
305 glActiveTexture(GL_TEXTURE0 + i); 296 glActiveTexture(GL_TEXTURE0 + i);
306 glPixelStorei(GL_UNPACK_ROW_LENGTH, video_frame->stride(i)); 297 glPixelStorei(GL_UNPACK_ROW_LENGTH, video_frame->stride(i));
307 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, width, height, 0, 298 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, width, height, 0,
308 GL_LUMINANCE, GL_UNSIGNED_BYTE, video_frame->data(i)); 299 GL_LUMINANCE, GL_UNSIGNED_BYTE, video_frame->data(i));
309 } 300 }
310 301
311 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 302 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
312 glXSwapBuffers(display_, window_); 303 glXSwapBuffers(display_, window_);
313 } 304 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698