OLD | NEW |
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> |
| 6 #include <stdint.h> |
| 7 |
5 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
6 #include "cc/output/gl_renderer.h" | 9 #include "cc/output/gl_renderer.h" |
7 #include "cc/quads/draw_quad.h" | 10 #include "cc/quads/draw_quad.h" |
8 #include "cc/quads/picture_draw_quad.h" | 11 #include "cc/quads/picture_draw_quad.h" |
9 #include "cc/quads/texture_draw_quad.h" | 12 #include "cc/quads/texture_draw_quad.h" |
10 #include "cc/resources/video_resource_updater.h" | 13 #include "cc/resources/video_resource_updater.h" |
11 #include "cc/test/fake_display_list_raster_source.h" | 14 #include "cc/test/fake_display_list_raster_source.h" |
12 #include "cc/test/fake_display_list_recording_source.h" | 15 #include "cc/test/fake_display_list_recording_source.h" |
13 #include "cc/test/pixel_test.h" | 16 #include "cc/test/pixel_test.h" |
14 #include "gpu/command_buffer/client/gles2_interface.h" | 17 #include "gpu/command_buffer/client/gles2_interface.h" |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 TextureDrawQuad* quad = | 179 TextureDrawQuad* quad = |
177 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); | 180 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); |
178 quad->SetNew(shared_state, rect, gfx::Rect(), rect, resource, | 181 quad->SetNew(shared_state, rect, gfx::Rect(), rect, resource, |
179 premultiplied_alpha, uv_top_left, uv_bottom_right, | 182 premultiplied_alpha, uv_top_left, uv_bottom_right, |
180 background_color, vertex_opacity, flipped, nearest_neighbor); | 183 background_color, vertex_opacity, flipped, nearest_neighbor); |
181 } | 184 } |
182 | 185 |
183 void CreateTestYUVVideoDrawQuad_FromVideoFrame( | 186 void CreateTestYUVVideoDrawQuad_FromVideoFrame( |
184 const SharedQuadState* shared_state, | 187 const SharedQuadState* shared_state, |
185 scoped_refptr<media::VideoFrame> video_frame, | 188 scoped_refptr<media::VideoFrame> video_frame, |
186 uint8 alpha_value, | 189 uint8_t alpha_value, |
187 const gfx::RectF& tex_coord_rect, | 190 const gfx::RectF& tex_coord_rect, |
188 RenderPass* render_pass, | 191 RenderPass* render_pass, |
189 VideoResourceUpdater* video_resource_updater, | 192 VideoResourceUpdater* video_resource_updater, |
190 const gfx::Rect& rect, | 193 const gfx::Rect& rect, |
191 const gfx::Rect& visible_rect, | 194 const gfx::Rect& visible_rect, |
192 ResourceProvider* resource_provider) { | 195 ResourceProvider* resource_provider) { |
193 const bool with_alpha = (video_frame->format() == media::PIXEL_FORMAT_YV12A); | 196 const bool with_alpha = (video_frame->format() == media::PIXEL_FORMAT_YV12A); |
194 YUVVideoDrawQuad::ColorSpace color_space = YUVVideoDrawQuad::REC_601; | 197 YUVVideoDrawQuad::ColorSpace color_space = YUVVideoDrawQuad::REC_601; |
195 int video_frame_color_space; | 198 int video_frame_color_space; |
196 if (video_frame->metadata()->GetInteger( | 199 if (video_frame->metadata()->GetInteger( |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 uint8_t* u_row = video_frame->data(media::VideoFrame::kUPlane) + | 300 uint8_t* u_row = video_frame->data(media::VideoFrame::kUPlane) + |
298 video_frame->stride(media::VideoFrame::kUPlane) * i; | 301 video_frame->stride(media::VideoFrame::kUPlane) * i; |
299 uint8_t* v_row = video_frame->data(media::VideoFrame::kVPlane) + | 302 uint8_t* v_row = video_frame->data(media::VideoFrame::kVPlane) + |
300 video_frame->stride(media::VideoFrame::kVPlane) * i; | 303 video_frame->stride(media::VideoFrame::kVPlane) * i; |
301 for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kUPlane); | 304 for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kUPlane); |
302 ++j) { | 305 ++j) { |
303 u_row[j] = (u_value += 3); | 306 u_row[j] = (u_value += 3); |
304 v_row[j] = (v_value += 5); | 307 v_row[j] = (v_value += 5); |
305 } | 308 } |
306 } | 309 } |
307 uint8 alpha_value = is_transparent ? 0 : 128; | 310 uint8_t alpha_value = is_transparent ? 0 : 128; |
308 CreateTestYUVVideoDrawQuad_FromVideoFrame( | 311 CreateTestYUVVideoDrawQuad_FromVideoFrame( |
309 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, | 312 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, |
310 video_resource_updater, rect, visible_rect, resource_provider); | 313 video_resource_updater, rect, visible_rect, resource_provider); |
311 } | 314 } |
312 | 315 |
313 // Creates a video frame of size background_size filled with yuv_background, | 316 // Creates a video frame of size background_size filled with yuv_background, |
314 // and then draws a foreground rectangle in a different color on top of | 317 // and then draws a foreground rectangle in a different color on top of |
315 // that. The foreground rectangle must have coordinates that are divisible | 318 // that. The foreground rectangle must have coordinates that are divisible |
316 // by 2 because YUV is a block format. | 319 // by 2 because YUV is a block format. |
317 void CreateTestYUVVideoDrawQuad_TwoColor( | 320 void CreateTestYUVVideoDrawQuad_TwoColor( |
318 const SharedQuadState* shared_state, | 321 const SharedQuadState* shared_state, |
319 media::VideoPixelFormat format, | 322 media::VideoPixelFormat format, |
320 media::ColorSpace color_space, | 323 media::ColorSpace color_space, |
321 bool is_transparent, | 324 bool is_transparent, |
322 const gfx::RectF& tex_coord_rect, | 325 const gfx::RectF& tex_coord_rect, |
323 const gfx::Size& background_size, | 326 const gfx::Size& background_size, |
324 const gfx::Rect& visible_rect, | 327 const gfx::Rect& visible_rect, |
325 uint8 y_background, | 328 uint8_t y_background, |
326 uint8 u_background, | 329 uint8_t u_background, |
327 uint8 v_background, | 330 uint8_t v_background, |
328 const gfx::Rect& foreground_rect, | 331 const gfx::Rect& foreground_rect, |
329 uint8 y_foreground, | 332 uint8_t y_foreground, |
330 uint8 u_foreground, | 333 uint8_t u_foreground, |
331 uint8 v_foreground, | 334 uint8_t v_foreground, |
332 RenderPass* render_pass, | 335 RenderPass* render_pass, |
333 VideoResourceUpdater* video_resource_updater, | 336 VideoResourceUpdater* video_resource_updater, |
334 ResourceProvider* resource_provider) { | 337 ResourceProvider* resource_provider) { |
335 const gfx::Rect rect(background_size); | 338 const gfx::Rect rect(background_size); |
336 | 339 |
337 scoped_refptr<media::VideoFrame> video_frame = | 340 scoped_refptr<media::VideoFrame> video_frame = |
338 media::VideoFrame::CreateFrame(format, background_size, foreground_rect, | 341 media::VideoFrame::CreateFrame(format, background_size, foreground_rect, |
339 foreground_rect.size(), base::TimeDelta()); | 342 foreground_rect.size(), base::TimeDelta()); |
340 video_frame->metadata()->SetInteger(media::VideoFrameMetadata::COLOR_SPACE, | 343 video_frame->metadata()->SetInteger(media::VideoFrameMetadata::COLOR_SPACE, |
341 color_space); | 344 color_space); |
342 | 345 |
343 int planes[] = {media::VideoFrame::kYPlane, | 346 int planes[] = {media::VideoFrame::kYPlane, |
344 media::VideoFrame::kUPlane, | 347 media::VideoFrame::kUPlane, |
345 media::VideoFrame::kVPlane}; | 348 media::VideoFrame::kVPlane}; |
346 uint8 yuv_background[] = {y_background, u_background, v_background}; | 349 uint8_t yuv_background[] = {y_background, u_background, v_background}; |
347 uint8 yuv_foreground[] = {y_foreground, u_foreground, v_foreground}; | 350 uint8_t yuv_foreground[] = {y_foreground, u_foreground, v_foreground}; |
348 int sample_size[] = {1, 2, 2}; | 351 int sample_size[] = {1, 2, 2}; |
349 | 352 |
350 for (int i = 0; i < 3; ++i) { | 353 for (int i = 0; i < 3; ++i) { |
351 memset(video_frame->data(planes[i]), yuv_background[i], | 354 memset(video_frame->data(planes[i]), yuv_background[i], |
352 video_frame->stride(planes[i]) * video_frame->rows(planes[i])); | 355 video_frame->stride(planes[i]) * video_frame->rows(planes[i])); |
353 } | 356 } |
354 | 357 |
355 for (int i = 0; i < 3; ++i) { | 358 for (int i = 0; i < 3; ++i) { |
356 // Since yuv encoding uses block encoding, widths have to be divisible | 359 // Since yuv encoding uses block encoding, widths have to be divisible |
357 // by the sample size in order for this function to behave properly. | 360 // by the sample size in order for this function to behave properly. |
358 DCHECK_EQ(foreground_rect.x() % sample_size[i], 0); | 361 DCHECK_EQ(foreground_rect.x() % sample_size[i], 0); |
359 DCHECK_EQ(foreground_rect.y() % sample_size[i], 0); | 362 DCHECK_EQ(foreground_rect.y() % sample_size[i], 0); |
360 DCHECK_EQ(foreground_rect.width() % sample_size[i], 0); | 363 DCHECK_EQ(foreground_rect.width() % sample_size[i], 0); |
361 DCHECK_EQ(foreground_rect.height() % sample_size[i], 0); | 364 DCHECK_EQ(foreground_rect.height() % sample_size[i], 0); |
362 | 365 |
363 gfx::Rect sample_rect(foreground_rect.x() / sample_size[i], | 366 gfx::Rect sample_rect(foreground_rect.x() / sample_size[i], |
364 foreground_rect.y() / sample_size[i], | 367 foreground_rect.y() / sample_size[i], |
365 foreground_rect.width() / sample_size[i], | 368 foreground_rect.width() / sample_size[i], |
366 foreground_rect.height() / sample_size[i]); | 369 foreground_rect.height() / sample_size[i]); |
367 for (int y = sample_rect.y(); y < sample_rect.bottom(); ++y) { | 370 for (int y = sample_rect.y(); y < sample_rect.bottom(); ++y) { |
368 for (int x = sample_rect.x(); x < sample_rect.right(); ++x) { | 371 for (int x = sample_rect.x(); x < sample_rect.right(); ++x) { |
369 size_t offset = y * video_frame->stride(planes[i]) + x; | 372 size_t offset = y * video_frame->stride(planes[i]) + x; |
370 video_frame->data(planes[i])[offset] = yuv_foreground[i]; | 373 video_frame->data(planes[i])[offset] = yuv_foreground[i]; |
371 } | 374 } |
372 } | 375 } |
373 } | 376 } |
374 | 377 |
375 uint8 alpha_value = 255; | 378 uint8_t alpha_value = 255; |
376 CreateTestYUVVideoDrawQuad_FromVideoFrame( | 379 CreateTestYUVVideoDrawQuad_FromVideoFrame( |
377 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, | 380 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, |
378 video_resource_updater, rect, visible_rect, resource_provider); | 381 video_resource_updater, rect, visible_rect, resource_provider); |
379 } | 382 } |
380 | 383 |
381 void CreateTestYUVVideoDrawQuad_Solid( | 384 void CreateTestYUVVideoDrawQuad_Solid( |
382 const SharedQuadState* shared_state, | 385 const SharedQuadState* shared_state, |
383 media::VideoPixelFormat format, | 386 media::VideoPixelFormat format, |
384 media::ColorSpace color_space, | 387 media::ColorSpace color_space, |
385 bool is_transparent, | 388 bool is_transparent, |
386 const gfx::RectF& tex_coord_rect, | 389 const gfx::RectF& tex_coord_rect, |
387 uint8 y, | 390 uint8_t y, |
388 uint8 u, | 391 uint8_t u, |
389 uint8 v, | 392 uint8_t v, |
390 RenderPass* render_pass, | 393 RenderPass* render_pass, |
391 VideoResourceUpdater* video_resource_updater, | 394 VideoResourceUpdater* video_resource_updater, |
392 const gfx::Rect& rect, | 395 const gfx::Rect& rect, |
393 const gfx::Rect& visible_rect, | 396 const gfx::Rect& visible_rect, |
394 ResourceProvider* resource_provider) { | 397 ResourceProvider* resource_provider) { |
395 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( | 398 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( |
396 format, rect.size(), rect, rect.size(), base::TimeDelta()); | 399 format, rect.size(), rect, rect.size(), base::TimeDelta()); |
397 video_frame->metadata()->SetInteger(media::VideoFrameMetadata::COLOR_SPACE, | 400 video_frame->metadata()->SetInteger(media::VideoFrameMetadata::COLOR_SPACE, |
398 color_space); | 401 color_space); |
399 | 402 |
400 // YUV values of a solid, constant, color. Useful for testing that color | 403 // YUV values of a solid, constant, color. Useful for testing that color |
401 // space/color range are being handled properly. | 404 // space/color range are being handled properly. |
402 memset(video_frame->data(media::VideoFrame::kYPlane), y, | 405 memset(video_frame->data(media::VideoFrame::kYPlane), y, |
403 video_frame->stride(media::VideoFrame::kYPlane) * | 406 video_frame->stride(media::VideoFrame::kYPlane) * |
404 video_frame->rows(media::VideoFrame::kYPlane)); | 407 video_frame->rows(media::VideoFrame::kYPlane)); |
405 memset(video_frame->data(media::VideoFrame::kUPlane), u, | 408 memset(video_frame->data(media::VideoFrame::kUPlane), u, |
406 video_frame->stride(media::VideoFrame::kUPlane) * | 409 video_frame->stride(media::VideoFrame::kUPlane) * |
407 video_frame->rows(media::VideoFrame::kUPlane)); | 410 video_frame->rows(media::VideoFrame::kUPlane)); |
408 memset(video_frame->data(media::VideoFrame::kVPlane), v, | 411 memset(video_frame->data(media::VideoFrame::kVPlane), v, |
409 video_frame->stride(media::VideoFrame::kVPlane) * | 412 video_frame->stride(media::VideoFrame::kVPlane) * |
410 video_frame->rows(media::VideoFrame::kVPlane)); | 413 video_frame->rows(media::VideoFrame::kVPlane)); |
411 | 414 |
412 uint8 alpha_value = is_transparent ? 0 : 128; | 415 uint8_t alpha_value = is_transparent ? 0 : 128; |
413 CreateTestYUVVideoDrawQuad_FromVideoFrame( | 416 CreateTestYUVVideoDrawQuad_FromVideoFrame( |
414 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, | 417 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, |
415 video_resource_updater, rect, visible_rect, resource_provider); | 418 video_resource_updater, rect, visible_rect, resource_provider); |
416 } | 419 } |
417 | 420 |
418 typedef ::testing::Types<GLRenderer, | 421 typedef ::testing::Types<GLRenderer, |
419 SoftwareRenderer, | 422 SoftwareRenderer, |
420 GLRendererWithExpandedViewport, | 423 GLRendererWithExpandedViewport, |
421 SoftwareRendererWithExpandedViewport> RendererTypes; | 424 SoftwareRendererWithExpandedViewport> RendererTypes; |
422 TYPED_TEST_CASE(RendererPixelTest, RendererTypes); | 425 TYPED_TEST_CASE(RendererPixelTest, RendererTypes); |
(...skipping 2548 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2971 | 2974 |
2972 EXPECT_TRUE(this->RunPixelTest( | 2975 EXPECT_TRUE(this->RunPixelTest( |
2973 &pass_list, base::FilePath(FILE_PATH_LITERAL("spiral.png")), | 2976 &pass_list, base::FilePath(FILE_PATH_LITERAL("spiral.png")), |
2974 FuzzyPixelOffByOneComparator(true))); | 2977 FuzzyPixelOffByOneComparator(true))); |
2975 } | 2978 } |
2976 | 2979 |
2977 #endif // !defined(OS_ANDROID) | 2980 #endif // !defined(OS_ANDROID) |
2978 | 2981 |
2979 } // namespace | 2982 } // namespace |
2980 } // namespace cc | 2983 } // namespace cc |
OLD | NEW |