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 |