OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include <algorithm> | 11 #include <algorithm> |
12 #include <limits> | 12 #include <limits> |
13 #include <memory> | 13 #include <memory> |
14 #include <string> | 14 #include <string> |
15 | 15 |
16 #include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h" | 16 #include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h" |
17 #include "webrtc/call/call.h" | 17 #include "webrtc/call/call.h" |
18 #include "webrtc/config.h" | 18 #include "webrtc/config.h" |
19 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" | 19 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" |
20 #include "webrtc/modules/audio_coding/include/audio_coding_module.h" | 20 #include "webrtc/modules/audio_coding/include/audio_coding_module.h" |
21 #include "webrtc/modules/audio_mixer/audio_mixer_impl.h" | 21 #include "webrtc/modules/audio_mixer/audio_mixer_impl.h" |
22 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" | 22 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" |
23 #include "webrtc/rtc_base/checks.h" | 23 #include "webrtc/rtc_base/checks.h" |
24 #include "webrtc/rtc_base/constructormagic.h" | 24 #include "webrtc/rtc_base/ptr_util.h" |
25 #include "webrtc/rtc_base/thread_annotations.h" | 25 #include "webrtc/rtc_base/thread_annotations.h" |
26 #include "webrtc/system_wrappers/include/metrics_default.h" | 26 #include "webrtc/system_wrappers/include/metrics_default.h" |
27 #include "webrtc/test/call_test.h" | 27 #include "webrtc/test/call_test.h" |
28 #include "webrtc/test/direct_transport.h" | 28 #include "webrtc/test/direct_transport.h" |
29 #include "webrtc/test/drifting_clock.h" | 29 #include "webrtc/test/drifting_clock.h" |
30 #include "webrtc/test/encoder_settings.h" | 30 #include "webrtc/test/encoder_settings.h" |
31 #include "webrtc/test/fake_audio_device.h" | 31 #include "webrtc/test/fake_audio_device.h" |
32 #include "webrtc/test/fake_encoder.h" | 32 #include "webrtc/test/fake_encoder.h" |
33 #include "webrtc/test/field_trial.h" | 33 #include "webrtc/test/field_trial.h" |
34 #include "webrtc/test/frame_generator.h" | 34 #include "webrtc/test/frame_generator.h" |
35 #include "webrtc/test/frame_generator_capturer.h" | 35 #include "webrtc/test/frame_generator_capturer.h" |
36 #include "webrtc/test/gtest.h" | 36 #include "webrtc/test/gtest.h" |
37 #include "webrtc/test/rtp_rtcp_observer.h" | 37 #include "webrtc/test/rtp_rtcp_observer.h" |
| 38 #include "webrtc/test/single_threaded_task_queue.h" |
38 #include "webrtc/test/testsupport/fileutils.h" | 39 #include "webrtc/test/testsupport/fileutils.h" |
39 #include "webrtc/test/testsupport/perf_test.h" | 40 #include "webrtc/test/testsupport/perf_test.h" |
40 #include "webrtc/video/transport_adapter.h" | 41 #include "webrtc/video/transport_adapter.h" |
41 #include "webrtc/voice_engine/include/voe_base.h" | 42 #include "webrtc/voice_engine/include/voe_base.h" |
42 | 43 |
43 using webrtc::test::DriftingClock; | 44 using webrtc::test::DriftingClock; |
44 using webrtc::test::FakeAudioDevice; | 45 using webrtc::test::FakeAudioDevice; |
45 | 46 |
46 namespace webrtc { | 47 namespace webrtc { |
47 | 48 |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 | 137 |
137 void CallPerfTest::TestAudioVideoSync(FecMode fec, | 138 void CallPerfTest::TestAudioVideoSync(FecMode fec, |
138 CreateOrder create_first, | 139 CreateOrder create_first, |
139 float video_ntp_speed, | 140 float video_ntp_speed, |
140 float video_rtp_speed, | 141 float video_rtp_speed, |
141 float audio_rtp_speed) { | 142 float audio_rtp_speed) { |
142 const char* kSyncGroup = "av_sync"; | 143 const char* kSyncGroup = "av_sync"; |
143 const uint32_t kAudioSendSsrc = 1234; | 144 const uint32_t kAudioSendSsrc = 1234; |
144 const uint32_t kAudioRecvSsrc = 5678; | 145 const uint32_t kAudioRecvSsrc = 5678; |
145 | 146 |
146 metrics::Reset(); | 147 int send_channel_id; |
147 rtc::scoped_refptr<AudioProcessing> audio_processing = | 148 int recv_channel_id; |
148 AudioProcessing::Create(); | |
149 VoiceEngine* voice_engine = VoiceEngine::Create(); | |
150 VoEBase* voe_base = VoEBase::GetInterface(voice_engine); | |
151 FakeAudioDevice fake_audio_device( | |
152 FakeAudioDevice::CreatePulsedNoiseCapturer(256, 48000), | |
153 FakeAudioDevice::CreateDiscardRenderer(48000), audio_rtp_speed); | |
154 EXPECT_EQ(0, voe_base->Init(&fake_audio_device, audio_processing.get(), | |
155 decoder_factory_)); | |
156 VoEBase::ChannelConfig config; | |
157 config.enable_voice_pacing = true; | |
158 int send_channel_id = voe_base->CreateChannel(config); | |
159 int recv_channel_id = voe_base->CreateChannel(); | |
160 | |
161 AudioState::Config send_audio_state_config; | |
162 send_audio_state_config.voice_engine = voice_engine; | |
163 send_audio_state_config.audio_mixer = AudioMixerImpl::Create(); | |
164 send_audio_state_config.audio_processing = audio_processing; | |
165 Call::Config sender_config(event_log_.get()); | |
166 | |
167 sender_config.audio_state = AudioState::Create(send_audio_state_config); | |
168 Call::Config receiver_config(event_log_.get()); | |
169 receiver_config.audio_state = sender_config.audio_state; | |
170 CreateCalls(sender_config, receiver_config); | |
171 | |
172 | |
173 VideoRtcpAndSyncObserver observer(Clock::GetRealTimeClock()); | |
174 | 149 |
175 FakeNetworkPipe::Config audio_net_config; | 150 FakeNetworkPipe::Config audio_net_config; |
176 audio_net_config.queue_delay_ms = 500; | 151 audio_net_config.queue_delay_ms = 500; |
177 audio_net_config.loss_percent = 5; | 152 audio_net_config.loss_percent = 5; |
178 | 153 |
| 154 rtc::scoped_refptr<AudioProcessing> audio_processing; |
| 155 VoiceEngine* voice_engine; |
| 156 VoEBase* voe_base; |
| 157 std::unique_ptr<FakeAudioDevice> fake_audio_device; |
| 158 VideoRtcpAndSyncObserver observer(Clock::GetRealTimeClock()); |
| 159 |
179 std::map<uint8_t, MediaType> audio_pt_map; | 160 std::map<uint8_t, MediaType> audio_pt_map; |
180 std::map<uint8_t, MediaType> video_pt_map; | 161 std::map<uint8_t, MediaType> video_pt_map; |
181 std::copy_if(std::begin(payload_type_map_), std::end(payload_type_map_), | |
182 std::inserter(audio_pt_map, audio_pt_map.end()), | |
183 [](const std::pair<const uint8_t, MediaType>& pair) { | |
184 return pair.second == MediaType::AUDIO; | |
185 }); | |
186 std::copy_if(std::begin(payload_type_map_), std::end(payload_type_map_), | |
187 std::inserter(video_pt_map, video_pt_map.end()), | |
188 [](const std::pair<const uint8_t, MediaType>& pair) { | |
189 return pair.second == MediaType::VIDEO; | |
190 }); | |
191 | 162 |
192 test::PacketTransport audio_send_transport(sender_call_.get(), &observer, | 163 std::unique_ptr<test::PacketTransport> audio_send_transport; |
193 test::PacketTransport::kSender, | 164 std::unique_ptr<test::PacketTransport> video_send_transport; |
194 audio_pt_map, audio_net_config); | 165 std::unique_ptr<test::PacketTransport> receive_transport; |
195 audio_send_transport.SetReceiver(receiver_call_->Receiver()); | |
196 | 166 |
197 test::PacketTransport video_send_transport( | 167 AudioSendStream* audio_send_stream; |
198 sender_call_.get(), &observer, test::PacketTransport::kSender, | 168 AudioReceiveStream* audio_receive_stream; |
199 video_pt_map, FakeNetworkPipe::Config()); | 169 std::unique_ptr<DriftingClock> drifting_clock; |
200 video_send_transport.SetReceiver(receiver_call_->Receiver()); | |
201 | 170 |
202 test::PacketTransport receive_transport( | 171 task_queue_.SendTask([&]() { |
203 receiver_call_.get(), &observer, test::PacketTransport::kReceiver, | 172 metrics::Reset(); |
204 payload_type_map_, FakeNetworkPipe::Config()); | 173 audio_processing = AudioProcessing::Create(); |
205 receive_transport.SetReceiver(sender_call_->Receiver()); | 174 voice_engine = VoiceEngine::Create(); |
| 175 voe_base = VoEBase::GetInterface(voice_engine); |
| 176 fake_audio_device = rtc::MakeUnique<FakeAudioDevice>( |
| 177 FakeAudioDevice::CreatePulsedNoiseCapturer(256, 48000), |
| 178 FakeAudioDevice::CreateDiscardRenderer(48000), audio_rtp_speed); |
| 179 EXPECT_EQ(0, voe_base->Init(fake_audio_device.get(), audio_processing.get(), |
| 180 decoder_factory_)); |
| 181 VoEBase::ChannelConfig config; |
| 182 config.enable_voice_pacing = true; |
| 183 send_channel_id = voe_base->CreateChannel(config); |
| 184 recv_channel_id = voe_base->CreateChannel(); |
206 | 185 |
207 CreateSendConfig(1, 0, 0, &video_send_transport); | 186 AudioState::Config send_audio_state_config; |
208 CreateMatchingReceiveConfigs(&receive_transport); | 187 send_audio_state_config.voice_engine = voice_engine; |
| 188 send_audio_state_config.audio_mixer = AudioMixerImpl::Create(); |
| 189 send_audio_state_config.audio_processing = audio_processing; |
| 190 Call::Config sender_config(event_log_.get()); |
209 | 191 |
210 AudioSendStream::Config audio_send_config(&audio_send_transport); | 192 sender_config.audio_state = AudioState::Create(send_audio_state_config); |
211 audio_send_config.voe_channel_id = send_channel_id; | 193 Call::Config receiver_config(event_log_.get()); |
212 audio_send_config.rtp.ssrc = kAudioSendSsrc; | 194 receiver_config.audio_state = sender_config.audio_state; |
213 audio_send_config.send_codec_spec = | 195 CreateCalls(sender_config, receiver_config); |
214 rtc::Optional<AudioSendStream::Config::SendCodecSpec>( | |
215 {kAudioSendPayloadType, {"ISAC", 16000, 1}}); | |
216 audio_send_config.encoder_factory = CreateBuiltinAudioEncoderFactory(); | |
217 AudioSendStream* audio_send_stream = | |
218 sender_call_->CreateAudioSendStream(audio_send_config); | |
219 | 196 |
220 video_send_config_.rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 197 std::copy_if(std::begin(payload_type_map_), std::end(payload_type_map_), |
221 if (fec == FecMode::kOn) { | 198 std::inserter(audio_pt_map, audio_pt_map.end()), |
222 video_send_config_.rtp.ulpfec.red_payload_type = kRedPayloadType; | 199 [](const std::pair<const uint8_t, MediaType>& pair) { |
223 video_send_config_.rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; | 200 return pair.second == MediaType::AUDIO; |
224 video_receive_configs_[0].rtp.ulpfec.red_payload_type = kRedPayloadType; | 201 }); |
225 video_receive_configs_[0].rtp.ulpfec.ulpfec_payload_type = | 202 std::copy_if(std::begin(payload_type_map_), std::end(payload_type_map_), |
226 kUlpfecPayloadType; | 203 std::inserter(video_pt_map, video_pt_map.end()), |
227 } | 204 [](const std::pair<const uint8_t, MediaType>& pair) { |
228 video_receive_configs_[0].rtp.nack.rtp_history_ms = 1000; | 205 return pair.second == MediaType::VIDEO; |
229 video_receive_configs_[0].renderer = &observer; | 206 }); |
230 video_receive_configs_[0].sync_group = kSyncGroup; | |
231 | 207 |
232 AudioReceiveStream::Config audio_recv_config; | 208 audio_send_transport = rtc::MakeUnique<test::PacketTransport>( |
233 audio_recv_config.rtp.remote_ssrc = kAudioSendSsrc; | 209 &task_queue_, sender_call_.get(), &observer, |
234 audio_recv_config.rtp.local_ssrc = kAudioRecvSsrc; | 210 test::PacketTransport::kSender, audio_pt_map, audio_net_config); |
235 audio_recv_config.voe_channel_id = recv_channel_id; | 211 audio_send_transport->SetReceiver(receiver_call_->Receiver()); |
236 audio_recv_config.sync_group = kSyncGroup; | |
237 audio_recv_config.decoder_factory = decoder_factory_; | |
238 audio_recv_config.decoder_map = {{kAudioSendPayloadType, {"ISAC", 16000, 1}}}; | |
239 | 212 |
240 AudioReceiveStream* audio_receive_stream; | 213 video_send_transport = rtc::MakeUnique<test::PacketTransport>( |
| 214 &task_queue_, sender_call_.get(), &observer, |
| 215 test::PacketTransport::kSender, video_pt_map, |
| 216 FakeNetworkPipe::Config()); |
| 217 video_send_transport->SetReceiver(receiver_call_->Receiver()); |
241 | 218 |
242 if (create_first == CreateOrder::kAudioFirst) { | 219 receive_transport = rtc::MakeUnique<test::PacketTransport>( |
243 audio_receive_stream = | 220 &task_queue_, receiver_call_.get(), &observer, |
244 receiver_call_->CreateAudioReceiveStream(audio_recv_config); | 221 test::PacketTransport::kReceiver, payload_type_map_, |
245 CreateVideoStreams(); | 222 FakeNetworkPipe::Config()); |
246 } else { | 223 receive_transport->SetReceiver(sender_call_->Receiver()); |
247 CreateVideoStreams(); | |
248 audio_receive_stream = | |
249 receiver_call_->CreateAudioReceiveStream(audio_recv_config); | |
250 } | |
251 EXPECT_EQ(1u, video_receive_streams_.size()); | |
252 observer.set_receive_stream(video_receive_streams_[0]); | |
253 DriftingClock drifting_clock(clock_, video_ntp_speed); | |
254 CreateFrameGeneratorCapturerWithDrift(&drifting_clock, video_rtp_speed, | |
255 kDefaultFramerate, kDefaultWidth, | |
256 kDefaultHeight); | |
257 | 224 |
258 Start(); | 225 CreateSendConfig(1, 0, 0, video_send_transport.get()); |
| 226 CreateMatchingReceiveConfigs(receive_transport.get()); |
259 | 227 |
260 audio_send_stream->Start(); | 228 AudioSendStream::Config audio_send_config(audio_send_transport.get()); |
261 audio_receive_stream->Start(); | 229 audio_send_config.voe_channel_id = send_channel_id; |
| 230 audio_send_config.rtp.ssrc = kAudioSendSsrc; |
| 231 audio_send_config.send_codec_spec = |
| 232 rtc::Optional<AudioSendStream::Config::SendCodecSpec>( |
| 233 {kAudioSendPayloadType, {"ISAC", 16000, 1}}); |
| 234 audio_send_config.encoder_factory = CreateBuiltinAudioEncoderFactory(); |
| 235 audio_send_stream = sender_call_->CreateAudioSendStream(audio_send_config); |
| 236 |
| 237 video_send_config_.rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
| 238 if (fec == FecMode::kOn) { |
| 239 video_send_config_.rtp.ulpfec.red_payload_type = kRedPayloadType; |
| 240 video_send_config_.rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; |
| 241 video_receive_configs_[0].rtp.ulpfec.red_payload_type = kRedPayloadType; |
| 242 video_receive_configs_[0].rtp.ulpfec.ulpfec_payload_type = |
| 243 kUlpfecPayloadType; |
| 244 } |
| 245 video_receive_configs_[0].rtp.nack.rtp_history_ms = 1000; |
| 246 video_receive_configs_[0].renderer = &observer; |
| 247 video_receive_configs_[0].sync_group = kSyncGroup; |
| 248 |
| 249 AudioReceiveStream::Config audio_recv_config; |
| 250 audio_recv_config.rtp.remote_ssrc = kAudioSendSsrc; |
| 251 audio_recv_config.rtp.local_ssrc = kAudioRecvSsrc; |
| 252 audio_recv_config.voe_channel_id = recv_channel_id; |
| 253 audio_recv_config.sync_group = kSyncGroup; |
| 254 audio_recv_config.decoder_factory = decoder_factory_; |
| 255 audio_recv_config.decoder_map = { |
| 256 {kAudioSendPayloadType, {"ISAC", 16000, 1}}}; |
| 257 |
| 258 if (create_first == CreateOrder::kAudioFirst) { |
| 259 audio_receive_stream = |
| 260 receiver_call_->CreateAudioReceiveStream(audio_recv_config); |
| 261 CreateVideoStreams(); |
| 262 } else { |
| 263 CreateVideoStreams(); |
| 264 audio_receive_stream = |
| 265 receiver_call_->CreateAudioReceiveStream(audio_recv_config); |
| 266 } |
| 267 EXPECT_EQ(1u, video_receive_streams_.size()); |
| 268 observer.set_receive_stream(video_receive_streams_[0]); |
| 269 drifting_clock = rtc::MakeUnique<DriftingClock>(clock_, video_ntp_speed); |
| 270 CreateFrameGeneratorCapturerWithDrift(drifting_clock.get(), video_rtp_speed, |
| 271 kDefaultFramerate, kDefaultWidth, |
| 272 kDefaultHeight); |
| 273 |
| 274 Start(); |
| 275 |
| 276 audio_send_stream->Start(); |
| 277 audio_receive_stream->Start(); |
| 278 }); |
262 | 279 |
263 EXPECT_TRUE(observer.Wait()) | 280 EXPECT_TRUE(observer.Wait()) |
264 << "Timed out while waiting for audio and video to be synchronized."; | 281 << "Timed out while waiting for audio and video to be synchronized."; |
265 | 282 |
266 audio_send_stream->Stop(); | 283 task_queue_.SendTask([&]() { |
267 audio_receive_stream->Stop(); | 284 audio_send_stream->Stop(); |
| 285 audio_receive_stream->Stop(); |
268 | 286 |
269 Stop(); | 287 Stop(); |
270 video_send_transport.StopSending(); | |
271 audio_send_transport.StopSending(); | |
272 receive_transport.StopSending(); | |
273 | 288 |
274 DestroyStreams(); | 289 DestroyStreams(); |
275 | 290 |
276 sender_call_->DestroyAudioSendStream(audio_send_stream); | 291 video_send_transport.reset(); |
277 receiver_call_->DestroyAudioReceiveStream(audio_receive_stream); | 292 audio_send_transport.reset(); |
| 293 receive_transport.reset(); |
278 | 294 |
279 voe_base->DeleteChannel(send_channel_id); | 295 sender_call_->DestroyAudioSendStream(audio_send_stream); |
280 voe_base->DeleteChannel(recv_channel_id); | 296 receiver_call_->DestroyAudioReceiveStream(audio_receive_stream); |
281 voe_base->Release(); | |
282 | 297 |
283 DestroyCalls(); | 298 voe_base->DeleteChannel(send_channel_id); |
| 299 voe_base->DeleteChannel(recv_channel_id); |
| 300 voe_base->Release(); |
284 | 301 |
285 VoiceEngine::Delete(voice_engine); | 302 DestroyCalls(); |
| 303 |
| 304 VoiceEngine::Delete(voice_engine); |
| 305 |
| 306 fake_audio_device.reset(); |
| 307 }); |
286 | 308 |
287 observer.PrintResults(); | 309 observer.PrintResults(); |
288 | 310 |
289 // In quick test synchronization may not be achieved in time. | 311 // In quick test synchronization may not be achieved in time. |
290 if (!field_trial::IsEnabled("WebRTC-QuickPerfTest")) { | 312 if (!field_trial::IsEnabled("WebRTC-QuickPerfTest")) { |
291 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.AVSyncOffsetInMs")); | 313 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.AVSyncOffsetInMs")); |
292 } | 314 } |
293 } | 315 } |
294 | 316 |
295 TEST_F(CallPerfTest, PlaysOutAudioAndVideoInSyncWithVideoNtpDrift) { | 317 TEST_F(CallPerfTest, PlaysOutAudioAndVideoInSyncWithVideoNtpDrift) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
328 clock_(Clock::GetRealTimeClock()), | 350 clock_(Clock::GetRealTimeClock()), |
329 threshold_ms_(threshold_ms), | 351 threshold_ms_(threshold_ms), |
330 start_time_ms_(start_time_ms), | 352 start_time_ms_(start_time_ms), |
331 run_time_ms_(run_time_ms), | 353 run_time_ms_(run_time_ms), |
332 creation_time_ms_(clock_->TimeInMilliseconds()), | 354 creation_time_ms_(clock_->TimeInMilliseconds()), |
333 capturer_(nullptr), | 355 capturer_(nullptr), |
334 rtp_start_timestamp_set_(false), | 356 rtp_start_timestamp_set_(false), |
335 rtp_start_timestamp_(0) {} | 357 rtp_start_timestamp_(0) {} |
336 | 358 |
337 private: | 359 private: |
338 test::PacketTransport* CreateSendTransport(Call* sender_call) override { | 360 test::PacketTransport* CreateSendTransport( |
339 return new test::PacketTransport(sender_call, this, | 361 test::SingleThreadedTaskQueueForTesting* task_queue, |
| 362 Call* sender_call) override { |
| 363 return new test::PacketTransport(task_queue, sender_call, this, |
340 test::PacketTransport::kSender, | 364 test::PacketTransport::kSender, |
341 payload_type_map_, net_config_); | 365 payload_type_map_, net_config_); |
342 } | 366 } |
343 | 367 |
344 test::PacketTransport* CreateReceiveTransport() override { | 368 test::PacketTransport* CreateReceiveTransport( |
345 return new test::PacketTransport(nullptr, this, | 369 test::SingleThreadedTaskQueueForTesting* task_queue) override { |
| 370 return new test::PacketTransport(task_queue, nullptr, this, |
346 test::PacketTransport::kReceiver, | 371 test::PacketTransport::kReceiver, |
347 payload_type_map_, net_config_); | 372 payload_type_map_, net_config_); |
348 } | 373 } |
349 | 374 |
350 void OnFrame(const VideoFrame& video_frame) override { | 375 void OnFrame(const VideoFrame& video_frame) override { |
351 rtc::CritScope lock(&crit_); | 376 rtc::CritScope lock(&crit_); |
352 if (video_frame.ntp_time_ms() <= 0) { | 377 if (video_frame.ntp_time_ms() <= 0) { |
353 // Haven't got enough RTCP SR in order to calculate the capture ntp | 378 // Haven't got enough RTCP SR in order to calculate the capture ntp |
354 // time. | 379 // time. |
355 return; | 380 return; |
(...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
754 uint32_t last_set_bitrate_kbps_; | 779 uint32_t last_set_bitrate_kbps_; |
755 VideoSendStream* send_stream_; | 780 VideoSendStream* send_stream_; |
756 test::FrameGeneratorCapturer* frame_generator_; | 781 test::FrameGeneratorCapturer* frame_generator_; |
757 VideoEncoderConfig encoder_config_; | 782 VideoEncoderConfig encoder_config_; |
758 } test; | 783 } test; |
759 | 784 |
760 RunBaseTest(&test); | 785 RunBaseTest(&test); |
761 } | 786 } |
762 | 787 |
763 } // namespace webrtc | 788 } // namespace webrtc |
OLD | NEW |