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 "base/singleton.h" | 7 #include "base/singleton.h" |
8 #include "base/tuple.h" | 8 #include "base/tuple.h" |
9 #include "media/base/filter_host.h" | 9 #include "media/base/filter_host.h" |
10 #include "media/base/filters.h" | 10 #include "media/base/filters.h" |
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
402 EXPECT_EQ(&g_streams[2], ffmpeg_demuxer_stream->av_stream()); | 402 EXPECT_EQ(&g_streams[2], ffmpeg_demuxer_stream->av_stream()); |
403 } | 403 } |
404 | 404 |
405 // TODO(scherkus): as we keep refactoring and improving our mocks (both FFmpeg | 405 // TODO(scherkus): as we keep refactoring and improving our mocks (both FFmpeg |
406 // and pipeline/filters), try to break this test into two. Big issue right now | 406 // and pipeline/filters), try to break this test into two. Big issue right now |
407 // is that it takes ~50 lines of code just to set up FFmpegDemuxer. | 407 // is that it takes ~50 lines of code just to set up FFmpegDemuxer. |
408 // | 408 // |
409 // TODO(scherkus): http://crbug.com/10863 | 409 // TODO(scherkus): http://crbug.com/10863 |
410 TEST(FFmpegDemuxerTest, DISABLED_ReadAndSeek) { | 410 TEST(FFmpegDemuxerTest, DISABLED_ReadAndSeek) { |
411 // Prepare some test data. | 411 // Prepare some test data. |
| 412 const int kPacketData = 0; |
| 413 const int kPacketAudio = 1; |
| 414 const int kPacketVideo = 2; |
412 const int kAudio = 0; | 415 const int kAudio = 0; |
413 const int kVideo = 1; | 416 const int kVideo = 1; |
414 const size_t kDataSize = 4; | 417 const size_t kDataSize = 4; |
415 uint8 audio_data[kDataSize] = {0, 1, 2, 3}; | 418 uint8 audio_data[kDataSize] = {0, 1, 2, 3}; |
416 uint8 video_data[kDataSize] = {4, 5, 6, 7}; | 419 uint8 video_data[kDataSize] = {4, 5, 6, 7}; |
417 | 420 |
418 // Simulate media with a an audio stream and video stream. | 421 // Simulate media with a data stream, audio stream and video stream. Having |
| 422 // the data stream first forces the audio and video streams to get remapped |
| 423 // from indices {1,2} to {0,1} respectively, which covers an important test |
| 424 // case. |
419 InitializeFFmpegMocks(); | 425 InitializeFFmpegMocks(); |
420 g_format.nb_streams = 2; | 426 g_format.nb_streams = 3; |
421 g_format.streams[kAudio] = &g_streams[kAudio]; | 427 g_format.streams[kPacketData] = &g_streams[0]; |
422 g_format.streams[kVideo] = &g_streams[kVideo]; | 428 g_format.streams[kPacketAudio] = &g_streams[1]; |
423 g_streams[kAudio].duration = 10; | 429 g_format.streams[kPacketVideo] = &g_streams[2]; |
424 g_streams[kAudio].codec = &g_audio_codec; | 430 g_streams[0].duration = 10; |
425 g_streams[kVideo].duration = 10; | 431 g_streams[0].codec = &g_data_codec; |
426 g_streams[kVideo].codec = &g_video_codec; | 432 g_streams[1].duration = 10; |
| 433 g_streams[1].codec = &g_audio_codec; |
| 434 g_streams[2].duration = 10; |
| 435 g_streams[2].codec = &g_video_codec; |
427 | 436 |
428 // Create our pipeline. | 437 // Create our pipeline. |
429 MockPipeline pipeline; | 438 MockPipeline pipeline; |
430 | 439 |
431 // Create our data source. | 440 // Create our data source. |
432 MockFilterConfig config; | 441 MockFilterConfig config; |
433 scoped_refptr<MockDataSource> data_source = new MockDataSource(&config); | 442 scoped_refptr<MockDataSource> data_source = new MockDataSource(&config); |
434 MockFilterHost<DataSource> filter_host_a(&pipeline, data_source); | 443 MockFilterHost<DataSource> filter_host_a(&pipeline, data_source); |
435 EXPECT_TRUE(data_source->Initialize("foo")); | 444 EXPECT_TRUE(data_source->Initialize("foo")); |
436 EXPECT_TRUE(filter_host_a.IsInitialized()); | 445 EXPECT_TRUE(filter_host_a.IsInitialized()); |
(...skipping 11 matching lines...) Expand all Loading... |
448 | 457 |
449 // Verify both streams were created. | 458 // Verify both streams were created. |
450 EXPECT_EQ(2, demuxer->GetNumberOfStreams()); | 459 EXPECT_EQ(2, demuxer->GetNumberOfStreams()); |
451 | 460 |
452 // Get our streams. | 461 // Get our streams. |
453 scoped_refptr<DemuxerStream> audio_stream = demuxer->GetStream(kAudio); | 462 scoped_refptr<DemuxerStream> audio_stream = demuxer->GetStream(kAudio); |
454 scoped_refptr<DemuxerStream> video_stream = demuxer->GetStream(kVideo); | 463 scoped_refptr<DemuxerStream> video_stream = demuxer->GetStream(kVideo); |
455 ASSERT_TRUE(audio_stream); | 464 ASSERT_TRUE(audio_stream); |
456 ASSERT_TRUE(video_stream); | 465 ASSERT_TRUE(video_stream); |
457 | 466 |
| 467 // Prepare data packets, which should all get immediately released. |
| 468 PacketQueue::get()->Enqueue(kPacketData, kDataSize, audio_data); |
| 469 PacketQueue::get()->Enqueue(kPacketData, kDataSize, audio_data); |
| 470 PacketQueue::get()->Enqueue(kPacketData, kDataSize, audio_data); |
| 471 |
458 // Prepare our test audio packet. | 472 // Prepare our test audio packet. |
459 PacketQueue::get()->Enqueue(kAudio, kDataSize, audio_data); | 473 PacketQueue::get()->Enqueue(kPacketAudio, kDataSize, audio_data); |
460 | 474 |
461 // Attempt a read from the audio stream and run the message loop until done. | 475 // Attempt a read from the audio stream and run the message loop until done. |
462 scoped_refptr<TestReader> reader(new TestReader()); | 476 scoped_refptr<TestReader> reader(new TestReader()); |
463 reader->Read(audio_stream); | 477 reader->Read(audio_stream); |
464 pipeline.RunAllTasks(); | 478 pipeline.RunAllTasks(); |
465 EXPECT_TRUE(reader->WaitForRead()); | 479 EXPECT_TRUE(reader->WaitForRead()); |
466 EXPECT_TRUE(reader->called()); | 480 EXPECT_TRUE(reader->called()); |
467 ASSERT_TRUE(reader->buffer()); | 481 ASSERT_TRUE(reader->buffer()); |
468 EXPECT_FALSE(reader->buffer()->IsDiscontinuous()); | 482 EXPECT_FALSE(reader->buffer()->IsDiscontinuous()); |
469 EXPECT_EQ(audio_data, reader->buffer()->GetData()); | 483 EXPECT_EQ(audio_data, reader->buffer()->GetData()); |
470 EXPECT_EQ(kDataSize, reader->buffer()->GetDataSize()); | 484 EXPECT_EQ(kDataSize, reader->buffer()->GetDataSize()); |
471 | 485 |
472 // Prepare our test video packet. | 486 // Prepare our test video packet. |
473 PacketQueue::get()->Enqueue(kVideo, kDataSize, video_data); | 487 PacketQueue::get()->Enqueue(kPacketVideo, kDataSize, video_data); |
474 | 488 |
475 // Attempt a read from the video stream and run the message loop until done. | 489 // Attempt a read from the video stream and run the message loop until done. |
476 reader->Reset(); | 490 reader->Reset(); |
477 reader->Read(video_stream); | 491 reader->Read(video_stream); |
478 pipeline.RunAllTasks(); | 492 pipeline.RunAllTasks(); |
479 EXPECT_TRUE(reader->WaitForRead()); | 493 EXPECT_TRUE(reader->WaitForRead()); |
480 EXPECT_TRUE(reader->called()); | 494 EXPECT_TRUE(reader->called()); |
481 ASSERT_TRUE(reader->buffer()); | 495 ASSERT_TRUE(reader->buffer()); |
482 EXPECT_FALSE(reader->buffer()->IsDiscontinuous()); | 496 EXPECT_FALSE(reader->buffer()->IsDiscontinuous()); |
483 EXPECT_EQ(video_data, reader->buffer()->GetData()); | 497 EXPECT_EQ(video_data, reader->buffer()->GetData()); |
(...skipping 11 matching lines...) Expand all Loading... |
495 // Let's trigger a simple forward seek with no outstanding packets. | 509 // Let's trigger a simple forward seek with no outstanding packets. |
496 g_expected_seek_timestamp = 1234; | 510 g_expected_seek_timestamp = 1234; |
497 g_expected_seek_flags = 0; | 511 g_expected_seek_flags = 0; |
498 demuxer->Seek(base::TimeDelta::FromMicroseconds(g_expected_seek_timestamp)); | 512 demuxer->Seek(base::TimeDelta::FromMicroseconds(g_expected_seek_timestamp)); |
499 EXPECT_TRUE(g_seek_event->TimedWait(base::TimeDelta::FromSeconds(1))); | 513 EXPECT_TRUE(g_seek_event->TimedWait(base::TimeDelta::FromSeconds(1))); |
500 | 514 |
501 // The next read from each stream should now be discontinuous, but subsequent | 515 // The next read from each stream should now be discontinuous, but subsequent |
502 // reads should not. | 516 // reads should not. |
503 | 517 |
504 // Prepare our test audio packet. | 518 // Prepare our test audio packet. |
505 PacketQueue::get()->Enqueue(kAudio, kDataSize, audio_data); | 519 PacketQueue::get()->Enqueue(kPacketAudio, kDataSize, audio_data); |
506 PacketQueue::get()->Enqueue(kAudio, kDataSize, audio_data); | 520 PacketQueue::get()->Enqueue(kPacketAudio, kDataSize, audio_data); |
507 | 521 |
508 // Audio read #1, should be discontinuous. | 522 // Audio read #1, should be discontinuous. |
509 reader = new TestReader(); | 523 reader = new TestReader(); |
510 reader->Read(audio_stream); | 524 reader->Read(audio_stream); |
511 pipeline.RunAllTasks(); | 525 pipeline.RunAllTasks(); |
512 EXPECT_TRUE(reader->WaitForRead()); | 526 EXPECT_TRUE(reader->WaitForRead()); |
513 EXPECT_TRUE(reader->called()); | 527 EXPECT_TRUE(reader->called()); |
514 ASSERT_TRUE(reader->buffer()); | 528 ASSERT_TRUE(reader->buffer()); |
515 EXPECT_TRUE(reader->buffer()->IsDiscontinuous()); | 529 EXPECT_TRUE(reader->buffer()->IsDiscontinuous()); |
516 EXPECT_EQ(audio_data, reader->buffer()->GetData()); | 530 EXPECT_EQ(audio_data, reader->buffer()->GetData()); |
517 EXPECT_EQ(kDataSize, reader->buffer()->GetDataSize()); | 531 EXPECT_EQ(kDataSize, reader->buffer()->GetDataSize()); |
518 | 532 |
519 // Audio read #2, should not be discontinuous. | 533 // Audio read #2, should not be discontinuous. |
520 reader->Reset(); | 534 reader->Reset(); |
521 reader->Read(audio_stream); | 535 reader->Read(audio_stream); |
522 pipeline.RunAllTasks(); | 536 pipeline.RunAllTasks(); |
523 EXPECT_TRUE(reader->WaitForRead()); | 537 EXPECT_TRUE(reader->WaitForRead()); |
524 EXPECT_TRUE(reader->called()); | 538 EXPECT_TRUE(reader->called()); |
525 ASSERT_TRUE(reader->buffer()); | 539 ASSERT_TRUE(reader->buffer()); |
526 EXPECT_FALSE(reader->buffer()->IsDiscontinuous()); | 540 EXPECT_FALSE(reader->buffer()->IsDiscontinuous()); |
527 EXPECT_EQ(audio_data, reader->buffer()->GetData()); | 541 EXPECT_EQ(audio_data, reader->buffer()->GetData()); |
528 EXPECT_EQ(kDataSize, reader->buffer()->GetDataSize()); | 542 EXPECT_EQ(kDataSize, reader->buffer()->GetDataSize()); |
529 | 543 |
530 // Prepare our test video packet. | 544 // Prepare our test video packet. |
531 PacketQueue::get()->Enqueue(kVideo, kDataSize, video_data); | 545 PacketQueue::get()->Enqueue(kPacketVideo, kDataSize, video_data); |
532 PacketQueue::get()->Enqueue(kVideo, kDataSize, video_data); | 546 PacketQueue::get()->Enqueue(kPacketVideo, kDataSize, video_data); |
533 | 547 |
534 // Video read #1, should be discontinuous. | 548 // Video read #1, should be discontinuous. |
535 reader->Reset(); | 549 reader->Reset(); |
536 reader->Read(video_stream); | 550 reader->Read(video_stream); |
537 pipeline.RunAllTasks(); | 551 pipeline.RunAllTasks(); |
538 EXPECT_TRUE(reader->WaitForRead()); | 552 EXPECT_TRUE(reader->WaitForRead()); |
539 EXPECT_TRUE(reader->called()); | 553 EXPECT_TRUE(reader->called()); |
540 ASSERT_TRUE(reader->buffer()); | 554 ASSERT_TRUE(reader->buffer()); |
541 EXPECT_TRUE(reader->buffer()->IsDiscontinuous()); | 555 EXPECT_TRUE(reader->buffer()->IsDiscontinuous()); |
542 EXPECT_EQ(video_data, reader->buffer()->GetData()); | 556 EXPECT_EQ(video_data, reader->buffer()->GetData()); |
543 EXPECT_EQ(kDataSize, reader->buffer()->GetDataSize()); | 557 EXPECT_EQ(kDataSize, reader->buffer()->GetDataSize()); |
544 | 558 |
545 // Video read #2, should not be discontinuous. | 559 // Video read #2, should not be discontinuous. |
546 reader->Reset(); | 560 reader->Reset(); |
547 reader->Read(video_stream); | 561 reader->Read(video_stream); |
548 pipeline.RunAllTasks(); | 562 pipeline.RunAllTasks(); |
549 EXPECT_TRUE(reader->WaitForRead()); | 563 EXPECT_TRUE(reader->WaitForRead()); |
550 EXPECT_TRUE(reader->called()); | 564 EXPECT_TRUE(reader->called()); |
551 ASSERT_TRUE(reader->buffer()); | 565 ASSERT_TRUE(reader->buffer()); |
552 EXPECT_FALSE(reader->buffer()->IsDiscontinuous()); | 566 EXPECT_FALSE(reader->buffer()->IsDiscontinuous()); |
553 EXPECT_EQ(video_data, reader->buffer()->GetData()); | 567 EXPECT_EQ(video_data, reader->buffer()->GetData()); |
554 EXPECT_EQ(kDataSize, reader->buffer()->GetDataSize()); | 568 EXPECT_EQ(kDataSize, reader->buffer()->GetDataSize()); |
555 | 569 |
556 // Manually release buffer, which should release any remaining AVPackets. | 570 // Manually release buffer, which should release any remaining AVPackets. |
557 reader = NULL; | 571 reader = NULL; |
558 EXPECT_TRUE(PacketQueue::get()->WaitForOutstandingPackets(0)); | 572 EXPECT_TRUE(PacketQueue::get()->WaitForOutstandingPackets(0)); |
559 | 573 |
560 // Let's trigger another simple forward seek, but with outstanding packets. | 574 // Let's trigger another simple forward seek, but with outstanding packets. |
561 // The outstanding packets should get freed after the Seek() is issued. | 575 // The outstanding packets should get freed after the Seek() is issued. |
562 PacketQueue::get()->Enqueue(kAudio, kDataSize, audio_data); | 576 PacketQueue::get()->Enqueue(kPacketAudio, kDataSize, audio_data); |
563 PacketQueue::get()->Enqueue(kAudio, kDataSize, audio_data); | 577 PacketQueue::get()->Enqueue(kPacketAudio, kDataSize, audio_data); |
564 PacketQueue::get()->Enqueue(kAudio, kDataSize, audio_data); | 578 PacketQueue::get()->Enqueue(kPacketAudio, kDataSize, audio_data); |
565 PacketQueue::get()->Enqueue(kVideo, kDataSize, video_data); | 579 PacketQueue::get()->Enqueue(kPacketVideo, kDataSize, video_data); |
566 | 580 |
567 // Attempt a read from video stream, which will force the demuxer to queue | 581 // Attempt a read from video stream, which will force the demuxer to queue |
568 // the audio packets preceding the video packet. | 582 // the audio packets preceding the video packet. |
569 reader = new TestReader(); | 583 reader = new TestReader(); |
570 reader->Read(video_stream); | 584 reader->Read(video_stream); |
571 pipeline.RunAllTasks(); | 585 pipeline.RunAllTasks(); |
572 EXPECT_TRUE(reader->WaitForRead()); | 586 EXPECT_TRUE(reader->WaitForRead()); |
573 EXPECT_TRUE(reader->called()); | 587 EXPECT_TRUE(reader->called()); |
574 ASSERT_TRUE(reader->buffer()); | 588 ASSERT_TRUE(reader->buffer()); |
575 EXPECT_FALSE(reader->buffer()->IsDiscontinuous()); | 589 EXPECT_FALSE(reader->buffer()->IsDiscontinuous()); |
(...skipping 28 matching lines...) Expand all Loading... |
604 reader->Read(audio_stream); | 618 reader->Read(audio_stream); |
605 pipeline.RunAllTasks(); | 619 pipeline.RunAllTasks(); |
606 EXPECT_FALSE(reader->WaitForRead()); | 620 EXPECT_FALSE(reader->WaitForRead()); |
607 EXPECT_FALSE(reader->called()); | 621 EXPECT_FALSE(reader->called()); |
608 EXPECT_FALSE(reader->buffer()); | 622 EXPECT_FALSE(reader->buffer()); |
609 | 623 |
610 // Manually release buffer, which should release any remaining AVPackets. | 624 // Manually release buffer, which should release any remaining AVPackets. |
611 reader = NULL; | 625 reader = NULL; |
612 EXPECT_TRUE(PacketQueue::get()->WaitForOutstandingPackets(0)); | 626 EXPECT_TRUE(PacketQueue::get()->WaitForOutstandingPackets(0)); |
613 } | 627 } |
OLD | NEW |