| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 // Test to verify correct operation for externally created decoders. | 11 // Test to verify correct operation for externally created decoders. |
| 12 | 12 |
| 13 #include "testing/gmock/include/gmock/gmock.h" | 13 #include "testing/gmock/include/gmock/gmock.h" |
| 14 #include "webrtc/base/scoped_ptr.h" | 14 #include "webrtc/base/scoped_ptr.h" |
| 15 #include "webrtc/modules/audio_coding/neteq/mock/mock_external_decoder_pcm16b.h" | 15 #include "webrtc/modules/audio_coding/neteq/mock/mock_external_decoder_pcm16b.h" |
| 16 #include "webrtc/modules/audio_coding/neteq/tools/input_audio_file.h" | 16 #include "webrtc/modules/audio_coding/neteq/tools/input_audio_file.h" |
| 17 #include "webrtc/modules/audio_coding/neteq/tools/neteq_external_decoder_test.h" | 17 #include "webrtc/modules/audio_coding/neteq/tools/neteq_external_decoder_test.h" |
| 18 #include "webrtc/modules/audio_coding/neteq/tools/rtp_generator.h" | 18 #include "webrtc/modules/audio_coding/neteq/tools/rtp_generator.h" |
| 19 #include "webrtc/test/testsupport/fileutils.h" | 19 #include "webrtc/test/testsupport/fileutils.h" |
| 20 #include "webrtc/test/testsupport/gtest_disable.h" | |
| 21 | 20 |
| 22 namespace webrtc { | 21 namespace webrtc { |
| 23 | 22 |
| 24 using ::testing::_; | 23 using ::testing::_; |
| 25 using ::testing::Return; | 24 using ::testing::Return; |
| 26 | 25 |
| 27 class NetEqExternalDecoderUnitTest : public test::NetEqExternalDecoderTest { | 26 class NetEqExternalDecoderUnitTest : public test::NetEqExternalDecoderTest { |
| 28 protected: | 27 protected: |
| 29 static const int kFrameSizeMs = 10; // Frame size of Pcm16B. | 28 static const int kFrameSizeMs = 10; // Frame size of Pcm16B. |
| 30 | 29 |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 227 | 226 |
| 228 int NumExpectedDecodeCalls(int num_loops) override { return num_loops; } | 227 int NumExpectedDecodeCalls(int num_loops) override { return num_loops; } |
| 229 | 228 |
| 230 private: | 229 private: |
| 231 int sample_rate_hz_; | 230 int sample_rate_hz_; |
| 232 rtc::scoped_ptr<NetEq> neteq_internal_; | 231 rtc::scoped_ptr<NetEq> neteq_internal_; |
| 233 int16_t output_internal_[kMaxBlockSize]; | 232 int16_t output_internal_[kMaxBlockSize]; |
| 234 int16_t output_[kMaxBlockSize]; | 233 int16_t output_[kMaxBlockSize]; |
| 235 }; | 234 }; |
| 236 | 235 |
| 237 TEST_F(NetEqExternalVsInternalDecoderTest, DISABLED_ON_IOS(RunTest)) { | 236 TEST_F(NetEqExternalVsInternalDecoderTest, RunTest) { |
| 238 RunTest(100); // Run 100 laps @ 10 ms each in the test loop. | 237 RunTest(100); // Run 100 laps @ 10 ms each in the test loop. |
| 239 } | 238 } |
| 240 | 239 |
| 241 class LargeTimestampJumpTest : public NetEqExternalDecoderUnitTest, | 240 class LargeTimestampJumpTest : public NetEqExternalDecoderUnitTest, |
| 242 public ::testing::Test { | 241 public ::testing::Test { |
| 243 protected: | 242 protected: |
| 244 static const int kMaxBlockSize = 480; // 10 ms @ 48 kHz. | 243 static const int kMaxBlockSize = 480; // 10 ms @ 48 kHz. |
| 245 | 244 |
| 246 enum TestStates { | 245 enum TestStates { |
| 247 kInitialPhase, | 246 kInitialPhase, |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 // last packets not being decoded. | 321 // last packets not being decoded. |
| 323 return num_loops - 2; | 322 return num_loops - 2; |
| 324 } | 323 } |
| 325 | 324 |
| 326 TestStates test_state_; | 325 TestStates test_state_; |
| 327 | 326 |
| 328 private: | 327 private: |
| 329 int16_t output_[kMaxBlockSize]; | 328 int16_t output_[kMaxBlockSize]; |
| 330 }; | 329 }; |
| 331 | 330 |
| 332 TEST_F(LargeTimestampJumpTest, DISABLED_ON_IOS(JumpLongerThanHalfRange)) { | 331 TEST_F(LargeTimestampJumpTest, JumpLongerThanHalfRange) { |
| 333 // Set the timestamp series to start at 2880, increase to 7200, then jump to | 332 // Set the timestamp series to start at 2880, increase to 7200, then jump to |
| 334 // 2869342376. The sequence numbers start at 42076 and increase by 1 for each | 333 // 2869342376. The sequence numbers start at 42076 and increase by 1 for each |
| 335 // packet, also when the timestamp jumps. | 334 // packet, also when the timestamp jumps. |
| 336 static const uint16_t kStartSeqeunceNumber = 42076; | 335 static const uint16_t kStartSeqeunceNumber = 42076; |
| 337 static const uint32_t kStartTimestamp = 2880; | 336 static const uint32_t kStartTimestamp = 2880; |
| 338 static const uint32_t kJumpFromTimestamp = 7200; | 337 static const uint32_t kJumpFromTimestamp = 7200; |
| 339 static const uint32_t kJumpToTimestamp = 2869342376; | 338 static const uint32_t kJumpToTimestamp = 2869342376; |
| 340 static_assert(kJumpFromTimestamp < kJumpToTimestamp, | 339 static_assert(kJumpFromTimestamp < kJumpToTimestamp, |
| 341 "timestamp jump should not result in wrap"); | 340 "timestamp jump should not result in wrap"); |
| 342 static_assert( | 341 static_assert( |
| 343 static_cast<uint32_t>(kJumpToTimestamp - kJumpFromTimestamp) > 0x7FFFFFFF, | 342 static_cast<uint32_t>(kJumpToTimestamp - kJumpFromTimestamp) > 0x7FFFFFFF, |
| 344 "jump should be larger than half range"); | 343 "jump should be larger than half range"); |
| 345 // Replace the default RTP generator with one that jumps in timestamp. | 344 // Replace the default RTP generator with one that jumps in timestamp. |
| 346 ResetRtpGenerator(new test::TimestampJumpRtpGenerator(samples_per_ms(), | 345 ResetRtpGenerator(new test::TimestampJumpRtpGenerator(samples_per_ms(), |
| 347 kStartSeqeunceNumber, | 346 kStartSeqeunceNumber, |
| 348 kStartTimestamp, | 347 kStartTimestamp, |
| 349 kJumpFromTimestamp, | 348 kJumpFromTimestamp, |
| 350 kJumpToTimestamp)); | 349 kJumpToTimestamp)); |
| 351 | 350 |
| 352 RunTest(130); // Run 130 laps @ 10 ms each in the test loop. | 351 RunTest(130); // Run 130 laps @ 10 ms each in the test loop. |
| 353 EXPECT_EQ(kRecovered, test_state_); | 352 EXPECT_EQ(kRecovered, test_state_); |
| 354 } | 353 } |
| 355 | 354 |
| 356 TEST_F(LargeTimestampJumpTest, | 355 TEST_F(LargeTimestampJumpTest, JumpLongerThanHalfRangeAndWrap) { |
| 357 DISABLED_ON_IOS(JumpLongerThanHalfRangeAndWrap)) { | |
| 358 // Make a jump larger than half the 32-bit timestamp range. Set the start | 356 // Make a jump larger than half the 32-bit timestamp range. Set the start |
| 359 // timestamp such that the jump will result in a wrap around. | 357 // timestamp such that the jump will result in a wrap around. |
| 360 static const uint16_t kStartSeqeunceNumber = 42076; | 358 static const uint16_t kStartSeqeunceNumber = 42076; |
| 361 // Set the jump length slightly larger than 2^31. | 359 // Set the jump length slightly larger than 2^31. |
| 362 static const uint32_t kStartTimestamp = 3221223116; | 360 static const uint32_t kStartTimestamp = 3221223116; |
| 363 static const uint32_t kJumpFromTimestamp = 3221223216; | 361 static const uint32_t kJumpFromTimestamp = 3221223216; |
| 364 static const uint32_t kJumpToTimestamp = 1073744278; | 362 static const uint32_t kJumpToTimestamp = 1073744278; |
| 365 static_assert(kJumpToTimestamp < kJumpFromTimestamp, | 363 static_assert(kJumpToTimestamp < kJumpFromTimestamp, |
| 366 "timestamp jump should result in wrap"); | 364 "timestamp jump should result in wrap"); |
| 367 static_assert( | 365 static_assert( |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 default: { FAIL(); } | 404 default: { FAIL(); } |
| 407 } | 405 } |
| 408 } | 406 } |
| 409 | 407 |
| 410 int NumExpectedDecodeCalls(int num_loops) override { | 408 int NumExpectedDecodeCalls(int num_loops) override { |
| 411 // Some packets won't be decoded because of the timestamp jump. | 409 // Some packets won't be decoded because of the timestamp jump. |
| 412 return num_loops - 2; | 410 return num_loops - 2; |
| 413 } | 411 } |
| 414 }; | 412 }; |
| 415 | 413 |
| 416 TEST_F(ShortTimestampJumpTest, DISABLED_ON_IOS(JumpShorterThanHalfRange)) { | 414 TEST_F(ShortTimestampJumpTest, JumpShorterThanHalfRange) { |
| 417 // Make a jump shorter than half the 32-bit timestamp range. Set the start | 415 // Make a jump shorter than half the 32-bit timestamp range. Set the start |
| 418 // timestamp such that the jump will not result in a wrap around. | 416 // timestamp such that the jump will not result in a wrap around. |
| 419 static const uint16_t kStartSeqeunceNumber = 42076; | 417 static const uint16_t kStartSeqeunceNumber = 42076; |
| 420 // Set the jump length slightly smaller than 2^31. | 418 // Set the jump length slightly smaller than 2^31. |
| 421 static const uint32_t kStartTimestamp = 4711; | 419 static const uint32_t kStartTimestamp = 4711; |
| 422 static const uint32_t kJumpFromTimestamp = 4811; | 420 static const uint32_t kJumpFromTimestamp = 4811; |
| 423 static const uint32_t kJumpToTimestamp = 2147483747; | 421 static const uint32_t kJumpToTimestamp = 2147483747; |
| 424 static_assert(kJumpFromTimestamp < kJumpToTimestamp, | 422 static_assert(kJumpFromTimestamp < kJumpToTimestamp, |
| 425 "timestamp jump should not result in wrap"); | 423 "timestamp jump should not result in wrap"); |
| 426 static_assert( | 424 static_assert( |
| 427 static_cast<uint32_t>(kJumpToTimestamp - kJumpFromTimestamp) < 0x7FFFFFFF, | 425 static_cast<uint32_t>(kJumpToTimestamp - kJumpFromTimestamp) < 0x7FFFFFFF, |
| 428 "jump should be smaller than half range"); | 426 "jump should be smaller than half range"); |
| 429 // Replace the default RTP generator with one that jumps in timestamp. | 427 // Replace the default RTP generator with one that jumps in timestamp. |
| 430 ResetRtpGenerator(new test::TimestampJumpRtpGenerator(samples_per_ms(), | 428 ResetRtpGenerator(new test::TimestampJumpRtpGenerator(samples_per_ms(), |
| 431 kStartSeqeunceNumber, | 429 kStartSeqeunceNumber, |
| 432 kStartTimestamp, | 430 kStartTimestamp, |
| 433 kJumpFromTimestamp, | 431 kJumpFromTimestamp, |
| 434 kJumpToTimestamp)); | 432 kJumpToTimestamp)); |
| 435 | 433 |
| 436 RunTest(130); // Run 130 laps @ 10 ms each in the test loop. | 434 RunTest(130); // Run 130 laps @ 10 ms each in the test loop. |
| 437 EXPECT_EQ(kRecovered, test_state_); | 435 EXPECT_EQ(kRecovered, test_state_); |
| 438 } | 436 } |
| 439 | 437 |
| 440 TEST_F(ShortTimestampJumpTest, | 438 TEST_F(ShortTimestampJumpTest, JumpShorterThanHalfRangeAndWrap) { |
| 441 DISABLED_ON_IOS(JumpShorterThanHalfRangeAndWrap)) { | |
| 442 // Make a jump shorter than half the 32-bit timestamp range. Set the start | 439 // Make a jump shorter than half the 32-bit timestamp range. Set the start |
| 443 // timestamp such that the jump will result in a wrap around. | 440 // timestamp such that the jump will result in a wrap around. |
| 444 static const uint16_t kStartSeqeunceNumber = 42076; | 441 static const uint16_t kStartSeqeunceNumber = 42076; |
| 445 // Set the jump length slightly smaller than 2^31. | 442 // Set the jump length slightly smaller than 2^31. |
| 446 static const uint32_t kStartTimestamp = 3221227827; | 443 static const uint32_t kStartTimestamp = 3221227827; |
| 447 static const uint32_t kJumpFromTimestamp = 3221227927; | 444 static const uint32_t kJumpFromTimestamp = 3221227927; |
| 448 static const uint32_t kJumpToTimestamp = 1073739567; | 445 static const uint32_t kJumpToTimestamp = 1073739567; |
| 449 static_assert(kJumpToTimestamp < kJumpFromTimestamp, | 446 static_assert(kJumpToTimestamp < kJumpFromTimestamp, |
| 450 "timestamp jump should result in wrap"); | 447 "timestamp jump should result in wrap"); |
| 451 static_assert( | 448 static_assert( |
| 452 static_cast<uint32_t>(kJumpToTimestamp - kJumpFromTimestamp) < 0x7FFFFFFF, | 449 static_cast<uint32_t>(kJumpToTimestamp - kJumpFromTimestamp) < 0x7FFFFFFF, |
| 453 "jump should be smaller than half range"); | 450 "jump should be smaller than half range"); |
| 454 // Replace the default RTP generator with one that jumps in timestamp. | 451 // Replace the default RTP generator with one that jumps in timestamp. |
| 455 ResetRtpGenerator(new test::TimestampJumpRtpGenerator(samples_per_ms(), | 452 ResetRtpGenerator(new test::TimestampJumpRtpGenerator(samples_per_ms(), |
| 456 kStartSeqeunceNumber, | 453 kStartSeqeunceNumber, |
| 457 kStartTimestamp, | 454 kStartTimestamp, |
| 458 kJumpFromTimestamp, | 455 kJumpFromTimestamp, |
| 459 kJumpToTimestamp)); | 456 kJumpToTimestamp)); |
| 460 | 457 |
| 461 RunTest(130); // Run 130 laps @ 10 ms each in the test loop. | 458 RunTest(130); // Run 130 laps @ 10 ms each in the test loop. |
| 462 EXPECT_EQ(kRecovered, test_state_); | 459 EXPECT_EQ(kRecovered, test_state_); |
| 463 } | 460 } |
| 464 | 461 |
| 465 } // namespace webrtc | 462 } // namespace webrtc |
| OLD | NEW |