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

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

Issue 2767063002: 16-bit video upload to float: intermediate R16_EXT and copy to float. (Closed)
Patch Set: Rebase. Comments fix. Thanks kbr@. Created 3 years, 8 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 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 <GLES3/gl3.h> 5 #include <GLES3/gl3.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 7
8 #include "base/macros.h" 8 #include "base/macros.h"
9 #include "base/memory/aligned_memory.h" 9 #include "base/memory/aligned_memory.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
11 #include "cc/paint/paint_flags.h" 11 #include "cc/paint/paint_flags.h"
12 #include "cc/paint/skia_paint_canvas.h" 12 #include "cc/paint/skia_paint_canvas.h"
13 #include "gpu/GLES2/gl2extchromium.h" 13 #include "gpu/GLES2/gl2extchromium.h"
14 #include "gpu/command_buffer/client/gles2_interface_stub.h" 14 #include "gpu/command_buffer/client/gles2_interface_stub.h"
15 #include "gpu/command_buffer/common/capabilities.h"
15 #include "media/base/timestamp_constants.h" 16 #include "media/base/timestamp_constants.h"
16 #include "media/base/video_frame.h" 17 #include "media/base/video_frame.h"
17 #include "media/base/video_util.h" 18 #include "media/base/video_util.h"
18 #include "media/renderers/skcanvas_video_renderer.h" 19 #include "media/renderers/skcanvas_video_renderer.h"
19 #include "testing/gtest/include/gtest/gtest.h" 20 #include "testing/gtest/include/gtest/gtest.h"
20 #include "third_party/libyuv/include/libyuv/convert.h" 21 #include "third_party/libyuv/include/libyuv/convert.h"
21 #include "third_party/skia/include/core/SkImage.h" 22 #include "third_party/skia/include/core/SkImage.h"
22 #include "third_party/skia/include/core/SkRefCnt.h" 23 #include "third_party/skia/include/core/SkRefCnt.h"
23 #include "third_party/skia/include/core/SkSurface.h" 24 #include "third_party/skia/include/core/SkSurface.h"
24 #include "third_party/skia/include/gpu/GrContext.h" 25 #include "third_party/skia/include/gpu/GrContext.h"
(...skipping 677 matching lines...) Expand 10 before | Expand all | Expand 10 after
702 const int stride = width + offset_x; 703 const int stride = width + offset_x;
703 const size_t byte_size = stride * (height + offset_y) * 2; 704 const size_t byte_size = stride * (height + offset_y) * 2;
704 std::unique_ptr<unsigned char, base::AlignedFreeDeleter> memory( 705 std::unique_ptr<unsigned char, base::AlignedFreeDeleter> memory(
705 static_cast<unsigned char*>(base::AlignedAlloc( 706 static_cast<unsigned char*>(base::AlignedAlloc(
706 byte_size, media::VideoFrame::kFrameAddressAlignment))); 707 byte_size, media::VideoFrame::kFrameAddressAlignment)));
707 const gfx::Rect rect(offset_x, offset_y, width, height); 708 const gfx::Rect rect(offset_x, offset_y, width, height);
708 scoped_refptr<media::VideoFrame> video_frame = 709 scoped_refptr<media::VideoFrame> video_frame =
709 CreateTestY16Frame(gfx::Size(stride, offset_y + height), rect, 710 CreateTestY16Frame(gfx::Size(stride, offset_y + height), rect,
710 memory.get(), cropped_frame()->timestamp()); 711 memory.get(), cropped_frame()->timestamp());
711 712
712 // Create GL context.
713 sk_sp<const GrGLInterface> null_interface(GrGLCreateNullInterface());
714 sk_sp<GrContext> gr_context(GrContext::Create(
715 kOpenGL_GrBackend,
716 reinterpret_cast<GrBackendContext>(null_interface.get())));
717 TestGLES2Interface gles2; 713 TestGLES2Interface gles2;
718 Context3D context_3d(&gles2, gr_context.get());
719
720 // Bind the texImage2D callback to verify the uint16 to float32 conversion. 714 // Bind the texImage2D callback to verify the uint16 to float32 conversion.
721 gles2.teximage2d_callback_ = 715 gles2.teximage2d_callback_ =
722 base::Bind([](GLenum target, GLint level, GLint internalformat, 716 base::Bind([](GLenum target, GLint level, GLint internalformat,
723 GLsizei width, GLsizei height, GLint border, GLenum format, 717 GLsizei width, GLsizei height, GLint border, GLenum format,
724 GLenum type, const void* pixels) { 718 GLenum type, const void* pixels) {
725 EXPECT_EQ(static_cast<unsigned>(GL_FLOAT), type); 719 EXPECT_EQ(static_cast<unsigned>(GL_FLOAT), type);
726 EXPECT_EQ(static_cast<unsigned>(GL_RGBA), format); 720 EXPECT_EQ(static_cast<unsigned>(GL_RGBA), format);
727 EXPECT_EQ(GL_RGBA, internalformat); 721 EXPECT_EQ(GL_RGBA, internalformat);
728 EXPECT_EQ(0, border); 722 EXPECT_EQ(0, border);
729 EXPECT_EQ(16, width); 723 EXPECT_EQ(16, width);
730 EXPECT_EQ(16, height); 724 EXPECT_EQ(16, height);
731 EXPECT_EQ(static_cast<unsigned>(GL_TEXTURE_2D), target); 725 EXPECT_EQ(static_cast<unsigned>(GL_TEXTURE_2D), target);
732 const float* data = static_cast<const float*>(pixels); 726 const float* data = static_cast<const float*>(pixels);
733 for (int j = 0; j < height; j++) { 727 for (int j = 0; j < height; j++) {
734 for (int i = 0; i < width; i++) { 728 for (int i = 0; i < width; i++) {
735 const int value = i + (height - j - 1) * width; // flip_y is true. 729 const int value = i + (height - j - 1) * width; // flip_y is true.
736 float expected_value = 730 float expected_value =
737 (((value & 0xFF) << 8) | (~value & 0xFF)) / 65535.f; 731 (((value & 0xFF) << 8) | (~value & 0xFF)) / 65535.f;
738 EXPECT_EQ(expected_value, data[(i + j * width) * 4]); 732 EXPECT_EQ(expected_value, data[(i + j * width) * 4]);
739 EXPECT_EQ(expected_value, data[(i + j * width) * 4 + 1]); 733 EXPECT_EQ(expected_value, data[(i + j * width) * 4 + 1]);
740 EXPECT_EQ(expected_value, data[(i + j * width) * 4 + 2]); 734 EXPECT_EQ(expected_value, data[(i + j * width) * 4 + 2]);
741 EXPECT_EQ(1.0f, data[(i + j * width) * 4 + 3]); 735 EXPECT_EQ(1.0f, data[(i + j * width) * 4 + 3]);
742 } 736 }
743 } 737 }
744 }); 738 });
745 SkCanvasVideoRenderer::TexImage2D(GL_TEXTURE_2D, &gles2, video_frame.get(), 0, 739 SkCanvasVideoRenderer::TexImage2D(
746 GL_RGBA, GL_RGBA, GL_FLOAT, true /*flip_y*/, 740 GL_TEXTURE_2D, 0, &gles2, gpu::Capabilities(), video_frame.get(), 0,
747 true); 741 GL_RGBA, GL_RGBA, GL_FLOAT, true /*flip_y*/, true);
748 } 742 }
749 743
750 TEST_F(SkCanvasVideoRendererTest, TexSubImage2D_Y16_R32F) { 744 TEST_F(SkCanvasVideoRendererTest, TexSubImage2D_Y16_R32F) {
751 // Create test frame. 745 // Create test frame.
752 // |offset_x| and |offset_y| define visible rect's offset to coded rect. 746 // |offset_x| and |offset_y| define visible rect's offset to coded rect.
753 const int offset_x = 3; 747 const int offset_x = 3;
754 const int offset_y = 5; 748 const int offset_y = 5;
755 const int width = 16; 749 const int width = 16;
756 const int height = 16; 750 const int height = 16;
757 const int stride = width + offset_x; 751 const int stride = width + offset_x;
758 const size_t byte_size = stride * (height + offset_y) * 2; 752 const size_t byte_size = stride * (height + offset_y) * 2;
759 std::unique_ptr<unsigned char, base::AlignedFreeDeleter> memory( 753 std::unique_ptr<unsigned char, base::AlignedFreeDeleter> memory(
760 static_cast<unsigned char*>(base::AlignedAlloc( 754 static_cast<unsigned char*>(base::AlignedAlloc(
761 byte_size, media::VideoFrame::kFrameAddressAlignment))); 755 byte_size, media::VideoFrame::kFrameAddressAlignment)));
762 const gfx::Rect rect(offset_x, offset_y, width, height); 756 const gfx::Rect rect(offset_x, offset_y, width, height);
763 scoped_refptr<media::VideoFrame> video_frame = 757 scoped_refptr<media::VideoFrame> video_frame =
764 CreateTestY16Frame(gfx::Size(stride, offset_y + height), rect, 758 CreateTestY16Frame(gfx::Size(stride, offset_y + height), rect,
765 memory.get(), cropped_frame()->timestamp()); 759 memory.get(), cropped_frame()->timestamp());
766 760
767 // Create GL context.
768 sk_sp<const GrGLInterface> null_interface(GrGLCreateNullInterface());
769 sk_sp<GrContext> gr_context(GrContext::Create(
770 kOpenGL_GrBackend,
771 reinterpret_cast<GrBackendContext>(null_interface.get())));
772 TestGLES2Interface gles2; 761 TestGLES2Interface gles2;
773 Context3D context_3d(&gles2, gr_context.get());
774
775 // Bind the texImage2D callback to verify the uint16 to float32 conversion. 762 // Bind the texImage2D callback to verify the uint16 to float32 conversion.
776 gles2.texsubimage2d_callback_ = base::Bind([]( 763 gles2.texsubimage2d_callback_ = base::Bind([](
777 GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, 764 GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
778 GLsizei height, GLenum format, GLenum type, const void* pixels) { 765 GLsizei height, GLenum format, GLenum type, const void* pixels) {
779 EXPECT_EQ(static_cast<unsigned>(GL_FLOAT), type); 766 EXPECT_EQ(static_cast<unsigned>(GL_FLOAT), type);
780 EXPECT_EQ(static_cast<unsigned>(GL_RED), format); 767 EXPECT_EQ(static_cast<unsigned>(GL_RED), format);
781 EXPECT_EQ(2, xoffset); 768 EXPECT_EQ(2, xoffset);
782 EXPECT_EQ(1, yoffset); 769 EXPECT_EQ(1, yoffset);
783 EXPECT_EQ(16, width); 770 EXPECT_EQ(16, width);
784 EXPECT_EQ(16, height); 771 EXPECT_EQ(16, height);
785 EXPECT_EQ(static_cast<unsigned>(GL_TEXTURE_2D), target); 772 EXPECT_EQ(static_cast<unsigned>(GL_TEXTURE_2D), target);
786 const float* data = static_cast<const float*>(pixels); 773 const float* data = static_cast<const float*>(pixels);
787 for (int j = 0; j < height; j++) { 774 for (int j = 0; j < height; j++) {
788 for (int i = 0; i < width; i++) { 775 for (int i = 0; i < width; i++) {
789 const int value = i + j * width; // flip_y is false. 776 const int value = i + j * width; // flip_y is false.
790 float expected_value = 777 float expected_value =
791 (((value & 0xFF) << 8) | (~value & 0xFF)) / 65535.f; 778 (((value & 0xFF) << 8) | (~value & 0xFF)) / 65535.f;
792 EXPECT_EQ(expected_value, data[(i + j * width)]); 779 EXPECT_EQ(expected_value, data[(i + j * width)]);
793 } 780 }
794 } 781 }
795 }); 782 });
796 SkCanvasVideoRenderer::TexSubImage2D(GL_TEXTURE_2D, &gles2, video_frame.get(), 783 SkCanvasVideoRenderer::TexSubImage2D(GL_TEXTURE_2D, &gles2, video_frame.get(),
797 0, GL_RED, GL_FLOAT, 2 /*xoffset*/, 784 0, GL_RED, GL_FLOAT, 2 /*xoffset*/,
798 1 /*yoffset*/, false /*flip_y*/, true); 785 1 /*yoffset*/, false /*flip_y*/, true);
799 } 786 }
800 787
801 } // namespace media 788 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698