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 "base/message_loop/message_loop.h" | 5 #include "base/message_loop/message_loop.h" |
6 #include "cc/output/gl_renderer.h" | 6 #include "cc/output/gl_renderer.h" |
7 #include "cc/quads/draw_quad.h" | 7 #include "cc/quads/draw_quad.h" |
8 #include "cc/quads/picture_draw_quad.h" | 8 #include "cc/quads/picture_draw_quad.h" |
9 #include "cc/quads/texture_draw_quad.h" | 9 #include "cc/quads/texture_draw_quad.h" |
10 #include "cc/resources/video_resource_updater.h" | 10 #include "cc/resources/video_resource_updater.h" |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 } | 192 } |
193 | 193 |
194 void CreateTestYUVVideoDrawQuad_FromVideoFrame( | 194 void CreateTestYUVVideoDrawQuad_FromVideoFrame( |
195 const SharedQuadState* shared_state, | 195 const SharedQuadState* shared_state, |
196 scoped_refptr<media::VideoFrame> video_frame, | 196 scoped_refptr<media::VideoFrame> video_frame, |
197 uint8 alpha_value, | 197 uint8 alpha_value, |
198 const gfx::RectF& tex_coord_rect, | 198 const gfx::RectF& tex_coord_rect, |
199 RenderPass* render_pass, | 199 RenderPass* render_pass, |
200 VideoResourceUpdater* video_resource_updater, | 200 VideoResourceUpdater* video_resource_updater, |
201 const gfx::Rect& rect, | 201 const gfx::Rect& rect, |
| 202 const gfx::Rect& visible_rect, |
202 ResourceProvider* resource_provider) { | 203 ResourceProvider* resource_provider) { |
203 const bool with_alpha = (video_frame->format() == media::VideoFrame::YV12A); | 204 const bool with_alpha = (video_frame->format() == media::VideoFrame::YV12A); |
204 const YUVVideoDrawQuad::ColorSpace color_space = | 205 const YUVVideoDrawQuad::ColorSpace color_space = |
205 (video_frame->format() == media::VideoFrame::YV12J | 206 (video_frame->format() == media::VideoFrame::YV12J |
206 ? YUVVideoDrawQuad::JPEG | 207 ? YUVVideoDrawQuad::JPEG |
207 : YUVVideoDrawQuad::REC_601); | 208 : YUVVideoDrawQuad::REC_601); |
208 const gfx::Rect opaque_rect(0, 0, 0, 0); | 209 const gfx::Rect opaque_rect(0, 0, 0, 0); |
209 | 210 |
210 if (with_alpha) { | 211 if (with_alpha) { |
211 memset(video_frame->data(media::VideoFrame::kAPlane), alpha_value, | 212 memset(video_frame->data(media::VideoFrame::kAPlane), alpha_value, |
(...skipping 29 matching lines...) Expand all Loading... |
241 ResourceProvider::ResourceId a_resource = 0; | 242 ResourceProvider::ResourceId a_resource = 0; |
242 if (with_alpha) { | 243 if (with_alpha) { |
243 a_resource = resource_provider->CreateResourceFromTextureMailbox( | 244 a_resource = resource_provider->CreateResourceFromTextureMailbox( |
244 resources.mailboxes[media::VideoFrame::kAPlane], | 245 resources.mailboxes[media::VideoFrame::kAPlane], |
245 SingleReleaseCallbackImpl::Create( | 246 SingleReleaseCallbackImpl::Create( |
246 resources.release_callbacks[media::VideoFrame::kAPlane])); | 247 resources.release_callbacks[media::VideoFrame::kAPlane])); |
247 } | 248 } |
248 | 249 |
249 YUVVideoDrawQuad* yuv_quad = | 250 YUVVideoDrawQuad* yuv_quad = |
250 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); | 251 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); |
251 yuv_quad->SetNew(shared_state, rect, opaque_rect, rect, tex_coord_rect, | 252 yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect, |
252 video_frame->coded_size(), y_resource, u_resource, | 253 tex_coord_rect, video_frame->coded_size(), y_resource, |
253 v_resource, a_resource, color_space); | 254 u_resource, v_resource, a_resource, color_space); |
254 } | 255 } |
255 | 256 |
256 void CreateTestYUVVideoDrawQuad_Striped( | 257 void CreateTestYUVVideoDrawQuad_Striped( |
257 const SharedQuadState* shared_state, | 258 const SharedQuadState* shared_state, |
258 media::VideoFrame::Format format, | 259 media::VideoFrame::Format format, |
259 bool is_transparent, | 260 bool is_transparent, |
260 const gfx::RectF& tex_coord_rect, | 261 const gfx::RectF& tex_coord_rect, |
261 RenderPass* render_pass, | 262 RenderPass* render_pass, |
262 VideoResourceUpdater* video_resource_updater, | 263 VideoResourceUpdater* video_resource_updater, |
263 const gfx::Rect& rect, | 264 const gfx::Rect& rect, |
| 265 const gfx::Rect& visible_rect, |
264 ResourceProvider* resource_provider) { | 266 ResourceProvider* resource_provider) { |
265 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( | 267 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( |
266 format, rect.size(), rect, rect.size(), base::TimeDelta()); | 268 format, rect.size(), rect, rect.size(), base::TimeDelta()); |
267 | 269 |
268 // YUV values representing a striped pattern, for validating texture | 270 // YUV values representing a striped pattern, for validating texture |
269 // coordinates for sampling. | 271 // coordinates for sampling. |
270 uint8_t y_value = 0; | 272 uint8_t y_value = 0; |
271 uint8_t u_value = 0; | 273 uint8_t u_value = 0; |
272 uint8_t v_value = 0; | 274 uint8_t v_value = 0; |
273 for (int i = 0; i < video_frame->rows(media::VideoFrame::kYPlane); ++i) { | 275 for (int i = 0; i < video_frame->rows(media::VideoFrame::kYPlane); ++i) { |
(...skipping 11 matching lines...) Expand all Loading... |
285 video_frame->stride(media::VideoFrame::kVPlane) * i; | 287 video_frame->stride(media::VideoFrame::kVPlane) * i; |
286 for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kUPlane); | 288 for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kUPlane); |
287 ++j) { | 289 ++j) { |
288 u_row[j] = (u_value += 3); | 290 u_row[j] = (u_value += 3); |
289 v_row[j] = (v_value += 5); | 291 v_row[j] = (v_value += 5); |
290 } | 292 } |
291 } | 293 } |
292 uint8 alpha_value = is_transparent ? 0 : 128; | 294 uint8 alpha_value = is_transparent ? 0 : 128; |
293 CreateTestYUVVideoDrawQuad_FromVideoFrame( | 295 CreateTestYUVVideoDrawQuad_FromVideoFrame( |
294 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, | 296 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, |
295 video_resource_updater, rect, resource_provider); | 297 video_resource_updater, rect, visible_rect, resource_provider); |
296 } | 298 } |
297 | 299 |
298 // Creates a video frame of size background_size filled with yuv_background, | 300 // Creates a video frame of size background_size filled with yuv_background, |
299 // and then draws a foreground rectangle in a different color on top of | 301 // and then draws a foreground rectangle in a different color on top of |
300 // that. The foreground rectangle must have coordinates that are divisible | 302 // that. The foreground rectangle must have coordinates that are divisible |
301 // by 2 because YUV is a block format. | 303 // by 2 because YUV is a block format. |
302 void CreateTestYUVVideoDrawQuad_TwoColor( | 304 void CreateTestYUVVideoDrawQuad_TwoColor( |
303 const SharedQuadState* shared_state, | 305 const SharedQuadState* shared_state, |
304 media::VideoFrame::Format format, | 306 media::VideoFrame::Format format, |
305 bool is_transparent, | 307 bool is_transparent, |
306 const gfx::RectF& tex_coord_rect, | 308 const gfx::RectF& tex_coord_rect, |
307 const gfx::Size& background_size, | 309 const gfx::Size& background_size, |
| 310 const gfx::Rect& visible_rect, |
308 uint8 y_background, | 311 uint8 y_background, |
309 uint8 u_background, | 312 uint8 u_background, |
310 uint8 v_background, | 313 uint8 v_background, |
311 const gfx::Rect& foreground_rect, | 314 const gfx::Rect& foreground_rect, |
312 uint8 y_foreground, | 315 uint8 y_foreground, |
313 uint8 u_foreground, | 316 uint8 u_foreground, |
314 uint8 v_foreground, | 317 uint8 v_foreground, |
315 RenderPass* render_pass, | 318 RenderPass* render_pass, |
316 VideoResourceUpdater* video_resource_updater, | 319 VideoResourceUpdater* video_resource_updater, |
317 ResourceProvider* resource_provider) { | 320 ResourceProvider* resource_provider) { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 for (int x = sample_rect.x(); x < sample_rect.right(); ++x) { | 352 for (int x = sample_rect.x(); x < sample_rect.right(); ++x) { |
350 size_t offset = y * video_frame->stride(planes[i]) + x; | 353 size_t offset = y * video_frame->stride(planes[i]) + x; |
351 video_frame->data(planes[i])[offset] = yuv_foreground[i]; | 354 video_frame->data(planes[i])[offset] = yuv_foreground[i]; |
352 } | 355 } |
353 } | 356 } |
354 } | 357 } |
355 | 358 |
356 uint8 alpha_value = 255; | 359 uint8 alpha_value = 255; |
357 CreateTestYUVVideoDrawQuad_FromVideoFrame( | 360 CreateTestYUVVideoDrawQuad_FromVideoFrame( |
358 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, | 361 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, |
359 video_resource_updater, rect, resource_provider); | 362 video_resource_updater, rect, visible_rect, resource_provider); |
360 } | 363 } |
361 | 364 |
362 void CreateTestYUVVideoDrawQuad_Solid( | 365 void CreateTestYUVVideoDrawQuad_Solid( |
363 const SharedQuadState* shared_state, | 366 const SharedQuadState* shared_state, |
364 media::VideoFrame::Format format, | 367 media::VideoFrame::Format format, |
365 bool is_transparent, | 368 bool is_transparent, |
366 const gfx::RectF& tex_coord_rect, | 369 const gfx::RectF& tex_coord_rect, |
367 uint8 y, | 370 uint8 y, |
368 uint8 u, | 371 uint8 u, |
369 uint8 v, | 372 uint8 v, |
370 RenderPass* render_pass, | 373 RenderPass* render_pass, |
371 VideoResourceUpdater* video_resource_updater, | 374 VideoResourceUpdater* video_resource_updater, |
372 const gfx::Rect& rect, | 375 const gfx::Rect& rect, |
| 376 const gfx::Rect& visible_rect, |
373 ResourceProvider* resource_provider) { | 377 ResourceProvider* resource_provider) { |
374 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( | 378 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( |
375 format, rect.size(), rect, rect.size(), base::TimeDelta()); | 379 format, rect.size(), rect, rect.size(), base::TimeDelta()); |
376 | 380 |
377 // YUV values of a solid, constant, color. Useful for testing that color | 381 // YUV values of a solid, constant, color. Useful for testing that color |
378 // space/color range are being handled properly. | 382 // space/color range are being handled properly. |
379 memset(video_frame->data(media::VideoFrame::kYPlane), y, | 383 memset(video_frame->data(media::VideoFrame::kYPlane), y, |
380 video_frame->stride(media::VideoFrame::kYPlane) * | 384 video_frame->stride(media::VideoFrame::kYPlane) * |
381 video_frame->rows(media::VideoFrame::kYPlane)); | 385 video_frame->rows(media::VideoFrame::kYPlane)); |
382 memset(video_frame->data(media::VideoFrame::kUPlane), u, | 386 memset(video_frame->data(media::VideoFrame::kUPlane), u, |
383 video_frame->stride(media::VideoFrame::kUPlane) * | 387 video_frame->stride(media::VideoFrame::kUPlane) * |
384 video_frame->rows(media::VideoFrame::kUPlane)); | 388 video_frame->rows(media::VideoFrame::kUPlane)); |
385 memset(video_frame->data(media::VideoFrame::kVPlane), v, | 389 memset(video_frame->data(media::VideoFrame::kVPlane), v, |
386 video_frame->stride(media::VideoFrame::kVPlane) * | 390 video_frame->stride(media::VideoFrame::kVPlane) * |
387 video_frame->rows(media::VideoFrame::kVPlane)); | 391 video_frame->rows(media::VideoFrame::kVPlane)); |
388 | 392 |
389 uint8 alpha_value = is_transparent ? 0 : 128; | 393 uint8 alpha_value = is_transparent ? 0 : 128; |
390 CreateTestYUVVideoDrawQuad_FromVideoFrame( | 394 CreateTestYUVVideoDrawQuad_FromVideoFrame( |
391 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, | 395 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, |
392 video_resource_updater, rect, resource_provider); | 396 video_resource_updater, rect, visible_rect, resource_provider); |
393 } | 397 } |
394 | 398 |
395 typedef ::testing::Types<GLRenderer, | 399 typedef ::testing::Types<GLRenderer, |
396 SoftwareRenderer, | 400 SoftwareRenderer, |
397 GLRendererWithExpandedViewport, | 401 GLRendererWithExpandedViewport, |
398 SoftwareRendererWithExpandedViewport> RendererTypes; | 402 SoftwareRendererWithExpandedViewport> RendererTypes; |
399 TYPED_TEST_CASE(RendererPixelTest, RendererTypes); | 403 TYPED_TEST_CASE(RendererPixelTest, RendererTypes); |
400 | 404 |
401 template <typename RendererType> | 405 template <typename RendererType> |
402 class SoftwareRendererPixelTest : public RendererPixelTest<RendererType> {}; | 406 class SoftwareRendererPixelTest : public RendererPixelTest<RendererType> {}; |
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
814 TYPED_TEST(IntersectingQuadGLPixelTest, YUVVideoQuads) { | 818 TYPED_TEST(IntersectingQuadGLPixelTest, YUVVideoQuads) { |
815 this->SetupQuadStateAndRenderPass(); | 819 this->SetupQuadStateAndRenderPass(); |
816 gfx::Rect inner_rect( | 820 gfx::Rect inner_rect( |
817 ((this->quad_rect_.x() + (this->quad_rect_.width() / 4)) & ~0xF), | 821 ((this->quad_rect_.x() + (this->quad_rect_.width() / 4)) & ~0xF), |
818 ((this->quad_rect_.y() + (this->quad_rect_.height() / 4)) & ~0xF), | 822 ((this->quad_rect_.y() + (this->quad_rect_.height() / 4)) & ~0xF), |
819 (this->quad_rect_.width() / 2) & ~0xF, | 823 (this->quad_rect_.width() / 2) & ~0xF, |
820 (this->quad_rect_.height() / 2) & ~0xF); | 824 (this->quad_rect_.height() / 2) & ~0xF); |
821 | 825 |
822 CreateTestYUVVideoDrawQuad_TwoColor( | 826 CreateTestYUVVideoDrawQuad_TwoColor( |
823 this->front_quad_state_, media::VideoFrame::YV12J, false, | 827 this->front_quad_state_, media::VideoFrame::YV12J, false, |
824 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(), 0, 128, 128, | 828 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(), |
825 inner_rect, 29, 255, 107, this->render_pass_.get(), | 829 this->quad_rect_, 0, 128, 128, inner_rect, 29, 255, 107, |
826 this->video_resource_updater_.get(), this->resource_provider_.get()); | 830 this->render_pass_.get(), this->video_resource_updater_.get(), |
| 831 this->resource_provider_.get()); |
827 | 832 |
828 CreateTestYUVVideoDrawQuad_TwoColor( | 833 CreateTestYUVVideoDrawQuad_TwoColor( |
829 this->back_quad_state_, media::VideoFrame::YV12J, false, | 834 this->back_quad_state_, media::VideoFrame::YV12J, false, |
830 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(), 149, 43, 21, | 835 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(), |
831 inner_rect, 0, 128, 128, this->render_pass_.get(), | 836 this->quad_rect_, 149, 43, 21, inner_rect, 0, 128, 128, |
832 this->video_resource_updater2_.get(), this->resource_provider_.get()); | 837 this->render_pass_.get(), this->video_resource_updater2_.get(), |
| 838 this->resource_provider_.get()); |
833 | 839 |
834 SCOPED_TRACE("IntersectingVideoQuads"); | 840 SCOPED_TRACE("IntersectingVideoQuads"); |
835 this->template AppendBackgroundAndRunTest<YUVVideoDrawQuad>( | 841 this->template AppendBackgroundAndRunTest<YUVVideoDrawQuad>( |
836 FuzzyPixelOffByOneComparator(false)); | 842 FuzzyPixelOffByOneComparator(false)); |
837 } | 843 } |
838 | 844 |
839 // TODO(skaslev): The software renderer does not support non-premultplied alpha. | 845 // TODO(skaslev): The software renderer does not support non-premultplied alpha. |
840 TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithoutBackground) { | 846 TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithoutBackground) { |
841 gfx::Rect rect(this->device_viewport_size_); | 847 gfx::Rect rect(this->device_viewport_size_); |
842 | 848 |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
925 static_cast<float>(green_rect.y()) / background_size.height(), | 931 static_cast<float>(green_rect.y()) / background_size.height(), |
926 static_cast<float>(green_rect.width()) / background_size.width(), | 932 static_cast<float>(green_rect.width()) / background_size.width(), |
927 static_cast<float>(green_rect.height()) / background_size.height()); | 933 static_cast<float>(green_rect.height()) / background_size.height()); |
928 | 934 |
929 // YUV of (149,43,21) should be green (0,255,0) in RGB. | 935 // YUV of (149,43,21) should be green (0,255,0) in RGB. |
930 // Create a video frame that has a non-green background rect, with a | 936 // Create a video frame that has a non-green background rect, with a |
931 // green sub-rectangle that should be the only thing displayed in | 937 // green sub-rectangle that should be the only thing displayed in |
932 // the final image. Bleeding will appear on all four sides of the video | 938 // the final image. Bleeding will appear on all four sides of the video |
933 // if the tex coords are not clamped. | 939 // if the tex coords are not clamped. |
934 CreateTestYUVVideoDrawQuad_TwoColor( | 940 CreateTestYUVVideoDrawQuad_TwoColor( |
935 shared_state, format, false, tex_coord_rect, background_size, 0, 0, 0, | 941 shared_state, format, false, tex_coord_rect, background_size, |
936 green_rect, 149, 43, 21, pass.get(), video_resource_updater_.get(), | 942 gfx::Rect(background_size), 0, 0, 0, green_rect, 149, 43, 21, |
937 resource_provider_.get()); | 943 pass.get(), video_resource_updater_.get(), resource_provider_.get()); |
938 pass_list->push_back(pass.Pass()); | 944 pass_list->push_back(pass.Pass()); |
939 } | 945 } |
940 | 946 |
941 void SetUp() override { | 947 void SetUp() override { |
942 GLRendererPixelTest::SetUp(); | 948 GLRendererPixelTest::SetUp(); |
943 video_resource_updater_.reset(new VideoResourceUpdater( | 949 video_resource_updater_.reset(new VideoResourceUpdater( |
944 output_surface_->context_provider(), resource_provider_.get())); | 950 output_surface_->context_provider(), resource_provider_.get())); |
945 } | 951 } |
946 | 952 |
947 scoped_ptr<VideoResourceUpdater> video_resource_updater_; | 953 scoped_ptr<VideoResourceUpdater> video_resource_updater_; |
948 }; | 954 }; |
949 | 955 |
950 TEST_F(VideoGLRendererPixelTest, SimpleYUVRect) { | 956 TEST_F(VideoGLRendererPixelTest, SimpleYUVRect) { |
951 gfx::Rect rect(this->device_viewport_size_); | 957 gfx::Rect rect(this->device_viewport_size_); |
952 | 958 |
953 RenderPassId id(1, 1); | 959 RenderPassId id(1, 1); |
954 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | 960 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
955 | 961 |
956 SharedQuadState* shared_state = | 962 SharedQuadState* shared_state = |
957 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); | 963 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
958 | 964 |
959 CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12, | 965 CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12, |
960 false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), | 966 false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), |
961 pass.get(), video_resource_updater_.get(), | 967 pass.get(), video_resource_updater_.get(), |
962 rect, resource_provider_.get()); | 968 rect, rect, resource_provider_.get()); |
963 | 969 |
964 RenderPassList pass_list; | 970 RenderPassList pass_list; |
965 pass_list.push_back(pass.Pass()); | 971 pass_list.push_back(pass.Pass()); |
966 | 972 |
967 EXPECT_TRUE( | 973 EXPECT_TRUE( |
968 this->RunPixelTest(&pass_list, | 974 this->RunPixelTest(&pass_list, |
969 base::FilePath(FILE_PATH_LITERAL("yuv_stripes.png")), | 975 base::FilePath(FILE_PATH_LITERAL("yuv_stripes.png")), |
970 FuzzyPixelOffByOneComparator(true))); | 976 FuzzyPixelOffByOneComparator(true))); |
971 } | 977 } |
972 | 978 |
| 979 TEST_F(VideoGLRendererPixelTest, ClippedYUVRect) { |
| 980 gfx::Rect viewport(this->device_viewport_size_); |
| 981 gfx::Rect draw_rect(this->device_viewport_size_.width() * 1.5, |
| 982 this->device_viewport_size_.height() * 1.5); |
| 983 |
| 984 RenderPassId id(1, 1); |
| 985 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, viewport); |
| 986 |
| 987 SharedQuadState* shared_state = |
| 988 CreateTestSharedQuadState(gfx::Transform(), viewport, pass.get()); |
| 989 |
| 990 CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12, |
| 991 false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), |
| 992 pass.get(), video_resource_updater_.get(), |
| 993 draw_rect, viewport, |
| 994 resource_provider_.get()); |
| 995 RenderPassList pass_list; |
| 996 pass_list.push_back(pass.Pass()); |
| 997 |
| 998 EXPECT_TRUE(this->RunPixelTest( |
| 999 &pass_list, base::FilePath(FILE_PATH_LITERAL("yuv_stripes_clipped.png")), |
| 1000 FuzzyPixelOffByOneComparator(true))); |
| 1001 } |
| 1002 |
973 TEST_F(VideoGLRendererPixelTest, OffsetYUVRect) { | 1003 TEST_F(VideoGLRendererPixelTest, OffsetYUVRect) { |
974 gfx::Rect rect(this->device_viewport_size_); | 1004 gfx::Rect rect(this->device_viewport_size_); |
975 | 1005 |
976 RenderPassId id(1, 1); | 1006 RenderPassId id(1, 1); |
977 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | 1007 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
978 | 1008 |
979 SharedQuadState* shared_state = | 1009 SharedQuadState* shared_state = |
980 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); | 1010 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
981 | 1011 |
982 // Intentionally sets frame format to I420 for testing coverage. | 1012 // Intentionally sets frame format to I420 for testing coverage. |
983 CreateTestYUVVideoDrawQuad_Striped( | 1013 CreateTestYUVVideoDrawQuad_Striped( |
984 shared_state, media::VideoFrame::I420, false, | 1014 shared_state, media::VideoFrame::I420, false, |
985 gfx::RectF(0.125f, 0.25f, 0.75f, 0.5f), pass.get(), | 1015 gfx::RectF(0.125f, 0.25f, 0.75f, 0.5f), pass.get(), |
986 video_resource_updater_.get(), rect, resource_provider_.get()); | 1016 video_resource_updater_.get(), rect, rect, resource_provider_.get()); |
987 | 1017 |
988 RenderPassList pass_list; | 1018 RenderPassList pass_list; |
989 pass_list.push_back(pass.Pass()); | 1019 pass_list.push_back(pass.Pass()); |
990 | 1020 |
991 EXPECT_TRUE(this->RunPixelTest( | 1021 EXPECT_TRUE(this->RunPixelTest( |
992 &pass_list, | 1022 &pass_list, |
993 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_offset.png")), | 1023 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_offset.png")), |
994 FuzzyPixelOffByOneComparator(true))); | 1024 FuzzyPixelOffByOneComparator(true))); |
995 } | 1025 } |
996 | 1026 |
997 TEST_F(VideoGLRendererPixelTest, SimpleYUVRectBlack) { | 1027 TEST_F(VideoGLRendererPixelTest, SimpleYUVRectBlack) { |
998 gfx::Rect rect(this->device_viewport_size_); | 1028 gfx::Rect rect(this->device_viewport_size_); |
999 | 1029 |
1000 RenderPassId id(1, 1); | 1030 RenderPassId id(1, 1); |
1001 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | 1031 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
1002 | 1032 |
1003 SharedQuadState* shared_state = | 1033 SharedQuadState* shared_state = |
1004 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); | 1034 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
1005 | 1035 |
1006 // In MPEG color range YUV values of (15,128,128) should produce black. | 1036 // In MPEG color range YUV values of (15,128,128) should produce black. |
1007 CreateTestYUVVideoDrawQuad_Solid( | 1037 CreateTestYUVVideoDrawQuad_Solid( |
1008 shared_state, media::VideoFrame::YV12, false, | 1038 shared_state, media::VideoFrame::YV12, false, |
1009 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 15, 128, 128, pass.get(), | 1039 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 15, 128, 128, pass.get(), |
1010 video_resource_updater_.get(), rect, resource_provider_.get()); | 1040 video_resource_updater_.get(), rect, rect, resource_provider_.get()); |
1011 | 1041 |
1012 RenderPassList pass_list; | 1042 RenderPassList pass_list; |
1013 pass_list.push_back(pass.Pass()); | 1043 pass_list.push_back(pass.Pass()); |
1014 | 1044 |
1015 // If we didn't get black out of the YUV values above, then we probably have a | 1045 // If we didn't get black out of the YUV values above, then we probably have a |
1016 // color range issue. | 1046 // color range issue. |
1017 EXPECT_TRUE(this->RunPixelTest(&pass_list, | 1047 EXPECT_TRUE(this->RunPixelTest(&pass_list, |
1018 base::FilePath(FILE_PATH_LITERAL("black.png")), | 1048 base::FilePath(FILE_PATH_LITERAL("black.png")), |
1019 FuzzyPixelOffByOneComparator(true))); | 1049 FuzzyPixelOffByOneComparator(true))); |
1020 } | 1050 } |
1021 | 1051 |
1022 TEST_F(VideoGLRendererPixelTest, SimpleYUVJRect) { | 1052 TEST_F(VideoGLRendererPixelTest, SimpleYUVJRect) { |
1023 gfx::Rect rect(this->device_viewport_size_); | 1053 gfx::Rect rect(this->device_viewport_size_); |
1024 | 1054 |
1025 RenderPassId id(1, 1); | 1055 RenderPassId id(1, 1); |
1026 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | 1056 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
1027 | 1057 |
1028 SharedQuadState* shared_state = | 1058 SharedQuadState* shared_state = |
1029 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); | 1059 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
1030 | 1060 |
1031 // YUV of (149,43,21) should be green (0,255,0) in RGB. | 1061 // YUV of (149,43,21) should be green (0,255,0) in RGB. |
1032 CreateTestYUVVideoDrawQuad_Solid( | 1062 CreateTestYUVVideoDrawQuad_Solid( |
1033 shared_state, media::VideoFrame::YV12J, false, | 1063 shared_state, media::VideoFrame::YV12J, false, |
1034 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 149, 43, 21, pass.get(), | 1064 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 149, 43, 21, pass.get(), |
1035 video_resource_updater_.get(), rect, resource_provider_.get()); | 1065 video_resource_updater_.get(), rect, rect, resource_provider_.get()); |
1036 | 1066 |
1037 RenderPassList pass_list; | 1067 RenderPassList pass_list; |
1038 pass_list.push_back(pass.Pass()); | 1068 pass_list.push_back(pass.Pass()); |
1039 | 1069 |
1040 EXPECT_TRUE(this->RunPixelTest(&pass_list, | 1070 EXPECT_TRUE(this->RunPixelTest(&pass_list, |
1041 base::FilePath(FILE_PATH_LITERAL("green.png")), | 1071 base::FilePath(FILE_PATH_LITERAL("green.png")), |
1042 FuzzyPixelOffByOneComparator(true))); | 1072 FuzzyPixelOffByOneComparator(true))); |
1043 } | 1073 } |
1044 | 1074 |
1045 // Test that a YUV video doesn't bleed outside of its tex coords when the | 1075 // Test that a YUV video doesn't bleed outside of its tex coords when the |
(...skipping 20 matching lines...) Expand all Loading... |
1066 RenderPassId id(1, 1); | 1096 RenderPassId id(1, 1); |
1067 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | 1097 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
1068 | 1098 |
1069 SharedQuadState* shared_state = | 1099 SharedQuadState* shared_state = |
1070 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); | 1100 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
1071 | 1101 |
1072 // Dark grey in JPEG color range (in MPEG, this is black). | 1102 // Dark grey in JPEG color range (in MPEG, this is black). |
1073 CreateTestYUVVideoDrawQuad_Solid( | 1103 CreateTestYUVVideoDrawQuad_Solid( |
1074 shared_state, media::VideoFrame::YV12J, false, | 1104 shared_state, media::VideoFrame::YV12J, false, |
1075 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 15, 128, 128, pass.get(), | 1105 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 15, 128, 128, pass.get(), |
1076 video_resource_updater_.get(), rect, resource_provider_.get()); | 1106 video_resource_updater_.get(), rect, rect, resource_provider_.get()); |
1077 | 1107 |
1078 RenderPassList pass_list; | 1108 RenderPassList pass_list; |
1079 pass_list.push_back(pass.Pass()); | 1109 pass_list.push_back(pass.Pass()); |
1080 | 1110 |
1081 EXPECT_TRUE( | 1111 EXPECT_TRUE( |
1082 this->RunPixelTest(&pass_list, | 1112 this->RunPixelTest(&pass_list, |
1083 base::FilePath(FILE_PATH_LITERAL("dark_grey.png")), | 1113 base::FilePath(FILE_PATH_LITERAL("dark_grey.png")), |
1084 FuzzyPixelOffByOneComparator(true))); | 1114 FuzzyPixelOffByOneComparator(true))); |
1085 } | 1115 } |
1086 | 1116 |
1087 TEST_F(VideoGLRendererPixelTest, SimpleYUVARect) { | 1117 TEST_F(VideoGLRendererPixelTest, SimpleYUVARect) { |
1088 gfx::Rect rect(this->device_viewport_size_); | 1118 gfx::Rect rect(this->device_viewport_size_); |
1089 | 1119 |
1090 RenderPassId id(1, 1); | 1120 RenderPassId id(1, 1); |
1091 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | 1121 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
1092 | 1122 |
1093 SharedQuadState* shared_state = | 1123 SharedQuadState* shared_state = |
1094 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); | 1124 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
1095 | 1125 |
1096 CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12A, | 1126 CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12A, |
1097 false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), | 1127 false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), |
1098 pass.get(), video_resource_updater_.get(), | 1128 pass.get(), video_resource_updater_.get(), |
1099 rect, resource_provider_.get()); | 1129 rect, rect, resource_provider_.get()); |
1100 | 1130 |
1101 SolidColorDrawQuad* color_quad = | 1131 SolidColorDrawQuad* color_quad = |
1102 pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); | 1132 pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
1103 color_quad->SetNew(shared_state, rect, rect, SK_ColorWHITE, false); | 1133 color_quad->SetNew(shared_state, rect, rect, SK_ColorWHITE, false); |
1104 | 1134 |
1105 RenderPassList pass_list; | 1135 RenderPassList pass_list; |
1106 pass_list.push_back(pass.Pass()); | 1136 pass_list.push_back(pass.Pass()); |
1107 | 1137 |
1108 EXPECT_TRUE(this->RunPixelTest( | 1138 EXPECT_TRUE(this->RunPixelTest( |
1109 &pass_list, | 1139 &pass_list, |
1110 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_alpha.png")), | 1140 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_alpha.png")), |
1111 FuzzyPixelOffByOneComparator(true))); | 1141 FuzzyPixelOffByOneComparator(true))); |
1112 } | 1142 } |
1113 | 1143 |
1114 TEST_F(VideoGLRendererPixelTest, FullyTransparentYUVARect) { | 1144 TEST_F(VideoGLRendererPixelTest, FullyTransparentYUVARect) { |
1115 gfx::Rect rect(this->device_viewport_size_); | 1145 gfx::Rect rect(this->device_viewport_size_); |
1116 | 1146 |
1117 RenderPassId id(1, 1); | 1147 RenderPassId id(1, 1); |
1118 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | 1148 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
1119 | 1149 |
1120 SharedQuadState* shared_state = | 1150 SharedQuadState* shared_state = |
1121 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); | 1151 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
1122 | 1152 |
1123 CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12A, | 1153 CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12A, |
1124 true, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), | 1154 true, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), |
1125 pass.get(), video_resource_updater_.get(), | 1155 pass.get(), video_resource_updater_.get(), |
1126 rect, resource_provider_.get()); | 1156 rect, rect, resource_provider_.get()); |
1127 | 1157 |
1128 SolidColorDrawQuad* color_quad = | 1158 SolidColorDrawQuad* color_quad = |
1129 pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); | 1159 pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
1130 color_quad->SetNew(shared_state, rect, rect, SK_ColorBLACK, false); | 1160 color_quad->SetNew(shared_state, rect, rect, SK_ColorBLACK, false); |
1131 | 1161 |
1132 RenderPassList pass_list; | 1162 RenderPassList pass_list; |
1133 pass_list.push_back(pass.Pass()); | 1163 pass_list.push_back(pass.Pass()); |
1134 | 1164 |
1135 EXPECT_TRUE(this->RunPixelTest( | 1165 EXPECT_TRUE(this->RunPixelTest( |
1136 &pass_list, | 1166 &pass_list, |
(...skipping 1759 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2896 ? FILE_PATH_LITERAL("four_blue_green_checkers.png") | 2926 ? FILE_PATH_LITERAL("four_blue_green_checkers.png") |
2897 : FILE_PATH_LITERAL("checkers_big.png"); | 2927 : FILE_PATH_LITERAL("checkers_big.png"); |
2898 EXPECT_TRUE(this->RunPixelTest(&pass_list, base::FilePath(path), | 2928 EXPECT_TRUE(this->RunPixelTest(&pass_list, base::FilePath(path), |
2899 ExactPixelComparator(true))); | 2929 ExactPixelComparator(true))); |
2900 } | 2930 } |
2901 | 2931 |
2902 #endif // !defined(OS_ANDROID) | 2932 #endif // !defined(OS_ANDROID) |
2903 | 2933 |
2904 } // namespace | 2934 } // namespace |
2905 } // namespace cc | 2935 } // namespace cc |
OLD | NEW |