Index: media/filters/skcanvas_video_renderer.cc |
diff --git a/media/filters/skcanvas_video_renderer.cc b/media/filters/skcanvas_video_renderer.cc |
index 53b5b2d57081aa69d500a0ba1043c285f445a316..a38fea698c656cc9a8b0964f737df300199fd3f0 100644 |
--- a/media/filters/skcanvas_video_renderer.cc |
+++ b/media/filters/skcanvas_video_renderer.cc |
@@ -21,6 +21,17 @@ static bool IsEitherYV12OrYV16OrNative(media::VideoFrame::Format format) { |
format == media::VideoFrame::NATIVE_TEXTURE; |
} |
+static bool IsEitherYV12OrYV12AOrYV16(media::VideoFrame::Format format) { |
+ return IsEitherYV12OrYV16(format) || |
+ format == media::VideoFrame::YV12A; |
+} |
+ |
+static bool IsEitherYV12OrYV12AOrYV16OrNative( |
+ media::VideoFrame::Format format) { |
fgalligan1
2013/02/12 01:20:58
nit: 4 space indent.
vigneshv
2013/02/14 19:06:14
Done.
|
+ return IsEitherYV12OrYV16OrNative(format) || |
+ format == media::VideoFrame::YV12A; |
+} |
+ |
// CanFastPaint is a helper method to determine the conditions for fast |
// painting. The conditions are: |
// 1. No skew in canvas matrix. |
@@ -68,9 +79,12 @@ static void FastPaint( |
video_frame->stride(media::VideoFrame::kVPlane)); |
const SkBitmap& bitmap = canvas->getDevice()->accessBitmap(true); |
- media::YUVType yuv_type = media::YV16; |
+ media::YUVType yuv_type = video_frame->format() == media::VideoFrame::YV12 || |
+ video_frame->format() == media::VideoFrame::YV12A |
fgalligan1
2013/02/12 01:20:58
Line up.
vigneshv
2013/02/14 19:06:14
Done.
|
+ ? media::YV12 : media::YV16; |
fgalligan1
2013/02/12 01:20:58
? should be on the previous line. Then the rest of
vigneshv
2013/02/14 19:06:14
Done.
|
int y_shift = 0; |
- if (video_frame->format() == media::VideoFrame::YV12) { |
+ if (video_frame->format() == media::VideoFrame::YV12 || |
+ video_frame->format() == media::VideoFrame::YV12A) { |
fgalligan1
2013/02/12 01:20:58
Line up.
vigneshv
2013/02/14 19:06:14
Done.
|
yuv_type = media::YV12; |
y_shift = 1; |
} |
@@ -170,11 +184,11 @@ static void FastPaint( |
static void ConvertVideoFrameToBitmap( |
const scoped_refptr<media::VideoFrame>& video_frame, |
SkBitmap* bitmap) { |
- DCHECK(IsEitherYV12OrYV16OrNative(video_frame->format())) |
- << video_frame->format(); |
- if (IsEitherYV12OrYV16(video_frame->format())) { |
+ DCHECK(IsEitherYV12OrYV12AOrYV16OrNative(video_frame->format())) |
+ << video_frame->format(); |
fgalligan1
2013/02/12 01:20:58
nit: 4 space indent.
vigneshv
2013/02/14 19:06:14
Done.
|
+ if (IsEitherYV12OrYV12AOrYV16(video_frame->format())) { |
DCHECK_EQ(video_frame->stride(media::VideoFrame::kUPlane), |
- video_frame->stride(media::VideoFrame::kVPlane)); |
+ video_frame->stride(media::VideoFrame::kVPlane)); |
fgalligan1
2013/02/12 01:20:58
Line up.
vigneshv
2013/02/14 19:06:14
Done.
|
} |
// Check if |bitmap| needs to be (re)allocated. |
@@ -189,10 +203,17 @@ static void ConvertVideoFrameToBitmap( |
} |
bitmap->lockPixels(); |
- if (IsEitherYV12OrYV16(video_frame->format())) { |
- media::YUVType yuv_type = media::YV16; |
+ |
+ media::YUVType yuv_type; |
+ uint8* frame_clip_y; |
+ uint8* frame_clip_u; |
+ uint8* frame_clip_v; |
+ if(IsEitherYV12OrYV12AOrYV16(video_frame->format())) { |
+ yuv_type = media::YV16; |
+ |
int y_shift = 0; |
- if (video_frame->format() == media::VideoFrame::YV12) { |
+ if (video_frame->format() == media::VideoFrame::YV12 || |
+ video_frame->format() == media::VideoFrame::YV12A) { |
fgalligan1
2013/02/12 01:20:58
Line up.
vigneshv
2013/02/14 19:06:14
Done.
|
yuv_type = media::YV12; |
y_shift = 1; |
} |
@@ -208,26 +229,45 @@ static void ConvertVideoFrameToBitmap( |
size_t uv_offset = (video_frame->stride(media::VideoFrame::kUPlane) * |
(video_frame->visible_rect().y() >> y_shift)) + |
(video_frame->visible_rect().x() >> 1); |
- uint8* frame_clip_y = |
- video_frame->data(media::VideoFrame::kYPlane) + y_offset; |
- uint8* frame_clip_u = |
- video_frame->data(media::VideoFrame::kUPlane) + uv_offset; |
- uint8* frame_clip_v = |
- video_frame->data(media::VideoFrame::kVPlane) + uv_offset; |
- |
- media::ConvertYUVToRGB32(frame_clip_y, |
- frame_clip_u, |
- frame_clip_v, |
- static_cast<uint8*>(bitmap->getPixels()), |
- video_frame->visible_rect().width(), |
- video_frame->visible_rect().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()); |
+ frame_clip_y = video_frame->data(media::VideoFrame::kYPlane) + y_offset; |
+ frame_clip_u = video_frame->data(media::VideoFrame::kUPlane) + uv_offset; |
+ frame_clip_v = video_frame->data(media::VideoFrame::kVPlane) + uv_offset; |
+ } |
+ switch(video_frame->format()) { |
+ case media::VideoFrame::YV12: |
+ case media::VideoFrame::YV16: |
+ media::ConvertYUVToRGB32(frame_clip_y, |
+ frame_clip_u, |
+ frame_clip_v, |
+ static_cast<uint8*>(bitmap->getPixels()), |
+ video_frame->visible_rect().width(), |
+ video_frame->visible_rect().height(), |
+ video_frame->stride(media::VideoFrame::kYPlane), |
+ video_frame->stride(media::VideoFrame::kUPlane), |
+ bitmap->rowBytes(), |
+ yuv_type); |
+ break; |
+ case media::VideoFrame::YV12A: |
+ media::ConvertYUVAToARGB(frame_clip_y, |
+ frame_clip_u, |
+ frame_clip_v, |
+ video_frame->data(media::VideoFrame::kAPlane), |
+ static_cast<uint8*>(bitmap->getPixels()), |
+ video_frame->visible_rect().width(), |
+ video_frame->visible_rect().height(), |
+ video_frame->stride(media::VideoFrame::kYPlane), |
+ video_frame->stride(media::VideoFrame::kUPlane), |
+ video_frame->stride(media::VideoFrame::kAPlane), |
+ bitmap->rowBytes(), |
+ media::YV12); |
+ break; |
+ case media::VideoFrame::NATIVE_TEXTURE: |
+ DCHECK_EQ(video_frame->format(), media::VideoFrame::NATIVE_TEXTURE); |
+ video_frame->ReadPixelsFromNativeTexture(bitmap->getPixels()); |
+ break; |
+ default: |
+ NOTREACHED(); |
+ break; |
} |
bitmap->notifyPixelsChanged(); |
bitmap->unlockPixels(); |
@@ -255,7 +295,8 @@ void SkCanvasVideoRenderer::Paint(media::VideoFrame* video_frame, |
// Paint black rectangle if there isn't a frame available or the |
// frame has an unexpected format. |
- if (!video_frame || !IsEitherYV12OrYV16OrNative(video_frame->format())) { |
+ if (!video_frame || |
+ !IsEitherYV12OrYV12AOrYV16OrNative(video_frame->format())) { |
fgalligan1
2013/02/12 01:20:58
Line up.
vigneshv
2013/02/14 19:06:14
Done.
|
canvas->drawRect(dest, paint); |
return; |
} |