| 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 #include "webrtc/modules/audio_coding/acm2/acm_receiver.h" | 11 #include "webrtc/modules/audio_coding/acm2/acm_receiver.h" |
| 12 | 12 |
| 13 #include <algorithm> // std::min | 13 #include <algorithm> // std::min |
| 14 #include <memory> | 14 #include <memory> |
| 15 | 15 |
| 16 #include "webrtc/base/checks.h" | 16 #include "webrtc/base/checks.h" |
| 17 #include "webrtc/base/safe_conversions.h" | 17 #include "webrtc/base/safe_conversions.h" |
| 18 #include "webrtc/modules/audio_coding/codecs/audio_format_conversion.h" |
| 18 #include "webrtc/modules/audio_coding/codecs/builtin_audio_decoder_factory.h" | 19 #include "webrtc/modules/audio_coding/codecs/builtin_audio_decoder_factory.h" |
| 19 #include "webrtc/modules/audio_coding/include/audio_coding_module.h" | 20 #include "webrtc/modules/audio_coding/include/audio_coding_module.h" |
| 20 #include "webrtc/modules/audio_coding/neteq/tools/rtp_generator.h" | 21 #include "webrtc/modules/audio_coding/neteq/tools/rtp_generator.h" |
| 21 #include "webrtc/system_wrappers/include/clock.h" | 22 #include "webrtc/system_wrappers/include/clock.h" |
| 22 #include "webrtc/test/gtest.h" | 23 #include "webrtc/test/gtest.h" |
| 23 #include "webrtc/test/test_suite.h" | 24 #include "webrtc/test/test_suite.h" |
| 24 #include "webrtc/test/testsupport/fileutils.h" | 25 #include "webrtc/test/testsupport/fileutils.h" |
| 25 | 26 |
| 26 namespace webrtc { | 27 namespace webrtc { |
| 27 | 28 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 timestamp_ += frame.samples_per_channel_; | 113 timestamp_ += frame.samples_per_channel_; |
| 113 ASSERT_GE(acm_->Add10MsData(frame), 0); | 114 ASSERT_GE(acm_->Add10MsData(frame), 0); |
| 114 } | 115 } |
| 115 } | 116 } |
| 116 | 117 |
| 117 template <size_t N> | 118 template <size_t N> |
| 118 void AddSetOfCodecs(const RentACodec::CodecId(&ids)[N]) { | 119 void AddSetOfCodecs(const RentACodec::CodecId(&ids)[N]) { |
| 119 for (auto id : ids) { | 120 for (auto id : ids) { |
| 120 const auto i = RentACodec::CodecIndexFromId(id); | 121 const auto i = RentACodec::CodecIndexFromId(id); |
| 121 ASSERT_TRUE(i); | 122 ASSERT_TRUE(i); |
| 122 ASSERT_EQ(0, receiver_->AddCodec(*i, codecs_[*i].pltype, | 123 ASSERT_EQ(true, receiver_->AddCodec(codecs_[*i].pltype, |
| 123 codecs_[*i].channels, codecs_[*i].plfreq, | 124 CodecInstToSdp(codecs_[*i]))); |
| 124 nullptr, codecs_[*i].plname)); | |
| 125 } | 125 } |
| 126 } | 126 } |
| 127 | 127 |
| 128 int SendData(FrameType frame_type, | 128 int SendData(FrameType frame_type, |
| 129 uint8_t payload_type, | 129 uint8_t payload_type, |
| 130 uint32_t timestamp, | 130 uint32_t timestamp, |
| 131 const uint8_t* payload_data, | 131 const uint8_t* payload_data, |
| 132 size_t payload_len_bytes, | 132 size_t payload_len_bytes, |
| 133 const RTPFragmentationHeader* fragmentation) override { | 133 const RTPFragmentationHeader* fragmentation) override { |
| 134 if (frame_type == kEmptyFrame) | 134 if (frame_type == kEmptyFrame) |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 | 168 |
| 169 #if defined(WEBRTC_ANDROID) | 169 #if defined(WEBRTC_ANDROID) |
| 170 #define MAYBE_AddCodecGetCodec DISABLED_AddCodecGetCodec | 170 #define MAYBE_AddCodecGetCodec DISABLED_AddCodecGetCodec |
| 171 #else | 171 #else |
| 172 #define MAYBE_AddCodecGetCodec AddCodecGetCodec | 172 #define MAYBE_AddCodecGetCodec AddCodecGetCodec |
| 173 #endif | 173 #endif |
| 174 TEST_F(AcmReceiverTestOldApi, MAYBE_AddCodecGetCodec) { | 174 TEST_F(AcmReceiverTestOldApi, MAYBE_AddCodecGetCodec) { |
| 175 // Add codec. | 175 // Add codec. |
| 176 for (size_t n = 0; n < codecs_.size(); ++n) { | 176 for (size_t n = 0; n < codecs_.size(); ++n) { |
| 177 if (n & 0x1) { // Just add codecs with odd index. | 177 if (n & 0x1) { // Just add codecs with odd index. |
| 178 EXPECT_EQ( | 178 EXPECT_EQ(true, receiver_->AddCodec(codecs_[n].pltype, |
| 179 0, receiver_->AddCodec(n, codecs_[n].pltype, codecs_[n].channels, | 179 CodecInstToSdp(codecs_[n]))); |
| 180 codecs_[n].plfreq, NULL, codecs_[n].plname)); | |
| 181 } | 180 } |
| 182 } | 181 } |
| 183 // Get codec and compare. | 182 // Get codec and compare. |
| 184 for (size_t n = 0; n < codecs_.size(); ++n) { | 183 for (size_t n = 0; n < codecs_.size(); ++n) { |
| 185 CodecInst my_codec; | 184 CodecInst my_codec; |
| 186 if (n & 0x1) { | 185 if (n & 0x1) { |
| 187 // Codecs with odd index should match the reference. | 186 // Codecs with odd index should match the reference. |
| 188 EXPECT_EQ(0, receiver_->DecoderByPayloadType(codecs_[n].pltype, | 187 EXPECT_EQ(0, receiver_->DecoderByPayloadType(codecs_[n].pltype, |
| 189 &my_codec)); | 188 &my_codec)); |
| 190 EXPECT_TRUE(CodecsEqual(codecs_[n], my_codec)); | 189 EXPECT_TRUE(CodecsEqual(codecs_[n], my_codec)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 201 #else | 200 #else |
| 202 #define MAYBE_AddCodecChangePayloadType AddCodecChangePayloadType | 201 #define MAYBE_AddCodecChangePayloadType AddCodecChangePayloadType |
| 203 #endif | 202 #endif |
| 204 TEST_F(AcmReceiverTestOldApi, MAYBE_AddCodecChangePayloadType) { | 203 TEST_F(AcmReceiverTestOldApi, MAYBE_AddCodecChangePayloadType) { |
| 205 const CodecIdInst codec1(RentACodec::CodecId::kPCMA); | 204 const CodecIdInst codec1(RentACodec::CodecId::kPCMA); |
| 206 CodecInst codec2 = codec1.inst; | 205 CodecInst codec2 = codec1.inst; |
| 207 ++codec2.pltype; | 206 ++codec2.pltype; |
| 208 CodecInst test_codec; | 207 CodecInst test_codec; |
| 209 | 208 |
| 210 // Register the same codec with different payloads. | 209 // Register the same codec with different payloads. |
| 211 EXPECT_EQ(0, receiver_->AddCodec(codec1.id, codec1.inst.pltype, | 210 EXPECT_EQ(true, receiver_->AddCodec(codec1.inst.pltype, |
| 212 codec1.inst.channels, codec1.inst.plfreq, | 211 CodecInstToSdp(codec1.inst))); |
| 213 nullptr, codec1.inst.plname)); | 212 EXPECT_EQ(true, receiver_->AddCodec(codec2.pltype, CodecInstToSdp(codec2))); |
| 214 EXPECT_EQ(0, receiver_->AddCodec(codec1.id, codec2.pltype, codec2.channels, | |
| 215 codec2.plfreq, NULL, codec2.plname)); | |
| 216 | 213 |
| 217 // Both payload types should exist. | 214 // Both payload types should exist. |
| 218 EXPECT_EQ(0, | 215 EXPECT_EQ(0, |
| 219 receiver_->DecoderByPayloadType(codec1.inst.pltype, &test_codec)); | 216 receiver_->DecoderByPayloadType(codec1.inst.pltype, &test_codec)); |
| 220 EXPECT_EQ(true, CodecsEqual(codec1.inst, test_codec)); | 217 EXPECT_EQ(true, CodecsEqual(codec1.inst, test_codec)); |
| 221 EXPECT_EQ(0, receiver_->DecoderByPayloadType(codec2.pltype, &test_codec)); | 218 EXPECT_EQ(0, receiver_->DecoderByPayloadType(codec2.pltype, &test_codec)); |
| 222 EXPECT_EQ(true, CodecsEqual(codec2, test_codec)); | 219 EXPECT_EQ(true, CodecsEqual(codec2, test_codec)); |
| 223 } | 220 } |
| 224 | 221 |
| 225 #if defined(WEBRTC_ANDROID) | 222 #if defined(WEBRTC_ANDROID) |
| 226 #define MAYBE_AddCodecChangeCodecId DISABLED_AddCodecChangeCodecId | 223 #define MAYBE_AddCodecChangeCodecId DISABLED_AddCodecChangeCodecId |
| 227 #else | 224 #else |
| 228 #define MAYBE_AddCodecChangeCodecId AddCodecChangeCodecId | 225 #define MAYBE_AddCodecChangeCodecId AddCodecChangeCodecId |
| 229 #endif | 226 #endif |
| 230 TEST_F(AcmReceiverTestOldApi, AddCodecChangeCodecId) { | 227 TEST_F(AcmReceiverTestOldApi, AddCodecChangeCodecId) { |
| 231 const CodecIdInst codec1(RentACodec::CodecId::kPCMU); | 228 const CodecIdInst codec1(RentACodec::CodecId::kPCMU); |
| 232 CodecIdInst codec2(RentACodec::CodecId::kPCMA); | 229 CodecIdInst codec2(RentACodec::CodecId::kPCMA); |
| 233 codec2.inst.pltype = codec1.inst.pltype; | 230 codec2.inst.pltype = codec1.inst.pltype; |
| 234 CodecInst test_codec; | 231 CodecInst test_codec; |
| 235 | 232 |
| 236 // Register the same payload type with different codec ID. | 233 // Register the same payload type with different codec. |
| 237 EXPECT_EQ(0, receiver_->AddCodec(codec1.id, codec1.inst.pltype, | 234 EXPECT_EQ(true, receiver_->AddCodec(codec1.inst.pltype, |
| 238 codec1.inst.channels, codec1.inst.plfreq, | 235 CodecInstToSdp(codec1.inst))); |
| 239 nullptr, codec1.inst.plname)); | 236 EXPECT_EQ(true, receiver_->AddCodec(codec2.inst.pltype, |
| 240 EXPECT_EQ(0, receiver_->AddCodec(codec2.id, codec2.inst.pltype, | 237 CodecInstToSdp(codec2.inst))); |
| 241 codec2.inst.channels, codec2.inst.plfreq, | |
| 242 nullptr, codec2.inst.plname)); | |
| 243 | 238 |
| 244 // Make sure that the last codec is used. | 239 // Make sure that the last codec is used. |
| 245 EXPECT_EQ(0, | 240 EXPECT_EQ(0, |
| 246 receiver_->DecoderByPayloadType(codec2.inst.pltype, &test_codec)); | 241 receiver_->DecoderByPayloadType(codec2.inst.pltype, &test_codec)); |
| 247 EXPECT_EQ(true, CodecsEqual(codec2.inst, test_codec)); | 242 EXPECT_EQ(true, CodecsEqual(codec2.inst, test_codec)); |
| 248 } | 243 } |
| 249 | 244 |
| 250 #if defined(WEBRTC_ANDROID) | 245 #if defined(WEBRTC_ANDROID) |
| 251 #define MAYBE_AddCodecRemoveCodec DISABLED_AddCodecRemoveCodec | 246 #define MAYBE_AddCodecRemoveCodec DISABLED_AddCodecRemoveCodec |
| 252 #else | 247 #else |
| 253 #define MAYBE_AddCodecRemoveCodec AddCodecRemoveCodec | 248 #define MAYBE_AddCodecRemoveCodec AddCodecRemoveCodec |
| 254 #endif | 249 #endif |
| 255 TEST_F(AcmReceiverTestOldApi, MAYBE_AddCodecRemoveCodec) { | 250 TEST_F(AcmReceiverTestOldApi, MAYBE_AddCodecRemoveCodec) { |
| 256 const CodecIdInst codec(RentACodec::CodecId::kPCMA); | 251 const CodecIdInst codec(RentACodec::CodecId::kPCMA); |
| 257 const int payload_type = codec.inst.pltype; | 252 const int payload_type = codec.inst.pltype; |
| 258 EXPECT_EQ( | 253 EXPECT_EQ(true, |
| 259 0, receiver_->AddCodec(codec.id, codec.inst.pltype, codec.inst.channels, | 254 receiver_->AddCodec(codec.inst.pltype, CodecInstToSdp(codec.inst))); |
| 260 codec.inst.plfreq, nullptr, codec.inst.plname)); | |
| 261 | 255 |
| 262 // Remove non-existing codec should not fail. ACM1 legacy. | 256 // Remove non-existing codec should not fail. ACM1 legacy. |
| 263 EXPECT_EQ(0, receiver_->RemoveCodec(payload_type + 1)); | 257 EXPECT_EQ(0, receiver_->RemoveCodec(payload_type + 1)); |
| 264 | 258 |
| 265 // Remove an existing codec. | 259 // Remove an existing codec. |
| 266 EXPECT_EQ(0, receiver_->RemoveCodec(payload_type)); | 260 EXPECT_EQ(0, receiver_->RemoveCodec(payload_type)); |
| 267 | 261 |
| 268 // Ask for the removed codec, must fail. | 262 // Ask for the removed codec, must fail. |
| 269 CodecInst ci; | 263 CodecInst ci; |
| 270 EXPECT_EQ(-1, receiver_->DecoderByPayloadType(payload_type, &ci)); | 264 EXPECT_EQ(-1, receiver_->DecoderByPayloadType(payload_type, &ci)); |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 } | 373 } |
| 380 | 374 |
| 381 #if defined(WEBRTC_ANDROID) | 375 #if defined(WEBRTC_ANDROID) |
| 382 #define MAYBE_PostdecodingVad DISABLED_PostdecodingVad | 376 #define MAYBE_PostdecodingVad DISABLED_PostdecodingVad |
| 383 #else | 377 #else |
| 384 #define MAYBE_PostdecodingVad PostdecodingVad | 378 #define MAYBE_PostdecodingVad PostdecodingVad |
| 385 #endif | 379 #endif |
| 386 TEST_F(AcmReceiverTestOldApi, MAYBE_PostdecodingVad) { | 380 TEST_F(AcmReceiverTestOldApi, MAYBE_PostdecodingVad) { |
| 387 EXPECT_TRUE(config_.neteq_config.enable_post_decode_vad); | 381 EXPECT_TRUE(config_.neteq_config.enable_post_decode_vad); |
| 388 const CodecIdInst codec(RentACodec::CodecId::kPCM16Bwb); | 382 const CodecIdInst codec(RentACodec::CodecId::kPCM16Bwb); |
| 389 ASSERT_EQ( | 383 ASSERT_EQ(true, |
| 390 0, receiver_->AddCodec(codec.id, codec.inst.pltype, codec.inst.channels, | 384 receiver_->AddCodec(codec.inst.pltype, CodecInstToSdp(codec.inst))); |
| 391 codec.inst.plfreq, nullptr, "")); | |
| 392 const int kNumPackets = 5; | 385 const int kNumPackets = 5; |
| 393 const int num_10ms_frames = codec.inst.pacsize / (codec.inst.plfreq / 100); | 386 const int num_10ms_frames = codec.inst.pacsize / (codec.inst.plfreq / 100); |
| 394 AudioFrame frame; | 387 AudioFrame frame; |
| 395 for (int n = 0; n < kNumPackets; ++n) { | 388 for (int n = 0; n < kNumPackets; ++n) { |
| 396 InsertOnePacketOfSilence(codec.id); | 389 InsertOnePacketOfSilence(codec.id); |
| 397 for (int k = 0; k < num_10ms_frames; ++k) { | 390 for (int k = 0; k < num_10ms_frames; ++k) { |
| 398 bool muted; | 391 bool muted; |
| 399 ASSERT_EQ(0, receiver_->GetAudio(codec.inst.plfreq, &frame, &muted)); | 392 ASSERT_EQ(0, receiver_->GetAudio(codec.inst.plfreq, &frame, &muted)); |
| 400 } | 393 } |
| 401 } | 394 } |
| 402 EXPECT_EQ(AudioFrame::kVadPassive, frame.vad_activity_); | 395 EXPECT_EQ(AudioFrame::kVadPassive, frame.vad_activity_); |
| 403 } | 396 } |
| 404 | 397 |
| 405 class AcmReceiverTestPostDecodeVadPassiveOldApi : public AcmReceiverTestOldApi { | 398 class AcmReceiverTestPostDecodeVadPassiveOldApi : public AcmReceiverTestOldApi { |
| 406 protected: | 399 protected: |
| 407 AcmReceiverTestPostDecodeVadPassiveOldApi() { | 400 AcmReceiverTestPostDecodeVadPassiveOldApi() { |
| 408 config_.neteq_config.enable_post_decode_vad = false; | 401 config_.neteq_config.enable_post_decode_vad = false; |
| 409 } | 402 } |
| 410 }; | 403 }; |
| 411 | 404 |
| 412 #if defined(WEBRTC_ANDROID) | 405 #if defined(WEBRTC_ANDROID) |
| 413 #define MAYBE_PostdecodingVad DISABLED_PostdecodingVad | 406 #define MAYBE_PostdecodingVad DISABLED_PostdecodingVad |
| 414 #else | 407 #else |
| 415 #define MAYBE_PostdecodingVad PostdecodingVad | 408 #define MAYBE_PostdecodingVad PostdecodingVad |
| 416 #endif | 409 #endif |
| 417 TEST_F(AcmReceiverTestPostDecodeVadPassiveOldApi, MAYBE_PostdecodingVad) { | 410 TEST_F(AcmReceiverTestPostDecodeVadPassiveOldApi, MAYBE_PostdecodingVad) { |
| 418 EXPECT_FALSE(config_.neteq_config.enable_post_decode_vad); | 411 EXPECT_FALSE(config_.neteq_config.enable_post_decode_vad); |
| 419 const CodecIdInst codec(RentACodec::CodecId::kPCM16Bwb); | 412 const CodecIdInst codec(RentACodec::CodecId::kPCM16Bwb); |
| 420 ASSERT_EQ( | 413 ASSERT_EQ(true, |
| 421 0, receiver_->AddCodec(codec.id, codec.inst.pltype, codec.inst.channels, | 414 receiver_->AddCodec(codec.inst.pltype, CodecInstToSdp(codec.inst))); |
| 422 codec.inst.plfreq, nullptr, "")); | |
| 423 const int kNumPackets = 5; | 415 const int kNumPackets = 5; |
| 424 const int num_10ms_frames = codec.inst.pacsize / (codec.inst.plfreq / 100); | 416 const int num_10ms_frames = codec.inst.pacsize / (codec.inst.plfreq / 100); |
| 425 AudioFrame frame; | 417 AudioFrame frame; |
| 426 for (int n = 0; n < kNumPackets; ++n) { | 418 for (int n = 0; n < kNumPackets; ++n) { |
| 427 InsertOnePacketOfSilence(codec.id); | 419 InsertOnePacketOfSilence(codec.id); |
| 428 for (int k = 0; k < num_10ms_frames; ++k) { | 420 for (int k = 0; k < num_10ms_frames; ++k) { |
| 429 bool muted; | 421 bool muted; |
| 430 ASSERT_EQ(0, receiver_->GetAudio(codec.inst.plfreq, &frame, &muted)); | 422 ASSERT_EQ(0, receiver_->GetAudio(codec.inst.plfreq, &frame, &muted)); |
| 431 } | 423 } |
| 432 } | 424 } |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 500 receiver_->last_packet_sample_rate_hz()); | 492 receiver_->last_packet_sample_rate_hz()); |
| 501 EXPECT_EQ(0, receiver_->LastAudioCodec(&codec)); | 493 EXPECT_EQ(0, receiver_->LastAudioCodec(&codec)); |
| 502 EXPECT_TRUE(CodecsEqual(c.inst, codec)); | 494 EXPECT_TRUE(CodecsEqual(c.inst, codec)); |
| 503 } | 495 } |
| 504 } | 496 } |
| 505 #endif | 497 #endif |
| 506 | 498 |
| 507 } // namespace acm2 | 499 } // namespace acm2 |
| 508 | 500 |
| 509 } // namespace webrtc | 501 } // namespace webrtc |
| OLD | NEW |