| 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 |