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/pc/channel.h" | 13 #include "webrtc/pc/channel.h" |
14 #include "webrtc/base/arraysize.h" | 14 #include "webrtc/base/arraysize.h" |
15 #include "webrtc/base/byteorder.h" | 15 #include "webrtc/base/byteorder.h" |
16 #include "webrtc/base/gunit.h" | 16 #include "webrtc/base/gunit.h" |
17 #include "webrtc/call.h" | 17 #include "webrtc/call.h" |
18 #include "webrtc/p2p/base/faketransportcontroller.h" | 18 #include "webrtc/p2p/base/faketransportcontroller.h" |
19 #include "webrtc/test/field_trial.h" | 19 #include "webrtc/test/field_trial.h" |
20 #include "webrtc/media/base/fakemediaengine.h" | 20 #include "webrtc/media/base/fakemediaengine.h" |
21 #include "webrtc/media/base/fakenetworkinterface.h" | 21 #include "webrtc/media/base/fakenetworkinterface.h" |
22 #include "webrtc/media/base/fakertp.h" | 22 #include "webrtc/media/base/fakertp.h" |
23 #include "webrtc/media/base/mediaconstants.h" | 23 #include "webrtc/media/base/mediaconstants.h" |
24 #include "webrtc/media/engine/fakewebrtccall.h" | 24 #include "webrtc/media/engine/fakewebrtccall.h" |
25 #include "webrtc/media/engine/fakewebrtcvoiceengine.h" | 25 #include "webrtc/media/engine/fakewebrtcvoiceengine.h" |
26 #include "webrtc/media/engine/webrtcvoiceengine.h" | 26 #include "webrtc/media/engine/webrtcvoiceengine.h" |
| 27 #include "webrtc/modules/audio_coding/codecs/builtin_audio_decoder_factory.h" |
| 28 #include "webrtc/modules/audio_coding/codecs/mock/mock_audio_decoder_factory.h" |
27 #include "webrtc/modules/audio_device/include/mock_audio_device.h" | 29 #include "webrtc/modules/audio_device/include/mock_audio_device.h" |
28 | 30 |
29 using testing::Return; | 31 using testing::Return; |
30 using testing::StrictMock; | 32 using testing::StrictMock; |
31 | 33 |
32 namespace { | 34 namespace { |
33 | 35 |
34 const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1); | 36 const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1); |
35 const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1); | 37 const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1); |
36 const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2); | 38 const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2); |
(...skipping 29 matching lines...) Expand all Loading... |
66 TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) { | 68 TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) { |
67 StrictMock<webrtc::test::MockAudioDeviceModule> adm; | 69 StrictMock<webrtc::test::MockAudioDeviceModule> adm; |
68 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0)); | 70 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0)); |
69 EXPECT_CALL(adm, Release()).WillOnce(Return(0)); | 71 EXPECT_CALL(adm, Release()).WillOnce(Return(0)); |
70 EXPECT_CALL(adm, BuiltInAECIsAvailable()).WillOnce(Return(false)); | 72 EXPECT_CALL(adm, BuiltInAECIsAvailable()).WillOnce(Return(false)); |
71 EXPECT_CALL(adm, BuiltInAGCIsAvailable()).WillOnce(Return(false)); | 73 EXPECT_CALL(adm, BuiltInAGCIsAvailable()).WillOnce(Return(false)); |
72 EXPECT_CALL(adm, BuiltInNSIsAvailable()).WillOnce(Return(false)); | 74 EXPECT_CALL(adm, BuiltInNSIsAvailable()).WillOnce(Return(false)); |
73 cricket::FakeWebRtcVoiceEngine voe; | 75 cricket::FakeWebRtcVoiceEngine voe; |
74 EXPECT_FALSE(voe.IsInited()); | 76 EXPECT_FALSE(voe.IsInited()); |
75 { | 77 { |
76 cricket::WebRtcVoiceEngine engine(&adm, new FakeVoEWrapper(&voe)); | 78 cricket::WebRtcVoiceEngine engine(&adm, nullptr, new FakeVoEWrapper(&voe)); |
77 EXPECT_TRUE(voe.IsInited()); | 79 EXPECT_TRUE(voe.IsInited()); |
78 } | 80 } |
79 EXPECT_FALSE(voe.IsInited()); | 81 EXPECT_FALSE(voe.IsInited()); |
80 } | 82 } |
81 | 83 |
82 class FakeAudioSink : public webrtc::AudioSinkInterface { | 84 class FakeAudioSink : public webrtc::AudioSinkInterface { |
83 public: | 85 public: |
84 void OnData(const Data& audio) override {} | 86 void OnData(const Data& audio) override {} |
85 }; | 87 }; |
86 | 88 |
87 class FakeAudioSource : public cricket::AudioSource { | 89 class FakeAudioSource : public cricket::AudioSource { |
88 void SetSink(Sink* sink) override {} | 90 void SetSink(Sink* sink) override {} |
89 }; | 91 }; |
90 | 92 |
91 class WebRtcVoiceEngineTestFake : public testing::Test { | 93 class WebRtcVoiceEngineTestFake : public testing::Test { |
92 public: | 94 public: |
93 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {} | 95 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {} |
94 | 96 |
95 explicit WebRtcVoiceEngineTestFake(const char* field_trials) | 97 explicit WebRtcVoiceEngineTestFake(const char* field_trials) |
96 : call_(webrtc::Call::Config()), override_field_trials_(field_trials) { | 98 : call_(webrtc::Call::Config()), override_field_trials_(field_trials) { |
97 EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0)); | 99 EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0)); |
98 EXPECT_CALL(adm_, Release()).WillOnce(Return(0)); | 100 EXPECT_CALL(adm_, Release()).WillOnce(Return(0)); |
99 EXPECT_CALL(adm_, BuiltInAECIsAvailable()).WillOnce(Return(false)); | 101 EXPECT_CALL(adm_, BuiltInAECIsAvailable()).WillOnce(Return(false)); |
100 EXPECT_CALL(adm_, BuiltInAGCIsAvailable()).WillOnce(Return(false)); | 102 EXPECT_CALL(adm_, BuiltInAGCIsAvailable()).WillOnce(Return(false)); |
101 EXPECT_CALL(adm_, BuiltInNSIsAvailable()).WillOnce(Return(false)); | 103 EXPECT_CALL(adm_, BuiltInNSIsAvailable()).WillOnce(Return(false)); |
102 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, | 104 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, nullptr, |
103 new FakeVoEWrapper(&voe_))); | 105 new FakeVoEWrapper(&voe_))); |
104 send_parameters_.codecs.push_back(kPcmuCodec); | 106 send_parameters_.codecs.push_back(kPcmuCodec); |
105 recv_parameters_.codecs.push_back(kPcmuCodec); | 107 recv_parameters_.codecs.push_back(kPcmuCodec); |
106 } | 108 } |
107 bool SetupChannel() { | 109 bool SetupChannel() { |
108 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(), | 110 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(), |
109 cricket::AudioOptions()); | 111 cricket::AudioOptions()); |
110 return (channel_ != nullptr); | 112 return (channel_ != nullptr); |
111 } | 113 } |
112 bool SetupRecvStream() { | 114 bool SetupRecvStream() { |
(...skipping 3415 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3528 | 3530 |
3529 channel_->OnReadyToSend(true); | 3531 channel_->OnReadyToSend(true); |
3530 EXPECT_EQ(webrtc::kNetworkUp, | 3532 EXPECT_EQ(webrtc::kNetworkUp, |
3531 call_.GetNetworkState(webrtc::MediaType::AUDIO)); | 3533 call_.GetNetworkState(webrtc::MediaType::AUDIO)); |
3532 EXPECT_EQ(webrtc::kNetworkUp, | 3534 EXPECT_EQ(webrtc::kNetworkUp, |
3533 call_.GetNetworkState(webrtc::MediaType::VIDEO)); | 3535 call_.GetNetworkState(webrtc::MediaType::VIDEO)); |
3534 } | 3536 } |
3535 | 3537 |
3536 // Tests that the library initializes and shuts down properly. | 3538 // Tests that the library initializes and shuts down properly. |
3537 TEST(WebRtcVoiceEngineTest, StartupShutdown) { | 3539 TEST(WebRtcVoiceEngineTest, StartupShutdown) { |
3538 cricket::WebRtcVoiceEngine engine(nullptr); | 3540 using testing::_; |
| 3541 using testing::AnyNumber; |
| 3542 |
| 3543 // If the VoiceEngine wants to gather available codecs early, that's fine but |
| 3544 // we never want it to create a decoder at this stage. |
| 3545 rtc::scoped_refptr<webrtc::MockAudioDecoderFactory> factory = |
| 3546 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>; |
| 3547 ON_CALL(*factory.get(), GetSupportedFormats()) |
| 3548 .WillByDefault(Return(std::vector<webrtc::SdpAudioFormat>())); |
| 3549 EXPECT_CALL(*factory.get(), GetSupportedFormats()) |
| 3550 .Times(AnyNumber()); |
| 3551 EXPECT_CALL(*factory.get(), MakeAudioDecoderMock(_, _)).Times(0); |
| 3552 |
| 3553 cricket::WebRtcVoiceEngine engine(nullptr, factory); |
3539 std::unique_ptr<webrtc::Call> call( | 3554 std::unique_ptr<webrtc::Call> call( |
3540 webrtc::Call::Create(webrtc::Call::Config())); | 3555 webrtc::Call::Create(webrtc::Call::Config())); |
3541 cricket::VoiceMediaChannel* channel = engine.CreateChannel( | 3556 cricket::VoiceMediaChannel* channel = engine.CreateChannel( |
3542 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); | 3557 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); |
3543 EXPECT_TRUE(channel != nullptr); | 3558 EXPECT_TRUE(channel != nullptr); |
3544 delete channel; | 3559 delete channel; |
3545 } | 3560 } |
3546 | 3561 |
3547 // Tests that reference counting on the external ADM is correct. | 3562 // Tests that reference counting on the external ADM is correct. |
3548 TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) { | 3563 TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) { |
3549 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm; | 3564 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm; |
3550 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0)); | 3565 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0)); |
3551 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0)); | 3566 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0)); |
3552 { | 3567 { |
3553 cricket::WebRtcVoiceEngine engine(&adm); | 3568 cricket::WebRtcVoiceEngine engine(&adm, nullptr); |
3554 std::unique_ptr<webrtc::Call> call( | 3569 std::unique_ptr<webrtc::Call> call( |
3555 webrtc::Call::Create(webrtc::Call::Config())); | 3570 webrtc::Call::Create(webrtc::Call::Config())); |
3556 cricket::VoiceMediaChannel* channel = engine.CreateChannel( | 3571 cricket::VoiceMediaChannel* channel = engine.CreateChannel( |
3557 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); | 3572 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); |
3558 EXPECT_TRUE(channel != nullptr); | 3573 EXPECT_TRUE(channel != nullptr); |
3559 delete channel; | 3574 delete channel; |
3560 } | 3575 } |
3561 } | 3576 } |
3562 | 3577 |
3563 // Tests that the library is configured with the codecs we want. | 3578 // Tests that the library is configured with the codecs we want. |
3564 TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) { | 3579 TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) { |
| 3580 // TODO(ossu): These tests should move into a future "builtin audio codecs" |
| 3581 // module. |
| 3582 |
3565 // Check codecs by name. | 3583 // Check codecs by name. |
3566 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst( | 3584 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst( |
3567 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr)); | 3585 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr)); |
3568 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst( | 3586 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst( |
3569 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr)); | 3587 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr)); |
3570 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst( | 3588 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst( |
3571 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr)); | 3589 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr)); |
3572 // Check that name matching is case-insensitive. | 3590 // Check that name matching is case-insensitive. |
3573 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst( | 3591 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst( |
3574 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr)); | 3592 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr)); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3608 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst( | 3626 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst( |
3609 cricket::AudioCodec(88, "", 0, 0, 1), nullptr)); | 3627 cricket::AudioCodec(88, "", 0, 0, 1), nullptr)); |
3610 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst( | 3628 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst( |
3611 cricket::AudioCodec(0, "", 0, 0, 2), nullptr)); | 3629 cricket::AudioCodec(0, "", 0, 0, 2), nullptr)); |
3612 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst( | 3630 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst( |
3613 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr)); | 3631 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr)); |
3614 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst( | 3632 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst( |
3615 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr)); | 3633 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr)); |
3616 | 3634 |
3617 // Verify the payload id of common audio codecs, including CN, ISAC, and G722. | 3635 // Verify the payload id of common audio codecs, including CN, ISAC, and G722. |
3618 cricket::WebRtcVoiceEngine engine(nullptr); | 3636 cricket::WebRtcVoiceEngine engine(nullptr, |
| 3637 webrtc::CreateBuiltinAudioDecoderFactory()); |
3619 for (std::vector<cricket::AudioCodec>::const_iterator it = | 3638 for (std::vector<cricket::AudioCodec>::const_iterator it = |
3620 engine.codecs().begin(); it != engine.codecs().end(); ++it) { | 3639 engine.codecs().begin(); it != engine.codecs().end(); ++it) { |
3621 if (it->name == "CN" && it->clockrate == 16000) { | 3640 if (it->name == "CN" && it->clockrate == 16000) { |
3622 EXPECT_EQ(105, it->id); | 3641 EXPECT_EQ(105, it->id); |
3623 } else if (it->name == "CN" && it->clockrate == 32000) { | 3642 } else if (it->name == "CN" && it->clockrate == 32000) { |
3624 EXPECT_EQ(106, it->id); | 3643 EXPECT_EQ(106, it->id); |
3625 } else if (it->name == "ISAC" && it->clockrate == 16000) { | 3644 } else if (it->name == "ISAC" && it->clockrate == 16000) { |
3626 EXPECT_EQ(103, it->id); | 3645 EXPECT_EQ(103, it->id); |
3627 } else if (it->name == "ISAC" && it->clockrate == 32000) { | 3646 } else if (it->name == "ISAC" && it->clockrate == 32000) { |
3628 EXPECT_EQ(104, it->id); | 3647 EXPECT_EQ(104, it->id); |
3629 } else if (it->name == "G722" && it->clockrate == 8000) { | 3648 } else if (it->name == "G722" && it->clockrate == 8000) { |
3630 EXPECT_EQ(9, it->id); | 3649 EXPECT_EQ(9, it->id); |
3631 } else if (it->name == "telephone-event") { | 3650 } else if (it->name == "telephone-event") { |
3632 EXPECT_EQ(126, it->id); | 3651 EXPECT_EQ(126, it->id); |
3633 } else if (it->name == "red") { | 3652 } else if (it->name == "red") { |
3634 EXPECT_EQ(127, it->id); | 3653 EXPECT_EQ(127, it->id); |
3635 } else if (it->name == "opus") { | 3654 } else if (it->name == "opus") { |
3636 EXPECT_EQ(111, it->id); | 3655 EXPECT_EQ(111, it->id); |
3637 ASSERT_TRUE(it->params.find("minptime") != it->params.end()); | 3656 ASSERT_TRUE(it->params.find("minptime") != it->params.end()); |
3638 EXPECT_EQ("10", it->params.find("minptime")->second); | 3657 EXPECT_EQ("10", it->params.find("minptime")->second); |
3639 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end()); | 3658 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end()); |
3640 EXPECT_EQ("1", it->params.find("useinbandfec")->second); | 3659 EXPECT_EQ("1", it->params.find("useinbandfec")->second); |
3641 } | 3660 } |
3642 } | 3661 } |
3643 } | 3662 } |
3644 | 3663 |
3645 // Tests that VoE supports at least 32 channels | 3664 // Tests that VoE supports at least 32 channels |
3646 TEST(WebRtcVoiceEngineTest, Has32Channels) { | 3665 TEST(WebRtcVoiceEngineTest, Has32Channels) { |
3647 cricket::WebRtcVoiceEngine engine(nullptr); | 3666 cricket::WebRtcVoiceEngine engine(nullptr, nullptr); |
3648 std::unique_ptr<webrtc::Call> call( | 3667 std::unique_ptr<webrtc::Call> call( |
3649 webrtc::Call::Create(webrtc::Call::Config())); | 3668 webrtc::Call::Create(webrtc::Call::Config())); |
3650 | 3669 |
3651 cricket::VoiceMediaChannel* channels[32]; | 3670 cricket::VoiceMediaChannel* channels[32]; |
3652 int num_channels = 0; | 3671 int num_channels = 0; |
3653 while (num_channels < arraysize(channels)) { | 3672 while (num_channels < arraysize(channels)) { |
3654 cricket::VoiceMediaChannel* channel = engine.CreateChannel( | 3673 cricket::VoiceMediaChannel* channel = engine.CreateChannel( |
3655 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); | 3674 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); |
3656 if (!channel) | 3675 if (!channel) |
3657 break; | 3676 break; |
3658 channels[num_channels++] = channel; | 3677 channels[num_channels++] = channel; |
3659 } | 3678 } |
3660 | 3679 |
3661 int expected = arraysize(channels); | 3680 int expected = arraysize(channels); |
3662 EXPECT_EQ(expected, num_channels); | 3681 EXPECT_EQ(expected, num_channels); |
3663 | 3682 |
3664 while (num_channels > 0) { | 3683 while (num_channels > 0) { |
3665 delete channels[--num_channels]; | 3684 delete channels[--num_channels]; |
3666 } | 3685 } |
3667 } | 3686 } |
3668 | 3687 |
3669 // Test that we set our preferred codecs properly. | 3688 // Test that we set our preferred codecs properly. |
3670 TEST(WebRtcVoiceEngineTest, SetRecvCodecs) { | 3689 TEST(WebRtcVoiceEngineTest, SetRecvCodecs) { |
3671 cricket::WebRtcVoiceEngine engine(nullptr); | 3690 // TODO(ossu): I'm not sure of the intent of this test. It's either: |
| 3691 // - Check that our builtin codecs are usable by Channel. |
| 3692 // - The codecs provided by the engine is usable by Channel. |
| 3693 // It does not check that the codecs in the RecvParameters are actually |
| 3694 // what we sent in - though it's probably reasonable to expect so, if |
| 3695 // SetRecvParameters returns true. |
| 3696 // I think it will become clear once audio decoder injection is completed. |
| 3697 cricket::WebRtcVoiceEngine engine( |
| 3698 nullptr, webrtc::CreateBuiltinAudioDecoderFactory()); |
3672 std::unique_ptr<webrtc::Call> call( | 3699 std::unique_ptr<webrtc::Call> call( |
3673 webrtc::Call::Create(webrtc::Call::Config())); | 3700 webrtc::Call::Create(webrtc::Call::Config())); |
3674 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(), | 3701 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(), |
3675 cricket::AudioOptions(), call.get()); | 3702 cricket::AudioOptions(), call.get()); |
3676 cricket::AudioRecvParameters parameters; | 3703 cricket::AudioRecvParameters parameters; |
3677 parameters.codecs = engine.codecs(); | 3704 parameters.codecs = engine.codecs(); |
3678 EXPECT_TRUE(channel.SetRecvParameters(parameters)); | 3705 EXPECT_TRUE(channel.SetRecvParameters(parameters)); |
3679 } | 3706 } |
OLD | NEW |