| Index: media/base/audio_splicer_unittest.cc
|
| diff --git a/media/base/audio_splicer_unittest.cc b/media/base/audio_splicer_unittest.cc
|
| index e6de2c62ed330ad9433993bd62b5dfbd0ce80ac5..86131bf48747448a2a806eecdb15e1d70808e774 100644
|
| --- a/media/base/audio_splicer_unittest.cc
|
| +++ b/media/base/audio_splicer_unittest.cc
|
| @@ -720,4 +720,48 @@ TEST_F(AudioSplicerTest, IncorrectlyMarkedSpliceWithBadGap) {
|
| EXPECT_FALSE(AddInput(second_buffer));
|
| }
|
|
|
| +// Ensure we don't crash when a splice frame is incorrectly marked such that the
|
| +// splice timestamp has already passed when SetSpliceTimestamp() is called.
|
| +// This can happen if the encoded timestamps are too far behind the decoded
|
| +// timestamps.
|
| +TEST_F(AudioSplicerTest, IncorrectlyMarkedPastSplice) {
|
| + const int kBufferSize = 200;
|
| +
|
| + scoped_refptr<AudioBuffer> first_buffer =
|
| + GetNextInputBuffer(1.0f, kBufferSize);
|
| + EXPECT_TRUE(AddInput(first_buffer));
|
| + VerifyNextBuffer(first_buffer);
|
| +
|
| + // Start the splice at a timestamp which has already occurred.
|
| + splicer_.SetSpliceTimestamp(base::TimeDelta());
|
| +
|
| + scoped_refptr<AudioBuffer> second_buffer =
|
| + GetNextInputBuffer(0.5f, kBufferSize);
|
| + EXPECT_TRUE(AddInput(second_buffer));
|
| + EXPECT_FALSE(splicer_.HasNextBuffer());
|
| +
|
| + // |third_buffer| will complete the supposed splice. The buffer size is set
|
| + // such that unchecked the splicer would try to trim off a negative number of
|
| + // frames.
|
| + splicer_.SetSpliceTimestamp(kNoTimestamp());
|
| + scoped_refptr<AudioBuffer> third_buffer =
|
| + GetNextInputBuffer(0.0f, kBufferSize * 10);
|
| + third_buffer->set_timestamp(base::TimeDelta());
|
| + EXPECT_TRUE(AddInput(third_buffer));
|
| +
|
| + // The second buffer should come through unmodified.
|
| + VerifyNextBuffer(second_buffer);
|
| +
|
| + // The third buffer should be partially dropped since it overlaps the second.
|
| + ASSERT_TRUE(splicer_.HasNextBuffer());
|
| + const base::TimeDelta second_buffer_end_ts =
|
| + second_buffer->timestamp() + second_buffer->duration();
|
| + scoped_refptr<AudioBuffer> output = splicer_.GetNextBuffer();
|
| + EXPECT_EQ(second_buffer_end_ts, output->timestamp());
|
| + EXPECT_EQ(third_buffer->duration() -
|
| + (second_buffer_end_ts - third_buffer->timestamp()),
|
| + output->duration());
|
| + EXPECT_TRUE(VerifyData(output, GetValue(third_buffer)));
|
| +}
|
| +
|
| } // namespace media
|
|
|