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

Side by Side Diff: webrtc/video/end_to_end_tests.cc

Issue 2912713002: Persist RTP state for FlexFEC. (Closed)
Patch Set: Fix fuzzer and win compile. 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
« no previous file with comments | « webrtc/test/fuzzers/flexfec_sender_fuzzer.cc ('k') | webrtc/video/video_send_stream.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « webrtc/test/fuzzers/flexfec_sender_fuzzer.cc ('k') | webrtc/video/video_send_stream.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698