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

Side by Side Diff: media/base/audio_splicer_unittest.cc

Issue 240123004: Simplify AudioSplicer logic which slots buffers before or after a splice point. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 8 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "base/memory/scoped_ptr.h" 5 #include "base/memory/scoped_ptr.h"
6 #include "media/base/audio_buffer.h" 6 #include "media/base/audio_buffer.h"
7 #include "media/base/audio_bus.h" 7 #include "media/base/audio_bus.h"
8 #include "media/base/audio_splicer.h" 8 #include "media/base/audio_splicer.h"
9 #include "media/base/audio_timestamp_helper.h" 9 #include "media/base/audio_timestamp_helper.h"
10 #include "media/base/buffers.h" 10 #include "media/base/buffers.h"
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 // |extra_pre_splice_buffer| is entirely before the splice and should be ready 425 // |extra_pre_splice_buffer| is entirely before the splice and should be ready
426 // for output. 426 // for output.
427 EXPECT_TRUE(AddInput(extra_pre_splice_buffer)); 427 EXPECT_TRUE(AddInput(extra_pre_splice_buffer));
428 VerifyNextBuffer(extra_pre_splice_buffer); 428 VerifyNextBuffer(extra_pre_splice_buffer);
429 429
430 // The splicer should be internally queuing input since |overlapped_buffer| is 430 // The splicer should be internally queuing input since |overlapped_buffer| is
431 // part of the splice. 431 // part of the splice.
432 EXPECT_TRUE(AddInput(overlapped_buffer)); 432 EXPECT_TRUE(AddInput(overlapped_buffer));
433 EXPECT_FALSE(splicer_.HasNextBuffer()); 433 EXPECT_FALSE(splicer_.HasNextBuffer());
434 434
435 // Even though |overlapping_buffer| completes the splice, one extra buffer is 435 // |overlapping_buffer| completes the splice.
436 // required to confirm it's actually a splice. 436 splicer_.SetSpliceTimestamp(kNoTimestamp());
437 EXPECT_TRUE(AddInput(overlapping_buffer)); 437 EXPECT_TRUE(AddInput(overlapping_buffer));
438 EXPECT_FALSE(splicer_.HasNextBuffer()); 438 EXPECT_TRUE(splicer_.HasNextBuffer());
439 439
440 // Add one more buffer to make sure it's passed through untouched. 440 // Add one more buffer to make sure it's passed through untouched.
441 scoped_refptr<AudioBuffer> extra_post_splice_buffer = 441 scoped_refptr<AudioBuffer> extra_post_splice_buffer =
442 GetNextInputBuffer(0.5f, kBufferSize); 442 GetNextInputBuffer(0.5f, kBufferSize);
443 EXPECT_TRUE(AddInput(extra_post_splice_buffer)); 443 EXPECT_TRUE(AddInput(extra_post_splice_buffer));
444 444
445 VerifyPreSpliceOutput(overlapped_buffer, 445 VerifyPreSpliceOutput(overlapped_buffer,
446 overlapping_buffer, 446 overlapping_buffer,
447 221, 447 221,
448 base::TimeDelta::FromMicroseconds(5012)); 448 base::TimeDelta::FromMicroseconds(5012));
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 scoped_refptr<AudioBuffer> overlapping_buffer = 502 scoped_refptr<AudioBuffer> overlapping_buffer =
503 GetNextInputBuffer(0.0f, kCrossfadeSize / 3); 503 GetNextInputBuffer(0.0f, kCrossfadeSize / 3);
504 504
505 // The splicer should be internally queuing input since |overlapped_buffer| is 505 // The splicer should be internally queuing input since |overlapped_buffer| is
506 // part of the splice. 506 // part of the splice.
507 EXPECT_TRUE(AddInput(overlapped_buffer)); 507 EXPECT_TRUE(AddInput(overlapped_buffer));
508 EXPECT_FALSE(splicer_.HasNextBuffer()); 508 EXPECT_FALSE(splicer_.HasNextBuffer());
509 509
510 // |overlapping_buffer| should not have enough data to complete the splice, so 510 // |overlapping_buffer| should not have enough data to complete the splice, so
511 // ensure output is not available. 511 // ensure output is not available.
512 splicer_.SetSpliceTimestamp(kNoTimestamp());
512 EXPECT_TRUE(AddInput(overlapping_buffer)); 513 EXPECT_TRUE(AddInput(overlapping_buffer));
513 EXPECT_FALSE(splicer_.HasNextBuffer()); 514 EXPECT_FALSE(splicer_.HasNextBuffer());
514 515
515 // Now add an EOS buffer which should complete the splice. 516 // Now add an EOS buffer which should complete the splice.
516 EXPECT_TRUE(AddInput(AudioBuffer::CreateEOSBuffer())); 517 EXPECT_TRUE(AddInput(AudioBuffer::CreateEOSBuffer()));
517 ASSERT_TRUE(splicer_.HasNextBuffer()); 518 ASSERT_TRUE(splicer_.HasNextBuffer());
518 519
519 VerifyPreSpliceOutput(overlapped_buffer, 520 VerifyPreSpliceOutput(overlapped_buffer,
520 overlapping_buffer, 521 overlapping_buffer,
521 331, 522 331,
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 input_timestamp_helper_.AddFrames(overlapped_buffer->frame_count() / 2); 562 input_timestamp_helper_.AddFrames(overlapped_buffer->frame_count() / 2);
562 splicer_.SetSpliceTimestamp(input_timestamp_helper_.GetTimestamp()); 563 splicer_.SetSpliceTimestamp(input_timestamp_helper_.GetTimestamp());
563 scoped_refptr<AudioBuffer> overlapping_buffer = 564 scoped_refptr<AudioBuffer> overlapping_buffer =
564 GetNextInputBuffer(0.0f, kCrossfadeSize * 2); 565 GetNextInputBuffer(0.0f, kCrossfadeSize * 2);
565 566
566 // The splicer should be internally queuing input since |overlapped_buffer| is 567 // The splicer should be internally queuing input since |overlapped_buffer| is
567 // part of the splice. 568 // part of the splice.
568 EXPECT_TRUE(AddInput(overlapped_buffer)); 569 EXPECT_TRUE(AddInput(overlapped_buffer));
569 EXPECT_FALSE(splicer_.HasNextBuffer()); 570 EXPECT_FALSE(splicer_.HasNextBuffer());
570 571
571 // Even though |overlapping_buffer| completes the splice, one extra buffer is 572 // |overlapping_buffer| completes the splice.
572 // required to confirm it's actually a splice. 573 splicer_.SetSpliceTimestamp(kNoTimestamp());
573 EXPECT_TRUE(AddInput(overlapping_buffer)); 574 EXPECT_TRUE(AddInput(overlapping_buffer));
574 EXPECT_FALSE(splicer_.HasNextBuffer()); 575 EXPECT_TRUE(splicer_.HasNextBuffer());
575
576 // Add an EOS buffer to complete the splice.
577 EXPECT_TRUE(AddInput(AudioBuffer::CreateEOSBuffer()));
578 ASSERT_TRUE(splicer_.HasNextBuffer());
579 576
580 const int kExpectedPreSpliceSize = 55; 577 const int kExpectedPreSpliceSize = 55;
581 const base::TimeDelta kExpectedPreSpliceDuration = 578 const base::TimeDelta kExpectedPreSpliceDuration =
582 base::TimeDelta::FromMicroseconds(1247); 579 base::TimeDelta::FromMicroseconds(1247);
583 VerifyPreSpliceOutput(overlapped_buffer, 580 VerifyPreSpliceOutput(overlapped_buffer,
584 overlapping_buffer, 581 overlapping_buffer,
585 kExpectedPreSpliceSize, 582 kExpectedPreSpliceSize,
586 kExpectedPreSpliceDuration); 583 kExpectedPreSpliceDuration);
587 VerifyCrossfadeOutput(overlapped_buffer, 584 VerifyCrossfadeOutput(overlapped_buffer,
588 NULL, 585 NULL,
589 overlapping_buffer, 586 overlapping_buffer,
590 0, 587 0,
591 kExpectedPreSpliceSize, 588 kExpectedPreSpliceSize,
592 kExpectedPreSpliceDuration); 589 kExpectedPreSpliceDuration);
593 590
594 // Retrieve the remaining portion after crossfade. 591 // Retrieve the remaining portion after crossfade.
595 ASSERT_TRUE(splicer_.HasNextBuffer()); 592 ASSERT_TRUE(splicer_.HasNextBuffer());
596 scoped_refptr<AudioBuffer> post_splice_output = splicer_.GetNextBuffer(); 593 scoped_refptr<AudioBuffer> post_splice_output = splicer_.GetNextBuffer();
597 EXPECT_EQ(overlapping_buffer->timestamp() + kExpectedPreSpliceDuration, 594 EXPECT_EQ(overlapping_buffer->timestamp() + kExpectedPreSpliceDuration,
598 post_splice_output->timestamp()); 595 post_splice_output->timestamp());
599 EXPECT_EQ(overlapping_buffer->frame_count() - kExpectedPreSpliceSize, 596 EXPECT_EQ(overlapping_buffer->frame_count() - kExpectedPreSpliceSize,
600 post_splice_output->frame_count()); 597 post_splice_output->frame_count());
601 EXPECT_EQ(overlapping_buffer->duration() - kExpectedPreSpliceDuration, 598 EXPECT_EQ(overlapping_buffer->duration() - kExpectedPreSpliceDuration,
602 post_splice_output->duration()); 599 post_splice_output->duration());
603 600
604 EXPECT_TRUE(VerifyData(post_splice_output, GetValue(overlapping_buffer))); 601 EXPECT_TRUE(VerifyData(post_splice_output, GetValue(overlapping_buffer)));
605
606 post_splice_output = splicer_.GetNextBuffer();
607 EXPECT_TRUE(post_splice_output->end_of_stream());
608
609 EXPECT_FALSE(splicer_.HasNextBuffer()); 602 EXPECT_FALSE(splicer_.HasNextBuffer());
610 } 603 }
611 604
612 // Test behavior when a splice frame is incorrectly marked and does not actually 605 // Test behavior when a splice frame is incorrectly marked and does not actually
613 // overlap. 606 // overlap.
614 // +----------+ 607 // +----------+
615 // |1111111111| 608 // |1111111111|
616 // +----------+ 609 // +----------+
617 // +--------------+ 610 // +--------------+
618 // |22222222222222| 611 // |22222222222222|
(...skipping 16 matching lines...) Expand all
635 scoped_refptr<AudioBuffer> second_buffer = 628 scoped_refptr<AudioBuffer> second_buffer =
636 GetNextInputBuffer(0.0f, kBufferSize); 629 GetNextInputBuffer(0.0f, kBufferSize);
637 630
638 // The splicer should be internally queuing input since |first_buffer| is part 631 // The splicer should be internally queuing input since |first_buffer| is part
639 // of the supposed splice. 632 // of the supposed splice.
640 EXPECT_TRUE(AddInput(first_buffer)); 633 EXPECT_TRUE(AddInput(first_buffer));
641 EXPECT_FALSE(splicer_.HasNextBuffer()); 634 EXPECT_FALSE(splicer_.HasNextBuffer());
642 635
643 // |second_buffer| should complete the supposed splice, so ensure output is 636 // |second_buffer| should complete the supposed splice, so ensure output is
644 // now available. 637 // now available.
638 splicer_.SetSpliceTimestamp(kNoTimestamp());
645 EXPECT_TRUE(AddInput(second_buffer)); 639 EXPECT_TRUE(AddInput(second_buffer));
646 ASSERT_TRUE(splicer_.HasNextBuffer()); 640 ASSERT_TRUE(splicer_.HasNextBuffer());
647 641
648 VerifyNextBuffer(first_buffer); 642 VerifyNextBuffer(first_buffer);
649 VerifyNextBuffer(second_buffer); 643 VerifyNextBuffer(second_buffer);
650 EXPECT_FALSE(splicer_.HasNextBuffer()); 644 EXPECT_FALSE(splicer_.HasNextBuffer());
651 } 645 }
652 646
653 // Test behavior when a splice frame is incorrectly marked and there is a gap 647 // Test behavior when a splice frame is incorrectly marked and there is a gap
654 // between whats in the pre splice and post splice. 648 // between whats in the pre splice and post splice.
(...skipping 21 matching lines...) Expand all
676 GetNextInputBuffer(0.0f, kBufferSize); 670 GetNextInputBuffer(0.0f, kBufferSize);
677 671
678 // The splicer should pass through the first buffer since it's not part of the 672 // The splicer should pass through the first buffer since it's not part of the
679 // splice. 673 // splice.
680 EXPECT_TRUE(AddInput(first_buffer)); 674 EXPECT_TRUE(AddInput(first_buffer));
681 EXPECT_TRUE(splicer_.HasNextBuffer()); 675 EXPECT_TRUE(splicer_.HasNextBuffer());
682 VerifyNextBuffer(first_buffer); 676 VerifyNextBuffer(first_buffer);
683 677
684 // Do not add |gap_buffer|. 678 // Do not add |gap_buffer|.
685 679
686 // |second_buffer| will trigger an exact overlap splice check. 680 // |second_buffer| will complete the supposed splice.
681 splicer_.SetSpliceTimestamp(kNoTimestamp());
687 EXPECT_TRUE(AddInput(second_buffer)); 682 EXPECT_TRUE(AddInput(second_buffer));
688 EXPECT_FALSE(splicer_.HasNextBuffer()); 683 EXPECT_TRUE(splicer_.HasNextBuffer());
689
690 // When the next buffer is not an exact overlap, the bad splice detection code
691 // will kick in and release the buffers.
692 EXPECT_TRUE(AddInput(AudioBuffer::CreateEOSBuffer()));
693 ASSERT_TRUE(splicer_.HasNextBuffer());
694 684
695 VerifyNextBuffer(gap_buffer); 685 VerifyNextBuffer(gap_buffer);
696 VerifyNextBuffer(second_buffer); 686 VerifyNextBuffer(second_buffer);
697 scoped_refptr<AudioBuffer> eos_buffer = splicer_.GetNextBuffer();
698 EXPECT_TRUE(eos_buffer->end_of_stream());
699 EXPECT_FALSE(splicer_.HasNextBuffer()); 687 EXPECT_FALSE(splicer_.HasNextBuffer());
700 } 688 }
701 689
702 // Test behavior when a splice frame gets fuzzed such that there is a pre splice
703 // buffer after the first which has a timestamp equal to the splice timestamp.
704 // +-----------+
705 // |11111111111|
706 // +-----------+
707 // +-------+
708 // |2222222|
709 // +-------+
710 // +--------------+
711 // |33333333333333|
712 // +--------------+
713 // Results in:
714 // +---------+--------------+
715 // |111111111|xyyyyyy3333333|
716 // +---------+--------------+
717 // Where x represents a crossfade between buffers 1 and 3; while y is a
718 // crossfade between buffers 2 and 3.
719 TEST_F(AudioSplicerTest, SpliceIncorrectlySlotted) {
wolenetz 2014/04/17 18:24:03 I'm confused I think. Why is this test no longer a
DaleCurtis 2014/04/17 20:03:18 It was necessary because we relied on the checking
720 const int kBufferSize =
721 input_timestamp_helper_.GetFramesToTarget(max_crossfade_duration());
722 const int kOverlapSize = 2;
723
724 scoped_refptr<AudioBuffer> buffer_1 =
725 GetNextInputBuffer(1.0f, kBufferSize + kOverlapSize);
726 input_timestamp_helper_.SetBaseTimestamp(buffer_1->timestamp());
727 input_timestamp_helper_.AddFrames(kBufferSize);
728
729 const base::TimeDelta splice_timestamp =
730 input_timestamp_helper_.GetTimestamp();
731 splicer_.SetSpliceTimestamp(splice_timestamp);
732
733 scoped_refptr<AudioBuffer> buffer_2 = GetNextInputBuffer(0.5f, kBufferSize);
734
735 // Create an overlap buffer which is just short of the crossfade size.
736 input_timestamp_helper_.SetBaseTimestamp(splice_timestamp);
737 scoped_refptr<AudioBuffer> buffer_3 =
738 GetNextInputBuffer(0.0f, kBufferSize - kOverlapSize);
739
740 // The splicer should be internally queuing input since |buffer_1| is part of
741 // the supposed splice.
742 EXPECT_TRUE(AddInput(buffer_1));
743 EXPECT_FALSE(splicer_.HasNextBuffer());
744
745 // Adding |buffer_2| should look like a completion of the splice, but still no
746 // buffer should be handed out.
747 EXPECT_TRUE(AddInput(buffer_2));
748 EXPECT_FALSE(splicer_.HasNextBuffer());
749
750 // Adding |buffer_3| should complete the splice correctly, but there is still
751 // not enough data for crossfade, so it shouldn't return yet.
752 EXPECT_TRUE(AddInput(buffer_3));
753 EXPECT_FALSE(splicer_.HasNextBuffer());
754
755 // Add an EOS buffer which should trigger completion of the splice.
756 EXPECT_TRUE(AddInput(AudioBuffer::CreateEOSBuffer()));
757 ASSERT_TRUE(splicer_.HasNextBuffer());
758
759 const int kExpectedPreSpliceSize = kBufferSize;
760 const base::TimeDelta kExpectedPreSpliceDuration = splice_timestamp;
761 const base::TimeDelta kExpectedCrossfadeDuration =
762 base::TimeDelta::FromMicroseconds(4966);
763 VerifyPreSpliceOutput(
764 buffer_1, buffer_3, kExpectedPreSpliceSize, kExpectedPreSpliceDuration);
765 VerifyCrossfadeOutput(buffer_1,
766 buffer_2,
767 buffer_3,
768 kOverlapSize,
769 buffer_3->frame_count(),
770 kExpectedCrossfadeDuration);
771
772 scoped_refptr<AudioBuffer> eos_buffer = splicer_.GetNextBuffer();
773 EXPECT_TRUE(eos_buffer->end_of_stream());
774
775 EXPECT_FALSE(splicer_.HasNextBuffer());
776 }
777
778 } // namespace media 690 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698