| 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 |