| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2008 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2008 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 <memory> | 11 #include <memory> |
| 12 | 12 |
| 13 #include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h" | 13 #include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h" |
| 14 #include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h" | 14 #include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h" |
| 15 #include "webrtc/base/arraysize.h" | 15 #include "webrtc/base/arraysize.h" |
| 16 #include "webrtc/base/byteorder.h" | 16 #include "webrtc/base/byteorder.h" |
| 17 #include "webrtc/base/safe_conversions.h" | 17 #include "webrtc/base/safe_conversions.h" |
| 18 #include "webrtc/base/scoped_ref_ptr.h" |
| 18 #include "webrtc/call/call.h" | 19 #include "webrtc/call/call.h" |
| 19 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" | 20 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" |
| 20 #include "webrtc/media/base/fakemediaengine.h" | 21 #include "webrtc/media/base/fakemediaengine.h" |
| 21 #include "webrtc/media/base/fakenetworkinterface.h" | 22 #include "webrtc/media/base/fakenetworkinterface.h" |
| 22 #include "webrtc/media/base/fakertp.h" | 23 #include "webrtc/media/base/fakertp.h" |
| 23 #include "webrtc/media/base/mediaconstants.h" | 24 #include "webrtc/media/base/mediaconstants.h" |
| 24 #include "webrtc/media/engine/fakewebrtccall.h" | 25 #include "webrtc/media/engine/fakewebrtccall.h" |
| 25 #include "webrtc/media/engine/fakewebrtcvoiceengine.h" | 26 #include "webrtc/media/engine/fakewebrtcvoiceengine.h" |
| 26 #include "webrtc/media/engine/webrtcvoiceengine.h" | 27 #include "webrtc/media/engine/webrtcvoiceengine.h" |
| 27 #include "webrtc/modules/audio_device/include/mock_audio_device.h" | 28 #include "webrtc/modules/audio_device/include/mock_audio_device.h" |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 EXPECT_CALL(*adm, BuiltInAGCIsAvailable()).WillOnce(Return(false)); | 115 EXPECT_CALL(*adm, BuiltInAGCIsAvailable()).WillOnce(Return(false)); |
| 115 EXPECT_CALL(*adm, BuiltInNSIsAvailable()).WillOnce(Return(false)); | 116 EXPECT_CALL(*adm, BuiltInNSIsAvailable()).WillOnce(Return(false)); |
| 116 EXPECT_CALL(*adm, SetAGC(true)).WillOnce(Return(0)); | 117 EXPECT_CALL(*adm, SetAGC(true)).WillOnce(Return(0)); |
| 117 } | 118 } |
| 118 } // namespace | 119 } // namespace |
| 119 | 120 |
| 120 // Tests that our stub library "works". | 121 // Tests that our stub library "works". |
| 121 TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) { | 122 TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) { |
| 122 StrictMock<webrtc::test::MockAudioDeviceModule> adm; | 123 StrictMock<webrtc::test::MockAudioDeviceModule> adm; |
| 123 AdmSetupExpectations(&adm); | 124 AdmSetupExpectations(&adm); |
| 124 StrictMock<webrtc::test::MockAudioProcessing> apm; | 125 rtc::scoped_refptr<StrictMock<webrtc::test::MockAudioProcessing>> apm = |
| 125 EXPECT_CALL(apm, ApplyConfig(testing::_)); | 126 new rtc::RefCountedObject< |
| 126 EXPECT_CALL(apm, SetExtraOptions(testing::_)); | 127 StrictMock<webrtc::test::MockAudioProcessing>>(); |
| 127 EXPECT_CALL(apm, Initialize()).WillOnce(Return(0)); | 128 EXPECT_CALL(*apm, ApplyConfig(testing::_)); |
| 128 EXPECT_CALL(apm, DetachAecDump()); | 129 EXPECT_CALL(*apm, SetExtraOptions(testing::_)); |
| 130 EXPECT_CALL(*apm, Initialize()).WillOnce(Return(0)); |
| 131 EXPECT_CALL(*apm, DetachAecDump()); |
| 129 StrictMock<MockTransmitMixer> transmit_mixer; | 132 StrictMock<MockTransmitMixer> transmit_mixer; |
| 130 EXPECT_CALL(transmit_mixer, EnableStereoChannelSwapping(false)); | 133 EXPECT_CALL(transmit_mixer, EnableStereoChannelSwapping(false)); |
| 131 cricket::FakeWebRtcVoiceEngine voe(&apm, &transmit_mixer); | 134 cricket::FakeWebRtcVoiceEngine voe(&transmit_mixer); |
| 132 EXPECT_FALSE(voe.IsInited()); | 135 EXPECT_FALSE(voe.IsInited()); |
| 133 { | 136 { |
| 134 cricket::WebRtcVoiceEngine engine( | 137 cricket::WebRtcVoiceEngine engine( |
| 135 &adm, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), | 138 &adm, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), |
| 136 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, | 139 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm, |
| 137 new FakeVoEWrapper(&voe)); | 140 new FakeVoEWrapper(&voe)); |
| 138 engine.Init(); | 141 engine.Init(); |
| 139 EXPECT_TRUE(voe.IsInited()); | 142 EXPECT_TRUE(voe.IsInited()); |
| 140 } | 143 } |
| 141 EXPECT_FALSE(voe.IsInited()); | 144 EXPECT_FALSE(voe.IsInited()); |
| 142 } | 145 } |
| 143 | 146 |
| 144 class FakeAudioSink : public webrtc::AudioSinkInterface { | 147 class FakeAudioSink : public webrtc::AudioSinkInterface { |
| 145 public: | 148 public: |
| 146 void OnData(const Data& audio) override {} | 149 void OnData(const Data& audio) override {} |
| 147 }; | 150 }; |
| 148 | 151 |
| 149 class FakeAudioSource : public cricket::AudioSource { | 152 class FakeAudioSource : public cricket::AudioSource { |
| 150 void SetSink(Sink* sink) override {} | 153 void SetSink(Sink* sink) override {} |
| 151 }; | 154 }; |
| 152 | 155 |
| 153 class WebRtcVoiceEngineTestFake : public testing::Test { | 156 class WebRtcVoiceEngineTestFake : public testing::Test { |
| 154 public: | 157 public: |
| 155 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {} | 158 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {} |
| 156 | 159 |
| 157 explicit WebRtcVoiceEngineTestFake(const char* field_trials) | 160 explicit WebRtcVoiceEngineTestFake(const char* field_trials) |
| 158 : apm_gc_(*apm_.gain_control()), apm_ec_(*apm_.echo_cancellation()), | 161 : apm_(new rtc::RefCountedObject< |
| 159 apm_ns_(*apm_.noise_suppression()), apm_vd_(*apm_.voice_detection()), | 162 StrictMock<webrtc::test::MockAudioProcessing>>()), |
| 160 call_(webrtc::Call::Config(&event_log_)), voe_(&apm_, &transmit_mixer_), | 163 apm_gc_(*apm_->gain_control()), |
| 164 apm_ec_(*apm_->echo_cancellation()), |
| 165 apm_ns_(*apm_->noise_suppression()), |
| 166 apm_vd_(*apm_->voice_detection()), |
| 167 call_(webrtc::Call::Config(&event_log_)), |
| 168 voe_(&transmit_mixer_), |
| 161 override_field_trials_(field_trials) { | 169 override_field_trials_(field_trials) { |
| 162 // AudioDeviceModule. | 170 // AudioDeviceModule. |
| 163 AdmSetupExpectations(&adm_); | 171 AdmSetupExpectations(&adm_); |
| 164 // AudioProcessing. | 172 // AudioProcessing. |
| 165 EXPECT_CALL(apm_, ApplyConfig(testing::_)); | 173 EXPECT_CALL(*apm_, ApplyConfig(testing::_)); |
| 166 EXPECT_CALL(apm_, SetExtraOptions(testing::_)); | 174 EXPECT_CALL(*apm_, SetExtraOptions(testing::_)); |
| 167 EXPECT_CALL(apm_, Initialize()).WillOnce(Return(0)); | 175 EXPECT_CALL(*apm_, Initialize()).WillOnce(Return(0)); |
| 168 EXPECT_CALL(apm_, DetachAecDump()); | 176 EXPECT_CALL(*apm_, DetachAecDump()); |
| 169 // Default Options. | 177 // Default Options. |
| 170 EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0)); | 178 EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0)); |
| 171 EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0)); | 179 EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0)); |
| 172 EXPECT_CALL(apm_gc_, Enable(true)).WillOnce(Return(0)); | 180 EXPECT_CALL(apm_gc_, Enable(true)).WillOnce(Return(0)); |
| 173 EXPECT_CALL(apm_ns_, Enable(true)).WillOnce(Return(0)); | 181 EXPECT_CALL(apm_ns_, Enable(true)).WillOnce(Return(0)); |
| 174 EXPECT_CALL(apm_vd_, Enable(true)).WillOnce(Return(0)); | 182 EXPECT_CALL(apm_vd_, Enable(true)).WillOnce(Return(0)); |
| 175 EXPECT_CALL(transmit_mixer_, EnableStereoChannelSwapping(false)); | 183 EXPECT_CALL(transmit_mixer_, EnableStereoChannelSwapping(false)); |
| 176 // Init does not overwrite default AGC config. | 184 // Init does not overwrite default AGC config. |
| 177 EXPECT_CALL(apm_gc_, target_level_dbfs()).WillOnce(Return(1)); | 185 EXPECT_CALL(apm_gc_, target_level_dbfs()).WillOnce(Return(1)); |
| 178 EXPECT_CALL(apm_gc_, compression_gain_db()).WillRepeatedly(Return(5)); | 186 EXPECT_CALL(apm_gc_, compression_gain_db()).WillRepeatedly(Return(5)); |
| 179 EXPECT_CALL(apm_gc_, is_limiter_enabled()).WillRepeatedly(Return(true)); | 187 EXPECT_CALL(apm_gc_, is_limiter_enabled()).WillRepeatedly(Return(true)); |
| 180 EXPECT_CALL(apm_gc_, set_target_level_dbfs(1)).WillOnce(Return(0)); | 188 EXPECT_CALL(apm_gc_, set_target_level_dbfs(1)).WillOnce(Return(0)); |
| 181 EXPECT_CALL(apm_gc_, set_compression_gain_db(5)).WillRepeatedly(Return(0)); | 189 EXPECT_CALL(apm_gc_, set_compression_gain_db(5)).WillRepeatedly(Return(0)); |
| 182 EXPECT_CALL(apm_gc_, enable_limiter(true)).WillRepeatedly(Return(0)); | 190 EXPECT_CALL(apm_gc_, enable_limiter(true)).WillRepeatedly(Return(0)); |
| 183 // TODO(kwiberg): We should use mock factories here, but a bunch of | 191 // TODO(kwiberg): We should use mock factories here, but a bunch of |
| 184 // the tests here probe the specific set of codecs provided by the builtin | 192 // the tests here probe the specific set of codecs provided by the builtin |
| 185 // factories. Those tests should probably be moved elsewhere. | 193 // factories. Those tests should probably be moved elsewhere. |
| 186 auto encoder_factory = webrtc::CreateBuiltinAudioEncoderFactory(); | 194 auto encoder_factory = webrtc::CreateBuiltinAudioEncoderFactory(); |
| 187 auto decoder_factory = webrtc::CreateBuiltinAudioDecoderFactory(); | 195 auto decoder_factory = webrtc::CreateBuiltinAudioDecoderFactory(); |
| 188 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, encoder_factory, | 196 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, encoder_factory, |
| 189 decoder_factory, nullptr, | 197 decoder_factory, nullptr, apm_, |
| 190 new FakeVoEWrapper(&voe_))); | 198 new FakeVoEWrapper(&voe_))); |
| 191 engine_->Init(); | 199 engine_->Init(); |
| 192 send_parameters_.codecs.push_back(kPcmuCodec); | 200 send_parameters_.codecs.push_back(kPcmuCodec); |
| 193 recv_parameters_.codecs.push_back(kPcmuCodec); | 201 recv_parameters_.codecs.push_back(kPcmuCodec); |
| 194 // Default Options. | 202 // Default Options. |
| 195 EXPECT_TRUE(IsHighPassFilterEnabled()); | 203 EXPECT_TRUE(IsHighPassFilterEnabled()); |
| 196 } | 204 } |
| 197 | 205 |
| 198 bool SetupChannel() { | 206 bool SetupChannel() { |
| 199 EXPECT_CALL(apm_, ApplyConfig(testing::_)); | 207 EXPECT_CALL(*apm_, ApplyConfig(testing::_)); |
| 200 EXPECT_CALL(apm_, SetExtraOptions(testing::_)); | 208 EXPECT_CALL(*apm_, SetExtraOptions(testing::_)); |
| 201 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(), | 209 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(), |
| 202 cricket::AudioOptions()); | 210 cricket::AudioOptions()); |
| 203 return (channel_ != nullptr); | 211 return (channel_ != nullptr); |
| 204 } | 212 } |
| 205 | 213 |
| 206 bool SetupRecvStream() { | 214 bool SetupRecvStream() { |
| 207 if (!SetupChannel()) { | 215 if (!SetupChannel()) { |
| 208 return false; | 216 return false; |
| 209 } | 217 } |
| 210 return AddRecvStream(kSsrcX); | 218 return AddRecvStream(kSsrcX); |
| 211 } | 219 } |
| 212 | 220 |
| 213 bool SetupSendStream() { | 221 bool SetupSendStream() { |
| 214 if (!SetupChannel()) { | 222 if (!SetupChannel()) { |
| 215 return false; | 223 return false; |
| 216 } | 224 } |
| 217 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcX))) { | 225 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcX))) { |
| 218 return false; | 226 return false; |
| 219 } | 227 } |
| 220 EXPECT_CALL(apm_, set_output_will_be_muted(false)); | 228 EXPECT_CALL(*apm_, set_output_will_be_muted(false)); |
| 221 return channel_->SetAudioSend(kSsrcX, true, nullptr, &fake_source_); | 229 return channel_->SetAudioSend(kSsrcX, true, nullptr, &fake_source_); |
| 222 } | 230 } |
| 223 | 231 |
| 224 bool AddRecvStream(uint32_t ssrc) { | 232 bool AddRecvStream(uint32_t ssrc) { |
| 225 EXPECT_TRUE(channel_); | 233 EXPECT_TRUE(channel_); |
| 226 return channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(ssrc)); | 234 return channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(ssrc)); |
| 227 } | 235 } |
| 228 | 236 |
| 229 void SetupForMultiSendStream() { | 237 void SetupForMultiSendStream() { |
| 230 EXPECT_TRUE(SetupSendStream()); | 238 EXPECT_TRUE(SetupSendStream()); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 263 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) { | 271 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) { |
| 264 return GetRecvStream(ssrc).GetConfig(); | 272 return GetRecvStream(ssrc).GetConfig(); |
| 265 } | 273 } |
| 266 | 274 |
| 267 void SetSend(bool enable) { | 275 void SetSend(bool enable) { |
| 268 ASSERT_TRUE(channel_); | 276 ASSERT_TRUE(channel_); |
| 269 if (enable) { | 277 if (enable) { |
| 270 EXPECT_CALL(adm_, RecordingIsInitialized()).WillOnce(Return(false)); | 278 EXPECT_CALL(adm_, RecordingIsInitialized()).WillOnce(Return(false)); |
| 271 EXPECT_CALL(adm_, Recording()).WillOnce(Return(false)); | 279 EXPECT_CALL(adm_, Recording()).WillOnce(Return(false)); |
| 272 EXPECT_CALL(adm_, InitRecording()).WillOnce(Return(0)); | 280 EXPECT_CALL(adm_, InitRecording()).WillOnce(Return(0)); |
| 273 EXPECT_CALL(apm_, ApplyConfig(testing::_)); | 281 EXPECT_CALL(*apm_, ApplyConfig(testing::_)); |
| 274 EXPECT_CALL(apm_, SetExtraOptions(testing::_)); | 282 EXPECT_CALL(*apm_, SetExtraOptions(testing::_)); |
| 275 } | 283 } |
| 276 channel_->SetSend(enable); | 284 channel_->SetSend(enable); |
| 277 } | 285 } |
| 278 | 286 |
| 279 void SetSendParameters(const cricket::AudioSendParameters& params) { | 287 void SetSendParameters(const cricket::AudioSendParameters& params) { |
| 280 EXPECT_CALL(apm_, ApplyConfig(testing::_)); | 288 EXPECT_CALL(*apm_, ApplyConfig(testing::_)); |
| 281 EXPECT_CALL(apm_, SetExtraOptions(testing::_)); | 289 EXPECT_CALL(*apm_, SetExtraOptions(testing::_)); |
| 282 ASSERT_TRUE(channel_); | 290 ASSERT_TRUE(channel_); |
| 283 EXPECT_TRUE(channel_->SetSendParameters(params)); | 291 EXPECT_TRUE(channel_->SetSendParameters(params)); |
| 284 } | 292 } |
| 285 | 293 |
| 286 void SetAudioSend(uint32_t ssrc, bool enable, cricket::AudioSource* source, | 294 void SetAudioSend(uint32_t ssrc, bool enable, cricket::AudioSource* source, |
| 287 const cricket::AudioOptions* options = nullptr) { | 295 const cricket::AudioOptions* options = nullptr) { |
| 288 EXPECT_CALL(apm_, set_output_will_be_muted(!enable)); | 296 EXPECT_CALL(*apm_, set_output_will_be_muted(!enable)); |
| 289 ASSERT_TRUE(channel_); | 297 ASSERT_TRUE(channel_); |
| 290 if (enable && options) { | 298 if (enable && options) { |
| 291 EXPECT_CALL(apm_, ApplyConfig(testing::_)); | 299 EXPECT_CALL(*apm_, ApplyConfig(testing::_)); |
| 292 EXPECT_CALL(apm_, SetExtraOptions(testing::_)); | 300 EXPECT_CALL(*apm_, SetExtraOptions(testing::_)); |
| 293 } | 301 } |
| 294 EXPECT_TRUE(channel_->SetAudioSend(ssrc, enable, options, source)); | 302 EXPECT_TRUE(channel_->SetAudioSend(ssrc, enable, options, source)); |
| 295 } | 303 } |
| 296 | 304 |
| 297 void TestInsertDtmf(uint32_t ssrc, bool caller, | 305 void TestInsertDtmf(uint32_t ssrc, bool caller, |
| 298 const cricket::AudioCodec& codec) { | 306 const cricket::AudioCodec& codec) { |
| 299 EXPECT_TRUE(SetupChannel()); | 307 EXPECT_TRUE(SetupChannel()); |
| 300 if (caller) { | 308 if (caller) { |
| 301 // If this is a caller, local description will be applied and add the | 309 // If this is a caller, local description will be applied and add the |
| 302 // send stream. | 310 // send stream. |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 651 codec.ToCodecParameters()); | 659 codec.ToCodecParameters()); |
| 652 } | 660 } |
| 653 } | 661 } |
| 654 | 662 |
| 655 bool IsHighPassFilterEnabled() { | 663 bool IsHighPassFilterEnabled() { |
| 656 return engine_->GetApmConfigForTest().high_pass_filter.enabled; | 664 return engine_->GetApmConfigForTest().high_pass_filter.enabled; |
| 657 } | 665 } |
| 658 | 666 |
| 659 protected: | 667 protected: |
| 660 StrictMock<webrtc::test::MockAudioDeviceModule> adm_; | 668 StrictMock<webrtc::test::MockAudioDeviceModule> adm_; |
| 661 StrictMock<webrtc::test::MockAudioProcessing> apm_; | 669 rtc::scoped_refptr<StrictMock<webrtc::test::MockAudioProcessing>> apm_; |
| 662 webrtc::test::MockGainControl& apm_gc_; | 670 webrtc::test::MockGainControl& apm_gc_; |
| 663 webrtc::test::MockEchoCancellation& apm_ec_; | 671 webrtc::test::MockEchoCancellation& apm_ec_; |
| 664 webrtc::test::MockNoiseSuppression& apm_ns_; | 672 webrtc::test::MockNoiseSuppression& apm_ns_; |
| 665 webrtc::test::MockVoiceDetection& apm_vd_; | 673 webrtc::test::MockVoiceDetection& apm_vd_; |
| 666 StrictMock<MockTransmitMixer> transmit_mixer_; | 674 StrictMock<MockTransmitMixer> transmit_mixer_; |
| 667 webrtc::RtcEventLogNullImpl event_log_; | 675 webrtc::RtcEventLogNullImpl event_log_; |
| 668 cricket::FakeCall call_; | 676 cricket::FakeCall call_; |
| 669 cricket::FakeWebRtcVoiceEngine voe_; | 677 cricket::FakeWebRtcVoiceEngine voe_; |
| 670 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_; | 678 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_; |
| 671 cricket::VoiceMediaChannel* channel_ = nullptr; | 679 cricket::VoiceMediaChannel* channel_ = nullptr; |
| (...skipping 2115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2787 EXPECT_CALL(adm_, | 2795 EXPECT_CALL(adm_, |
| 2788 BuiltInAECIsAvailable()).Times(8).WillRepeatedly(Return(false)); | 2796 BuiltInAECIsAvailable()).Times(8).WillRepeatedly(Return(false)); |
| 2789 EXPECT_CALL(adm_, | 2797 EXPECT_CALL(adm_, |
| 2790 BuiltInAGCIsAvailable()).Times(8).WillRepeatedly(Return(false)); | 2798 BuiltInAGCIsAvailable()).Times(8).WillRepeatedly(Return(false)); |
| 2791 EXPECT_CALL(adm_, | 2799 EXPECT_CALL(adm_, |
| 2792 BuiltInNSIsAvailable()).Times(8).WillRepeatedly(Return(false)); | 2800 BuiltInNSIsAvailable()).Times(8).WillRepeatedly(Return(false)); |
| 2793 EXPECT_CALL(adm_, | 2801 EXPECT_CALL(adm_, |
| 2794 RecordingIsInitialized()).Times(2).WillRepeatedly(Return(false)); | 2802 RecordingIsInitialized()).Times(2).WillRepeatedly(Return(false)); |
| 2795 EXPECT_CALL(adm_, Recording()).Times(2).WillRepeatedly(Return(false)); | 2803 EXPECT_CALL(adm_, Recording()).Times(2).WillRepeatedly(Return(false)); |
| 2796 EXPECT_CALL(adm_, InitRecording()).Times(2).WillRepeatedly(Return(0)); | 2804 EXPECT_CALL(adm_, InitRecording()).Times(2).WillRepeatedly(Return(0)); |
| 2797 EXPECT_CALL(apm_, ApplyConfig(testing::_)).Times(10); | 2805 EXPECT_CALL(*apm_, ApplyConfig(testing::_)).Times(10); |
| 2798 EXPECT_CALL(apm_, SetExtraOptions(testing::_)).Times(10); | 2806 EXPECT_CALL(*apm_, SetExtraOptions(testing::_)).Times(10); |
| 2799 | 2807 |
| 2800 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1( | 2808 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1( |
| 2801 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel( | 2809 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel( |
| 2802 &call_, cricket::MediaConfig(), cricket::AudioOptions()))); | 2810 &call_, cricket::MediaConfig(), cricket::AudioOptions()))); |
| 2803 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2( | 2811 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2( |
| 2804 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel( | 2812 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel( |
| 2805 &call_, cricket::MediaConfig(), cricket::AudioOptions()))); | 2813 &call_, cricket::MediaConfig(), cricket::AudioOptions()))); |
| 2806 | 2814 |
| 2807 // Have to add a stream to make SetSend work. | 2815 // Have to add a stream to make SetSend work. |
| 2808 cricket::StreamParams stream1; | 2816 cricket::StreamParams stream1; |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2898 EXPECT_EQ(expected_options, channel2->options()); | 2906 EXPECT_EQ(expected_options, channel2->options()); |
| 2899 } | 2907 } |
| 2900 | 2908 |
| 2901 // This test verifies DSCP settings are properly applied on voice media channel. | 2909 // This test verifies DSCP settings are properly applied on voice media channel. |
| 2902 TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) { | 2910 TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) { |
| 2903 EXPECT_TRUE(SetupSendStream()); | 2911 EXPECT_TRUE(SetupSendStream()); |
| 2904 cricket::FakeNetworkInterface network_interface; | 2912 cricket::FakeNetworkInterface network_interface; |
| 2905 cricket::MediaConfig config; | 2913 cricket::MediaConfig config; |
| 2906 std::unique_ptr<cricket::VoiceMediaChannel> channel; | 2914 std::unique_ptr<cricket::VoiceMediaChannel> channel; |
| 2907 | 2915 |
| 2908 EXPECT_CALL(apm_, ApplyConfig(testing::_)).Times(3); | 2916 EXPECT_CALL(*apm_, ApplyConfig(testing::_)).Times(3); |
| 2909 EXPECT_CALL(apm_, SetExtraOptions(testing::_)).Times(3); | 2917 EXPECT_CALL(*apm_, SetExtraOptions(testing::_)).Times(3); |
| 2910 | 2918 |
| 2911 channel.reset( | 2919 channel.reset( |
| 2912 engine_->CreateChannel(&call_, config, cricket::AudioOptions())); | 2920 engine_->CreateChannel(&call_, config, cricket::AudioOptions())); |
| 2913 channel->SetInterface(&network_interface); | 2921 channel->SetInterface(&network_interface); |
| 2914 // Default value when DSCP is disabled should be DSCP_DEFAULT. | 2922 // Default value when DSCP is disabled should be DSCP_DEFAULT. |
| 2915 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp()); | 2923 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp()); |
| 2916 | 2924 |
| 2917 config.enable_dscp = true; | 2925 config.enable_dscp = true; |
| 2918 channel.reset( | 2926 channel.reset( |
| 2919 engine_->CreateChannel(&call_, config, cricket::AudioOptions())); | 2927 engine_->CreateChannel(&call_, config, cricket::AudioOptions())); |
| (...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3255 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12)); | 3263 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12)); |
| 3256 channel_->SetRecvParameters(parameters); | 3264 channel_->SetRecvParameters(parameters); |
| 3257 | 3265 |
| 3258 EXPECT_TRUE(GetRecvStream(kSsrcX).started()); | 3266 EXPECT_TRUE(GetRecvStream(kSsrcX).started()); |
| 3259 } | 3267 } |
| 3260 | 3268 |
| 3261 // Tests that the library initializes and shuts down properly. | 3269 // Tests that the library initializes and shuts down properly. |
| 3262 TEST(WebRtcVoiceEngineTest, StartupShutdown) { | 3270 TEST(WebRtcVoiceEngineTest, StartupShutdown) { |
| 3263 // If the VoiceEngine wants to gather available codecs early, that's fine but | 3271 // If the VoiceEngine wants to gather available codecs early, that's fine but |
| 3264 // we never want it to create a decoder at this stage. | 3272 // we never want it to create a decoder at this stage. |
| 3273 rtc::scoped_refptr<webrtc::AudioProcessing> apm = |
| 3274 webrtc::AudioProcessing::Create(); |
| 3265 cricket::WebRtcVoiceEngine engine( | 3275 cricket::WebRtcVoiceEngine engine( |
| 3266 nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), | 3276 nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), |
| 3267 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr); | 3277 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm); |
| 3268 engine.Init(); | 3278 engine.Init(); |
| 3269 webrtc::RtcEventLogNullImpl event_log; | 3279 webrtc::RtcEventLogNullImpl event_log; |
| 3270 std::unique_ptr<webrtc::Call> call( | 3280 std::unique_ptr<webrtc::Call> call( |
| 3271 webrtc::Call::Create(webrtc::Call::Config(&event_log))); | 3281 webrtc::Call::Create(webrtc::Call::Config(&event_log))); |
| 3272 cricket::VoiceMediaChannel* channel = engine.CreateChannel( | 3282 cricket::VoiceMediaChannel* channel = engine.CreateChannel( |
| 3273 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); | 3283 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); |
| 3274 EXPECT_TRUE(channel != nullptr); | 3284 EXPECT_TRUE(channel != nullptr); |
| 3275 delete channel; | 3285 delete channel; |
| 3276 } | 3286 } |
| 3277 | 3287 |
| 3278 // Tests that reference counting on the external ADM is correct. | 3288 // Tests that reference counting on the external ADM is correct. |
| 3279 TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) { | 3289 TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) { |
| 3280 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm; | 3290 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm; |
| 3281 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0)); | 3291 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0)); |
| 3282 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0)); | 3292 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0)); |
| 3283 // Return 100ms just in case this function gets called. If we don't, | 3293 // Return 100ms just in case this function gets called. If we don't, |
| 3284 // we could enter a tight loop since the mock would return 0. | 3294 // we could enter a tight loop since the mock would return 0. |
| 3285 EXPECT_CALL(adm, TimeUntilNextProcess()).WillRepeatedly(Return(100)); | 3295 EXPECT_CALL(adm, TimeUntilNextProcess()).WillRepeatedly(Return(100)); |
| 3286 { | 3296 { |
| 3297 rtc::scoped_refptr<webrtc::AudioProcessing> apm = |
| 3298 webrtc::AudioProcessing::Create(); |
| 3287 cricket::WebRtcVoiceEngine engine( | 3299 cricket::WebRtcVoiceEngine engine( |
| 3288 &adm, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), | 3300 &adm, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), |
| 3289 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr); | 3301 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm); |
| 3290 engine.Init(); | 3302 engine.Init(); |
| 3291 webrtc::RtcEventLogNullImpl event_log; | 3303 webrtc::RtcEventLogNullImpl event_log; |
| 3292 std::unique_ptr<webrtc::Call> call( | 3304 std::unique_ptr<webrtc::Call> call( |
| 3293 webrtc::Call::Create(webrtc::Call::Config(&event_log))); | 3305 webrtc::Call::Create(webrtc::Call::Config(&event_log))); |
| 3294 cricket::VoiceMediaChannel* channel = engine.CreateChannel( | 3306 cricket::VoiceMediaChannel* channel = engine.CreateChannel( |
| 3295 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); | 3307 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); |
| 3296 EXPECT_TRUE(channel != nullptr); | 3308 EXPECT_TRUE(channel != nullptr); |
| 3297 delete channel; | 3309 delete channel; |
| 3298 } | 3310 } |
| 3299 } | 3311 } |
| 3300 | 3312 |
| 3301 // Verify the payload id of common audio codecs, including CN, ISAC, and G722. | 3313 // Verify the payload id of common audio codecs, including CN, ISAC, and G722. |
| 3302 TEST(WebRtcVoiceEngineTest, HasCorrectPayloadTypeMapping) { | 3314 TEST(WebRtcVoiceEngineTest, HasCorrectPayloadTypeMapping) { |
| 3303 // TODO(ossu): Why are the payload types of codecs with non-static payload | 3315 // TODO(ossu): Why are the payload types of codecs with non-static payload |
| 3304 // type assignments checked here? It shouldn't really matter. | 3316 // type assignments checked here? It shouldn't really matter. |
| 3317 rtc::scoped_refptr<webrtc::AudioProcessing> apm = |
| 3318 webrtc::AudioProcessing::Create(); |
| 3305 cricket::WebRtcVoiceEngine engine( | 3319 cricket::WebRtcVoiceEngine engine( |
| 3306 nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), | 3320 nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), |
| 3307 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr); | 3321 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm); |
| 3308 engine.Init(); | 3322 engine.Init(); |
| 3309 for (const cricket::AudioCodec& codec : engine.send_codecs()) { | 3323 for (const cricket::AudioCodec& codec : engine.send_codecs()) { |
| 3310 auto is_codec = [&codec](const char* name, int clockrate = 0) { | 3324 auto is_codec = [&codec](const char* name, int clockrate = 0) { |
| 3311 return STR_CASE_CMP(codec.name.c_str(), name) == 0 && | 3325 return STR_CASE_CMP(codec.name.c_str(), name) == 0 && |
| 3312 (clockrate == 0 || codec.clockrate == clockrate); | 3326 (clockrate == 0 || codec.clockrate == clockrate); |
| 3313 }; | 3327 }; |
| 3314 if (is_codec("CN", 16000)) { | 3328 if (is_codec("CN", 16000)) { |
| 3315 EXPECT_EQ(105, codec.id); | 3329 EXPECT_EQ(105, codec.id); |
| 3316 } else if (is_codec("CN", 32000)) { | 3330 } else if (is_codec("CN", 32000)) { |
| 3317 EXPECT_EQ(106, codec.id); | 3331 EXPECT_EQ(106, codec.id); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 3337 ASSERT_TRUE(codec.params.find("minptime") != codec.params.end()); | 3351 ASSERT_TRUE(codec.params.find("minptime") != codec.params.end()); |
| 3338 EXPECT_EQ("10", codec.params.find("minptime")->second); | 3352 EXPECT_EQ("10", codec.params.find("minptime")->second); |
| 3339 ASSERT_TRUE(codec.params.find("useinbandfec") != codec.params.end()); | 3353 ASSERT_TRUE(codec.params.find("useinbandfec") != codec.params.end()); |
| 3340 EXPECT_EQ("1", codec.params.find("useinbandfec")->second); | 3354 EXPECT_EQ("1", codec.params.find("useinbandfec")->second); |
| 3341 } | 3355 } |
| 3342 } | 3356 } |
| 3343 } | 3357 } |
| 3344 | 3358 |
| 3345 // Tests that VoE supports at least 32 channels | 3359 // Tests that VoE supports at least 32 channels |
| 3346 TEST(WebRtcVoiceEngineTest, Has32Channels) { | 3360 TEST(WebRtcVoiceEngineTest, Has32Channels) { |
| 3361 rtc::scoped_refptr<webrtc::AudioProcessing> apm = |
| 3362 webrtc::AudioProcessing::Create(); |
| 3347 cricket::WebRtcVoiceEngine engine( | 3363 cricket::WebRtcVoiceEngine engine( |
| 3348 nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), | 3364 nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), |
| 3349 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr); | 3365 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm); |
| 3350 engine.Init(); | 3366 engine.Init(); |
| 3351 webrtc::RtcEventLogNullImpl event_log; | 3367 webrtc::RtcEventLogNullImpl event_log; |
| 3352 std::unique_ptr<webrtc::Call> call( | 3368 std::unique_ptr<webrtc::Call> call( |
| 3353 webrtc::Call::Create(webrtc::Call::Config(&event_log))); | 3369 webrtc::Call::Create(webrtc::Call::Config(&event_log))); |
| 3354 | 3370 |
| 3355 cricket::VoiceMediaChannel* channels[32]; | 3371 cricket::VoiceMediaChannel* channels[32]; |
| 3356 int num_channels = 0; | 3372 int num_channels = 0; |
| 3357 while (num_channels < arraysize(channels)) { | 3373 while (num_channels < arraysize(channels)) { |
| 3358 cricket::VoiceMediaChannel* channel = engine.CreateChannel( | 3374 cricket::VoiceMediaChannel* channel = engine.CreateChannel( |
| 3359 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); | 3375 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 3372 | 3388 |
| 3373 // Test that we set our preferred codecs properly. | 3389 // Test that we set our preferred codecs properly. |
| 3374 TEST(WebRtcVoiceEngineTest, SetRecvCodecs) { | 3390 TEST(WebRtcVoiceEngineTest, SetRecvCodecs) { |
| 3375 // TODO(ossu): I'm not sure of the intent of this test. It's either: | 3391 // TODO(ossu): I'm not sure of the intent of this test. It's either: |
| 3376 // - Check that our builtin codecs are usable by Channel. | 3392 // - Check that our builtin codecs are usable by Channel. |
| 3377 // - The codecs provided by the engine is usable by Channel. | 3393 // - The codecs provided by the engine is usable by Channel. |
| 3378 // It does not check that the codecs in the RecvParameters are actually | 3394 // It does not check that the codecs in the RecvParameters are actually |
| 3379 // what we sent in - though it's probably reasonable to expect so, if | 3395 // what we sent in - though it's probably reasonable to expect so, if |
| 3380 // SetRecvParameters returns true. | 3396 // SetRecvParameters returns true. |
| 3381 // I think it will become clear once audio decoder injection is completed. | 3397 // I think it will become clear once audio decoder injection is completed. |
| 3398 rtc::scoped_refptr<webrtc::AudioProcessing> apm = |
| 3399 webrtc::AudioProcessing::Create(); |
| 3382 cricket::WebRtcVoiceEngine engine( | 3400 cricket::WebRtcVoiceEngine engine( |
| 3383 nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), | 3401 nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), |
| 3384 webrtc::CreateBuiltinAudioDecoderFactory(), nullptr); | 3402 webrtc::CreateBuiltinAudioDecoderFactory(), nullptr, apm); |
| 3385 engine.Init(); | 3403 engine.Init(); |
| 3386 webrtc::RtcEventLogNullImpl event_log; | 3404 webrtc::RtcEventLogNullImpl event_log; |
| 3387 std::unique_ptr<webrtc::Call> call( | 3405 std::unique_ptr<webrtc::Call> call( |
| 3388 webrtc::Call::Create(webrtc::Call::Config(&event_log))); | 3406 webrtc::Call::Create(webrtc::Call::Config(&event_log))); |
| 3389 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(), | 3407 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(), |
| 3390 cricket::AudioOptions(), call.get()); | 3408 cricket::AudioOptions(), call.get()); |
| 3391 cricket::AudioRecvParameters parameters; | 3409 cricket::AudioRecvParameters parameters; |
| 3392 parameters.codecs = engine.recv_codecs(); | 3410 parameters.codecs = engine.recv_codecs(); |
| 3393 EXPECT_TRUE(channel.SetRecvParameters(parameters)); | 3411 EXPECT_TRUE(channel.SetRecvParameters(parameters)); |
| 3394 } | 3412 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 3411 specs.push_back( | 3429 specs.push_back( |
| 3412 webrtc::AudioCodecSpec{{"codec5", 8000, 2}, {8000, 1, 64000}}); | 3430 webrtc::AudioCodecSpec{{"codec5", 8000, 2}, {8000, 1, 64000}}); |
| 3413 | 3431 |
| 3414 rtc::scoped_refptr<webrtc::MockAudioEncoderFactory> unused_encoder_factory = | 3432 rtc::scoped_refptr<webrtc::MockAudioEncoderFactory> unused_encoder_factory = |
| 3415 webrtc::MockAudioEncoderFactory::CreateUnusedFactory(); | 3433 webrtc::MockAudioEncoderFactory::CreateUnusedFactory(); |
| 3416 rtc::scoped_refptr<webrtc::MockAudioDecoderFactory> mock_decoder_factory = | 3434 rtc::scoped_refptr<webrtc::MockAudioDecoderFactory> mock_decoder_factory = |
| 3417 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>; | 3435 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>; |
| 3418 EXPECT_CALL(*mock_decoder_factory.get(), GetSupportedDecoders()) | 3436 EXPECT_CALL(*mock_decoder_factory.get(), GetSupportedDecoders()) |
| 3419 .WillOnce(Return(specs)); | 3437 .WillOnce(Return(specs)); |
| 3420 | 3438 |
| 3439 rtc::scoped_refptr<webrtc::AudioProcessing> apm = |
| 3440 webrtc::AudioProcessing::Create(); |
| 3421 cricket::WebRtcVoiceEngine engine(nullptr, unused_encoder_factory, | 3441 cricket::WebRtcVoiceEngine engine(nullptr, unused_encoder_factory, |
| 3422 mock_decoder_factory, nullptr); | 3442 mock_decoder_factory, nullptr, apm); |
| 3423 engine.Init(); | 3443 engine.Init(); |
| 3424 auto codecs = engine.recv_codecs(); | 3444 auto codecs = engine.recv_codecs(); |
| 3425 EXPECT_EQ(11, codecs.size()); | 3445 EXPECT_EQ(11, codecs.size()); |
| 3426 | 3446 |
| 3427 // Rather than just ASSERTing that there are enough codecs, ensure that we can | 3447 // Rather than just ASSERTing that there are enough codecs, ensure that we can |
| 3428 // check the actual values safely, to provide better test results. | 3448 // check the actual values safely, to provide better test results. |
| 3429 auto get_codec = | 3449 auto get_codec = |
| 3430 [&codecs](size_t index) -> const cricket::AudioCodec& { | 3450 [&codecs](size_t index) -> const cricket::AudioCodec& { |
| 3431 static const cricket::AudioCodec missing_codec(0, "<missing>", 0, 0, 0); | 3451 static const cricket::AudioCodec missing_codec(0, "<missing>", 0, 0, 0); |
| 3432 if (codecs.size() > index) | 3452 if (codecs.size() > index) |
| (...skipping 29 matching lines...) Expand all Loading... |
| 3462 // Without this cast, the comparison turned unsigned and, thus, failed for -1. | 3482 // Without this cast, the comparison turned unsigned and, thus, failed for -1. |
| 3463 const int num_specs = static_cast<int>(specs.size()); | 3483 const int num_specs = static_cast<int>(specs.size()); |
| 3464 EXPECT_GE(find_codec({"cn", 8000, 1}), num_specs); | 3484 EXPECT_GE(find_codec({"cn", 8000, 1}), num_specs); |
| 3465 EXPECT_GE(find_codec({"cn", 16000, 1}), num_specs); | 3485 EXPECT_GE(find_codec({"cn", 16000, 1}), num_specs); |
| 3466 EXPECT_EQ(find_codec({"cn", 32000, 1}), -1); | 3486 EXPECT_EQ(find_codec({"cn", 32000, 1}), -1); |
| 3467 EXPECT_GE(find_codec({"telephone-event", 8000, 1}), num_specs); | 3487 EXPECT_GE(find_codec({"telephone-event", 8000, 1}), num_specs); |
| 3468 EXPECT_GE(find_codec({"telephone-event", 16000, 1}), num_specs); | 3488 EXPECT_GE(find_codec({"telephone-event", 16000, 1}), num_specs); |
| 3469 EXPECT_GE(find_codec({"telephone-event", 32000, 1}), num_specs); | 3489 EXPECT_GE(find_codec({"telephone-event", 32000, 1}), num_specs); |
| 3470 EXPECT_GE(find_codec({"telephone-event", 48000, 1}), num_specs); | 3490 EXPECT_GE(find_codec({"telephone-event", 48000, 1}), num_specs); |
| 3471 } | 3491 } |
| OLD | NEW |