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

Unified Diff: media/renderers/skcanvas_video_renderer.cc

Issue 2461423002: Reland "Fix HTML5 video blurry" (Closed)
Patch Set: add TODO comment Created 4 years, 1 month 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/renderers/skcanvas_video_renderer.cc
diff --git a/media/renderers/skcanvas_video_renderer.cc b/media/renderers/skcanvas_video_renderer.cc
index e6ee9d1e12ca16cb01957acd649cdc6034556451..9376b5dd96d56f931727b29f809432b9bbc95427 100644
--- a/media/renderers/skcanvas_video_renderer.cc
+++ b/media/renderers/skcanvas_video_renderer.cc
@@ -225,8 +225,9 @@ class VideoImageGenerator : public SkImageGenerator {
SkPMColor ctable[],
int* ctable_count) override {
// If skia couldn't do the YUV conversion on GPU, we will on CPU.
- SkCanvasVideoRenderer::ConvertVideoFrameToRGBPixels(frame_.get(), pixels,
- row_bytes);
+ SkCanvasVideoRenderer::ConvertVideoFrameToRGBPixels(
+ frame_.get(), SkCanvasVideoRenderer::ConvertingSize::VISUAL, pixels,
+ row_bytes);
return true;
}
@@ -522,19 +523,33 @@ scoped_refptr<VideoFrame> DownShiftHighbitVideoFrame(
return ret;
}
+const uint8_t* FrameData(const VideoFrame* video_frame,
+ SkCanvasVideoRenderer::ConvertingSize size_type,
+ size_t plane) {
+ if (size_type == SkCanvasVideoRenderer::ConvertingSize::VISUAL)
+ return video_frame->visible_data(plane);
+ DCHECK(size_type == SkCanvasVideoRenderer::ConvertingSize::CODED);
+ return video_frame->data(plane);
+}
+
// We take the upper 8 bits of 16-bit data and convert it as luminance to ARGB.
// We loose the precision here, but it is important not to render Y16 as RG_88.
// To get the full precision use float textures with WebGL1 and e.g. R16UI or
// R32F textures with WebGL2.
void ConvertY16ToARGB(const VideoFrame* video_frame,
+ SkCanvasVideoRenderer::ConvertingSize size_type,
void* argb_pixels,
size_t argb_row_bytes) {
- const uint8_t* row_head = video_frame->visible_data(0);
+ const uint8_t* row_head =
+ FrameData(video_frame, size_type, VideoFrame::kYPlane);
uint8_t* out = static_cast<uint8_t*>(argb_pixels);
const size_t stride = video_frame->stride(0);
- for (int i = 0; i < video_frame->visible_rect().height(); ++i) {
+ gfx::Size frame_size = video_frame->coded_size();
+ if (size_type == SkCanvasVideoRenderer::ConvertingSize::VISUAL)
+ frame_size = video_frame->visible_rect().size();
+ for (int i = 0; i < frame_size.height(); ++i) {
uint32_t* rgba = reinterpret_cast<uint32_t*>(out);
- const uint8_t* row_end = row_head + video_frame->visible_rect().width() * 2;
+ const uint8_t* row_end = row_head + frame_size.width() * 2;
for (const uint8_t* row = row_head; row < row_end; ++row) {
uint32_t gray_value = *++row;
*rgba++ = SkColorSetRGB(gray_value, gray_value, gray_value);
@@ -544,11 +559,12 @@ void ConvertY16ToARGB(const VideoFrame* video_frame,
}
}
-} // anonymous namespace
+} // namespace
// static
void SkCanvasVideoRenderer::ConvertVideoFrameToRGBPixels(
const VideoFrame* video_frame,
+ ConvertingSize size_type,
void* rgb_pixels,
size_t row_bytes) {
if (!video_frame->IsMappable()) {
@@ -556,79 +572,82 @@ void SkCanvasVideoRenderer::ConvertVideoFrameToRGBPixels(
return;
}
+ gfx::Size frame_size = video_frame->coded_size();
+ if (size_type == SkCanvasVideoRenderer::ConvertingSize::VISUAL)
+ frame_size = video_frame->visible_rect().size();
+
switch (video_frame->format()) {
case PIXEL_FORMAT_YV12:
case PIXEL_FORMAT_I420:
if (CheckColorSpace(video_frame, COLOR_SPACE_JPEG)) {
- LIBYUV_J420_TO_ARGB(video_frame->visible_data(VideoFrame::kYPlane),
- video_frame->stride(VideoFrame::kYPlane),
- video_frame->visible_data(VideoFrame::kUPlane),
- video_frame->stride(VideoFrame::kUPlane),
- video_frame->visible_data(VideoFrame::kVPlane),
- video_frame->stride(VideoFrame::kVPlane),
- static_cast<uint8_t*>(rgb_pixels), row_bytes,
- video_frame->visible_rect().width(),
- video_frame->visible_rect().height());
+ LIBYUV_J420_TO_ARGB(
+ FrameData(video_frame, size_type, VideoFrame::kYPlane),
+ video_frame->stride(VideoFrame::kYPlane),
+ FrameData(video_frame, size_type, VideoFrame::kUPlane),
+ video_frame->stride(VideoFrame::kUPlane),
+ FrameData(video_frame, size_type, VideoFrame::kVPlane),
+ video_frame->stride(VideoFrame::kVPlane),
+ static_cast<uint8_t*>(rgb_pixels), row_bytes, frame_size.width(),
+ frame_size.height());
} else if (CheckColorSpace(video_frame, COLOR_SPACE_HD_REC709)) {
- LIBYUV_H420_TO_ARGB(video_frame->visible_data(VideoFrame::kYPlane),
- video_frame->stride(VideoFrame::kYPlane),
- video_frame->visible_data(VideoFrame::kUPlane),
- video_frame->stride(VideoFrame::kUPlane),
- video_frame->visible_data(VideoFrame::kVPlane),
- video_frame->stride(VideoFrame::kVPlane),
- static_cast<uint8_t*>(rgb_pixels), row_bytes,
- video_frame->visible_rect().width(),
- video_frame->visible_rect().height());
+ LIBYUV_H420_TO_ARGB(
+ FrameData(video_frame, size_type, VideoFrame::kYPlane),
+ video_frame->stride(VideoFrame::kYPlane),
+ FrameData(video_frame, size_type, VideoFrame::kUPlane),
+ video_frame->stride(VideoFrame::kUPlane),
+ FrameData(video_frame, size_type, VideoFrame::kVPlane),
+ video_frame->stride(VideoFrame::kVPlane),
+ static_cast<uint8_t*>(rgb_pixels), row_bytes, frame_size.width(),
+ frame_size.height());
} else {
- LIBYUV_I420_TO_ARGB(video_frame->visible_data(VideoFrame::kYPlane),
- video_frame->stride(VideoFrame::kYPlane),
- video_frame->visible_data(VideoFrame::kUPlane),
- video_frame->stride(VideoFrame::kUPlane),
- video_frame->visible_data(VideoFrame::kVPlane),
- video_frame->stride(VideoFrame::kVPlane),
- static_cast<uint8_t*>(rgb_pixels), row_bytes,
- video_frame->visible_rect().width(),
- video_frame->visible_rect().height());
+ LIBYUV_I420_TO_ARGB(
+ FrameData(video_frame, size_type, VideoFrame::kYPlane),
+ video_frame->stride(VideoFrame::kYPlane),
+ FrameData(video_frame, size_type, VideoFrame::kUPlane),
+ video_frame->stride(VideoFrame::kUPlane),
+ FrameData(video_frame, size_type, VideoFrame::kVPlane),
+ video_frame->stride(VideoFrame::kVPlane),
+ static_cast<uint8_t*>(rgb_pixels), row_bytes, frame_size.width(),
+ frame_size.height());
}
break;
case PIXEL_FORMAT_YV16:
- LIBYUV_I422_TO_ARGB(video_frame->visible_data(VideoFrame::kYPlane),
- video_frame->stride(VideoFrame::kYPlane),
- video_frame->visible_data(VideoFrame::kUPlane),
- video_frame->stride(VideoFrame::kUPlane),
- video_frame->visible_data(VideoFrame::kVPlane),
- video_frame->stride(VideoFrame::kVPlane),
- static_cast<uint8_t*>(rgb_pixels), row_bytes,
- video_frame->visible_rect().width(),
- video_frame->visible_rect().height());
+ LIBYUV_I422_TO_ARGB(
+ FrameData(video_frame, size_type, VideoFrame::kYPlane),
+ video_frame->stride(VideoFrame::kYPlane),
+ FrameData(video_frame, size_type, VideoFrame::kUPlane),
+ video_frame->stride(VideoFrame::kUPlane),
+ FrameData(video_frame, size_type, VideoFrame::kVPlane),
+ video_frame->stride(VideoFrame::kVPlane),
+ static_cast<uint8_t*>(rgb_pixels), row_bytes, frame_size.width(),
+ frame_size.height());
break;
case PIXEL_FORMAT_YV12A:
LIBYUV_I420ALPHA_TO_ARGB(
- video_frame->visible_data(VideoFrame::kYPlane),
+ FrameData(video_frame, size_type, VideoFrame::kYPlane),
video_frame->stride(VideoFrame::kYPlane),
- video_frame->visible_data(VideoFrame::kUPlane),
+ FrameData(video_frame, size_type, VideoFrame::kUPlane),
video_frame->stride(VideoFrame::kUPlane),
- video_frame->visible_data(VideoFrame::kVPlane),
+ FrameData(video_frame, size_type, VideoFrame::kVPlane),
video_frame->stride(VideoFrame::kVPlane),
- video_frame->visible_data(VideoFrame::kAPlane),
+ FrameData(video_frame, size_type, VideoFrame::kAPlane),
video_frame->stride(VideoFrame::kAPlane),
- static_cast<uint8_t*>(rgb_pixels), row_bytes,
- video_frame->visible_rect().width(),
- video_frame->visible_rect().height(),
+ static_cast<uint8_t*>(rgb_pixels), row_bytes, frame_size.width(),
+ frame_size.height(),
1); // 1 = enable RGB premultiplication by Alpha.
break;
case PIXEL_FORMAT_YV24:
- LIBYUV_I444_TO_ARGB(video_frame->visible_data(VideoFrame::kYPlane),
- video_frame->stride(VideoFrame::kYPlane),
- video_frame->visible_data(VideoFrame::kUPlane),
- video_frame->stride(VideoFrame::kUPlane),
- video_frame->visible_data(VideoFrame::kVPlane),
- video_frame->stride(VideoFrame::kVPlane),
- static_cast<uint8_t*>(rgb_pixels), row_bytes,
- video_frame->visible_rect().width(),
- video_frame->visible_rect().height());
+ LIBYUV_I444_TO_ARGB(
+ FrameData(video_frame, size_type, VideoFrame::kYPlane),
+ video_frame->stride(VideoFrame::kYPlane),
+ FrameData(video_frame, size_type, VideoFrame::kUPlane),
+ video_frame->stride(VideoFrame::kUPlane),
+ FrameData(video_frame, size_type, VideoFrame::kVPlane),
+ video_frame->stride(VideoFrame::kVPlane),
+ static_cast<uint8_t*>(rgb_pixels), row_bytes, frame_size.width(),
+ frame_size.height());
break;
case PIXEL_FORMAT_YUV420P9:
@@ -642,13 +661,13 @@ void SkCanvasVideoRenderer::ConvertVideoFrameToRGBPixels(
case PIXEL_FORMAT_YUV444P12: {
scoped_refptr<VideoFrame> temporary_frame =
DownShiftHighbitVideoFrame(video_frame);
- ConvertVideoFrameToRGBPixels(temporary_frame.get(), rgb_pixels,
+ ConvertVideoFrameToRGBPixels(temporary_frame.get(), size_type, rgb_pixels,
row_bytes);
break;
}
case PIXEL_FORMAT_Y16:
- ConvertY16ToARGB(video_frame, rgb_pixels, row_bytes);
+ ConvertY16ToARGB(video_frame, size_type, rgb_pixels, row_bytes);
break;
case PIXEL_FORMAT_NV12:
« no previous file with comments | « media/renderers/skcanvas_video_renderer.h ('k') | third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698