| 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 #include <functional> | 10 #include <functional> |
| 11 #include <list> | 11 #include <list> |
| 12 #include <memory> | 12 #include <memory> |
| 13 #include <string> | 13 #include <string> |
| 14 | 14 |
| 15 #include "webrtc/api/call/audio_state.h" | |
| 16 #include "webrtc/base/checks.h" | 15 #include "webrtc/base/checks.h" |
| 17 #include "webrtc/base/event.h" | 16 #include "webrtc/base/event.h" |
| 18 #include "webrtc/base/logging.h" | 17 #include "webrtc/base/logging.h" |
| 19 #include "webrtc/base/thread_annotations.h" | 18 #include "webrtc/base/thread_annotations.h" |
| 20 #include "webrtc/call.h" | 19 #include "webrtc/call.h" |
| 21 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" | 20 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
| 22 #include "webrtc/system_wrappers/include/trace.h" | 21 #include "webrtc/system_wrappers/include/trace.h" |
| 23 #include "webrtc/test/call_test.h" | 22 #include "webrtc/test/call_test.h" |
| 24 #include "webrtc/test/direct_transport.h" | 23 #include "webrtc/test/direct_transport.h" |
| 25 #include "webrtc/test/encoder_settings.h" | 24 #include "webrtc/test/encoder_settings.h" |
| 26 #include "webrtc/test/fake_decoder.h" | 25 #include "webrtc/test/fake_decoder.h" |
| 27 #include "webrtc/test/fake_encoder.h" | 26 #include "webrtc/test/fake_encoder.h" |
| 28 #include "webrtc/test/frame_generator_capturer.h" | 27 #include "webrtc/test/frame_generator_capturer.h" |
| 29 #include "webrtc/test/gtest.h" | 28 #include "webrtc/test/gtest.h" |
| 30 #include "webrtc/test/mock_voice_engine.h" | |
| 31 | 29 |
| 32 namespace webrtc { | 30 namespace webrtc { |
| 33 namespace { | 31 namespace { |
| 34 // Note: If you consider to re-use this class, think twice and instead consider | 32 // Note: If you consider to re-use this class, think twice and instead consider |
| 35 // writing tests that don't depend on the logging system. | 33 // writing tests that don't depend on the logging system. |
| 36 class LogObserver { | 34 class LogObserver { |
| 37 public: | 35 public: |
| 38 LogObserver() { rtc::LogMessage::AddLogToStream(&callback_, rtc::LS_INFO); } | 36 LogObserver() { rtc::LogMessage::AddLogToStream(&callback_, rtc::LS_INFO); } |
| 39 | 37 |
| 40 ~LogObserver() { rtc::LogMessage::RemoveLogToStream(&callback_); } | 38 ~LogObserver() { rtc::LogMessage::RemoveLogToStream(&callback_); } |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 | 92 |
| 95 Callback callback_; | 93 Callback callback_; |
| 96 }; | 94 }; |
| 97 } // namespace | 95 } // namespace |
| 98 | 96 |
| 99 static const int kTOFExtensionId = 4; | 97 static const int kTOFExtensionId = 4; |
| 100 static const int kASTExtensionId = 5; | 98 static const int kASTExtensionId = 5; |
| 101 | 99 |
| 102 class BitrateEstimatorTest : public test::CallTest { | 100 class BitrateEstimatorTest : public test::CallTest { |
| 103 public: | 101 public: |
| 104 BitrateEstimatorTest() : mock_voice_engine_(decoder_factory_), | 102 BitrateEstimatorTest() : receive_config_(nullptr) {} |
| 105 receive_config_(nullptr) {} | |
| 106 | 103 |
| 107 virtual ~BitrateEstimatorTest() { EXPECT_TRUE(streams_.empty()); } | 104 virtual ~BitrateEstimatorTest() { EXPECT_TRUE(streams_.empty()); } |
| 108 | 105 |
| 109 virtual void SetUp() { | 106 virtual void SetUp() { |
| 110 AudioState::Config audio_state_config; | |
| 111 audio_state_config.voice_engine = &mock_voice_engine_; | |
| 112 Call::Config config(&event_log_); | 107 Call::Config config(&event_log_); |
| 113 config.audio_state = AudioState::Create(audio_state_config); | |
| 114 receiver_call_.reset(Call::Create(config)); | 108 receiver_call_.reset(Call::Create(config)); |
| 115 sender_call_.reset(Call::Create(config)); | 109 sender_call_.reset(Call::Create(config)); |
| 116 | 110 |
| 117 send_transport_.reset(new test::DirectTransport(sender_call_.get())); | 111 send_transport_.reset(new test::DirectTransport(sender_call_.get())); |
| 118 send_transport_->SetReceiver(receiver_call_->Receiver()); | 112 send_transport_->SetReceiver(receiver_call_->Receiver()); |
| 119 receive_transport_.reset(new test::DirectTransport(receiver_call_.get())); | 113 receive_transport_.reset(new test::DirectTransport(receiver_call_.get())); |
| 120 receive_transport_->SetReceiver(sender_call_->Receiver()); | 114 receive_transport_->SetReceiver(sender_call_->Receiver()); |
| 121 | 115 |
| 122 video_send_config_ = VideoSendStream::Config(send_transport_.get()); | 116 video_send_config_ = VideoSendStream::Config(send_transport_.get()); |
| 123 video_send_config_.rtp.ssrcs.push_back(kVideoSendSsrcs[0]); | 117 video_send_config_.rtp.ssrcs.push_back(kVideoSendSsrcs[0]); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 153 | 147 |
| 154 receiver_call_.reset(); | 148 receiver_call_.reset(); |
| 155 sender_call_.reset(); | 149 sender_call_.reset(); |
| 156 } | 150 } |
| 157 | 151 |
| 158 protected: | 152 protected: |
| 159 friend class Stream; | 153 friend class Stream; |
| 160 | 154 |
| 161 class Stream { | 155 class Stream { |
| 162 public: | 156 public: |
| 163 Stream(BitrateEstimatorTest* test, bool receive_audio) | 157 explicit Stream(BitrateEstimatorTest* test) |
| 164 : test_(test), | 158 : test_(test), |
| 165 is_sending_receiving_(false), | 159 is_sending_receiving_(false), |
| 166 send_stream_(nullptr), | 160 send_stream_(nullptr), |
| 167 audio_receive_stream_(nullptr), | |
| 168 video_receive_stream_(nullptr), | |
| 169 frame_generator_capturer_(), | 161 frame_generator_capturer_(), |
| 170 fake_encoder_(Clock::GetRealTimeClock()), | 162 fake_encoder_(Clock::GetRealTimeClock()), |
| 171 fake_decoder_() { | 163 fake_decoder_() { |
| 172 test_->video_send_config_.rtp.ssrcs[0]++; | 164 test_->video_send_config_.rtp.ssrcs[0]++; |
| 173 test_->video_send_config_.encoder_settings.encoder = &fake_encoder_; | 165 test_->video_send_config_.encoder_settings.encoder = &fake_encoder_; |
| 174 send_stream_ = test_->sender_call_->CreateVideoSendStream( | 166 send_stream_ = test_->sender_call_->CreateVideoSendStream( |
| 175 test_->video_send_config_.Copy(), | 167 test_->video_send_config_.Copy(), |
| 176 test_->video_encoder_config_.Copy()); | 168 test_->video_encoder_config_.Copy()); |
| 177 RTC_DCHECK_EQ(1u, test_->video_encoder_config_.number_of_streams); | 169 RTC_DCHECK_EQ(1u, test_->video_encoder_config_.number_of_streams); |
| 178 frame_generator_capturer_.reset(test::FrameGeneratorCapturer::Create( | 170 frame_generator_capturer_.reset(test::FrameGeneratorCapturer::Create( |
| 179 kDefaultWidth, kDefaultHeight, kDefaultFramerate, | 171 kDefaultWidth, kDefaultHeight, kDefaultFramerate, |
| 180 Clock::GetRealTimeClock())); | 172 Clock::GetRealTimeClock())); |
| 181 send_stream_->SetSource( | 173 send_stream_->SetSource( |
| 182 frame_generator_capturer_.get(), | 174 frame_generator_capturer_.get(), |
| 183 VideoSendStream::DegradationPreference::kBalanced); | 175 VideoSendStream::DegradationPreference::kBalanced); |
| 184 send_stream_->Start(); | 176 send_stream_->Start(); |
| 185 frame_generator_capturer_->Start(); | 177 frame_generator_capturer_->Start(); |
| 186 | 178 |
| 187 if (receive_audio) { | 179 VideoReceiveStream::Decoder decoder; |
| 188 AudioReceiveStream::Config receive_config; | 180 decoder.decoder = &fake_decoder_; |
| 189 receive_config.rtp.remote_ssrc = test_->video_send_config_.rtp.ssrcs[0]; | 181 decoder.payload_type = |
| 190 // Bogus non-default id to prevent hitting a RTC_DCHECK when creating | 182 test_->video_send_config_.encoder_settings.payload_type; |
| 191 // the AudioReceiveStream. Every receive stream has to correspond to | 183 decoder.payload_name = |
| 192 // an underlying channel id. | 184 test_->video_send_config_.encoder_settings.payload_name; |
| 193 receive_config.voe_channel_id = 0; | 185 test_->receive_config_.decoders.clear(); |
| 194 receive_config.rtp.extensions.push_back( | 186 test_->receive_config_.decoders.push_back(decoder); |
| 195 RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId)); | 187 test_->receive_config_.rtp.remote_ssrc = |
| 196 receive_config.decoder_factory = test_->decoder_factory_; | 188 test_->video_send_config_.rtp.ssrcs[0]; |
| 197 audio_receive_stream_ = | 189 test_->receive_config_.rtp.local_ssrc++; |
| 198 test_->receiver_call_->CreateAudioReceiveStream(receive_config); | 190 test_->receive_config_.renderer = &test->fake_renderer_; |
| 199 } else { | 191 video_receive_stream_ = test_->receiver_call_->CreateVideoReceiveStream( |
| 200 VideoReceiveStream::Decoder decoder; | 192 test_->receive_config_.Copy()); |
| 201 decoder.decoder = &fake_decoder_; | 193 video_receive_stream_->Start(); |
| 202 decoder.payload_type = | |
| 203 test_->video_send_config_.encoder_settings.payload_type; | |
| 204 decoder.payload_name = | |
| 205 test_->video_send_config_.encoder_settings.payload_name; | |
| 206 test_->receive_config_.decoders.clear(); | |
| 207 test_->receive_config_.decoders.push_back(decoder); | |
| 208 test_->receive_config_.rtp.remote_ssrc = | |
| 209 test_->video_send_config_.rtp.ssrcs[0]; | |
| 210 test_->receive_config_.rtp.local_ssrc++; | |
| 211 test_->receive_config_.renderer = &test->fake_renderer_; | |
| 212 video_receive_stream_ = test_->receiver_call_->CreateVideoReceiveStream( | |
| 213 test_->receive_config_.Copy()); | |
| 214 video_receive_stream_->Start(); | |
| 215 } | |
| 216 is_sending_receiving_ = true; | 194 is_sending_receiving_ = true; |
| 217 } | 195 } |
| 218 | 196 |
| 219 ~Stream() { | 197 ~Stream() { |
| 220 EXPECT_FALSE(is_sending_receiving_); | 198 EXPECT_FALSE(is_sending_receiving_); |
| 221 test_->sender_call_->DestroyVideoSendStream(send_stream_); | 199 test_->sender_call_->DestroyVideoSendStream(send_stream_); |
| 222 frame_generator_capturer_.reset(nullptr); | 200 frame_generator_capturer_.reset(nullptr); |
| 223 send_stream_ = nullptr; | 201 send_stream_ = nullptr; |
| 224 if (audio_receive_stream_) { | |
| 225 test_->receiver_call_->DestroyAudioReceiveStream(audio_receive_stream_); | |
| 226 audio_receive_stream_ = nullptr; | |
| 227 } | |
| 228 if (video_receive_stream_) { | 202 if (video_receive_stream_) { |
| 229 test_->receiver_call_->DestroyVideoReceiveStream(video_receive_stream_); | 203 test_->receiver_call_->DestroyVideoReceiveStream(video_receive_stream_); |
| 230 video_receive_stream_ = nullptr; | 204 video_receive_stream_ = nullptr; |
| 231 } | 205 } |
| 232 } | 206 } |
| 233 | 207 |
| 234 void StopSending() { | 208 void StopSending() { |
| 235 if (is_sending_receiving_) { | 209 if (is_sending_receiving_) { |
| 236 frame_generator_capturer_->Stop(); | 210 frame_generator_capturer_->Stop(); |
| 237 send_stream_->Stop(); | 211 send_stream_->Stop(); |
| 238 if (video_receive_stream_) { | 212 if (video_receive_stream_) { |
| 239 video_receive_stream_->Stop(); | 213 video_receive_stream_->Stop(); |
| 240 } | 214 } |
| 241 is_sending_receiving_ = false; | 215 is_sending_receiving_ = false; |
| 242 } | 216 } |
| 243 } | 217 } |
| 244 | 218 |
| 245 private: | 219 private: |
| 246 BitrateEstimatorTest* test_; | 220 BitrateEstimatorTest* test_; |
| 247 bool is_sending_receiving_; | 221 bool is_sending_receiving_; |
| 248 VideoSendStream* send_stream_; | 222 VideoSendStream* send_stream_; |
| 249 AudioReceiveStream* audio_receive_stream_; | |
| 250 VideoReceiveStream* video_receive_stream_; | 223 VideoReceiveStream* video_receive_stream_; |
| 251 std::unique_ptr<test::FrameGeneratorCapturer> frame_generator_capturer_; | 224 std::unique_ptr<test::FrameGeneratorCapturer> frame_generator_capturer_; |
| 252 test::FakeEncoder fake_encoder_; | 225 test::FakeEncoder fake_encoder_; |
| 253 test::FakeDecoder fake_decoder_; | 226 test::FakeDecoder fake_decoder_; |
| 254 }; | 227 }; |
| 255 | 228 |
| 256 testing::NiceMock<test::MockVoiceEngine> mock_voice_engine_; | |
| 257 LogObserver receiver_log_; | 229 LogObserver receiver_log_; |
| 258 std::unique_ptr<test::DirectTransport> send_transport_; | 230 std::unique_ptr<test::DirectTransport> send_transport_; |
| 259 std::unique_ptr<test::DirectTransport> receive_transport_; | 231 std::unique_ptr<test::DirectTransport> receive_transport_; |
| 260 std::unique_ptr<Call> sender_call_; | 232 std::unique_ptr<Call> sender_call_; |
| 261 std::unique_ptr<Call> receiver_call_; | 233 std::unique_ptr<Call> receiver_call_; |
| 262 VideoReceiveStream::Config receive_config_; | 234 VideoReceiveStream::Config receive_config_; |
| 263 std::vector<Stream*> streams_; | 235 std::vector<Stream*> streams_; |
| 264 }; | 236 }; |
| 265 | 237 |
| 266 static const char* kAbsSendTimeLog = | 238 static const char* kAbsSendTimeLog = |
| 267 "RemoteBitrateEstimatorAbsSendTime: Instantiating."; | 239 "RemoteBitrateEstimatorAbsSendTime: Instantiating."; |
| 268 static const char* kSingleStreamLog = | 240 static const char* kSingleStreamLog = |
| 269 "RemoteBitrateEstimatorSingleStream: Instantiating."; | 241 "RemoteBitrateEstimatorSingleStream: Instantiating."; |
| 270 | 242 |
| 271 TEST_F(BitrateEstimatorTest, InstantiatesTOFPerDefaultForVideo) { | 243 TEST_F(BitrateEstimatorTest, InstantiatesTOFPerDefaultForVideo) { |
| 272 video_send_config_.rtp.extensions.push_back( | 244 video_send_config_.rtp.extensions.push_back( |
| 273 RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId)); | 245 RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId)); |
| 274 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 246 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 275 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 247 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 276 streams_.push_back(new Stream(this, false)); | 248 streams_.push_back(new Stream(this)); |
| 277 EXPECT_TRUE(receiver_log_.Wait()); | 249 EXPECT_TRUE(receiver_log_.Wait()); |
| 278 } | 250 } |
| 279 | 251 |
| 280 TEST_F(BitrateEstimatorTest, ImmediatelySwitchToASTForVideo) { | 252 TEST_F(BitrateEstimatorTest, ImmediatelySwitchToASTForVideo) { |
| 281 video_send_config_.rtp.extensions.push_back( | 253 video_send_config_.rtp.extensions.push_back( |
| 282 RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId)); | 254 RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId)); |
| 283 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 255 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 284 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 256 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 285 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); | 257 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); |
| 286 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); | 258 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); |
| 287 streams_.push_back(new Stream(this, false)); | 259 streams_.push_back(new Stream(this)); |
| 288 EXPECT_TRUE(receiver_log_.Wait()); | 260 EXPECT_TRUE(receiver_log_.Wait()); |
| 289 } | 261 } |
| 290 | 262 |
| 291 TEST_F(BitrateEstimatorTest, SwitchesToASTForVideo) { | 263 TEST_F(BitrateEstimatorTest, SwitchesToASTForVideo) { |
| 292 video_send_config_.rtp.extensions.push_back( | 264 video_send_config_.rtp.extensions.push_back( |
| 293 RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId)); | 265 RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId)); |
| 294 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 266 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 295 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 267 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 296 streams_.push_back(new Stream(this, false)); | 268 streams_.push_back(new Stream(this)); |
| 297 EXPECT_TRUE(receiver_log_.Wait()); | 269 EXPECT_TRUE(receiver_log_.Wait()); |
| 298 | 270 |
| 299 video_send_config_.rtp.extensions[0] = | 271 video_send_config_.rtp.extensions[0] = |
| 300 RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId); | 272 RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId); |
| 301 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); | 273 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); |
| 302 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); | 274 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); |
| 303 streams_.push_back(new Stream(this, false)); | 275 streams_.push_back(new Stream(this)); |
| 304 EXPECT_TRUE(receiver_log_.Wait()); | 276 EXPECT_TRUE(receiver_log_.Wait()); |
| 305 } | 277 } |
| 306 | 278 |
| 307 // This test is flaky. See webrtc:5790. | 279 // This test is flaky. See webrtc:5790. |
| 308 TEST_F(BitrateEstimatorTest, DISABLED_SwitchesToASTThenBackToTOFForVideo) { | 280 TEST_F(BitrateEstimatorTest, DISABLED_SwitchesToASTThenBackToTOFForVideo) { |
| 309 video_send_config_.rtp.extensions.push_back( | 281 video_send_config_.rtp.extensions.push_back( |
| 310 RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId)); | 282 RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId)); |
| 311 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 283 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 312 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); | 284 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); |
| 313 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 285 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 314 streams_.push_back(new Stream(this, false)); | 286 streams_.push_back(new Stream(this)); |
| 315 EXPECT_TRUE(receiver_log_.Wait()); | 287 EXPECT_TRUE(receiver_log_.Wait()); |
| 316 | 288 |
| 317 video_send_config_.rtp.extensions[0] = | 289 video_send_config_.rtp.extensions[0] = |
| 318 RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId); | 290 RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId); |
| 319 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); | 291 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); |
| 320 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); | 292 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); |
| 321 streams_.push_back(new Stream(this, false)); | 293 streams_.push_back(new Stream(this)); |
| 322 EXPECT_TRUE(receiver_log_.Wait()); | 294 EXPECT_TRUE(receiver_log_.Wait()); |
| 323 | 295 |
| 324 video_send_config_.rtp.extensions[0] = | 296 video_send_config_.rtp.extensions[0] = |
| 325 RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId); | 297 RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId); |
| 326 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); | 298 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); |
| 327 receiver_log_.PushExpectedLogLine( | 299 receiver_log_.PushExpectedLogLine( |
| 328 "WrappingBitrateEstimator: Switching to transmission time offset RBE."); | 300 "WrappingBitrateEstimator: Switching to transmission time offset RBE."); |
| 329 streams_.push_back(new Stream(this, false)); | 301 streams_.push_back(new Stream(this)); |
| 330 streams_[0]->StopSending(); | 302 streams_[0]->StopSending(); |
| 331 streams_[1]->StopSending(); | 303 streams_[1]->StopSending(); |
| 332 EXPECT_TRUE(receiver_log_.Wait()); | 304 EXPECT_TRUE(receiver_log_.Wait()); |
| 333 } | 305 } |
| 334 } // namespace webrtc | 306 } // namespace webrtc |
| OLD | NEW |