Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(575)

Unified Diff: media/filters/skcanvas_video_renderer.cc

Issue 864113002: Pepper: PPB_VideoDecoder software fallback should support all YUV formats. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/filters/skcanvas_video_renderer.cc
diff --git a/media/filters/skcanvas_video_renderer.cc b/media/filters/skcanvas_video_renderer.cc
index 743efc04f648c8fc4171fb50d2909bd4858fdf70..9ad70bead595a12ed112120040a88a7580f758b0 100644
--- a/media/filters/skcanvas_video_renderer.cc
+++ b/media/filters/skcanvas_video_renderer.cc
@@ -91,155 +91,6 @@ bool IsYUVOrNative(media::VideoFrame::Format format) {
return IsYUV(format) || format == media::VideoFrame::NATIVE_TEXTURE;
}
-// Converts a |video_frame| to raw |rgb_pixels|.
-void ConvertVideoFrameToRGBPixels(
- const scoped_refptr<media::VideoFrame>& video_frame,
- void* rgb_pixels,
- size_t row_bytes) {
- 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));
- }
-
- 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 VideoFrame::YV12:
- case VideoFrame::I420:
- LIBYUV_I420_TO_ARGB(
- video_frame->data(VideoFrame::kYPlane) + y_offset,
- video_frame->stride(VideoFrame::kYPlane),
- video_frame->data(VideoFrame::kUPlane) + uv_offset,
- video_frame->stride(VideoFrame::kUPlane),
- video_frame->data(VideoFrame::kVPlane) + uv_offset,
- video_frame->stride(VideoFrame::kVPlane),
- static_cast<uint8*>(rgb_pixels),
- row_bytes,
- video_frame->visible_rect().width(),
- video_frame->visible_rect().height());
- break;
-
- case VideoFrame::YV12J:
- ConvertYUVToRGB32(
- video_frame->data(VideoFrame::kYPlane) + y_offset,
- video_frame->data(VideoFrame::kUPlane) + uv_offset,
- video_frame->data(VideoFrame::kVPlane) + uv_offset,
- static_cast<uint8*>(rgb_pixels),
- video_frame->visible_rect().width(),
- video_frame->visible_rect().height(),
- video_frame->stride(VideoFrame::kYPlane),
- video_frame->stride(VideoFrame::kUPlane),
- row_bytes,
- YV12J);
- break;
-
- case VideoFrame::YV12HD:
- ConvertYUVToRGB32(
- video_frame->data(VideoFrame::kYPlane) + y_offset,
- video_frame->data(VideoFrame::kUPlane) + uv_offset,
- video_frame->data(VideoFrame::kVPlane) + uv_offset,
- static_cast<uint8*>(rgb_pixels),
- video_frame->visible_rect().width(),
- video_frame->visible_rect().height(),
- video_frame->stride(VideoFrame::kYPlane),
- video_frame->stride(VideoFrame::kUPlane),
- row_bytes,
- YV12HD);
- break;
-
- case VideoFrame::YV16:
- LIBYUV_I422_TO_ARGB(
- video_frame->data(VideoFrame::kYPlane) + y_offset,
- video_frame->stride(VideoFrame::kYPlane),
- video_frame->data(VideoFrame::kUPlane) + uv_offset,
- video_frame->stride(VideoFrame::kUPlane),
- video_frame->data(VideoFrame::kVPlane) + uv_offset,
- video_frame->stride(VideoFrame::kVPlane),
- static_cast<uint8*>(rgb_pixels),
- row_bytes,
- video_frame->visible_rect().width(),
- video_frame->visible_rect().height());
- break;
-
- case 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.
- ConvertYUVAToARGB(
- video_frame->data(VideoFrame::kYPlane) + y_offset,
- video_frame->data(VideoFrame::kUPlane) + uv_offset,
- video_frame->data(VideoFrame::kVPlane) + uv_offset,
- video_frame->data(VideoFrame::kAPlane),
- static_cast<uint8*>(rgb_pixels),
- video_frame->visible_rect().width(),
- video_frame->visible_rect().height(),
- video_frame->stride(VideoFrame::kYPlane),
- video_frame->stride(VideoFrame::kUPlane),
- video_frame->stride(VideoFrame::kAPlane),
- row_bytes,
- YV12);
- break;
-
- case VideoFrame::YV24:
- libyuv::I444ToARGB(
- video_frame->data(VideoFrame::kYPlane) + y_offset,
- video_frame->stride(VideoFrame::kYPlane),
- video_frame->data(VideoFrame::kUPlane) + uv_offset,
- video_frame->stride(VideoFrame::kUPlane),
- video_frame->data(VideoFrame::kVPlane) + uv_offset,
- video_frame->stride(VideoFrame::kVPlane),
- static_cast<uint8*>(rgb_pixels),
- row_bytes,
- 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*>(rgb_pixels),
- row_bytes,
- static_cast<uint8*>(rgb_pixels),
- row_bytes,
- video_frame->visible_rect().width(),
- video_frame->visible_rect().height());
-#endif
- break;
-
- case VideoFrame::NATIVE_TEXTURE: {
- SkBitmap tmp;
- tmp.installPixels(
- SkImageInfo::MakeN32Premul(video_frame->visible_rect().width(),
- video_frame->visible_rect().height()),
- rgb_pixels,
- row_bytes);
- video_frame->ReadPixelsFromNativeTexture(tmp);
- break;
- }
-
-#if defined(VIDEO_HOLE)
- case VideoFrame::HOLE:
-#endif // defined(VIDEO_HOLE)
- case VideoFrame::ARGB:
- case VideoFrame::UNKNOWN:
- case VideoFrame::NV12:
- NOTREACHED();
- }
-}
-
bool IsSkBitmapProperlySizedTexture(const SkBitmap* bitmap,
const gfx::Size& size) {
return bitmap->getTexture() && bitmap->width() == size.width() &&
@@ -344,7 +195,8 @@ class VideoImageGenerator : public SkImageGenerator {
if (!pixels)
return false;
// If skia couldn't do the YUV conversion on GPU, we will on CPU.
- ConvertVideoFrameToRGBPixels(frame_, pixels, row_bytes);
+ SkCanvasVideoRenderer::ConvertVideoFrameToRGBPixels(
+ frame_, pixels, row_bytes);
return true;
}
@@ -572,6 +424,155 @@ void SkCanvasVideoRenderer::Copy(const scoped_refptr<VideoFrame>& video_frame,
}
// static
+void SkCanvasVideoRenderer::ConvertVideoFrameToRGBPixels(
+ const scoped_refptr<media::VideoFrame>& video_frame,
+ void* rgb_pixels,
+ size_t row_bytes) {
+ 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));
+ }
+
+ 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 VideoFrame::YV12:
+ case VideoFrame::I420:
+ LIBYUV_I420_TO_ARGB(
+ video_frame->data(VideoFrame::kYPlane) + y_offset,
+ video_frame->stride(VideoFrame::kYPlane),
+ video_frame->data(VideoFrame::kUPlane) + uv_offset,
+ video_frame->stride(VideoFrame::kUPlane),
+ video_frame->data(VideoFrame::kVPlane) + uv_offset,
+ video_frame->stride(VideoFrame::kVPlane),
+ static_cast<uint8*>(rgb_pixels),
+ row_bytes,
+ video_frame->visible_rect().width(),
+ video_frame->visible_rect().height());
+ break;
+
+ case VideoFrame::YV12J:
+ ConvertYUVToRGB32(
+ video_frame->data(VideoFrame::kYPlane) + y_offset,
+ video_frame->data(VideoFrame::kUPlane) + uv_offset,
+ video_frame->data(VideoFrame::kVPlane) + uv_offset,
+ static_cast<uint8*>(rgb_pixels),
+ video_frame->visible_rect().width(),
+ video_frame->visible_rect().height(),
+ video_frame->stride(VideoFrame::kYPlane),
+ video_frame->stride(VideoFrame::kUPlane),
+ row_bytes,
+ YV12J);
+ break;
+
+ case VideoFrame::YV12HD:
+ ConvertYUVToRGB32(
+ video_frame->data(VideoFrame::kYPlane) + y_offset,
+ video_frame->data(VideoFrame::kUPlane) + uv_offset,
+ video_frame->data(VideoFrame::kVPlane) + uv_offset,
+ static_cast<uint8*>(rgb_pixels),
+ video_frame->visible_rect().width(),
+ video_frame->visible_rect().height(),
+ video_frame->stride(VideoFrame::kYPlane),
+ video_frame->stride(VideoFrame::kUPlane),
+ row_bytes,
+ YV12HD);
+ break;
+
+ case VideoFrame::YV16:
+ LIBYUV_I422_TO_ARGB(
+ video_frame->data(VideoFrame::kYPlane) + y_offset,
+ video_frame->stride(VideoFrame::kYPlane),
+ video_frame->data(VideoFrame::kUPlane) + uv_offset,
+ video_frame->stride(VideoFrame::kUPlane),
+ video_frame->data(VideoFrame::kVPlane) + uv_offset,
+ video_frame->stride(VideoFrame::kVPlane),
+ static_cast<uint8*>(rgb_pixels),
+ row_bytes,
+ video_frame->visible_rect().width(),
+ video_frame->visible_rect().height());
+ break;
+
+ case 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.
+ ConvertYUVAToARGB(
+ video_frame->data(VideoFrame::kYPlane) + y_offset,
+ video_frame->data(VideoFrame::kUPlane) + uv_offset,
+ video_frame->data(VideoFrame::kVPlane) + uv_offset,
+ video_frame->data(VideoFrame::kAPlane),
+ static_cast<uint8*>(rgb_pixels),
+ video_frame->visible_rect().width(),
+ video_frame->visible_rect().height(),
+ video_frame->stride(VideoFrame::kYPlane),
+ video_frame->stride(VideoFrame::kUPlane),
+ video_frame->stride(VideoFrame::kAPlane),
+ row_bytes,
+ YV12);
+ break;
+
+ case VideoFrame::YV24:
+ libyuv::I444ToARGB(
+ video_frame->data(VideoFrame::kYPlane) + y_offset,
+ video_frame->stride(VideoFrame::kYPlane),
+ video_frame->data(VideoFrame::kUPlane) + uv_offset,
+ video_frame->stride(VideoFrame::kUPlane),
+ video_frame->data(VideoFrame::kVPlane) + uv_offset,
+ video_frame->stride(VideoFrame::kVPlane),
+ static_cast<uint8*>(rgb_pixels),
+ row_bytes,
+ 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*>(rgb_pixels),
+ row_bytes,
+ static_cast<uint8*>(rgb_pixels),
+ row_bytes,
+ video_frame->visible_rect().width(),
+ video_frame->visible_rect().height());
+#endif
+ break;
+
+ case VideoFrame::NATIVE_TEXTURE: {
+ SkBitmap tmp;
+ tmp.installPixels(
+ SkImageInfo::MakeN32Premul(video_frame->visible_rect().width(),
+ video_frame->visible_rect().height()),
+ rgb_pixels,
+ row_bytes);
+ video_frame->ReadPixelsFromNativeTexture(tmp);
+ break;
+ }
+
+#if defined(VIDEO_HOLE)
+ case VideoFrame::HOLE:
+#endif // defined(VIDEO_HOLE)
+ case VideoFrame::ARGB:
+ case VideoFrame::UNKNOWN:
+ case VideoFrame::NV12:
+ NOTREACHED();
+ }
+}
+
+// static
void SkCanvasVideoRenderer::CopyVideoFrameTextureToGLTexture(
gpu::gles2::GLES2Interface* gl,
VideoFrame* video_frame,
« content/renderer/pepper/video_decoder_shim.cc ('K') | « media/filters/skcanvas_video_renderer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698