| Index: media/tools/player_x11/x11_video_renderer.cc
 | 
| diff --git a/media/tools/player_x11/x11_video_renderer.cc b/media/tools/player_x11/x11_video_renderer.cc
 | 
| deleted file mode 100644
 | 
| index 2ae8e3b3a7ff21e907f12feeeb5995a2070b8bfa..0000000000000000000000000000000000000000
 | 
| --- a/media/tools/player_x11/x11_video_renderer.cc
 | 
| +++ /dev/null
 | 
| @@ -1,215 +0,0 @@
 | 
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
 | 
| -// Use of this source code is governed by a BSD-style license that can be
 | 
| -// found in the LICENSE file.
 | 
| -
 | 
| -#include "media/tools/player_x11/x11_video_renderer.h"
 | 
| -
 | 
| -#include <dlfcn.h>
 | 
| -#include <X11/Xutil.h>
 | 
| -#include <X11/extensions/Xrender.h>
 | 
| -#include <X11/extensions/Xcomposite.h>
 | 
| -
 | 
| -#include "base/bind.h"
 | 
| -#include "base/message_loop/message_loop.h"
 | 
| -#include "media/base/video_frame.h"
 | 
| -#include "media/base/yuv_convert.h"
 | 
| -
 | 
| -// Creates a 32-bit XImage.
 | 
| -static XImage* CreateImage(Display* display, int width, int height) {
 | 
| -  VLOG(0) << "Allocating XImage " << width << "x" << height;
 | 
| -  return  XCreateImage(display,
 | 
| -                       DefaultVisual(display, DefaultScreen(display)),
 | 
| -                       DefaultDepth(display, DefaultScreen(display)),
 | 
| -                       ZPixmap,
 | 
| -                       0,
 | 
| -                       static_cast<char*>(malloc(width * height * 4)),
 | 
| -                       width,
 | 
| -                       height,
 | 
| -                       32,
 | 
| -                       width * 4);
 | 
| -}
 | 
| -
 | 
| -// Returns the picture format for ARGB.
 | 
| -// This method is originally from chrome/common/x11_util.cc.
 | 
| -static XRenderPictFormat* GetRenderARGB32Format(Display* dpy) {
 | 
| -  static XRenderPictFormat* pictformat = NULL;
 | 
| -  if (pictformat)
 | 
| -    return pictformat;
 | 
| -
 | 
| -  // First look for a 32-bit format which ignores the alpha value.
 | 
| -  XRenderPictFormat templ;
 | 
| -  templ.depth = 32;
 | 
| -  templ.type = PictTypeDirect;
 | 
| -  templ.direct.red = 16;
 | 
| -  templ.direct.green = 8;
 | 
| -  templ.direct.blue = 0;
 | 
| -  templ.direct.redMask = 0xff;
 | 
| -  templ.direct.greenMask = 0xff;
 | 
| -  templ.direct.blueMask = 0xff;
 | 
| -  templ.direct.alphaMask = 0;
 | 
| -
 | 
| -  static const unsigned long kMask =
 | 
| -      PictFormatType | PictFormatDepth |
 | 
| -      PictFormatRed | PictFormatRedMask |
 | 
| -      PictFormatGreen | PictFormatGreenMask |
 | 
| -      PictFormatBlue | PictFormatBlueMask |
 | 
| -      PictFormatAlphaMask;
 | 
| -
 | 
| -  pictformat = XRenderFindFormat(dpy, kMask, &templ, 0 /* first result */);
 | 
| -
 | 
| -  if (!pictformat) {
 | 
| -    // Not all X servers support xRGB32 formats. However, the XRender spec
 | 
| -    // says that they must support an ARGB32 format, so we can always return
 | 
| -    // that.
 | 
| -    pictformat = XRenderFindStandardFormat(dpy, PictStandardARGB32);
 | 
| -    CHECK(pictformat) << "XRender ARGB32 not supported.";
 | 
| -  }
 | 
| -
 | 
| -  return pictformat;
 | 
| -}
 | 
| -
 | 
| -X11VideoRenderer::X11VideoRenderer(Display* display, Window window)
 | 
| -    : display_(display),
 | 
| -      window_(window),
 | 
| -      image_(NULL),
 | 
| -      picture_(0),
 | 
| -      use_render_(false) {
 | 
| -}
 | 
| -
 | 
| -X11VideoRenderer::~X11VideoRenderer() {
 | 
| -  if (image_)
 | 
| -    XDestroyImage(image_);
 | 
| -  if (use_render_)
 | 
| -    XRenderFreePicture(display_, picture_);
 | 
| -}
 | 
| -
 | 
| -void X11VideoRenderer::Paint(
 | 
| -    const scoped_refptr<media::VideoFrame>& video_frame) {
 | 
| -  if (!image_)
 | 
| -    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 != coded_width || image_->height != coded_height) {
 | 
| -    XDestroyImage(image_);
 | 
| -    image_ = CreateImage(display_, coded_width, coded_height);
 | 
| -  }
 | 
| -
 | 
| -  // Convert YUV frame to RGB.
 | 
| -  DCHECK(video_frame->format() == media::VideoFrame::YV12 ||
 | 
| -         video_frame->format() == media::VideoFrame::I420 ||
 | 
| -         video_frame->format() == media::VideoFrame::YV16);
 | 
