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

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

Issue 293053005: Add support for complete buffer discards. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Comments. Created 6 years, 7 months 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 | Annotate | Revision Log
« no previous file with comments | « media/base/audio_discard_helper.cc ('k') | media/base/decoder_buffer.h » ('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 "base/memory/scoped_ptr.h" 5 #include "base/memory/scoped_ptr.h"
6 #include "media/base/audio_buffer.h" 6 #include "media/base/audio_buffer.h"
7 #include "media/base/audio_bus.h" 7 #include "media/base/audio_bus.h"
8 #include "media/base/audio_discard_helper.h" 8 #include "media/base/audio_discard_helper.h"
9 #include "media/base/buffers.h" 9 #include "media/base/buffers.h"
10 #include "media/base/decoder_buffer.h" 10 #include "media/base/decoder_buffer.h"
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 299
300 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); 300 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
301 ASSERT_TRUE(discard_helper.initialized()); 301 ASSERT_TRUE(discard_helper.initialized());
302 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); 302 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp());
303 EXPECT_EQ(kDuration - kDuration / 4 - kDuration / 8 - kDuration / 16, 303 EXPECT_EQ(kDuration - kDuration / 4 - kDuration / 8 - kDuration / 16,
304 decoded_buffer->duration()); 304 decoded_buffer->duration());
305 EXPECT_EQ(kTestFrames - kTestFrames / 4 - kTestFrames / 8 - kTestFrames / 16, 305 EXPECT_EQ(kTestFrames - kTestFrames / 4 - kTestFrames / 8 - kTestFrames / 16,
306 decoded_buffer->frame_count()); 306 decoded_buffer->frame_count());
307 } 307 }
308 308
309 TEST(AudioDiscardHelperTest, InitialDiscardAndDiscardPaddingAndCodecDelay) { 309 TEST(AudioDiscardHelperTest, InitialDiscardAndDiscardPaddingAndDecoderDelay) {
310 // Use a codec delay of 5ms. 310 // Use a decoder delay of 5ms.
311 const int kCodecDelay = kSampleRate / 100 / 2; 311 const int kDecoderDelay = kSampleRate / 100 / 2;
312 AudioDiscardHelper discard_helper(kSampleRate, kCodecDelay); 312 AudioDiscardHelper discard_helper(kSampleRate, kDecoderDelay);
313 ASSERT_FALSE(discard_helper.initialized()); 313 ASSERT_FALSE(discard_helper.initialized());
314 discard_helper.Reset(kCodecDelay); 314 discard_helper.Reset(kDecoderDelay);
315 315
316 const base::TimeDelta kTimestamp = base::TimeDelta(); 316 const base::TimeDelta kTimestamp = base::TimeDelta();
317 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); 317 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10);
318 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); 318 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration);
319 319
320 scoped_refptr<DecoderBuffer> encoded_buffer = 320 scoped_refptr<DecoderBuffer> encoded_buffer =
321 CreateEncodedBuffer(kTimestamp, kDuration); 321 CreateEncodedBuffer(kTimestamp, kDuration);
322 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames); 322 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames);
323 323
324 // Set a discard padding equivalent to half of the buffer. 324 // Set a discard padding equivalent to half of the buffer.
325 encoded_buffer->set_discard_padding( 325 encoded_buffer->set_discard_padding(
326 std::make_pair(kDuration / 2, base::TimeDelta())); 326 std::make_pair(kDuration / 2, base::TimeDelta()));
327 327
328 // All of the first buffer should be discarded. 328 // All of the first buffer should be discarded.
329 ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); 329 ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
330 ASSERT_TRUE(discard_helper.initialized()); 330 ASSERT_TRUE(discard_helper.initialized());
331 331
332 // Processing another buffer (with the same discard padding) should discard 332 // Processing another buffer (with the same discard padding) should discard
333 // the back half of the buffer since kCodecDelay is half a buffer. 333 // the back half of the buffer since kDecoderDelay is half a buffer.
334 encoded_buffer->set_timestamp(kTimestamp + kDuration); 334 encoded_buffer->set_timestamp(kTimestamp + kDuration);
335 decoded_buffer = CreateDecodedBuffer(kTestFrames); 335 decoded_buffer = CreateDecodedBuffer(kTestFrames);
336 ASSERT_FLOAT_EQ(0.0f, ExtractDecodedData(decoded_buffer, 0)); 336 ASSERT_FLOAT_EQ(0.0f, ExtractDecodedData(decoded_buffer, 0));
337 ASSERT_NEAR(kCodecDelay * kDataStep, 337 ASSERT_NEAR(kDecoderDelay * kDataStep,
338 ExtractDecodedData(decoded_buffer, kCodecDelay), 338 ExtractDecodedData(decoded_buffer, kDecoderDelay),
339 kDataStep * 1000); 339 kDataStep * 1000);
340 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); 340 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
341 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); 341 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp());
342 EXPECT_EQ(kDuration / 2, decoded_buffer->duration()); 342 EXPECT_EQ(kDuration / 2, decoded_buffer->duration());
343 EXPECT_EQ(kTestFrames / 2, decoded_buffer->frame_count()); 343 EXPECT_EQ(kTestFrames / 2, decoded_buffer->frame_count());
344 344
345 // Verify it was actually the latter half of the buffer that was removed. 345 // Verify it was actually the latter half of the buffer that was removed.
346 ASSERT_FLOAT_EQ(0.0f, ExtractDecodedData(decoded_buffer, 0)); 346 ASSERT_FLOAT_EQ(0.0f, ExtractDecodedData(decoded_buffer, 0));
347 } 347 }
348 348
(...skipping 25 matching lines...) Expand all
374 // Verify that when the decoded buffer is consumed, the discards from the 374 // Verify that when the decoded buffer is consumed, the discards from the
375 // previous encoded buffer are applied. 375 // previous encoded buffer are applied.
376 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer)); 376 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
377 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp()); 377 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp());
378 EXPECT_EQ(kDuration - kDuration / 4 - kDuration / 8 - kDuration / 16, 378 EXPECT_EQ(kDuration - kDuration / 4 - kDuration / 8 - kDuration / 16,
379 decoded_buffer->duration()); 379 decoded_buffer->duration());
380 EXPECT_EQ(kTestFrames - kTestFrames / 4 - kTestFrames / 8 - kTestFrames / 16, 380 EXPECT_EQ(kTestFrames - kTestFrames / 4 - kTestFrames / 8 - kTestFrames / 16,
381 decoded_buffer->frame_count()); 381 decoded_buffer->frame_count());
382 } 382 }
383 383
384 TEST(AudioDiscardHelperTest, CompleteDiscard) {
385 AudioDiscardHelper discard_helper(kSampleRate, 0);
386 ASSERT_FALSE(discard_helper.initialized());
387
388 const base::TimeDelta kTimestamp = base::TimeDelta();
389 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10);
390 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration);
391 discard_helper.Reset(0);
392
393 scoped_refptr<DecoderBuffer> encoded_buffer =
394 CreateEncodedBuffer(kTimestamp, kDuration);
395 encoded_buffer->set_discard_padding(
396 std::make_pair(kInfiniteDuration(), base::TimeDelta()));
397 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames);
398
399 // Verify all of the first buffer is discarded.
400 ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
401 ASSERT_TRUE(discard_helper.initialized());
402 encoded_buffer->set_timestamp(kTimestamp + kDuration);
403 encoded_buffer->set_discard_padding(DecoderBuffer::DiscardPadding());
404
405 // Verify a second buffer goes through untouched.
406 decoded_buffer = CreateDecodedBuffer(kTestFrames / 2);
407 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
408 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp());
409 EXPECT_EQ(kDuration / 2, decoded_buffer->duration());
410 EXPECT_EQ(kTestFrames / 2, decoded_buffer->frame_count());
411 ASSERT_FLOAT_EQ(0.0f, ExtractDecodedData(decoded_buffer, 0));
412 }
413
414 TEST(AudioDiscardHelperTest, CompleteDiscardWithDelayedDiscard) {
415 AudioDiscardHelper discard_helper(kSampleRate, 0);
416 ASSERT_FALSE(discard_helper.initialized());
417
418 const base::TimeDelta kTimestamp = base::TimeDelta();
419 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10);
420 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration);
421 discard_helper.Reset(0);
422
423 scoped_refptr<DecoderBuffer> encoded_buffer =
424 CreateEncodedBuffer(kTimestamp, kDuration);
425 encoded_buffer->set_discard_padding(
426 std::make_pair(kInfiniteDuration(), base::TimeDelta()));
427 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames);
428
429 // Setup a delayed discard.
430 ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, NULL));
431 ASSERT_TRUE(discard_helper.initialized());
432
433 // Verify the first output buffer is dropped.
434 encoded_buffer->set_timestamp(kTimestamp + kDuration);
435 encoded_buffer->set_discard_padding(DecoderBuffer::DiscardPadding());
436 ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
437
438 // Verify the second buffer goes through untouched.
439 encoded_buffer->set_timestamp(kTimestamp + 2 * kDuration);
440 decoded_buffer = CreateDecodedBuffer(kTestFrames / 2);
441 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
442 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp());
443 EXPECT_EQ(kDuration / 2, decoded_buffer->duration());
444 EXPECT_EQ(kTestFrames / 2, decoded_buffer->frame_count());
445 ASSERT_FLOAT_EQ(0.0f, ExtractDecodedData(decoded_buffer, 0));
446 }
447
448 TEST(AudioDiscardHelperTest, CompleteDiscardWithInitialDiscardDecoderDelay) {
449 // Use a decoder delay of 5ms.
450 const int kDecoderDelay = kSampleRate / 100 / 2;
451 AudioDiscardHelper discard_helper(kSampleRate, kDecoderDelay);
452 ASSERT_FALSE(discard_helper.initialized());
453 discard_helper.Reset(kDecoderDelay);
454
455 const base::TimeDelta kTimestamp = base::TimeDelta();
456 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10);
457 const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration);
458
459 scoped_refptr<DecoderBuffer> encoded_buffer =
460 CreateEncodedBuffer(kTimestamp, kDuration);
461 encoded_buffer->set_discard_padding(
462 std::make_pair(kInfiniteDuration(), base::TimeDelta()));
463 scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames);
464
465 // Verify all of the first buffer is discarded.
466 ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
467 ASSERT_TRUE(discard_helper.initialized());
468 encoded_buffer->set_timestamp(kTimestamp + kDuration);
469 encoded_buffer->set_discard_padding(DecoderBuffer::DiscardPadding());
470
471 // Verify 5ms off the front of the second buffer is discarded.
472 decoded_buffer = CreateDecodedBuffer(kTestFrames * 2);
473 ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
474 EXPECT_EQ(kTimestamp, decoded_buffer->timestamp());
475 EXPECT_EQ(kDuration * 2 - kDuration / 2, decoded_buffer->duration());
476 EXPECT_EQ(kTestFrames * 2 - kDecoderDelay, decoded_buffer->frame_count());
477 ASSERT_FLOAT_EQ(kDecoderDelay * kDataStep,
478 ExtractDecodedData(decoded_buffer, 0));
479 }
480
384 } // namespace media 481 } // namespace media
OLDNEW
« no previous file with comments | « media/base/audio_discard_helper.cc ('k') | media/base/decoder_buffer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698