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 <algorithm> | 10 #include <algorithm> |
(...skipping 4127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4138 #define MAYBE_PictureIdStateRetainedAfterReinitingVp8 \ | 4138 #define MAYBE_PictureIdStateRetainedAfterReinitingVp8 \ |
4139 PictureIdStateRetainedAfterReinitingVp8 | 4139 PictureIdStateRetainedAfterReinitingVp8 |
4140 #define MAYBE_PictureIdStateRetainedAfterReinitingSimulcastEncoderAdapter \ | 4140 #define MAYBE_PictureIdStateRetainedAfterReinitingSimulcastEncoderAdapter \ |
4141 PictureIdStateRetainedAfterReinitingSimulcastEncoderAdapter | 4141 PictureIdStateRetainedAfterReinitingSimulcastEncoderAdapter |
4142 #endif | 4142 #endif |
4143 TEST_F(EndToEndTest, MAYBE_PictureIdStateRetainedAfterReinitingVp8) { | 4143 TEST_F(EndToEndTest, MAYBE_PictureIdStateRetainedAfterReinitingVp8) { |
4144 std::unique_ptr<VideoEncoder> encoder(VP8Encoder::Create()); | 4144 std::unique_ptr<VideoEncoder> encoder(VP8Encoder::Create()); |
4145 TestPictureIdStatePreservation(encoder.get()); | 4145 TestPictureIdStatePreservation(encoder.get()); |
4146 } | 4146 } |
4147 | 4147 |
4148 TEST_F(EndToEndTest, TestFlexfecRtpStatePreservation) { | |
4149 class RtpSequenceObserver : public test::RtpRtcpObserver { | |
4150 public: | |
4151 RtpSequenceObserver() | |
4152 : test::RtpRtcpObserver(kDefaultTimeoutMs), | |
4153 num_flexfec_packets_sent_(0) {} | |
4154 | |
4155 void ResetPacketCount() { | |
4156 rtc::CritScope lock(&crit_); | |
4157 num_flexfec_packets_sent_ = 0; | |
4158 } | |
4159 | |
4160 private: | |
4161 Action OnSendRtp(const uint8_t* packet, size_t length) override { | |
4162 rtc::CritScope lock(&crit_); | |
4163 | |
4164 RTPHeader header; | |
4165 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | |
4166 const uint16_t sequence_number = header.sequenceNumber; | |
4167 const uint32_t timestamp = header.timestamp; | |
4168 const uint32_t ssrc = header.ssrc; | |
4169 | |
4170 if (ssrc == kVideoSendSsrcs[0] || ssrc == kSendRtxSsrcs[0]) { | |
4171 return SEND_PACKET; | |
4172 } | |
4173 EXPECT_EQ(kFlexfecSendSsrc, ssrc) << "Unknown SSRC sent."; | |
4174 | |
4175 ++num_flexfec_packets_sent_; | |
4176 | |
4177 // If this is the first packet, we have nothing to compare to. | |
4178 if (!last_observed_sequence_number_) { | |
4179 last_observed_sequence_number_.emplace(sequence_number); | |
4180 last_observed_timestamp_.emplace(timestamp); | |
4181 | |
4182 return SEND_PACKET; | |
4183 } | |
4184 | |
4185 // Verify continuity and monotonicity of RTP sequence numbers. | |
4186 EXPECT_EQ(static_cast<uint16_t>(*last_observed_sequence_number_ + 1), | |
4187 sequence_number); | |
4188 last_observed_sequence_number_.emplace(sequence_number); | |
4189 | |
4190 // Verify that timestamps are reasonably close. | |
4191 const int timestamp_abs_diff = | |
4192 std::abs(static_cast<int>(timestamp) - | |
4193 static_cast<int>(*last_observed_timestamp_)); | |
4194 EXPECT_LT(timestamp_abs_diff, 10 * 90000); | |
sprang_webrtc
2017/05/29 14:26:45
Maybe EXPECT_NEAR here?
brandtr
2017/05/29 14:40:15
Replaced by checks that take wrap-around into acco
| |
4195 last_observed_timestamp_.emplace(timestamp); | |
4196 | |
4197 // Pass test when enough packets have been let through. | |
4198 if (num_flexfec_packets_sent_ >= 10) { | |
4199 observation_complete_.Set(); | |
4200 } | |
4201 | |
4202 return SEND_PACKET; | |
4203 } | |
4204 | |
4205 rtc::Optional<uint16_t> last_observed_sequence_number_ GUARDED_BY(crit_); | |
4206 rtc::Optional<uint32_t> last_observed_timestamp_ GUARDED_BY(crit_); | |
4207 size_t num_flexfec_packets_sent_ GUARDED_BY(crit_); | |
4208 rtc::CriticalSection crit_; | |
4209 } observer; | |
4210 | |
4211 Call::Config config(event_log_.get()); | |
4212 CreateCalls(config, config); | |
4213 | |
4214 FakeNetworkPipe::Config lossy_delayed_link; | |
4215 lossy_delayed_link.loss_percent = 2; | |
4216 lossy_delayed_link.queue_delay_ms = 50; | |
4217 test::PacketTransport send_transport(sender_call_.get(), &observer, | |
4218 test::PacketTransport::kSender, | |
4219 payload_type_map_, lossy_delayed_link); | |
4220 send_transport.SetReceiver(receiver_call_->Receiver()); | |
4221 | |
4222 FakeNetworkPipe::Config flawless_link; | |
4223 test::PacketTransport receive_transport(nullptr, &observer, | |
4224 test::PacketTransport::kReceiver, | |
4225 payload_type_map_, flawless_link); | |
4226 receive_transport.SetReceiver(sender_call_->Receiver()); | |
4227 | |
4228 // For reduced flakyness, we use a real VP8 encoder together with NACK | |
4229 // and RTX. | |
4230 const int kNumVideoStreams = 1; | |
4231 const int kNumFlexfecStreams = 1; | |
4232 CreateSendConfig(kNumVideoStreams, 0, kNumFlexfecStreams, &send_transport); | |
4233 std::unique_ptr<VideoEncoder> encoder(VP8Encoder::Create()); | |
4234 video_send_config_.encoder_settings.encoder = encoder.get(); | |
4235 video_send_config_.encoder_settings.payload_name = "VP8"; | |
4236 video_send_config_.encoder_settings.payload_type = kVideoSendPayloadType; | |
4237 video_send_config_.rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | |
4238 video_send_config_.rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); | |
4239 video_send_config_.rtp.rtx.payload_type = kSendRtxPayloadType; | |
4240 | |
4241 CreateMatchingReceiveConfigs(&receive_transport); | |
4242 video_receive_configs_[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | |
4243 video_receive_configs_[0].rtp.rtx_ssrc = kSendRtxSsrcs[0]; | |
4244 video_receive_configs_[0].rtp.rtx_payload_types[kVideoSendPayloadType] = | |
4245 kSendRtxPayloadType; | |
4246 | |
4247 // The matching FlexFEC receive config is not created by | |
4248 // CreateMatchingReceiveConfigs since this is not a test::BaseTest. | |
4249 // Set up the receive config manually instead. | |
4250 FlexfecReceiveStream::Config flexfec_receive_config(&receive_transport); | |
4251 flexfec_receive_config.payload_type = | |
4252 video_send_config_.rtp.flexfec.payload_type; | |
4253 flexfec_receive_config.remote_ssrc = video_send_config_.rtp.flexfec.ssrc; | |
4254 flexfec_receive_config.protected_media_ssrcs = | |
4255 video_send_config_.rtp.flexfec.protected_media_ssrcs; | |
4256 flexfec_receive_config.local_ssrc = kReceiverLocalVideoSsrc; | |
4257 flexfec_receive_config.transport_cc = true; | |
4258 flexfec_receive_config.rtp_header_extensions.push_back( | |
4259 RtpExtension(RtpExtension::kTransportSequenceNumberUri, | |
4260 test::kTransportSequenceNumberExtensionId)); | |
4261 flexfec_receive_configs_.push_back(flexfec_receive_config); | |
4262 | |
4263 CreateFlexfecStreams(); | |
4264 CreateVideoStreams(); | |
4265 | |
4266 // RTCP might be disabled if the network is "down". | |
4267 sender_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp); | |
4268 receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp); | |
4269 | |
4270 const int kFrameMaxWidth = 320; | |
4271 const int kFrameMaxHeight = 180; | |
4272 const int kFrameRate = 15; | |
4273 CreateFrameGeneratorCapturer(kFrameRate, kFrameMaxWidth, kFrameMaxHeight); | |
4274 | |
4275 // Initial test. | |
4276 Start(); | |
4277 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for packets."; | |
4278 | |
4279 // Ensure monotonicity when the VideoSendStream is restarted. | |
4280 auto restart_video_send_stream_and_test = [this, &observer]() { | |
4281 Stop(); | |
4282 observer.ResetPacketCount(); | |
4283 Start(); | |
4284 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for packets."; | |
4285 }; | |
4286 restart_video_send_stream_and_test(); | |
4287 restart_video_send_stream_and_test(); | |
sprang_webrtc
2017/05/29 14:26:45
Maybe comment on why you do this twice?
brandtr
2017/05/29 14:40:15
Hmm, I guess there's no big reason to do this >1 t
| |
4288 | |
4289 // Ensure monotonicity when the VideoSendStream is recreated. | |
4290 auto recreate_video_send_stream_and_test = [this, &observer, kFrameRate, | |
4291 kFrameMaxWidth, | |
4292 kFrameMaxHeight]() { | |
4293 frame_generator_capturer_->Stop(); | |
4294 sender_call_->DestroyVideoSendStream(video_send_stream_); | |
4295 video_send_stream_ = sender_call_->CreateVideoSendStream( | |
4296 video_send_config_.Copy(), video_encoder_config_.Copy()); | |
4297 video_send_stream_->Start(); | |
4298 CreateFrameGeneratorCapturer(kFrameRate, kFrameMaxWidth, kFrameMaxHeight); | |
4299 frame_generator_capturer_->Start(); | |
4300 observer.ResetPacketCount(); | |
sprang_webrtc
2017/05/29 14:26:45
Should this be called before start()?
brandtr
2017/05/29 14:40:15
Yes, that makes sense!
| |
4301 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for packets."; | |
4302 }; | |
4303 recreate_video_send_stream_and_test(); | |
4304 recreate_video_send_stream_and_test(); | |
4305 | |
4306 // Cleanup. | |
4307 send_transport.StopSending(); | |
4308 receive_transport.StopSending(); | |
4309 Stop(); | |
4310 DestroyStreams(); | |
4311 } | |
4312 | |
4148 TEST_F(EndToEndTest, | 4313 TEST_F(EndToEndTest, |
4149 MAYBE_PictureIdStateRetainedAfterReinitingSimulcastEncoderAdapter) { | 4314 MAYBE_PictureIdStateRetainedAfterReinitingSimulcastEncoderAdapter) { |
4150 class VideoEncoderFactoryAdapter : public webrtc::VideoEncoderFactory { | 4315 class VideoEncoderFactoryAdapter : public webrtc::VideoEncoderFactory { |
4151 public: | 4316 public: |
4152 explicit VideoEncoderFactoryAdapter( | 4317 explicit VideoEncoderFactoryAdapter( |
4153 cricket::WebRtcVideoEncoderFactory* factory) | 4318 cricket::WebRtcVideoEncoderFactory* factory) |
4154 : factory_(factory) {} | 4319 : factory_(factory) {} |
4155 virtual ~VideoEncoderFactoryAdapter() {} | 4320 virtual ~VideoEncoderFactoryAdapter() {} |
4156 | 4321 |
4157 // Implements webrtc::VideoEncoderFactory. | 4322 // Implements webrtc::VideoEncoderFactory. |
(...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4759 std::unique_ptr<VideoEncoder> encoder_; | 4924 std::unique_ptr<VideoEncoder> encoder_; |
4760 std::unique_ptr<VideoDecoder> decoder_; | 4925 std::unique_ptr<VideoDecoder> decoder_; |
4761 rtc::CriticalSection crit_; | 4926 rtc::CriticalSection crit_; |
4762 int recorded_frames_ GUARDED_BY(crit_); | 4927 int recorded_frames_ GUARDED_BY(crit_); |
4763 } test(this); | 4928 } test(this); |
4764 | 4929 |
4765 RunBaseTest(&test); | 4930 RunBaseTest(&test); |
4766 } | 4931 } |
4767 | 4932 |
4768 } // namespace webrtc | 4933 } // namespace webrtc |
OLD | NEW |