Index: webkit/glue/media/video_renderer_impl.cc |
diff --git a/webkit/glue/media/video_renderer_impl.cc b/webkit/glue/media/video_renderer_impl.cc |
index ba06d1c044dba3f004e7dd76ead05c91ec176879..0d4f7f2250c446241f3cac051a1f4a4ae99f00a7 100644 |
--- a/webkit/glue/media/video_renderer_impl.cc |
+++ b/webkit/glue/media/video_renderer_impl.cc |
@@ -1,8 +1,8 @@ |
-// Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this |
+// Copyright (c) 2010 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/base/buffers.h" |
+#include "media/base/video_frame.h" |
#include "media/base/yuv_convert.h" |
#include "webkit/glue/media/video_renderer_impl.h" |
#include "webkit/glue/webmediaplayer_impl.h" |
@@ -129,31 +129,26 @@ void VideoRendererImpl::SlowPaint(media::VideoFrame* video_frame, |
timestamp != last_converted_timestamp_) { |
last_converted_frame_ = video_frame; |
last_converted_timestamp_ = timestamp; |
- media::VideoSurface frame_in; |
- if (video_frame->Lock(&frame_in)) { |
- DCHECK(frame_in.format == media::VideoSurface::YV12 || |
- frame_in.format == media::VideoSurface::YV16); |
- DCHECK(frame_in.strides[media::VideoSurface::kUPlane] == |
- frame_in.strides[media::VideoSurface::kVPlane]); |
- DCHECK(frame_in.planes == media::VideoSurface::kNumYUVPlanes); |
- bitmap_.lockPixels(); |
- media::YUVType yuv_type = (frame_in.format == media::VideoSurface::YV12) ? |
- media::YV12 : media::YV16; |
- media::ConvertYUVToRGB32(frame_in.data[media::VideoSurface::kYPlane], |
- frame_in.data[media::VideoSurface::kUPlane], |
- frame_in.data[media::VideoSurface::kVPlane], |
- static_cast<uint8*>(bitmap_.getPixels()), |
- frame_in.width, |
- frame_in.height, |
- frame_in.strides[media::VideoSurface::kYPlane], |
- frame_in.strides[media::VideoSurface::kUPlane], |
- bitmap_.rowBytes(), |
- yuv_type); |
- bitmap_.unlockPixels(); |
- video_frame->Unlock(); |
- } else { |
- NOTREACHED(); |
- } |
+ DCHECK(video_frame->format() == media::VideoFrame::YV12 || |
+ video_frame->format() == media::VideoFrame::YV16); |
+ DCHECK(video_frame->stride(media::VideoFrame::kUPlane) == |
+ video_frame->stride(media::VideoFrame::kVPlane)); |
+ DCHECK(video_frame->planes() == media::VideoFrame::kNumYUVPlanes); |
+ 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->width(), |
+ video_frame->height(), |
+ video_frame->stride(media::VideoFrame::kYPlane), |
+ video_frame->stride(media::VideoFrame::kUPlane), |
+ bitmap_.rowBytes(), |
+ yuv_type); |
+ bitmap_.unlockPixels(); |
} |
// 2. Paint the bitmap to canvas. |
@@ -173,112 +168,101 @@ void VideoRendererImpl::SlowPaint(media::VideoFrame* video_frame, |
void VideoRendererImpl::FastPaint(media::VideoFrame* video_frame, |
skia::PlatformCanvas* canvas, |
const gfx::Rect& dest_rect) { |
- media::VideoSurface frame_in; |
- if (video_frame->Lock(&frame_in)) { |
- DCHECK(frame_in.format == media::VideoSurface::YV12 || |
- frame_in.format == media::VideoSurface::YV16); |
- DCHECK(frame_in.strides[media::VideoSurface::kUPlane] == |
- frame_in.strides[media::VideoSurface::kVPlane]); |
- DCHECK(frame_in.planes == media::VideoSurface::kNumYUVPlanes); |
- const SkBitmap& bitmap = canvas->getDevice()->accessBitmap(true); |
- media::YUVType yuv_type = (frame_in.format == media::VideoSurface::YV12) ? |
- media::YV12 : media::YV16; |
- int y_shift = yuv_type; // 1 for YV12, 0 for YV16. |
+ DCHECK(video_frame->format() == media::VideoFrame::YV12 || |
+ video_frame->format() == media::VideoFrame::YV16); |
+ DCHECK(video_frame->stride(media::VideoFrame::kUPlane) == |
+ video_frame->stride(media::VideoFrame::kVPlane)); |
+ DCHECK(video_frame->planes() == media::VideoFrame::kNumYUVPlanes); |
+ const SkBitmap& bitmap = canvas->getDevice()->accessBitmap(true); |
+ media::YUVType yuv_type = (video_frame->format() == media::VideoFrame::YV12) ? |
+ media::YV12 : media::YV16; |
+ int y_shift = yuv_type; // 1 for YV12, 0 for YV16. |
- // Create a rectangle backed by SkScalar. |
- SkRect scalar_dest_rect; |
- scalar_dest_rect.iset(dest_rect.x(), dest_rect.y(), |
- dest_rect.right(), dest_rect.bottom()); |
+ // Create a rectangle backed by SkScalar. |
+ SkRect scalar_dest_rect; |
+ scalar_dest_rect.iset(dest_rect.x(), dest_rect.y(), |
+ dest_rect.right(), dest_rect.bottom()); |
- // Transform the destination rectangle to local coordinates. |
- const SkMatrix& local_matrix = canvas->getTotalMatrix(); |
- SkRect local_dest_rect; |
- local_matrix.mapRect(&local_dest_rect, scalar_dest_rect); |
+ // Transform the destination rectangle to local coordinates. |
+ const SkMatrix& local_matrix = canvas->getTotalMatrix(); |
+ SkRect local_dest_rect; |
+ local_matrix.mapRect(&local_dest_rect, scalar_dest_rect); |
- // After projecting the destination rectangle to local coordinates, round |
- // the projected rectangle to integer values, this will give us pixel values |
- // of the rectangle. |
- SkIRect local_dest_irect, local_dest_irect_saved; |
- local_dest_rect.round(&local_dest_irect); |
- local_dest_rect.round(&local_dest_irect_saved); |
+ // After projecting the destination rectangle to local coordinates, round |
+ // the projected rectangle to integer values, this will give us pixel values |
+ // of the rectangle. |
+ SkIRect local_dest_irect, local_dest_irect_saved; |
+ local_dest_rect.round(&local_dest_irect); |
+ local_dest_rect.round(&local_dest_irect_saved); |
- // Only does the paint if the destination rect intersects with the clip |
- // rect. |
- if (local_dest_irect.intersect(canvas->getTotalClip().getBounds())) { |
- // At this point |local_dest_irect| contains the rect that we should draw |
- // to within the clipping rect. |
+ // Only does the paint if the destination rect intersects with the clip |
+ // rect. |
+ if (local_dest_irect.intersect(canvas->getTotalClip().getBounds())) { |
+ // At this point |local_dest_irect| contains the rect that we should draw |
+ // to within the clipping rect. |
- // Calculate the address for the top left corner of destination rect in |
- // the canvas that we will draw to. The address is obtained by the base |
- // address of the canvas shifted by "left" and "top" of the rect. |
- uint8* dest_rect_pointer = static_cast<uint8*>(bitmap.getPixels()) + |
- local_dest_irect.fTop * bitmap.rowBytes() + |
- local_dest_irect.fLeft * 4; |
+ // Calculate the address for the top left corner of destination rect in |
+ // the canvas that we will draw to. The address is obtained by the base |
+ // address of the canvas shifted by "left" and "top" of the rect. |
+ uint8* dest_rect_pointer = static_cast<uint8*>(bitmap.getPixels()) + |
+ local_dest_irect.fTop * bitmap.rowBytes() + |
+ local_dest_irect.fLeft * 4; |
- // Project the clip rect to the original video frame, obtains the |
- // dimensions of the projected clip rect, "left" and "top" of the rect. |
- // The math here are all integer math so we won't have rounding error and |
- // write outside of the canvas. |
- // We have the assumptions of dest_rect.width() and dest_rect.height() |
- // being non-zero, these are valid assumptions since finding intersection |
- // above rejects empty rectangle so we just do a DCHECK here. |
- DCHECK_NE(0, dest_rect.width()); |
- DCHECK_NE(0, dest_rect.height()); |
- size_t frame_clip_width = local_dest_irect.width() * |
- frame_in.width / |
- local_dest_irect_saved.width(); |
- size_t frame_clip_height = local_dest_irect.height() * |
- frame_in.height / |
- local_dest_irect_saved.height(); |
+ // Project the clip rect to the original video frame, obtains the |
+ // dimensions of the projected clip rect, "left" and "top" of the rect. |
+ // The math here are all integer math so we won't have rounding error and |
+ // write outside of the canvas. |
+ // We have the assumptions of dest_rect.width() and dest_rect.height() |
+ // being non-zero, these are valid assumptions since finding intersection |
+ // above rejects empty rectangle so we just do a DCHECK here. |
+ DCHECK_NE(0, dest_rect.width()); |
+ DCHECK_NE(0, dest_rect.height()); |
+ size_t frame_clip_width = local_dest_irect.width() * |
+ video_frame->width() / local_dest_irect_saved.width(); |
+ size_t frame_clip_height = local_dest_irect.height() * |
+ video_frame->height() / local_dest_irect_saved.height(); |
- // Project the "left" and "top" of the final destination rect to local |
- // coordinates of the video frame, use these values to find the offsets |
- // in the video frame to start reading. |
- size_t frame_clip_left = (local_dest_irect.fLeft - |
- local_dest_irect_saved.fLeft) * |
- frame_in.width / |
- local_dest_irect_saved.width(); |
- size_t frame_clip_top = (local_dest_irect.fTop - |
- local_dest_irect_saved.fTop) * |
- frame_in.height / |
- local_dest_irect_saved.height(); |
+ // Project the "left" and "top" of the final destination rect to local |
+ // coordinates of the video frame, use these values to find the offsets |
+ // in the video frame to start reading. |
+ size_t frame_clip_left = |
+ (local_dest_irect.fLeft - local_dest_irect_saved.fLeft) * |
+ video_frame->width() / local_dest_irect_saved.width(); |
+ size_t frame_clip_top = |
+ (local_dest_irect.fTop - local_dest_irect_saved.fTop) * |
+ video_frame->height() / local_dest_irect_saved.height(); |
- // Use the "left" and "top" of the destination rect to locate the offset |
- // in Y, U and V planes. |
- size_t y_offset = frame_in.strides[media::VideoSurface::kYPlane] * |
- frame_clip_top + frame_clip_left; |
- // For format YV12, there is one U, V value per 2x2 block. |
- // For format YV16, there is one u, V value per 2x1 block. |
- size_t uv_offset = (frame_in.strides[media::VideoSurface::kUPlane] * |
- (frame_clip_top >> y_shift)) + |
- (frame_clip_left >> 1); |
- uint8* frame_clip_y = frame_in.data[media::VideoSurface::kYPlane] + |
- y_offset; |
- uint8* frame_clip_u = frame_in.data[media::VideoSurface::kUPlane] + |
- uv_offset; |
- uint8* frame_clip_v = frame_in.data[media::VideoSurface::kVPlane] + |
- uv_offset; |
- bitmap.lockPixels(); |
+ // Use the "left" and "top" of the destination rect to locate the offset |
+ // in Y, U and V planes. |
+ size_t y_offset = video_frame->stride(media::VideoFrame::kYPlane) * |
+ frame_clip_top + frame_clip_left; |
+ // For format YV12, there is one U, V value per 2x2 block. |
+ // For format YV16, there is one u, V value per 2x1 block. |
+ size_t uv_offset = (video_frame->stride(media::VideoFrame::kUPlane) * |
+ (frame_clip_top >> y_shift)) + (frame_clip_left >> 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; |
+ bitmap.lockPixels(); |
- // TODO(hclam): do rotation and mirroring here. |
- media::ScaleYUVToRGB32(frame_clip_y, |
- frame_clip_u, |
- frame_clip_v, |
- dest_rect_pointer, |
- frame_clip_width, |
- frame_clip_height, |
- local_dest_irect.width(), |
- local_dest_irect.height(), |
- frame_in.strides[media::VideoSurface::kYPlane], |
- frame_in.strides[media::VideoSurface::kUPlane], |
- bitmap.rowBytes(), |
- yuv_type, |
- media::ROTATE_0); |
- bitmap.unlockPixels(); |
- } |
- video_frame->Unlock(); |
- } else { |
- NOTREACHED(); |
+ // TODO(hclam): do rotation and mirroring here. |
+ media::ScaleYUVToRGB32(frame_clip_y, |
+ frame_clip_u, |
+ frame_clip_v, |
+ dest_rect_pointer, |
+ frame_clip_width, |
+ frame_clip_height, |
+ local_dest_irect.width(), |
+ local_dest_irect.height(), |
+ video_frame->stride(media::VideoFrame::kYPlane), |
+ video_frame->stride(media::VideoFrame::kUPlane), |
+ bitmap.rowBytes(), |
+ yuv_type, |
+ media::ROTATE_0); |
+ bitmap.unlockPixels(); |
} |
} |