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

Side by Side Diff: media/renderers/skcanvas_video_renderer.cc

Issue 2418173002: Fix HTML5 video blurry (Closed)
Patch Set: fix nits 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/renderers/skcanvas_video_renderer.h" 5 #include "media/renderers/skcanvas_video_renderer.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "base/macros.h" 9 #include "base/macros.h"
10 #include "gpu/GLES2/gl2extchromium.h" 10 #include "gpu/GLES2/gl2extchromium.h"
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 } 218 }
219 ~VideoImageGenerator() override {} 219 ~VideoImageGenerator() override {}
220 220
221 protected: 221 protected:
222 bool onGetPixels(const SkImageInfo& info, 222 bool onGetPixels(const SkImageInfo& info,
223 void* pixels, 223 void* pixels,
224 size_t row_bytes, 224 size_t row_bytes,
225 SkPMColor ctable[], 225 SkPMColor ctable[],
226 int* ctable_count) override { 226 int* ctable_count) override {
227 // If skia couldn't do the YUV conversion on GPU, we will on CPU. 227 // If skia couldn't do the YUV conversion on GPU, we will on CPU.
228 SkCanvasVideoRenderer::ConvertVideoFrameToRGBPixels(frame_.get(), pixels, 228 SkCanvasVideoRenderer::ConvertVideoFrameToRGBPixels(
229 row_bytes); 229 frame_.get(), SkCanvasVideoRenderer::ConvertingSize::VISUAL, pixels,
230 row_bytes);
230 return true; 231 return true;
231 } 232 }
232 233
233 bool onQueryYUV8(SkYUVSizeInfo* sizeInfo, 234 bool onQueryYUV8(SkYUVSizeInfo* sizeInfo,
234 SkYUVColorSpace* color_space) const override { 235 SkYUVColorSpace* color_space) const override {
235 if (!media::IsYuvPlanar(frame_->format()) || 236 if (!media::IsYuvPlanar(frame_->format()) ||
236 // TODO(rileya): Skia currently doesn't support YUVA conversion. Remove 237 // TODO(rileya): Skia currently doesn't support YUVA conversion. Remove
237 // this case once it does. As-is we will fall back on the pure-software 238 // this case once it does. As-is we will fall back on the pure-software
238 // path in this case. 239 // path in this case.
239 frame_->format() == PIXEL_FORMAT_YV12A) { 240 frame_->format() == PIXEL_FORMAT_YV12A) {
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 for (int row = 0; row < video_frame->rows(plane); row++) { 514 for (int row = 0; row < video_frame->rows(plane); row++) {
514 for (int x = 0; x < width; x++) { 515 for (int x = 0; x < width; x++) {
515 dst[x] = src[x] >> shift; 516 dst[x] = src[x] >> shift;
516 } 517 }
517 src += video_frame->stride(plane) / 2; 518 src += video_frame->stride(plane) / 2;
518 dst += ret->stride(plane); 519 dst += ret->stride(plane);
519 } 520 }
520 } 521 }
521 return ret; 522 return ret;
522 } 523 }
524
525 const uint8_t* FrameData(const VideoFrame* video_frame,
526 SkCanvasVideoRenderer::ConvertingSize size_type,
527 size_t plane) {
528 if (size_type == SkCanvasVideoRenderer::ConvertingSize::VISUAL)
529 return video_frame->visible_data(plane);
530 DCHECK(size_type == SkCanvasVideoRenderer::ConvertingSize::CODED);
531 return video_frame->data(plane);
523 } 532 }
524 533
534 } // namespace
535
525 // static 536 // static
526 void SkCanvasVideoRenderer::ConvertVideoFrameToRGBPixels( 537 void SkCanvasVideoRenderer::ConvertVideoFrameToRGBPixels(
527 const VideoFrame* video_frame, 538 const VideoFrame* video_frame,
539 ConvertingSize size_type,
528 void* rgb_pixels, 540 void* rgb_pixels,
529 size_t row_bytes) { 541 size_t row_bytes) {
530 if (!video_frame->IsMappable()) { 542 if (!video_frame->IsMappable()) {
531 NOTREACHED() << "Cannot extract pixels from non-CPU frame formats."; 543 NOTREACHED() << "Cannot extract pixels from non-CPU frame formats.";
532 return; 544 return;
533 } 545 }
534 if (!media::IsYuvPlanar(video_frame->format())) { 546 if (!media::IsYuvPlanar(video_frame->format())) {
535 NOTREACHED() << "Non YUV formats are not supported"; 547 NOTREACHED() << "Non YUV formats are not supported";
536 return; 548 return;
537 } 549 }
538 550
551 gfx::Size frame_size = video_frame->coded_size();
552 if (size_type == SkCanvasVideoRenderer::ConvertingSize::VISUAL)
553 frame_size = video_frame->visible_rect().size();
554
539 switch (video_frame->format()) { 555 switch (video_frame->format()) {
540 case PIXEL_FORMAT_YV12: 556 case PIXEL_FORMAT_YV12:
541 case PIXEL_FORMAT_I420: 557 case PIXEL_FORMAT_I420:
542 if (CheckColorSpace(video_frame, COLOR_SPACE_JPEG)) { 558 if (CheckColorSpace(video_frame, COLOR_SPACE_JPEG)) {
543 LIBYUV_J420_TO_ARGB(video_frame->visible_data(VideoFrame::kYPlane), 559 LIBYUV_J420_TO_ARGB(
544 video_frame->stride(VideoFrame::kYPlane), 560 FrameData(video_frame, size_type, VideoFrame::kYPlane),
545 video_frame->visible_data(VideoFrame::kUPlane), 561 video_frame->stride(VideoFrame::kYPlane),
546 video_frame->stride(VideoFrame::kUPlane), 562 FrameData(video_frame, size_type, VideoFrame::kUPlane),
547 video_frame->visible_data(VideoFrame::kVPlane), 563 video_frame->stride(VideoFrame::kUPlane),
548 video_frame->stride(VideoFrame::kVPlane), 564 FrameData(video_frame, size_type, VideoFrame::kVPlane),
549 static_cast<uint8_t*>(rgb_pixels), row_bytes, 565 video_frame->stride(VideoFrame::kVPlane),
550 video_frame->visible_rect().width(), 566 static_cast<uint8_t*>(rgb_pixels), row_bytes, frame_size.width(),
551 video_frame->visible_rect().height()); 567 frame_size.height());
552 } else if (CheckColorSpace(video_frame, COLOR_SPACE_HD_REC709)) { 568 } else if (CheckColorSpace(video_frame, COLOR_SPACE_HD_REC709)) {
553 LIBYUV_H420_TO_ARGB(video_frame->visible_data(VideoFrame::kYPlane), 569 LIBYUV_H420_TO_ARGB(
554 video_frame->stride(VideoFrame::kYPlane), 570 FrameData(video_frame, size_type, VideoFrame::kYPlane),
555 video_frame->visible_data(VideoFrame::kUPlane), 571 video_frame->stride(VideoFrame::kYPlane),
556 video_frame->stride(VideoFrame::kUPlane), 572 FrameData(video_frame, size_type, VideoFrame::kUPlane),
557 video_frame->visible_data(VideoFrame::kVPlane), 573 video_frame->stride(VideoFrame::kUPlane),
558 video_frame->stride(VideoFrame::kVPlane), 574 FrameData(video_frame, size_type, VideoFrame::kVPlane),
559 static_cast<uint8_t*>(rgb_pixels), row_bytes, 575 video_frame->stride(VideoFrame::kVPlane),
560 video_frame->visible_rect().width(), 576 static_cast<uint8_t*>(rgb_pixels), row_bytes, frame_size.width(),
561 video_frame->visible_rect().height()); 577 frame_size.height());
562 } else { 578 } else {
563 LIBYUV_I420_TO_ARGB(video_frame->visible_data(VideoFrame::kYPlane), 579 LIBYUV_I420_TO_ARGB(
564 video_frame->stride(VideoFrame::kYPlane), 580 FrameData(video_frame, size_type, VideoFrame::kYPlane),
565 video_frame->visible_data(VideoFrame::kUPlane), 581 video_frame->stride(VideoFrame::kYPlane),
566 video_frame->stride(VideoFrame::kUPlane), 582 FrameData(video_frame, size_type, VideoFrame::kUPlane),
567 video_frame->visible_data(VideoFrame::kVPlane), 583 video_frame->stride(VideoFrame::kUPlane),
568 video_frame->stride(VideoFrame::kVPlane), 584 FrameData(video_frame, size_type, VideoFrame::kVPlane),
569 static_cast<uint8_t*>(rgb_pixels), row_bytes, 585 video_frame->stride(VideoFrame::kVPlane),
570 video_frame->visible_rect().width(), 586 static_cast<uint8_t*>(rgb_pixels), row_bytes, frame_size.width(),
571 video_frame->visible_rect().height()); 587 frame_size.height());
572 } 588 }
573 break; 589 break;
574 case PIXEL_FORMAT_YV16: 590 case PIXEL_FORMAT_YV16:
575 LIBYUV_I422_TO_ARGB(video_frame->visible_data(VideoFrame::kYPlane), 591 LIBYUV_I422_TO_ARGB(
576 video_frame->stride(VideoFrame::kYPlane), 592 FrameData(video_frame, size_type, VideoFrame::kYPlane),
577 video_frame->visible_data(VideoFrame::kUPlane), 593 video_frame->stride(VideoFrame::kYPlane),
578 video_frame->stride(VideoFrame::kUPlane), 594 FrameData(video_frame, size_type, VideoFrame::kUPlane),
579 video_frame->visible_data(VideoFrame::kVPlane), 595 video_frame->stride(VideoFrame::kUPlane),
580 video_frame->stride(VideoFrame::kVPlane), 596 FrameData(video_frame, size_type, VideoFrame::kVPlane),
581 static_cast<uint8_t*>(rgb_pixels), row_bytes, 597 video_frame->stride(VideoFrame::kVPlane),
582 video_frame->visible_rect().width(), 598 static_cast<uint8_t*>(rgb_pixels), row_bytes, frame_size.width(),
583 video_frame->visible_rect().height()); 599 frame_size.height());
584 break; 600 break;
585 601
586 case PIXEL_FORMAT_YV12A: 602 case PIXEL_FORMAT_YV12A:
587 LIBYUV_I420ALPHA_TO_ARGB( 603 LIBYUV_I420ALPHA_TO_ARGB(
588 video_frame->visible_data(VideoFrame::kYPlane), 604 FrameData(video_frame, size_type, VideoFrame::kYPlane),
589 video_frame->stride(VideoFrame::kYPlane), 605 video_frame->stride(VideoFrame::kYPlane),
590 video_frame->visible_data(VideoFrame::kUPlane), 606 FrameData(video_frame, size_type, VideoFrame::kUPlane),
591 video_frame->stride(VideoFrame::kUPlane), 607 video_frame->stride(VideoFrame::kUPlane),
592 video_frame->visible_data(VideoFrame::kVPlane), 608 FrameData(video_frame, size_type, VideoFrame::kVPlane),
593 video_frame->stride(VideoFrame::kVPlane), 609 video_frame->stride(VideoFrame::kVPlane),
594 video_frame->visible_data(VideoFrame::kAPlane), 610 FrameData(video_frame, size_type, VideoFrame::kAPlane),
595 video_frame->stride(VideoFrame::kAPlane), 611 video_frame->stride(VideoFrame::kAPlane),
596 static_cast<uint8_t*>(rgb_pixels), row_bytes, 612 static_cast<uint8_t*>(rgb_pixels), row_bytes, frame_size.width(),
597 video_frame->visible_rect().width(), 613 frame_size.height(),
598 video_frame->visible_rect().height(),
599 1); // 1 = enable RGB premultiplication by Alpha. 614 1); // 1 = enable RGB premultiplication by Alpha.
600 break; 615 break;
601 616
602 case PIXEL_FORMAT_YV24: 617 case PIXEL_FORMAT_YV24:
603 LIBYUV_I444_TO_ARGB(video_frame->visible_data(VideoFrame::kYPlane), 618 LIBYUV_I444_TO_ARGB(
604 video_frame->stride(VideoFrame::kYPlane), 619 FrameData(video_frame, size_type, VideoFrame::kYPlane),
605 video_frame->visible_data(VideoFrame::kUPlane), 620 video_frame->stride(VideoFrame::kYPlane),
606 video_frame->stride(VideoFrame::kUPlane), 621 FrameData(video_frame, size_type, VideoFrame::kUPlane),
607 video_frame->visible_data(VideoFrame::kVPlane), 622 video_frame->stride(VideoFrame::kUPlane),
608 video_frame->stride(VideoFrame::kVPlane), 623 FrameData(video_frame, size_type, VideoFrame::kVPlane),
609 static_cast<uint8_t*>(rgb_pixels), row_bytes, 624 video_frame->stride(VideoFrame::kVPlane),
610 video_frame->visible_rect().width(), 625 static_cast<uint8_t*>(rgb_pixels), row_bytes, frame_size.width(),
611 video_frame->visible_rect().height()); 626 frame_size.height());
612 break; 627 break;
613 628
614 case PIXEL_FORMAT_YUV420P9: 629 case PIXEL_FORMAT_YUV420P9:
615 case PIXEL_FORMAT_YUV422P9: 630 case PIXEL_FORMAT_YUV422P9:
616 case PIXEL_FORMAT_YUV444P9: 631 case PIXEL_FORMAT_YUV444P9:
617 case PIXEL_FORMAT_YUV420P10: 632 case PIXEL_FORMAT_YUV420P10:
618 case PIXEL_FORMAT_YUV422P10: 633 case PIXEL_FORMAT_YUV422P10:
619 case PIXEL_FORMAT_YUV444P10: 634 case PIXEL_FORMAT_YUV444P10:
620 case PIXEL_FORMAT_YUV420P12: 635 case PIXEL_FORMAT_YUV420P12:
621 case PIXEL_FORMAT_YUV422P12: 636 case PIXEL_FORMAT_YUV422P12:
622 case PIXEL_FORMAT_YUV444P12: { 637 case PIXEL_FORMAT_YUV444P12: {
623 scoped_refptr<VideoFrame> temporary_frame = 638 scoped_refptr<VideoFrame> temporary_frame =
624 DownShiftHighbitVideoFrame(video_frame); 639 DownShiftHighbitVideoFrame(video_frame);
625 ConvertVideoFrameToRGBPixels(temporary_frame.get(), rgb_pixels, 640 ConvertVideoFrameToRGBPixels(temporary_frame.get(), size_type, rgb_pixels,
626 row_bytes); 641 row_bytes);
627 break; 642 break;
628 } 643 }
629 644
630 case PIXEL_FORMAT_NV12: 645 case PIXEL_FORMAT_NV12:
631 case PIXEL_FORMAT_NV21: 646 case PIXEL_FORMAT_NV21:
632 case PIXEL_FORMAT_UYVY: 647 case PIXEL_FORMAT_UYVY:
633 case PIXEL_FORMAT_YUY2: 648 case PIXEL_FORMAT_YUY2:
634 case PIXEL_FORMAT_ARGB: 649 case PIXEL_FORMAT_ARGB:
635 case PIXEL_FORMAT_XRGB: 650 case PIXEL_FORMAT_XRGB:
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
803 last_image_->bounds().contains(visible_rect)) { 818 last_image_->bounds().contains(visible_rect)) {
804 last_image_ = last_image_->makeSubset(visible_rect); 819 last_image_ = last_image_->makeSubset(visible_rect);
805 } 820 }
806 } 821 }
807 822
808 SkISize SkCanvasVideoRenderer::LastImageDimensionsForTesting() { 823 SkISize SkCanvasVideoRenderer::LastImageDimensionsForTesting() {
809 return last_image_dimensions_for_testing_; 824 return last_image_dimensions_for_testing_;
810 } 825 }
811 826
812 } // namespace media 827 } // namespace media
OLDNEW
« 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