Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(60)

Side by Side Diff: media/gpu/android_video_decode_accelerator_unittest.cc

Issue 2883913003: Add multiple destruction callbacks to AndroidOverlay. (Closed)
Patch Set: rebased.... though i got not conflicts? Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 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 "media/gpu/android_video_decode_accelerator.h" 5 #include "media/gpu/android_video_decode_accelerator.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <memory> 9 #include <memory>
10 10
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
244 MOCK_METHOD0(MockReplaceOverlayFactory, void()); 244 MOCK_METHOD0(MockReplaceOverlayFactory, void());
245 245
246 // We guarantee that we'll only clear this during destruction, so that you 246 // We guarantee that we'll only clear this during destruction, so that you
247 // may treat it as "pointer that lasts as long as |this| does". 247 // may treat it as "pointer that lasts as long as |this| does".
248 base::WeakPtr<FakeOverlayChooser> GetWeakPtrForTesting() { 248 base::WeakPtr<FakeOverlayChooser> GetWeakPtrForTesting() {
249 return weak_factory_.GetWeakPtr(); 249 return weak_factory_.GetWeakPtr();
250 } 250 }
251 251
252 void Initialize(UseOverlayCB use_overlay_cb, 252 void Initialize(UseOverlayCB use_overlay_cb,
253 UseSurfaceTextureCB use_surface_texture_cb, 253 UseSurfaceTextureCB use_surface_texture_cb,
254 StopUsingOverlayImmediatelyCB stop_immediately_cb,
255 AndroidOverlayFactoryCB initial_factory) override { 254 AndroidOverlayFactoryCB initial_factory) override {
256 MockInitialize(); 255 MockInitialize();
257 256
258 factory_ = std::move(initial_factory); 257 factory_ = std::move(initial_factory);
259 use_overlay_cb_ = std::move(use_overlay_cb); 258 use_overlay_cb_ = std::move(use_overlay_cb);
260 use_surface_texture_cb_ = std::move(use_surface_texture_cb); 259 use_surface_texture_cb_ = std::move(use_surface_texture_cb);
261 stop_immediately_cb_ = std::move(stop_immediately_cb);
262 } 260 }
263 261
264 void ReplaceOverlayFactory(AndroidOverlayFactoryCB factory) override { 262 void ReplaceOverlayFactory(AndroidOverlayFactoryCB factory) override {
265 MockReplaceOverlayFactory(); 263 MockReplaceOverlayFactory();
266 factory_ = std::move(factory); 264 factory_ = std::move(factory);
267 } 265 }
268 266
269 // Notify AVDA to use a surface texture. 267 // Notify AVDA to use a surface texture.
270 void ProvideSurfaceTexture() { 268 void ProvideSurfaceTexture() {
271 use_surface_texture_cb_.Run(); 269 use_surface_texture_cb_.Run();
272 base::RunLoop().RunUntilIdle(); 270 base::RunLoop().RunUntilIdle();
273 } 271 }
274 272
275 void ProvideOverlay(std::unique_ptr<AndroidOverlay> overlay) { 273 void ProvideOverlay(std::unique_ptr<AndroidOverlay> overlay) {
276 use_overlay_cb_.Run(std::move(overlay)); 274 use_overlay_cb_.Run(std::move(overlay));
277 base::RunLoop().RunUntilIdle(); 275 base::RunLoop().RunUntilIdle();
278 } 276 }
279 277
280 void StopImmediately(AndroidOverlay* overlay) {
281 stop_immediately_cb_.Run(overlay);
282 base::RunLoop().RunUntilIdle();
283 }
284
285 UseOverlayCB use_overlay_cb_; 278 UseOverlayCB use_overlay_cb_;
286 UseSurfaceTextureCB use_surface_texture_cb_; 279 UseSurfaceTextureCB use_surface_texture_cb_;
287 StopUsingOverlayImmediatelyCB stop_immediately_cb_;
288 280
289 AndroidOverlayFactoryCB factory_; 281 AndroidOverlayFactoryCB factory_;
290 282
291 base::WeakPtrFactory<FakeOverlayChooser> weak_factory_; 283 base::WeakPtrFactory<FakeOverlayChooser> weak_factory_;
292 284
293 private: 285 private:
294 DISALLOW_COPY_AND_ASSIGN(FakeOverlayChooser); 286 DISALLOW_COPY_AND_ASSIGN(FakeOverlayChooser);
295 }; 287 };
296 288
297 } // namespace 289 } // namespace
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 void InitializeAVDAWithOverlay() { 339 void InitializeAVDAWithOverlay() {
348 config_.surface_id = 123; 340 config_.surface_id = 123;
349 ASSERT_TRUE(InitializeAVDA()); 341 ASSERT_TRUE(InitializeAVDA());
350 base::RunLoop().RunUntilIdle(); 342 base::RunLoop().RunUntilIdle();
351 ASSERT_TRUE(chooser_->factory_); 343 ASSERT_TRUE(chooser_->factory_);
352 344
353 // Have the factory provide an overlay, and verify that codec creation is 345 // Have the factory provide an overlay, and verify that codec creation is
354 // provided with that overlay. 346 // provided with that overlay.
355 std::unique_ptr<MockAndroidOverlay> overlay = 347 std::unique_ptr<MockAndroidOverlay> overlay =
356 base::MakeUnique<MockAndroidOverlay>(); 348 base::MakeUnique<MockAndroidOverlay>();
349 overlay_callbacks_ = overlay->GetCallbacks();
350
357 // Set the expectations first, since ProvideOverlay might cause callbacks. 351 // Set the expectations first, since ProvideOverlay might cause callbacks.
358 EXPECT_CALL(codec_allocator_, 352 EXPECT_CALL(codec_allocator_,
359 MockCreateMediaCodecAsync(overlay.get(), nullptr)); 353 MockCreateMediaCodecAsync(overlay.get(), nullptr));
360 chooser_->ProvideOverlay(std::move(overlay)); 354 chooser_->ProvideOverlay(std::move(overlay));
361 355
362 // Provide the codec so that we can check if it's freed properly. 356 // Provide the codec so that we can check if it's freed properly.
363 EXPECT_CALL(client_, NotifyInitializationComplete(true)); 357 EXPECT_CALL(client_, NotifyInitializationComplete(true));
364 codec_allocator_.ProvideMockCodecAsync(); 358 codec_allocator_.ProvideMockCodecAsync();
365 base::RunLoop().RunUntilIdle(); 359 base::RunLoop().RunUntilIdle();
366 } 360 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
403 scoped_refptr<gl::GLSurface> surface_; 397 scoped_refptr<gl::GLSurface> surface_;
404 scoped_refptr<gl::GLContext> context_; 398 scoped_refptr<gl::GLContext> context_;
405 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_; 399 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
406 NiceMock<gpu::gles2::MockGLES2Decoder> gl_decoder_; 400 NiceMock<gpu::gles2::MockGLES2Decoder> gl_decoder_;
407 NiceMock<MockVDAClient> client_; 401 NiceMock<MockVDAClient> client_;
408 FakeCodecAllocator codec_allocator_; 402 FakeCodecAllocator codec_allocator_;
409 VideoDecodeAccelerator::Config config_; 403 VideoDecodeAccelerator::Config config_;
410 404
411 AndroidVideoDecodeAccelerator::PlatformConfig platform_config_; 405 AndroidVideoDecodeAccelerator::PlatformConfig platform_config_;
412 406
407 // Set by InitializeAVDAWithOverlay()
408 MockAndroidOverlay::Callbacks overlay_callbacks_;
409
413 // We maintain a weak ref to this since AVDA owns it. 410 // We maintain a weak ref to this since AVDA owns it.
414 base::WeakPtr<FakeOverlayChooser> chooser_; 411 base::WeakPtr<FakeOverlayChooser> chooser_;
415 412
416 // This must be a unique pointer to a VDA, not an AVDA, to ensure the 413 // This must be a unique pointer to a VDA, not an AVDA, to ensure the
417 // the default_delete specialization that calls Destroy() will be used. 414 // the default_delete specialization that calls Destroy() will be used.
418 std::unique_ptr<VideoDecodeAccelerator> vda_; 415 std::unique_ptr<VideoDecodeAccelerator> vda_;
419 416
420 AndroidVideoDecodeAccelerator* avda() { 417 AndroidVideoDecodeAccelerator* avda() {
421 return reinterpret_cast<AndroidVideoDecodeAccelerator*>(vda_.get()); 418 return reinterpret_cast<AndroidVideoDecodeAccelerator*>(vda_.get());
422 } 419 }
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
547 SKIP_IF_MEDIACODEC_IS_NOT_AVAILABLE(); 544 SKIP_IF_MEDIACODEC_IS_NOT_AVAILABLE();
548 545
549 InitializeAVDAWithOverlay(); 546 InitializeAVDAWithOverlay();
550 547
551 // It would be nice if we knew that this was a surface texture. As it is, we 548 // It would be nice if we knew that this was a surface texture. As it is, we
552 // just destroy the VDA and expect that we're provided with one. Hopefully, 549 // just destroy the VDA and expect that we're provided with one. Hopefully,
553 // AVDA is actually calling SetSurface properly. 550 // AVDA is actually calling SetSurface properly.
554 EXPECT_CALL(*codec_allocator_.most_recent_codec(), SetSurface(_)) 551 EXPECT_CALL(*codec_allocator_.most_recent_codec(), SetSurface(_))
555 .WillOnce(Return(true)); 552 .WillOnce(Return(true));
556 codec_allocator_.codec_destruction_observer()->DestructionIsOptional(); 553 codec_allocator_.codec_destruction_observer()->DestructionIsOptional();
557 chooser_->StopImmediately(codec_allocator_.most_recent_overlay()); 554 overlay_callbacks_.SurfaceDestroyed.Run();
555 base::RunLoop().RunUntilIdle();
558 556
559 EXPECT_CALL(codec_allocator_, 557 EXPECT_CALL(codec_allocator_,
560 MockReleaseMediaCodec(codec_allocator_.most_recent_codec(), 558 MockReleaseMediaCodec(codec_allocator_.most_recent_codec(),
561 nullptr, NotNull())); 559 nullptr, NotNull()));
562 vda_ = nullptr; 560 vda_ = nullptr;
563 base::RunLoop().RunUntilIdle(); 561 base::RunLoop().RunUntilIdle();
564 } 562 }
565 563
566 TEST_F(AndroidVideoDecodeAcceleratorTest, SwitchesToSurfaceTextureEventually) { 564 TEST_F(AndroidVideoDecodeAcceleratorTest, SwitchesToSurfaceTextureEventually) {
567 // Provide a surface, and a codec, then request that AVDA switches to a 565 // Provide a surface, and a codec, then request that AVDA switches to a
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
664 platform_config_.allow_setsurface = false; 662 platform_config_.allow_setsurface = false;
665 InitializeAVDAWithOverlay(); 663 InitializeAVDAWithOverlay();
666 EXPECT_CALL(*codec_allocator_.most_recent_codec(), SetSurface(_)).Times(0); 664 EXPECT_CALL(*codec_allocator_.most_recent_codec(), SetSurface(_)).Times(0);
667 665
668 // This should free the codec. 666 // This should free the codec.
669 EXPECT_CALL( 667 EXPECT_CALL(
670 codec_allocator_, 668 codec_allocator_,
671 MockReleaseMediaCodec(codec_allocator_.most_recent_codec(), 669 MockReleaseMediaCodec(codec_allocator_.most_recent_codec(),
672 codec_allocator_.most_recent_overlay(), nullptr)); 670 codec_allocator_.most_recent_overlay(), nullptr));
673 codec_allocator_.codec_destruction_observer()->ExpectDestruction(); 671 codec_allocator_.codec_destruction_observer()->ExpectDestruction();
674 chooser_->StopImmediately(codec_allocator_.most_recent_overlay()); 672 overlay_callbacks_.SurfaceDestroyed.Run();
675 base::RunLoop().RunUntilIdle(); 673 base::RunLoop().RunUntilIdle();
676 674
677 // Verify that the codec has been released, since |vda_| will be destroyed 675 // Verify that the codec has been released, since |vda_| will be destroyed
678 // soon. The expectations must be met before that. 676 // soon. The expectations must be met before that.
679 testing::Mock::VerifyAndClearExpectations(&codec_allocator_); 677 testing::Mock::VerifyAndClearExpectations(&codec_allocator_);
680 codec_allocator_.codec_destruction_observer()->DestructionIsOptional(); 678 codec_allocator_.codec_destruction_observer()->DestructionIsOptional();
681 } 679 }
682 680
683 TEST_F(AndroidVideoDecodeAcceleratorTest, 681 TEST_F(AndroidVideoDecodeAcceleratorTest,
684 MultipleSurfaceTextureCallbacksAreIgnored) { 682 MultipleSurfaceTextureCallbacksAreIgnored) {
685 // Ask AVDA to switch to ST when it's already using ST, nothing should happen. 683 // Ask AVDA to switch to ST when it's already using ST, nothing should happen.
686 SKIP_IF_MEDIACODEC_IS_NOT_AVAILABLE(); 684 SKIP_IF_MEDIACODEC_IS_NOT_AVAILABLE();
687 685
688 InitializeAVDAWithSurfaceTexture(); 686 InitializeAVDAWithSurfaceTexture();
689 687
690 // This should do nothing. 688 // This should do nothing.
691 EXPECT_CALL(*codec_allocator_.most_recent_codec(), SetSurface(_)).Times(0); 689 EXPECT_CALL(*codec_allocator_.most_recent_codec(), SetSurface(_)).Times(0);
692 chooser_->ProvideSurfaceTexture(); 690 chooser_->ProvideSurfaceTexture();
693 691
694 base::RunLoop().RunUntilIdle(); 692 base::RunLoop().RunUntilIdle();
695 } 693 }
696 694
697 } // namespace media 695 } // namespace media
OLDNEW
« no previous file with comments | « media/gpu/android_video_decode_accelerator.cc ('k') | media/gpu/android_video_surface_chooser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698