| 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 231 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 242   } | 242   } | 
| 243 | 243 | 
| 244   WebGraphicsContext3DUploadCounter* context3d_; | 244   WebGraphicsContext3DUploadCounter* context3d_; | 
| 245   scoped_refptr<TestContextProvider> context_provider_; | 245   scoped_refptr<TestContextProvider> context_provider_; | 
| 246   std::unique_ptr<SharedBitmapManagerAllocationCounter> shared_bitmap_manager_; | 246   std::unique_ptr<SharedBitmapManagerAllocationCounter> shared_bitmap_manager_; | 
| 247   std::unique_ptr<ResourceProvider> resource_provider3d_; | 247   std::unique_ptr<ResourceProvider> resource_provider3d_; | 
| 248   std::unique_ptr<ResourceProvider> resource_provider_software_; | 248   std::unique_ptr<ResourceProvider> resource_provider_software_; | 
| 249 }; | 249 }; | 
| 250 | 250 | 
| 251 TEST_F(VideoResourceUpdaterTest, SoftwareFrame) { | 251 TEST_F(VideoResourceUpdaterTest, SoftwareFrame) { | 
|  | 252   bool use_stream_video_draw_quad = false; | 
| 252   VideoResourceUpdater updater(context_provider_.get(), | 253   VideoResourceUpdater updater(context_provider_.get(), | 
| 253                                resource_provider3d_.get()); | 254                                resource_provider3d_.get(), | 
|  | 255                                use_stream_video_draw_quad); | 
| 254   scoped_refptr<media::VideoFrame> video_frame = CreateTestYUVVideoFrame(); | 256   scoped_refptr<media::VideoFrame> video_frame = CreateTestYUVVideoFrame(); | 
| 255 | 257 | 
| 256   VideoFrameExternalResources resources = | 258   VideoFrameExternalResources resources = | 
| 257       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 259       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 
| 258   EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); | 260   EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); | 
| 259 } | 261 } | 
| 260 | 262 | 
| 261 TEST_F(VideoResourceUpdaterTest, HighBitFrameNoF16) { | 263 TEST_F(VideoResourceUpdaterTest, HighBitFrameNoF16) { | 
|  | 264   bool use_stream_video_draw_quad = false; | 
| 262   VideoResourceUpdater updater(context_provider_.get(), | 265   VideoResourceUpdater updater(context_provider_.get(), | 
| 263                                resource_provider3d_.get()); | 266                                resource_provider3d_.get(), | 
|  | 267                                use_stream_video_draw_quad); | 
| 264   scoped_refptr<media::VideoFrame> video_frame = CreateTestHighBitFrame(); | 268   scoped_refptr<media::VideoFrame> video_frame = CreateTestHighBitFrame(); | 
| 265 | 269 | 
| 266   VideoFrameExternalResources resources = | 270   VideoFrameExternalResources resources = | 
| 267       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 271       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 
| 268   EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); | 272   EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); | 
| 269 } | 273 } | 
| 270 | 274 | 
| 271 class VideoResourceUpdaterTestWithF16 : public VideoResourceUpdaterTest { | 275 class VideoResourceUpdaterTestWithF16 : public VideoResourceUpdaterTest { | 
| 272  public: | 276  public: | 
| 273   VideoResourceUpdaterTestWithF16() : VideoResourceUpdaterTest() { | 277   VideoResourceUpdaterTestWithF16() : VideoResourceUpdaterTest() { | 
| 274     context3d_->set_support_texture_half_float_linear(true); | 278     context3d_->set_support_texture_half_float_linear(true); | 
| 275   } | 279   } | 
| 276 }; | 280 }; | 
| 277 | 281 | 
| 278 TEST_F(VideoResourceUpdaterTestWithF16, HighBitFrame) { | 282 TEST_F(VideoResourceUpdaterTestWithF16, HighBitFrame) { | 
|  | 283   bool use_stream_video_draw_quad = false; | 
| 279   VideoResourceUpdater updater(context_provider_.get(), | 284   VideoResourceUpdater updater(context_provider_.get(), | 
| 280                                resource_provider3d_.get()); | 285                                resource_provider3d_.get(), | 
|  | 286                                use_stream_video_draw_quad); | 
| 281   scoped_refptr<media::VideoFrame> video_frame = CreateTestHighBitFrame(); | 287   scoped_refptr<media::VideoFrame> video_frame = CreateTestHighBitFrame(); | 
| 282 | 288 | 
| 283   VideoFrameExternalResources resources = | 289   VideoFrameExternalResources resources = | 
| 284       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 290       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 
| 285   EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); | 291   EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); | 
| 286   EXPECT_NEAR(resources.multiplier, 2.0, 0.1); | 292   EXPECT_NEAR(resources.multiplier, 2.0, 0.1); | 
| 287   EXPECT_NEAR(resources.offset, 0.5, 0.1); | 293   EXPECT_NEAR(resources.offset, 0.5, 0.1); | 
| 288 | 294 | 
| 289   // Create the resource again, to test the path where the | 295   // Create the resource again, to test the path where the | 
| 290   // resources are cached. | 296   // resources are cached. | 
| 291   VideoFrameExternalResources resources2 = | 297   VideoFrameExternalResources resources2 = | 
| 292       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 298       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 
| 293   EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources2.type); | 299   EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources2.type); | 
| 294   EXPECT_NEAR(resources2.multiplier, 2.0, 0.1); | 300   EXPECT_NEAR(resources2.multiplier, 2.0, 0.1); | 
| 295   EXPECT_NEAR(resources2.offset, 0.5, 0.1); | 301   EXPECT_NEAR(resources2.offset, 0.5, 0.1); | 
| 296 } | 302 } | 
| 297 | 303 | 
| 298 TEST_F(VideoResourceUpdaterTest, HighBitFrameSoftwareCompositor) { | 304 TEST_F(VideoResourceUpdaterTest, HighBitFrameSoftwareCompositor) { | 
| 299   VideoResourceUpdater updater(nullptr, resource_provider_software_.get()); | 305   bool use_stream_video_draw_quad = false; | 
|  | 306   VideoResourceUpdater updater(nullptr, resource_provider_software_.get(), | 
|  | 307                                use_stream_video_draw_quad); | 
| 300   scoped_refptr<media::VideoFrame> video_frame = CreateTestHighBitFrame(); | 308   scoped_refptr<media::VideoFrame> video_frame = CreateTestHighBitFrame(); | 
| 301 | 309 | 
| 302   VideoFrameExternalResources resources = | 310   VideoFrameExternalResources resources = | 
| 303       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 311       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 
| 304   EXPECT_EQ(VideoFrameExternalResources::SOFTWARE_RESOURCE, resources.type); | 312   EXPECT_EQ(VideoFrameExternalResources::SOFTWARE_RESOURCE, resources.type); | 
| 305 } | 313 } | 
| 306 | 314 | 
| 307 TEST_F(VideoResourceUpdaterTest, WonkySoftwareFrame) { | 315 TEST_F(VideoResourceUpdaterTest, WonkySoftwareFrame) { | 
|  | 316   bool use_stream_video_draw_quad = false; | 
| 308   VideoResourceUpdater updater(context_provider_.get(), | 317   VideoResourceUpdater updater(context_provider_.get(), | 
| 309                                resource_provider3d_.get()); | 318                                resource_provider3d_.get(), | 
|  | 319                                use_stream_video_draw_quad); | 
| 310   scoped_refptr<media::VideoFrame> video_frame = CreateWonkyTestYUVVideoFrame(); | 320   scoped_refptr<media::VideoFrame> video_frame = CreateWonkyTestYUVVideoFrame(); | 
| 311 | 321 | 
| 312   VideoFrameExternalResources resources = | 322   VideoFrameExternalResources resources = | 
| 313       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 323       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 
| 314   EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); | 324   EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); | 
| 315 } | 325 } | 
| 316 | 326 | 
| 317 TEST_F(VideoResourceUpdaterTest, WonkySoftwareFrameSoftwareCompositor) { | 327 TEST_F(VideoResourceUpdaterTest, WonkySoftwareFrameSoftwareCompositor) { | 
| 318   VideoResourceUpdater updater(nullptr, resource_provider_software_.get()); | 328   bool use_stream_video_draw_quad = false; | 
|  | 329   VideoResourceUpdater updater(nullptr, resource_provider_software_.get(), | 
|  | 330                                use_stream_video_draw_quad); | 
| 319   scoped_refptr<media::VideoFrame> video_frame = CreateWonkyTestYUVVideoFrame(); | 331   scoped_refptr<media::VideoFrame> video_frame = CreateWonkyTestYUVVideoFrame(); | 
| 320 | 332 | 
| 321   VideoFrameExternalResources resources = | 333   VideoFrameExternalResources resources = | 
| 322       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 334       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 
| 323   EXPECT_EQ(VideoFrameExternalResources::SOFTWARE_RESOURCE, resources.type); | 335   EXPECT_EQ(VideoFrameExternalResources::SOFTWARE_RESOURCE, resources.type); | 
| 324 } | 336 } | 
| 325 | 337 | 
| 326 TEST_F(VideoResourceUpdaterTest, ReuseResource) { | 338 TEST_F(VideoResourceUpdaterTest, ReuseResource) { | 
|  | 339   bool use_stream_video_draw_quad = false; | 
| 327   VideoResourceUpdater updater(context_provider_.get(), | 340   VideoResourceUpdater updater(context_provider_.get(), | 
| 328                                resource_provider3d_.get()); | 341                                resource_provider3d_.get(), | 
|  | 342                                use_stream_video_draw_quad); | 
| 329   scoped_refptr<media::VideoFrame> video_frame = CreateTestYUVVideoFrame(); | 343   scoped_refptr<media::VideoFrame> video_frame = CreateTestYUVVideoFrame(); | 
| 330   video_frame->set_timestamp(base::TimeDelta::FromSeconds(1234)); | 344   video_frame->set_timestamp(base::TimeDelta::FromSeconds(1234)); | 
| 331 | 345 | 
| 332   // Allocate the resources for a YUV video frame. | 346   // Allocate the resources for a YUV video frame. | 
| 333   context3d_->ResetUploadCount(); | 347   context3d_->ResetUploadCount(); | 
| 334   VideoFrameExternalResources resources = | 348   VideoFrameExternalResources resources = | 
| 335       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 349       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 
| 336   EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); | 350   EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); | 
| 337   EXPECT_EQ(size_t(3), resources.mailboxes.size()); | 351   EXPECT_EQ(size_t(3), resources.mailboxes.size()); | 
| 338   EXPECT_EQ(size_t(3), resources.release_callbacks.size()); | 352   EXPECT_EQ(size_t(3), resources.release_callbacks.size()); | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 349   context3d_->ResetUploadCount(); | 363   context3d_->ResetUploadCount(); | 
| 350   resources = updater.CreateExternalResourcesFromVideoFrame(video_frame); | 364   resources = updater.CreateExternalResourcesFromVideoFrame(video_frame); | 
| 351   EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); | 365   EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); | 
| 352   EXPECT_EQ(size_t(3), resources.mailboxes.size()); | 366   EXPECT_EQ(size_t(3), resources.mailboxes.size()); | 
| 353   EXPECT_EQ(size_t(3), resources.release_callbacks.size()); | 367   EXPECT_EQ(size_t(3), resources.release_callbacks.size()); | 
| 354   // The data should be reused so expect no texture uploads. | 368   // The data should be reused so expect no texture uploads. | 
| 355   EXPECT_EQ(0, context3d_->UploadCount()); | 369   EXPECT_EQ(0, context3d_->UploadCount()); | 
| 356 } | 370 } | 
| 357 | 371 | 
| 358 TEST_F(VideoResourceUpdaterTest, ReuseResourceNoDelete) { | 372 TEST_F(VideoResourceUpdaterTest, ReuseResourceNoDelete) { | 
|  | 373   bool use_stream_video_draw_quad = false; | 
| 359   VideoResourceUpdater updater(context_provider_.get(), | 374   VideoResourceUpdater updater(context_provider_.get(), | 
| 360                                resource_provider3d_.get()); | 375                                resource_provider3d_.get(), | 
|  | 376                                use_stream_video_draw_quad); | 
| 361   scoped_refptr<media::VideoFrame> video_frame = CreateTestYUVVideoFrame(); | 377   scoped_refptr<media::VideoFrame> video_frame = CreateTestYUVVideoFrame(); | 
| 362   video_frame->set_timestamp(base::TimeDelta::FromSeconds(1234)); | 378   video_frame->set_timestamp(base::TimeDelta::FromSeconds(1234)); | 
| 363 | 379 | 
| 364   // Allocate the resources for a YUV video frame. | 380   // Allocate the resources for a YUV video frame. | 
| 365   context3d_->ResetUploadCount(); | 381   context3d_->ResetUploadCount(); | 
| 366   VideoFrameExternalResources resources = | 382   VideoFrameExternalResources resources = | 
| 367       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 383       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 
| 368   EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); | 384   EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); | 
| 369   EXPECT_EQ(size_t(3), resources.mailboxes.size()); | 385   EXPECT_EQ(size_t(3), resources.mailboxes.size()); | 
| 370   EXPECT_EQ(size_t(3), resources.release_callbacks.size()); | 386   EXPECT_EQ(size_t(3), resources.release_callbacks.size()); | 
| 371   EXPECT_EQ(size_t(0), resources.software_resources.size()); | 387   EXPECT_EQ(size_t(0), resources.software_resources.size()); | 
| 372   // Expect exactly three texture uploads, one for each plane. | 388   // Expect exactly three texture uploads, one for each plane. | 
| 373   EXPECT_EQ(3, context3d_->UploadCount()); | 389   EXPECT_EQ(3, context3d_->UploadCount()); | 
| 374 | 390 | 
| 375   // Allocate resources for the same frame. | 391   // Allocate resources for the same frame. | 
| 376   context3d_->ResetUploadCount(); | 392   context3d_->ResetUploadCount(); | 
| 377   resources = updater.CreateExternalResourcesFromVideoFrame(video_frame); | 393   resources = updater.CreateExternalResourcesFromVideoFrame(video_frame); | 
| 378   EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); | 394   EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); | 
| 379   EXPECT_EQ(size_t(3), resources.mailboxes.size()); | 395   EXPECT_EQ(size_t(3), resources.mailboxes.size()); | 
| 380   EXPECT_EQ(size_t(3), resources.release_callbacks.size()); | 396   EXPECT_EQ(size_t(3), resources.release_callbacks.size()); | 
| 381   // The data should be reused so expect no texture uploads. | 397   // The data should be reused so expect no texture uploads. | 
| 382   EXPECT_EQ(0, context3d_->UploadCount()); | 398   EXPECT_EQ(0, context3d_->UploadCount()); | 
| 383 } | 399 } | 
| 384 | 400 | 
| 385 TEST_F(VideoResourceUpdaterTest, SoftwareFrameSoftwareCompositor) { | 401 TEST_F(VideoResourceUpdaterTest, SoftwareFrameSoftwareCompositor) { | 
| 386   VideoResourceUpdater updater(nullptr, resource_provider_software_.get()); | 402   bool use_stream_video_draw_quad = false; | 
|  | 403   VideoResourceUpdater updater(nullptr, resource_provider_software_.get(), | 
|  | 404                                use_stream_video_draw_quad); | 
| 387   scoped_refptr<media::VideoFrame> video_frame = CreateTestYUVVideoFrame(); | 405   scoped_refptr<media::VideoFrame> video_frame = CreateTestYUVVideoFrame(); | 
| 388 | 406 | 
| 389   VideoFrameExternalResources resources = | 407   VideoFrameExternalResources resources = | 
| 390       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 408       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 
| 391   EXPECT_EQ(VideoFrameExternalResources::SOFTWARE_RESOURCE, resources.type); | 409   EXPECT_EQ(VideoFrameExternalResources::SOFTWARE_RESOURCE, resources.type); | 
| 392 } | 410 } | 
| 393 | 411 | 
| 394 TEST_F(VideoResourceUpdaterTest, ReuseResourceSoftwareCompositor) { | 412 TEST_F(VideoResourceUpdaterTest, ReuseResourceSoftwareCompositor) { | 
| 395   VideoResourceUpdater updater(nullptr, resource_provider_software_.get()); | 413   bool use_stream_video_draw_quad = false; | 
|  | 414   VideoResourceUpdater updater(nullptr, resource_provider_software_.get(), | 
|  | 415                                use_stream_video_draw_quad); | 
| 396   scoped_refptr<media::VideoFrame> video_frame = CreateTestYUVVideoFrame(); | 416   scoped_refptr<media::VideoFrame> video_frame = CreateTestYUVVideoFrame(); | 
| 397   video_frame->set_timestamp(base::TimeDelta::FromSeconds(1234)); | 417   video_frame->set_timestamp(base::TimeDelta::FromSeconds(1234)); | 
| 398 | 418 | 
| 399   // Allocate the resources for a software video frame. | 419   // Allocate the resources for a software video frame. | 
| 400   shared_bitmap_manager_->ResetAllocationCount(); | 420   shared_bitmap_manager_->ResetAllocationCount(); | 
| 401   VideoFrameExternalResources resources = | 421   VideoFrameExternalResources resources = | 
| 402       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 422       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 
| 403   EXPECT_EQ(VideoFrameExternalResources::SOFTWARE_RESOURCE, resources.type); | 423   EXPECT_EQ(VideoFrameExternalResources::SOFTWARE_RESOURCE, resources.type); | 
| 404   EXPECT_EQ(size_t(0), resources.mailboxes.size()); | 424   EXPECT_EQ(size_t(0), resources.mailboxes.size()); | 
| 405   EXPECT_EQ(size_t(0), resources.release_callbacks.size()); | 425   EXPECT_EQ(size_t(0), resources.release_callbacks.size()); | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 416   resources = updater.CreateExternalResourcesFromVideoFrame(video_frame); | 436   resources = updater.CreateExternalResourcesFromVideoFrame(video_frame); | 
| 417   EXPECT_EQ(VideoFrameExternalResources::SOFTWARE_RESOURCE, resources.type); | 437   EXPECT_EQ(VideoFrameExternalResources::SOFTWARE_RESOURCE, resources.type); | 
| 418   EXPECT_EQ(size_t(0), resources.mailboxes.size()); | 438   EXPECT_EQ(size_t(0), resources.mailboxes.size()); | 
| 419   EXPECT_EQ(size_t(0), resources.release_callbacks.size()); | 439   EXPECT_EQ(size_t(0), resources.release_callbacks.size()); | 
| 420   EXPECT_EQ(size_t(1), resources.software_resources.size()); | 440   EXPECT_EQ(size_t(1), resources.software_resources.size()); | 
| 421   // The data should be reused so expect no new allocations. | 441   // The data should be reused so expect no new allocations. | 
| 422   EXPECT_EQ(0, shared_bitmap_manager_->AllocationCount()); | 442   EXPECT_EQ(0, shared_bitmap_manager_->AllocationCount()); | 
| 423 } | 443 } | 
| 424 | 444 | 
| 425 TEST_F(VideoResourceUpdaterTest, ReuseResourceNoDeleteSoftwareCompositor) { | 445 TEST_F(VideoResourceUpdaterTest, ReuseResourceNoDeleteSoftwareCompositor) { | 
| 426   VideoResourceUpdater updater(nullptr, resource_provider_software_.get()); | 446   bool use_stream_video_draw_quad = false; | 
|  | 447   VideoResourceUpdater updater(nullptr, resource_provider_software_.get(), | 
|  | 448                                use_stream_video_draw_quad); | 
| 427   scoped_refptr<media::VideoFrame> video_frame = CreateTestYUVVideoFrame(); | 449   scoped_refptr<media::VideoFrame> video_frame = CreateTestYUVVideoFrame(); | 
| 428   video_frame->set_timestamp(base::TimeDelta::FromSeconds(1234)); | 450   video_frame->set_timestamp(base::TimeDelta::FromSeconds(1234)); | 
| 429 | 451 | 
| 430   // Allocate the resources for a software video frame. | 452   // Allocate the resources for a software video frame. | 
| 431   shared_bitmap_manager_->ResetAllocationCount(); | 453   shared_bitmap_manager_->ResetAllocationCount(); | 
| 432   VideoFrameExternalResources resources = | 454   VideoFrameExternalResources resources = | 
| 433       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 455       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 
| 434   EXPECT_EQ(VideoFrameExternalResources::SOFTWARE_RESOURCE, resources.type); | 456   EXPECT_EQ(VideoFrameExternalResources::SOFTWARE_RESOURCE, resources.type); | 
| 435   EXPECT_EQ(size_t(0), resources.mailboxes.size()); | 457   EXPECT_EQ(size_t(0), resources.mailboxes.size()); | 
| 436   EXPECT_EQ(size_t(0), resources.release_callbacks.size()); | 458   EXPECT_EQ(size_t(0), resources.release_callbacks.size()); | 
| 437   EXPECT_EQ(size_t(1), resources.software_resources.size()); | 459   EXPECT_EQ(size_t(1), resources.software_resources.size()); | 
| 438   // Expect exactly one allocated shared bitmap. | 460   // Expect exactly one allocated shared bitmap. | 
| 439   EXPECT_EQ(1, shared_bitmap_manager_->AllocationCount()); | 461   EXPECT_EQ(1, shared_bitmap_manager_->AllocationCount()); | 
| 440 | 462 | 
| 441   // Allocate resources for the same frame. | 463   // Allocate resources for the same frame. | 
| 442   shared_bitmap_manager_->ResetAllocationCount(); | 464   shared_bitmap_manager_->ResetAllocationCount(); | 
| 443   resources = updater.CreateExternalResourcesFromVideoFrame(video_frame); | 465   resources = updater.CreateExternalResourcesFromVideoFrame(video_frame); | 
| 444   EXPECT_EQ(VideoFrameExternalResources::SOFTWARE_RESOURCE, resources.type); | 466   EXPECT_EQ(VideoFrameExternalResources::SOFTWARE_RESOURCE, resources.type); | 
| 445   EXPECT_EQ(size_t(0), resources.mailboxes.size()); | 467   EXPECT_EQ(size_t(0), resources.mailboxes.size()); | 
| 446   EXPECT_EQ(size_t(0), resources.release_callbacks.size()); | 468   EXPECT_EQ(size_t(0), resources.release_callbacks.size()); | 
| 447   EXPECT_EQ(size_t(1), resources.software_resources.size()); | 469   EXPECT_EQ(size_t(1), resources.software_resources.size()); | 
| 448   // The data should be reused so expect no new allocations. | 470   // The data should be reused so expect no new allocations. | 
| 449   EXPECT_EQ(0, shared_bitmap_manager_->AllocationCount()); | 471   EXPECT_EQ(0, shared_bitmap_manager_->AllocationCount()); | 
| 450 } | 472 } | 
| 451 | 473 | 
| 452 TEST_F(VideoResourceUpdaterTest, CreateForHardwarePlanes) { | 474 TEST_F(VideoResourceUpdaterTest, CreateForHardwarePlanes) { | 
|  | 475   bool use_stream_video_draw_quad = false; | 
| 453   VideoResourceUpdater updater(context_provider_.get(), | 476   VideoResourceUpdater updater(context_provider_.get(), | 
| 454                                resource_provider3d_.get()); | 477                                resource_provider3d_.get(), | 
|  | 478                                use_stream_video_draw_quad); | 
| 455 | 479 | 
| 456   scoped_refptr<media::VideoFrame> video_frame = | 480   scoped_refptr<media::VideoFrame> video_frame = | 
| 457       CreateTestRGBAHardwareVideoFrame(); | 481       CreateTestRGBAHardwareVideoFrame(); | 
| 458 | 482 | 
| 459   VideoFrameExternalResources resources = | 483   VideoFrameExternalResources resources = | 
| 460       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 484       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 
| 461   EXPECT_EQ(VideoFrameExternalResources::RGBA_PREMULTIPLIED_RESOURCE, | 485   EXPECT_EQ(VideoFrameExternalResources::RGBA_PREMULTIPLIED_RESOURCE, | 
| 462             resources.type); | 486             resources.type); | 
| 463   EXPECT_EQ(1u, resources.mailboxes.size()); | 487   EXPECT_EQ(1u, resources.mailboxes.size()); | 
| 464   EXPECT_EQ(1u, resources.release_callbacks.size()); | 488   EXPECT_EQ(1u, resources.release_callbacks.size()); | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 475 | 499 | 
| 476   video_frame = CreateTestYuvHardwareVideoFrame(); | 500   video_frame = CreateTestYuvHardwareVideoFrame(); | 
| 477   video_frame->metadata()->SetBoolean( | 501   video_frame->metadata()->SetBoolean( | 
| 478       media::VideoFrameMetadata::READ_LOCK_FENCES_ENABLED, true); | 502       media::VideoFrameMetadata::READ_LOCK_FENCES_ENABLED, true); | 
| 479 | 503 | 
| 480   resources = updater.CreateExternalResourcesFromVideoFrame(video_frame); | 504   resources = updater.CreateExternalResourcesFromVideoFrame(video_frame); | 
| 481   EXPECT_TRUE(resources.read_lock_fences_enabled); | 505   EXPECT_TRUE(resources.read_lock_fences_enabled); | 
| 482 } | 506 } | 
| 483 | 507 | 
| 484 TEST_F(VideoResourceUpdaterTest, CreateForHardwarePlanes_StreamTexture) { | 508 TEST_F(VideoResourceUpdaterTest, CreateForHardwarePlanes_StreamTexture) { | 
|  | 509   bool use_stream_video_draw_quad = true; | 
| 485   VideoResourceUpdater updater(context_provider_.get(), | 510   VideoResourceUpdater updater(context_provider_.get(), | 
| 486                                resource_provider3d_.get()); | 511                                resource_provider3d_.get(), | 
|  | 512                                use_stream_video_draw_quad); | 
| 487   context3d_->ResetTextureCreationCount(); | 513   context3d_->ResetTextureCreationCount(); | 
| 488   scoped_refptr<media::VideoFrame> video_frame = | 514   scoped_refptr<media::VideoFrame> video_frame = | 
| 489       CreateTestStreamTextureHardwareVideoFrame(false); | 515       CreateTestStreamTextureHardwareVideoFrame(false); | 
| 490 | 516 | 
| 491   VideoFrameExternalResources resources = | 517   VideoFrameExternalResources resources = | 
| 492       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 518       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 
| 493   EXPECT_EQ(VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE, | 519   EXPECT_EQ(VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE, | 
| 494             resources.type); | 520             resources.type); | 
| 495   EXPECT_EQ(1u, resources.mailboxes.size()); | 521   EXPECT_EQ(1u, resources.mailboxes.size()); | 
| 496   EXPECT_EQ((GLenum)GL_TEXTURE_EXTERNAL_OES, resources.mailboxes[0].target()); | 522   EXPECT_EQ((GLenum)GL_TEXTURE_EXTERNAL_OES, resources.mailboxes[0].target()); | 
| 497   EXPECT_EQ(1u, resources.release_callbacks.size()); | 523   EXPECT_EQ(1u, resources.release_callbacks.size()); | 
| 498   EXPECT_EQ(0u, resources.software_resources.size()); | 524   EXPECT_EQ(0u, resources.software_resources.size()); | 
| 499   EXPECT_EQ(0, context3d_->TextureCreationCount()); | 525   EXPECT_EQ(0, context3d_->TextureCreationCount()); | 
| 500 | 526 | 
| 501   // A copied stream texture should return an RGBA resource in a new | 527   // A copied stream texture should return an RGBA resource in a new | 
| 502   // GL_TEXTURE_2D texture. | 528   // GL_TEXTURE_2D texture. | 
| 503   context3d_->ResetTextureCreationCount(); | 529   context3d_->ResetTextureCreationCount(); | 
| 504   video_frame = CreateTestStreamTextureHardwareVideoFrame(true); | 530   video_frame = CreateTestStreamTextureHardwareVideoFrame(true); | 
| 505   context3d_->ResetImmutableTextureCreated(); | 531   context3d_->ResetImmutableTextureCreated(); | 
| 506   resources = updater.CreateExternalResourcesFromVideoFrame(video_frame); | 532   resources = updater.CreateExternalResourcesFromVideoFrame(video_frame); | 
| 507   EXPECT_EQ(VideoFrameExternalResources::RGBA_RESOURCE, resources.type); | 533   EXPECT_EQ(VideoFrameExternalResources::RGBA_PREMULTIPLIED_RESOURCE, | 
|  | 534             resources.type); | 
| 508   EXPECT_EQ(1u, resources.mailboxes.size()); | 535   EXPECT_EQ(1u, resources.mailboxes.size()); | 
| 509   EXPECT_EQ((GLenum)GL_TEXTURE_2D, resources.mailboxes[0].target()); | 536   EXPECT_EQ((GLenum)GL_TEXTURE_2D, resources.mailboxes[0].target()); | 
| 510   EXPECT_EQ(1u, resources.release_callbacks.size()); | 537   EXPECT_EQ(1u, resources.release_callbacks.size()); | 
| 511   EXPECT_EQ(0u, resources.software_resources.size()); | 538   EXPECT_EQ(0u, resources.software_resources.size()); | 
| 512   EXPECT_EQ(1, context3d_->TextureCreationCount()); | 539   EXPECT_EQ(1, context3d_->TextureCreationCount()); | 
| 513 | 540 | 
| 514   // The texture copy path requires the use of CopyTextureCHROMIUM, which | 541   // The texture copy path requires the use of CopyTextureCHROMIUM, which | 
| 515   // enforces that the target texture not be immutable, as it may need | 542   // enforces that the target texture not be immutable, as it may need | 
| 516   // to alter the storage of the texture. Therefore, this test asserts | 543   // to alter the storage of the texture. Therefore, this test asserts | 
| 517   // that an immutable texture wasn't created by glTexStorage2DEXT, when | 544   // that an immutable texture wasn't created by glTexStorage2DEXT, when | 
| 518   // that extension is supported. | 545   // that extension is supported. | 
| 519   EXPECT_FALSE(context3d_->WasImmutableTextureCreated()); | 546   EXPECT_FALSE(context3d_->WasImmutableTextureCreated()); | 
| 520 } | 547 } | 
| 521 | 548 | 
|  | 549 TEST_F(VideoResourceUpdaterTest, CreateForHardwarePlanes_TextureQuad) { | 
|  | 550   bool use_stream_video_draw_quad = false; | 
|  | 551   VideoResourceUpdater updater(context_provider_.get(), | 
|  | 552                                resource_provider3d_.get(), | 
|  | 553                                use_stream_video_draw_quad); | 
|  | 554   context3d_->ResetTextureCreationCount(); | 
|  | 555   scoped_refptr<media::VideoFrame> video_frame = | 
|  | 556       CreateTestStreamTextureHardwareVideoFrame(false); | 
|  | 557 | 
|  | 558   VideoFrameExternalResources resources = | 
|  | 559       updater.CreateExternalResourcesFromVideoFrame(video_frame); | 
|  | 560   EXPECT_EQ(VideoFrameExternalResources::RGBA_PREMULTIPLIED_RESOURCE, | 
|  | 561             resources.type); | 
|  | 562   EXPECT_EQ(1u, resources.mailboxes.size()); | 
|  | 563   EXPECT_EQ((GLenum)GL_TEXTURE_EXTERNAL_OES, resources.mailboxes[0].target()); | 
|  | 564   EXPECT_EQ(1u, resources.release_callbacks.size()); | 
|  | 565   EXPECT_EQ(0u, resources.software_resources.size()); | 
|  | 566   EXPECT_EQ(0, context3d_->TextureCreationCount()); | 
|  | 567 } | 
|  | 568 | 
| 522 }  // namespace | 569 }  // namespace | 
| 523 }  // namespace cc | 570 }  // namespace cc | 
| OLD | NEW | 
|---|