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.
5 #include "base/basictypes.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "base/message_loop/message_loop.h"
9 #include "media/base/decoder_buffer.h"
10 #include "media/base/demuxer_stream.h"
11 #include "media/filters/fake_demuxer_stream.h"
12 #include "testing/gtest/include/gtest/gtest.h"
16 static const int kNumBuffersInOneConfig = 9;
17 static const int kNumBuffersToReadFirst = 5;
18 static const int kNumConfigs = 3;
19 COMPILE_ASSERT(kNumBuffersToReadFirst < kNumBuffersInOneConfig,
20 do_not_read_too_many_buffers);
21 COMPILE_ASSERT(kNumConfigs > 0, need_multiple_configs_to_trigger_config_change);
23 class FakeDemuxerStreamTest : public testing::Test {
25 FakeDemuxerStreamTest()
26 : status_(DemuxerStream::kAborted),
27 read_pending_(false) {}
28 virtual ~FakeDemuxerStreamTest() {}
30 void BufferReady(DemuxerStream::Status status,
31 const scoped_refptr<DecoderBuffer>& buffer) {
32 DCHECK(read_pending_);
33 read_pending_ = false;
46 void EnterNormalReadState() {
48 new FakeDemuxerStream(kNumConfigs, kNumBuffersInOneConfig, false));
49 for (int i = 0; i < kNumBuffersToReadFirst; ++i)
53 void EnterBeforeEOSState() {
54 stream_.reset(new FakeDemuxerStream(1, kNumBuffersInOneConfig, false));
55 for (int i = 0; i < kNumBuffersInOneConfig; ++i)
59 void ExpectReadResult(ReadResult result) {
62 EXPECT_FALSE(read_pending_);
63 EXPECT_EQ(DemuxerStream::kOk, status_);
64 ASSERT_TRUE(buffer_.get());
65 EXPECT_FALSE(buffer_->end_of_stream());
69 EXPECT_FALSE(read_pending_);
70 EXPECT_EQ(DemuxerStream::kAborted, status_);
71 EXPECT_FALSE(buffer_.get());
75 EXPECT_FALSE(read_pending_);
76 EXPECT_EQ(DemuxerStream::kConfigChanged, status_);
77 EXPECT_FALSE(buffer_.get());
81 EXPECT_FALSE(read_pending_);
82 EXPECT_EQ(DemuxerStream::kOk, status_);
83 ASSERT_TRUE(buffer_.get());
84 EXPECT_TRUE(buffer_->end_of_stream());
88 EXPECT_TRUE(read_pending_);
93 void ReadAndExpect(ReadResult result) {
94 EXPECT_FALSE(read_pending_);
96 stream_->Read(base::Bind(&FakeDemuxerStreamTest::BufferReady,
97 base::Unretained(this)));
98 message_loop_.RunUntilIdle();
99 ExpectReadResult(result);
102 void ReadUntilPending() {
104 read_pending_ = true;
105 stream_->Read(base::Bind(&FakeDemuxerStreamTest::BufferReady,
106 base::Unretained(this)));
107 message_loop_.RunUntilIdle();
113 void SatisfyReadAndExpect(ReadResult result) {
114 EXPECT_TRUE(read_pending_);
115 stream_->SatisfyRead();
116 message_loop_.RunUntilIdle();
117 ExpectReadResult(result);
121 bool had_read_pending = read_pending_;
123 message_loop_.RunUntilIdle();
125 EXPECT_FALSE(read_pending_);
126 if (had_read_pending)
127 ExpectReadResult(ABORTED);
130 void TestRead(int num_configs,
131 int num_buffers_in_one_config,
133 stream_.reset(new FakeDemuxerStream(
134 num_configs, num_buffers_in_one_config, is_encrypted));
136 int num_buffers_received = 0;
138 const VideoDecoderConfig& config = stream_->video_decoder_config();
139 EXPECT_TRUE(config.IsValidConfig());
140 EXPECT_EQ(is_encrypted, config.is_encrypted());
142 for (int i = 0; i < num_configs; ++i) {
143 for (int j = 0; j < num_buffers_in_one_config; ++j) {
145 num_buffers_received++;
146 EXPECT_EQ(num_buffers_received, stream_->num_buffers_returned());
149 if (i == num_configs - 1)
152 ReadAndExpect(CONFIG_CHANGED);
155 // Will always get EOS after we hit EOS.
158 EXPECT_EQ(num_configs * num_buffers_in_one_config, num_buffers_received);
161 base::MessageLoop message_loop_;
162 scoped_ptr<FakeDemuxerStream> stream_;
164 DemuxerStream::Status status_;
165 scoped_refptr<DecoderBuffer> buffer_;
167 int num_buffers_received_;
170 DISALLOW_COPY_AND_ASSIGN(FakeDemuxerStreamTest);
173 TEST_F(FakeDemuxerStreamTest, Read_OneConfig) {
174 TestRead(1, 5, false);
177 TEST_F(FakeDemuxerStreamTest, Read_MultipleConfigs) {
178 TestRead(3, 5, false);
181 TEST_F(FakeDemuxerStreamTest, Read_OneBufferPerConfig) {
182 TestRead(3, 1, false);
185 TEST_F(FakeDemuxerStreamTest, Read_Encrypted) {
186 TestRead(6, 3, true);
189 TEST_F(FakeDemuxerStreamTest, HoldRead_Normal) {
190 EnterNormalReadState();
191 stream_->HoldNextRead();
192 ReadAndExpect(PENDING);
193 SatisfyReadAndExpect(OK);
196 TEST_F(FakeDemuxerStreamTest, HoldRead_BeforeConfigChanged) {
197 EnterNormalReadState();
198 stream_->HoldNextConfigChangeRead();
200 SatisfyReadAndExpect(CONFIG_CHANGED);
203 TEST_F(FakeDemuxerStreamTest, HoldRead_BeforeEOS) {
204 EnterBeforeEOSState();
205 stream_->HoldNextRead();
206 ReadAndExpect(PENDING);
207 SatisfyReadAndExpect(EOS);
210 TEST_F(FakeDemuxerStreamTest, Reset_Normal) {
211 EnterNormalReadState();
216 TEST_F(FakeDemuxerStreamTest, Reset_AfterHoldRead) {
217 EnterNormalReadState();
218 stream_->HoldNextRead();
223 TEST_F(FakeDemuxerStreamTest, Reset_DuringPendingRead) {
224 EnterNormalReadState();
225 stream_->HoldNextRead();
226 ReadAndExpect(PENDING);
231 TEST_F(FakeDemuxerStreamTest, Reset_BeforeConfigChanged) {
232 EnterNormalReadState();
233 stream_->HoldNextConfigChangeRead();
236 ReadAndExpect(CONFIG_CHANGED);
239 TEST_F(FakeDemuxerStreamTest, Reset_BeforeEOS) {
240 EnterBeforeEOSState();
241 stream_->HoldNextRead();
242 ReadAndExpect(PENDING);