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