Index: cc/output/renderer_pixeltest.cc |
diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc |
index ce3abfa63734cc6190cbe5b51965434c3e8ccffe..869bb9b0c2acc61392a4dafc7a10e016e77e70c8 100644 |
--- a/cc/output/renderer_pixeltest.cc |
+++ b/cc/output/renderer_pixeltest.cc |
@@ -398,14 +398,12 @@ TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithBackground) { |
class VideoGLRendererPixelTest : public GLRendererPixelTest { |
protected: |
- scoped_ptr<YUVVideoDrawQuad> CreateTestYUVVideoDrawQuad( |
+ scoped_ptr<YUVVideoDrawQuad> CreateTestYUVVideoDrawQuad_Striped( |
SharedQuadState* shared_state, |
media::VideoFrame::Format format, |
bool is_transparent, |
const gfx::RectF& tex_coord_rect) { |
- const bool with_alpha = (format == media::VideoFrame::YV12A); |
const gfx::Rect rect(this->device_viewport_size_); |
- const gfx::Rect opaque_rect(0, 0, 0, 0); |
scoped_refptr<media::VideoFrame> video_frame = |
media::VideoFrame::CreateFrame( |
@@ -435,6 +433,56 @@ class VideoGLRendererPixelTest : public GLRendererPixelTest { |
v_row[j] = (v_value += 5); |
} |
} |
+ return CreateTestYUVVideoDrawQuad_FromVideoFrame( |
+ shared_state, video_frame, is_transparent, tex_coord_rect); |
+ } |
+ |
+ scoped_ptr<YUVVideoDrawQuad> CreateTestYUVVideoDrawQuad_Solid( |
+ SharedQuadState* shared_state, |
+ media::VideoFrame::Format format, |
+ bool is_transparent, |
+ const gfx::RectF& tex_coord_rect, |
+ uint8 y, |
+ uint8 u, |
+ uint8 v) { |
+ const gfx::Rect rect(this->device_viewport_size_); |
+ |
+ scoped_refptr<media::VideoFrame> video_frame = |
+ media::VideoFrame::CreateFrame( |
+ format, rect.size(), rect, rect.size(), base::TimeDelta()); |
+ |
+ // YUV values of a solid, constant, color. Useful for testing that color |
+ // space/color range are being handled properly. |
+ memset(video_frame->data(media::VideoFrame::kYPlane), |
+ y, |
+ video_frame->stride(media::VideoFrame::kYPlane) * |
+ video_frame->rows(media::VideoFrame::kYPlane)); |
+ memset(video_frame->data(media::VideoFrame::kUPlane), |
+ u, |
+ video_frame->stride(media::VideoFrame::kUPlane) * |
+ video_frame->rows(media::VideoFrame::kUPlane)); |
+ memset(video_frame->data(media::VideoFrame::kVPlane), |
+ v, |
+ video_frame->stride(media::VideoFrame::kVPlane) * |
+ video_frame->rows(media::VideoFrame::kVPlane)); |
+ |
+ return CreateTestYUVVideoDrawQuad_FromVideoFrame( |
+ shared_state, video_frame, is_transparent, tex_coord_rect); |
+ } |
+ |
+ scoped_ptr<YUVVideoDrawQuad> CreateTestYUVVideoDrawQuad_FromVideoFrame( |
+ SharedQuadState* shared_state, |
+ scoped_refptr<media::VideoFrame> video_frame, |
+ bool is_transparent, |
+ const gfx::RectF& tex_coord_rect) { |
+ const bool with_alpha = (video_frame->format() == media::VideoFrame::YV12A); |
+ const YUVVideoDrawQuad::ColorSpace color_space = |
+ (video_frame->format() == media::VideoFrame::YV12J |
+ ? YUVVideoDrawQuad::REC_601_JPEG |
+ : YUVVideoDrawQuad::REC_601); |
+ const gfx::Rect rect(this->device_viewport_size_); |
+ const gfx::Rect opaque_rect(0, 0, 0, 0); |
+ |
if (with_alpha) |
memset(video_frame->data(media::VideoFrame::kAPlane), |
is_transparent ? 0 : 128, |
@@ -446,8 +494,9 @@ class VideoGLRendererPixelTest : public GLRendererPixelTest { |
video_frame); |
EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); |
- EXPECT_EQ(media::VideoFrame::NumPlanes(format), resources.mailboxes.size()); |
- EXPECT_EQ(media::VideoFrame::NumPlanes(format), |
+ EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()), |
+ resources.mailboxes.size()); |
+ EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()), |
resources.release_callbacks.size()); |
ResourceProvider::ResourceId y_resource = |
@@ -482,7 +531,8 @@ class VideoGLRendererPixelTest : public GLRendererPixelTest { |
y_resource, |
u_resource, |
v_resource, |
- a_resource); |
+ a_resource, |
+ color_space); |
return yuv_quad.Pass(); |
} |
@@ -506,10 +556,10 @@ TEST_F(VideoGLRendererPixelTest, SimpleYUVRect) { |
CreateTestSharedQuadState(gfx::Transform(), rect); |
scoped_ptr<YUVVideoDrawQuad> yuv_quad = |
- CreateTestYUVVideoDrawQuad(shared_state.get(), |
- media::VideoFrame::YV12, |
- false, |
- gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f)); |
+ CreateTestYUVVideoDrawQuad_Striped(shared_state.get(), |
+ media::VideoFrame::YV12, |
+ false, |
+ gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f)); |
pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>()); |
@@ -532,11 +582,11 @@ TEST_F(VideoGLRendererPixelTest, OffsetYUVRect) { |
CreateTestSharedQuadState(gfx::Transform(), rect); |
// Intentionally sets frame format to I420 for testing coverage. |
- scoped_ptr<YUVVideoDrawQuad> yuv_quad = |
- CreateTestYUVVideoDrawQuad(shared_state.get(), |
- media::VideoFrame::I420, |
- false, |
- gfx::RectF(0.125f, 0.25f, 0.75f, 0.5f)); |
+ scoped_ptr<YUVVideoDrawQuad> yuv_quad = CreateTestYUVVideoDrawQuad_Striped( |
+ shared_state.get(), |
+ media::VideoFrame::I420, |
+ false, |
+ gfx::RectF(0.125f, 0.25f, 0.75f, 0.5f)); |
pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>()); |
@@ -549,6 +599,96 @@ TEST_F(VideoGLRendererPixelTest, OffsetYUVRect) { |
FuzzyPixelOffByOneComparator(true))); |
} |
+TEST_F(VideoGLRendererPixelTest, SimpleYUVRectBlack) { |
+ gfx::Rect rect(this->device_viewport_size_); |
+ |
+ RenderPass::Id id(1, 1); |
+ scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
+ |
+ scoped_ptr<SharedQuadState> shared_state = |
+ CreateTestSharedQuadState(gfx::Transform(), rect); |
+ |
+ // In MPEG color range YUV values of (15,128,128) should produce black. |
+ scoped_ptr<YUVVideoDrawQuad> yuv_quad = |
+ CreateTestYUVVideoDrawQuad_Solid(shared_state.get(), |
+ media::VideoFrame::YV12, |
+ false, |
+ gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), |
+ 15, |
+ 128, |
+ 128); |
+ |
+ pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>()); |
+ |
+ RenderPassList pass_list; |
+ pass_list.push_back(pass.Pass()); |
+ |
+ // If we didn't get black out of the YUV values above, then we probably have a |
+ // color range issue. |
+ EXPECT_TRUE(this->RunPixelTest(&pass_list, |
+ base::FilePath(FILE_PATH_LITERAL("black.png")), |
+ FuzzyPixelOffByOneComparator(true))); |
+} |
+ |
+TEST_F(VideoGLRendererPixelTest, SimpleYUVJRect) { |
+ gfx::Rect rect(this->device_viewport_size_); |
+ |
+ RenderPass::Id id(1, 1); |
+ scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
+ |
+ scoped_ptr<SharedQuadState> shared_state = |
+ CreateTestSharedQuadState(gfx::Transform(), rect); |
+ |
+ // YUV of (149,43,21) should be green (0,255,0) in RGB. |
+ scoped_ptr<YUVVideoDrawQuad> yuv_quad = |
+ CreateTestYUVVideoDrawQuad_Solid(shared_state.get(), |
+ media::VideoFrame::YV12J, |
+ false, |
+ gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), |
+ 149, |
+ 43, |
+ 21); |
+ |
+ pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>()); |
+ |
+ RenderPassList pass_list; |
+ pass_list.push_back(pass.Pass()); |
+ |
+ EXPECT_TRUE(this->RunPixelTest(&pass_list, |
+ base::FilePath(FILE_PATH_LITERAL("green.png")), |
+ FuzzyPixelOffByOneComparator(true))); |
+} |
+ |
+TEST_F(VideoGLRendererPixelTest, SimpleYUVJRectGrey) { |
+ gfx::Rect rect(this->device_viewport_size_); |
+ |
+ RenderPass::Id id(1, 1); |
+ scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
+ |
+ scoped_ptr<SharedQuadState> shared_state = |
+ CreateTestSharedQuadState(gfx::Transform(), rect); |
+ |
+ // Dark grey in JPEG color range (in MPEG, this is black). |
+ scoped_ptr<YUVVideoDrawQuad> yuv_quad = |
+ CreateTestYUVVideoDrawQuad_Solid(shared_state.get(), |
+ media::VideoFrame::YV12J, |
+ false, |
+ gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), |
+ 15, |
+ 128, |
+ 128); |
+ |
+ pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>()); |
+ |
+ RenderPassList pass_list; |
+ pass_list.push_back(pass.Pass()); |
+ |
+ EXPECT_TRUE( |
+ this->RunPixelTest(&pass_list, |
+ base::FilePath(FILE_PATH_LITERAL("dark_grey.png")), |
+ FuzzyPixelOffByOneComparator(true))); |
+} |
+ |
TEST_F(VideoGLRendererPixelTest, SimpleYUVARect) { |
gfx::Rect rect(this->device_viewport_size_); |
@@ -559,10 +699,10 @@ TEST_F(VideoGLRendererPixelTest, SimpleYUVARect) { |
CreateTestSharedQuadState(gfx::Transform(), rect); |
scoped_ptr<YUVVideoDrawQuad> yuv_quad = |
- CreateTestYUVVideoDrawQuad(shared_state.get(), |
- media::VideoFrame::YV12A, |
- false, |
- gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f)); |
+ CreateTestYUVVideoDrawQuad_Striped(shared_state.get(), |
+ media::VideoFrame::YV12A, |
+ false, |
+ gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f)); |
pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>()); |
@@ -590,10 +730,10 @@ TEST_F(VideoGLRendererPixelTest, FullyTransparentYUVARect) { |
CreateTestSharedQuadState(gfx::Transform(), rect); |
scoped_ptr<YUVVideoDrawQuad> yuv_quad = |
- CreateTestYUVVideoDrawQuad(shared_state.get(), |
- media::VideoFrame::YV12A, |
- true, |
- gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f)); |
+ CreateTestYUVVideoDrawQuad_Striped(shared_state.get(), |
+ media::VideoFrame::YV12A, |
+ true, |
+ gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f)); |
pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>()); |