From 82ba0a1a9f120c5376a7978f1c6ba995b7c819f6 Mon Sep 17 00:00:00 2001 From: hubbe Date: Mon, 8 Feb 2016 16:01:14 -0800 Subject: Add support for 9- and 10-bit h264 videos. Videos are uploaded to GPU using half-floats if supported, otherwise they are downshifted to regular 8-bit textures before uploading. No dithering is done, except for whatever GL_DITHER might do. (Which is probably nothing.) BUG=445071 CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel Committed: https://crrev.com/074c4287f2625860b2a9eb437b97f1f1788f8f4b Cr-Commit-Position: refs/heads/master@{#373691} Review URL: https://codereview.chromium.org/1599533002 Cr-Commit-Position: refs/heads/master@{#374221} --- cc/quads/draw_quad_unittest.cc | 52 ++++++++++++++++++++++++++++++++++------- cc/quads/yuv_video_draw_quad.cc | 12 ++++++++-- cc/quads/yuv_video_draw_quad.h | 10 ++++++-- 3 files changed, 61 insertions(+), 13 deletions(-) (limited to 'cc/quads') diff --git a/cc/quads/draw_quad_unittest.cc b/cc/quads/draw_quad_unittest.cc index cfc20a1..8bde8c0 100644 --- a/cc/quads/draw_quad_unittest.cc +++ b/cc/quads/draw_quad_unittest.cc @@ -336,6 +336,31 @@ void CompareDrawQuad(DrawQuad* quad, } \ SETUP_AND_COPY_QUAD_NEW(Type, quad_new); +#define CREATE_QUAD_11_ALL(Type, a, b, c, d, e, f, g, h, i, j, k) \ + Type* quad_all = render_pass->CreateAndAppendDrawQuad(); \ + { \ + QUAD_DATA quad_all->SetAll(shared_state, quad_rect, quad_opaque_rect, \ + quad_visible_rect, needs_blending, a, b, c, d, \ + e, f, g, h, i, j, k); \ + } \ + SETUP_AND_COPY_QUAD_ALL(Type, quad_all); + +#define CREATE_QUAD_12_NEW(Type, a, b, c, d, e, f, g, h, i, j, k, l) \ + Type* quad_new = render_pass->CreateAndAppendDrawQuad(); \ + { \ + QUAD_DATA quad_new->SetNew(shared_state, quad_rect, a, b, c, d, e, f, g, \ + h, i, j, k, l); \ + } \ + SETUP_AND_COPY_QUAD_NEW(Type, quad_new); + +#define CREATE_QUAD_13_NEW(Type, a, b, c, d, e, f, g, h, i, j, k, l, m) \ + Type* quad_new = render_pass->CreateAndAppendDrawQuad(); \ + { \ + QUAD_DATA quad_new->SetNew(shared_state, quad_rect, a, b, c, d, e, f, g, \ + h, i, j, k, l, m); \ + } \ + SETUP_AND_COPY_QUAD_NEW(Type, quad_new); + #define CREATE_QUAD_ALL_RP(Type, a, b, c, d, e, f, g, copy_a) \ Type* quad_all = render_pass->CreateAndAppendDrawQuad(); \ { \ @@ -623,13 +648,16 @@ TEST(DrawQuadTest, CopyYUVVideoDrawQuad) { ResourceId u_plane_resource_id = 532; ResourceId v_plane_resource_id = 4; ResourceId a_plane_resource_id = 63; + float resource_offset = 0.5f; + float resource_multiplier = 2.001f; YUVVideoDrawQuad::ColorSpace color_space = YUVVideoDrawQuad::JPEG; CREATE_SHARED_STATE(); - CREATE_QUAD_11_NEW(YUVVideoDrawQuad, opaque_rect, visible_rect, + CREATE_QUAD_13_NEW(YUVVideoDrawQuad, opaque_rect, visible_rect, ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size, uv_tex_size, y_plane_resource_id, u_plane_resource_id, - v_plane_resource_id, a_plane_resource_id, color_space); + v_plane_resource_id, a_plane_resource_id, color_space, + resource_offset, resource_multiplier); EXPECT_EQ(DrawQuad::YUV_VIDEO_CONTENT, copy_quad->material); EXPECT_EQ(opaque_rect, copy_quad->opaque_rect); EXPECT_EQ(visible_rect, copy_quad->visible_rect); @@ -642,11 +670,14 @@ TEST(DrawQuadTest, CopyYUVVideoDrawQuad) { EXPECT_EQ(v_plane_resource_id, copy_quad->v_plane_resource_id()); EXPECT_EQ(a_plane_resource_id, copy_quad->a_plane_resource_id()); EXPECT_EQ(color_space, copy_quad->color_space); - - CREATE_QUAD_9_ALL(YUVVideoDrawQuad, ya_tex_coord_rect, uv_tex_coord_rect, - ya_tex_size, uv_tex_size, y_plane_resource_id, - u_plane_resource_id, v_plane_resource_id, - a_plane_resource_id, color_space); + EXPECT_EQ(resource_offset, copy_quad->resource_offset); + EXPECT_EQ(resource_multiplier, copy_quad->resource_multiplier); + + CREATE_QUAD_11_ALL(YUVVideoDrawQuad, ya_tex_coord_rect, uv_tex_coord_rect, + ya_tex_size, uv_tex_size, y_plane_resource_id, + u_plane_resource_id, v_plane_resource_id, + a_plane_resource_id, color_space, resource_offset, + resource_multiplier); EXPECT_EQ(DrawQuad::YUV_VIDEO_CONTENT, copy_quad->material); EXPECT_EQ(ya_tex_coord_rect, copy_quad->ya_tex_coord_rect); EXPECT_EQ(uv_tex_coord_rect, copy_quad->uv_tex_coord_rect); @@ -657,6 +688,8 @@ TEST(DrawQuadTest, CopyYUVVideoDrawQuad) { EXPECT_EQ(v_plane_resource_id, copy_quad->v_plane_resource_id()); EXPECT_EQ(a_plane_resource_id, copy_quad->a_plane_resource_id()); EXPECT_EQ(color_space, copy_quad->color_space); + EXPECT_EQ(resource_offset, copy_quad->resource_offset); + EXPECT_EQ(resource_multiplier, copy_quad->resource_multiplier); } TEST(DrawQuadTest, CopyPictureDrawQuad) { @@ -879,10 +912,11 @@ TEST_F(DrawQuadIteratorTest, YUVVideoDrawQuad) { YUVVideoDrawQuad::ColorSpace color_space = YUVVideoDrawQuad::JPEG; CREATE_SHARED_STATE(); - CREATE_QUAD_11_NEW(YUVVideoDrawQuad, opaque_rect, visible_rect, + CREATE_QUAD_13_NEW(YUVVideoDrawQuad, opaque_rect, visible_rect, ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size, uv_tex_size, y_plane_resource_id, u_plane_resource_id, - v_plane_resource_id, a_plane_resource_id, color_space); + v_plane_resource_id, a_plane_resource_id, color_space, 0.0, + 1.0); EXPECT_EQ(DrawQuad::YUV_VIDEO_CONTENT, copy_quad->material); EXPECT_EQ(y_plane_resource_id, quad_new->y_plane_resource_id()); EXPECT_EQ(u_plane_resource_id, quad_new->u_plane_resource_id()); diff --git a/cc/quads/yuv_video_draw_quad.cc b/cc/quads/yuv_video_draw_quad.cc index f9a878a..93a0c91 100644 --- a/cc/quads/yuv_video_draw_quad.cc +++ b/cc/quads/yuv_video_draw_quad.cc @@ -27,7 +27,9 @@ void YUVVideoDrawQuad::SetNew(const SharedQuadState* shared_quad_state, unsigned u_plane_resource_id, unsigned v_plane_resource_id, unsigned a_plane_resource_id, - ColorSpace color_space) { + ColorSpace color_space, + float offset, + float multiplier) { bool needs_blending = false; DrawQuad::SetAll(shared_quad_state, DrawQuad::YUV_VIDEO_CONTENT, rect, opaque_rect, visible_rect, needs_blending); @@ -41,6 +43,8 @@ void YUVVideoDrawQuad::SetNew(const SharedQuadState* shared_quad_state, resources.ids[kAPlaneResourceIdIndex] = a_plane_resource_id; resources.count = a_plane_resource_id ? 4 : 3; this->color_space = color_space; + this->resource_offset = offset; + this->resource_multiplier = multiplier; } void YUVVideoDrawQuad::SetAll(const SharedQuadState* shared_quad_state, @@ -56,7 +60,9 @@ void YUVVideoDrawQuad::SetAll(const SharedQuadState* shared_quad_state, unsigned u_plane_resource_id, unsigned v_plane_resource_id, unsigned a_plane_resource_id, - ColorSpace color_space) { + ColorSpace color_space, + float offset, + float multiplier) { DrawQuad::SetAll(shared_quad_state, DrawQuad::YUV_VIDEO_CONTENT, rect, opaque_rect, visible_rect, needs_blending); this->ya_tex_coord_rect = ya_tex_coord_rect; @@ -69,6 +75,8 @@ void YUVVideoDrawQuad::SetAll(const SharedQuadState* shared_quad_state, resources.ids[kAPlaneResourceIdIndex] = a_plane_resource_id; resources.count = resources.ids[kAPlaneResourceIdIndex] ? 4 : 3; this->color_space = color_space; + this->resource_offset = offset; + this->resource_multiplier = multiplier; } const YUVVideoDrawQuad* YUVVideoDrawQuad::MaterialCast( diff --git a/cc/quads/yuv_video_draw_quad.h b/cc/quads/yuv_video_draw_quad.h index 1a72078..015d5b7 100644 --- a/cc/quads/yuv_video_draw_quad.h +++ b/cc/quads/yuv_video_draw_quad.h @@ -43,7 +43,9 @@ class CC_EXPORT YUVVideoDrawQuad : public DrawQuad { unsigned u_plane_resource_id, unsigned v_plane_resource_id, unsigned a_plane_resource_id, - ColorSpace color_space); + ColorSpace color_space, + float offset, + float multiplier); void SetAll(const SharedQuadState* shared_quad_state, const gfx::Rect& rect, @@ -61,13 +63,17 @@ class CC_EXPORT YUVVideoDrawQuad : public DrawQuad { unsigned u_plane_resource_id, unsigned v_plane_resource_id, unsigned a_plane_resource_id, - ColorSpace color_space); + ColorSpace color_space, + float offset, + float multiplier); gfx::RectF ya_tex_coord_rect; gfx::RectF uv_tex_coord_rect; gfx::Size ya_tex_size; gfx::Size uv_tex_size; ColorSpace color_space; + float resource_offset = 0.0f; + float resource_multiplier = 1.0f; static const YUVVideoDrawQuad* MaterialCast(const DrawQuad*); -- cgit v1.1