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

Side by Side Diff: cc/output/renderer_pixeltest.cc

Issue 2088273003: Video Color Managament (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: bugfix Created 4 years, 5 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 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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 <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 #include <memory> 7 #include <memory>
8 8
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "cc/output/gl_renderer.h" 10 #include "cc/output/gl_renderer.h"
11 #include "cc/quads/draw_quad.h" 11 #include "cc/quads/draw_quad.h"
12 #include "cc/quads/picture_draw_quad.h" 12 #include "cc/quads/picture_draw_quad.h"
13 #include "cc/quads/texture_draw_quad.h" 13 #include "cc/quads/texture_draw_quad.h"
14 #include "cc/resources/video_resource_updater.h" 14 #include "cc/resources/video_resource_updater.h"
15 #include "cc/test/fake_raster_source.h" 15 #include "cc/test/fake_raster_source.h"
16 #include "cc/test/fake_recording_source.h" 16 #include "cc/test/fake_recording_source.h"
17 #include "cc/test/pixel_test.h" 17 #include "cc/test/pixel_test.h"
18 #include "gpu/command_buffer/client/gles2_interface.h" 18 #include "gpu/command_buffer/client/gles2_interface.h"
19 #include "media/base/video_color_space.h"
19 #include "media/base/video_frame.h" 20 #include "media/base/video_frame.h"
20 #include "third_party/skia/include/core/SkColorPriv.h" 21 #include "third_party/skia/include/core/SkColorPriv.h"
21 #include "third_party/skia/include/core/SkImageFilter.h" 22 #include "third_party/skia/include/core/SkImageFilter.h"
22 #include "third_party/skia/include/core/SkMatrix.h" 23 #include "third_party/skia/include/core/SkMatrix.h"
23 #include "third_party/skia/include/core/SkRefCnt.h" 24 #include "third_party/skia/include/core/SkRefCnt.h"
24 #include "third_party/skia/include/core/SkSurface.h" 25 #include "third_party/skia/include/core/SkSurface.h"
25 #include "third_party/skia/include/effects/SkColorFilterImageFilter.h" 26 #include "third_party/skia/include/effects/SkColorFilterImageFilter.h"
26 #include "third_party/skia/include/effects/SkColorMatrixFilter.h" 27 #include "third_party/skia/include/effects/SkColorMatrixFilter.h"
27 #include "ui/gfx/geometry/rect_conversions.h" 28 #include "ui/gfx/geometry/rect_conversions.h"
28 29
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 ResourceProvider* resource_provider) { 200 ResourceProvider* resource_provider) {
200 const bool with_alpha = (video_frame->format() == media::PIXEL_FORMAT_YV12A); 201 const bool with_alpha = (video_frame->format() == media::PIXEL_FORMAT_YV12A);
201 YUVVideoDrawQuad::ColorSpace color_space = YUVVideoDrawQuad::REC_601; 202 YUVVideoDrawQuad::ColorSpace color_space = YUVVideoDrawQuad::REC_601;
202 int video_frame_color_space; 203 int video_frame_color_space;
203 if (video_frame->metadata()->GetInteger( 204 if (video_frame->metadata()->GetInteger(
204 media::VideoFrameMetadata::COLOR_SPACE, &video_frame_color_space) && 205 media::VideoFrameMetadata::COLOR_SPACE, &video_frame_color_space) &&
205 video_frame_color_space == media::COLOR_SPACE_JPEG) { 206 video_frame_color_space == media::COLOR_SPACE_JPEG) {
206 color_space = YUVVideoDrawQuad::JPEG; 207 color_space = YUVVideoDrawQuad::JPEG;
207 } 208 }
208 209
210 media::VideoColorSpace video_color_space(video_frame.get());
211
209 const gfx::Rect opaque_rect(0, 0, 0, 0); 212 const gfx::Rect opaque_rect(0, 0, 0, 0);
210 213
211 if (with_alpha) { 214 if (with_alpha) {
212 memset(video_frame->data(media::VideoFrame::kAPlane), alpha_value, 215 memset(video_frame->data(media::VideoFrame::kAPlane), alpha_value,
213 video_frame->stride(media::VideoFrame::kAPlane) * 216 video_frame->stride(media::VideoFrame::kAPlane) *
214 video_frame->rows(media::VideoFrame::kAPlane)); 217 video_frame->rows(media::VideoFrame::kAPlane));
215 } 218 }
216 219
217 VideoFrameExternalResources resources = 220 VideoFrameExternalResources resources =
218 video_resource_updater->CreateExternalResourcesFromVideoFrame( 221 video_resource_updater->CreateExternalResourcesFromVideoFrame(
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
264 gfx::RectF uv_tex_coord_rect(tex_coord_rect.x() * uv_tex_size.width(), 267 gfx::RectF uv_tex_coord_rect(tex_coord_rect.x() * uv_tex_size.width(),
265 tex_coord_rect.y() * uv_tex_size.height(), 268 tex_coord_rect.y() * uv_tex_size.height(),
266 tex_coord_rect.width() * uv_tex_size.width(), 269 tex_coord_rect.width() * uv_tex_size.width(),
267 tex_coord_rect.height() * uv_tex_size.height()); 270 tex_coord_rect.height() * uv_tex_size.height());
268 271
269 YUVVideoDrawQuad* yuv_quad = 272 YUVVideoDrawQuad* yuv_quad =
270 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); 273 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>();
271 yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect, 274 yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect,
272 ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size, 275 ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size,
273 uv_tex_size, y_resource, u_resource, v_resource, a_resource, 276 uv_tex_size, y_resource, u_resource, v_resource, a_resource,
274 color_space, 0.0f, 1.0f); 277 color_space, video_color_space, 0.0f, 1.0f);
275 } 278 }
276 279
277 // Upshift video frame to 10 bit. 280 // Upshift video frame to 10 bit.
278 scoped_refptr<media::VideoFrame> CreateHighbitVideoFrame( 281 scoped_refptr<media::VideoFrame> CreateHighbitVideoFrame(
279 media::VideoFrame* video_frame) { 282 media::VideoFrame* video_frame) {
280 media::VideoPixelFormat format; 283 media::VideoPixelFormat format;
281 switch (video_frame->format()) { 284 switch (video_frame->format()) {
282 case media::PIXEL_FORMAT_I420: 285 case media::PIXEL_FORMAT_I420:
283 case media::PIXEL_FORMAT_YV12: 286 case media::PIXEL_FORMAT_YV12:
284 format = media::PIXEL_FORMAT_YUV420P10; 287 format = media::PIXEL_FORMAT_YUV420P10;
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
467 memset(video_frame->data(media::VideoFrame::kVPlane), v, 470 memset(video_frame->data(media::VideoFrame::kVPlane), v,
468 video_frame->stride(media::VideoFrame::kVPlane) * 471 video_frame->stride(media::VideoFrame::kVPlane) *
469 video_frame->rows(media::VideoFrame::kVPlane)); 472 video_frame->rows(media::VideoFrame::kVPlane));
470 473
471 uint8_t alpha_value = is_transparent ? 0 : 128; 474 uint8_t alpha_value = is_transparent ? 0 : 128;
472 CreateTestYUVVideoDrawQuad_FromVideoFrame( 475 CreateTestYUVVideoDrawQuad_FromVideoFrame(
473 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, 476 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass,
474 video_resource_updater, rect, visible_rect, resource_provider); 477 video_resource_updater, rect, visible_rect, resource_provider);
475 } 478 }
476 479
477 void CreateTestYUVVideoDrawQuad_NV12(const SharedQuadState* shared_state, 480 void CreateTestYUVVideoDrawQuad_NV12(
478 media::ColorSpace video_frame_color_space, 481 const SharedQuadState* shared_state,
479 const gfx::RectF& tex_coord_rect, 482 media::ColorSpace video_frame_color_space,
480 uint8_t y, 483 const media::VideoColorSpace& video_color_space,
481 uint8_t u, 484 const gfx::RectF& tex_coord_rect,
482 uint8_t v, 485 uint8_t y,
483 RenderPass* render_pass, 486 uint8_t u,
484 const gfx::Rect& rect, 487 uint8_t v,
485 const gfx::Rect& visible_rect, 488 RenderPass* render_pass,
486 ResourceProvider* resource_provider) { 489 const gfx::Rect& rect,
490 const gfx::Rect& visible_rect,
491 ResourceProvider* resource_provider) {
487 YUVVideoDrawQuad::ColorSpace color_space = YUVVideoDrawQuad::REC_601; 492 YUVVideoDrawQuad::ColorSpace color_space = YUVVideoDrawQuad::REC_601;
488 if (video_frame_color_space == media::COLOR_SPACE_JPEG) { 493 if (video_frame_color_space == media::COLOR_SPACE_JPEG) {
489 color_space = YUVVideoDrawQuad::JPEG; 494 color_space = YUVVideoDrawQuad::JPEG;
490 } 495 }
491 496
492 const gfx::Rect opaque_rect(0, 0, 0, 0); 497 const gfx::Rect opaque_rect(0, 0, 0, 0);
493 const gfx::Size ya_tex_size = rect.size(); 498 const gfx::Size ya_tex_size = rect.size();
494 const gfx::Size uv_tex_size = media::VideoFrame::PlaneSize( 499 const gfx::Size uv_tex_size = media::VideoFrame::PlaneSize(
495 media::PIXEL_FORMAT_NV12, media::VideoFrame::kUVPlane, rect.size()); 500 media::PIXEL_FORMAT_NV12, media::VideoFrame::kUVPlane, rect.size());
496 501
(...skipping 21 matching lines...) Expand all
518 gfx::RectF uv_tex_coord_rect(tex_coord_rect.x() * uv_tex_size.width(), 523 gfx::RectF uv_tex_coord_rect(tex_coord_rect.x() * uv_tex_size.width(),
519 tex_coord_rect.y() * uv_tex_size.height(), 524 tex_coord_rect.y() * uv_tex_size.height(),
520 tex_coord_rect.width() * uv_tex_size.width(), 525 tex_coord_rect.width() * uv_tex_size.width(),
521 tex_coord_rect.height() * uv_tex_size.height()); 526 tex_coord_rect.height() * uv_tex_size.height());
522 527
523 YUVVideoDrawQuad* yuv_quad = 528 YUVVideoDrawQuad* yuv_quad =
524 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); 529 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>();
525 yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect, 530 yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect,
526 ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size, 531 ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size,
527 uv_tex_size, y_resource, u_resource, v_resource, a_resource, 532 uv_tex_size, y_resource, u_resource, v_resource, a_resource,
528 color_space, 0.0f, 1.0f); 533 color_space, video_color_space, 0.0f, 1.0f);
529 } 534 }
530 535
531 typedef ::testing::Types<GLRenderer, 536 typedef ::testing::Types<GLRenderer,
532 SoftwareRenderer, 537 SoftwareRenderer,
533 GLRendererWithExpandedViewport, 538 GLRendererWithExpandedViewport,
534 SoftwareRendererWithExpandedViewport> RendererTypes; 539 SoftwareRendererWithExpandedViewport> RendererTypes;
535 TYPED_TEST_CASE(RendererPixelTest, RendererTypes); 540 TYPED_TEST_CASE(RendererPixelTest, RendererTypes);
536 541
537 template <typename RendererType> 542 template <typename RendererType>
538 class SoftwareRendererPixelTest : public RendererPixelTest<RendererType> {}; 543 class SoftwareRendererPixelTest : public RendererPixelTest<RendererType> {};
(...skipping 678 matching lines...) Expand 10 before | Expand all | Expand 10 after
1217 gfx::Rect rect(this->device_viewport_size_); 1222 gfx::Rect rect(this->device_viewport_size_);
1218 1223
1219 RenderPassId id(1, 1); 1224 RenderPassId id(1, 1);
1220 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 1225 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
1221 1226
1222 SharedQuadState* shared_state = 1227 SharedQuadState* shared_state =
1223 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); 1228 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
1224 1229
1225 // YUV of (149,43,21) should be green (0,255,0) in RGB. 1230 // YUV of (149,43,21) should be green (0,255,0) in RGB.
1226 CreateTestYUVVideoDrawQuad_NV12( 1231 CreateTestYUVVideoDrawQuad_NV12(
1227 shared_state, media::COLOR_SPACE_JPEG, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 1232 shared_state, media::COLOR_SPACE_JPEG,
1228 149, 43, 21, pass.get(), rect, rect, resource_provider_.get()); 1233 media::VideoColorSpace(media::COLOR_SPACE_JPEG),
1234 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 149, 43, 21, pass.get(), rect, rect,
1235 resource_provider_.get());
1229 1236
1230 RenderPassList pass_list; 1237 RenderPassList pass_list;
1231 pass_list.push_back(std::move(pass)); 1238 pass_list.push_back(std::move(pass));
1232 1239
1233 EXPECT_TRUE(this->RunPixelTest(&pass_list, 1240 EXPECT_TRUE(this->RunPixelTest(&pass_list,
1234 base::FilePath(FILE_PATH_LITERAL("green.png")), 1241 base::FilePath(FILE_PATH_LITERAL("green.png")),
1235 FuzzyPixelOffByOneComparator(true))); 1242 FuzzyPixelOffByOneComparator(true)));
1236 } 1243 }
1237 1244
1238 // Test that a YUV video doesn't bleed outside of its tex coords when the 1245 // Test that a YUV video doesn't bleed outside of its tex coords when the
(...skipping 1935 matching lines...) Expand 10 before | Expand all | Expand 10 after
3174 3181
3175 EXPECT_TRUE(this->RunPixelTest( 3182 EXPECT_TRUE(this->RunPixelTest(
3176 &pass_list, base::FilePath(FILE_PATH_LITERAL("spiral.png")), 3183 &pass_list, base::FilePath(FILE_PATH_LITERAL("spiral.png")),
3177 FuzzyPixelOffByOneComparator(true))); 3184 FuzzyPixelOffByOneComparator(true)));
3178 } 3185 }
3179 3186
3180 #endif // !defined(OS_ANDROID) 3187 #endif // !defined(OS_ANDROID)
3181 3188
3182 } // namespace 3189 } // namespace
3183 } // namespace cc 3190 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698