| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "cc/resources/video_resource_updater.h" | 5 #include "cc/resources/video_resource_updater.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 | 207 |
| 208 scoped_refptr<media::VideoFrame> CreateTestStreamTextureHardwareVideoFrame( | 208 scoped_refptr<media::VideoFrame> CreateTestStreamTextureHardwareVideoFrame( |
| 209 bool needs_copy) { | 209 bool needs_copy) { |
| 210 scoped_refptr<media::VideoFrame> video_frame = | 210 scoped_refptr<media::VideoFrame> video_frame = |
| 211 CreateTestHardwareVideoFrame(GL_TEXTURE_EXTERNAL_OES); | 211 CreateTestHardwareVideoFrame(GL_TEXTURE_EXTERNAL_OES); |
| 212 video_frame->metadata()->SetBoolean( | 212 video_frame->metadata()->SetBoolean( |
| 213 media::VideoFrameMetadata::COPY_REQUIRED, needs_copy); | 213 media::VideoFrameMetadata::COPY_REQUIRED, needs_copy); |
| 214 return video_frame; | 214 return video_frame; |
| 215 } | 215 } |
| 216 | 216 |
| 217 scoped_refptr<media::VideoFrame> CreateTestYuvHardwareVideoFrame() { | 217 scoped_refptr<media::VideoFrame> CreateTestYuvHardwareVideoFrame( |
| 218 media::VideoPixelFormat format, |
| 219 unsigned target, |
| 220 bool is_single_gmb) { |
| 218 const int kDimension = 10; | 221 const int kDimension = 10; |
| 219 gfx::Size size(kDimension, kDimension); | 222 gfx::Size size(kDimension, kDimension); |
| 220 | 223 |
| 221 const gpu::SyncToken sync_token( | 224 const gpu::SyncToken sync_token( |
| 222 gpu::CommandBufferNamespace::GPU_IO, 0, | 225 gpu::CommandBufferNamespace::GPU_IO, 0, |
| 223 gpu::CommandBufferId::FromUnsafeValue(0x123), 7); | 226 gpu::CommandBufferId::FromUnsafeValue(0x123), 7); |
| 224 const unsigned target = GL_TEXTURE_RECTANGLE_ARB; | |
| 225 const int kPlanesNum = 3; | |
| 226 gpu::MailboxHolder mailbox_holders[media::VideoFrame::kMaxPlanes]; | 227 gpu::MailboxHolder mailbox_holders[media::VideoFrame::kMaxPlanes]; |
| 227 for (int i = 0; i < kPlanesNum; ++i) { | 228 size_t num_plane = is_single_gmb ? 1 : media::VideoFrame::NumPlanes(format); |
| 229 for (size_t i = 0; i < num_plane; ++i) { |
| 228 gpu::Mailbox mailbox; | 230 gpu::Mailbox mailbox; |
| 229 mailbox.name[0] = 50 + 1; | 231 mailbox.name[0] = 50 + 1; |
| 230 mailbox_holders[i] = gpu::MailboxHolder(mailbox, sync_token, target); | 232 mailbox_holders[i] = gpu::MailboxHolder(mailbox, sync_token, target); |
| 231 } | 233 } |
| 232 scoped_refptr<media::VideoFrame> video_frame = | 234 scoped_refptr<media::VideoFrame> video_frame = |
| 233 media::VideoFrame::WrapNativeTextures(media::PIXEL_FORMAT_I420, | 235 media::VideoFrame::WrapNativeTextures(format, mailbox_holders, |
| 234 mailbox_holders, | |
| 235 base::Bind(&ReleaseMailboxCB), | 236 base::Bind(&ReleaseMailboxCB), |
| 236 size, // coded_size | 237 size, // coded_size |
| 237 gfx::Rect(size), // visible_rect | 238 gfx::Rect(size), // visible_rect |
| 238 size, // natural_size | 239 size, // natural_size |
| 239 base::TimeDelta()); // timestamp | 240 base::TimeDelta()); // timestamp |
| 240 EXPECT_TRUE(video_frame); | 241 EXPECT_TRUE(video_frame); |
| 241 return video_frame; | 242 return video_frame; |
| 242 } | 243 } |
| 243 | 244 |
| 244 WebGraphicsContext3DUploadCounter* context3d_; | 245 WebGraphicsContext3DUploadCounter* context3d_; |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 457 CreateTestRGBAHardwareVideoFrame(); | 458 CreateTestRGBAHardwareVideoFrame(); |
| 458 | 459 |
| 459 VideoFrameExternalResources resources = | 460 VideoFrameExternalResources resources = |
| 460 updater.CreateExternalResourcesFromVideoFrame(video_frame); | 461 updater.CreateExternalResourcesFromVideoFrame(video_frame); |
| 461 EXPECT_EQ(VideoFrameExternalResources::RGBA_PREMULTIPLIED_RESOURCE, | 462 EXPECT_EQ(VideoFrameExternalResources::RGBA_PREMULTIPLIED_RESOURCE, |
| 462 resources.type); | 463 resources.type); |
| 463 EXPECT_EQ(1u, resources.mailboxes.size()); | 464 EXPECT_EQ(1u, resources.mailboxes.size()); |
| 464 EXPECT_EQ(1u, resources.release_callbacks.size()); | 465 EXPECT_EQ(1u, resources.release_callbacks.size()); |
| 465 EXPECT_EQ(0u, resources.software_resources.size()); | 466 EXPECT_EQ(0u, resources.software_resources.size()); |
| 466 | 467 |
| 467 video_frame = CreateTestYuvHardwareVideoFrame(); | 468 video_frame = CreateTestYuvHardwareVideoFrame( |
| 469 media::PIXEL_FORMAT_I420, GL_TEXTURE_RECTANGLE_ARB, false); |
| 468 | 470 |
| 469 resources = updater.CreateExternalResourcesFromVideoFrame(video_frame); | 471 resources = updater.CreateExternalResourcesFromVideoFrame(video_frame); |
| 470 EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); | 472 EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); |
| 471 EXPECT_EQ(3u, resources.mailboxes.size()); | 473 EXPECT_EQ(3u, resources.mailboxes.size()); |
| 472 EXPECT_EQ(3u, resources.release_callbacks.size()); | 474 EXPECT_EQ(3u, resources.release_callbacks.size()); |
| 473 EXPECT_EQ(0u, resources.software_resources.size()); | 475 EXPECT_EQ(0u, resources.software_resources.size()); |
| 474 EXPECT_FALSE(resources.read_lock_fences_enabled); | 476 EXPECT_FALSE(resources.read_lock_fences_enabled); |
| 475 | 477 |
| 476 video_frame = CreateTestYuvHardwareVideoFrame(); | 478 video_frame = CreateTestYuvHardwareVideoFrame( |
| 479 media::PIXEL_FORMAT_I420, GL_TEXTURE_RECTANGLE_ARB, false); |
| 477 video_frame->metadata()->SetBoolean( | 480 video_frame->metadata()->SetBoolean( |
| 478 media::VideoFrameMetadata::READ_LOCK_FENCES_ENABLED, true); | 481 media::VideoFrameMetadata::READ_LOCK_FENCES_ENABLED, true); |
| 479 | 482 |
| 483 resources = updater.CreateExternalResourcesFromVideoFrame(video_frame); |
| 484 EXPECT_TRUE(resources.read_lock_fences_enabled); |
| 485 } |
| 486 |
| 487 TEST_F(VideoResourceUpdaterTest, CreateForNV12HardwarePlanes) { |
| 488 VideoResourceUpdater updater(context_provider_.get(), |
| 489 resource_provider3d_.get()); |
| 490 |
| 491 scoped_refptr<media::VideoFrame> video_frame = |
| 492 CreateTestYuvHardwareVideoFrame(media::PIXEL_FORMAT_NV12, |
| 493 GL_TEXTURE_EXTERNAL_OES, false); |
| 494 |
| 495 VideoFrameExternalResources resources = |
| 496 updater.CreateExternalResourcesFromVideoFrame(video_frame); |
| 497 |
| 498 EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); |
| 499 EXPECT_EQ(2u, resources.mailboxes.size()); |
| 500 EXPECT_EQ(2u, resources.release_callbacks.size()); |
| 501 EXPECT_EQ(0u, resources.software_resources.size()); |
| 502 EXPECT_FALSE(resources.read_lock_fences_enabled); |
| 503 |
| 504 video_frame = CreateTestYuvHardwareVideoFrame(media::PIXEL_FORMAT_NV12, |
| 505 GL_TEXTURE_EXTERNAL_OES, true); |
| 506 resources = updater.CreateExternalResourcesFromVideoFrame(video_frame); |
| 507 EXPECT_EQ(VideoFrameExternalResources::RGB_RESOURCE, resources.type); |
| 508 |
| 509 video_frame = CreateTestYuvHardwareVideoFrame(media::PIXEL_FORMAT_NV12, |
| 510 GL_TEXTURE_EXTERNAL_OES, false); |
| 511 video_frame->metadata()->SetBoolean( |
| 512 media::VideoFrameMetadata::READ_LOCK_FENCES_ENABLED, true); |
| 513 |
| 480 resources = updater.CreateExternalResourcesFromVideoFrame(video_frame); | 514 resources = updater.CreateExternalResourcesFromVideoFrame(video_frame); |
| 481 EXPECT_TRUE(resources.read_lock_fences_enabled); | 515 EXPECT_TRUE(resources.read_lock_fences_enabled); |
| 482 } | 516 } |
| 483 | 517 |
| 484 TEST_F(VideoResourceUpdaterTest, CreateForHardwarePlanes_StreamTexture) { | 518 TEST_F(VideoResourceUpdaterTest, CreateForHardwarePlanes_StreamTexture) { |
| 485 VideoResourceUpdater updater(context_provider_.get(), | 519 VideoResourceUpdater updater(context_provider_.get(), |
| 486 resource_provider3d_.get()); | 520 resource_provider3d_.get()); |
| 487 context3d_->ResetTextureCreationCount(); | 521 context3d_->ResetTextureCreationCount(); |
| 488 scoped_refptr<media::VideoFrame> video_frame = | 522 scoped_refptr<media::VideoFrame> video_frame = |
| 489 CreateTestStreamTextureHardwareVideoFrame(false); | 523 CreateTestStreamTextureHardwareVideoFrame(false); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 514 // The texture copy path requires the use of CopyTextureCHROMIUM, which | 548 // The texture copy path requires the use of CopyTextureCHROMIUM, which |
| 515 // enforces that the target texture not be immutable, as it may need | 549 // enforces that the target texture not be immutable, as it may need |
| 516 // to alter the storage of the texture. Therefore, this test asserts | 550 // to alter the storage of the texture. Therefore, this test asserts |
| 517 // that an immutable texture wasn't created by glTexStorage2DEXT, when | 551 // that an immutable texture wasn't created by glTexStorage2DEXT, when |
| 518 // that extension is supported. | 552 // that extension is supported. |
| 519 EXPECT_FALSE(context3d_->WasImmutableTextureCreated()); | 553 EXPECT_FALSE(context3d_->WasImmutableTextureCreated()); |
| 520 } | 554 } |
| 521 | 555 |
| 522 } // namespace | 556 } // namespace |
| 523 } // namespace cc | 557 } // namespace cc |
| OLD | NEW |