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

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

Issue 8890071: Stop audio FFmpegDemuxerStreams if we get notified that audio rendering is disabled. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src
Patch Set: typo Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/filters/ffmpeg_demuxer.cc ('k') | media/test/data/bear-320x240-multitrack.webm » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <deque> 5 #include <deque>
6 6
7 #include "base/file_path.h" 7 #include "base/file_path.h"
8 #include "base/path_service.h" 8 #include "base/path_service.h"
9 #include "base/threading/thread.h" 9 #include "base/threading/thread.h"
10 #include "media/base/filters.h" 10 #include "media/base/filters.h"
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 // when streaming video). Uses this data source to initialize a demuxer, then 119 // when streaming video). Uses this data source to initialize a demuxer, then
120 // returns true if the bitrate is valid, false otherwise. 120 // returns true if the bitrate is valid, false otherwise.
121 bool VideoHasValidBitrate( 121 bool VideoHasValidBitrate(
122 const std::string& file_name, bool disable_file_size) { 122 const std::string& file_name, bool disable_file_size) {
123 scoped_refptr<FileDataSource> data_source = 123 scoped_refptr<FileDataSource> data_source =
124 CreateDataSource(file_name, disable_file_size); 124 CreateDataSource(file_name, disable_file_size);
125 InitializeDemuxer(data_source); 125 InitializeDemuxer(data_source);
126 return demuxer_->GetBitrate() > 0; 126 return demuxer_->GetBitrate() > 0;
127 } 127 }
128 128
129 bool IsStreamStopped(DemuxerStream::Type type) {
130 DemuxerStream* stream = demuxer_->GetStream(type);
131 CHECK(stream);
132 return static_cast<FFmpegDemuxerStream*>(stream)->stopped_;
133 }
134
129 // Fixture members. 135 // Fixture members.
130 scoped_refptr<FFmpegDemuxer> demuxer_; 136 scoped_refptr<FFmpegDemuxer> demuxer_;
131 StrictMock<MockFilterHost> host_; 137 StrictMock<MockFilterHost> host_;
132 MessageLoop message_loop_; 138 MessageLoop message_loop_;
133 139
134 int64 current_read_position_; 140 int64 current_read_position_;
135 141
136 private: 142 private:
137 DISALLOW_COPY_AND_ASSIGN(FFmpegDemuxerTest); 143 DISALLOW_COPY_AND_ASSIGN(FFmpegDemuxerTest);
138 }; 144 };
(...skipping 11 matching lines...) Expand all
150 // av_open_input_file(), but has av_find_stream_info() fail. 156 // av_open_input_file(), but has av_find_stream_info() fail.
151 // 157 //
152 //TEST_F(FFmpegDemuxerTest, Initialize_ParseFails) { 158 //TEST_F(FFmpegDemuxerTest, Initialize_ParseFails) {
153 // demuxer_->Initialize( 159 // demuxer_->Initialize(
154 // CreateDataSource("find_stream_info_fail.webm"), 160 // CreateDataSource("find_stream_info_fail.webm"),
155 // NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_PARSE)); 161 // NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_PARSE));
156 // message_loop_.RunAllPending(); 162 // message_loop_.RunAllPending();
157 //} 163 //}
158 164
159 TEST_F(FFmpegDemuxerTest, Initialize_NoStreams) { 165 TEST_F(FFmpegDemuxerTest, Initialize_NoStreams) {
160 // Open a file with no parseable streams. 166 // Open a file with no streams whatsoever.
161 EXPECT_CALL(host_, SetCurrentReadPosition(_)); 167 EXPECT_CALL(host_, SetCurrentReadPosition(_));
162 demuxer_->Initialize( 168 demuxer_->Initialize(
163 CreateDataSource("no_streams.webm"), 169 CreateDataSource("no_streams.webm"),
164 NewExpectedStatusCB(DEMUXER_ERROR_NO_SUPPORTED_STREAMS)); 170 NewExpectedStatusCB(DEMUXER_ERROR_NO_SUPPORTED_STREAMS));
165 message_loop_.RunAllPending(); 171 message_loop_.RunAllPending();
166 } 172 }
167 173
168 // TODO(acolwell): Find a subtitle only file so we can uncomment this test. 174 TEST_F(FFmpegDemuxerTest, Initialize_NoAudioVideo) {
169 // 175 // Open a file containing streams but none of which are audio/video streams.
170 //TEST_F(FFmpegDemuxerTest, Initialize_DataStreamOnly) { 176 demuxer_->Initialize(
171 // demuxer_->Initialize( 177 CreateDataSource("no_audio_video.webm"),
172 // CreateDataSource("subtitles_only.mp4"),, 178 NewExpectedStatusCB(DEMUXER_ERROR_NO_SUPPORTED_STREAMS));
173 // NewExpectedStatusCB(DEMUXER_ERROR_NO_SUPPORTED_STREAMS)); 179 message_loop_.RunAllPending();
174 // message_loop_.RunAllPending(); 180 }
175 //}
176 181
177 TEST_F(FFmpegDemuxerTest, Initialize_Successful) { 182 TEST_F(FFmpegDemuxerTest, Initialize_Successful) {
178 InitializeDemuxer(CreateDataSource("bear-320x240.webm")); 183 InitializeDemuxer(CreateDataSource("bear-320x240.webm"));
179 184
180 // Video stream should be present. 185 // Video stream should be present.
181 scoped_refptr<DemuxerStream> stream = 186 scoped_refptr<DemuxerStream> stream =
182 demuxer_->GetStream(DemuxerStream::VIDEO); 187 demuxer_->GetStream(DemuxerStream::VIDEO);
183 ASSERT_TRUE(stream); 188 ASSERT_TRUE(stream);
184 EXPECT_EQ(DemuxerStream::VIDEO, stream->type()); 189 EXPECT_EQ(DemuxerStream::VIDEO, stream->type());
185 190
(...skipping 18 matching lines...) Expand all
204 ASSERT_TRUE(stream); 209 ASSERT_TRUE(stream);
205 EXPECT_EQ(DemuxerStream::AUDIO, stream->type()); 210 EXPECT_EQ(DemuxerStream::AUDIO, stream->type());
206 211
207 const AudioDecoderConfig& audio_config = stream->audio_decoder_config(); 212 const AudioDecoderConfig& audio_config = stream->audio_decoder_config();
208 EXPECT_EQ(kCodecVorbis, audio_config.codec()); 213 EXPECT_EQ(kCodecVorbis, audio_config.codec());
209 EXPECT_EQ(16, audio_config.bits_per_channel()); 214 EXPECT_EQ(16, audio_config.bits_per_channel());
210 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, audio_config.channel_layout()); 215 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, audio_config.channel_layout());
211 EXPECT_EQ(44100, audio_config.samples_per_second()); 216 EXPECT_EQ(44100, audio_config.samples_per_second());
212 EXPECT_TRUE(audio_config.extra_data()); 217 EXPECT_TRUE(audio_config.extra_data());
213 EXPECT_GT(audio_config.extra_data_size(), 0u); 218 EXPECT_GT(audio_config.extra_data_size(), 0u);
219
220 // Unknown stream should never be present.
221 stream = demuxer_->GetStream(DemuxerStream::UNKNOWN);
222 EXPECT_FALSE(stream);
acolwell GONE FROM CHROMIUM 2011/12/15 18:02:22 nit: Do you need to assign to stream? Can't the Ge
scherkus (not reviewing) 2011/12/15 19:24:37 Done. Was copy+pasting :)
223 }
224
225 TEST_F(FFmpegDemuxerTest, Initialize_Multitrack) {
226 // Open a file containing the following streams:
227 // Stream #0: Video (VP8)
228 // Stream #1: Audio (Vorbis)
229 // Stream #2: Subtitles (SRT)
230 // Stream #3: Video (Theora)
231 // Stream #4: Audio (16-bit signed little endian PCM)
232 //
233 // We should only pick the first audio/video streams we come across.
234 InitializeDemuxer(CreateDataSource("bear-320x240-multitrack.webm"));
235
236 // Video stream should be VP8.
237 scoped_refptr<DemuxerStream> stream =
238 demuxer_->GetStream(DemuxerStream::VIDEO);
239 ASSERT_TRUE(stream);
240 EXPECT_EQ(DemuxerStream::VIDEO, stream->type());
241 EXPECT_EQ(kCodecVP8, stream->video_decoder_config().codec());
242
243 // Audio stream should be Vorbis.
244 stream = demuxer_->GetStream(DemuxerStream::AUDIO);
245 ASSERT_TRUE(stream);
246 EXPECT_EQ(DemuxerStream::AUDIO, stream->type());
247 EXPECT_EQ(kCodecVorbis, stream->audio_decoder_config().codec());
248
249 // Unknown stream should never be present.
250 stream = demuxer_->GetStream(DemuxerStream::UNKNOWN);
251 EXPECT_FALSE(stream);
acolwell GONE FROM CHROMIUM 2011/12/15 18:02:22 nit: ditto. This check could probably be moved to
scherkus (not reviewing) 2011/12/15 19:24:37 Done.
214 } 252 }
215 253
216 TEST_F(FFmpegDemuxerTest, Read_Audio) { 254 TEST_F(FFmpegDemuxerTest, Read_Audio) {
217 // We test that on a successful audio packet read. 255 // We test that on a successful audio packet read.
218 InitializeDemuxer(CreateDataSource("bear-320x240.webm")); 256 InitializeDemuxer(CreateDataSource("bear-320x240.webm"));
219 257
220 // Attempt a read from the audio stream and run the message loop until done. 258 // Attempt a read from the audio stream and run the message loop until done.
221 scoped_refptr<DemuxerStream> audio = 259 scoped_refptr<DemuxerStream> audio =
222 demuxer_->GetStream(DemuxerStream::AUDIO); 260 demuxer_->GetStream(DemuxerStream::AUDIO);
223 scoped_refptr<DemuxerStreamReader> reader(new DemuxerStreamReader()); 261 scoped_refptr<DemuxerStreamReader> reader(new DemuxerStreamReader());
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 message_loop_.RunAllPending(); 522 message_loop_.RunAllPending();
485 523
486 // Get our streams. 524 // Get our streams.
487 scoped_refptr<DemuxerStream> video = 525 scoped_refptr<DemuxerStream> video =
488 demuxer_->GetStream(DemuxerStream::VIDEO); 526 demuxer_->GetStream(DemuxerStream::VIDEO);
489 scoped_refptr<DemuxerStream> audio = 527 scoped_refptr<DemuxerStream> audio =
490 demuxer_->GetStream(DemuxerStream::AUDIO); 528 demuxer_->GetStream(DemuxerStream::AUDIO);
491 ASSERT_TRUE(video); 529 ASSERT_TRUE(video);
492 ASSERT_TRUE(audio); 530 ASSERT_TRUE(audio);
493 531
494 // Attempt a read from the video stream and run the message loop until done. 532 // The audio stream should have been prematurely stopped.
533 EXPECT_FALSE(IsStreamStopped(DemuxerStream::VIDEO));
534 EXPECT_TRUE(IsStreamStopped(DemuxerStream::AUDIO));
535
536 // Attempt a read from the video stream: it should return valid data.
495 scoped_refptr<DemuxerStreamReader> reader(new DemuxerStreamReader()); 537 scoped_refptr<DemuxerStreamReader> reader(new DemuxerStreamReader());
496 reader->Read(video); 538 reader->Read(video);
497 message_loop_.RunAllPending(); 539 message_loop_.RunAllPending();
498 EXPECT_TRUE(reader->called()); 540 ASSERT_TRUE(reader->called());
499 ValidateBuffer(FROM_HERE, reader->buffer(), 22084, 0); 541 ValidateBuffer(FROM_HERE, reader->buffer(), 22084, 0);
500 542
543 // Attempt a read from the audio stream: it should immediately return end of
544 // stream without requiring the message loop to read data.
501 reader->Reset(); 545 reader->Reset();
502 reader->Read(audio); 546 reader->Read(audio);
503 message_loop_.RunAllPending(); 547 ASSERT_TRUE(reader->called());
504 EXPECT_TRUE(reader->called());
505 EXPECT_TRUE(reader->buffer()->IsEndOfStream()); 548 EXPECT_TRUE(reader->buffer()->IsEndOfStream());
506 } 549 }
507 550
508 class MockFFmpegDemuxer : public FFmpegDemuxer { 551 class MockFFmpegDemuxer : public FFmpegDemuxer {
509 public: 552 public:
510 explicit MockFFmpegDemuxer(MessageLoop* message_loop) 553 explicit MockFFmpegDemuxer(MessageLoop* message_loop)
511 : FFmpegDemuxer(message_loop, true) { 554 : FFmpegDemuxer(message_loop, true) {
512 } 555 }
513 virtual ~MockFFmpegDemuxer() {} 556 virtual ~MockFFmpegDemuxer() {}
514 557
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
696 message_loop_.RunAllPending(); 739 message_loop_.RunAllPending();
697 EXPECT_TRUE(reader->called()); 740 EXPECT_TRUE(reader->called());
698 ValidateBuffer(FROM_HERE, reader->buffer(), 1740, 2436000); 741 ValidateBuffer(FROM_HERE, reader->buffer(), 1740, 2436000);
699 742
700 // Manually release the last reference to the buffer and verify it was freed. 743 // Manually release the last reference to the buffer and verify it was freed.
701 reader->Reset(); 744 reader->Reset();
702 message_loop_.RunAllPending(); 745 message_loop_.RunAllPending();
703 } 746 }
704 747
705 } // namespace media 748 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/ffmpeg_demuxer.cc ('k') | media/test/data/bear-320x240-multitrack.webm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698