OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |