OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 "media/base/filter_host.h" | 7 #include "media/base/filter_host.h" |
8 #include "media/base/filters.h" | 8 #include "media/base/filters.h" |
9 #include "media/base/mock_filter_host.h" | 9 #include "media/base/mock_filter_host.h" |
10 #include "media/base/mock_media_filters.h" | 10 #include "media/base/mock_media_filters.h" |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 | 141 |
142 TEST(FFmpegDemuxerTest, InitializeFailure) { | 142 TEST(FFmpegDemuxerTest, InitializeFailure) { |
143 InitializeFFmpegMocks(); | 143 InitializeFFmpegMocks(); |
144 | 144 |
145 // Get FFmpegDemuxer's filter factory. | 145 // Get FFmpegDemuxer's filter factory. |
146 scoped_refptr<FilterFactory> factory = FFmpegDemuxer::CreateFilterFactory(); | 146 scoped_refptr<FilterFactory> factory = FFmpegDemuxer::CreateFilterFactory(); |
147 | 147 |
148 // Should only accept application/octet-stream type. | 148 // Should only accept application/octet-stream type. |
149 MediaFormat media_format; | 149 MediaFormat media_format; |
150 media_format.SetAsString(MediaFormat::kMimeType, "foo/x-bar"); | 150 media_format.SetAsString(MediaFormat::kMimeType, "foo/x-bar"); |
151 scoped_refptr<Demuxer> demuxer(factory->Create<Demuxer>(&media_format)); | 151 scoped_refptr<Demuxer> demuxer(factory->Create<Demuxer>(media_format)); |
152 ASSERT_FALSE(demuxer); | 152 ASSERT_FALSE(demuxer); |
153 media_format.Clear(); | 153 media_format.Clear(); |
154 media_format.SetAsString(MediaFormat::kMimeType, | 154 media_format.SetAsString(MediaFormat::kMimeType, |
155 mime_type::kApplicationOctetStream); | 155 mime_type::kApplicationOctetStream); |
156 demuxer = factory->Create<Demuxer>(&media_format); | 156 demuxer = factory->Create<Demuxer>(media_format); |
157 ASSERT_TRUE(demuxer); | 157 ASSERT_TRUE(demuxer); |
158 | 158 |
159 // Prepare a filter host and data source for the demuxer. | 159 // Prepare a filter host and data source for the demuxer. |
160 MockPipeline pipeline; | 160 MockPipeline pipeline; |
161 scoped_ptr< MockFilterHost<Demuxer> > filter_host; | 161 scoped_ptr< MockFilterHost<Demuxer> > filter_host; |
162 filter_host.reset(new MockFilterHost<Demuxer>(&pipeline, demuxer)); | 162 filter_host.reset(new MockFilterHost<Demuxer>(&pipeline, demuxer)); |
163 MockFilterConfig config; | 163 MockFilterConfig config; |
164 scoped_refptr<MockDataSource> data_source(new MockDataSource(&config)); | 164 scoped_refptr<MockDataSource> data_source(new MockDataSource(&config)); |
165 | 165 |
166 // Simulate av_open_input_fail failing. | 166 // Simulate av_open_input_fail failing. |
167 g_av_open_input_file = AVERROR_IO; | 167 g_av_open_input_file = AVERROR_IO; |
168 g_av_find_stream_info = 0; | 168 g_av_find_stream_info = 0; |
169 EXPECT_FALSE(demuxer->Initialize(data_source)); | 169 EXPECT_FALSE(demuxer->Initialize(data_source)); |
170 EXPECT_FALSE(filter_host->IsInitialized()); | 170 EXPECT_FALSE(filter_host->IsInitialized()); |
171 EXPECT_EQ(DEMUXER_ERROR_COULD_NOT_OPEN, pipeline.GetError()); | 171 EXPECT_EQ(DEMUXER_ERROR_COULD_NOT_OPEN, pipeline.GetError()); |
172 | 172 |
173 // Simulate av_find_stream_info failing. | 173 // Simulate av_find_stream_info failing. |
174 g_av_open_input_file = 0; | 174 g_av_open_input_file = 0; |
175 g_av_find_stream_info = AVERROR_IO; | 175 g_av_find_stream_info = AVERROR_IO; |
176 demuxer = factory->Create<Demuxer>(&media_format); | 176 demuxer = factory->Create<Demuxer>(media_format); |
177 filter_host.reset(new MockFilterHost<Demuxer>(&pipeline, demuxer)); | 177 filter_host.reset(new MockFilterHost<Demuxer>(&pipeline, demuxer)); |
178 EXPECT_FALSE(demuxer->Initialize(data_source)); | 178 EXPECT_FALSE(demuxer->Initialize(data_source)); |
179 EXPECT_FALSE(filter_host->IsInitialized()); | 179 EXPECT_FALSE(filter_host->IsInitialized()); |
180 EXPECT_EQ(DEMUXER_ERROR_COULD_NOT_PARSE, pipeline.GetError()); | 180 EXPECT_EQ(DEMUXER_ERROR_COULD_NOT_PARSE, pipeline.GetError()); |
181 | 181 |
182 // Simulate media with no parseable streams. | 182 // Simulate media with no parseable streams. |
183 InitializeFFmpegMocks(); | 183 InitializeFFmpegMocks(); |
184 demuxer = factory->Create<Demuxer>(&media_format); | 184 demuxer = factory->Create<Demuxer>(media_format); |
185 filter_host.reset(new MockFilterHost<Demuxer>(&pipeline, demuxer)); | 185 filter_host.reset(new MockFilterHost<Demuxer>(&pipeline, demuxer)); |
186 EXPECT_FALSE(demuxer->Initialize(data_source)); | 186 EXPECT_FALSE(demuxer->Initialize(data_source)); |
187 EXPECT_FALSE(filter_host->IsInitialized()); | 187 EXPECT_FALSE(filter_host->IsInitialized()); |
188 EXPECT_EQ(DEMUXER_ERROR_NO_SUPPORTED_STREAMS, pipeline.GetError()); | 188 EXPECT_EQ(DEMUXER_ERROR_NO_SUPPORTED_STREAMS, pipeline.GetError()); |
189 | 189 |
190 // Simulate media with a data stream but no audio or video streams. | 190 // Simulate media with a data stream but no audio or video streams. |
191 g_format.nb_streams = 1; | 191 g_format.nb_streams = 1; |
192 g_format.streams[0] = &g_streams[0]; | 192 g_format.streams[0] = &g_streams[0]; |
193 g_streams[0].codec = &g_data_codec; | 193 g_streams[0].codec = &g_data_codec; |
194 g_streams[0].duration = 10; | 194 g_streams[0].duration = 10; |
195 demuxer = factory->Create<Demuxer>(&media_format); | 195 demuxer = factory->Create<Demuxer>(media_format); |
196 filter_host.reset(new MockFilterHost<Demuxer>(&pipeline, demuxer)); | 196 filter_host.reset(new MockFilterHost<Demuxer>(&pipeline, demuxer)); |
197 EXPECT_FALSE(demuxer->Initialize(data_source)); | 197 EXPECT_FALSE(demuxer->Initialize(data_source)); |
198 EXPECT_FALSE(filter_host->IsInitialized()); | 198 EXPECT_FALSE(filter_host->IsInitialized()); |
199 EXPECT_EQ(DEMUXER_ERROR_NO_SUPPORTED_STREAMS, pipeline.GetError()); | 199 EXPECT_EQ(DEMUXER_ERROR_NO_SUPPORTED_STREAMS, pipeline.GetError()); |
200 } | 200 } |
201 | 201 |
202 TEST(FFmpegDemuxerTest, InitializeStreams) { | 202 TEST(FFmpegDemuxerTest, InitializeStreams) { |
203 // Simulate media with a data stream, a video stream and audio stream. | 203 // Simulate media with a data stream, a video stream and audio stream. |
204 InitializeFFmpegMocks(); | 204 InitializeFFmpegMocks(); |
205 g_format.nb_streams = 3; | 205 g_format.nb_streams = 3; |
(...skipping 13 matching lines...) Expand all Loading... |
219 // Create our data source. | 219 // Create our data source. |
220 MockFilterConfig config; | 220 MockFilterConfig config; |
221 scoped_refptr<MockDataSource> data_source = new MockDataSource(&config); | 221 scoped_refptr<MockDataSource> data_source = new MockDataSource(&config); |
222 MockFilterHost<DataSource> filter_host_a(&pipeline, data_source); | 222 MockFilterHost<DataSource> filter_host_a(&pipeline, data_source); |
223 EXPECT_TRUE(data_source->Initialize("foo")); | 223 EXPECT_TRUE(data_source->Initialize("foo")); |
224 EXPECT_TRUE(filter_host_a.IsInitialized()); | 224 EXPECT_TRUE(filter_host_a.IsInitialized()); |
225 | 225 |
226 // Create our demuxer. | 226 // Create our demuxer. |
227 scoped_refptr<FilterFactory> factory = FFmpegDemuxer::CreateFilterFactory(); | 227 scoped_refptr<FilterFactory> factory = FFmpegDemuxer::CreateFilterFactory(); |
228 scoped_refptr<Demuxer> demuxer | 228 scoped_refptr<Demuxer> demuxer |
229 = factory->Create<Demuxer>(data_source->GetMediaFormat()); | 229 = factory->Create<Demuxer>(data_source->media_format()); |
230 EXPECT_TRUE(demuxer); | 230 EXPECT_TRUE(demuxer); |
231 MockFilterHost<Demuxer> filter_host_b(&pipeline, demuxer); | 231 MockFilterHost<Demuxer> filter_host_b(&pipeline, demuxer); |
232 EXPECT_TRUE(demuxer->Initialize(data_source)); | 232 EXPECT_TRUE(demuxer->Initialize(data_source)); |
233 EXPECT_TRUE(filter_host_b.IsInitialized()); | 233 EXPECT_TRUE(filter_host_b.IsInitialized()); |
234 EXPECT_EQ(PIPELINE_OK, pipeline.GetError()); | 234 EXPECT_EQ(PIPELINE_OK, pipeline.GetError()); |
235 | 235 |
236 // Since we ignore data streams, the duration should be equal to the video | 236 // Since we ignore data streams, the duration should be equal to the video |
237 // stream's duration. | 237 // stream's duration. |
238 EXPECT_EQ(g_streams[1].duration, pipeline.GetDuration().InMicroseconds()); | 238 EXPECT_EQ(g_streams[1].duration, pipeline.GetDuration().InMicroseconds()); |
239 | 239 |
240 // Verify that 2 out of 3 streams were created. | 240 // Verify that 2 out of 3 streams were created. |
241 EXPECT_EQ(2, demuxer->GetNumberOfStreams()); | 241 EXPECT_EQ(2, demuxer->GetNumberOfStreams()); |
242 | 242 |
243 // First stream should be video. | 243 // First stream should be video. |
244 scoped_refptr<DemuxerStream> stream = demuxer->GetStream(0); | 244 scoped_refptr<DemuxerStream> stream = demuxer->GetStream(0); |
245 ASSERT_TRUE(stream); | 245 ASSERT_TRUE(stream); |
246 const MediaFormat* stream_format = stream->GetMediaFormat(); | |
247 std::string mime_type; | 246 std::string mime_type; |
248 int result; | 247 int result; |
249 EXPECT_TRUE(stream_format->GetAsString(MediaFormat::kMimeType, &mime_type)); | 248 EXPECT_TRUE( |
| 249 stream->media_format().GetAsString(MediaFormat::kMimeType, &mime_type)); |
250 EXPECT_STREQ(mime_type::kFFmpegVideo, mime_type.c_str()); | 250 EXPECT_STREQ(mime_type::kFFmpegVideo, mime_type.c_str()); |
251 EXPECT_TRUE(stream_format->GetAsInteger(kFFmpegCodecID, &result)); | 251 EXPECT_TRUE( |
| 252 stream->media_format().GetAsInteger(kFFmpegCodecID, &result)); |
252 EXPECT_EQ(CODEC_ID_THEORA, static_cast<CodecID>(result)); | 253 EXPECT_EQ(CODEC_ID_THEORA, static_cast<CodecID>(result)); |
253 EXPECT_TRUE(stream_format->GetAsInteger(MediaFormat::kHeight, &result)); | 254 EXPECT_TRUE( |
| 255 stream->media_format().GetAsInteger(MediaFormat::kHeight, &result)); |
254 EXPECT_EQ(g_video_codec.height, result); | 256 EXPECT_EQ(g_video_codec.height, result); |
255 EXPECT_TRUE(stream_format->GetAsInteger(MediaFormat::kWidth, &result)); | 257 EXPECT_TRUE( |
| 258 stream->media_format().GetAsInteger(MediaFormat::kWidth, &result)); |
256 EXPECT_EQ(g_video_codec.width, result); | 259 EXPECT_EQ(g_video_codec.width, result); |
257 | 260 |
258 // Second stream should be audio. | 261 // Second stream should be audio. |
259 stream = demuxer->GetStream(1); | 262 stream = demuxer->GetStream(1); |
260 ASSERT_TRUE(stream); | 263 ASSERT_TRUE(stream); |
261 stream_format = stream->GetMediaFormat(); | 264 EXPECT_TRUE( |
262 EXPECT_TRUE(stream_format->GetAsString(MediaFormat::kMimeType, &mime_type)); | 265 stream->media_format().GetAsString(MediaFormat::kMimeType, &mime_type)); |
263 EXPECT_STREQ(mime_type::kFFmpegAudio, mime_type.c_str()); | 266 EXPECT_STREQ(mime_type::kFFmpegAudio, mime_type.c_str()); |
264 EXPECT_TRUE(stream_format->GetAsInteger(kFFmpegCodecID, &result)); | 267 EXPECT_TRUE( |
| 268 stream->media_format().GetAsInteger(kFFmpegCodecID, &result)); |
265 EXPECT_EQ(CODEC_ID_VORBIS, static_cast<CodecID>(result)); | 269 EXPECT_EQ(CODEC_ID_VORBIS, static_cast<CodecID>(result)); |
266 EXPECT_TRUE(stream_format->GetAsInteger(MediaFormat::kChannels, &result)); | 270 EXPECT_TRUE( |
| 271 stream->media_format().GetAsInteger(MediaFormat::kChannels, &result)); |
267 EXPECT_EQ(g_audio_codec.channels, result); | 272 EXPECT_EQ(g_audio_codec.channels, result); |
268 EXPECT_TRUE(stream_format->GetAsInteger(MediaFormat::kSampleRate, &result)); | 273 EXPECT_TRUE( |
| 274 stream->media_format().GetAsInteger(MediaFormat::kSampleRate, &result)); |
269 EXPECT_EQ(g_audio_codec.sample_rate, result); | 275 EXPECT_EQ(g_audio_codec.sample_rate, result); |
270 } | 276 } |
271 | 277 |
272 TEST(FFmpegDemuxerTest, Read) { | 278 TEST(FFmpegDemuxerTest, Read) { |
273 // Prepare some test data. | 279 // Prepare some test data. |
274 const int kAudio = 0; | 280 const int kAudio = 0; |
275 const int kVideo = 1; | 281 const int kVideo = 1; |
276 const size_t kDataSize = 4; | 282 const size_t kDataSize = 4; |
277 uint8 audio_data[kDataSize] = {0, 1, 2, 3}; | 283 uint8 audio_data[kDataSize] = {0, 1, 2, 3}; |
278 uint8 video_data[kDataSize] = {4, 5, 6, 7}; | 284 uint8 video_data[kDataSize] = {4, 5, 6, 7}; |
(...skipping 14 matching lines...) Expand all Loading... |
293 // Create our data source. | 299 // Create our data source. |
294 MockFilterConfig config; | 300 MockFilterConfig config; |
295 scoped_refptr<MockDataSource> data_source = new MockDataSource(&config); | 301 scoped_refptr<MockDataSource> data_source = new MockDataSource(&config); |
296 MockFilterHost<DataSource> filter_host_a(&pipeline, data_source); | 302 MockFilterHost<DataSource> filter_host_a(&pipeline, data_source); |
297 EXPECT_TRUE(data_source->Initialize("foo")); | 303 EXPECT_TRUE(data_source->Initialize("foo")); |
298 EXPECT_TRUE(filter_host_a.IsInitialized()); | 304 EXPECT_TRUE(filter_host_a.IsInitialized()); |
299 | 305 |
300 // Create our demuxer. | 306 // Create our demuxer. |
301 scoped_refptr<FilterFactory> factory = FFmpegDemuxer::CreateFilterFactory(); | 307 scoped_refptr<FilterFactory> factory = FFmpegDemuxer::CreateFilterFactory(); |
302 scoped_refptr<Demuxer> demuxer | 308 scoped_refptr<Demuxer> demuxer |
303 = factory->Create<Demuxer>(data_source->GetMediaFormat()); | 309 = factory->Create<Demuxer>(data_source->media_format()); |
304 EXPECT_TRUE(demuxer); | 310 EXPECT_TRUE(demuxer); |
305 MockFilterHost<Demuxer> filter_host_b(&pipeline, demuxer); | 311 MockFilterHost<Demuxer> filter_host_b(&pipeline, demuxer); |
306 EXPECT_TRUE(demuxer->Initialize(data_source)); | 312 EXPECT_TRUE(demuxer->Initialize(data_source)); |
307 EXPECT_TRUE(filter_host_b.IsInitialized()); | 313 EXPECT_TRUE(filter_host_b.IsInitialized()); |
308 EXPECT_EQ(PIPELINE_OK, pipeline.GetError()); | 314 EXPECT_EQ(PIPELINE_OK, pipeline.GetError()); |
309 | 315 |
310 // Verify both streams were created. | 316 // Verify both streams were created. |
311 EXPECT_EQ(2, demuxer->GetNumberOfStreams()); | 317 EXPECT_EQ(2, demuxer->GetNumberOfStreams()); |
312 | 318 |
313 // Get our streams. | 319 // Get our streams. |
(...skipping 14 matching lines...) Expand all Loading... |
328 g_packet.stream_index = kAudio; | 334 g_packet.stream_index = kAudio; |
329 g_packet.data = audio_data; | 335 g_packet.data = audio_data; |
330 g_packet.size = kDataSize; | 336 g_packet.size = kDataSize; |
331 | 337 |
332 // Attempt a read from the audio stream and run the message loop until done. | 338 // Attempt a read from the audio stream and run the message loop until done. |
333 scoped_refptr<TestBuffer> buffer(new TestBuffer()); | 339 scoped_refptr<TestBuffer> buffer(new TestBuffer()); |
334 audio_stream->Read(buffer); | 340 audio_stream->Read(buffer); |
335 pipeline.RunAllTasks(); | 341 pipeline.RunAllTasks(); |
336 EXPECT_TRUE(buffer->assigned()); | 342 EXPECT_TRUE(buffer->assigned()); |
337 EXPECT_TRUE(buffer->buffer()); | 343 EXPECT_TRUE(buffer->buffer()); |
338 EXPECT_EQ(audio_data, (uint8*)buffer->buffer()->GetData()); | 344 EXPECT_EQ(audio_data, buffer->buffer()->GetData()); |
339 EXPECT_EQ(kDataSize, buffer->buffer()->GetDataSize()); | 345 EXPECT_EQ(kDataSize, buffer->buffer()->GetDataSize()); |
340 | 346 |
341 // Prepare our test video packet. | 347 // Prepare our test video packet. |
342 g_packet.stream_index = kVideo; | 348 g_packet.stream_index = kVideo; |
343 g_packet.data = video_data; | 349 g_packet.data = video_data; |
344 g_packet.size = kDataSize; | 350 g_packet.size = kDataSize; |
345 | 351 |
346 // Attempt a read from the video stream and run the message loop until done. | 352 // Attempt a read from the video stream and run the message loop until done. |
347 buffer = new TestBuffer(); | 353 buffer = new TestBuffer(); |
348 video_stream->Read(buffer); | 354 video_stream->Read(buffer); |
349 pipeline.RunAllTasks(); | 355 pipeline.RunAllTasks(); |
350 EXPECT_TRUE(buffer->assigned()); | 356 EXPECT_TRUE(buffer->assigned()); |
351 EXPECT_TRUE(buffer->buffer()); | 357 EXPECT_TRUE(buffer->buffer()); |
352 EXPECT_EQ(video_data, (uint8*)buffer->buffer()->GetData()); | 358 EXPECT_EQ(video_data, buffer->buffer()->GetData()); |
353 EXPECT_EQ(kDataSize, buffer->buffer()->GetDataSize()); | 359 EXPECT_EQ(kDataSize, buffer->buffer()->GetDataSize()); |
354 | 360 |
355 // Simulate end of stream. | 361 // Simulate end of stream. |
356 g_av_read_frame = AVERROR_IO; | 362 g_av_read_frame = AVERROR_IO; |
357 | 363 |
358 // Attempt a read from the audio stream and run the message loop until done. | 364 // Attempt a read from the audio stream and run the message loop until done. |
359 buffer = new TestBuffer(); | 365 buffer = new TestBuffer(); |
360 audio_stream->Read(buffer); | 366 audio_stream->Read(buffer); |
361 pipeline.RunAllTasks(); | 367 pipeline.RunAllTasks(); |
362 EXPECT_FALSE(buffer->assigned()); | 368 EXPECT_FALSE(buffer->assigned()); |
363 EXPECT_FALSE(buffer->buffer()); | 369 EXPECT_FALSE(buffer->buffer()); |
364 | 370 |
365 // Manually release buffer, which should release any remaining AVPackets. | 371 // Manually release buffer, which should release any remaining AVPackets. |
366 buffer = NULL; | 372 buffer = NULL; |
367 EXPECT_EQ(0, g_oustanding_packets); | 373 EXPECT_EQ(0, g_oustanding_packets); |
368 } | 374 } |
OLD | NEW |