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

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

Issue 2543633006: To M56: Use ffmpeg for opus decoding, no need to maintain our decoder. (Closed)
Patch Set: Created 4 years 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
« no previous file with comments | « media/base/audio_discard_helper.cc ('k') | media/ffmpeg/ffmpeg_common.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « media/base/audio_discard_helper.cc ('k') | media/ffmpeg/ffmpeg_common.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698