| -  DCHECK(video_frame->stride(media::VideoFrame::kUPlane) ==
 | 
| -         video_frame->stride(media::VideoFrame::kVPlane));
 | 
| -
 | 
| -  DCHECK(image_->data);
 | 
| -  media::YUVType yuv_type = (video_frame->format() == media::VideoFrame::YV12 ||
 | 
| -                             video_frame->format() == media::VideoFrame::I420)
 | 
| -                                ? media::YV12
 | 
| -                                : media::YV16;
 | 
| -  media::ConvertYUVToRGB32(video_frame->data(media::VideoFrame::kYPlane),
 | 
| -                           video_frame->data(media::VideoFrame::kUPlane),
 | 
| -                           video_frame->data(media::VideoFrame::kVPlane),
 | 
| -                           (uint8*)image_->data, coded_width, coded_height,
 | 
| -                           video_frame->stride(media::VideoFrame::kYPlane),
 | 
| -                           video_frame->stride(media::VideoFrame::kUPlane),
 | 
| -                           image_->bytes_per_line,
 | 
| -                           yuv_type);
 | 
| -
 | 
| -  if (use_render_) {
 | 
| -    // If XRender is used, we'll upload the image to a pixmap. And then
 | 
| -    // creats a picture from the pixmap and composite the picture over
 | 
| -    // the picture represending the window.
 | 
| -
 | 
| -    // Creates a XImage.
 | 
| -    XImage image;
 | 
| -    memset(&image, 0, sizeof(image));
 | 
| -    image.width = coded_width;
 | 
| -    image.height = coded_height;
 | 
| -    image.depth = 32;
 | 
| -    image.bits_per_pixel = 32;
 | 
| -    image.format = ZPixmap;
 | 
| -    image.byte_order = LSBFirst;
 | 
| -    image.bitmap_unit = 8;
 | 
| -    image.bitmap_bit_order = LSBFirst;
 | 
| -    image.bytes_per_line = image_->bytes_per_line;
 | 
| -    image.red_mask = 0xff;
 | 
| -    image.green_mask = 0xff00;
 | 
| -    image.blue_mask = 0xff0000;
 | 
| -    image.data = image_->data;
 | 
| -
 | 
| -    // Creates a pixmap and uploads from the XImage.
 | 
| -    unsigned long pixmap = XCreatePixmap(display_, window_,
 | 
| -                                         visible_width, visible_height,
 | 
| -                                         32);
 | 
| -    GC gc = XCreateGC(display_, pixmap, 0, NULL);
 | 
| -    XPutImage(display_, pixmap, gc, &image,
 | 
| -              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.
 | 
| -    unsigned long picture = XRenderCreatePicture(
 | 
| -        display_, pixmap, GetRenderARGB32Format(display_), 0, NULL);
 | 
| -
 | 
| -    // Composite the picture over the picture representing the window.
 | 
| -    XRenderComposite(display_, PictOpSrc, picture, 0,
 | 
| -                     picture_, 0, 0, 0, 0, 0, 0,
 | 
| -                     visible_width, visible_height);
 | 
| -
 | 
| -    XRenderFreePicture(display_, picture);
 | 
| -    XFreePixmap(display_, pixmap);
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  // If XRender is not used, simply put the image to the server.
 | 
| -  // This will have a tearing effect but this is OK.
 | 
| -  // TODO(hclam): Upload the image to a pixmap and do XCopyArea()
 | 
| -  // to the window.
 | 
| -  GC gc = XCreateGC(display_, window_, 0, NULL);
 | 
| -  XPutImage(display_, window_, gc, image_,
 | 
| -            video_frame->visible_rect().x(),
 | 
| -            video_frame->visible_rect().y(),
 | 
| -            0, 0, visible_width, visible_height);
 | 
| -  XFlush(display_);
 | 
| -  XFreeGC(display_, gc);
 | 
| -}
 | 
| -
 | 
| -void X11VideoRenderer::Initialize(gfx::Size coded_size,
 | 
| -                                  gfx::Rect visible_rect) {
 | 
| -  CHECK(!image_);
 | 
| -  VLOG(0) << "Initializing X11 Renderer...";
 | 
| -
 | 
| -  // Resize the window to fit that of the video.
 | 
| -  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
 | 
| -  // to check its version.
 | 
| -  int dummy;
 | 
| -  use_render_ = XRenderQueryExtension(display_, &dummy, &dummy);
 | 
| -
 | 
| -  if (use_render_) {
 | 
| -    VLOG(0) << "Using XRender extension.";
 | 
| -
 | 
| -    // If we are using XRender, we'll create a picture representing the
 | 
| -    // window.
 | 
| -    XWindowAttributes attr;
 | 
| -    XGetWindowAttributes(display_, window_, &attr);
 | 
| -
 | 
| -    XRenderPictFormat* pictformat = XRenderFindVisualFormat(
 | 
| -        display_,
 | 
| -        attr.visual);
 | 
| -    CHECK(pictformat) << "XRender does not support default visual";
 | 
| -
 | 
| -    picture_ = XRenderCreatePicture(display_, window_, pictformat, 0, NULL);
 | 
| -    CHECK(picture_) << "Backing picture not created";
 | 
| -  }
 | 
| -}
 | 
| 
 |