Index: media/filters/skcanvas_video_renderer.cc |
diff --git a/media/filters/skcanvas_video_renderer.cc b/media/filters/skcanvas_video_renderer.cc |
deleted file mode 100644 |
index 062e317b71da03476438e156bb2f5d2cedc47b00..0000000000000000000000000000000000000000 |
--- a/media/filters/skcanvas_video_renderer.cc |
+++ /dev/null |
@@ -1,225 +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/filters/skcanvas_video_renderer.h" |
- |
-#include "base/logging.h" |
-#include "media/base/video_frame.h" |
-#include "media/base/yuv_convert.h" |
-#include "third_party/libyuv/include/libyuv.h" |
-#include "third_party/skia/include/core/SkCanvas.h" |
- |
-// Skia internal format depends on a platform. On Android it is ABGR, on others |
-// it is ARGB. |
-#if SK_B32_SHIFT == 0 && SK_G32_SHIFT == 8 && SK_R32_SHIFT == 16 && \ |
- SK_A32_SHIFT == 24 |
-#define LIBYUV_I420_TO_ARGB libyuv::I420ToARGB |
-#define LIBYUV_I422_TO_ARGB libyuv::I422ToARGB |
-#elif SK_R32_SHIFT == 0 && SK_G32_SHIFT == 8 && SK_B32_SHIFT == 16 && \ |
- SK_A32_SHIFT == 24 |
-#define LIBYUV_I420_TO_ARGB libyuv::I420ToABGR |
-#define LIBYUV_I422_TO_ARGB libyuv::I422ToABGR |
-#else |
-#error Unexpected Skia ARGB_8888 layout! |
-#endif |
- |
-namespace media { |
- |
-static bool IsYUV(media::VideoFrame::Format format) { |
- return format == media::VideoFrame::YV12 || |
- format == media::VideoFrame::YV16 || |
- format == media::VideoFrame::I420 || |
- format == media::VideoFrame::YV12A || |
- format == media::VideoFrame::YV12J || |
- format == media::VideoFrame::YV24; |
-} |
- |
-static bool IsYUVOrNative(media::VideoFrame::Format format) { |
- return IsYUV(format) || format == media::VideoFrame::NATIVE_TEXTURE; |
-} |
- |
-// Converts a VideoFrame containing YUV data to a SkBitmap containing RGB data. |
-// |
-// |bitmap| will be (re)allocated to match the dimensions of |video_frame|. |
-static void ConvertVideoFrameToBitmap( |
- const scoped_refptr<media::VideoFrame>& video_frame, |
- SkBitmap* bitmap) { |
- DCHECK(IsYUVOrNative(video_frame->format())) |
- << video_frame->format(); |
- if (IsYUV(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() || |
- bitmap->width() != video_frame->visible_rect().width() || |
- bitmap->height() != video_frame->visible_rect().height()) { |
- bitmap->allocN32Pixels(video_frame->visible_rect().width(), |
- video_frame->visible_rect().height()); |
- bitmap->setIsVolatile(true); |
- } |
- |
- bitmap->lockPixels(); |
- |
- size_t y_offset = 0; |
- size_t uv_offset = 0; |
- if (IsYUV(video_frame->format())) { |
- int y_shift = (video_frame->format() == media::VideoFrame::YV16) ? 0 : 1; |
- // Use the "left" and "top" of the destination rect to locate the offset |
- // in Y, U and V planes. |
- y_offset = (video_frame->stride(media::VideoFrame::kYPlane) * |
- video_frame->visible_rect().y()) + |
- video_frame->visible_rect().x(); |
- // For format YV12, there is one U, V value per 2x2 block. |
- // For format YV16, there is one U, V value per 2x1 block. |
- uv_offset = (video_frame->stride(media::VideoFrame::kUPlane) * |
- (video_frame->visible_rect().y() >> y_shift)) + |
- (video_frame->visible_rect().x() >> 1); |
- } |
- |
- switch (video_frame->format()) { |
- case media::VideoFrame::YV12: |
- case media::VideoFrame::I420: |
- LIBYUV_I420_TO_ARGB( |
- video_frame->data(media::VideoFrame::kYPlane) + y_offset, |
- video_frame->stride(media::VideoFrame::kYPlane), |
- video_frame->data(media::VideoFrame::kUPlane) + uv_offset, |
- video_frame->stride(media::VideoFrame::kUPlane), |
- video_frame->data(media::VideoFrame::kVPlane) + uv_offset, |
- video_frame->stride(media::VideoFrame::kVPlane), |
- static_cast<uint8*>(bitmap->getPixels()), |
- bitmap->rowBytes(), |
- video_frame->visible_rect().width(), |
- video_frame->visible_rect().height()); |
- break; |
- |
- case media::VideoFrame::YV12J: |
- media::ConvertYUVToRGB32( |
- video_frame->data(media::VideoFrame::kYPlane) + y_offset, |
- video_frame->data(media::VideoFrame::kUPlane) + uv_offset, |
- video_frame->data(media::VideoFrame::kVPlane) + uv_offset, |
- 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(), |
- media::YV12J); |
- break; |
- |
- case media::VideoFrame::YV16: |
- LIBYUV_I422_TO_ARGB( |
- video_frame->data(media::VideoFrame::kYPlane) + y_offset, |
- video_frame->stride(media::VideoFrame::kYPlane), |
- video_frame->data(media::VideoFrame::kUPlane) + uv_offset, |
- video_frame->stride(media::VideoFrame::kUPlane), |
- video_frame->data(media::VideoFrame::kVPlane) + uv_offset, |
- video_frame->stride(media::VideoFrame::kVPlane), |
- static_cast<uint8*>(bitmap->getPixels()), |
- bitmap->rowBytes(), |
- video_frame->visible_rect().width(), |
- video_frame->visible_rect().height()); |
- break; |
- |
- case media::VideoFrame::YV12A: |
- // Since libyuv doesn't support YUVA, fallback to media, which is not ARM |
- // optimized. |
- // TODO(fbarchard, mtomasz): Use libyuv, then copy the alpha channel. |
- media::ConvertYUVAToARGB( |
- video_frame->data(media::VideoFrame::kYPlane) + y_offset, |
- video_frame->data(media::VideoFrame::kUPlane) + uv_offset, |
- video_frame->data(media::VideoFrame::kVPlane) + uv_offset, |
- 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::YV24: |
- libyuv::I444ToARGB( |
- video_frame->data(media::VideoFrame::kYPlane) + y_offset, |
- video_frame->stride(media::VideoFrame::kYPlane), |
- video_frame->data(media::VideoFrame::kUPlane) + uv_offset, |
- video_frame->stride(media::VideoFrame::kUPlane), |
- video_frame->data(media::VideoFrame::kVPlane) + uv_offset, |
- video_frame->stride(media::VideoFrame::kVPlane), |
- static_cast<uint8*>(bitmap->getPixels()), |
- bitmap->rowBytes(), |
- video_frame->visible_rect().width(), |
- video_frame->visible_rect().height()); |
-#if SK_R32_SHIFT == 0 && SK_G32_SHIFT == 8 && SK_B32_SHIFT == 16 && \ |
- SK_A32_SHIFT == 24 |
- libyuv::ARGBToABGR( |
- static_cast<uint8*>(bitmap->getPixels()), |
- bitmap->rowBytes(), |
- static_cast<uint8*>(bitmap->getPixels()), |
- bitmap->rowBytes(), |
- video_frame->visible_rect().width(), |
- video_frame->visible_rect().height()); |
-#endif |
- break; |
- |
- case media::VideoFrame::NATIVE_TEXTURE: |
- DCHECK_EQ(video_frame->format(), media::VideoFrame::NATIVE_TEXTURE); |
- video_frame->ReadPixelsFromNativeTexture(*bitmap); |
- break; |
- |
- default: |
- NOTREACHED(); |
- break; |
- } |
- bitmap->notifyPixelsChanged(); |
- bitmap->unlockPixels(); |
-} |
- |
-SkCanvasVideoRenderer::SkCanvasVideoRenderer() |
- : last_frame_timestamp_(media::kNoTimestamp()) { |
-} |
- |
-SkCanvasVideoRenderer::~SkCanvasVideoRenderer() {} |
- |
-void SkCanvasVideoRenderer::Paint(media::VideoFrame* video_frame, |
- SkCanvas* canvas, |
- const gfx::RectF& dest_rect, |
- uint8 alpha) { |
- if (alpha == 0) { |
- return; |
- } |
- |
- SkRect dest; |
- dest.set(dest_rect.x(), dest_rect.y(), dest_rect.right(), dest_rect.bottom()); |
- |
- SkPaint paint; |
- paint.setAlpha(alpha); |
- |
- // Paint black rectangle if there isn't a frame available or the |
- // frame has an unexpected format. |
- if (!video_frame || !IsYUVOrNative(video_frame->format())) { |
- canvas->drawRect(dest, paint); |
- return; |
- } |
- |
- // Check if we should convert and update |last_frame_|. |
- if (last_frame_.isNull() || |
- video_frame->timestamp() != last_frame_timestamp_) { |
- ConvertVideoFrameToBitmap(video_frame, &last_frame_); |
- last_frame_timestamp_ = video_frame->timestamp(); |
- } |
- |
- // Use SRC mode so we completely overwrite the buffer (in case we have alpha) |
- // this means we don't need the extra cost of clearing the buffer first. |
- paint.setXfermode(SkXfermode::Create(SkXfermode::kSrc_Mode)); |
- |
- // Paint using |last_frame_|. |
- paint.setFilterLevel(SkPaint::kLow_FilterLevel); |
- canvas->drawBitmapRect(last_frame_, NULL, dest, &paint); |
-} |
- |
-} // namespace media |