| Index: webkit/media/skcanvas_video_renderer.cc | 
| diff --git a/webkit/media/skcanvas_video_renderer.cc b/webkit/media/skcanvas_video_renderer.cc | 
| index 5b8db9f7d37b3a2b34255cfd0148e10f299f31ba..c2231b2d5fcb7982abf64da57fe36d5fef24ee15 100644 | 
| --- a/webkit/media/skcanvas_video_renderer.cc | 
| +++ b/webkit/media/skcanvas_video_renderer.cc | 
| @@ -12,20 +12,29 @@ | 
|  | 
| namespace webkit_media { | 
|  | 
| +static bool IsEitherYV12OrYV16(media::VideoFrame::Format format) { | 
| +  return format == media::VideoFrame::YV12 || format == media::VideoFrame::YV16; | 
| +} | 
| + | 
| +static bool IsEitherYV12OrYV16OrNative(media::VideoFrame::Format format) { | 
| +  return IsEitherYV12OrYV16(format) || | 
| +      format == media::VideoFrame::NATIVE_TEXTURE; | 
| +} | 
| + | 
| // CanFastPaint is a helper method to determine the conditions for fast | 
| // painting. The conditions are: | 
| // 1. No skew in canvas matrix. | 
| // 2. No flipping nor mirroring. | 
| // 3. Canvas has pixel format ARGB8888. | 
| // 4. Canvas is opaque. | 
| +// 5. Frame format is YV12 or YV16. | 
| // | 
| // TODO(hclam): The fast paint method should support flipping and mirroring. | 
| // Disable the flipping and mirroring checks once we have it. | 
| static bool CanFastPaint(SkCanvas* canvas, const gfx::Rect& dest_rect, | 
| -                         uint8_t alpha) { | 
| -  if (alpha != 0xFF) { | 
| +                         uint8_t alpha, media::VideoFrame::Format format) { | 
| +  if (alpha != 0xFF || !IsEitherYV12OrYV16(format)) | 
| return false; | 
| -  } | 
|  | 
| const SkMatrix& total_matrix = canvas->getTotalMatrix(); | 
| // Perform the following checks here: | 
| @@ -47,10 +56,6 @@ static bool CanFastPaint(SkCanvas* canvas, const gfx::Rect& dest_rect, | 
| return false; | 
| } | 
|  | 
| -static bool IsEitherYV12OrYV16(media::VideoFrame::Format format) { | 
| -  return format == media::VideoFrame::YV12 || format == media::VideoFrame::YV16; | 
| -} | 
| - | 
| // Fast paint does YUV => RGB, scaling, blitting all in one step into the | 
| // canvas. It's not always safe and appropriate to perform fast paint. | 
| // CanFastPaint() is used to determine the conditions. | 
| @@ -165,9 +170,12 @@ static void FastPaint( | 
| static void ConvertVideoFrameToBitmap( | 
| const scoped_refptr<media::VideoFrame>& video_frame, | 
| SkBitmap* bitmap) { | 
| -  DCHECK(IsEitherYV12OrYV16(video_frame->format())) << video_frame->format(); | 
| -  DCHECK(video_frame->stride(media::VideoFrame::kUPlane) == | 
| -         video_frame->stride(media::VideoFrame::kVPlane)); | 
| +  DCHECK(IsEitherYV12OrYV16OrNative(video_frame->format())) | 
| +      << video_frame->format(); | 
| +  if (IsEitherYV12OrYV16(video_frame->format())) { | 
| +    DCHECK_EQ(video_frame->stride(media::VideoFrame::kUPlane), | 
| +              video_frame->stride(media::VideoFrame::kVPlane)); | 
| +  } | 
|  | 
| // Check if |bitmap| needs to be (re)allocated. | 
| if (bitmap->isNull() || | 
| @@ -181,19 +189,24 @@ static void ConvertVideoFrameToBitmap( | 
| } | 
|  | 
| bitmap->lockPixels(); | 
| -  media::YUVType yuv_type = | 
| -      (video_frame->format() == media::VideoFrame::YV12) ? | 
| -      media::YV12 : media::YV16; | 
| -  media::ConvertYUVToRGB32(video_frame->data(media::VideoFrame::kYPlane), | 
| -                           video_frame->data(media::VideoFrame::kUPlane), | 
| -                           video_frame->data(media::VideoFrame::kVPlane), | 
| -                           static_cast<uint8*>(bitmap->getPixels()), | 
| -                           video_frame->data_size().width(), | 
| -                           video_frame->data_size().height(), | 
| -                           video_frame->stride(media::VideoFrame::kYPlane), | 
| -                           video_frame->stride(media::VideoFrame::kUPlane), | 
| -                           bitmap->rowBytes(), | 
| -                           yuv_type); | 
| +  if (IsEitherYV12OrYV16(video_frame->format())) { | 
| +    media::YUVType yuv_type = | 
| +        (video_frame->format() == media::VideoFrame::YV12) ? | 
| +        media::YV12 : media::YV16; | 
| +    media::ConvertYUVToRGB32(video_frame->data(media::VideoFrame::kYPlane), | 
| +                             video_frame->data(media::VideoFrame::kUPlane), | 
| +                             video_frame->data(media::VideoFrame::kVPlane), | 
| +                             static_cast<uint8*>(bitmap->getPixels()), | 
| +                             video_frame->data_size().width(), | 
| +                             video_frame->data_size().height(), | 
| +                             video_frame->stride(media::VideoFrame::kYPlane), | 
| +                             video_frame->stride(media::VideoFrame::kUPlane), | 
| +                             bitmap->rowBytes(), | 
| +                             yuv_type); | 
| +  } else { | 
| +    DCHECK_EQ(video_frame->format(), media::VideoFrame::NATIVE_TEXTURE); | 
| +    video_frame->ReadPixelsFromNativeTexture(bitmap->getPixels()); | 
| +  } | 
| bitmap->notifyPixelsChanged(); | 
| bitmap->unlockPixels(); | 
| } | 
| @@ -219,16 +232,15 @@ void SkCanvasVideoRenderer::Paint(media::VideoFrame* video_frame, | 
| SkPaint paint; | 
| paint.setAlpha(alpha); | 
|  | 
| -  // Paint black rectangle if there isn't a frame available or if the format is | 
| -  // unexpected (can happen e.g. when normally painting to HW textures but | 
| -  // during shutdown path). | 
| -  if (!video_frame || !IsEitherYV12OrYV16(video_frame->format())) { | 
| +  // Paint black rectangle if there isn't a frame available or the | 
| +  // frame has an unexpected format. | 
| +  if (!video_frame || !IsEitherYV12OrYV16OrNative(video_frame->format())) { | 
| canvas->drawRect(dest, paint); | 
| return; | 
| } | 
|  | 
| // Scale and convert to RGB in one step if we can. | 
| -  if (CanFastPaint(canvas, dest_rect, alpha)) { | 
| +  if (CanFastPaint(canvas, dest_rect, alpha, video_frame->format())) { | 
| FastPaint(video_frame, canvas, dest_rect); | 
| return; | 
| } | 
|  |