12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback_helpers.h"
7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/gmock_callback_support.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/mock_filters.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/test_helpers.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "media/filters/fake_demuxer_stream.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "media/filters/fake_video_decoder.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/filters/video_frame_stream.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::_;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::Assign;
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)using ::testing::Invoke;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::NiceMock;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::Return;
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::SaveArg;
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)static const int kNumConfigs = 3;
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)static const int kNumBuffersInOneConfig = 5;
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)static const int kDecodingDelay = 7;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace media {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class VideoFrameStreamTest : public testing::TestWithParam<bool> {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VideoFrameStreamTest()
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      : demuxer_stream_(new FakeDemuxerStream(kNumConfigs,
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                              kNumBuffersInOneConfig,
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                              GetParam())),
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        decryptor_(new NiceMock<MockDecryptor>()),
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        decoder_(new FakeVideoDecoder(kDecodingDelay)),
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        is_initialized_(false),
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        num_decoded_frames_(0),
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        pending_read_(false),
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        pending_reset_(false),
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        pending_stop_(false),
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        total_bytes_decoded_(0) {
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ScopedVector<VideoDecoder> decoders;
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    decoders.push_back(decoder_);
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    video_frame_stream_.reset(new VideoFrameStream(
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        message_loop_.message_loop_proxy(),
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        decoders.Pass(),
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&VideoFrameStreamTest::SetDecryptorReadyCallback,
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   base::Unretained(this))));
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*this, SetDecryptorReadyCallback(_))
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .WillRepeatedly(RunCallback<0>(decryptor_.get()));
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Decryptor can only decrypt (not decrypt-and-decode) so that
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // DecryptingDemuxerStream will be used.
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*decryptor_, InitializeVideoDecoder(_, _))
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .WillRepeatedly(RunCallback<1>(false));
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*decryptor_, Decrypt(_, _, _))
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        .WillRepeatedly(Invoke(this, &VideoFrameStreamTest::Decrypt));
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~VideoFrameStreamTest() {
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    DCHECK(!pending_read_);
657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    DCHECK(!pending_reset_);
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    DCHECK(!pending_stop_);
677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Check that the pipeline statistics callback was fired correctly.
697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (decoder_)
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_EQ(decoder_->total_bytes_decoded(), total_bytes_decoded_);
717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (is_initialized_)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Stop();
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(is_initialized_);
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD1(SetDecryptorReadyCallback, void(const media::DecryptorReadyCB&));
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD2(OnInitialized, void(bool, bool));
797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void OnStatistics(const PipelineStatistics& statistics) {
81558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    total_bytes_decoded_ += statistics.video_bytes_decoded;
827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Fake Decrypt() function used by DecryptingDemuxerStream. It does nothing
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // but removes the DecryptConfig to make the buffer unencrypted.
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void Decrypt(Decryptor::StreamType stream_type,
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               const scoped_refptr<DecoderBuffer>& encrypted,
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               const Decryptor::DecryptCB& decrypt_cb) {
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DCHECK_EQ(stream_type, Decryptor::kVideo);
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    scoped_refptr<DecoderBuffer> decrypted = DecoderBuffer::CopyFrom(
91ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        encrypted->data(), encrypted->data_size());
92ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    decrypted->set_timestamp(encrypted->timestamp());
93ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    decrypted->set_duration(encrypted->duration());
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    decrypt_cb.Run(Decryptor::kSuccess, decrypted);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Callback for VideoFrameStream::Read().
98558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  void FrameReady(VideoFrameStream::Status status,
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                  const scoped_refptr<VideoFrame>& frame) {
1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    DCHECK(pending_read_);
101558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    // TODO(xhwang): Add test cases where the fake decoder returns error or
102558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    // the fake demuxer aborts demuxer read.
103558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    ASSERT_TRUE(status == VideoFrameStream::OK ||
104558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                status == VideoFrameStream::ABORTED);
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    frame_read_ = frame;
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (frame.get() && !frame->IsEndOfStream())
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      num_decoded_frames_++;
1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    pending_read_ = false;
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void OnReset() {
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    DCHECK(!pending_read_);
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    DCHECK(pending_reset_);
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    pending_reset_ = false;
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void OnStopped() {
1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    DCHECK(!pending_read_);
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    DCHECK(!pending_reset_);
1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    DCHECK(pending_stop_);
1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    pending_stop_ = false;
1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    is_initialized_ = false;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void ReadUntilPending() {
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    do {
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      frame_read_ = NULL;
1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      pending_read_ = true;
1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      video_frame_stream_->Read(base::Bind(
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          &VideoFrameStreamTest::FrameReady, base::Unretained(this)));
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      message_loop_.RunUntilIdle();
1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    } while (!pending_read_);
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  enum PendingState {
136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    NOT_PENDING,
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DEMUXER_READ_NORMAL,
138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DEMUXER_READ_CONFIG_CHANGE,
139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DECODER_INIT,
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DECODER_REINIT,
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DECODER_READ,
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DECODER_RESET,
143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DECODER_STOP
144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void EnterPendingState(PendingState state) {
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DCHECK_NE(state, NOT_PENDING);
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    switch (state) {
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case DEMUXER_READ_NORMAL:
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        demuxer_stream_->HoldNextRead();
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        ReadUntilPending();
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case DEMUXER_READ_CONFIG_CHANGE:
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        demuxer_stream_->HoldNextConfigChangeRead();
156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        ReadUntilPending();
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case DECODER_INIT:
160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        decoder_->HoldNextInit();
161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        video_frame_stream_->Initialize(
162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            demuxer_stream_.get(),
163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            base::Bind(&VideoFrameStreamTest::OnStatistics,
164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       base::Unretained(this)),
165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            base::Bind(&VideoFrameStreamTest::OnInitialized,
166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       base::Unretained(this)));
167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        message_loop_.RunUntilIdle();
168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case DECODER_REINIT:
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        decoder_->HoldNextInit();
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        ReadUntilPending();
173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case DECODER_READ:
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        decoder_->HoldNextRead();
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        ReadUntilPending();
178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case DECODER_RESET:
181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        decoder_->HoldNextReset();
1827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        pending_reset_ = true;
183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        video_frame_stream_->Reset(base::Bind(&VideoFrameStreamTest::OnReset,
184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                              base::Unretained(this)));
185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        message_loop_.RunUntilIdle();
186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case DECODER_STOP:
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        decoder_->HoldNextStop();
1907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        pending_stop_ = true;
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        video_frame_stream_->Stop(base::Bind(&VideoFrameStreamTest::OnStopped,
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                             base::Unretained(this)));
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        message_loop_.RunUntilIdle();
194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case NOT_PENDING:
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        NOTREACHED();
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void SatisfyPendingCallback(PendingState state) {
203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DCHECK_NE(state, NOT_PENDING);
204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    switch (state) {
205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case DEMUXER_READ_NORMAL:
206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case DEMUXER_READ_CONFIG_CHANGE:
207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        demuxer_stream_->SatisfyRead();
208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case DECODER_INIT:
211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        EXPECT_CALL(*this, OnInitialized(true, false))
212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            .WillOnce(SaveArg<0>(&is_initialized_));
213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        decoder_->SatisfyInit();
214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case DECODER_REINIT:
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        decoder_->SatisfyInit();
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case DECODER_READ:
2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        DCHECK(pending_read_);
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        decoder_->SatisfyRead();
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case DECODER_RESET:
2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        DCHECK(pending_reset_);
227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        decoder_->SatisfyReset();
228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case DECODER_STOP:
2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        DCHECK(pending_stop_);
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        decoder_->SatisfyStop();
233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case NOT_PENDING:
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        NOTREACHED();
237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    message_loop_.RunUntilIdle();
241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (!is_initialized_)
242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      decoder_ = NULL;
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Initialize() {
246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EnterPendingState(DECODER_INIT);
247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SatisfyPendingCallback(DECODER_INIT);
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void Read() {
251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EnterPendingState(DECODER_READ);
252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SatisfyPendingCallback(DECODER_READ);
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Reset() {
256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EnterPendingState(DECODER_RESET);
257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SatisfyPendingCallback(DECODER_RESET);
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Stop() {
261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EnterPendingState(DECODER_STOP);
262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SatisfyPendingCallback(DECODER_STOP);
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop message_loop_;
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<VideoFrameStream> video_frame_stream_;
268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<FakeDemuxerStream> demuxer_stream_;
269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Use NiceMock since we don't care about most of calls on the decryptor,
270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // e.g. RegisterNewKeyCB().
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<NiceMock<MockDecryptor> > decryptor_;
272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FakeVideoDecoder* decoder_;  // Owned by |video_frame_stream_|.
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_initialized_;
275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int num_decoded_frames_;
2767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool pending_read_;
2777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool pending_reset_;
2787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool pending_stop_;
2797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int total_bytes_decoded_;
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<VideoFrame> frame_read_;
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(VideoFrameStreamTest);
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(Clear, VideoFrameStreamTest, testing::Values(false));
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(Encrypted, VideoFrameStreamTest, testing::Values(true));
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(VideoFrameStreamTest, Initialization) {
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Initialize();
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_P(VideoFrameStreamTest, ReadOneFrame) {
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Initialize();
2957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Read();
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_P(VideoFrameStreamTest, ReadAllFrames) {
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Initialize();
300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  do {
3017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    Read();
302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  } while (frame_read_.get() && !frame_read_->IsEndOfStream());
303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const int total_num_frames = kNumConfigs * kNumBuffersInOneConfig;
305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK_EQ(num_decoded_frames_, total_num_frames);
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_P(VideoFrameStreamTest, Read_AfterReset) {
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Initialize();
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Reset();
3117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Read();
312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Reset();
3137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Read();
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// No Reset() before initialization is successfully completed.
3177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(VideoFrameStreamTest, Reset_AfterInitialization) {
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Initialize();
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Reset();
3217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Read();
322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_P(VideoFrameStreamTest, Reset_DuringReinitialization) {
325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Initialize();
326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EnterPendingState(DECODER_REINIT);
327eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // VideoDecoder::Reset() is not called when we reset during reinitialization.
3287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pending_reset_ = true;
329eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  video_frame_stream_->Reset(
330eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&VideoFrameStreamTest::OnReset, base::Unretained(this)));
331eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SatisfyPendingCallback(DECODER_REINIT);
3327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Read();
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3357dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_P(VideoFrameStreamTest, Reset_AfterReinitialization) {
3367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Initialize();
3377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EnterPendingState(DECODER_REINIT);
3387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SatisfyPendingCallback(DECODER_REINIT);
3397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Reset();
3407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Read();
3417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3437dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_P(VideoFrameStreamTest, Reset_DuringDemuxerRead_Normal) {
344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Initialize();
345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DEMUXER_READ_NORMAL);
346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DECODER_RESET);
347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DEMUXER_READ_NORMAL);
348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DECODER_RESET);
3497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Read();
350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
351868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3527dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_P(VideoFrameStreamTest, Reset_DuringDemuxerRead_ConfigChange) {
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Initialize();
354868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DEMUXER_READ_CONFIG_CHANGE);
355868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DECODER_RESET);
356868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DEMUXER_READ_CONFIG_CHANGE);
357868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DECODER_RESET);
3587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Read();
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
361868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_P(VideoFrameStreamTest, Reset_DuringNormalDecoderRead) {
362868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Initialize();
363868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DECODER_READ);
364868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DECODER_RESET);
365868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DECODER_READ);
366868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DECODER_RESET);
3677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Read();
368868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
369868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
370868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_P(VideoFrameStreamTest, Reset_AfterNormalRead) {
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Initialize();
3727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Read();
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Reset();
3747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Read();
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3777dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_P(VideoFrameStreamTest, Reset_AfterDemuxerRead_ConfigChange) {
378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Initialize();
379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DEMUXER_READ_CONFIG_CHANGE);
380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DEMUXER_READ_CONFIG_CHANGE);
381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Reset();
3827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Read();
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
385868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_P(VideoFrameStreamTest, Stop_BeforeInitialization) {
3867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pending_stop_ = true;
387868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  video_frame_stream_->Stop(
388868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::Bind(&VideoFrameStreamTest::OnStopped, base::Unretained(this)));
389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  message_loop_.RunUntilIdle();
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_P(VideoFrameStreamTest, Stop_DuringInitialization) {
393868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DECODER_INIT);
394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DECODER_STOP);
395868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DECODER_INIT);
396868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DECODER_STOP);
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(VideoFrameStreamTest, Stop_AfterInitialization) {
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Initialize();
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Stop();
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
404eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_P(VideoFrameStreamTest, Stop_DuringReinitialization) {
405eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Initialize();
406eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EnterPendingState(DECODER_REINIT);
407eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EnterPendingState(DECODER_STOP);
408eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SatisfyPendingCallback(DECODER_REINIT);
409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SatisfyPendingCallback(DECODER_STOP);
410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4127dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_P(VideoFrameStreamTest, Stop_AfterReinitialization) {
4137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Initialize();
4147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EnterPendingState(DECODER_REINIT);
4157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SatisfyPendingCallback(DECODER_REINIT);
4167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Stop();
4177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
4187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4197dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_P(VideoFrameStreamTest, Stop_DuringDemuxerRead_Normal) {
420868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Initialize();
421868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DEMUXER_READ_NORMAL);
422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DECODER_STOP);
423868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DEMUXER_READ_NORMAL);
424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DECODER_STOP);
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4277dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_P(VideoFrameStreamTest, Stop_DuringDemuxerRead_ConfigChange) {
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Initialize();
429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DEMUXER_READ_CONFIG_CHANGE);
430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DECODER_STOP);
431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DEMUXER_READ_CONFIG_CHANGE);
432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DECODER_STOP);
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_P(VideoFrameStreamTest, Stop_DuringNormalDecoderRead) {
436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Initialize();
437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DECODER_READ);
438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DECODER_STOP);
439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DECODER_READ);
440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DECODER_STOP);
441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
442868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
443868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_P(VideoFrameStreamTest, Stop_AfterNormalRead) {
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Initialize();
4457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Read();
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Stop();
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
449868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_P(VideoFrameStreamTest, Stop_AfterConfigChangeRead) {
450868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Initialize();
451868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DEMUXER_READ_CONFIG_CHANGE);
452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DEMUXER_READ_CONFIG_CHANGE);
453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Stop();
454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
455868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(VideoFrameStreamTest, Stop_DuringReset) {
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Initialize();
458868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DECODER_RESET);
459868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DECODER_STOP);
460868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DECODER_RESET);
461868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DECODER_STOP);
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(VideoFrameStreamTest, Stop_AfterReset) {
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Initialize();
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Reset();
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Stop();
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4707dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_P(VideoFrameStreamTest, Stop_DuringRead_DuringReset) {
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Initialize();
472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DECODER_READ);
473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DECODER_RESET);
474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DECODER_STOP);
475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DECODER_READ);
476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DECODER_RESET);
477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DECODER_STOP);
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4807dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_P(VideoFrameStreamTest, Stop_AfterRead_DuringReset) {
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Initialize();
482868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DECODER_READ);
483868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DECODER_RESET);
484868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DECODER_READ);
485868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnterPendingState(DECODER_STOP);
486868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DECODER_RESET);
487868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SatisfyPendingCallback(DECODER_STOP);
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4907dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_P(VideoFrameStreamTest, Stop_AfterRead_AfterReset) {
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Initialize();
4927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Read();
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Reset();
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Stop();
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace media
498