Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(281)

Side by Side Diff: webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus_unittest.cc

Issue 2947563002: Revert of Opus implementation of the AudioEncoderFactoryTemplate API (Closed)
Patch Set: Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2015 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
(...skipping 15 matching lines...) Expand all
26 26
27 namespace webrtc { 27 namespace webrtc {
28 using ::testing::NiceMock; 28 using ::testing::NiceMock;
29 using ::testing::Return; 29 using ::testing::Return;
30 30
31 namespace { 31 namespace {
32 32
33 const CodecInst kDefaultOpusSettings = {105, "opus", 48000, 960, 1, 32000}; 33 const CodecInst kDefaultOpusSettings = {105, "opus", 48000, 960, 1, 32000};
34 constexpr int64_t kInitialTimeUs = 12345678; 34 constexpr int64_t kInitialTimeUs = 12345678;
35 35
36 AudioEncoderOpusConfig CreateConfig(const CodecInst& codec_inst) { 36 AudioEncoderOpus::Config CreateConfig(const CodecInst& codec_inst) {
37 AudioEncoderOpusConfig config; 37 AudioEncoderOpus::Config config;
38 config.frame_size_ms = rtc::CheckedDivExact(codec_inst.pacsize, 48); 38 config.frame_size_ms = rtc::CheckedDivExact(codec_inst.pacsize, 48);
39 config.num_channels = codec_inst.channels; 39 config.num_channels = codec_inst.channels;
40 config.bitrate_bps = codec_inst.rate; 40 config.bitrate_bps = rtc::Optional<int>(codec_inst.rate);
41 config.application = config.num_channels == 1 41 config.payload_type = codec_inst.pltype;
42 ? AudioEncoderOpusConfig::ApplicationMode::kVoip 42 config.application = config.num_channels == 1 ? AudioEncoderOpus::kVoip
43 : AudioEncoderOpusConfig::ApplicationMode::kAudio; 43 : AudioEncoderOpus::kAudio;
44 config.supported_frame_lengths_ms.push_back(config.frame_size_ms); 44 config.supported_frame_lengths_ms.push_back(config.frame_size_ms);
45 return config; 45 return config;
46 } 46 }
47 47
48 AudioEncoderOpusConfig CreateConfigWithParameters( 48 AudioEncoderOpus::Config CreateConfigWithParameters(
49 const SdpAudioFormat::Parameters& params) { 49 const SdpAudioFormat::Parameters& params) {
50 const SdpAudioFormat format("opus", 48000, 2, params); 50 SdpAudioFormat format("opus", 48000, 2, params);
51 return *AudioEncoderOpusImpl::SdpToConfig(format); 51 return AudioEncoderOpus::CreateConfig(0, format);
52 } 52 }
53 53
54 struct AudioEncoderOpusStates { 54 struct AudioEncoderOpusStates {
55 std::shared_ptr<MockAudioNetworkAdaptor*> mock_audio_network_adaptor; 55 std::shared_ptr<MockAudioNetworkAdaptor*> mock_audio_network_adaptor;
56 MockSmoothingFilter* mock_bitrate_smoother; 56 MockSmoothingFilter* mock_bitrate_smoother;
57 std::unique_ptr<AudioEncoderOpusImpl> encoder; 57 std::unique_ptr<AudioEncoderOpus> encoder;
58 std::unique_ptr<rtc::ScopedFakeClock> fake_clock; 58 std::unique_ptr<rtc::ScopedFakeClock> fake_clock;
59 AudioEncoderOpusConfig config; 59 AudioEncoderOpus::Config config;
60 }; 60 };
61 61
62 AudioEncoderOpusStates CreateCodec(size_t num_channels) { 62 AudioEncoderOpusStates CreateCodec(size_t num_channels) {
63 AudioEncoderOpusStates states; 63 AudioEncoderOpusStates states;
64 states.mock_audio_network_adaptor = 64 states.mock_audio_network_adaptor =
65 std::make_shared<MockAudioNetworkAdaptor*>(nullptr); 65 std::make_shared<MockAudioNetworkAdaptor*>(nullptr);
66 states.fake_clock.reset(new rtc::ScopedFakeClock()); 66 states.fake_clock.reset(new rtc::ScopedFakeClock());
67 states.fake_clock->SetTimeMicros(kInitialTimeUs); 67 states.fake_clock->SetTimeMicros(kInitialTimeUs);
68 std::weak_ptr<MockAudioNetworkAdaptor*> mock_ptr( 68 std::weak_ptr<MockAudioNetworkAdaptor*> mock_ptr(
69 states.mock_audio_network_adaptor); 69 states.mock_audio_network_adaptor);
70 AudioEncoderOpusImpl::AudioNetworkAdaptorCreator creator = 70 AudioEncoderOpus::AudioNetworkAdaptorCreator creator =
71 [mock_ptr](const std::string&, RtcEventLog* event_log) { 71 [mock_ptr](const std::string&, RtcEventLog* event_log) {
72 std::unique_ptr<MockAudioNetworkAdaptor> adaptor( 72 std::unique_ptr<MockAudioNetworkAdaptor> adaptor(
73 new NiceMock<MockAudioNetworkAdaptor>()); 73 new NiceMock<MockAudioNetworkAdaptor>());
74 EXPECT_CALL(*adaptor, Die()); 74 EXPECT_CALL(*adaptor, Die());
75 if (auto sp = mock_ptr.lock()) { 75 if (auto sp = mock_ptr.lock()) {
76 *sp = adaptor.get(); 76 *sp = adaptor.get();
77 } else { 77 } else {
78 RTC_NOTREACHED(); 78 RTC_NOTREACHED();
79 } 79 }
80 return adaptor; 80 return adaptor;
81 }; 81 };
82 82
83 CodecInst codec_inst = kDefaultOpusSettings; 83 CodecInst codec_inst = kDefaultOpusSettings;
84 codec_inst.channels = num_channels; 84 codec_inst.channels = num_channels;
85 states.config = CreateConfig(codec_inst); 85 states.config = CreateConfig(codec_inst);
86 std::unique_ptr<MockSmoothingFilter> bitrate_smoother( 86 std::unique_ptr<MockSmoothingFilter> bitrate_smoother(
87 new MockSmoothingFilter()); 87 new MockSmoothingFilter());
88 states.mock_bitrate_smoother = bitrate_smoother.get(); 88 states.mock_bitrate_smoother = bitrate_smoother.get();
89 89
90 states.encoder.reset(new AudioEncoderOpusImpl( 90 states.encoder.reset(new AudioEncoderOpus(states.config, std::move(creator),
91 states.config, codec_inst.pltype, std::move(creator), 91 std::move(bitrate_smoother)));
92 std::move(bitrate_smoother)));
93 return states; 92 return states;
94 } 93 }
95 94
96 AudioEncoderRuntimeConfig CreateEncoderRuntimeConfig() { 95 AudioEncoderRuntimeConfig CreateEncoderRuntimeConfig() {
97 constexpr int kBitrate = 40000; 96 constexpr int kBitrate = 40000;
98 constexpr int kFrameLength = 60; 97 constexpr int kFrameLength = 60;
99 constexpr bool kEnableFec = true; 98 constexpr bool kEnableFec = true;
100 constexpr bool kEnableDtx = false; 99 constexpr bool kEnableDtx = false;
101 constexpr size_t kNumChannels = 1; 100 constexpr size_t kNumChannels = 1;
102 constexpr float kPacketLossFraction = 0.1f; 101 constexpr float kPacketLossFraction = 0.1f;
103 AudioEncoderRuntimeConfig config; 102 AudioEncoderRuntimeConfig config;
104 config.bitrate_bps = rtc::Optional<int>(kBitrate); 103 config.bitrate_bps = rtc::Optional<int>(kBitrate);
105 config.frame_length_ms = rtc::Optional<int>(kFrameLength); 104 config.frame_length_ms = rtc::Optional<int>(kFrameLength);
106 config.enable_fec = rtc::Optional<bool>(kEnableFec); 105 config.enable_fec = rtc::Optional<bool>(kEnableFec);
107 config.enable_dtx = rtc::Optional<bool>(kEnableDtx); 106 config.enable_dtx = rtc::Optional<bool>(kEnableDtx);
108 config.num_channels = rtc::Optional<size_t>(kNumChannels); 107 config.num_channels = rtc::Optional<size_t>(kNumChannels);
109 config.uplink_packet_loss_fraction = 108 config.uplink_packet_loss_fraction =
110 rtc::Optional<float>(kPacketLossFraction); 109 rtc::Optional<float>(kPacketLossFraction);
111 return config; 110 return config;
112 } 111 }
113 112
114 void CheckEncoderRuntimeConfig(const AudioEncoderOpusImpl* encoder, 113 void CheckEncoderRuntimeConfig(const AudioEncoderOpus* encoder,
115 const AudioEncoderRuntimeConfig& config) { 114 const AudioEncoderRuntimeConfig& config) {
116 EXPECT_EQ(*config.bitrate_bps, encoder->GetTargetBitrate()); 115 EXPECT_EQ(*config.bitrate_bps, encoder->GetTargetBitrate());
117 EXPECT_EQ(*config.frame_length_ms, encoder->next_frame_length_ms()); 116 EXPECT_EQ(*config.frame_length_ms, encoder->next_frame_length_ms());
118 EXPECT_EQ(*config.enable_fec, encoder->fec_enabled()); 117 EXPECT_EQ(*config.enable_fec, encoder->fec_enabled());
119 EXPECT_EQ(*config.enable_dtx, encoder->GetDtx()); 118 EXPECT_EQ(*config.enable_dtx, encoder->GetDtx());
120 EXPECT_EQ(*config.num_channels, encoder->num_channels_to_encode()); 119 EXPECT_EQ(*config.num_channels, encoder->num_channels_to_encode());
121 } 120 }
122 121
123 // Create 10ms audio data blocks for a total packet size of "packet_size_ms". 122 // Create 10ms audio data blocks for a total packet size of "packet_size_ms".
124 std::unique_ptr<test::AudioLoop> Create10msAudioBlocks( 123 std::unique_ptr<test::AudioLoop> Create10msAudioBlocks(
125 const std::unique_ptr<AudioEncoderOpusImpl>& encoder, 124 const std::unique_ptr<AudioEncoderOpus>& encoder,
126 int packet_size_ms) { 125 int packet_size_ms) {
127 const std::string file_name = 126 const std::string file_name =
128 test::ResourcePath("audio_coding/testfile32kHz", "pcm"); 127 test::ResourcePath("audio_coding/testfile32kHz", "pcm");
129 128
130 std::unique_ptr<test::AudioLoop> speech_data(new test::AudioLoop()); 129 std::unique_ptr<test::AudioLoop> speech_data(new test::AudioLoop());
131 int audio_samples_per_ms = 130 int audio_samples_per_ms =
132 rtc::CheckedDivExact(encoder->SampleRateHz(), 1000); 131 rtc::CheckedDivExact(encoder->SampleRateHz(), 1000);
133 if (!speech_data->Init( 132 if (!speech_data->Init(
134 file_name, 133 file_name,
135 packet_size_ms * audio_samples_per_ms * 134 packet_size_ms * audio_samples_per_ms *
136 encoder->num_channels_to_encode(), 135 encoder->num_channels_to_encode(),
137 10 * audio_samples_per_ms * encoder->num_channels_to_encode())) 136 10 * audio_samples_per_ms * encoder->num_channels_to_encode()))
138 return nullptr; 137 return nullptr;
139 return speech_data; 138 return speech_data;
140 } 139 }
141 140
142 } // namespace 141 } // namespace
143 142
144 TEST(AudioEncoderOpusTest, DefaultApplicationModeMono) { 143 TEST(AudioEncoderOpusTest, DefaultApplicationModeMono) {
145 auto states = CreateCodec(1); 144 auto states = CreateCodec(1);
146 EXPECT_EQ(AudioEncoderOpusConfig::ApplicationMode::kVoip, 145 EXPECT_EQ(AudioEncoderOpus::kVoip, states.encoder->application());
147 states.encoder->application());
148 } 146 }
149 147
150 TEST(AudioEncoderOpusTest, DefaultApplicationModeStereo) { 148 TEST(AudioEncoderOpusTest, DefaultApplicationModeStereo) {
151 auto states = CreateCodec(2); 149 auto states = CreateCodec(2);
152 EXPECT_EQ(AudioEncoderOpusConfig::ApplicationMode::kAudio, 150 EXPECT_EQ(AudioEncoderOpus::kAudio, states.encoder->application());
153 states.encoder->application());
154 } 151 }
155 152
156 TEST(AudioEncoderOpusTest, ChangeApplicationMode) { 153 TEST(AudioEncoderOpusTest, ChangeApplicationMode) {
157 auto states = CreateCodec(2); 154 auto states = CreateCodec(2);
158 EXPECT_TRUE( 155 EXPECT_TRUE(
159 states.encoder->SetApplication(AudioEncoder::Application::kSpeech)); 156 states.encoder->SetApplication(AudioEncoder::Application::kSpeech));
160 EXPECT_EQ(AudioEncoderOpusConfig::ApplicationMode::kVoip, 157 EXPECT_EQ(AudioEncoderOpus::kVoip, states.encoder->application());
161 states.encoder->application());
162 } 158 }
163 159
164 TEST(AudioEncoderOpusTest, ResetWontChangeApplicationMode) { 160 TEST(AudioEncoderOpusTest, ResetWontChangeApplicationMode) {
165 auto states = CreateCodec(2); 161 auto states = CreateCodec(2);
166 162
167 // Trigger a reset. 163 // Trigger a reset.
168 states.encoder->Reset(); 164 states.encoder->Reset();
169 // Verify that the mode is still kAudio. 165 // Verify that the mode is still kAudio.
170 EXPECT_EQ(AudioEncoderOpusConfig::ApplicationMode::kAudio, 166 EXPECT_EQ(AudioEncoderOpus::kAudio, states.encoder->application());
171 states.encoder->application());
172 167
173 // Now change to kVoip. 168 // Now change to kVoip.
174 EXPECT_TRUE( 169 EXPECT_TRUE(
175 states.encoder->SetApplication(AudioEncoder::Application::kSpeech)); 170 states.encoder->SetApplication(AudioEncoder::Application::kSpeech));
176 EXPECT_EQ(AudioEncoderOpusConfig::ApplicationMode::kVoip, 171 EXPECT_EQ(AudioEncoderOpus::kVoip, states.encoder->application());
177 states.encoder->application());
178 172
179 // Trigger a reset again. 173 // Trigger a reset again.
180 states.encoder->Reset(); 174 states.encoder->Reset();
181 // Verify that the mode is still kVoip. 175 // Verify that the mode is still kVoip.
182 EXPECT_EQ(AudioEncoderOpusConfig::ApplicationMode::kVoip, 176 EXPECT_EQ(AudioEncoderOpus::kVoip, states.encoder->application());
183 states.encoder->application());
184 } 177 }
185 178
186 TEST(AudioEncoderOpusTest, ToggleDtx) { 179 TEST(AudioEncoderOpusTest, ToggleDtx) {
187 auto states = CreateCodec(2); 180 auto states = CreateCodec(2);
188 // Enable DTX 181 // Enable DTX
189 EXPECT_TRUE(states.encoder->SetDtx(true)); 182 EXPECT_TRUE(states.encoder->SetDtx(true));
190 EXPECT_TRUE(states.encoder->GetDtx()); 183 EXPECT_TRUE(states.encoder->GetDtx());
191 // Turn off DTX. 184 // Turn off DTX.
192 EXPECT_TRUE(states.encoder->SetDtx(false)); 185 EXPECT_TRUE(states.encoder->SetDtx(false));
193 EXPECT_FALSE(states.encoder->GetDtx()); 186 EXPECT_FALSE(states.encoder->GetDtx());
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 } 231 }
239 232
240 // Sets the packet loss rate to each number in the vector in turn, and verifies 233 // Sets the packet loss rate to each number in the vector in turn, and verifies
241 // that the loss rate as reported by the encoder is |expected_return| for all 234 // that the loss rate as reported by the encoder is |expected_return| for all
242 // of them. 235 // of them.
243 void TestSetPacketLossRate(AudioEncoderOpusStates* states, 236 void TestSetPacketLossRate(AudioEncoderOpusStates* states,
244 const std::vector<float>& losses, 237 const std::vector<float>& losses,
245 float expected_return) { 238 float expected_return) {
246 // |kSampleIntervalMs| is chosen to ease the calculation since 239 // |kSampleIntervalMs| is chosen to ease the calculation since
247 // 0.9999 ^ 184198 = 1e-8. Which minimizes the effect of 240 // 0.9999 ^ 184198 = 1e-8. Which minimizes the effect of
248 // PacketLossFractionSmoother used in AudioEncoderOpusImpl. 241 // PacketLossFractionSmoother used in AudioEncoderOpus.
249 constexpr int64_t kSampleIntervalMs = 184198; 242 constexpr int64_t kSampleIntervalMs = 184198;
250 for (float loss : losses) { 243 for (float loss : losses) {
251 states->encoder->OnReceivedUplinkPacketLossFraction(loss); 244 states->encoder->OnReceivedUplinkPacketLossFraction(loss);
252 states->fake_clock->AdvanceTime( 245 states->fake_clock->AdvanceTime(
253 rtc::TimeDelta::FromMilliseconds(kSampleIntervalMs)); 246 rtc::TimeDelta::FromMilliseconds(kSampleIntervalMs));
254 EXPECT_FLOAT_EQ(expected_return, states->encoder->packet_loss_rate()); 247 EXPECT_FLOAT_EQ(expected_return, states->encoder->packet_loss_rate());
255 } 248 }
256 } 249 }
257 250
258 } // namespace 251 } // namespace
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
452 // subtracted. The eventual codec rate should be bounded by |kMaxBitrateBps|. 445 // subtracted. The eventual codec rate should be bounded by |kMaxBitrateBps|.
453 target_bitrate = 446 target_bitrate =
454 kOverheadBytesPerPacket * 8 * packet_rate + kMaxBitrateBps + 1; 447 kOverheadBytesPerPacket * 8 * packet_rate + kMaxBitrateBps + 1;
455 states.encoder->OnReceivedUplinkBandwidth(target_bitrate, 448 states.encoder->OnReceivedUplinkBandwidth(target_bitrate,
456 rtc::Optional<int64_t>()); 449 rtc::Optional<int64_t>());
457 EXPECT_EQ(kMaxBitrateBps, states.encoder->GetTargetBitrate()); 450 EXPECT_EQ(kMaxBitrateBps, states.encoder->GetTargetBitrate());
458 } 451 }
459 452
460 // Verifies that the complexity adaptation in the config works as intended. 453 // Verifies that the complexity adaptation in the config works as intended.
461 TEST(AudioEncoderOpusTest, ConfigComplexityAdaptation) { 454 TEST(AudioEncoderOpusTest, ConfigComplexityAdaptation) {
462 AudioEncoderOpusConfig config; 455 AudioEncoderOpus::Config config;
463 config.low_rate_complexity = 8; 456 config.low_rate_complexity = 8;
464 config.complexity = 6; 457 config.complexity = 6;
465 458
466 // Bitrate within hysteresis window. Expect empty output. 459 // Bitrate within hysteresis window. Expect empty output.
467 config.bitrate_bps = 12500; 460 config.bitrate_bps = rtc::Optional<int>(12500);
468 EXPECT_EQ(rtc::Optional<int>(), 461 EXPECT_EQ(rtc::Optional<int>(), config.GetNewComplexity());
469 AudioEncoderOpusImpl::GetNewComplexity(config));
470 462
471 // Bitrate below hysteresis window. Expect higher complexity. 463 // Bitrate below hysteresis window. Expect higher complexity.
472 config.bitrate_bps = 10999; 464 config.bitrate_bps = rtc::Optional<int>(10999);
473 EXPECT_EQ(rtc::Optional<int>(8), 465 EXPECT_EQ(rtc::Optional<int>(8), config.GetNewComplexity());
474 AudioEncoderOpusImpl::GetNewComplexity(config));
475 466
476 // Bitrate within hysteresis window. Expect empty output. 467 // Bitrate within hysteresis window. Expect empty output.
477 config.bitrate_bps = 12500; 468 config.bitrate_bps = rtc::Optional<int>(12500);
478 EXPECT_EQ(rtc::Optional<int>(), 469 EXPECT_EQ(rtc::Optional<int>(), config.GetNewComplexity());
479 AudioEncoderOpusImpl::GetNewComplexity(config));
480 470
481 // Bitrate above hysteresis window. Expect lower complexity. 471 // Bitrate above hysteresis window. Expect lower complexity.
482 config.bitrate_bps = 14001; 472 config.bitrate_bps = rtc::Optional<int>(14001);
483 EXPECT_EQ(rtc::Optional<int>(6), 473 EXPECT_EQ(rtc::Optional<int>(6), config.GetNewComplexity());
484 AudioEncoderOpusImpl::GetNewComplexity(config));
485 } 474 }
486 475
487 TEST(AudioEncoderOpusTest, EmptyConfigDoesNotAffectEncoderSettings) { 476 TEST(AudioEncoderOpusTest, EmptyConfigDoesNotAffectEncoderSettings) {
488 auto states = CreateCodec(2); 477 auto states = CreateCodec(2);
489 states.encoder->EnableAudioNetworkAdaptor("", nullptr); 478 states.encoder->EnableAudioNetworkAdaptor("", nullptr);
490 479
491 auto config = CreateEncoderRuntimeConfig(); 480 auto config = CreateEncoderRuntimeConfig();
492 AudioEncoderRuntimeConfig empty_config; 481 AudioEncoderRuntimeConfig empty_config;
493 482
494 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) 483 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig())
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
556 545
557 // Should encode now. 546 // Should encode now.
558 states.encoder->Encode(rtp_timestamp, audio_frames->GetNextBlock(), 547 states.encoder->Encode(rtp_timestamp, audio_frames->GetNextBlock(),
559 &encoded); 548 &encoded);
560 EXPECT_GT(encoded.size(), 0u); 549 EXPECT_GT(encoded.size(), 0u);
561 encoded.Clear(); 550 encoded.Clear();
562 } 551 }
563 } 552 }
564 553
565 TEST(AudioEncoderOpusTest, TestConfigDefaults) { 554 TEST(AudioEncoderOpusTest, TestConfigDefaults) {
566 const auto config_opt = AudioEncoderOpusImpl::SdpToConfig({"opus", 48000, 2}); 555 const AudioEncoderOpus::Config config =
567 ASSERT_TRUE(config_opt); 556 AudioEncoderOpus::CreateConfig(0, {"opus", 48000, 2});
568 EXPECT_EQ(48000, config_opt->max_playback_rate_hz); 557
569 EXPECT_EQ(1u, config_opt->num_channels); 558 EXPECT_EQ(48000, config.max_playback_rate_hz);
570 EXPECT_FALSE(config_opt->fec_enabled); 559 EXPECT_EQ(1u, config.num_channels);
571 EXPECT_FALSE(config_opt->dtx_enabled); 560 EXPECT_FALSE(config.fec_enabled);
572 EXPECT_EQ(20, config_opt->frame_size_ms); 561 EXPECT_FALSE(config.dtx_enabled);
562 EXPECT_EQ(20, config.frame_size_ms);
573 } 563 }
574 564
575 TEST(AudioEncoderOpusTest, TestConfigFromParams) { 565 TEST(AudioEncoderOpusTest, TestConfigFromParams) {
576 const auto config1 = CreateConfigWithParameters({{"stereo", "0"}}); 566 AudioEncoderOpus::Config config;
577 EXPECT_EQ(1U, config1.num_channels);
578 567
579 const auto config2 = CreateConfigWithParameters({{"stereo", "1"}}); 568 config = CreateConfigWithParameters({{"stereo", "0"}});
580 EXPECT_EQ(2U, config2.num_channels); 569 EXPECT_EQ(1U, config.num_channels);
581 570
582 const auto config3 = CreateConfigWithParameters({{"useinbandfec", "0"}}); 571 config = CreateConfigWithParameters({{"stereo", "1"}});
583 EXPECT_FALSE(config3.fec_enabled); 572 EXPECT_EQ(2U, config.num_channels);
584 573
585 const auto config4 = CreateConfigWithParameters({{"useinbandfec", "1"}}); 574 config = CreateConfigWithParameters({{"useinbandfec", "0"}});
586 EXPECT_TRUE(config4.fec_enabled); 575 EXPECT_FALSE(config.fec_enabled);
587 576
588 const auto config5 = CreateConfigWithParameters({{"usedtx", "0"}}); 577 config = CreateConfigWithParameters({{"useinbandfec", "1"}});
589 EXPECT_FALSE(config5.dtx_enabled); 578 EXPECT_TRUE(config.fec_enabled);
590 579
591 const auto config6 = CreateConfigWithParameters({{"usedtx", "1"}}); 580 config = CreateConfigWithParameters({{"usedtx", "0"}});
592 EXPECT_TRUE(config6.dtx_enabled); 581 EXPECT_FALSE(config.dtx_enabled);
593 582
594 const auto config7 = CreateConfigWithParameters({{"cbr", "0"}}); 583 config = CreateConfigWithParameters({{"usedtx", "1"}});
595 EXPECT_FALSE(config7.cbr_enabled); 584 EXPECT_TRUE(config.dtx_enabled);
596 585
597 const auto config8 = CreateConfigWithParameters({{"cbr", "1"}}); 586 config = CreateConfigWithParameters({{"cbr", "0"}});
598 EXPECT_TRUE(config8.cbr_enabled); 587 EXPECT_FALSE(config.cbr_enabled);
599 588
600 const auto config9 = 589 config = CreateConfigWithParameters({{"cbr", "1"}});
601 CreateConfigWithParameters({{"maxplaybackrate", "12345"}}); 590 EXPECT_TRUE(config.cbr_enabled);
602 EXPECT_EQ(12345, config9.max_playback_rate_hz);
603 591
604 const auto config10 = 592 config = CreateConfigWithParameters({{"maxplaybackrate", "12345"}});
605 CreateConfigWithParameters({{"maxaveragebitrate", "96000"}}); 593 EXPECT_EQ(12345, config.max_playback_rate_hz);
606 EXPECT_EQ(96000, config10.bitrate_bps);
607 594
608 const auto config11 = CreateConfigWithParameters({{"maxptime", "40"}}); 595 config = CreateConfigWithParameters({{"maxaveragebitrate", "96000"}});
609 for (int frame_length : config11.supported_frame_lengths_ms) { 596 EXPECT_EQ(96000, config.bitrate_bps);
597
598 config = CreateConfigWithParameters({{"maxptime", "40"}});
599 for (int frame_length : config.supported_frame_lengths_ms) {
610 EXPECT_LE(frame_length, 40); 600 EXPECT_LE(frame_length, 40);
611 } 601 }
612 602
613 const auto config12 = CreateConfigWithParameters({{"minptime", "40"}}); 603 config = CreateConfigWithParameters({{"minptime", "40"}});
614 for (int frame_length : config12.supported_frame_lengths_ms) { 604 for (int frame_length : config.supported_frame_lengths_ms) {
615 EXPECT_GE(frame_length, 40); 605 EXPECT_GE(frame_length, 40);
616 } 606 }
617 607
618 const auto config13 = CreateConfigWithParameters({{"ptime", "40"}}); 608 config = CreateConfigWithParameters({{"ptime", "40"}});
619 EXPECT_EQ(40, config13.frame_size_ms); 609 EXPECT_EQ(40, config.frame_size_ms);
620 610
621 constexpr int kMinSupportedFrameLength = 10; 611 constexpr int kMinSupportedFrameLength = 10;
622 constexpr int kMaxSupportedFrameLength = 612 constexpr int kMaxSupportedFrameLength =
623 WEBRTC_OPUS_SUPPORT_120MS_PTIME ? 120 : 60; 613 WEBRTC_OPUS_SUPPORT_120MS_PTIME ? 120 : 60;
624 614
625 const auto config14 = CreateConfigWithParameters({{"ptime", "1"}}); 615 config = CreateConfigWithParameters({{"ptime", "1"}});
626 EXPECT_EQ(kMinSupportedFrameLength, config14.frame_size_ms); 616 EXPECT_EQ(kMinSupportedFrameLength, config.frame_size_ms);
627 617
628 const auto config15 = CreateConfigWithParameters({{"ptime", "2000"}}); 618 config = CreateConfigWithParameters({{"ptime", "2000"}});
629 EXPECT_EQ(kMaxSupportedFrameLength, config15.frame_size_ms); 619 EXPECT_EQ(kMaxSupportedFrameLength, config.frame_size_ms);
630 } 620 }
631 621
632 TEST(AudioEncoderOpusTest, TestConfigFromInvalidParams) { 622 TEST(AudioEncoderOpusTest, TestConfigFromInvalidParams) {
633 const webrtc::SdpAudioFormat format("opus", 48000, 2); 623 const webrtc::SdpAudioFormat format("opus", 48000, 2);
634 const auto default_config = *AudioEncoderOpusImpl::SdpToConfig(format); 624 const AudioEncoderOpus::Config default_config =
625 AudioEncoderOpus::CreateConfig(0, format);
635 #if WEBRTC_OPUS_SUPPORT_120MS_PTIME 626 #if WEBRTC_OPUS_SUPPORT_120MS_PTIME
636 const std::vector<int> default_supported_frame_lengths_ms({20, 60, 120}); 627 const std::vector<int> default_supported_frame_lengths_ms({20, 60, 120});
637 #else 628 #else
638 const std::vector<int> default_supported_frame_lengths_ms({20, 60}); 629 const std::vector<int> default_supported_frame_lengths_ms({20, 60});
639 #endif 630 #endif
640 631
641 AudioEncoderOpusConfig config; 632 AudioEncoderOpus::Config config;
642 config = CreateConfigWithParameters({{"stereo", "invalid"}}); 633 config = CreateConfigWithParameters({{"stereo", "invalid"}});
643 EXPECT_EQ(default_config.num_channels, config.num_channels); 634 EXPECT_EQ(default_config.num_channels, config.num_channels);
644 635
645 config = CreateConfigWithParameters({{"useinbandfec", "invalid"}}); 636 config = CreateConfigWithParameters({{"useinbandfec", "invalid"}});
646 EXPECT_EQ(default_config.fec_enabled, config.fec_enabled); 637 EXPECT_EQ(default_config.fec_enabled, config.fec_enabled);
647 638
648 config = CreateConfigWithParameters({{"usedtx", "invalid"}}); 639 config = CreateConfigWithParameters({{"usedtx", "invalid"}});
649 EXPECT_EQ(default_config.dtx_enabled, config.dtx_enabled); 640 EXPECT_EQ(default_config.dtx_enabled, config.dtx_enabled);
650 641
651 config = CreateConfigWithParameters({{"cbr", "invalid"}}); 642 config = CreateConfigWithParameters({{"cbr", "invalid"}});
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
683 config = CreateConfigWithParameters({{"ptime", "invalid"}}); 674 config = CreateConfigWithParameters({{"ptime", "invalid"}});
684 EXPECT_EQ(default_supported_frame_lengths_ms, 675 EXPECT_EQ(default_supported_frame_lengths_ms,
685 config.supported_frame_lengths_ms); 676 config.supported_frame_lengths_ms);
686 } 677 }
687 678
688 // Test that bitrate will be overridden by the "maxaveragebitrate" parameter. 679 // Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
689 // Also test that the "maxaveragebitrate" can't be set to values outside the 680 // Also test that the "maxaveragebitrate" can't be set to values outside the
690 // range of 6000 and 510000 681 // range of 6000 and 510000
691 TEST(AudioEncoderOpusTest, SetSendCodecOpusMaxAverageBitrate) { 682 TEST(AudioEncoderOpusTest, SetSendCodecOpusMaxAverageBitrate) {
692 // Ignore if less than 6000. 683 // Ignore if less than 6000.
693 const auto config1 = AudioEncoderOpusImpl::SdpToConfig( 684 const AudioEncoderOpus::Config config1 = AudioEncoderOpus::CreateConfig(
694 {"opus", 48000, 2, {{"maxaveragebitrate", "5999"}}}); 685 0, {"opus", 48000, 2, {{"maxaveragebitrate", "5999"}}});
695 EXPECT_EQ(6000, config1->bitrate_bps); 686 EXPECT_EQ(6000, config1.bitrate_bps);
696 687
697 // Ignore if larger than 510000. 688 // Ignore if larger than 510000.
698 const auto config2 = AudioEncoderOpusImpl::SdpToConfig( 689 const AudioEncoderOpus::Config config2 = AudioEncoderOpus::CreateConfig(
699 {"opus", 48000, 2, {{"maxaveragebitrate", "510001"}}}); 690 0, {"opus", 48000, 2, {{"maxaveragebitrate", "510001"}}});
700 EXPECT_EQ(510000, config2->bitrate_bps); 691 EXPECT_EQ(510000, config2.bitrate_bps);
701 692
702 const auto config3 = AudioEncoderOpusImpl::SdpToConfig( 693 const AudioEncoderOpus::Config config3 = AudioEncoderOpus::CreateConfig(
703 {"opus", 48000, 2, {{"maxaveragebitrate", "200000"}}}); 694 0, {"opus", 48000, 2, {{"maxaveragebitrate", "200000"}}});
704 EXPECT_EQ(200000, config3->bitrate_bps); 695 EXPECT_EQ(200000, config3.bitrate_bps);
705 } 696 }
706 697
707 // Test maxplaybackrate <= 8000 triggers Opus narrow band mode. 698 // Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
708 TEST(AudioEncoderOpusTest, SetMaxPlaybackRateNb) { 699 TEST(AudioEncoderOpusTest, SetMaxPlaybackRateNb) {
709 auto config = CreateConfigWithParameters({{"maxplaybackrate", "8000"}}); 700 auto config = CreateConfigWithParameters({{"maxplaybackrate", "8000"}});
710 EXPECT_EQ(8000, config.max_playback_rate_hz); 701 EXPECT_EQ(8000, config.max_playback_rate_hz);
711 EXPECT_EQ(12000, config.bitrate_bps); 702 EXPECT_EQ(12000, config.bitrate_bps);
712 703
713 config = CreateConfigWithParameters({{"maxplaybackrate", "8000"}, 704 config = CreateConfigWithParameters({{"maxplaybackrate", "8000"},
714 {"stereo", "1"}}); 705 {"stereo", "1"}});
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
758 EXPECT_EQ(24001, config.max_playback_rate_hz); 749 EXPECT_EQ(24001, config.max_playback_rate_hz);
759 EXPECT_EQ(32000, config.bitrate_bps); 750 EXPECT_EQ(32000, config.bitrate_bps);
760 751
761 config = CreateConfigWithParameters({{"maxplaybackrate", "24001"}, 752 config = CreateConfigWithParameters({{"maxplaybackrate", "24001"},
762 {"stereo", "1"}}); 753 {"stereo", "1"}});
763 EXPECT_EQ(24001, config.max_playback_rate_hz); 754 EXPECT_EQ(24001, config.max_playback_rate_hz);
764 EXPECT_EQ(64000, config.bitrate_bps); 755 EXPECT_EQ(64000, config.bitrate_bps);
765 } 756 }
766 757
767 } // namespace webrtc 758 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698