| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "media/base/audio_discard_helper.h" | 5 #include "media/base/audio_discard_helper.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 | 10 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 int index) { | 38 int index) { |
| 39 // This is really inefficient, but we can't access the raw AudioBuffer if any | 39 // This is really inefficient, but we can't access the raw AudioBuffer if any |
| 40 // start trimming has been applied. | 40 // start trimming has been applied. |
| 41 std::unique_ptr<AudioBus> temp_bus = | 41 std::unique_ptr<AudioBus> temp_bus = |
| 42 AudioBus::Create(buffer->channel_count(), 1); | 42 AudioBus::Create(buffer->channel_count(), 1); |
| 43 buffer->ReadFrames(1, index, 0, temp_bus.get()); | 43 buffer->ReadFrames(1, index, 0, temp_bus.get()); |
| 44 return temp_bus->channel(0)[0]; | 44 return temp_bus->channel(0)[0]; |
| 45 } | 45 } |
| 46 | 46 |
| 47 TEST(AudioDiscardHelperTest, TimeDeltaToFrames) { | 47 TEST(AudioDiscardHelperTest, TimeDeltaToFrames) { |
| 48 AudioDiscardHelper discard_helper(kSampleRate, 0); | 48 AudioDiscardHelper discard_helper(kSampleRate, 0, false); |
| 49 | 49 |
| 50 EXPECT_EQ(0u, discard_helper.TimeDeltaToFrames(base::TimeDelta())); | 50 EXPECT_EQ(0u, discard_helper.TimeDeltaToFrames(base::TimeDelta())); |
| 51 EXPECT_EQ( | 51 EXPECT_EQ( |
| 52 kSampleRate / 100, | 52 kSampleRate / 100, |
| 53 discard_helper.TimeDeltaToFrames(base::TimeDelta::FromMilliseconds(10))); | 53 discard_helper.TimeDeltaToFrames(base::TimeDelta::FromMilliseconds(10))); |
| 54 | 54 |
| 55 // Ensure partial frames are rounded down correctly. The equation below | 55 // Ensure partial frames are rounded down correctly. The equation below |
| 56 // calculates a frame count with a fractional part < 0.5. | 56 // calculates a frame count with a fractional part < 0.5. |
| 57 const int small_remainder = | 57 const int small_remainder = |
| 58 base::Time::kMicrosecondsPerSecond * (kSampleRate - 0.9) / kSampleRate; | 58 base::Time::kMicrosecondsPerSecond * (kSampleRate - 0.9) / kSampleRate; |
| 59 EXPECT_EQ(kSampleRate - 1, | 59 EXPECT_EQ(kSampleRate - 1, |
| 60 discard_helper.TimeDeltaToFrames( | 60 discard_helper.TimeDeltaToFrames( |
| 61 base::TimeDelta::FromMicroseconds(small_remainder))); | 61 base::TimeDelta::FromMicroseconds(small_remainder))); |
| 62 | 62 |
| 63 // Ditto, but rounded up using a fractional part > 0.5. | 63 // Ditto, but rounded up using a fractional part > 0.5. |
| 64 const int large_remainder = | 64 const int large_remainder = |
| 65 base::Time::kMicrosecondsPerSecond * (kSampleRate - 0.4) / kSampleRate; | 65 base::Time::kMicrosecondsPerSecond * (kSampleRate - 0.4) / kSampleRate; |
| 66 EXPECT_EQ(kSampleRate, | 66 EXPECT_EQ(kSampleRate, |
| 67 discard_helper.TimeDeltaToFrames( | 67 discard_helper.TimeDeltaToFrames( |
| 68 base::TimeDelta::FromMicroseconds(large_remainder))); | 68 base::TimeDelta::FromMicroseconds(large_remainder))); |
| 69 } | 69 } |
| 70 | 70 |
| 71 TEST(AudioDiscardHelperTest, BasicProcessBuffers) { | 71 TEST(AudioDiscardHelperTest, BasicProcessBuffers) { |
| 72 AudioDiscardHelper discard_helper(kSampleRate, 0); | 72 AudioDiscardHelper discard_helper(kSampleRate, 0, false); |
| 73 ASSERT_FALSE(discard_helper.initialized()); | 73 ASSERT_FALSE(discard_helper.initialized()); |
| 74 | 74 |
| 75 const base::TimeDelta kTimestamp = base::TimeDelta(); | 75 const base::TimeDelta kTimestamp = base::TimeDelta(); |
| 76 | 76 |
| 77 // Use an estimated duration which doesn't match the number of decoded frames | 77 // Use an estimated duration which doesn't match the number of decoded frames |
| 78 // to ensure the helper is correctly setting durations based on output frames. | 78 // to ensure the helper is correctly setting durations based on output frames. |
| 79 const base::TimeDelta kEstimatedDuration = | 79 const base::TimeDelta kEstimatedDuration = |
| 80 base::TimeDelta::FromMilliseconds(9); | 80 base::TimeDelta::FromMilliseconds(9); |
| 81 const base::TimeDelta kActualDuration = base::TimeDelta::FromMilliseconds(10); | 81 const base::TimeDelta kActualDuration = base::TimeDelta::FromMilliseconds(10); |
| 82 const int kTestFrames = discard_helper.TimeDeltaToFrames(kActualDuration); | 82 const int kTestFrames = discard_helper.TimeDeltaToFrames(kActualDuration); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 94 | 94 |
| 95 // Verify a Reset() takes us back to an uninitialized state. | 95 // Verify a Reset() takes us back to an uninitialized state. |
| 96 discard_helper.Reset(0); | 96 discard_helper.Reset(0); |
| 97 ASSERT_FALSE(discard_helper.initialized()); | 97 ASSERT_FALSE(discard_helper.initialized()); |
| 98 | 98 |
| 99 // Verify a NULL output buffer returns false. | 99 // Verify a NULL output buffer returns false. |
| 100 ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, NULL)); | 100 ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, NULL)); |
| 101 } | 101 } |
| 102 | 102 |
| 103 TEST(AudioDiscardHelperTest, NegativeTimestampClampsToZero) { | 103 TEST(AudioDiscardHelperTest, NegativeTimestampClampsToZero) { |
| 104 AudioDiscardHelper discard_helper(kSampleRate, 0); | 104 AudioDiscardHelper discard_helper(kSampleRate, 0, false); |
| 105 ASSERT_FALSE(discard_helper.initialized()); | 105 ASSERT_FALSE(discard_helper.initialized()); |
| 106 | 106 |
| 107 const base::TimeDelta kTimestamp = -base::TimeDelta::FromSeconds(1); | 107 const base::TimeDelta kTimestamp = -base::TimeDelta::FromSeconds(1); |
| 108 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); | 108 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); |
| 109 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); | 109 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); |
| 110 | 110 |
| 111 scoped_refptr<DecoderBuffer> encoded_buffer = | 111 scoped_refptr<DecoderBuffer> encoded_buffer = |
| 112 CreateEncodedBuffer(kTimestamp, kDuration); | 112 CreateEncodedBuffer(kTimestamp, kDuration); |
| 113 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); | 113 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); |
| 114 | 114 |
| 115 // Verify the basic case where nothing is discarded. | 115 // Verify the basic case where nothing is discarded. |
| 116 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); | 116 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); |
| 117 ASSERT_TRUE(discard_helper.initialized()); | 117 ASSERT_TRUE(discard_helper.initialized()); |
| 118 EXPECT_EQ(base::TimeDelta(), decoded_buffer->timestamp()); | 118 EXPECT_EQ(base::TimeDelta(), decoded_buffer->timestamp()); |
| 119 EXPECT_EQ(kDuration, decoded_buffer->duration()); | 119 EXPECT_EQ(kDuration, decoded_buffer->duration()); |
| 120 EXPECT_EQ(kTestFrames, decoded_buffer->frame_count()); | 120 EXPECT_EQ(kTestFrames, decoded_buffer->frame_count()); |
| 121 } | 121 } |
| 122 | 122 |
| 123 TEST(AudioDiscardHelperTest, ProcessBuffersWithInitialDiscard) { | 123 TEST(AudioDiscardHelperTest, ProcessBuffersWithInitialDiscard) { |
| 124 AudioDiscardHelper discard_helper(kSampleRate, 0); | 124 AudioDiscardHelper discard_helper(kSampleRate, 0, false); |
| 125 ASSERT_FALSE(discard_helper.initialized()); | 125 ASSERT_FALSE(discard_helper.initialized()); |
| 126 | 126 |
| 127 const base::TimeDelta kTimestamp = base::TimeDelta(); | 127 const base::TimeDelta kTimestamp = base::TimeDelta(); |
| 128 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); | 128 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); |
| 129 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); | 129 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); |
| 130 | 130 |
| 131 // Tell the helper we want to discard half of the initial frames. | 131 // Tell the helper we want to discard half of the initial frames. |
| 132 const int kDiscardFrames = kTestFrames / 2; | 132 const int kDiscardFrames = kTestFrames / 2; |
| 133 discard_helper.Reset(kDiscardFrames); | 133 discard_helper.Reset(kDiscardFrames); |
| 134 | 134 |
| 135 scoped_refptr<DecoderBuffer> encoded_buffer = | 135 scoped_refptr<DecoderBuffer> encoded_buffer = |
| 136 CreateEncodedBuffer(kTimestamp, kDuration); | 136 CreateEncodedBuffer(kTimestamp, kDuration); |
| 137 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); | 137 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); |
| 138 | 138 |
| 139 // Verify half the frames end up discarded. | 139 // Verify half the frames end up discarded. |
| 140 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); | 140 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); |
| 141 ASSERT_TRUE(discard_helper.initialized()); | 141 ASSERT_TRUE(discard_helper.initialized()); |
| 142 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); | 142 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); |
| 143 EXPECT_EQ(kDuration / 2, decoded_buffer->duration()); | 143 EXPECT_EQ(kDuration / 2, decoded_buffer->duration()); |
| 144 EXPECT_EQ(kDiscardFrames, decoded_buffer->frame_count()); | 144 EXPECT_EQ(kDiscardFrames, decoded_buffer->frame_count()); |
| 145 ASSERT_FLOAT_EQ(kDiscardFrames * kDataStep, | 145 ASSERT_FLOAT_EQ(kDiscardFrames * kDataStep, |
| 146 ExtractDecodedData(decoded_buffer, 0)); | 146 ExtractDecodedData(decoded_buffer, 0)); |
| 147 } | 147 } |
| 148 | 148 |
| 149 TEST(AudioDiscardHelperTest, ProcessBuffersWithLargeInitialDiscard) { | 149 TEST(AudioDiscardHelperTest, ProcessBuffersWithLargeInitialDiscard) { |
| 150 AudioDiscardHelper discard_helper(kSampleRate, 0); | 150 AudioDiscardHelper discard_helper(kSampleRate, 0, false); |
| 151 ASSERT_FALSE(discard_helper.initialized()); | 151 ASSERT_FALSE(discard_helper.initialized()); |
| 152 | 152 |
| 153 const base::TimeDelta kTimestamp = base::TimeDelta(); | 153 const base::TimeDelta kTimestamp = base::TimeDelta(); |
| 154 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); | 154 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); |
| 155 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); | 155 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); |
| 156 | 156 |
| 157 // Tell the helper we want to discard 1.5 buffers worth of frames. | 157 // Tell the helper we want to discard 1.5 buffers worth of frames. |
| 158 discard_helper.Reset(kTestFrames * 1.5); | 158 discard_helper.Reset(kTestFrames * 1.5); |
| 159 | 159 |
| 160 scoped_refptr<DecoderBuffer> encoded_buffer = | 160 scoped_refptr<DecoderBuffer> encoded_buffer = |
| (...skipping 12 matching lines...) Expand all Loading... |
| 173 // The timestamp should match that of the initial buffer. | 173 // The timestamp should match that of the initial buffer. |
| 174 const int kDiscardFrames = kTestFrames / 2; | 174 const int kDiscardFrames = kTestFrames / 2; |
| 175 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); | 175 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); |
| 176 EXPECT_EQ(kDuration / 2, decoded_buffer->duration()); | 176 EXPECT_EQ(kDuration / 2, decoded_buffer->duration()); |
| 177 EXPECT_EQ(kDiscardFrames, decoded_buffer->frame_count()); | 177 EXPECT_EQ(kDiscardFrames, decoded_buffer->frame_count()); |
| 178 ASSERT_FLOAT_EQ(kDiscardFrames * kDataStep, | 178 ASSERT_FLOAT_EQ(kDiscardFrames * kDataStep, |
| 179 ExtractDecodedData(decoded_buffer, 0)); | 179 ExtractDecodedData(decoded_buffer, 0)); |
| 180 } | 180 } |
| 181 | 181 |
| 182 TEST(AudioDiscardHelperTest, AllowNonMonotonicTimestamps) { | 182 TEST(AudioDiscardHelperTest, AllowNonMonotonicTimestamps) { |
| 183 AudioDiscardHelper discard_helper(kSampleRate, 0); | 183 AudioDiscardHelper discard_helper(kSampleRate, 0, false); |
| 184 ASSERT_FALSE(discard_helper.initialized()); | 184 ASSERT_FALSE(discard_helper.initialized()); |
| 185 | 185 |
| 186 const base::TimeDelta kTimestamp = base::TimeDelta(); | 186 const base::TimeDelta kTimestamp = base::TimeDelta(); |
| 187 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); | 187 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); |
| 188 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); | 188 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); |
| 189 | 189 |
| 190 scoped_refptr<DecoderBuffer> encoded_buffer = | 190 scoped_refptr<DecoderBuffer> encoded_buffer = |
| 191 CreateEncodedBuffer(kTimestamp, kDuration); | 191 CreateEncodedBuffer(kTimestamp, kDuration); |
| 192 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); | 192 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); |
| 193 | 193 |
| 194 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); | 194 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); |
| 195 ASSERT_TRUE(discard_helper.initialized()); | 195 ASSERT_TRUE(discard_helper.initialized()); |
| 196 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); | 196 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); |
| 197 EXPECT_EQ(kDuration, decoded_buffer->duration()); | 197 EXPECT_EQ(kDuration, decoded_buffer->duration()); |
| 198 EXPECT_EQ(kTestFrames, decoded_buffer->frame_count()); | 198 EXPECT_EQ(kTestFrames, decoded_buffer->frame_count()); |
| 199 | 199 |
| 200 // Process the same input buffer again to ensure input timestamps which go | 200 // Process the same input buffer again to ensure input timestamps which go |
| 201 // backwards in time are not errors. | 201 // backwards in time are not errors. |
| 202 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); | 202 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); |
| 203 EXPECT_EQ(kTimestamp + kDuration, decoded_buffer->timestamp()); | 203 EXPECT_EQ(kTimestamp + kDuration, decoded_buffer->timestamp()); |
| 204 EXPECT_EQ(kDuration, decoded_buffer->duration()); | 204 EXPECT_EQ(kDuration, decoded_buffer->duration()); |
| 205 EXPECT_EQ(kTestFrames, decoded_buffer->frame_count()); | 205 EXPECT_EQ(kTestFrames, decoded_buffer->frame_count()); |
| 206 } | 206 } |
| 207 | 207 |
| 208 TEST(AudioDiscardHelperTest, DiscardEndPadding) { | 208 TEST(AudioDiscardHelperTest, DiscardEndPadding) { |
| 209 AudioDiscardHelper discard_helper(kSampleRate, 0); | 209 AudioDiscardHelper discard_helper(kSampleRate, 0, false); |
| 210 ASSERT_FALSE(discard_helper.initialized()); | 210 ASSERT_FALSE(discard_helper.initialized()); |
| 211 | 211 |
| 212 const base::TimeDelta kTimestamp = base::TimeDelta(); | 212 const base::TimeDelta kTimestamp = base::TimeDelta(); |
| 213 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); | 213 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); |
| 214 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); | 214 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); |
| 215 | 215 |
| 216 scoped_refptr<DecoderBuffer> encoded_buffer = | 216 scoped_refptr<DecoderBuffer> encoded_buffer = |
| 217 CreateEncodedBuffer(kTimestamp, kDuration); | 217 CreateEncodedBuffer(kTimestamp, kDuration); |
| 218 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); | 218 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); |
| 219 | 219 |
| 220 // Set a discard padding equivalent to half the buffer. | 220 // Set a discard padding equivalent to half the buffer. |
| 221 encoded_buffer->set_discard_padding( | 221 encoded_buffer->set_discard_padding( |
| 222 std::make_pair(base::TimeDelta(), kDuration / 2)); | 222 std::make_pair(base::TimeDelta(), kDuration / 2)); |
| 223 | 223 |
| 224 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); | 224 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); |
| 225 ASSERT_TRUE(discard_helper.initialized()); | 225 ASSERT_TRUE(discard_helper.initialized()); |
| 226 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); | 226 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); |
| 227 EXPECT_EQ(kDuration / 2, decoded_buffer->duration()); | 227 EXPECT_EQ(kDuration / 2, decoded_buffer->duration()); |
| 228 EXPECT_EQ(kTestFrames / 2, decoded_buffer->frame_count()); | 228 EXPECT_EQ(kTestFrames / 2, decoded_buffer->frame_count()); |
| 229 } | 229 } |
| 230 | 230 |
| 231 TEST(AudioDiscardHelperTest, BadDiscardEndPadding) { | 231 TEST(AudioDiscardHelperTest, BadDiscardEndPadding) { |
| 232 AudioDiscardHelper discard_helper(kSampleRate, 0); | 232 AudioDiscardHelper discard_helper(kSampleRate, 0, false); |
| 233 ASSERT_FALSE(discard_helper.initialized()); | 233 ASSERT_FALSE(discard_helper.initialized()); |
| 234 | 234 |
| 235 const base::TimeDelta kTimestamp = base::TimeDelta(); | 235 const base::TimeDelta kTimestamp = base::TimeDelta(); |
| 236 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); | 236 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); |
| 237 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); | 237 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); |
| 238 | 238 |
| 239 scoped_refptr<DecoderBuffer> encoded_buffer = | 239 scoped_refptr<DecoderBuffer> encoded_buffer = |
| 240 CreateEncodedBuffer(kTimestamp, kDuration); | 240 CreateEncodedBuffer(kTimestamp, kDuration); |
| 241 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); | 241 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); |
| 242 | 242 |
| 243 // Set a discard padding equivalent to double the buffer size. | 243 // Set a discard padding equivalent to double the buffer size. |
| 244 encoded_buffer->set_discard_padding( | 244 encoded_buffer->set_discard_padding( |
| 245 std::make_pair(base::TimeDelta(), kDuration * 2)); | 245 std::make_pair(base::TimeDelta(), kDuration * 2)); |
| 246 | 246 |
| 247 // Verify the end discard padding is rejected. | 247 // Verify the end discard padding is rejected. |
| 248 ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); | 248 ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); |
| 249 ASSERT_TRUE(discard_helper.initialized()); | 249 ASSERT_TRUE(discard_helper.initialized()); |
| 250 } | 250 } |
| 251 | 251 |
| 252 TEST(AudioDiscardHelperTest, InitialDiscardAndDiscardEndPadding) { | 252 TEST(AudioDiscardHelperTest, InitialDiscardAndDiscardEndPadding) { |
| 253 AudioDiscardHelper discard_helper(kSampleRate, 0); | 253 AudioDiscardHelper discard_helper(kSampleRate, 0, false); |
| 254 ASSERT_FALSE(discard_helper.initialized()); | 254 ASSERT_FALSE(discard_helper.initialized()); |
| 255 | 255 |
| 256 const base::TimeDelta kTimestamp = base::TimeDelta(); | 256 const base::TimeDelta kTimestamp = base::TimeDelta(); |
| 257 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); | 257 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); |
| 258 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); | 258 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); |
| 259 | 259 |
| 260 scoped_refptr<DecoderBuffer> encoded_buffer = | 260 scoped_refptr<DecoderBuffer> encoded_buffer = |
| 261 CreateEncodedBuffer(kTimestamp, kDuration); | 261 CreateEncodedBuffer(kTimestamp, kDuration); |
| 262 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); | 262 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); |
| 263 | 263 |
| 264 // Set a discard padding equivalent to a quarter of the buffer. | 264 // Set a discard padding equivalent to a quarter of the buffer. |
| 265 encoded_buffer->set_discard_padding( | 265 encoded_buffer->set_discard_padding( |
| 266 std::make_pair(base::TimeDelta(), kDuration / 4)); | 266 std::make_pair(base::TimeDelta(), kDuration / 4)); |
| 267 | 267 |
| 268 // Set an initial discard of a quarter of the buffer. | 268 // Set an initial discard of a quarter of the buffer. |
| 269 const int kDiscardFrames = kTestFrames / 4; | 269 const int kDiscardFrames = kTestFrames / 4; |
| 270 discard_helper.Reset(kDiscardFrames); | 270 discard_helper.Reset(kDiscardFrames); |
| 271 | 271 |
| 272 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); | 272 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); |
| 273 ASSERT_TRUE(discard_helper.initialized()); | 273 ASSERT_TRUE(discard_helper.initialized()); |
| 274 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); | 274 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); |
| 275 EXPECT_EQ(kDuration / 2, decoded_buffer->duration()); | 275 EXPECT_EQ(kDuration / 2, decoded_buffer->duration()); |
| 276 EXPECT_EQ(kTestFrames / 2, decoded_buffer->frame_count()); | 276 EXPECT_EQ(kTestFrames / 2, decoded_buffer->frame_count()); |
| 277 ASSERT_FLOAT_EQ(kDiscardFrames * kDataStep, | 277 ASSERT_FLOAT_EQ(kDiscardFrames * kDataStep, |
| 278 ExtractDecodedData(decoded_buffer, 0)); | 278 ExtractDecodedData(decoded_buffer, 0)); |
| 279 } | 279 } |
| 280 | 280 |
| 281 TEST(AudioDiscardHelperTest, InitialDiscardAndDiscardPadding) { | 281 TEST(AudioDiscardHelperTest, InitialDiscardAndDiscardPadding) { |
| 282 AudioDiscardHelper discard_helper(kSampleRate, 0); | 282 AudioDiscardHelper discard_helper(kSampleRate, 0, false); |
| 283 ASSERT_FALSE(discard_helper.initialized()); | 283 ASSERT_FALSE(discard_helper.initialized()); |
| 284 | 284 |
| 285 const base::TimeDelta kTimestamp = base::TimeDelta(); | 285 const base::TimeDelta kTimestamp = base::TimeDelta(); |
| 286 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); | 286 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); |
| 287 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); | 287 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); |
| 288 | 288 |
| 289 scoped_refptr<DecoderBuffer> encoded_buffer = | 289 scoped_refptr<DecoderBuffer> encoded_buffer = |
| 290 CreateEncodedBuffer(kTimestamp, kDuration); | 290 CreateEncodedBuffer(kTimestamp, kDuration); |
| 291 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); | 291 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); |
| 292 | 292 |
| 293 // Set all the discard values to be different to ensure each is properly used. | 293 // Set all the discard values to be different to ensure each is properly used. |
| 294 const int kDiscardFrames = kTestFrames / 4; | 294 const int kDiscardFrames = kTestFrames / 4; |
| 295 encoded_buffer->set_discard_padding( | 295 encoded_buffer->set_discard_padding( |
| 296 std::make_pair(kDuration / 8, kDuration / 16)); | 296 std::make_pair(kDuration / 8, kDuration / 16)); |
| 297 discard_helper.Reset(kDiscardFrames); | 297 discard_helper.Reset(kDiscardFrames); |
| 298 | 298 |
| 299 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); | 299 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); |
| 300 ASSERT_TRUE(discard_helper.initialized()); | 300 ASSERT_TRUE(discard_helper.initialized()); |
| 301 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); | 301 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); |
| 302 EXPECT_EQ(kDuration - kDuration / 4 - kDuration / 8 - kDuration / 16, | 302 EXPECT_EQ(kDuration - kDuration / 4 - kDuration / 8 - kDuration / 16, |
| 303 decoded_buffer->duration()); | 303 decoded_buffer->duration()); |
| 304 EXPECT_EQ(kTestFrames - kTestFrames / 4 - kTestFrames / 8 - kTestFrames / 16, | 304 EXPECT_EQ(kTestFrames - kTestFrames / 4 - kTestFrames / 8 - kTestFrames / 16, |
| 305 decoded_buffer->frame_count()); | 305 decoded_buffer->frame_count()); |
| 306 } | 306 } |
| 307 | 307 |
| 308 TEST(AudioDiscardHelperTest, InitialDiscardAndDiscardPaddingAndDecoderDelay) { | 308 TEST(AudioDiscardHelperTest, InitialDiscardAndDiscardPaddingAndDecoderDelay) { |
| 309 // Use a decoder delay of 5ms. | 309 // Use a decoder delay of 5ms. |
| 310 const int kDecoderDelay = kSampleRate / 100 / 2; | 310 const int kDecoderDelay = kSampleRate / 100 / 2; |
| 311 AudioDiscardHelper discard_helper(kSampleRate, kDecoderDelay); | 311 AudioDiscardHelper discard_helper(kSampleRate, kDecoderDelay, false); |
| 312 ASSERT_FALSE(discard_helper.initialized()); | 312 ASSERT_FALSE(discard_helper.initialized()); |
| 313 discard_helper.Reset(kDecoderDelay); | 313 discard_helper.Reset(kDecoderDelay); |
| 314 | 314 |
| 315 const base::TimeDelta kTimestamp = base::TimeDelta(); | 315 const base::TimeDelta kTimestamp = base::TimeDelta(); |
| 316 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); | 316 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); |
| 317 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); | 317 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); |
| 318 | 318 |
| 319 scoped_refptr<DecoderBuffer> encoded_buffer = | 319 scoped_refptr<DecoderBuffer> encoded_buffer = |
| 320 CreateEncodedBuffer(kTimestamp, kDuration); | 320 CreateEncodedBuffer(kTimestamp, kDuration); |
| 321 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); | 321 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 409 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); | 409 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); |
| 410 EXPECT_EQ(kTimestamp + kDuration / 2 + 3 * kDuration / 4, | 410 EXPECT_EQ(kTimestamp + kDuration / 2 + 3 * kDuration / 4, |
| 411 decoded_buffer->timestamp()); | 411 decoded_buffer->timestamp()); |
| 412 EXPECT_EQ(kDuration / 2, decoded_buffer->duration()); | 412 EXPECT_EQ(kDuration / 2, decoded_buffer->duration()); |
| 413 EXPECT_EQ(kTestFrames / 2, decoded_buffer->frame_count()); | 413 EXPECT_EQ(kTestFrames / 2, decoded_buffer->frame_count()); |
| 414 ASSERT_FLOAT_EQ(kTestFrames / 2 * kDataStep, | 414 ASSERT_FLOAT_EQ(kTestFrames / 2 * kDataStep, |
| 415 ExtractDecodedData(decoded_buffer, 0)); | 415 ExtractDecodedData(decoded_buffer, 0)); |
| 416 } | 416 } |
| 417 | 417 |
| 418 TEST(AudioDiscardHelperTest, DelayedDiscardInitialDiscardAndDiscardPadding) { | 418 TEST(AudioDiscardHelperTest, DelayedDiscardInitialDiscardAndDiscardPadding) { |
| 419 AudioDiscardHelper discard_helper(kSampleRate, 0); | 419 AudioDiscardHelper discard_helper(kSampleRate, 0, true); |
| 420 ASSERT_FALSE(discard_helper.initialized()); | 420 ASSERT_FALSE(discard_helper.initialized()); |
| 421 | 421 |
| 422 const base::TimeDelta kTimestamp = base::TimeDelta(); | 422 const base::TimeDelta kTimestamp = base::TimeDelta(); |
| 423 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); | 423 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); |
| 424 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); | 424 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); |
| 425 | 425 |
| 426 scoped_refptr<DecoderBuffer> encoded_buffer = | 426 scoped_refptr<DecoderBuffer> encoded_buffer = |
| 427 CreateEncodedBuffer(kTimestamp, kDuration); | 427 CreateEncodedBuffer(kTimestamp, kDuration); |
| 428 | 428 |
| 429 // Set all the discard values to be different to ensure each is properly used. | 429 // Set all the discard values to be different to ensure each is properly used. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 444 // previous encoded buffer are applied. | 444 // previous encoded buffer are applied. |
| 445 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); | 445 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); |
| 446 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); | 446 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); |
| 447 EXPECT_EQ(kDuration - kDuration / 4 - kDuration / 8 - kDuration / 16, | 447 EXPECT_EQ(kDuration - kDuration / 4 - kDuration / 8 - kDuration / 16, |
| 448 decoded_buffer->duration()); | 448 decoded_buffer->duration()); |
| 449 EXPECT_EQ(kTestFrames - kTestFrames / 4 - kTestFrames / 8 - kTestFrames / 16, | 449 EXPECT_EQ(kTestFrames - kTestFrames / 4 - kTestFrames / 8 - kTestFrames / 16, |
| 450 decoded_buffer->frame_count()); | 450 decoded_buffer->frame_count()); |
| 451 } | 451 } |
| 452 | 452 |
| 453 TEST(AudioDiscardHelperTest, CompleteDiscard) { | 453 TEST(AudioDiscardHelperTest, CompleteDiscard) { |
| 454 AudioDiscardHelper discard_helper(kSampleRate, 0); | 454 AudioDiscardHelper discard_helper(kSampleRate, 0, false); |
| 455 ASSERT_FALSE(discard_helper.initialized()); | 455 ASSERT_FALSE(discard_helper.initialized()); |
| 456 | 456 |
| 457 const base::TimeDelta kTimestamp = base::TimeDelta(); | 457 const base::TimeDelta kTimestamp = base::TimeDelta(); |
| 458 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); | 458 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); |
| 459 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); | 459 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); |
| 460 discard_helper.Reset(0); | 460 discard_helper.Reset(0); |
| 461 | 461 |
| 462 scoped_refptr<DecoderBuffer> encoded_buffer = | 462 scoped_refptr<DecoderBuffer> encoded_buffer = |
| 463 CreateEncodedBuffer(kTimestamp, kDuration); | 463 CreateEncodedBuffer(kTimestamp, kDuration); |
| 464 encoded_buffer->set_discard_padding( | 464 encoded_buffer->set_discard_padding( |
| 465 std::make_pair(kInfiniteDuration, base::TimeDelta())); | 465 std::make_pair(kInfiniteDuration, base::TimeDelta())); |
| 466 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); | 466 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); |
| 467 | 467 |
| 468 // Verify all of the first buffer is discarded. | 468 // Verify all of the first buffer is discarded. |
| 469 ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); | 469 ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); |
| 470 ASSERT_TRUE(discard_helper.initialized()); | 470 ASSERT_TRUE(discard_helper.initialized()); |
| 471 encoded_buffer->set_timestamp(kTimestamp + kDuration); | 471 encoded_buffer->set_timestamp(kTimestamp + kDuration); |
| 472 encoded_buffer->set_discard_padding(DecoderBuffer::DiscardPadding()); | 472 encoded_buffer->set_discard_padding(DecoderBuffer::DiscardPadding()); |
| 473 | 473 |
| 474 // Verify a second buffer goes through untouched. | 474 // Verify a second buffer goes through untouched. |
| 475 decoded_buffer = CreateDecodedBuffer(kTestFrames / 2); | 475 decoded_buffer = CreateDecodedBuffer(kTestFrames / 2); |
| 476 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); | 476 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); |
| 477 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); | 477 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); |
| 478 EXPECT_EQ(kDuration / 2, decoded_buffer->duration()); | 478 EXPECT_EQ(kDuration / 2, decoded_buffer->duration()); |
| 479 EXPECT_EQ(kTestFrames / 2, decoded_buffer->frame_count()); | 479 EXPECT_EQ(kTestFrames / 2, decoded_buffer->frame_count()); |
| 480 ASSERT_FLOAT_EQ(0.0f, ExtractDecodedData(decoded_buffer, 0)); | 480 ASSERT_FLOAT_EQ(0.0f, ExtractDecodedData(decoded_buffer, 0)); |
| 481 } | 481 } |
| 482 | 482 |
| 483 TEST(AudioDiscardHelperTest, CompleteDiscardWithDelayedDiscard) { | 483 TEST(AudioDiscardHelperTest, CompleteDiscardWithDelayedDiscard) { |
| 484 AudioDiscardHelper discard_helper(kSampleRate, 0); | 484 AudioDiscardHelper discard_helper(kSampleRate, 0, true); |
| 485 ASSERT_FALSE(discard_helper.initialized()); | 485 ASSERT_FALSE(discard_helper.initialized()); |
| 486 | 486 |
| 487 const base::TimeDelta kTimestamp = base::TimeDelta(); | 487 const base::TimeDelta kTimestamp = base::TimeDelta(); |
| 488 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); | 488 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); |
| 489 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); | 489 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); |
| 490 discard_helper.Reset(0); | 490 discard_helper.Reset(0); |
| 491 | 491 |
| 492 scoped_refptr<DecoderBuffer> encoded_buffer = | 492 scoped_refptr<DecoderBuffer> encoded_buffer = |
| 493 CreateEncodedBuffer(kTimestamp, kDuration); | 493 CreateEncodedBuffer(kTimestamp, kDuration); |
| 494 encoded_buffer->set_discard_padding( | 494 encoded_buffer->set_discard_padding( |
| (...skipping 15 matching lines...) Expand all Loading... |
| 510 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); | 510 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); |
| 511 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); | 511 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); |
| 512 EXPECT_EQ(kDuration / 2, decoded_buffer->duration()); | 512 EXPECT_EQ(kDuration / 2, decoded_buffer->duration()); |
| 513 EXPECT_EQ(kTestFrames / 2, decoded_buffer->frame_count()); | 513 EXPECT_EQ(kTestFrames / 2, decoded_buffer->frame_count()); |
| 514 ASSERT_FLOAT_EQ(0.0f, ExtractDecodedData(decoded_buffer, 0)); | 514 ASSERT_FLOAT_EQ(0.0f, ExtractDecodedData(decoded_buffer, 0)); |
| 515 } | 515 } |
| 516 | 516 |
| 517 TEST(AudioDiscardHelperTest, CompleteDiscardWithInitialDiscardDecoderDelay) { | 517 TEST(AudioDiscardHelperTest, CompleteDiscardWithInitialDiscardDecoderDelay) { |
| 518 // Use a decoder delay of 5ms. | 518 // Use a decoder delay of 5ms. |
| 519 const int kDecoderDelay = kSampleRate / 100 / 2; | 519 const int kDecoderDelay = kSampleRate / 100 / 2; |
| 520 AudioDiscardHelper discard_helper(kSampleRate, kDecoderDelay); | 520 AudioDiscardHelper discard_helper(kSampleRate, kDecoderDelay, false); |
| 521 ASSERT_FALSE(discard_helper.initialized()); | 521 ASSERT_FALSE(discard_helper.initialized()); |
| 522 discard_helper.Reset(kDecoderDelay); | 522 discard_helper.Reset(kDecoderDelay); |
| 523 | 523 |
| 524 const base::TimeDelta kTimestamp = base::TimeDelta(); | 524 const base::TimeDelta kTimestamp = base::TimeDelta(); |
| 525 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); | 525 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); |
| 526 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); | 526 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); |
| 527 | 527 |
| 528 scoped_refptr<DecoderBuffer> encoded_buffer = | 528 scoped_refptr<DecoderBuffer> encoded_buffer = |
| 529 CreateEncodedBuffer(kTimestamp, kDuration); | 529 CreateEncodedBuffer(kTimestamp, kDuration); |
| 530 encoded_buffer->set_discard_padding( | 530 encoded_buffer->set_discard_padding( |
| (...skipping 10 matching lines...) Expand all Loading... |
| 541 decoded_buffer = CreateDecodedBuffer(kTestFrames * 2); | 541 decoded_buffer = CreateDecodedBuffer(kTestFrames * 2); |
| 542 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); | 542 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); |
| 543 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); | 543 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); |
| 544 EXPECT_EQ(kDuration * 2 - kDuration / 2, decoded_buffer->duration()); | 544 EXPECT_EQ(kDuration * 2 - kDuration / 2, decoded_buffer->duration()); |
| 545 EXPECT_EQ(kTestFrames * 2 - kDecoderDelay, decoded_buffer->frame_count()); | 545 EXPECT_EQ(kTestFrames * 2 - kDecoderDelay, decoded_buffer->frame_count()); |
| 546 ASSERT_FLOAT_EQ(kDecoderDelay * kDataStep, | 546 ASSERT_FLOAT_EQ(kDecoderDelay * kDataStep, |
| 547 ExtractDecodedData(decoded_buffer, 0)); | 547 ExtractDecodedData(decoded_buffer, 0)); |
| 548 } | 548 } |
| 549 | 549 |
| 550 } // namespace media | 550 } // namespace media |
| OLD | NEW |