Index: webrtc/modules/audio_coding/codecs/ilbc/ilbc_unittest.cc |
diff --git a/webrtc/modules/audio_coding/codecs/ilbc/ilbc_unittest.cc b/webrtc/modules/audio_coding/codecs/ilbc/ilbc_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c23cbc44e808a60185b30a6ad93d18778fdbe160 |
--- /dev/null |
+++ b/webrtc/modules/audio_coding/codecs/ilbc/ilbc_unittest.cc |
@@ -0,0 +1,57 @@ |
+/* |
+ * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
+ * |
+ * Use of this source code is governed by a BSD-style license |
+ * that can be found in the LICENSE file in the root of the source |
+ * tree. An additional intellectual property rights grant can be found |
+ * in the file PATENTS. All contributing project authors may |
+ * be found in the AUTHORS file in the root of the source tree. |
+ */ |
+ |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "webrtc/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.h" |
+#include "webrtc/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.h" |
+ |
+namespace webrtc { |
+ |
+TEST(IlbcTest, BadPacket) { |
+ // Get a good packet. |
+ AudioEncoderIlbc::Config config; |
+ config.frame_size_ms = 20; // We need 20 ms rather than the default 30 ms; |
+ // otherwise, all possible values of cb_index[2] |
+ // are valid. |
+ AudioEncoderIlbc encoder(config); |
+ std::vector<int16_t> samples(encoder.SampleRateHz() / 100, 4711); |
+ rtc::Buffer packet; |
+ int num_10ms_chunks = 0; |
+ while (packet.size() == 0) { |
+ encoder.Encode(0, samples, &packet); |
+ num_10ms_chunks += 1; |
+ } |
+ |
+ // Break the packet by setting all bits of the unsigned 7-bit number |
+ // cb_index[2] to 1, giving it a value of 127. For a 20 ms packet, this is |
+ // too large. |
+ EXPECT_EQ(38u, packet.size()); |
+ rtc::Buffer bad_packet(packet.data(), packet.size()); |
+ bad_packet[29] |= 0x3f; // Bits 1-6. |
+ bad_packet[30] |= 0x80; // Bit 0. |
+ |
+ // Decode the bad packet. We expect the decoder to respond by returning -1. |
+ AudioDecoderIlbc decoder; |
+ std::vector<int16_t> decoded_samples(num_10ms_chunks * samples.size()); |
+ AudioDecoder::SpeechType speech_type; |
+ EXPECT_EQ(-1, decoder.Decode(bad_packet.data(), bad_packet.size(), |
+ encoder.SampleRateHz(), |
+ sizeof(int16_t) * decoded_samples.size(), |
+ decoded_samples.data(), &speech_type)); |
+ |
+ // Decode the good packet. This should work, because the failed decoding |
+ // should not have left the decoder in a broken state. |
+ EXPECT_EQ(static_cast<int>(decoded_samples.size()), |
+ decoder.Decode(packet.data(), packet.size(), encoder.SampleRateHz(), |
+ sizeof(int16_t) * decoded_samples.size(), |
+ decoded_samples.data(), &speech_type)); |
+} |
+ |
+} // namespace webrtc |