| 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 | 7 |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "cc/output/gl_renderer.h" | 9 #include "cc/output/gl_renderer.h" |
| 10 #include "cc/quads/draw_quad.h" | 10 #include "cc/quads/draw_quad.h" |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 221 resources.release_callbacks.size()); | 221 resources.release_callbacks.size()); |
| 222 | 222 |
| 223 ResourceId y_resource = resource_provider->CreateResourceFromTextureMailbox( | 223 ResourceId y_resource = resource_provider->CreateResourceFromTextureMailbox( |
| 224 resources.mailboxes[media::VideoFrame::kYPlane], | 224 resources.mailboxes[media::VideoFrame::kYPlane], |
| 225 SingleReleaseCallbackImpl::Create( | 225 SingleReleaseCallbackImpl::Create( |
| 226 resources.release_callbacks[media::VideoFrame::kYPlane])); | 226 resources.release_callbacks[media::VideoFrame::kYPlane])); |
| 227 ResourceId u_resource = resource_provider->CreateResourceFromTextureMailbox( | 227 ResourceId u_resource = resource_provider->CreateResourceFromTextureMailbox( |
| 228 resources.mailboxes[media::VideoFrame::kUPlane], | 228 resources.mailboxes[media::VideoFrame::kUPlane], |
| 229 SingleReleaseCallbackImpl::Create( | 229 SingleReleaseCallbackImpl::Create( |
| 230 resources.release_callbacks[media::VideoFrame::kUPlane])); | 230 resources.release_callbacks[media::VideoFrame::kUPlane])); |
| 231 ResourceId v_resource = resource_provider->CreateResourceFromTextureMailbox( | 231 ResourceId v_resource = u_resource; |
| 232 resources.mailboxes[media::VideoFrame::kVPlane], | 232 if (video_frame->format() != media::PIXEL_FORMAT_NV12) { |
| 233 SingleReleaseCallbackImpl::Create( | 233 v_resource = resource_provider->CreateResourceFromTextureMailbox( |
| 234 resources.release_callbacks[media::VideoFrame::kVPlane])); | 234 resources.mailboxes[media::VideoFrame::kVPlane], |
| 235 SingleReleaseCallbackImpl::Create( |
| 236 resources.release_callbacks[media::VideoFrame::kVPlane])); |
| 237 } |
| 235 ResourceId a_resource = 0; | 238 ResourceId a_resource = 0; |
| 236 if (with_alpha) { | 239 if (with_alpha) { |
| 237 a_resource = resource_provider->CreateResourceFromTextureMailbox( | 240 a_resource = resource_provider->CreateResourceFromTextureMailbox( |
| 238 resources.mailboxes[media::VideoFrame::kAPlane], | 241 resources.mailboxes[media::VideoFrame::kAPlane], |
| 239 SingleReleaseCallbackImpl::Create( | 242 SingleReleaseCallbackImpl::Create( |
| 240 resources.release_callbacks[media::VideoFrame::kAPlane])); | 243 resources.release_callbacks[media::VideoFrame::kAPlane])); |
| 241 } | 244 } |
| 242 | 245 |
| 243 const gfx::Size ya_tex_size = video_frame->coded_size(); | 246 const gfx::Size ya_tex_size = video_frame->coded_size(); |
| 244 const gfx::Size uv_tex_size = media::VideoFrame::PlaneSize( | 247 const gfx::Size uv_tex_size = media::VideoFrame::PlaneSize( |
| 245 video_frame->format(), media::VideoFrame::kUPlane, | 248 video_frame->format(), media::VideoFrame::kUPlane, |
| 246 video_frame->coded_size()); | 249 video_frame->coded_size()); |
| 247 DCHECK(uv_tex_size == media::VideoFrame::PlaneSize( | 250 if (media::VideoFrame::NumPlanes(video_frame->format()) > |
| 248 video_frame->format(), media::VideoFrame::kVPlane, | 251 media::VideoFrame::kVPlane) { |
| 249 video_frame->coded_size())); | 252 DCHECK(uv_tex_size == media::VideoFrame::PlaneSize( |
| 253 video_frame->format(), media::VideoFrame::kVPlane, |
| 254 video_frame->coded_size())); |
| 255 } |
| 250 if (with_alpha) { | 256 if (with_alpha) { |
| 251 DCHECK(ya_tex_size == media::VideoFrame::PlaneSize( | 257 DCHECK(ya_tex_size == media::VideoFrame::PlaneSize( |
| 252 video_frame->format(), media::VideoFrame::kAPlane, | 258 video_frame->format(), media::VideoFrame::kAPlane, |
| 253 video_frame->coded_size())); | 259 video_frame->coded_size())); |
| 254 } | 260 } |
| 255 | 261 |
| 256 gfx::RectF ya_tex_coord_rect(tex_coord_rect.x() * ya_tex_size.width(), | 262 gfx::RectF ya_tex_coord_rect(tex_coord_rect.x() * ya_tex_size.width(), |
| 257 tex_coord_rect.y() * ya_tex_size.height(), | 263 tex_coord_rect.y() * ya_tex_size.height(), |
| 258 tex_coord_rect.width() * ya_tex_size.width(), | 264 tex_coord_rect.width() * ya_tex_size.width(), |
| 259 tex_coord_rect.height() * ya_tex_size.height()); | 265 tex_coord_rect.height() * ya_tex_size.height()); |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 450 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( | 456 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( |
| 451 format, rect.size(), rect, rect.size(), base::TimeDelta()); | 457 format, rect.size(), rect, rect.size(), base::TimeDelta()); |
| 452 video_frame->metadata()->SetInteger(media::VideoFrameMetadata::COLOR_SPACE, | 458 video_frame->metadata()->SetInteger(media::VideoFrameMetadata::COLOR_SPACE, |
| 453 color_space); | 459 color_space); |
| 454 | 460 |
| 455 // YUV values of a solid, constant, color. Useful for testing that color | 461 // YUV values of a solid, constant, color. Useful for testing that color |
| 456 // space/color range are being handled properly. | 462 // space/color range are being handled properly. |
| 457 memset(video_frame->data(media::VideoFrame::kYPlane), y, | 463 memset(video_frame->data(media::VideoFrame::kYPlane), y, |
| 458 video_frame->stride(media::VideoFrame::kYPlane) * | 464 video_frame->stride(media::VideoFrame::kYPlane) * |
| 459 video_frame->rows(media::VideoFrame::kYPlane)); | 465 video_frame->rows(media::VideoFrame::kYPlane)); |
| 460 memset(video_frame->data(media::VideoFrame::kUPlane), u, | 466 if (format == media::PIXEL_FORMAT_NV12) { |
| 461 video_frame->stride(media::VideoFrame::kUPlane) * | 467 uint8_t* data = video_frame->data(media::VideoFrame::kUVPlane); |
| 462 video_frame->rows(media::VideoFrame::kUPlane)); | 468 int stride = video_frame->stride(media::VideoFrame::kUVPlane); |
| 463 memset(video_frame->data(media::VideoFrame::kVPlane), v, | 469 gfx::Size plane_size = video_frame->PlaneSize(video_frame->format(), |
| 464 video_frame->stride(media::VideoFrame::kVPlane) * | 470 media::VideoFrame::kUVPlane, |
| 465 video_frame->rows(media::VideoFrame::kVPlane)); | 471 video_frame->coded_size()); |
| 472 |
| 473 for (int y = 0; y < plane_size.height(); ++y) { |
| 474 for (int x = 0; x < plane_size.width(); ++x) { |
| 475 data[x * 2] = u; |
| 476 data[x * 2 + 1] = v; |
| 477 } |
| 478 data += stride; |
| 479 } |
| 480 } else { |
| 481 memset(video_frame->data(media::VideoFrame::kUPlane), u, |
| 482 video_frame->stride(media::VideoFrame::kUPlane) * |
| 483 video_frame->rows(media::VideoFrame::kUPlane)); |
| 484 memset(video_frame->data(media::VideoFrame::kVPlane), v, |
| 485 video_frame->stride(media::VideoFrame::kVPlane) * |
| 486 video_frame->rows(media::VideoFrame::kVPlane)); |
| 487 } |
| 466 | 488 |
| 467 uint8_t alpha_value = is_transparent ? 0 : 128; | 489 uint8_t alpha_value = is_transparent ? 0 : 128; |
| 468 CreateTestYUVVideoDrawQuad_FromVideoFrame( | 490 CreateTestYUVVideoDrawQuad_FromVideoFrame( |
| 469 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, | 491 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, |
| 470 video_resource_updater, rect, visible_rect, resource_provider); | 492 video_resource_updater, rect, visible_rect, resource_provider); |
| 471 } | 493 } |
| 472 | 494 |
| 473 typedef ::testing::Types<GLRenderer, | 495 typedef ::testing::Types<GLRenderer, |
| 474 SoftwareRenderer, | 496 SoftwareRenderer, |
| 475 GLRendererWithExpandedViewport, | 497 GLRendererWithExpandedViewport, |
| (...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1148 video_resource_updater_.get(), rect, rect, resource_provider_.get()); | 1170 video_resource_updater_.get(), rect, rect, resource_provider_.get()); |
| 1149 | 1171 |
| 1150 RenderPassList pass_list; | 1172 RenderPassList pass_list; |
| 1151 pass_list.push_back(std::move(pass)); | 1173 pass_list.push_back(std::move(pass)); |
| 1152 | 1174 |
| 1153 EXPECT_TRUE(this->RunPixelTest(&pass_list, | 1175 EXPECT_TRUE(this->RunPixelTest(&pass_list, |
| 1154 base::FilePath(FILE_PATH_LITERAL("green.png")), | 1176 base::FilePath(FILE_PATH_LITERAL("green.png")), |
| 1155 FuzzyPixelOffByOneComparator(true))); | 1177 FuzzyPixelOffByOneComparator(true))); |
| 1156 } | 1178 } |
| 1157 | 1179 |
| 1180 TEST_F(VideoGLRendererPixelTest, SimpleNV12JRect) { |
| 1181 gfx::Rect rect(this->device_viewport_size_); |
| 1182 |
| 1183 RenderPassId id(1, 1); |
| 1184 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
| 1185 |
| 1186 SharedQuadState* shared_state = |
| 1187 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
| 1188 |
| 1189 // YUV of (149,43,21) should be green (0,255,0) in RGB. |
| 1190 CreateTestYUVVideoDrawQuad_Solid( |
| 1191 shared_state, media::PIXEL_FORMAT_NV12, media::COLOR_SPACE_JPEG, false, |
| 1192 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 149, 43, 21, pass.get(), |
| 1193 video_resource_updater_.get(), rect, rect, resource_provider_.get()); |
| 1194 |
| 1195 RenderPassList pass_list; |
| 1196 pass_list.push_back(std::move(pass)); |
| 1197 |
| 1198 EXPECT_TRUE(this->RunPixelTest(&pass_list, |
| 1199 base::FilePath(FILE_PATH_LITERAL("green.png")), |
| 1200 FuzzyPixelOffByOneComparator(true))); |
| 1201 } |
| 1202 |
| 1158 // Test that a YUV video doesn't bleed outside of its tex coords when the | 1203 // Test that a YUV video doesn't bleed outside of its tex coords when the |
| 1159 // tex coord rect is only a partial subrectangle of the coded contents. | 1204 // tex coord rect is only a partial subrectangle of the coded contents. |
| 1160 TEST_F(VideoGLRendererPixelTest, YUVEdgeBleed) { | 1205 TEST_F(VideoGLRendererPixelTest, YUVEdgeBleed) { |
| 1161 RenderPassList pass_list; | 1206 RenderPassList pass_list; |
| 1162 CreateEdgeBleedPass(media::PIXEL_FORMAT_YV12, media::COLOR_SPACE_JPEG, | 1207 CreateEdgeBleedPass(media::PIXEL_FORMAT_YV12, media::COLOR_SPACE_JPEG, |
| 1163 &pass_list); | 1208 &pass_list); |
| 1164 EXPECT_TRUE(this->RunPixelTest(&pass_list, | 1209 EXPECT_TRUE(this->RunPixelTest(&pass_list, |
| 1165 base::FilePath(FILE_PATH_LITERAL("green.png")), | 1210 base::FilePath(FILE_PATH_LITERAL("green.png")), |
| 1166 FuzzyPixelOffByOneComparator(true))); | 1211 FuzzyPixelOffByOneComparator(true))); |
| 1167 } | 1212 } |
| (...skipping 1932 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3100 | 3145 |
| 3101 EXPECT_TRUE(this->RunPixelTest( | 3146 EXPECT_TRUE(this->RunPixelTest( |
| 3102 &pass_list, base::FilePath(FILE_PATH_LITERAL("spiral.png")), | 3147 &pass_list, base::FilePath(FILE_PATH_LITERAL("spiral.png")), |
| 3103 FuzzyPixelOffByOneComparator(true))); | 3148 FuzzyPixelOffByOneComparator(true))); |
| 3104 } | 3149 } |
| 3105 | 3150 |
| 3106 #endif // !defined(OS_ANDROID) | 3151 #endif // !defined(OS_ANDROID) |
| 3107 | 3152 |
| 3108 } // namespace | 3153 } // namespace |
| 3109 } // namespace cc | 3154 } // namespace cc |
| OLD | NEW |