Chromium Code Reviews| 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> | 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/base/math_util.h" | 10 #include "cc/base/math_util.h" |
| 11 #include "cc/output/gl_renderer.h" | 11 #include "cc/output/gl_renderer.h" |
| 12 #include "cc/quads/draw_quad.h" | 12 #include "cc/quads/draw_quad.h" |
| 13 #include "cc/quads/picture_draw_quad.h" | 13 #include "cc/quads/picture_draw_quad.h" |
| 14 #include "cc/quads/texture_draw_quad.h" | 14 #include "cc/quads/texture_draw_quad.h" |
| 15 #include "cc/resources/video_resource_updater.h" | 15 #include "cc/resources/video_resource_updater.h" |
| 16 #include "cc/test/fake_raster_source.h" | 16 #include "cc/test/fake_raster_source.h" |
| 17 #include "cc/test/fake_recording_source.h" | 17 #include "cc/test/fake_recording_source.h" |
| 18 #include "cc/test/pixel_test.h" | 18 #include "cc/test/pixel_test.h" |
| 19 #include "cc/test/test_in_process_context_provider.h" | |
| 19 #include "gpu/command_buffer/client/gles2_interface.h" | 20 #include "gpu/command_buffer/client/gles2_interface.h" |
| 20 #include "media/base/video_frame.h" | 21 #include "media/base/video_frame.h" |
| 21 #include "third_party/skia/include/core/SkColorPriv.h" | 22 #include "third_party/skia/include/core/SkColorPriv.h" |
| 22 #include "third_party/skia/include/core/SkImageFilter.h" | 23 #include "third_party/skia/include/core/SkImageFilter.h" |
| 23 #include "third_party/skia/include/core/SkMatrix.h" | 24 #include "third_party/skia/include/core/SkMatrix.h" |
| 24 #include "third_party/skia/include/core/SkRefCnt.h" | 25 #include "third_party/skia/include/core/SkRefCnt.h" |
| 25 #include "third_party/skia/include/core/SkSurface.h" | 26 #include "third_party/skia/include/core/SkSurface.h" |
| 26 #include "third_party/skia/include/effects/SkColorFilterImageFilter.h" | 27 #include "third_party/skia/include/effects/SkColorFilterImageFilter.h" |
| 27 #include "third_party/skia/include/effects/SkColorMatrixFilter.h" | 28 #include "third_party/skia/include/effects/SkColorMatrixFilter.h" |
| 28 #include "ui/gfx/geometry/rect_conversions.h" | 29 #include "ui/gfx/geometry/rect_conversions.h" |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 210 gfx::ColorSpace video_color_space = video_frame->ColorSpace(); | 211 gfx::ColorSpace video_color_space = video_frame->ColorSpace(); |
| 211 | 212 |
| 212 const gfx::Rect opaque_rect(0, 0, 0, 0); | 213 const gfx::Rect opaque_rect(0, 0, 0, 0); |
| 213 | 214 |
| 214 if (with_alpha) { | 215 if (with_alpha) { |
| 215 memset(video_frame->data(media::VideoFrame::kAPlane), alpha_value, | 216 memset(video_frame->data(media::VideoFrame::kAPlane), alpha_value, |
| 216 video_frame->stride(media::VideoFrame::kAPlane) * | 217 video_frame->stride(media::VideoFrame::kAPlane) * |
| 217 video_frame->rows(media::VideoFrame::kAPlane)); | 218 video_frame->rows(media::VideoFrame::kAPlane)); |
| 218 } | 219 } |
| 219 | 220 |
| 220 VideoFrameExternalResources resources = | 221 VideoFrameExternalResources external_resources = |
| 221 video_resource_updater->CreateExternalResourcesFromVideoFrame( | 222 video_resource_updater->CreateExternalResourcesFromVideoFrame( |
|
dshwang
2016/10/18 19:14:36
It produces RGBA Texture resource if the GL contex
enne (OOO)
2016/10/19 19:04:03
What were the bugs?
dshwang
2016/10/20 18:57:55
1. texture size can be zero in GLRenderer::Enqueue
| |
| 222 video_frame); | 223 video_frame); |
| 223 | 224 |
| 224 EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); | 225 ResourceProvider::ResourceIdArray resource_ids; |
| 225 EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()), | 226 resource_ids.reserve(external_resources.mailboxes.size()); |
| 226 resources.mailboxes.size()); | 227 for (size_t i = 0; i < external_resources.mailboxes.size(); ++i) { |
| 227 EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()), | 228 ResourceId resource_id = |
| 228 resources.release_callbacks.size()); | 229 resource_provider->CreateResourceFromTextureMailbox( |
| 229 | 230 external_resources.mailboxes[i], |
| 230 ResourceId y_resource = resource_provider->CreateResourceFromTextureMailbox( | 231 SingleReleaseCallbackImpl::Create( |
| 231 resources.mailboxes[media::VideoFrame::kYPlane], | 232 external_resources.release_callbacks[i]), |
| 232 SingleReleaseCallbackImpl::Create( | 233 external_resources.read_lock_fences_enabled); |
| 233 resources.release_callbacks[media::VideoFrame::kYPlane])); | 234 resource_ids.push_back(resource_id); |
| 234 ResourceId u_resource = resource_provider->CreateResourceFromTextureMailbox( | |
| 235 resources.mailboxes[media::VideoFrame::kUPlane], | |
| 236 SingleReleaseCallbackImpl::Create( | |
| 237 resources.release_callbacks[media::VideoFrame::kUPlane])); | |
| 238 ResourceId v_resource = resource_provider->CreateResourceFromTextureMailbox( | |
| 239 resources.mailboxes[media::VideoFrame::kVPlane], | |
| 240 SingleReleaseCallbackImpl::Create( | |
| 241 resources.release_callbacks[media::VideoFrame::kVPlane])); | |
| 242 ResourceId a_resource = 0; | |
| 243 if (with_alpha) { | |
| 244 a_resource = resource_provider->CreateResourceFromTextureMailbox( | |
| 245 resources.mailboxes[media::VideoFrame::kAPlane], | |
| 246 SingleReleaseCallbackImpl::Create( | |
| 247 resources.release_callbacks[media::VideoFrame::kAPlane])); | |
| 248 } | 235 } |
| 249 | 236 |
| 250 const gfx::Size ya_tex_size = video_frame->coded_size(); | 237 switch (external_resources.type) { |
| 251 const gfx::Size uv_tex_size = media::VideoFrame::PlaneSize( | 238 case VideoFrameExternalResources::YUV_RESOURCE: { |
| 252 video_frame->format(), media::VideoFrame::kUPlane, | 239 EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()), |
| 253 video_frame->coded_size()); | 240 external_resources.mailboxes.size()); |
| 254 DCHECK(uv_tex_size == media::VideoFrame::PlaneSize( | 241 EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()), |
| 255 video_frame->format(), media::VideoFrame::kVPlane, | 242 external_resources.release_callbacks.size()); |
| 256 video_frame->coded_size())); | 243 const gfx::Size ya_tex_size = video_frame->coded_size(); |
| 257 if (with_alpha) { | 244 const gfx::Size uv_tex_size = media::VideoFrame::PlaneSize( |
| 258 DCHECK(ya_tex_size == media::VideoFrame::PlaneSize( | 245 video_frame->format(), media::VideoFrame::kUPlane, |
| 259 video_frame->format(), media::VideoFrame::kAPlane, | 246 video_frame->coded_size()); |
| 260 video_frame->coded_size())); | 247 DCHECK(uv_tex_size == |
| 248 media::VideoFrame::PlaneSize(video_frame->format(), | |
| 249 media::VideoFrame::kVPlane, | |
| 250 video_frame->coded_size())); | |
| 251 if (with_alpha) { | |
| 252 DCHECK(ya_tex_size == | |
| 253 media::VideoFrame::PlaneSize(video_frame->format(), | |
| 254 media::VideoFrame::kAPlane, | |
| 255 video_frame->coded_size())); | |
| 256 } | |
| 257 gfx::RectF ya_tex_coord_rect( | |
| 258 tex_coord_rect.x() * ya_tex_size.width(), | |
| 259 tex_coord_rect.y() * ya_tex_size.height(), | |
| 260 tex_coord_rect.width() * ya_tex_size.width(), | |
| 261 tex_coord_rect.height() * ya_tex_size.height()); | |
| 262 gfx::RectF uv_tex_coord_rect( | |
| 263 tex_coord_rect.x() * uv_tex_size.width(), | |
| 264 tex_coord_rect.y() * uv_tex_size.height(), | |
| 265 tex_coord_rect.width() * uv_tex_size.width(), | |
| 266 tex_coord_rect.height() * uv_tex_size.height()); | |
| 267 | |
| 268 YUVVideoDrawQuad* yuv_quad = | |
| 269 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); | |
| 270 yuv_quad->SetNew( | |
| 271 shared_state, rect, opaque_rect, visible_rect, ya_tex_coord_rect, | |
| 272 uv_tex_coord_rect, ya_tex_size, uv_tex_size, resource_ids[0], | |
| 273 resource_ids[1], | |
| 274 resource_ids.size() > 2 ? resource_ids[2] : resource_ids[1], | |
| 275 resource_ids.size() > 3 ? resource_ids[3] : 0, color_space, | |
| 276 video_color_space, external_resources.offset, | |
| 277 external_resources.multiplier, external_resources.bits_per_channel); | |
| 278 break; | |
| 279 } | |
| 280 case VideoFrameExternalResources::RGBA_RESOURCE: { | |
| 281 EXPECT_EQ(1u, external_resources.mailboxes.size()); | |
| 282 EXPECT_EQ(1u, external_resources.release_callbacks.size()); | |
| 283 float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f}; | |
| 284 TextureDrawQuad* texture_quad = | |
| 285 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); | |
| 286 texture_quad->SetNew(shared_state, rect, opaque_rect, visible_rect, | |
| 287 resource_ids[0], false, tex_coord_rect.origin(), | |
| 288 tex_coord_rect.bottom_right(), SK_ColorTRANSPARENT, | |
| 289 opacity, false, false, false); | |
| 290 break; | |
| 291 } | |
| 292 default: | |
| 293 NOTREACHED(); | |
| 261 } | 294 } |
| 262 | |
| 263 gfx::RectF ya_tex_coord_rect(tex_coord_rect.x() * ya_tex_size.width(), | |
| 264 tex_coord_rect.y() * ya_tex_size.height(), | |
| 265 tex_coord_rect.width() * ya_tex_size.width(), | |
| 266 tex_coord_rect.height() * ya_tex_size.height()); | |
| 267 gfx::RectF uv_tex_coord_rect(tex_coord_rect.x() * uv_tex_size.width(), | |
| 268 tex_coord_rect.y() * uv_tex_size.height(), | |
| 269 tex_coord_rect.width() * uv_tex_size.width(), | |
| 270 tex_coord_rect.height() * uv_tex_size.height()); | |
| 271 | |
| 272 YUVVideoDrawQuad* yuv_quad = | |
| 273 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); | |
| 274 uint32_t bits_per_channel = 8; | |
| 275 if (video_frame->format() == media::PIXEL_FORMAT_YUV420P10 || | |
| 276 video_frame->format() == media::PIXEL_FORMAT_YUV422P10 || | |
| 277 video_frame->format() == media::PIXEL_FORMAT_YUV444P10) { | |
| 278 bits_per_channel = 10; | |
| 279 } | |
| 280 | |
| 281 yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect, | |
| 282 ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size, | |
| 283 uv_tex_size, y_resource, u_resource, v_resource, a_resource, | |
| 284 color_space, video_color_space, 0.0f, 1.0f, | |
| 285 bits_per_channel); | |
| 286 } | 295 } |
| 287 | 296 |
| 288 // Upshift video frame to 10 bit. | 297 // Upshift video frame to 10 bit. |
| 289 scoped_refptr<media::VideoFrame> CreateHighbitVideoFrame( | 298 scoped_refptr<media::VideoFrame> CreateHighbitVideoFrame( |
| 290 media::VideoFrame* video_frame) { | 299 media::VideoFrame* video_frame) { |
| 291 media::VideoPixelFormat format; | 300 media::VideoPixelFormat format; |
| 292 switch (video_frame->format()) { | 301 switch (video_frame->format()) { |
| 293 case media::PIXEL_FORMAT_I420: | 302 case media::PIXEL_FORMAT_I420: |
| 294 case media::PIXEL_FORMAT_YV12: | 303 case media::PIXEL_FORMAT_YV12: |
| 295 format = media::PIXEL_FORMAT_YUV420P10; | 304 format = media::PIXEL_FORMAT_YUV420P10; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 336 bool is_transparent, | 345 bool is_transparent, |
| 337 bool highbit, | 346 bool highbit, |
| 338 const gfx::RectF& tex_coord_rect, | 347 const gfx::RectF& tex_coord_rect, |
| 339 RenderPass* render_pass, | 348 RenderPass* render_pass, |
| 340 VideoResourceUpdater* video_resource_updater, | 349 VideoResourceUpdater* video_resource_updater, |
| 341 const gfx::Rect& rect, | 350 const gfx::Rect& rect, |
| 342 const gfx::Rect& visible_rect, | 351 const gfx::Rect& visible_rect, |
| 343 ResourceProvider* resource_provider) { | 352 ResourceProvider* resource_provider) { |
| 344 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( | 353 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( |
| 345 format, rect.size(), rect, rect.size(), base::TimeDelta()); | 354 format, rect.size(), rect, rect.size(), base::TimeDelta()); |
| 355 video_frame->metadata()->SetInteger(media::VideoFrameMetadata::COLOR_SPACE, | |
| 356 media::COLOR_SPACE_JPEG); | |
| 346 | 357 |
| 347 // YUV values representing a striped pattern, for validating texture | 358 // YUV values representing a striped pattern, for validating texture |
| 348 // coordinates for sampling. | 359 // coordinates for sampling. |
| 349 uint8_t y_value = 0; | 360 uint8_t y_value = 0; |
| 350 uint8_t u_value = 0; | 361 uint8_t u_value = 0; |
| 351 uint8_t v_value = 0; | 362 uint8_t v_value = 0; |
| 352 for (int i = 0; i < video_frame->rows(media::VideoFrame::kYPlane); ++i) { | 363 for (int i = 0; i < video_frame->rows(media::VideoFrame::kYPlane); ++i) { |
| 353 uint8_t* y_row = video_frame->data(media::VideoFrame::kYPlane) + | 364 uint8_t* y_row = video_frame->data(media::VideoFrame::kYPlane) + |
| 354 video_frame->stride(media::VideoFrame::kYPlane) * i; | 365 video_frame->stride(media::VideoFrame::kYPlane) * i; |
| 355 for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kYPlane); | 366 for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kYPlane); |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 479 | 490 |
| 480 uint8_t alpha_value = is_transparent ? 0 : 128; | 491 uint8_t alpha_value = is_transparent ? 0 : 128; |
| 481 CreateTestYUVVideoDrawQuad_FromVideoFrame( | 492 CreateTestYUVVideoDrawQuad_FromVideoFrame( |
| 482 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, | 493 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, |
| 483 video_resource_updater, rect, visible_rect, resource_provider); | 494 video_resource_updater, rect, visible_rect, resource_provider); |
| 484 } | 495 } |
| 485 | 496 |
| 486 void CreateTestYUVVideoDrawQuad_NV12(const SharedQuadState* shared_state, | 497 void CreateTestYUVVideoDrawQuad_NV12(const SharedQuadState* shared_state, |
| 487 media::ColorSpace video_frame_color_space, | 498 media::ColorSpace video_frame_color_space, |
| 488 const gfx::ColorSpace& video_color_space, | 499 const gfx::ColorSpace& video_color_space, |
| 500 ResourceFormat y_format, | |
| 489 const gfx::RectF& tex_coord_rect, | 501 const gfx::RectF& tex_coord_rect, |
| 490 uint8_t y, | 502 uint8_t y, |
| 491 uint8_t u, | 503 uint8_t u, |
| 492 uint8_t v, | 504 uint8_t v, |
| 493 RenderPass* render_pass, | 505 RenderPass* render_pass, |
| 494 const gfx::Rect& rect, | 506 const gfx::Rect& rect, |
| 495 const gfx::Rect& visible_rect, | 507 const gfx::Rect& visible_rect, |
| 496 ResourceProvider* resource_provider) { | 508 ResourceProvider* resource_provider) { |
| 497 YUVVideoDrawQuad::ColorSpace color_space = YUVVideoDrawQuad::REC_601; | 509 YUVVideoDrawQuad::ColorSpace color_space = YUVVideoDrawQuad::REC_601; |
| 498 if (video_frame_color_space == media::COLOR_SPACE_JPEG) { | 510 if (video_frame_color_space == media::COLOR_SPACE_JPEG) { |
| 499 color_space = YUVVideoDrawQuad::JPEG; | 511 color_space = YUVVideoDrawQuad::JPEG; |
| 500 } | 512 } |
| 501 | 513 |
| 502 const gfx::Rect opaque_rect(0, 0, 0, 0); | 514 const gfx::Rect opaque_rect(0, 0, 0, 0); |
| 503 const gfx::Size ya_tex_size = rect.size(); | 515 const gfx::Size ya_tex_size = rect.size(); |
| 504 const gfx::Size uv_tex_size = media::VideoFrame::PlaneSize( | 516 const gfx::Size uv_tex_size = media::VideoFrame::PlaneSize( |
| 505 media::PIXEL_FORMAT_NV12, media::VideoFrame::kUVPlane, rect.size()); | 517 media::PIXEL_FORMAT_NV12, media::VideoFrame::kUVPlane, rect.size()); |
| 506 | 518 |
| 507 ResourceId y_resource = resource_provider->CreateResource( | 519 ResourceId y_resource = resource_provider->CreateResource( |
| 508 rect.size(), ResourceProvider::TEXTURE_HINT_DEFAULT, | 520 rect.size(), ResourceProvider::TEXTURE_HINT_DEFAULT, y_format, |
| 509 resource_provider->YuvResourceFormat(8), gfx::ColorSpace()); | 521 gfx::ColorSpace()); |
| 510 ResourceId u_resource = resource_provider->CreateResource( | 522 ResourceId u_resource = resource_provider->CreateResource( |
| 511 uv_tex_size, ResourceProvider::TEXTURE_HINT_DEFAULT, RGBA_8888, | 523 uv_tex_size, ResourceProvider::TEXTURE_HINT_DEFAULT, RGBA_8888, |
| 512 gfx::ColorSpace()); | 524 gfx::ColorSpace()); |
| 513 ResourceId v_resource = u_resource; | 525 ResourceId v_resource = u_resource; |
| 514 ResourceId a_resource = 0; | 526 ResourceId a_resource = 0; |
| 515 | 527 |
| 516 std::vector<uint8_t> y_pixels(ya_tex_size.GetArea(), y); | 528 std::vector<uint8_t> y_pixels(ya_tex_size.GetArea(), y); |
| 517 resource_provider->CopyToResource(y_resource, y_pixels.data(), ya_tex_size); | 529 resource_provider->CopyToResource(y_resource, y_pixels.data(), ya_tex_size); |
| 518 | 530 |
| 519 // U goes in the R component and V goes in the G component. | 531 // U goes in the R component and V goes in the G component. |
| (...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1087 resource_provider_.get()); | 1099 resource_provider_.get()); |
| 1088 pass_list->push_back(std::move(pass)); | 1100 pass_list->push_back(std::move(pass)); |
| 1089 } | 1101 } |
| 1090 | 1102 |
| 1091 void SetUp() override { | 1103 void SetUp() override { |
| 1092 GLRendererPixelTest::SetUp(); | 1104 GLRendererPixelTest::SetUp(); |
| 1093 video_resource_updater_.reset(new VideoResourceUpdater( | 1105 video_resource_updater_.reset(new VideoResourceUpdater( |
| 1094 output_surface_->context_provider(), resource_provider_.get())); | 1106 output_surface_->context_provider(), resource_provider_.get())); |
| 1095 } | 1107 } |
| 1096 | 1108 |
| 1109 void DisableOneComponentTextures() { | |
| 1110 TestInProcessContextProvider* context_provider = | |
| 1111 GetTestInProcessContextProvider(); | |
| 1112 context_provider->SetDisableOneComponentTextures(true); | |
| 1113 } | |
| 1114 | |
| 1097 std::unique_ptr<VideoResourceUpdater> video_resource_updater_; | 1115 std::unique_ptr<VideoResourceUpdater> video_resource_updater_; |
| 1116 | |
| 1117 protected: | |
| 1118 TestInProcessContextProvider* GetTestInProcessContextProvider() { | |
| 1119 return static_cast<TestInProcessContextProvider*>( | |
| 1120 output_surface_->context_provider()); | |
| 1121 } | |
| 1122 }; | |
| 1123 | |
| 1124 enum class HighbitTexture { | |
| 1125 Y8, | |
| 1126 RGBA_8888, | |
| 1127 LUMINANCE_F16, | |
| 1098 }; | 1128 }; |
| 1099 | 1129 |
| 1100 class VideoGLRendererPixelHiLoTest | 1130 class VideoGLRendererPixelHiLoTest |
| 1101 : public VideoGLRendererPixelTest, | 1131 : public VideoGLRendererPixelTest, |
| 1102 public ::testing::WithParamInterface<bool> {}; | 1132 public ::testing::WithParamInterface< |
| 1133 ::testing::tuple<bool, HighbitTexture>> { | |
| 1134 public: | |
| 1135 void SetSupportHighbitTexture(HighbitTexture texture) { | |
| 1136 TestInProcessContextProvider* context_provider = | |
| 1137 GetTestInProcessContextProvider(); | |
| 1138 switch (texture) { | |
| 1139 case HighbitTexture::Y8: | |
| 1140 context_provider->SetDisableOneComponentTextures(false); | |
| 1141 context_provider->SetSupportTextureHalfFloatLinear(false); | |
| 1142 break; | |
| 1143 case HighbitTexture::RGBA_8888: | |
| 1144 context_provider->SetDisableOneComponentTextures(true); | |
| 1145 context_provider->SetSupportTextureHalfFloatLinear(false); | |
| 1146 break; | |
| 1147 case HighbitTexture::LUMINANCE_F16: | |
| 1148 context_provider->SetDisableOneComponentTextures(false); | |
| 1149 context_provider->SetSupportTextureHalfFloatLinear(true); | |
| 1150 break; | |
| 1151 } | |
| 1152 } | |
| 1153 }; | |
| 1103 | 1154 |
| 1104 TEST_P(VideoGLRendererPixelHiLoTest, SimpleYUVRect) { | 1155 TEST_P(VideoGLRendererPixelHiLoTest, SimpleYUVRect) { |
| 1105 gfx::Rect rect(this->device_viewport_size_); | 1156 gfx::Rect rect(this->device_viewport_size_); |
| 1106 | 1157 |
| 1107 RenderPassId id(1, 1); | 1158 RenderPassId id(1, 1); |
| 1108 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | 1159 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
| 1109 | 1160 |
| 1110 SharedQuadState* shared_state = | 1161 SharedQuadState* shared_state = |
| 1111 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); | 1162 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
| 1112 | 1163 |
| 1113 bool highbit = GetParam(); | 1164 const bool highbit = testing::get<0>(GetParam()); |
| 1165 const HighbitTexture format = testing::get<1>(GetParam()); | |
| 1166 SetSupportHighbitTexture(format); | |
| 1114 CreateTestYUVVideoDrawQuad_Striped( | 1167 CreateTestYUVVideoDrawQuad_Striped( |
| 1115 shared_state, media::PIXEL_FORMAT_YV12, false, highbit, | 1168 shared_state, media::PIXEL_FORMAT_YV12, false, highbit, |
| 1116 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), pass.get(), | 1169 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), pass.get(), |
| 1117 video_resource_updater_.get(), rect, rect, resource_provider_.get()); | 1170 video_resource_updater_.get(), rect, rect, resource_provider_.get()); |
| 1118 | 1171 |
| 1119 RenderPassList pass_list; | 1172 RenderPassList pass_list; |
| 1120 pass_list.push_back(std::move(pass)); | 1173 pass_list.push_back(std::move(pass)); |
| 1121 | 1174 |
| 1122 EXPECT_TRUE( | 1175 base::FilePath file_path = |
| 1123 this->RunPixelTest(&pass_list, | 1176 base::FilePath(FILE_PATH_LITERAL("yuv_stripes.png")); |
| 1124 base::FilePath(FILE_PATH_LITERAL("yuv_stripes.png")), | 1177 // TODO(dshwang): investigate why results per configuraion are so different. |
| 1125 FuzzyPixelOffByOneComparator(true))); | 1178 // crbug.com/622133 |
| 1179 if (format == HighbitTexture::RGBA_8888) { | |
| 1180 // Color space is so different, because this path doesn't respect video | |
| 1181 // color profile. | |
| 1182 file_path = base::FilePath(FILE_PATH_LITERAL("yuv_stripes_rgba.png")); | |
| 1183 } | |
| 1184 EXPECT_TRUE(this->RunPixelTest( | |
| 1185 &pass_list, file_path, | |
| 1186 // All pixels can be off by two, but any more than that is an error. | |
| 1187 FuzzyPixelComparator(true, 100.f, 0.f, 2.f, 2, 0))); | |
| 1126 } | 1188 } |
| 1127 | 1189 |
| 1128 TEST_P(VideoGLRendererPixelHiLoTest, ClippedYUVRect) { | 1190 TEST_P(VideoGLRendererPixelHiLoTest, ClippedYUVRect) { |
| 1129 gfx::Rect viewport(this->device_viewport_size_); | 1191 gfx::Rect viewport(this->device_viewport_size_); |
| 1130 gfx::Rect draw_rect(this->device_viewport_size_.width() * 1.5, | 1192 gfx::Rect draw_rect(this->device_viewport_size_.width() * 1.5, |
| 1131 this->device_viewport_size_.height() * 1.5); | 1193 this->device_viewport_size_.height() * 1.5); |
| 1132 | 1194 |
| 1133 RenderPassId id(1, 1); | 1195 RenderPassId id(1, 1); |
| 1134 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, viewport); | 1196 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, viewport); |
| 1135 | 1197 |
| 1136 SharedQuadState* shared_state = | 1198 SharedQuadState* shared_state = |
| 1137 CreateTestSharedQuadState(gfx::Transform(), viewport, pass.get()); | 1199 CreateTestSharedQuadState(gfx::Transform(), viewport, pass.get()); |
| 1138 | 1200 |
| 1139 bool highbit = GetParam(); | 1201 const bool highbit = testing::get<0>(GetParam()); |
| 1202 const HighbitTexture format = testing::get<1>(GetParam()); | |
| 1203 SetSupportHighbitTexture(format); | |
| 1140 CreateTestYUVVideoDrawQuad_Striped( | 1204 CreateTestYUVVideoDrawQuad_Striped( |
| 1141 shared_state, media::PIXEL_FORMAT_YV12, false, highbit, | 1205 shared_state, media::PIXEL_FORMAT_YV12, false, highbit, |
| 1142 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), pass.get(), | 1206 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), pass.get(), |
| 1143 video_resource_updater_.get(), draw_rect, viewport, | 1207 video_resource_updater_.get(), draw_rect, viewport, |
| 1144 resource_provider_.get()); | 1208 resource_provider_.get()); |
| 1145 RenderPassList pass_list; | 1209 RenderPassList pass_list; |
| 1146 pass_list.push_back(std::move(pass)); | 1210 pass_list.push_back(std::move(pass)); |
| 1147 | 1211 |
| 1212 base::FilePath file_path = | |
| 1213 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_clipped.png")); | |
| 1214 if (format == HighbitTexture::RGBA_8888) { | |
| 1215 file_path = | |
| 1216 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_clipped_rgba.png")); | |
| 1217 } | |
| 1148 EXPECT_TRUE(this->RunPixelTest( | 1218 EXPECT_TRUE(this->RunPixelTest( |
| 1149 &pass_list, base::FilePath(FILE_PATH_LITERAL("yuv_stripes_clipped.png")), | 1219 &pass_list, file_path, |
| 1150 FuzzyPixelOffByOneComparator(true))); | 1220 // All pixels can be off by two, but any more than that is an error. |
| 1221 FuzzyPixelComparator(true, 100.f, 0.f, 2.f, 2, 0))); | |
| 1151 } | 1222 } |
| 1152 | 1223 |
| 1153 TEST_F(VideoGLRendererPixelHiLoTest, OffsetYUVRect) { | 1224 TEST_F(VideoGLRendererPixelHiLoTest, OffsetYUVRect) { |
| 1154 gfx::Rect rect(this->device_viewport_size_); | 1225 gfx::Rect rect(this->device_viewport_size_); |
| 1155 | 1226 |
| 1156 RenderPassId id(1, 1); | 1227 RenderPassId id(1, 1); |
| 1157 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | 1228 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
| 1158 | 1229 |
| 1159 SharedQuadState* shared_state = | 1230 SharedQuadState* shared_state = |
| 1160 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); | 1231 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1192 pass_list.push_back(std::move(pass)); | 1263 pass_list.push_back(std::move(pass)); |
| 1193 | 1264 |
| 1194 // If we didn't get black out of the YUV values above, then we probably have a | 1265 // If we didn't get black out of the YUV values above, then we probably have a |
| 1195 // color range issue. | 1266 // color range issue. |
| 1196 EXPECT_TRUE(this->RunPixelTest(&pass_list, | 1267 EXPECT_TRUE(this->RunPixelTest(&pass_list, |
| 1197 base::FilePath(FILE_PATH_LITERAL("black.png")), | 1268 base::FilePath(FILE_PATH_LITERAL("black.png")), |
| 1198 FuzzyPixelOffByOneComparator(true))); | 1269 FuzzyPixelOffByOneComparator(true))); |
| 1199 } | 1270 } |
| 1200 | 1271 |
| 1201 // First argument (test case prefix) is intentionally left empty. | 1272 // First argument (test case prefix) is intentionally left empty. |
| 1202 INSTANTIATE_TEST_CASE_P(, VideoGLRendererPixelHiLoTest, ::testing::Bool()); | 1273 INSTANTIATE_TEST_CASE_P( |
| 1274 , | |
| 1275 VideoGLRendererPixelHiLoTest, | |
| 1276 ::testing::Combine( | |
| 1277 ::testing::Bool(), | |
| 1278 ::testing::Values(HighbitTexture::Y8, | |
| 1279 // LUMINANCE_F16 requires --use-gpu-in-tests | |
| 1280 // HighbitTexture::LUMINANCE_F16, | |
| 1281 HighbitTexture::RGBA_8888))); | |
| 1203 | 1282 |
| 1204 TEST_F(VideoGLRendererPixelTest, SimpleYUVJRect) { | 1283 TEST_F(VideoGLRendererPixelTest, SimpleYUVJRect) { |
| 1205 gfx::Rect rect(this->device_viewport_size_); | 1284 gfx::Rect rect(this->device_viewport_size_); |
| 1206 | 1285 |
| 1207 RenderPassId id(1, 1); | 1286 RenderPassId id(1, 1); |
| 1208 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | 1287 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
| 1209 | 1288 |
| 1210 SharedQuadState* shared_state = | 1289 SharedQuadState* shared_state = |
| 1211 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); | 1290 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
| 1212 | 1291 |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 1226 | 1305 |
| 1227 TEST_F(VideoGLRendererPixelTest, SimpleNV12JRect) { | 1306 TEST_F(VideoGLRendererPixelTest, SimpleNV12JRect) { |
| 1228 gfx::Rect rect(this->device_viewport_size_); | 1307 gfx::Rect rect(this->device_viewport_size_); |
| 1229 | 1308 |
| 1230 RenderPassId id(1, 1); | 1309 RenderPassId id(1, 1); |
| 1231 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | 1310 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
| 1232 | 1311 |
| 1233 SharedQuadState* shared_state = | 1312 SharedQuadState* shared_state = |
| 1234 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); | 1313 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
| 1235 | 1314 |
| 1315 ResourceFormat y_format = video_resource_updater_->YuvResourceFormat(8); | |
| 1316 | |
| 1236 // YUV of (149,43,21) should be green (0,255,0) in RGB. | 1317 // YUV of (149,43,21) should be green (0,255,0) in RGB. |
| 1237 CreateTestYUVVideoDrawQuad_NV12( | 1318 CreateTestYUVVideoDrawQuad_NV12( |
| 1238 shared_state, media::COLOR_SPACE_JPEG, gfx::ColorSpace::CreateJpeg(), | 1319 shared_state, media::COLOR_SPACE_JPEG, gfx::ColorSpace::CreateJpeg(), |
| 1239 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 149, 43, 21, pass.get(), rect, rect, | 1320 y_format, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 149, 43, 21, pass.get(), |
| 1240 resource_provider_.get()); | 1321 rect, rect, resource_provider_.get()); |
| 1241 | 1322 |
| 1242 RenderPassList pass_list; | 1323 RenderPassList pass_list; |
| 1243 pass_list.push_back(std::move(pass)); | 1324 pass_list.push_back(std::move(pass)); |
| 1244 | 1325 |
| 1245 EXPECT_TRUE(this->RunPixelTest(&pass_list, | 1326 EXPECT_TRUE(this->RunPixelTest(&pass_list, |
| 1246 base::FilePath(FILE_PATH_LITERAL("green.png")), | 1327 base::FilePath(FILE_PATH_LITERAL("green.png")), |
| 1247 FuzzyPixelOffByOneComparator(true))); | 1328 FuzzyPixelOffByOneComparator(true))); |
| 1248 } | 1329 } |
| 1249 | 1330 |
| 1250 // Test that a YUV video doesn't bleed outside of its tex coords when the | 1331 // Test that a YUV video doesn't bleed outside of its tex coords when the |
| 1251 // tex coord rect is only a partial subrectangle of the coded contents. | 1332 // tex coord rect is only a partial subrectangle of the coded contents. |
| 1252 TEST_F(VideoGLRendererPixelTest, YUVEdgeBleed) { | 1333 TEST_F(VideoGLRendererPixelTest, YUVEdgeBleed) { |
| 1253 RenderPassList pass_list; | 1334 RenderPassList pass_list; |
| 1254 CreateEdgeBleedPass(media::PIXEL_FORMAT_YV12, media::COLOR_SPACE_JPEG, | 1335 CreateEdgeBleedPass(media::PIXEL_FORMAT_YV12, media::COLOR_SPACE_JPEG, |
| 1255 &pass_list); | 1336 &pass_list); |
| 1256 EXPECT_TRUE(this->RunPixelTest(&pass_list, | 1337 EXPECT_TRUE(this->RunPixelTest(&pass_list, |
| 1257 base::FilePath(FILE_PATH_LITERAL("green.png")), | 1338 base::FilePath(FILE_PATH_LITERAL("green.png")), |
| 1258 FuzzyPixelOffByOneComparator(true))); | 1339 FuzzyPixelOffByOneComparator(true))); |
| 1259 } | 1340 } |
| 1260 | 1341 |
| 1261 TEST_F(VideoGLRendererPixelTest, YUVAEdgeBleed) { | 1342 TEST_F(VideoGLRendererPixelTest, YUVAEdgeBleed) { |
| 1262 RenderPassList pass_list; | 1343 RenderPassList pass_list; |
| 1263 CreateEdgeBleedPass(media::PIXEL_FORMAT_YV12A, media::COLOR_SPACE_UNSPECIFIED, | 1344 CreateEdgeBleedPass(media::PIXEL_FORMAT_YV12A, media::COLOR_SPACE_UNSPECIFIED, |
| 1264 &pass_list); | 1345 &pass_list); |
| 1265 EXPECT_TRUE(this->RunPixelTest(&pass_list, | 1346 EXPECT_TRUE(this->RunPixelTest(&pass_list, |
| 1266 base::FilePath(FILE_PATH_LITERAL("green.png")), | 1347 base::FilePath(FILE_PATH_LITERAL("green.png")), |
| 1267 FuzzyPixelOffByOneComparator(true))); | 1348 FuzzyPixelOffByOneComparator(true))); |
| 1268 } | 1349 } |
| 1269 | 1350 |
| 1351 TEST_F(VideoGLRendererPixelTest, TextureQuadEdgeBleed) { | |
| 1352 // VideoResourceUpdater::CreateForSoftwarePlanes() converts YUV frame to RGBA | |
| 1353 // texture. | |
| 1354 DisableOneComponentTextures(); | |
| 1355 RenderPassList pass_list; | |
| 1356 CreateEdgeBleedPass(media::PIXEL_FORMAT_YV12, media::COLOR_SPACE_JPEG, | |
| 1357 &pass_list); | |
| 1358 EXPECT_TRUE(this->RunPixelTest(&pass_list, | |
| 1359 base::FilePath(FILE_PATH_LITERAL("green.png")), | |
| 1360 FuzzyPixelOffByOneComparator(true))); | |
| 1361 } | |
| 1362 | |
| 1270 TEST_F(VideoGLRendererPixelTest, SimpleYUVJRectGrey) { | 1363 TEST_F(VideoGLRendererPixelTest, SimpleYUVJRectGrey) { |
| 1271 gfx::Rect rect(this->device_viewport_size_); | 1364 gfx::Rect rect(this->device_viewport_size_); |
| 1272 | 1365 |
| 1273 RenderPassId id(1, 1); | 1366 RenderPassId id(1, 1); |
| 1274 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | 1367 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
| 1275 | 1368 |
| 1276 SharedQuadState* shared_state = | 1369 SharedQuadState* shared_state = |
| 1277 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); | 1370 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
| 1278 | 1371 |
| 1279 // Dark grey in JPEG color range (in MPEG, this is black). | 1372 // Dark grey in JPEG color range (in MPEG, this is black). |
| (...skipping 1867 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3147 | 3240 |
| 3148 EXPECT_TRUE(this->RunPixelTest( | 3241 EXPECT_TRUE(this->RunPixelTest( |
| 3149 &pass_list, base::FilePath(FILE_PATH_LITERAL("spiral.png")), | 3242 &pass_list, base::FilePath(FILE_PATH_LITERAL("spiral.png")), |
| 3150 FuzzyPixelOffByOneComparator(true))); | 3243 FuzzyPixelOffByOneComparator(true))); |
| 3151 } | 3244 } |
| 3152 | 3245 |
| 3153 #endif // !defined(OS_ANDROID) | 3246 #endif // !defined(OS_ANDROID) |
| 3154 | 3247 |
| 3155 } // namespace | 3248 } // namespace |
| 3156 } // namespace cc | 3249 } // namespace cc |
| OLD | NEW |