diff options
Diffstat (limited to 'media/tools/player_x11')
-rw-r--r-- | media/tools/player_x11/gl_video_renderer.cc | 19 | ||||
-rw-r--r-- | media/tools/player_x11/gl_video_renderer.h | 4 | ||||
-rw-r--r-- | media/tools/player_x11/x11_video_renderer.cc | 47 | ||||
-rw-r--r-- | media/tools/player_x11/x11_video_renderer.h | 4 |
4 files changed, 44 insertions, 30 deletions
diff --git a/media/tools/player_x11/gl_video_renderer.cc b/media/tools/player_x11/gl_video_renderer.cc index 50abdd9..334dfad 100644 --- a/media/tools/player_x11/gl_video_renderer.cc +++ b/media/tools/player_x11/gl_video_renderer.cc @@ -121,8 +121,7 @@ GlVideoRenderer::~GlVideoRenderer() { void GlVideoRenderer::Paint(media::VideoFrame* video_frame) { if (!gl_context_) - Initialize(video_frame->data_size().width(), - video_frame->data_size().height()); + Initialize(video_frame->coded_size(), video_frame->visible_rect()); // Convert YUV frame to RGB. DCHECK(video_frame->format() == media::VideoFrame::YV12 || @@ -147,12 +146,12 @@ void GlVideoRenderer::Paint(media::VideoFrame* video_frame) { glXSwapBuffers(display_, window_); } -void GlVideoRenderer::Initialize(int width, int height) { +void GlVideoRenderer::Initialize(gfx::Size coded_size, gfx::Rect visible_rect) { CHECK(!gl_context_); LOG(INFO) << "Initializing GL Renderer..."; // Resize the window to fit that of the video. - XResizeWindow(display_, window_, width, height); + XResizeWindow(display_, window_, visible_rect.width(), visible_rect.height()); gl_context_ = InitGLContext(display_, window_); CHECK(gl_context_) << "Failed to initialize GL context"; @@ -241,8 +240,16 @@ void GlVideoRenderer::Initialize(int width, int height) { int tc_location = glGetAttribLocation(program, "in_tc"); glEnableVertexAttribArray(tc_location); - glVertexAttribPointer(tc_location, 2, GL_FLOAT, GL_FALSE, 0, - kTextureCoords); + float verts[8]; + float x0 = static_cast<float>(visible_rect.x()) / coded_size.width(); + float y0 = static_cast<float>(visible_rect.y()) / coded_size.height(); + float x1 = static_cast<float>(visible_rect.right()) / coded_size.width(); + float y1 = static_cast<float>(visible_rect.bottom()) / coded_size.height(); + verts[0] = x0; verts[1] = y0; + verts[2] = x0; verts[3] = y1; + verts[4] = x1; verts[5] = y0; + verts[6] = x1; verts[7] = y1; + glVertexAttribPointer(tc_location, 2, GL_FLOAT, GL_FALSE, 0, verts); // We are getting called on a thread. Release the context so that it can be // made current on the main thread. diff --git a/media/tools/player_x11/gl_video_renderer.h b/media/tools/player_x11/gl_video_renderer.h index 28d3ffb..b8818a1 100644 --- a/media/tools/player_x11/gl_video_renderer.h +++ b/media/tools/player_x11/gl_video_renderer.h @@ -7,6 +7,8 @@ #include "base/basictypes.h" #include "base/memory/ref_counted.h" +#include "ui/gfx/rect.h" +#include "ui/gfx/size.h" #include "ui/gl/gl_bindings.h" class MessageLoop; @@ -27,7 +29,7 @@ class GlVideoRenderer : public base::RefCountedThreadSafe<GlVideoRenderer> { private: // Initializes GL rendering for the given dimensions. - void Initialize(int width, int height); + void Initialize(gfx::Size coded_size, gfx::Rect visible_rect); Display* display_; Window window_; diff --git a/media/tools/player_x11/x11_video_renderer.cc b/media/tools/player_x11/x11_video_renderer.cc index d259d6b..43a18cd 100644 --- a/media/tools/player_x11/x11_video_renderer.cc +++ b/media/tools/player_x11/x11_video_renderer.cc @@ -84,16 +84,18 @@ X11VideoRenderer::~X11VideoRenderer() { } void X11VideoRenderer::Paint(media::VideoFrame* video_frame) { - int width = video_frame->data_size().width(); - int height = video_frame->data_size().height(); - if (!image_) - Initialize(width, height); + Initialize(video_frame->coded_size(), video_frame->visible_rect()); + + const int coded_width = video_frame->coded_size().width(); + const int coded_height = video_frame->coded_size().height(); + const int visible_width = video_frame->visible_rect().width(); + const int visible_height = video_frame->visible_rect().height(); // Check if we need to reallocate our XImage. - if (image_->width != width || image_->height != height) { + if (image_->width != coded_width || image_->height != coded_height) { XDestroyImage(image_); - image_ = CreateImage(display_, width, height); + image_ = CreateImage(display_, coded_width, coded_height); } // Convert YUV frame to RGB. @@ -109,9 +111,7 @@ void X11VideoRenderer::Paint(media::VideoFrame* video_frame) { media::ConvertYUVToRGB32(video_frame->data(media::VideoFrame::kYPlane), video_frame->data(media::VideoFrame::kUPlane), video_frame->data(media::VideoFrame::kVPlane), - (uint8*)image_->data, - video_frame->data_size().width(), - video_frame->data_size().height(), + (uint8*)image_->data, coded_width, coded_height, video_frame->stride(media::VideoFrame::kYPlane), video_frame->stride(media::VideoFrame::kUPlane), image_->bytes_per_line, @@ -125,8 +125,8 @@ void X11VideoRenderer::Paint(media::VideoFrame* video_frame) { // Creates a XImage. XImage image; memset(&image, 0, sizeof(image)); - image.width = width; - image.height = height; + image.width = coded_width; + image.height = coded_height; image.depth = 32; image.bits_per_pixel = 32; image.format = ZPixmap; @@ -140,15 +140,15 @@ void X11VideoRenderer::Paint(media::VideoFrame* video_frame) { image.data = image_->data; // Creates a pixmap and uploads from the XImage. - unsigned long pixmap = XCreatePixmap(display_, - window_, - width, - height, + unsigned long pixmap = XCreatePixmap(display_, window_, + visible_width, visible_height, 32); GC gc = XCreateGC(display_, pixmap, 0, NULL); XPutImage(display_, pixmap, gc, &image, - 0, 0, 0, 0, - width, height); + video_frame->visible_rect().x(), + video_frame->visible_rect().y(), + 0, 0, + visible_width, visible_height); XFreeGC(display_, gc); // Creates the picture representing the pixmap. @@ -158,7 +158,7 @@ void X11VideoRenderer::Paint(media::VideoFrame* video_frame) { // Composite the picture over the picture representing the window. XRenderComposite(display_, PictOpSrc, picture, 0, picture_, 0, 0, 0, 0, 0, 0, - width, height); + visible_width, visible_height); XRenderFreePicture(display_, picture); XFreePixmap(display_, pixmap); @@ -171,18 +171,21 @@ void X11VideoRenderer::Paint(media::VideoFrame* video_frame) { // to the window. GC gc = XCreateGC(display_, window_, 0, NULL); XPutImage(display_, window_, gc, image_, - 0, 0, 0, 0, width, height); + video_frame->visible_rect().x(), + video_frame->visible_rect().y(), + 0, 0, visible_width, visible_height); XFlush(display_); XFreeGC(display_, gc); } -void X11VideoRenderer::Initialize(int width, int height) { +void X11VideoRenderer::Initialize(gfx::Size coded_size, + gfx::Rect visible_rect) { CHECK(!image_); LOG(INFO) << "Initializing X11 Renderer..."; // Resize the window to fit that of the video. - XResizeWindow(display_, window_, width, height); - image_ = CreateImage(display_, width, height); + XResizeWindow(display_, window_, visible_rect.width(), visible_rect.height()); + image_ = CreateImage(display_, coded_size.width(), coded_size.height()); // Testing XRender support. We'll use the very basic of XRender // so if it presents it is already good enough. We don't need diff --git a/media/tools/player_x11/x11_video_renderer.h b/media/tools/player_x11/x11_video_renderer.h index b91c565..05c624c 100644 --- a/media/tools/player_x11/x11_video_renderer.h +++ b/media/tools/player_x11/x11_video_renderer.h @@ -9,6 +9,8 @@ #include "base/basictypes.h" #include "base/memory/ref_counted.h" +#include "ui/gfx/rect.h" +#include "ui/gfx/size.h" class MessageLoop; @@ -28,7 +30,7 @@ class X11VideoRenderer : public base::RefCountedThreadSafe<X11VideoRenderer> { private: // Initializes X11 rendering for the given dimensions. - void Initialize(int width, int height); + void Initialize(gfx::Size coded_size, gfx::Rect visible_rect); Display* display_; Window window_; |