• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "base/bind.h"
6 #include "base/callback_helpers.h"
7 #include "base/message_loop/message_loop.h"
8 #include "media/base/gmock_callback_support.h"
9 #include "media/base/mock_filters.h"
10 #include "media/base/test_helpers.h"
11 #include "media/filters/decoder_stream.h"
12 #include "media/filters/fake_demuxer_stream.h"
13 #include "media/filters/fake_video_decoder.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 
16 using ::testing::_;
17 using ::testing::AnyNumber;
18 using ::testing::Assign;
19 using ::testing::Invoke;
20 using ::testing::NiceMock;
21 using ::testing::Return;
22 using ::testing::SaveArg;
23 
24 static const int kNumConfigs = 3;
25 static const int kNumBuffersInOneConfig = 5;
26 
27 namespace media {
28 
29 struct VideoFrameStreamTestParams {
VideoFrameStreamTestParamsmedia::VideoFrameStreamTestParams30   VideoFrameStreamTestParams(bool is_encrypted,
31                              int decoding_delay,
32                              int parallel_decoding)
33       : is_encrypted(is_encrypted),
34         decoding_delay(decoding_delay),
35         parallel_decoding(parallel_decoding) {}
36 
37   bool is_encrypted;
38   int decoding_delay;
39   int parallel_decoding;
40 };
41 
42 class VideoFrameStreamTest
43     : public testing::Test,
44       public testing::WithParamInterface<VideoFrameStreamTestParams> {
45  public:
VideoFrameStreamTest()46   VideoFrameStreamTest()
47       : demuxer_stream_(new FakeDemuxerStream(kNumConfigs,
48                                               kNumBuffersInOneConfig,
49                                               GetParam().is_encrypted)),
50         decryptor_(new NiceMock<MockDecryptor>()),
51         decoder_(new FakeVideoDecoder(GetParam().decoding_delay,
52                                       GetParam().parallel_decoding)),
53         is_initialized_(false),
54         num_decoded_frames_(0),
55         pending_initialize_(false),
56         pending_read_(false),
57         pending_reset_(false),
58         pending_stop_(false),
59         total_bytes_decoded_(0),
60         has_no_key_(false) {
61     ScopedVector<VideoDecoder> decoders;
62     decoders.push_back(decoder_);
63 
64     video_frame_stream_.reset(new VideoFrameStream(
65         message_loop_.message_loop_proxy(),
66         decoders.Pass(),
67         base::Bind(&VideoFrameStreamTest::SetDecryptorReadyCallback,
68                    base::Unretained(this))));
69 
70     // Decryptor can only decrypt (not decrypt-and-decode) so that
71     // DecryptingDemuxerStream will be used.
72     EXPECT_CALL(*decryptor_, InitializeVideoDecoder(_, _))
73         .WillRepeatedly(RunCallback<1>(false));
74     EXPECT_CALL(*decryptor_, Decrypt(_, _, _))
75         .WillRepeatedly(Invoke(this, &VideoFrameStreamTest::Decrypt));
76   }
77 
~VideoFrameStreamTest()78   ~VideoFrameStreamTest() {
79     DCHECK(!pending_initialize_);
80     DCHECK(!pending_read_);
81     DCHECK(!pending_reset_);
82     DCHECK(!pending_stop_);
83 
84     if (is_initialized_)
85       Stop();
86     EXPECT_FALSE(is_initialized_);
87   }
88 
89   MOCK_METHOD1(OnNewSpliceBuffer, void(base::TimeDelta));
90   MOCK_METHOD1(SetDecryptorReadyCallback, void(const media::DecryptorReadyCB&));
91 
OnStatistics(const PipelineStatistics & statistics)92   void OnStatistics(const PipelineStatistics& statistics) {
93     total_bytes_decoded_ += statistics.video_bytes_decoded;
94   }
95 
OnInitialized(bool success)96   void OnInitialized(bool success) {
97     DCHECK(!pending_read_);
98     DCHECK(!pending_reset_);
99     DCHECK(pending_initialize_);
100     pending_initialize_ = false;
101 
102     is_initialized_ = success;
103     if (!success)
104       decoder_ = NULL;
105   }
106 
InitializeVideoFrameStream()107   void InitializeVideoFrameStream() {
108     pending_initialize_ = true;
109     video_frame_stream_->Initialize(
110         demuxer_stream_.get(),
111         false,
112         base::Bind(&VideoFrameStreamTest::OnStatistics, base::Unretained(this)),
113         base::Bind(&VideoFrameStreamTest::OnInitialized,
114                    base::Unretained(this)));
115     message_loop_.RunUntilIdle();
116   }
117 
118   // Fake Decrypt() function used by DecryptingDemuxerStream. It does nothing
119   // but removes the DecryptConfig to make the buffer unencrypted.
Decrypt(Decryptor::StreamType stream_type,const scoped_refptr<DecoderBuffer> & encrypted,const Decryptor::DecryptCB & decrypt_cb)120   void Decrypt(Decryptor::StreamType stream_type,
121                const scoped_refptr<DecoderBuffer>& encrypted,
122                const Decryptor::DecryptCB& decrypt_cb) {
123     DCHECK(encrypted->decrypt_config());
124     if (has_no_key_) {
125       decrypt_cb.Run(Decryptor::kNoKey, NULL);
126       return;
127     }
128 
129     DCHECK_EQ(stream_type, Decryptor::kVideo);
130     scoped_refptr<DecoderBuffer> decrypted =
131         DecoderBuffer::CopyFrom(encrypted->data(), encrypted->data_size());
132     decrypted->set_timestamp(encrypted->timestamp());
133     decrypted->set_duration(encrypted->duration());
134     decrypt_cb.Run(Decryptor::kSuccess, decrypted);
135   }
136 
137   // Callback for VideoFrameStream::Read().
FrameReady(VideoFrameStream::Status status,const scoped_refptr<VideoFrame> & frame)138   void FrameReady(VideoFrameStream::Status status,
139                   const scoped_refptr<VideoFrame>& frame) {
140     DCHECK(pending_read_);
141     frame_read_ = frame;
142     last_read_status_ = status;
143     if (frame.get() && !frame->end_of_stream())
144       num_decoded_frames_++;
145     pending_read_ = false;
146   }
147 
FrameReadyHoldDemuxer(VideoFrameStream::Status status,const scoped_refptr<VideoFrame> & frame)148   void FrameReadyHoldDemuxer(VideoFrameStream::Status status,
149                              const scoped_refptr<VideoFrame>& frame) {
150     FrameReady(status, frame);
151 
152   }
153 
OnReset()154   void OnReset() {
155     DCHECK(!pending_read_);
156     DCHECK(pending_reset_);
157     pending_reset_ = false;
158   }
159 
OnStopped()160   void OnStopped() {
161     DCHECK(!pending_initialize_);
162     DCHECK(!pending_read_);
163     DCHECK(!pending_reset_);
164     DCHECK(pending_stop_);
165     pending_stop_ = false;
166     is_initialized_ = false;
167     decoder_ = NULL;
168   }
169 
ReadOneFrame()170   void ReadOneFrame() {
171     frame_read_ = NULL;
172     pending_read_ = true;
173     video_frame_stream_->Read(base::Bind(
174         &VideoFrameStreamTest::FrameReady, base::Unretained(this)));
175     message_loop_.RunUntilIdle();
176   }
177 
ReadUntilPending()178   void ReadUntilPending() {
179     do {
180       ReadOneFrame();
181     } while (!pending_read_);
182   }
183 
ReadAllFrames()184   void ReadAllFrames() {
185     do {
186       ReadOneFrame();
187     } while (frame_read_.get() && !frame_read_->end_of_stream());
188 
189     const int total_num_frames = kNumConfigs * kNumBuffersInOneConfig;
190     DCHECK_EQ(num_decoded_frames_, total_num_frames);
191   }
192 
193   enum PendingState {
194     NOT_PENDING,
195     DEMUXER_READ_NORMAL,
196     DEMUXER_READ_CONFIG_CHANGE,
197     SET_DECRYPTOR,
198     DECRYPTOR_NO_KEY,
199     DECODER_INIT,
200     DECODER_REINIT,
201     DECODER_DECODE,
202     DECODER_RESET
203   };
204 
EnterPendingState(PendingState state)205   void EnterPendingState(PendingState state) {
206     DCHECK_NE(state, NOT_PENDING);
207     switch (state) {
208       case DEMUXER_READ_NORMAL:
209         demuxer_stream_->HoldNextRead();
210         ReadUntilPending();
211         break;
212 
213       case DEMUXER_READ_CONFIG_CHANGE:
214         demuxer_stream_->HoldNextConfigChangeRead();
215         ReadUntilPending();
216         break;
217 
218       case SET_DECRYPTOR:
219         // Hold DecryptorReadyCB.
220         EXPECT_CALL(*this, SetDecryptorReadyCallback(_))
221             .Times(2);
222         // Initialize will fail because no decryptor is available.
223         InitializeVideoFrameStream();
224         break;
225 
226       case DECRYPTOR_NO_KEY:
227         EXPECT_CALL(*this, SetDecryptorReadyCallback(_))
228             .WillRepeatedly(RunCallback<0>(decryptor_.get()));
229         has_no_key_ = true;
230         ReadOneFrame();
231         break;
232 
233       case DECODER_INIT:
234         EXPECT_CALL(*this, SetDecryptorReadyCallback(_))
235             .WillRepeatedly(RunCallback<0>(decryptor_.get()));
236         decoder_->HoldNextInit();
237         InitializeVideoFrameStream();
238         break;
239 
240       case DECODER_REINIT:
241         decoder_->HoldNextInit();
242         ReadUntilPending();
243         break;
244 
245       case DECODER_DECODE:
246         decoder_->HoldDecode();
247         ReadUntilPending();
248         break;
249 
250       case DECODER_RESET:
251         decoder_->HoldNextReset();
252         pending_reset_ = true;
253         video_frame_stream_->Reset(base::Bind(&VideoFrameStreamTest::OnReset,
254                                               base::Unretained(this)));
255         message_loop_.RunUntilIdle();
256         break;
257 
258       case NOT_PENDING:
259         NOTREACHED();
260         break;
261     }
262   }
263 
SatisfyPendingCallback(PendingState state)264   void SatisfyPendingCallback(PendingState state) {
265     DCHECK_NE(state, NOT_PENDING);
266     switch (state) {
267       case DEMUXER_READ_NORMAL:
268       case DEMUXER_READ_CONFIG_CHANGE:
269         demuxer_stream_->SatisfyRead();
270         break;
271 
272       // These two cases are only interesting to test during
273       // VideoFrameStream::Stop().  There's no need to satisfy a callback.
274       case SET_DECRYPTOR:
275       case DECRYPTOR_NO_KEY:
276         NOTREACHED();
277         break;
278 
279       case DECODER_INIT:
280         decoder_->SatisfyInit();
281         break;
282 
283       case DECODER_REINIT:
284         decoder_->SatisfyInit();
285         break;
286 
287       case DECODER_DECODE:
288         decoder_->SatisfyDecode();
289         break;
290 
291       case DECODER_RESET:
292         decoder_->SatisfyReset();
293         break;
294 
295       case NOT_PENDING:
296         NOTREACHED();
297         break;
298     }
299 
300     message_loop_.RunUntilIdle();
301   }
302 
Initialize()303   void Initialize() {
304     EnterPendingState(DECODER_INIT);
305     SatisfyPendingCallback(DECODER_INIT);
306   }
307 
Read()308   void Read() {
309     EnterPendingState(DECODER_DECODE);
310     SatisfyPendingCallback(DECODER_DECODE);
311   }
312 
Reset()313   void Reset() {
314     EnterPendingState(DECODER_RESET);
315     SatisfyPendingCallback(DECODER_RESET);
316   }
317 
Stop()318   void Stop() {
319     // Check that the pipeline statistics callback was fired correctly.
320     EXPECT_EQ(decoder_->total_bytes_decoded(), total_bytes_decoded_);
321     pending_stop_ = true;
322     video_frame_stream_->Stop(base::Bind(&VideoFrameStreamTest::OnStopped,
323                                          base::Unretained(this)));
324     message_loop_.RunUntilIdle();
325   }
326 
327   base::MessageLoop message_loop_;
328 
329   scoped_ptr<VideoFrameStream> video_frame_stream_;
330   scoped_ptr<FakeDemuxerStream> demuxer_stream_;
331   // Use NiceMock since we don't care about most of calls on the decryptor,
332   // e.g. RegisterNewKeyCB().
333   scoped_ptr<NiceMock<MockDecryptor> > decryptor_;
334   FakeVideoDecoder* decoder_;  // Owned by |video_frame_stream_|.
335 
336   bool is_initialized_;
337   int num_decoded_frames_;
338   bool pending_initialize_;
339   bool pending_read_;
340   bool pending_reset_;
341   bool pending_stop_;
342   int total_bytes_decoded_;
343   scoped_refptr<VideoFrame> frame_read_;
344   VideoFrameStream::Status last_read_status_;
345 
346   // Decryptor has no key to decrypt a frame.
347   bool has_no_key_;
348 
349  private:
350   DISALLOW_COPY_AND_ASSIGN(VideoFrameStreamTest);
351 };
352 
353 INSTANTIATE_TEST_CASE_P(
354     Clear,
355     VideoFrameStreamTest,
356     ::testing::Values(
357         VideoFrameStreamTestParams(false, 0, 1),
358         VideoFrameStreamTestParams(false, 3, 1),
359         VideoFrameStreamTestParams(false, 7, 1)));
360 INSTANTIATE_TEST_CASE_P(
361     Encrypted,
362     VideoFrameStreamTest,
363     ::testing::Values(
364         VideoFrameStreamTestParams(true, 7, 1)));
365 
366 INSTANTIATE_TEST_CASE_P(
367     Clear_Parallel,
368     VideoFrameStreamTest,
369     ::testing::Values(
370         VideoFrameStreamTestParams(false, 0, 3),
371         VideoFrameStreamTestParams(false, 2, 3)));
372 
373 
TEST_P(VideoFrameStreamTest,Initialization)374 TEST_P(VideoFrameStreamTest, Initialization) {
375   Initialize();
376 }
377 
TEST_P(VideoFrameStreamTest,ReadOneFrame)378 TEST_P(VideoFrameStreamTest, ReadOneFrame) {
379   Initialize();
380   Read();
381 }
382 
TEST_P(VideoFrameStreamTest,ReadAllFrames)383 TEST_P(VideoFrameStreamTest, ReadAllFrames) {
384   Initialize();
385   ReadAllFrames();
386 }
387 
TEST_P(VideoFrameStreamTest,Read_AfterReset)388 TEST_P(VideoFrameStreamTest, Read_AfterReset) {
389   Initialize();
390   Reset();
391   Read();
392   Reset();
393   Read();
394 }
395 
TEST_P(VideoFrameStreamTest,Read_BlockedDemuxer)396 TEST_P(VideoFrameStreamTest, Read_BlockedDemuxer) {
397   Initialize();
398   demuxer_stream_->HoldNextRead();
399   ReadOneFrame();
400   EXPECT_TRUE(pending_read_);
401 
402   int demuxed_buffers = 0;
403 
404   // Pass frames from the demuxer to the VideoFrameStream until the first read
405   // request is satisfied.
406   while (pending_read_) {
407     ++demuxed_buffers;
408     demuxer_stream_->SatisfyReadAndHoldNext();
409     message_loop_.RunUntilIdle();
410   }
411 
412   EXPECT_EQ(std::min(GetParam().decoding_delay + 1, kNumBuffersInOneConfig + 1),
413             demuxed_buffers);
414 
415   // At this point the stream is waiting on read from the demuxer, but there is
416   // no pending read from the stream. The stream should be blocked if we try
417   // reading from it again.
418   ReadUntilPending();
419 
420   demuxer_stream_->SatisfyRead();
421   message_loop_.RunUntilIdle();
422   EXPECT_FALSE(pending_read_);
423 }
424 
TEST_P(VideoFrameStreamTest,Read_BlockedDemuxerAndDecoder)425 TEST_P(VideoFrameStreamTest, Read_BlockedDemuxerAndDecoder) {
426   // Test applies only when the decoder allows multiple parallel requests.
427   if (GetParam().parallel_decoding == 1)
428     return;
429 
430   Initialize();
431   demuxer_stream_->HoldNextRead();
432   decoder_->HoldDecode();
433   ReadOneFrame();
434   EXPECT_TRUE(pending_read_);
435 
436   int demuxed_buffers = 0;
437 
438   // Pass frames from the demuxer to the VideoFrameStream until the first read
439   // request is satisfied, while always keeping one decode request pending.
440   while (pending_read_) {
441     ++demuxed_buffers;
442     demuxer_stream_->SatisfyReadAndHoldNext();
443     message_loop_.RunUntilIdle();
444 
445     // Always keep one decode request pending.
446     if (demuxed_buffers > 1) {
447       decoder_->SatisfySingleDecode();
448       message_loop_.RunUntilIdle();
449     }
450   }
451 
452   ReadUntilPending();
453   EXPECT_TRUE(pending_read_);
454 
455   // Unblocking one decode request should unblock read even when demuxer is
456   // still blocked.
457   decoder_->SatisfySingleDecode();
458   message_loop_.RunUntilIdle();
459   EXPECT_FALSE(pending_read_);
460 
461   // Stream should still be blocked on the demuxer after unblocking the decoder.
462   decoder_->SatisfyDecode();
463   ReadUntilPending();
464   EXPECT_TRUE(pending_read_);
465 
466   // Verify that the stream has returned all frames that have been demuxed,
467   // accounting for the decoder delay.
468   EXPECT_EQ(demuxed_buffers - GetParam().decoding_delay, num_decoded_frames_);
469 
470   // Unblocking the demuxer will unblock the stream.
471   demuxer_stream_->SatisfyRead();
472   message_loop_.RunUntilIdle();
473   EXPECT_FALSE(pending_read_);
474 }
475 
476 // No Reset() before initialization is successfully completed.
477 
TEST_P(VideoFrameStreamTest,Reset_AfterInitialization)478 TEST_P(VideoFrameStreamTest, Reset_AfterInitialization) {
479   Initialize();
480   Reset();
481   Read();
482 }
483 
TEST_P(VideoFrameStreamTest,Reset_DuringReinitialization)484 TEST_P(VideoFrameStreamTest, Reset_DuringReinitialization) {
485   Initialize();
486   EnterPendingState(DECODER_REINIT);
487   // VideoDecoder::Reset() is not called when we reset during reinitialization.
488   pending_reset_ = true;
489   video_frame_stream_->Reset(
490       base::Bind(&VideoFrameStreamTest::OnReset, base::Unretained(this)));
491   SatisfyPendingCallback(DECODER_REINIT);
492   Read();
493 }
494 
TEST_P(VideoFrameStreamTest,Reset_AfterReinitialization)495 TEST_P(VideoFrameStreamTest, Reset_AfterReinitialization) {
496   Initialize();
497   EnterPendingState(DECODER_REINIT);
498   SatisfyPendingCallback(DECODER_REINIT);
499   Reset();
500   Read();
501 }
502 
TEST_P(VideoFrameStreamTest,Reset_DuringDemuxerRead_Normal)503 TEST_P(VideoFrameStreamTest, Reset_DuringDemuxerRead_Normal) {
504   Initialize();
505   EnterPendingState(DEMUXER_READ_NORMAL);
506   EnterPendingState(DECODER_RESET);
507   SatisfyPendingCallback(DEMUXER_READ_NORMAL);
508   SatisfyPendingCallback(DECODER_RESET);
509   Read();
510 }
511 
TEST_P(VideoFrameStreamTest,Reset_DuringDemuxerRead_ConfigChange)512 TEST_P(VideoFrameStreamTest, Reset_DuringDemuxerRead_ConfigChange) {
513   Initialize();
514   EnterPendingState(DEMUXER_READ_CONFIG_CHANGE);
515   EnterPendingState(DECODER_RESET);
516   SatisfyPendingCallback(DEMUXER_READ_CONFIG_CHANGE);
517   SatisfyPendingCallback(DECODER_RESET);
518   Read();
519 }
520 
TEST_P(VideoFrameStreamTest,Reset_DuringNormalDecoderDecode)521 TEST_P(VideoFrameStreamTest, Reset_DuringNormalDecoderDecode) {
522   Initialize();
523   EnterPendingState(DECODER_DECODE);
524   EnterPendingState(DECODER_RESET);
525   SatisfyPendingCallback(DECODER_DECODE);
526   SatisfyPendingCallback(DECODER_RESET);
527   Read();
528 }
529 
TEST_P(VideoFrameStreamTest,Reset_AfterNormalRead)530 TEST_P(VideoFrameStreamTest, Reset_AfterNormalRead) {
531   Initialize();
532   Read();
533   Reset();
534   Read();
535 }
536 
TEST_P(VideoFrameStreamTest,Reset_AfterNormalReadWithActiveSplice)537 TEST_P(VideoFrameStreamTest, Reset_AfterNormalReadWithActiveSplice) {
538   video_frame_stream_->set_splice_observer(base::Bind(
539       &VideoFrameStreamTest::OnNewSpliceBuffer, base::Unretained(this)));
540   Initialize();
541 
542   // Send buffers with a splice timestamp, which sets the active splice flag.
543   const base::TimeDelta splice_timestamp = base::TimeDelta();
544   demuxer_stream_->set_splice_timestamp(splice_timestamp);
545   EXPECT_CALL(*this, OnNewSpliceBuffer(splice_timestamp)).Times(AnyNumber());
546   Read();
547 
548   // Issue an explicit Reset() and clear the splice timestamp.
549   Reset();
550   demuxer_stream_->set_splice_timestamp(kNoTimestamp());
551 
552   // Ensure none of the upcoming calls indicate they have a splice timestamp.
553   EXPECT_CALL(*this, OnNewSpliceBuffer(_)).Times(0);
554   Read();
555 }
556 
TEST_P(VideoFrameStreamTest,Reset_AfterDemuxerRead_ConfigChange)557 TEST_P(VideoFrameStreamTest, Reset_AfterDemuxerRead_ConfigChange) {
558   Initialize();
559   EnterPendingState(DEMUXER_READ_CONFIG_CHANGE);
560   SatisfyPendingCallback(DEMUXER_READ_CONFIG_CHANGE);
561   Reset();
562   Read();
563 }
564 
TEST_P(VideoFrameStreamTest,Reset_AfterEndOfStream)565 TEST_P(VideoFrameStreamTest, Reset_AfterEndOfStream) {
566   Initialize();
567   ReadAllFrames();
568   Reset();
569   num_decoded_frames_ = 0;
570   demuxer_stream_->SeekToStart();
571   ReadAllFrames();
572 }
573 
TEST_P(VideoFrameStreamTest,Reset_DuringNoKeyRead)574 TEST_P(VideoFrameStreamTest, Reset_DuringNoKeyRead) {
575   Initialize();
576   EnterPendingState(DECRYPTOR_NO_KEY);
577   Reset();
578 }
579 
TEST_P(VideoFrameStreamTest,Stop_BeforeInitialization)580 TEST_P(VideoFrameStreamTest, Stop_BeforeInitialization) {
581   pending_stop_ = true;
582   video_frame_stream_->Stop(
583       base::Bind(&VideoFrameStreamTest::OnStopped, base::Unretained(this)));
584   message_loop_.RunUntilIdle();
585 }
586 
TEST_P(VideoFrameStreamTest,Stop_DuringSetDecryptor)587 TEST_P(VideoFrameStreamTest, Stop_DuringSetDecryptor) {
588   if (!GetParam().is_encrypted) {
589     DVLOG(1) << "SetDecryptor test only runs when the stream is encrytped.";
590     return;
591   }
592 
593   EnterPendingState(SET_DECRYPTOR);
594   pending_stop_ = true;
595   video_frame_stream_->Stop(
596       base::Bind(&VideoFrameStreamTest::OnStopped, base::Unretained(this)));
597   message_loop_.RunUntilIdle();
598 }
599 
TEST_P(VideoFrameStreamTest,Stop_DuringInitialization)600 TEST_P(VideoFrameStreamTest, Stop_DuringInitialization) {
601   EnterPendingState(DECODER_INIT);
602   Stop();
603 }
604 
TEST_P(VideoFrameStreamTest,Stop_AfterInitialization)605 TEST_P(VideoFrameStreamTest, Stop_AfterInitialization) {
606   Initialize();
607   Stop();
608 }
609 
TEST_P(VideoFrameStreamTest,Stop_DuringReinitialization)610 TEST_P(VideoFrameStreamTest, Stop_DuringReinitialization) {
611   Initialize();
612   EnterPendingState(DECODER_REINIT);
613   Stop();
614 }
615 
TEST_P(VideoFrameStreamTest,Stop_AfterReinitialization)616 TEST_P(VideoFrameStreamTest, Stop_AfterReinitialization) {
617   Initialize();
618   EnterPendingState(DECODER_REINIT);
619   SatisfyPendingCallback(DECODER_REINIT);
620   Stop();
621 }
622 
TEST_P(VideoFrameStreamTest,Stop_DuringDemuxerRead_Normal)623 TEST_P(VideoFrameStreamTest, Stop_DuringDemuxerRead_Normal) {
624   Initialize();
625   EnterPendingState(DEMUXER_READ_NORMAL);
626   Stop();
627 }
628 
TEST_P(VideoFrameStreamTest,Stop_DuringDemuxerRead_ConfigChange)629 TEST_P(VideoFrameStreamTest, Stop_DuringDemuxerRead_ConfigChange) {
630   Initialize();
631   EnterPendingState(DEMUXER_READ_CONFIG_CHANGE);
632   Stop();
633 }
634 
TEST_P(VideoFrameStreamTest,Stop_DuringNormalDecoderDecode)635 TEST_P(VideoFrameStreamTest, Stop_DuringNormalDecoderDecode) {
636   Initialize();
637   EnterPendingState(DECODER_DECODE);
638   Stop();
639 }
640 
TEST_P(VideoFrameStreamTest,Stop_AfterNormalRead)641 TEST_P(VideoFrameStreamTest, Stop_AfterNormalRead) {
642   Initialize();
643   Read();
644   Stop();
645 }
646 
TEST_P(VideoFrameStreamTest,Stop_AfterConfigChangeRead)647 TEST_P(VideoFrameStreamTest, Stop_AfterConfigChangeRead) {
648   Initialize();
649   EnterPendingState(DEMUXER_READ_CONFIG_CHANGE);
650   SatisfyPendingCallback(DEMUXER_READ_CONFIG_CHANGE);
651   Stop();
652 }
653 
TEST_P(VideoFrameStreamTest,Stop_DuringNoKeyRead)654 TEST_P(VideoFrameStreamTest, Stop_DuringNoKeyRead) {
655   Initialize();
656   EnterPendingState(DECRYPTOR_NO_KEY);
657   Stop();
658 }
659 
TEST_P(VideoFrameStreamTest,Stop_DuringReset)660 TEST_P(VideoFrameStreamTest, Stop_DuringReset) {
661   Initialize();
662   EnterPendingState(DECODER_RESET);
663   Stop();
664 }
665 
TEST_P(VideoFrameStreamTest,Stop_AfterReset)666 TEST_P(VideoFrameStreamTest, Stop_AfterReset) {
667   Initialize();
668   Reset();
669   Stop();
670 }
671 
TEST_P(VideoFrameStreamTest,Stop_DuringRead_DuringReset)672 TEST_P(VideoFrameStreamTest, Stop_DuringRead_DuringReset) {
673   Initialize();
674   EnterPendingState(DECODER_DECODE);
675   EnterPendingState(DECODER_RESET);
676   Stop();
677 }
678 
TEST_P(VideoFrameStreamTest,Stop_AfterRead_DuringReset)679 TEST_P(VideoFrameStreamTest, Stop_AfterRead_DuringReset) {
680   Initialize();
681   EnterPendingState(DECODER_DECODE);
682   EnterPendingState(DECODER_RESET);
683   SatisfyPendingCallback(DECODER_DECODE);
684   Stop();
685 }
686 
TEST_P(VideoFrameStreamTest,Stop_AfterRead_AfterReset)687 TEST_P(VideoFrameStreamTest, Stop_AfterRead_AfterReset) {
688   Initialize();
689   Read();
690   Reset();
691   Stop();
692 }
693 
TEST_P(VideoFrameStreamTest,DecoderErrorWhenReading)694 TEST_P(VideoFrameStreamTest, DecoderErrorWhenReading) {
695   Initialize();
696   EnterPendingState(DECODER_DECODE);
697   decoder_->SimulateError();
698   message_loop_.RunUntilIdle();
699   ASSERT_FALSE(pending_read_);
700   ASSERT_EQ(VideoFrameStream::DECODE_ERROR, last_read_status_);
701 }
702 
TEST_P(VideoFrameStreamTest,DecoderErrorWhenNotReading)703 TEST_P(VideoFrameStreamTest, DecoderErrorWhenNotReading) {
704   Initialize();
705 
706   decoder_->HoldDecode();
707   ReadOneFrame();
708   EXPECT_TRUE(pending_read_);
709 
710   // Satisfy decode requests until we get the first frame out.
711   while (pending_read_) {
712     decoder_->SatisfySingleDecode();
713     message_loop_.RunUntilIdle();
714   }
715 
716   // Trigger an error in the decoding.
717   decoder_->SimulateError();
718 
719   // The error must surface from Read() as DECODE_ERROR.
720   while (last_read_status_ == VideoFrameStream::OK) {
721     ReadOneFrame();
722     message_loop_.RunUntilIdle();
723     EXPECT_FALSE(pending_read_);
724   }
725   EXPECT_EQ(VideoFrameStream::DECODE_ERROR, last_read_status_);
726 }
727 
728 }  // namespace media
729