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