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

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

Issue 100085: Adds a second vector of streams to FFmpegDemuxer to handle re-mapped audio/video streams. (Closed)
Patch Set: Created 11 years, 7 months 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
« no previous file with comments | « media/filters/ffmpeg_demuxer.cc ('k') | no next file » | 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) 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
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
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
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
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 }
OLDNEW
« no previous file with comments | « media/filters/ffmpeg_demuxer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698