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

Side by Side Diff: media/filters/video_frame_stream_unittest.cc

Issue 2086353002: Remove calls to deprecated MessageLoop methods in media. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 6 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 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 <utility> 5 #include <utility>
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback_helpers.h" 8 #include "base/callback_helpers.h"
9 #include "base/macros.h" 9 #include "base/macros.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
11 #include "base/run_loop.h"
11 #include "media/base/fake_demuxer_stream.h" 12 #include "media/base/fake_demuxer_stream.h"
12 #include "media/base/gmock_callback_support.h" 13 #include "media/base/gmock_callback_support.h"
13 #include "media/base/mock_filters.h" 14 #include "media/base/mock_filters.h"
14 #include "media/base/test_helpers.h" 15 #include "media/base/test_helpers.h"
15 #include "media/base/timestamp_constants.h" 16 #include "media/base/timestamp_constants.h"
16 #include "media/filters/decoder_stream.h" 17 #include "media/filters/decoder_stream.h"
17 #include "media/filters/fake_video_decoder.h" 18 #include "media/filters/fake_video_decoder.h"
18 #include "testing/gtest/include/gtest/gtest.h" 19 #include "testing/gtest/include/gtest/gtest.h"
19 20
20 using ::testing::_; 21 using ::testing::_;
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 103
103 ~VideoFrameStreamTest() { 104 ~VideoFrameStreamTest() {
104 // Check that the pipeline statistics callback was fired correctly. 105 // Check that the pipeline statistics callback was fired correctly.
105 EXPECT_EQ(num_decoded_bytes_unreported_, 0); 106 EXPECT_EQ(num_decoded_bytes_unreported_, 0);
106 107
107 is_initialized_ = false; 108 is_initialized_ = false;
108 decoder1_ = NULL; 109 decoder1_ = NULL;
109 decoder2_ = NULL; 110 decoder2_ = NULL;
110 decoder3_ = NULL; 111 decoder3_ = NULL;
111 video_frame_stream_.reset(); 112 video_frame_stream_.reset();
112 message_loop_.RunUntilIdle(); 113 base::RunLoop().RunUntilIdle();
113 114
114 DCHECK(!pending_initialize_); 115 DCHECK(!pending_initialize_);
115 DCHECK(!pending_read_); 116 DCHECK(!pending_read_);
116 DCHECK(!pending_reset_); 117 DCHECK(!pending_reset_);
117 DCHECK(!pending_stop_); 118 DCHECK(!pending_stop_);
118 } 119 }
119 120
120 MOCK_METHOD1(OnNewSpliceBuffer, void(base::TimeDelta)); 121 MOCK_METHOD1(OnNewSpliceBuffer, void(base::TimeDelta));
121 MOCK_METHOD0(OnWaitingForDecryptionKey, void(void)); 122 MOCK_METHOD0(OnWaitingForDecryptionKey, void(void));
122 123
(...skipping 21 matching lines...) Expand all
144 145
145 void InitializeVideoFrameStream() { 146 void InitializeVideoFrameStream() {
146 pending_initialize_ = true; 147 pending_initialize_ = true;
147 video_frame_stream_->Initialize( 148 video_frame_stream_->Initialize(
148 demuxer_stream_.get(), base::Bind(&VideoFrameStreamTest::OnInitialized, 149 demuxer_stream_.get(), base::Bind(&VideoFrameStreamTest::OnInitialized,
149 base::Unretained(this)), 150 base::Unretained(this)),
150 cdm_context_.get(), 151 cdm_context_.get(),
151 base::Bind(&VideoFrameStreamTest::OnStatistics, base::Unretained(this)), 152 base::Bind(&VideoFrameStreamTest::OnStatistics, base::Unretained(this)),
152 base::Bind(&VideoFrameStreamTest::OnWaitingForDecryptionKey, 153 base::Bind(&VideoFrameStreamTest::OnWaitingForDecryptionKey,
153 base::Unretained(this))); 154 base::Unretained(this)));
154 message_loop_.RunUntilIdle(); 155 base::RunLoop().RunUntilIdle();
155 } 156 }
156 157
157 // Fake Decrypt() function used by DecryptingDemuxerStream. It does nothing 158 // Fake Decrypt() function used by DecryptingDemuxerStream. It does nothing
158 // but removes the DecryptConfig to make the buffer unencrypted. 159 // but removes the DecryptConfig to make the buffer unencrypted.
159 void Decrypt(Decryptor::StreamType stream_type, 160 void Decrypt(Decryptor::StreamType stream_type,
160 const scoped_refptr<DecoderBuffer>& encrypted, 161 const scoped_refptr<DecoderBuffer>& encrypted,
161 const Decryptor::DecryptCB& decrypt_cb) { 162 const Decryptor::DecryptCB& decrypt_cb) {
162 DCHECK(encrypted->decrypt_config()); 163 DCHECK(encrypted->decrypt_config());
163 if (has_no_key_) { 164 if (has_no_key_) {
164 decrypt_cb.Run(Decryptor::kNoKey, NULL); 165 decrypt_cb.Run(Decryptor::kNoKey, NULL);
(...skipping 27 matching lines...) Expand all
192 DCHECK(!pending_read_); 193 DCHECK(!pending_read_);
193 DCHECK(pending_reset_); 194 DCHECK(pending_reset_);
194 pending_reset_ = false; 195 pending_reset_ = false;
195 } 196 }
196 197
197 void ReadOneFrame() { 198 void ReadOneFrame() {
198 frame_read_ = NULL; 199 frame_read_ = NULL;
199 pending_read_ = true; 200 pending_read_ = true;
200 video_frame_stream_->Read(base::Bind( 201 video_frame_stream_->Read(base::Bind(
201 &VideoFrameStreamTest::FrameReady, base::Unretained(this))); 202 &VideoFrameStreamTest::FrameReady, base::Unretained(this)));
202 message_loop_.RunUntilIdle(); 203 base::RunLoop().RunUntilIdle();
203 } 204 }
204 205
205 void ReadUntilPending() { 206 void ReadUntilPending() {
206 do { 207 do {
207 ReadOneFrame(); 208 ReadOneFrame();
208 } while (!pending_read_); 209 } while (!pending_read_);
209 } 210 }
210 211
211 void ReadAllFrames(int expected_decoded_frames) { 212 void ReadAllFrames(int expected_decoded_frames) {
212 do { 213 do {
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 case DECODER_DECODE: 272 case DECODER_DECODE:
272 decoder->HoldDecode(); 273 decoder->HoldDecode();
273 ReadUntilPending(); 274 ReadUntilPending();
274 break; 275 break;
275 276
276 case DECODER_RESET: 277 case DECODER_RESET:
277 decoder->HoldNextReset(); 278 decoder->HoldNextReset();
278 pending_reset_ = true; 279 pending_reset_ = true;
279 video_frame_stream_->Reset(base::Bind(&VideoFrameStreamTest::OnReset, 280 video_frame_stream_->Reset(base::Bind(&VideoFrameStreamTest::OnReset,
280 base::Unretained(this))); 281 base::Unretained(this)));
281 message_loop_.RunUntilIdle(); 282 base::RunLoop().RunUntilIdle();
282 break; 283 break;
283 284
284 case NOT_PENDING: 285 case NOT_PENDING:
285 NOTREACHED(); 286 NOTREACHED();
286 break; 287 break;
287 } 288 }
288 } 289 }
289 290
290 void SatisfyPendingCallback(PendingState state) { 291 void SatisfyPendingCallback(PendingState state) {
291 SatisfyPendingCallback(state, decoder1_); 292 SatisfyPendingCallback(state, decoder1_);
(...skipping 27 matching lines...) Expand all
319 320
320 case DECODER_RESET: 321 case DECODER_RESET:
321 decoder->SatisfyReset(); 322 decoder->SatisfyReset();
322 break; 323 break;
323 324
324 case NOT_PENDING: 325 case NOT_PENDING:
325 NOTREACHED(); 326 NOTREACHED();
326 break; 327 break;
327 } 328 }
328 329
329 message_loop_.RunUntilIdle(); 330 base::RunLoop().RunUntilIdle();
330 } 331 }
331 332
332 void Initialize() { 333 void Initialize() {
333 EnterPendingState(DECODER_INIT); 334 EnterPendingState(DECODER_INIT);
334 SatisfyPendingCallback(DECODER_INIT); 335 SatisfyPendingCallback(DECODER_INIT);
335 } 336 }
336 337
337 void Read() { 338 void Read() {
338 EnterPendingState(DECODER_DECODE); 339 EnterPendingState(DECODER_DECODE);
339 SatisfyPendingCallback(DECODER_DECODE); 340 SatisfyPendingCallback(DECODER_DECODE);
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 ReadOneFrame(); 448 ReadOneFrame();
448 EXPECT_TRUE(pending_read_); 449 EXPECT_TRUE(pending_read_);
449 450
450 int demuxed_buffers = 0; 451 int demuxed_buffers = 0;
451 452
452 // Pass frames from the demuxer to the VideoFrameStream until the first read 453 // Pass frames from the demuxer to the VideoFrameStream until the first read
453 // request is satisfied. 454 // request is satisfied.
454 while (pending_read_) { 455 while (pending_read_) {
455 ++demuxed_buffers; 456 ++demuxed_buffers;
456 demuxer_stream_->SatisfyReadAndHoldNext(); 457 demuxer_stream_->SatisfyReadAndHoldNext();
457 message_loop_.RunUntilIdle(); 458 base::RunLoop().RunUntilIdle();
458 } 459 }
459 460
460 EXPECT_EQ(std::min(GetParam().decoding_delay + 1, kNumBuffersInOneConfig + 1), 461 EXPECT_EQ(std::min(GetParam().decoding_delay + 1, kNumBuffersInOneConfig + 1),
461 demuxed_buffers); 462 demuxed_buffers);
462 463
463 // At this point the stream is waiting on read from the demuxer, but there is 464 // At this point the stream is waiting on read from the demuxer, but there is
464 // no pending read from the stream. The stream should be blocked if we try 465 // no pending read from the stream. The stream should be blocked if we try
465 // reading from it again. 466 // reading from it again.
466 ReadUntilPending(); 467 ReadUntilPending();
467 468
468 demuxer_stream_->SatisfyRead(); 469 demuxer_stream_->SatisfyRead();
469 message_loop_.RunUntilIdle(); 470 base::RunLoop().RunUntilIdle();
470 EXPECT_FALSE(pending_read_); 471 EXPECT_FALSE(pending_read_);
471 } 472 }
472 473
473 TEST_P(VideoFrameStreamTest, Read_BlockedDemuxerAndDecoder) { 474 TEST_P(VideoFrameStreamTest, Read_BlockedDemuxerAndDecoder) {
474 // Test applies only when the decoder allows multiple parallel requests. 475 // Test applies only when the decoder allows multiple parallel requests.
475 if (GetParam().parallel_decoding == 1) 476 if (GetParam().parallel_decoding == 1)
476 return; 477 return;
477 478
478 Initialize(); 479 Initialize();
479 demuxer_stream_->HoldNextRead(); 480 demuxer_stream_->HoldNextRead();
480 decoder1_->HoldDecode(); 481 decoder1_->HoldDecode();
481 ReadOneFrame(); 482 ReadOneFrame();
482 EXPECT_TRUE(pending_read_); 483 EXPECT_TRUE(pending_read_);
483 484
484 int demuxed_buffers = 0; 485 int demuxed_buffers = 0;
485 486
486 // Pass frames from the demuxer to the VideoFrameStream until the first read 487 // Pass frames from the demuxer to the VideoFrameStream until the first read
487 // request is satisfied, while always keeping one decode request pending. 488 // request is satisfied, while always keeping one decode request pending.
488 while (pending_read_) { 489 while (pending_read_) {
489 ++demuxed_buffers; 490 ++demuxed_buffers;
490 demuxer_stream_->SatisfyReadAndHoldNext(); 491 demuxer_stream_->SatisfyReadAndHoldNext();
491 message_loop_.RunUntilIdle(); 492 base::RunLoop().RunUntilIdle();
492 493
493 // Always keep one decode request pending. 494 // Always keep one decode request pending.
494 if (demuxed_buffers > 1) { 495 if (demuxed_buffers > 1) {
495 decoder1_->SatisfySingleDecode(); 496 decoder1_->SatisfySingleDecode();
496 message_loop_.RunUntilIdle(); 497 base::RunLoop().RunUntilIdle();
497 } 498 }
498 } 499 }
499 500
500 ReadUntilPending(); 501 ReadUntilPending();
501 EXPECT_TRUE(pending_read_); 502 EXPECT_TRUE(pending_read_);
502 503
503 // Unblocking one decode request should unblock read even when demuxer is 504 // Unblocking one decode request should unblock read even when demuxer is
504 // still blocked. 505 // still blocked.
505 decoder1_->SatisfySingleDecode(); 506 decoder1_->SatisfySingleDecode();
506 message_loop_.RunUntilIdle(); 507 base::RunLoop().RunUntilIdle();
507 EXPECT_FALSE(pending_read_); 508 EXPECT_FALSE(pending_read_);
508 509
509 // Stream should still be blocked on the demuxer after unblocking the decoder. 510 // Stream should still be blocked on the demuxer after unblocking the decoder.
510 decoder1_->SatisfyDecode(); 511 decoder1_->SatisfyDecode();
511 ReadUntilPending(); 512 ReadUntilPending();
512 EXPECT_TRUE(pending_read_); 513 EXPECT_TRUE(pending_read_);
513 514
514 // Verify that the stream has returned all frames that have been demuxed, 515 // Verify that the stream has returned all frames that have been demuxed,
515 // accounting for the decoder delay. 516 // accounting for the decoder delay.
516 EXPECT_EQ(demuxed_buffers - GetParam().decoding_delay, num_decoded_frames_); 517 EXPECT_EQ(demuxed_buffers - GetParam().decoding_delay, num_decoded_frames_);
517 518
518 // Unblocking the demuxer will unblock the stream. 519 // Unblocking the demuxer will unblock the stream.
519 demuxer_stream_->SatisfyRead(); 520 demuxer_stream_->SatisfyRead();
520 message_loop_.RunUntilIdle(); 521 base::RunLoop().RunUntilIdle();
521 EXPECT_FALSE(pending_read_); 522 EXPECT_FALSE(pending_read_);
522 } 523 }
523 524
524 TEST_P(VideoFrameStreamTest, Read_DuringEndOfStreamDecode) { 525 TEST_P(VideoFrameStreamTest, Read_DuringEndOfStreamDecode) {
525 // Test applies only when the decoder allows multiple parallel requests, and 526 // Test applies only when the decoder allows multiple parallel requests, and
526 // they are not satisfied in a single batch. 527 // they are not satisfied in a single batch.
527 if (GetParam().parallel_decoding == 1 || GetParam().decoding_delay != 0) 528 if (GetParam().parallel_decoding == 1 || GetParam().decoding_delay != 0)
528 return; 529 return;
529 530
530 Initialize(); 531 Initialize();
531 decoder1_->HoldDecode(); 532 decoder1_->HoldDecode();
532 533
533 // Read all of the frames up to end of stream. Since parallel decoding is 534 // Read all of the frames up to end of stream. Since parallel decoding is
534 // enabled, the end of stream buffer will be sent to the decoder immediately, 535 // enabled, the end of stream buffer will be sent to the decoder immediately,
535 // but we don't satisfy it yet. 536 // but we don't satisfy it yet.
536 for (int configuration = 0; configuration < kNumConfigs; configuration++) { 537 for (int configuration = 0; configuration < kNumConfigs; configuration++) {
537 for (int frame = 0; frame < kNumBuffersInOneConfig; frame++) { 538 for (int frame = 0; frame < kNumBuffersInOneConfig; frame++) {
538 ReadOneFrame(); 539 ReadOneFrame();
539 while (pending_read_) { 540 while (pending_read_) {
540 decoder1_->SatisfySingleDecode(); 541 decoder1_->SatisfySingleDecode();
541 message_loop_.RunUntilIdle(); 542 base::RunLoop().RunUntilIdle();
542 } 543 }
543 } 544 }
544 } 545 }
545 546
546 // Read() again. The callback must be delayed until the decode completes. 547 // Read() again. The callback must be delayed until the decode completes.
547 ReadOneFrame(); 548 ReadOneFrame();
548 ASSERT_TRUE(pending_read_); 549 ASSERT_TRUE(pending_read_);
549 550
550 // Satisfy decoding of the end of stream buffer. The read should complete. 551 // Satisfy decoding of the end of stream buffer. The read should complete.
551 decoder1_->SatisfySingleDecode(); 552 decoder1_->SatisfySingleDecode();
552 message_loop_.RunUntilIdle(); 553 base::RunLoop().RunUntilIdle();
553 ASSERT_FALSE(pending_read_); 554 ASSERT_FALSE(pending_read_);
554 EXPECT_EQ(last_read_status_, VideoFrameStream::OK); 555 EXPECT_EQ(last_read_status_, VideoFrameStream::OK);
555 556
556 // The read output should indicate end of stream. 557 // The read output should indicate end of stream.
557 ASSERT_TRUE(frame_read_.get()); 558 ASSERT_TRUE(frame_read_.get());
558 EXPECT_TRUE( 559 EXPECT_TRUE(
559 frame_read_->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM)); 560 frame_read_->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM));
560 } 561 }
561 562
562 // No Reset() before initialization is successfully completed. 563 // No Reset() before initialization is successfully completed.
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
776 777
777 Initialize(); 778 Initialize();
778 decoder1_->HoldDecode(); 779 decoder1_->HoldDecode();
779 ReadOneFrame(); 780 ReadOneFrame();
780 781
781 // One buffer should have already pulled from the demuxer stream. Set the next 782 // One buffer should have already pulled from the demuxer stream. Set the next
782 // one to be an EOS. 783 // one to be an EOS.
783 demuxer_stream_->SeekToEndOfStream(); 784 demuxer_stream_->SeekToEndOfStream();
784 785
785 decoder1_->SatisfySingleDecode(); 786 decoder1_->SatisfySingleDecode();
786 message_loop_.RunUntilIdle(); 787 base::RunLoop().RunUntilIdle();
787 788
788 // |video_frame_stream_| should not have emited a frame. 789 // |video_frame_stream_| should not have emited a frame.
789 EXPECT_TRUE(pending_read_); 790 EXPECT_TRUE(pending_read_);
790 791
791 // Pending buffers should contain a regular buffer and an EOS buffer. 792 // Pending buffers should contain a regular buffer and an EOS buffer.
792 EXPECT_EQ(video_frame_stream_->get_pending_buffers_size_for_testing(), 2); 793 EXPECT_EQ(video_frame_stream_->get_pending_buffers_size_for_testing(), 2);
793 794
794 decoder1_->SimulateError(); 795 decoder1_->SimulateError();
795 message_loop_.RunUntilIdle(); 796 base::RunLoop().RunUntilIdle();
796 797
797 // A frame should have been emited 798 // A frame should have been emited
798 EXPECT_FALSE(pending_read_); 799 EXPECT_FALSE(pending_read_);
799 EXPECT_EQ(last_read_status_, VideoFrameStream::OK); 800 EXPECT_EQ(last_read_status_, VideoFrameStream::OK);
800 EXPECT_FALSE( 801 EXPECT_FALSE(
801 frame_read_->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM)); 802 frame_read_->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM));
802 EXPECT_GT(decoder2_->total_bytes_decoded(), 0); 803 EXPECT_GT(decoder2_->total_bytes_decoded(), 0);
803 804
804 ReadOneFrame(); 805 ReadOneFrame();
805 806
806 EXPECT_FALSE(pending_read_); 807 EXPECT_FALSE(pending_read_);
807 EXPECT_EQ(0, video_frame_stream_->get_fallback_buffers_size_for_testing()); 808 EXPECT_EQ(0, video_frame_stream_->get_fallback_buffers_size_for_testing());
808 EXPECT_TRUE( 809 EXPECT_TRUE(
809 frame_read_->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM)); 810 frame_read_->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM));
810 } 811 }
811 812
812 TEST_P(VideoFrameStreamTest, 813 TEST_P(VideoFrameStreamTest,
813 FallbackDecoder_SelectedOnInitialDecodeError_Twice) { 814 FallbackDecoder_SelectedOnInitialDecodeError_Twice) {
814 Initialize(); 815 Initialize();
815 decoder1_->SimulateError(); 816 decoder1_->SimulateError();
816 decoder2_->HoldNextInit(); 817 decoder2_->HoldNextInit();
817 ReadOneFrame(); 818 ReadOneFrame();
818 819
819 decoder2_->SatisfyInit(); 820 decoder2_->SatisfyInit();
820 decoder2_->SimulateError(); 821 decoder2_->SimulateError();
821 message_loop_.RunUntilIdle(); 822 base::RunLoop().RunUntilIdle();
822 823
823 // |video_frame_stream_| should have fallen back to |decoder3_|. 824 // |video_frame_stream_| should have fallen back to |decoder3_|.
824 ASSERT_FALSE(pending_read_); 825 ASSERT_FALSE(pending_read_);
825 ASSERT_EQ(VideoFrameStream::OK, last_read_status_); 826 ASSERT_EQ(VideoFrameStream::OK, last_read_status_);
826 827
827 // Can't check |decoder1_| or |decoder2_| right now, they might have been 828 // Can't check |decoder1_| or |decoder2_| right now, they might have been
828 // destroyed already. 829 // destroyed already.
829 ASSERT_GT(decoder3_->total_bytes_decoded(), 0); 830 ASSERT_GT(decoder3_->total_bytes_decoded(), 0);
830 831
831 // Verify no frame was dropped. 832 // Verify no frame was dropped.
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
863 SatisfyPendingCallback(DEMUXER_READ_CONFIG_CHANGE); 864 SatisfyPendingCallback(DEMUXER_READ_CONFIG_CHANGE);
864 865
865 // The flush request should have been sent and held. 866 // The flush request should have been sent and held.
866 EXPECT_EQ(video_frame_stream_->get_pending_buffers_size_for_testing(), 0); 867 EXPECT_EQ(video_frame_stream_->get_pending_buffers_size_for_testing(), 0);
867 EXPECT_TRUE(pending_read_); 868 EXPECT_TRUE(pending_read_);
868 869
869 // Triggering an error here will cause the frames in |decoder1_| to be lost. 870 // Triggering an error here will cause the frames in |decoder1_| to be lost.
870 // There are no pending buffers buffers to give to give to |decoder2_| due to 871 // There are no pending buffers buffers to give to give to |decoder2_| due to
871 // crbug.com/603713. 872 // crbug.com/603713.
872 decoder1_->SimulateError(); 873 decoder1_->SimulateError();
873 message_loop_.RunUntilIdle(); 874 base::RunLoop().RunUntilIdle();
874 875
875 // We want to make sure that |decoder2_| can decode the rest of the frames 876 // We want to make sure that |decoder2_| can decode the rest of the frames
876 // in the demuxer stream. 877 // in the demuxer stream.
877 ReadAllFrames(kNumBuffersInOneConfig * (kNumConfigs - 1)); 878 ReadAllFrames(kNumBuffersInOneConfig * (kNumConfigs - 1));
878 } 879 }
879 880
880 TEST_P(VideoFrameStreamTest, FallbackDecoder_PendingBuffersIsFilledAndCleared) { 881 TEST_P(VideoFrameStreamTest, FallbackDecoder_PendingBuffersIsFilledAndCleared) {
881 // Test applies only when there is a decoder delay, and the decoder will not 882 // Test applies only when there is a decoder delay, and the decoder will not
882 // receive a config change before outputing its first frame. Parallel decoding 883 // receive a config change before outputing its first frame. Parallel decoding
883 // is also disabled in this test case, for readability and simplicity of the 884 // is also disabled in this test case, for readability and simplicity of the
884 // unit test. 885 // unit test.
885 if (GetParam().decoding_delay == 0 || 886 if (GetParam().decoding_delay == 0 ||
886 GetParam().decoding_delay > kNumBuffersInOneConfig || 887 GetParam().decoding_delay > kNumBuffersInOneConfig ||
887 GetParam().parallel_decoding > 1) { 888 GetParam().parallel_decoding > 1) {
888 return; 889 return;
889 } 890 }
890 Initialize(); 891 Initialize();
891 892
892 // Block on demuxer read and decoder decode so we can step through. 893 // Block on demuxer read and decoder decode so we can step through.
893 demuxer_stream_->HoldNextRead(); 894 demuxer_stream_->HoldNextRead();
894 decoder1_->HoldDecode(); 895 decoder1_->HoldDecode();
895 ReadOneFrame(); 896 ReadOneFrame();
896 897
897 int demuxer_reads_satisfied = 0; 898 int demuxer_reads_satisfied = 0;
898 // Send back and requests buffers until the next one would fill the decoder 899 // Send back and requests buffers until the next one would fill the decoder
899 // delay. 900 // delay.
900 while (demuxer_reads_satisfied < GetParam().decoding_delay - 1) { 901 while (demuxer_reads_satisfied < GetParam().decoding_delay - 1) {
901 // Send a buffer back. 902 // Send a buffer back.
902 demuxer_stream_->SatisfyReadAndHoldNext(); 903 demuxer_stream_->SatisfyReadAndHoldNext();
903 message_loop_.RunUntilIdle(); 904 base::RunLoop().RunUntilIdle();
904 ++demuxer_reads_satisfied; 905 ++demuxer_reads_satisfied;
905 906
906 // Decode one buffer. 907 // Decode one buffer.
907 decoder1_->SatisfySingleDecode(); 908 decoder1_->SatisfySingleDecode();
908 message_loop_.RunUntilIdle(); 909 base::RunLoop().RunUntilIdle();
909 EXPECT_TRUE(pending_read_); 910 EXPECT_TRUE(pending_read_);
910 EXPECT_EQ(demuxer_reads_satisfied, 911 EXPECT_EQ(demuxer_reads_satisfied,
911 video_frame_stream_->get_pending_buffers_size_for_testing()); 912 video_frame_stream_->get_pending_buffers_size_for_testing());
912 // No fallback buffers should be queued up yet. 913 // No fallback buffers should be queued up yet.
913 EXPECT_EQ(0, video_frame_stream_->get_fallback_buffers_size_for_testing()); 914 EXPECT_EQ(0, video_frame_stream_->get_fallback_buffers_size_for_testing());
914 } 915 }
915 916
916 // Hold the init before triggering the error, to verify internal state. 917 // Hold the init before triggering the error, to verify internal state.
917 demuxer_stream_->SatisfyReadAndHoldNext(); 918 demuxer_stream_->SatisfyReadAndHoldNext();
918 ++demuxer_reads_satisfied; 919 ++demuxer_reads_satisfied;
919 decoder2_->HoldNextInit(); 920 decoder2_->HoldNextInit();
920 decoder1_->SimulateError(); 921 decoder1_->SimulateError();
921 message_loop_.RunUntilIdle(); 922 base::RunLoop().RunUntilIdle();
922 923
923 EXPECT_TRUE(pending_read_); 924 EXPECT_TRUE(pending_read_);
924 EXPECT_EQ(demuxer_reads_satisfied, 925 EXPECT_EQ(demuxer_reads_satisfied,
925 video_frame_stream_->get_pending_buffers_size_for_testing()); 926 video_frame_stream_->get_pending_buffers_size_for_testing());
926 927
927 decoder2_->SatisfyInit(); 928 decoder2_->SatisfyInit();
928 decoder2_->HoldDecode(); 929 decoder2_->HoldDecode();
929 message_loop_.RunUntilIdle(); 930 base::RunLoop().RunUntilIdle();
930 931
931 // Make sure the pending buffers have been transfered to fallback buffers. 932 // Make sure the pending buffers have been transfered to fallback buffers.
932 // One call to Decode() during the initialization process, so we expect one 933 // One call to Decode() during the initialization process, so we expect one
933 // buffer to already have been consumed from the fallback buffers. 934 // buffer to already have been consumed from the fallback buffers.
934 // Pending buffers should never go down (unless we encounter a config change) 935 // Pending buffers should never go down (unless we encounter a config change)
935 EXPECT_EQ(demuxer_reads_satisfied - 1, 936 EXPECT_EQ(demuxer_reads_satisfied - 1,
936 video_frame_stream_->get_fallback_buffers_size_for_testing()); 937 video_frame_stream_->get_fallback_buffers_size_for_testing());
937 EXPECT_EQ(demuxer_reads_satisfied, 938 EXPECT_EQ(demuxer_reads_satisfied,
938 video_frame_stream_->get_pending_buffers_size_for_testing()); 939 video_frame_stream_->get_pending_buffers_size_for_testing());
939 940
940 decoder2_->SatisfyDecode(); 941 decoder2_->SatisfyDecode();
941 message_loop_.RunUntilIdle(); 942 base::RunLoop().RunUntilIdle();
942 943
943 // Make sure all buffers consumed by |decoder2_| have come from the fallback. 944 // Make sure all buffers consumed by |decoder2_| have come from the fallback.
944 // Pending buffers should not have been cleared yet. 945 // Pending buffers should not have been cleared yet.
945 EXPECT_EQ(0, video_frame_stream_->get_fallback_buffers_size_for_testing()); 946 EXPECT_EQ(0, video_frame_stream_->get_fallback_buffers_size_for_testing());
946 EXPECT_EQ(demuxer_reads_satisfied, 947 EXPECT_EQ(demuxer_reads_satisfied,
947 video_frame_stream_->get_pending_buffers_size_for_testing()); 948 video_frame_stream_->get_pending_buffers_size_for_testing());
948 EXPECT_EQ(video_frame_stream_->get_previous_decoder_for_testing(), decoder1_); 949 EXPECT_EQ(video_frame_stream_->get_previous_decoder_for_testing(), decoder1_);
949 EXPECT_TRUE(pending_read_); 950 EXPECT_TRUE(pending_read_);
950 951
951 // Give the decoder one more buffer, enough to release a frame. 952 // Give the decoder one more buffer, enough to release a frame.
952 demuxer_stream_->SatisfyReadAndHoldNext(); 953 demuxer_stream_->SatisfyReadAndHoldNext();
953 message_loop_.RunUntilIdle(); 954 base::RunLoop().RunUntilIdle();
954 955
955 // New buffers should not have been added after the frame was released. 956 // New buffers should not have been added after the frame was released.
956 EXPECT_EQ(video_frame_stream_->get_pending_buffers_size_for_testing(), 0); 957 EXPECT_EQ(video_frame_stream_->get_pending_buffers_size_for_testing(), 0);
957 EXPECT_FALSE(pending_read_); 958 EXPECT_FALSE(pending_read_);
958 959
959 demuxer_stream_->SatisfyRead(); 960 demuxer_stream_->SatisfyRead();
960 961
961 // Confirm no frames were dropped. 962 // Confirm no frames were dropped.
962 ReadAllFrames(); 963 ReadAllFrames();
963 } 964 }
(...skipping 15 matching lines...) Expand all
979 // Verify no frame was dropped. 980 // Verify no frame was dropped.
980 ReadAllFrames(); 981 ReadAllFrames();
981 } 982 }
982 983
983 TEST_P(VideoFrameStreamTest, FallbackDecoder_SelectedOnInitThenDecodeErrors) { 984 TEST_P(VideoFrameStreamTest, FallbackDecoder_SelectedOnInitThenDecodeErrors) {
984 decoder1_->SimulateFailureToInit(); 985 decoder1_->SimulateFailureToInit();
985 decoder2_->HoldDecode(); 986 decoder2_->HoldDecode();
986 Initialize(); 987 Initialize();
987 ReadOneFrame(); 988 ReadOneFrame();
988 decoder2_->SimulateError(); 989 decoder2_->SimulateError();
989 message_loop_.RunUntilIdle(); 990 base::RunLoop().RunUntilIdle();
990 991
991 // |video_frame_stream_| should have fallen back to |decoder3_| 992 // |video_frame_stream_| should have fallen back to |decoder3_|
992 ASSERT_FALSE(pending_read_); 993 ASSERT_FALSE(pending_read_);
993 ASSERT_EQ(VideoFrameStream::OK, last_read_status_); 994 ASSERT_EQ(VideoFrameStream::OK, last_read_status_);
994 995
995 // Can't check |decoder1_| or |decoder2_| right now, they might have been 996 // Can't check |decoder1_| or |decoder2_| right now, they might have been
996 // destroyed already. 997 // destroyed already.
997 ASSERT_GT(decoder3_->total_bytes_decoded(), 0); 998 ASSERT_GT(decoder3_->total_bytes_decoded(), 0);
998 999
999 // Verify no frame was dropped. 1000 // Verify no frame was dropped.
1000 ReadAllFrames(); 1001 ReadAllFrames();
1001 } 1002 }
1002 1003
1003 TEST_P(VideoFrameStreamTest, 1004 TEST_P(VideoFrameStreamTest,
1004 FallbackDecoder_NotSelectedOnMidstreamDecodeError) { 1005 FallbackDecoder_NotSelectedOnMidstreamDecodeError) {
1005 Initialize(); 1006 Initialize();
1006 ReadOneFrame(); 1007 ReadOneFrame();
1007 1008
1008 // Successfully received a frame. 1009 // Successfully received a frame.
1009 EXPECT_FALSE(pending_read_); 1010 EXPECT_FALSE(pending_read_);
1010 ASSERT_GT(decoder1_->total_bytes_decoded(), 0); 1011 ASSERT_GT(decoder1_->total_bytes_decoded(), 0);
1011 1012
1012 decoder1_->SimulateError(); 1013 decoder1_->SimulateError();
1013 1014
1014 // The error must surface from Read() as DECODE_ERROR. 1015 // The error must surface from Read() as DECODE_ERROR.
1015 while (last_read_status_ == VideoFrameStream::OK) { 1016 while (last_read_status_ == VideoFrameStream::OK) {
1016 ReadOneFrame(); 1017 ReadOneFrame();
1017 message_loop_.RunUntilIdle(); 1018 base::RunLoop().RunUntilIdle();
1018 EXPECT_FALSE(pending_read_); 1019 EXPECT_FALSE(pending_read_);
1019 } 1020 }
1020 1021
1021 // Verify the error was surfaced, rather than falling back to |decoder2_|. 1022 // Verify the error was surfaced, rather than falling back to |decoder2_|.
1022 EXPECT_FALSE(pending_read_); 1023 EXPECT_FALSE(pending_read_);
1023 ASSERT_EQ(decoder2_->total_bytes_decoded(), 0); 1024 ASSERT_EQ(decoder2_->total_bytes_decoded(), 0);
1024 ASSERT_EQ(VideoFrameStream::DECODE_ERROR, last_read_status_); 1025 ASSERT_EQ(VideoFrameStream::DECODE_ERROR, last_read_status_);
1025 } 1026 }
1026 1027
1027 TEST_P(VideoFrameStreamTest, DecoderErrorWhenNotReading) { 1028 TEST_P(VideoFrameStreamTest, DecoderErrorWhenNotReading) {
1028 Initialize(); 1029 Initialize();
1029 decoder1_->HoldDecode(); 1030 decoder1_->HoldDecode();
1030 ReadOneFrame(); 1031 ReadOneFrame();
1031 EXPECT_TRUE(pending_read_); 1032 EXPECT_TRUE(pending_read_);
1032 1033
1033 // Satisfy decode requests until we get the first frame out. 1034 // Satisfy decode requests until we get the first frame out.
1034 while (pending_read_) { 1035 while (pending_read_) {
1035 decoder1_->SatisfySingleDecode(); 1036 decoder1_->SatisfySingleDecode();
1036 message_loop_.RunUntilIdle(); 1037 base::RunLoop().RunUntilIdle();
1037 } 1038 }
1038 1039
1039 // Trigger an error in the decoding. 1040 // Trigger an error in the decoding.
1040 decoder1_->SimulateError(); 1041 decoder1_->SimulateError();
1041 1042
1042 // The error must surface from Read() as DECODE_ERROR. 1043 // The error must surface from Read() as DECODE_ERROR.
1043 while (last_read_status_ == VideoFrameStream::OK) { 1044 while (last_read_status_ == VideoFrameStream::OK) {
1044 ReadOneFrame(); 1045 ReadOneFrame();
1045 message_loop_.RunUntilIdle(); 1046 base::RunLoop().RunUntilIdle();
1046 EXPECT_FALSE(pending_read_); 1047 EXPECT_FALSE(pending_read_);
1047 } 1048 }
1048 EXPECT_EQ(VideoFrameStream::DECODE_ERROR, last_read_status_); 1049 EXPECT_EQ(VideoFrameStream::DECODE_ERROR, last_read_status_);
1049 } 1050 }
1050 1051
1051 TEST_P(VideoFrameStreamTest, FallbackDecoderSelectedOnFailureToReinitialize) { 1052 TEST_P(VideoFrameStreamTest, FallbackDecoderSelectedOnFailureToReinitialize) {
1052 Initialize(); 1053 Initialize();
1053 decoder1_->SimulateFailureToInit(); 1054 decoder1_->SimulateFailureToInit();
1054 // Holding decode, because large decoder delays might cause us to get rid of 1055 // Holding decode, because large decoder delays might cause us to get rid of
1055 // |previous_decoder_| before we are in a pending state again. 1056 // |previous_decoder_| before we are in a pending state again.
1056 decoder2_->HoldDecode(); 1057 decoder2_->HoldDecode();
1057 ReadUntilDecoderReinitialized(decoder1_); 1058 ReadUntilDecoderReinitialized(decoder1_);
1058 ASSERT_TRUE(video_frame_stream_->get_previous_decoder_for_testing()); 1059 ASSERT_TRUE(video_frame_stream_->get_previous_decoder_for_testing());
1059 decoder2_->SatisfyDecode(); 1060 decoder2_->SatisfyDecode();
1060 message_loop_.RunUntilIdle(); 1061 base::RunLoop().RunUntilIdle();
1061 ReadAllFrames(); 1062 ReadAllFrames();
1062 ASSERT_FALSE(video_frame_stream_->get_previous_decoder_for_testing()); 1063 ASSERT_FALSE(video_frame_stream_->get_previous_decoder_for_testing());
1063 } 1064 }
1064 1065
1065 TEST_P(VideoFrameStreamTest, 1066 TEST_P(VideoFrameStreamTest,
1066 FallbackDecoderSelectedOnFailureToReinitialize_Twice) { 1067 FallbackDecoderSelectedOnFailureToReinitialize_Twice) {
1067 Initialize(); 1068 Initialize();
1068 decoder1_->SimulateFailureToInit(); 1069 decoder1_->SimulateFailureToInit();
1069 ReadUntilDecoderReinitialized(decoder1_); 1070 ReadUntilDecoderReinitialized(decoder1_);
1070 ReadOneFrame(); 1071 ReadOneFrame();
1071 decoder2_->SimulateFailureToInit(); 1072 decoder2_->SimulateFailureToInit();
1072 ReadUntilDecoderReinitialized(decoder2_); 1073 ReadUntilDecoderReinitialized(decoder2_);
1073 ReadAllFrames(); 1074 ReadAllFrames();
1074 } 1075 }
1075 1076
1076 TEST_P(VideoFrameStreamTest, DecodeErrorAfterFallbackDecoderSelectionFails) { 1077 TEST_P(VideoFrameStreamTest, DecodeErrorAfterFallbackDecoderSelectionFails) {
1077 Initialize(); 1078 Initialize();
1078 decoder1_->SimulateFailureToInit(); 1079 decoder1_->SimulateFailureToInit();
1079 decoder2_->SimulateFailureToInit(); 1080 decoder2_->SimulateFailureToInit();
1080 decoder3_->SimulateFailureToInit(); 1081 decoder3_->SimulateFailureToInit();
1081 ReadUntilDecoderReinitialized(decoder1_); 1082 ReadUntilDecoderReinitialized(decoder1_);
1082 // The error will surface from Read() as DECODE_ERROR. 1083 // The error will surface from Read() as DECODE_ERROR.
1083 while (last_read_status_ == VideoFrameStream::OK) { 1084 while (last_read_status_ == VideoFrameStream::OK) {
1084 ReadOneFrame(); 1085 ReadOneFrame();
1085 message_loop_.RunUntilIdle(); 1086 base::RunLoop().RunUntilIdle();
1086 EXPECT_FALSE(pending_read_); 1087 EXPECT_FALSE(pending_read_);
1087 } 1088 }
1088 EXPECT_EQ(VideoFrameStream::DECODE_ERROR, last_read_status_); 1089 EXPECT_EQ(VideoFrameStream::DECODE_ERROR, last_read_status_);
1089 } 1090 }
1090 1091
1091 TEST_P(VideoFrameStreamTest, Destroy_DuringFallbackDecoderSelection) { 1092 TEST_P(VideoFrameStreamTest, Destroy_DuringFallbackDecoderSelection) {
1092 Initialize(); 1093 Initialize();
1093 decoder1_->SimulateFailureToInit(); 1094 decoder1_->SimulateFailureToInit();
1094 EnterPendingState(DECODER_REINIT); 1095 EnterPendingState(DECODER_REINIT);
1095 decoder2_->HoldNextInit(); 1096 decoder2_->HoldNextInit();
1096 SatisfyPendingCallback(DECODER_REINIT); 1097 SatisfyPendingCallback(DECODER_REINIT);
1097 } 1098 }
1098 1099
1099 } // namespace media 1100 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/video_decoder_selector_unittest.cc ('k') | media/gpu/video_encode_accelerator_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698