Index: media/base/audio_discard_helper_unittest.cc |
diff --git a/media/base/audio_discard_helper_unittest.cc b/media/base/audio_discard_helper_unittest.cc |
index 7788e7f6c49e4824726430c2cd71c709cf1c626b..69b03352e2cd6f82153f35d72ce39c28cafd09ff 100644 |
--- a/media/base/audio_discard_helper_unittest.cc |
+++ b/media/base/audio_discard_helper_unittest.cc |
@@ -47,7 +47,7 @@ static float ExtractDecodedData(const scoped_refptr<AudioBuffer>& buffer, |
} |
TEST(AudioDiscardHelperTest, TimeDeltaToFrames) { |
- AudioDiscardHelper discard_helper(kSampleRate); |
+ AudioDiscardHelper discard_helper(kSampleRate, 0); |
EXPECT_EQ(0u, discard_helper.TimeDeltaToFrames(base::TimeDelta())); |
EXPECT_EQ( |
@@ -71,7 +71,7 @@ TEST(AudioDiscardHelperTest, TimeDeltaToFrames) { |
} |
TEST(AudioDiscardHelperTest, BasicProcessBuffers) { |
- AudioDiscardHelper discard_helper(kSampleRate); |
+ AudioDiscardHelper discard_helper(kSampleRate, 0); |
ASSERT_FALSE(discard_helper.initialized()); |
const base::TimeDelta kTimestamp = base::TimeDelta(); |
@@ -103,7 +103,7 @@ TEST(AudioDiscardHelperTest, BasicProcessBuffers) { |
} |
TEST(AudioDiscardHelperTest, NegativeTimestampClampsToZero) { |
- AudioDiscardHelper discard_helper(kSampleRate); |
+ AudioDiscardHelper discard_helper(kSampleRate, 0); |
ASSERT_FALSE(discard_helper.initialized()); |
const base::TimeDelta kTimestamp = -base::TimeDelta::FromSeconds(1); |
@@ -123,7 +123,7 @@ TEST(AudioDiscardHelperTest, NegativeTimestampClampsToZero) { |
} |
TEST(AudioDiscardHelperTest, ProcessBuffersWithInitialDiscard) { |
- AudioDiscardHelper discard_helper(kSampleRate); |
+ AudioDiscardHelper discard_helper(kSampleRate, 0); |
ASSERT_FALSE(discard_helper.initialized()); |
const base::TimeDelta kTimestamp = base::TimeDelta(); |
@@ -149,7 +149,7 @@ TEST(AudioDiscardHelperTest, ProcessBuffersWithInitialDiscard) { |
} |
TEST(AudioDiscardHelperTest, ProcessBuffersWithLargeInitialDiscard) { |
- AudioDiscardHelper discard_helper(kSampleRate); |
+ AudioDiscardHelper discard_helper(kSampleRate, 0); |
ASSERT_FALSE(discard_helper.initialized()); |
const base::TimeDelta kTimestamp = base::TimeDelta(); |
@@ -182,7 +182,7 @@ TEST(AudioDiscardHelperTest, ProcessBuffersWithLargeInitialDiscard) { |
} |
TEST(AudioDiscardHelperTest, AllowNonMonotonicTimestamps) { |
- AudioDiscardHelper discard_helper(kSampleRate); |
+ AudioDiscardHelper discard_helper(kSampleRate, 0); |
ASSERT_FALSE(discard_helper.initialized()); |
const base::TimeDelta kTimestamp = base::TimeDelta(); |
@@ -207,8 +207,8 @@ TEST(AudioDiscardHelperTest, AllowNonMonotonicTimestamps) { |
EXPECT_EQ(kTestFrames, decoded_buffer->frame_count()); |
} |
-TEST(AudioDiscardHelperTest, DiscardPadding) { |
- AudioDiscardHelper discard_helper(kSampleRate); |
+TEST(AudioDiscardHelperTest, DiscardEndPadding) { |
+ AudioDiscardHelper discard_helper(kSampleRate, 0); |
ASSERT_FALSE(discard_helper.initialized()); |
const base::TimeDelta kTimestamp = base::TimeDelta(); |
@@ -220,18 +220,39 @@ TEST(AudioDiscardHelperTest, DiscardPadding) { |
scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); |
// Set a discard padding equivalent to half the buffer. |
- encoded_buffer->set_discard_padding(kDuration / 2); |
+ encoded_buffer->set_discard_padding( |
+ std::make_pair(base::TimeDelta(), kDuration / 2)); |
ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); |
ASSERT_TRUE(discard_helper.initialized()); |
EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); |
EXPECT_EQ(kDuration / 2, decoded_buffer->duration()); |
EXPECT_EQ(kTestFrames / 2, decoded_buffer->frame_count()); |
- ASSERT_FLOAT_EQ(0, ExtractDecodedData(decoded_buffer, 0)); |
} |
-TEST(AudioDiscardHelperTest, InitialDiscardAndDiscardPadding) { |
- AudioDiscardHelper discard_helper(kSampleRate); |
+TEST(AudioDiscardHelperTest, BadDiscardEndPadding) { |
+ AudioDiscardHelper discard_helper(kSampleRate, 0); |
+ ASSERT_FALSE(discard_helper.initialized()); |
+ |
+ const base::TimeDelta kTimestamp = base::TimeDelta(); |
+ const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); |
+ const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); |
+ |
+ scoped_refptr<DecoderBuffer> encoded_buffer = |
+ CreateEncodedBuffer(kTimestamp, kDuration); |
+ scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); |
+ |
+ // Set a discard padding equivalent to double the buffer size. |
+ encoded_buffer->set_discard_padding( |
+ std::make_pair(base::TimeDelta(), kDuration * 2)); |
+ |
+ // Verify the end discard padding is rejected. |
+ ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); |
+ ASSERT_TRUE(discard_helper.initialized()); |
+} |
+ |
+TEST(AudioDiscardHelperTest, InitialDiscardAndDiscardEndPadding) { |
+ AudioDiscardHelper discard_helper(kSampleRate, 0); |
ASSERT_FALSE(discard_helper.initialized()); |
const base::TimeDelta kTimestamp = base::TimeDelta(); |
@@ -243,7 +264,8 @@ TEST(AudioDiscardHelperTest, InitialDiscardAndDiscardPadding) { |
scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); |
// Set a discard padding equivalent to a quarter of the buffer. |
- encoded_buffer->set_discard_padding(kDuration / 4); |
+ encoded_buffer->set_discard_padding( |
+ std::make_pair(base::TimeDelta(), kDuration / 4)); |
// Set an initial discard of a quarter of the buffer. |
const int kDiscardFrames = kTestFrames / 4; |
@@ -258,4 +280,105 @@ TEST(AudioDiscardHelperTest, InitialDiscardAndDiscardPadding) { |
ExtractDecodedData(decoded_buffer, 0)); |
} |
+TEST(AudioDiscardHelperTest, InitialDiscardAndDiscardPadding) { |
+ AudioDiscardHelper discard_helper(kSampleRate, 0); |
+ ASSERT_FALSE(discard_helper.initialized()); |
+ |
+ const base::TimeDelta kTimestamp = base::TimeDelta(); |
+ const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); |
+ const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); |
+ |
+ scoped_refptr<DecoderBuffer> encoded_buffer = |
+ CreateEncodedBuffer(kTimestamp, kDuration); |
+ scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); |
+ |
+ // Set a discard padding equivalent to a quarter of the buffer. |
+ encoded_buffer->set_discard_padding( |
+ std::make_pair(kDuration / 4, kDuration / 4)); |
+ |
+ // Set an initial discard of a quarter of the buffer. |
+ const int kDiscardFrames = kTestFrames / 4; |
+ discard_helper.Reset(kDiscardFrames); |
+ |
+ ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); |
+ ASSERT_TRUE(discard_helper.initialized()); |
+ EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); |
+ EXPECT_EQ(kDuration / 4, decoded_buffer->duration()); |
+ EXPECT_EQ(kTestFrames / 4, decoded_buffer->frame_count()); |
+} |
+ |
+TEST(AudioDiscardHelperTest, InitialDiscardAndDiscardPaddingAndCodecDelay) { |
+ // Use a codec delay of 5ms. |
+ const int kCodecDelay = kSampleRate / 100 / 2; |
+ AudioDiscardHelper discard_helper(kSampleRate, kCodecDelay); |
+ ASSERT_FALSE(discard_helper.initialized()); |
+ discard_helper.Reset(kCodecDelay); |
+ |
+ const base::TimeDelta kTimestamp = base::TimeDelta(); |
+ const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); |
+ const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); |
+ |
+ scoped_refptr<DecoderBuffer> encoded_buffer = |
+ CreateEncodedBuffer(kTimestamp, kDuration); |
+ scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); |
+ |
+ // Set a discard padding equivalent to half of the buffer. |
+ encoded_buffer->set_discard_padding( |
+ std::make_pair(kDuration / 2, base::TimeDelta())); |
+ |
+ // All of the first buffer should be discarded. |
+ ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); |
+ ASSERT_TRUE(discard_helper.initialized()); |
+ |
+ // Processing another buffer (with the same discard padding) should discard |
+ // the back half of the buffer since kCodecDelay is half a buffer. |
+ encoded_buffer->set_timestamp(kTimestamp + kDuration); |
+ decoded_buffer = CreateDecodedBuffer(kTestFrames); |
+ ASSERT_FLOAT_EQ(0.0f, ExtractDecodedData(decoded_buffer, 0)); |
+ ASSERT_NEAR(kCodecDelay * kDataStep, |
+ ExtractDecodedData(decoded_buffer, kCodecDelay), |
+ kDataStep * 1000); |
+ ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); |
+ EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); |
+ EXPECT_EQ(kDuration / 2, decoded_buffer->duration()); |
+ EXPECT_EQ(kTestFrames / 2, decoded_buffer->frame_count()); |
+ |
+ // Verify it was actually the latter half of the buffer that was removed. |
+ ASSERT_FLOAT_EQ(0.0f, ExtractDecodedData(decoded_buffer, 0)); |
+} |
+ |
+TEST(AudioDiscardHelperTest, DelayedDiscardInitialDiscardAndDiscardPadding) { |
+ AudioDiscardHelper discard_helper(kSampleRate, 0); |
+ ASSERT_FALSE(discard_helper.initialized()); |
+ |
+ const base::TimeDelta kTimestamp = base::TimeDelta(); |
+ const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); |
+ const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); |
+ |
+ scoped_refptr<DecoderBuffer> encoded_buffer = |
+ CreateEncodedBuffer(kTimestamp, kDuration); |
+ |
+ // Set a discard padding equivalent to a quarter of the buffer. |
+ encoded_buffer->set_discard_padding( |
+ std::make_pair(kDuration / 4, kDuration / 4)); |
+ |
+ // Set an initial discard of a quarter of the buffer. |
+ discard_helper.Reset(kTestFrames / 4); |
+ |
+ // Verify nothing is output for the first buffer, yet initialized is true. |
+ ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, NULL)); |
+ ASSERT_TRUE(discard_helper.initialized()); |
+ |
+ // Create an encoded buffer with no discard padding. |
+ encoded_buffer = CreateEncodedBuffer(kTimestamp + kDuration, kDuration); |
+ scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); |
+ |
+ // Verify that when the decoded buffer is consumed, the discards from the |
+ // previous encoded buffer are applied. |
+ ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); |
+ EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); |
+ EXPECT_EQ(kDuration / 4, decoded_buffer->duration()); |
+ EXPECT_EQ(kTestFrames / 4, decoded_buffer->frame_count()); |
+} |
+ |
} // namespace media |