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> |
11 #include <map> | 11 #include <map> |
12 #include <sstream> | 12 #include <sstream> |
13 #include <string> | 13 #include <string> |
14 | 14 |
15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
16 | 16 |
17 #include "webrtc/base/checks.h" | 17 #include "webrtc/base/checks.h" |
18 #include "webrtc/base/event.h" | 18 #include "webrtc/base/event.h" |
19 #include "webrtc/base/scoped_ptr.h" | 19 #include "webrtc/base/scoped_ptr.h" |
20 #include "webrtc/call.h" | 20 #include "webrtc/call.h" |
21 #include "webrtc/call/transport_adapter.h" | 21 #include "webrtc/call/transport_adapter.h" |
22 #include "webrtc/frame_callback.h" | 22 #include "webrtc/frame_callback.h" |
23 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 23 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
24 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" | 24 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" |
25 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" | 25 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" |
26 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" | 26 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" |
27 #include "webrtc/modules/video_coding/include/video_coding_defines.h" | 27 #include "webrtc/modules/video_coding/include/video_coding_defines.h" |
28 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" | 28 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
29 #include "webrtc/system_wrappers/include/event_wrapper.h" | |
30 #include "webrtc/system_wrappers/include/metrics.h" | 29 #include "webrtc/system_wrappers/include/metrics.h" |
31 #include "webrtc/system_wrappers/include/sleep.h" | 30 #include "webrtc/system_wrappers/include/sleep.h" |
32 #include "webrtc/test/call_test.h" | 31 #include "webrtc/test/call_test.h" |
33 #include "webrtc/test/direct_transport.h" | 32 #include "webrtc/test/direct_transport.h" |
34 #include "webrtc/test/encoder_settings.h" | 33 #include "webrtc/test/encoder_settings.h" |
35 #include "webrtc/test/fake_audio_device.h" | 34 #include "webrtc/test/fake_audio_device.h" |
36 #include "webrtc/test/fake_decoder.h" | 35 #include "webrtc/test/fake_decoder.h" |
37 #include "webrtc/test/fake_encoder.h" | 36 #include "webrtc/test/fake_encoder.h" |
38 #include "webrtc/test/frame_generator.h" | 37 #include "webrtc/test/frame_generator.h" |
39 #include "webrtc/test/frame_generator_capturer.h" | 38 #include "webrtc/test/frame_generator_capturer.h" |
40 #include "webrtc/test/histogram.h" | 39 #include "webrtc/test/histogram.h" |
41 #include "webrtc/test/null_transport.h" | 40 #include "webrtc/test/null_transport.h" |
42 #include "webrtc/test/rtcp_packet_parser.h" | 41 #include "webrtc/test/rtcp_packet_parser.h" |
43 #include "webrtc/test/rtp_rtcp_observer.h" | 42 #include "webrtc/test/rtp_rtcp_observer.h" |
44 #include "webrtc/test/testsupport/fileutils.h" | 43 #include "webrtc/test/testsupport/fileutils.h" |
45 #include "webrtc/test/testsupport/gtest_disable.h" | 44 #include "webrtc/test/testsupport/gtest_disable.h" |
46 #include "webrtc/test/testsupport/perf_test.h" | 45 #include "webrtc/test/testsupport/perf_test.h" |
47 #include "webrtc/video_encoder.h" | 46 #include "webrtc/video_encoder.h" |
48 | 47 |
49 namespace webrtc { | 48 namespace webrtc { |
50 | 49 |
51 static const uint32_t kSilenceTimeoutMs = 2000; | 50 static const int kSilenceTimeoutMs = 2000; |
52 | 51 |
53 class EndToEndTest : public test::CallTest { | 52 class EndToEndTest : public test::CallTest { |
54 public: | 53 public: |
55 EndToEndTest() {} | 54 EndToEndTest() {} |
56 | 55 |
57 virtual ~EndToEndTest() { | 56 virtual ~EndToEndTest() { |
58 EXPECT_EQ(nullptr, send_stream_); | 57 EXPECT_EQ(nullptr, send_stream_); |
59 EXPECT_TRUE(receive_streams_.empty()); | 58 EXPECT_TRUE(receive_streams_.empty()); |
60 } | 59 } |
61 | 60 |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 TEST_F(EndToEndTest, RendersSingleDelayedFrame) { | 116 TEST_F(EndToEndTest, RendersSingleDelayedFrame) { |
118 static const int kWidth = 320; | 117 static const int kWidth = 320; |
119 static const int kHeight = 240; | 118 static const int kHeight = 240; |
120 // This constant is chosen to be higher than the timeout in the video_render | 119 // This constant is chosen to be higher than the timeout in the video_render |
121 // module. This makes sure that frames aren't dropped if there are no other | 120 // module. This makes sure that frames aren't dropped if there are no other |
122 // frames in the queue. | 121 // frames in the queue. |
123 static const int kDelayRenderCallbackMs = 1000; | 122 static const int kDelayRenderCallbackMs = 1000; |
124 | 123 |
125 class Renderer : public VideoRenderer { | 124 class Renderer : public VideoRenderer { |
126 public: | 125 public: |
127 Renderer() : event_(EventWrapper::Create()) {} | 126 Renderer() : event_(false, false) {} |
128 | 127 |
129 void RenderFrame(const VideoFrame& video_frame, | 128 void RenderFrame(const VideoFrame& video_frame, |
130 int /*time_to_render_ms*/) override { | 129 int /*time_to_render_ms*/) override { |
131 event_->Set(); | 130 event_.Set(); |
132 } | 131 } |
133 | 132 |
134 bool IsTextureSupported() const override { return false; } | 133 bool IsTextureSupported() const override { return false; } |
135 | 134 |
136 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); } | 135 bool Wait() { return event_.Wait(kDefaultTimeoutMs); } |
137 | 136 |
138 rtc::scoped_ptr<EventWrapper> event_; | 137 rtc::Event event_; |
139 } renderer; | 138 } renderer; |
140 | 139 |
141 class TestFrameCallback : public I420FrameCallback { | 140 class TestFrameCallback : public I420FrameCallback { |
142 public: | 141 public: |
143 TestFrameCallback() : event_(EventWrapper::Create()) {} | 142 TestFrameCallback() : event_(false, false) {} |
144 | 143 |
145 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); } | 144 bool Wait() { return event_.Wait(kDefaultTimeoutMs); } |
146 | 145 |
147 private: | 146 private: |
148 void FrameCallback(VideoFrame* frame) override { | 147 void FrameCallback(VideoFrame* frame) override { |
149 SleepMs(kDelayRenderCallbackMs); | 148 SleepMs(kDelayRenderCallbackMs); |
150 event_->Set(); | 149 event_.Set(); |
151 } | 150 } |
152 | 151 |
153 rtc::scoped_ptr<EventWrapper> event_; | 152 rtc::Event event_; |
154 }; | 153 }; |
155 | 154 |
156 CreateCalls(Call::Config(), Call::Config()); | 155 CreateCalls(Call::Config(), Call::Config()); |
157 | 156 |
158 test::DirectTransport sender_transport(sender_call_.get()); | 157 test::DirectTransport sender_transport(sender_call_.get()); |
159 test::DirectTransport receiver_transport(receiver_call_.get()); | 158 test::DirectTransport receiver_transport(receiver_call_.get()); |
160 sender_transport.SetReceiver(receiver_call_->Receiver()); | 159 sender_transport.SetReceiver(receiver_call_->Receiver()); |
161 receiver_transport.SetReceiver(sender_call_->Receiver()); | 160 receiver_transport.SetReceiver(sender_call_->Receiver()); |
162 | 161 |
163 CreateSendConfig(1, &sender_transport); | 162 CreateSendConfig(1, &sender_transport); |
164 CreateMatchingReceiveConfigs(&receiver_transport); | 163 CreateMatchingReceiveConfigs(&receiver_transport); |
165 | 164 |
166 TestFrameCallback pre_render_callback; | 165 TestFrameCallback pre_render_callback; |
167 receive_configs_[0].pre_render_callback = &pre_render_callback; | 166 receive_configs_[0].pre_render_callback = &pre_render_callback; |
168 receive_configs_[0].renderer = &renderer; | 167 receive_configs_[0].renderer = &renderer; |
169 | 168 |
170 CreateStreams(); | 169 CreateStreams(); |
171 Start(); | 170 Start(); |
172 | 171 |
173 // Create frames that are smaller than the send width/height, this is done to | 172 // Create frames that are smaller than the send width/height, this is done to |
174 // check that the callbacks are done after processing video. | 173 // check that the callbacks are done after processing video. |
175 rtc::scoped_ptr<test::FrameGenerator> frame_generator( | 174 rtc::scoped_ptr<test::FrameGenerator> frame_generator( |
176 test::FrameGenerator::CreateChromaGenerator(kWidth, kHeight)); | 175 test::FrameGenerator::CreateChromaGenerator(kWidth, kHeight)); |
177 send_stream_->Input()->IncomingCapturedFrame(*frame_generator->NextFrame()); | 176 send_stream_->Input()->IncomingCapturedFrame(*frame_generator->NextFrame()); |
178 EXPECT_EQ(kEventSignaled, pre_render_callback.Wait()) | 177 EXPECT_TRUE(pre_render_callback.Wait()) |
179 << "Timed out while waiting for pre-render callback."; | 178 << "Timed out while waiting for pre-render callback."; |
180 EXPECT_EQ(kEventSignaled, renderer.Wait()) | 179 EXPECT_TRUE(renderer.Wait()) |
181 << "Timed out while waiting for the frame to render."; | 180 << "Timed out while waiting for the frame to render."; |
182 | 181 |
183 Stop(); | 182 Stop(); |
184 | 183 |
185 sender_transport.StopSending(); | 184 sender_transport.StopSending(); |
186 receiver_transport.StopSending(); | 185 receiver_transport.StopSending(); |
187 | 186 |
188 DestroyStreams(); | 187 DestroyStreams(); |
189 } | 188 } |
190 | 189 |
191 TEST_F(EndToEndTest, TransmitsFirstFrame) { | 190 TEST_F(EndToEndTest, TransmitsFirstFrame) { |
192 class Renderer : public VideoRenderer { | 191 class Renderer : public VideoRenderer { |
193 public: | 192 public: |
194 Renderer() : event_(EventWrapper::Create()) {} | 193 Renderer() : event_(false, false) {} |
195 | 194 |
196 void RenderFrame(const VideoFrame& video_frame, | 195 void RenderFrame(const VideoFrame& video_frame, |
197 int /*time_to_render_ms*/) override { | 196 int /*time_to_render_ms*/) override { |
198 event_->Set(); | 197 event_.Set(); |
199 } | 198 } |
200 bool IsTextureSupported() const override { return false; } | 199 bool IsTextureSupported() const override { return false; } |
201 | 200 |
202 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); } | 201 bool Wait() { return event_.Wait(kDefaultTimeoutMs); } |
203 | 202 |
204 rtc::scoped_ptr<EventWrapper> event_; | 203 rtc::Event event_; |
205 } renderer; | 204 } renderer; |
206 | 205 |
207 CreateCalls(Call::Config(), Call::Config()); | 206 CreateCalls(Call::Config(), Call::Config()); |
208 | 207 |
209 test::DirectTransport sender_transport(sender_call_.get()); | 208 test::DirectTransport sender_transport(sender_call_.get()); |
210 test::DirectTransport receiver_transport(receiver_call_.get()); | 209 test::DirectTransport receiver_transport(receiver_call_.get()); |
211 sender_transport.SetReceiver(receiver_call_->Receiver()); | 210 sender_transport.SetReceiver(receiver_call_->Receiver()); |
212 receiver_transport.SetReceiver(sender_call_->Receiver()); | 211 receiver_transport.SetReceiver(sender_call_->Receiver()); |
213 | 212 |
214 CreateSendConfig(1, &sender_transport); | 213 CreateSendConfig(1, &sender_transport); |
215 CreateMatchingReceiveConfigs(&receiver_transport); | 214 CreateMatchingReceiveConfigs(&receiver_transport); |
216 receive_configs_[0].renderer = &renderer; | 215 receive_configs_[0].renderer = &renderer; |
217 | 216 |
218 CreateStreams(); | 217 CreateStreams(); |
219 Start(); | 218 Start(); |
220 | 219 |
221 rtc::scoped_ptr<test::FrameGenerator> frame_generator( | 220 rtc::scoped_ptr<test::FrameGenerator> frame_generator( |
222 test::FrameGenerator::CreateChromaGenerator( | 221 test::FrameGenerator::CreateChromaGenerator( |
223 encoder_config_.streams[0].width, encoder_config_.streams[0].height)); | 222 encoder_config_.streams[0].width, encoder_config_.streams[0].height)); |
224 send_stream_->Input()->IncomingCapturedFrame(*frame_generator->NextFrame()); | 223 send_stream_->Input()->IncomingCapturedFrame(*frame_generator->NextFrame()); |
225 | 224 |
226 EXPECT_EQ(kEventSignaled, renderer.Wait()) | 225 EXPECT_TRUE(renderer.Wait()) |
227 << "Timed out while waiting for the frame to render."; | 226 << "Timed out while waiting for the frame to render."; |
228 | 227 |
229 Stop(); | 228 Stop(); |
230 | 229 |
231 sender_transport.StopSending(); | 230 sender_transport.StopSending(); |
232 receiver_transport.StopSending(); | 231 receiver_transport.StopSending(); |
233 | 232 |
234 DestroyStreams(); | 233 DestroyStreams(); |
235 } | 234 } |
236 | 235 |
237 TEST_F(EndToEndTest, SendsAndReceivesVP9) { | 236 TEST_F(EndToEndTest, SendsAndReceivesVP9) { |
238 class VP9Observer : public test::EndToEndTest, public VideoRenderer { | 237 class VP9Observer : public test::EndToEndTest, public VideoRenderer { |
239 public: | 238 public: |
240 VP9Observer() | 239 VP9Observer() |
241 : EndToEndTest(2 * kDefaultTimeoutMs), | 240 : EndToEndTest(2 * kDefaultTimeoutMs), |
242 encoder_(VideoEncoder::Create(VideoEncoder::kVp9)), | 241 encoder_(VideoEncoder::Create(VideoEncoder::kVp9)), |
243 decoder_(VP9Decoder::Create()), | 242 decoder_(VP9Decoder::Create()), |
244 frame_counter_(0) {} | 243 frame_counter_(0) {} |
245 | 244 |
246 void PerformTest() override { | 245 void PerformTest() override { |
247 EXPECT_EQ(kEventSignaled, Wait()) | 246 EXPECT_TRUE(Wait()) |
248 << "Timed out while waiting for enough frames to be decoded."; | 247 << "Timed out while waiting for enough frames to be decoded."; |
249 } | 248 } |
250 | 249 |
251 void ModifyConfigs(VideoSendStream::Config* send_config, | 250 void ModifyConfigs(VideoSendStream::Config* send_config, |
252 std::vector<VideoReceiveStream::Config>* receive_configs, | 251 std::vector<VideoReceiveStream::Config>* receive_configs, |
253 VideoEncoderConfig* encoder_config) override { | 252 VideoEncoderConfig* encoder_config) override { |
254 send_config->encoder_settings.encoder = encoder_.get(); | 253 send_config->encoder_settings.encoder = encoder_.get(); |
255 send_config->encoder_settings.payload_name = "VP9"; | 254 send_config->encoder_settings.payload_name = "VP9"; |
256 send_config->encoder_settings.payload_type = 124; | 255 send_config->encoder_settings.payload_type = 124; |
257 encoder_config->streams[0].min_bitrate_bps = 50000; | 256 encoder_config->streams[0].min_bitrate_bps = 50000; |
258 encoder_config->streams[0].target_bitrate_bps = | 257 encoder_config->streams[0].target_bitrate_bps = |
259 encoder_config->streams[0].max_bitrate_bps = 2000000; | 258 encoder_config->streams[0].max_bitrate_bps = 2000000; |
260 | 259 |
261 (*receive_configs)[0].renderer = this; | 260 (*receive_configs)[0].renderer = this; |
262 (*receive_configs)[0].decoders.resize(1); | 261 (*receive_configs)[0].decoders.resize(1); |
263 (*receive_configs)[0].decoders[0].payload_type = | 262 (*receive_configs)[0].decoders[0].payload_type = |
264 send_config->encoder_settings.payload_type; | 263 send_config->encoder_settings.payload_type; |
265 (*receive_configs)[0].decoders[0].payload_name = | 264 (*receive_configs)[0].decoders[0].payload_name = |
266 send_config->encoder_settings.payload_name; | 265 send_config->encoder_settings.payload_name; |
267 (*receive_configs)[0].decoders[0].decoder = decoder_.get(); | 266 (*receive_configs)[0].decoders[0].decoder = decoder_.get(); |
268 } | 267 } |
269 | 268 |
270 void RenderFrame(const VideoFrame& video_frame, | 269 void RenderFrame(const VideoFrame& video_frame, |
271 int time_to_render_ms) override { | 270 int time_to_render_ms) override { |
272 const int kRequiredFrames = 500; | 271 const int kRequiredFrames = 500; |
273 if (++frame_counter_ == kRequiredFrames) | 272 if (++frame_counter_ == kRequiredFrames) |
274 observation_complete_->Set(); | 273 observation_complete_.Set(); |
275 } | 274 } |
276 | 275 |
277 bool IsTextureSupported() const override { return false; } | 276 bool IsTextureSupported() const override { return false; } |
278 | 277 |
279 private: | 278 private: |
280 rtc::scoped_ptr<webrtc::VideoEncoder> encoder_; | 279 rtc::scoped_ptr<webrtc::VideoEncoder> encoder_; |
281 rtc::scoped_ptr<webrtc::VideoDecoder> decoder_; | 280 rtc::scoped_ptr<webrtc::VideoDecoder> decoder_; |
282 int frame_counter_; | 281 int frame_counter_; |
283 } test; | 282 } test; |
284 | 283 |
285 RunBaseTest(&test, FakeNetworkPipe::Config()); | 284 RunBaseTest(&test, FakeNetworkPipe::Config()); |
286 } | 285 } |
287 | 286 |
288 TEST_F(EndToEndTest, SendsAndReceivesH264) { | 287 TEST_F(EndToEndTest, SendsAndReceivesH264) { |
289 class H264Observer : public test::EndToEndTest, public VideoRenderer { | 288 class H264Observer : public test::EndToEndTest, public VideoRenderer { |
290 public: | 289 public: |
291 H264Observer() | 290 H264Observer() |
292 : EndToEndTest(2 * kDefaultTimeoutMs), | 291 : EndToEndTest(2 * kDefaultTimeoutMs), |
293 fake_encoder_(Clock::GetRealTimeClock()), | 292 fake_encoder_(Clock::GetRealTimeClock()), |
294 frame_counter_(0) {} | 293 frame_counter_(0) {} |
295 | 294 |
296 void PerformTest() override { | 295 void PerformTest() override { |
297 EXPECT_EQ(kEventSignaled, Wait()) | 296 EXPECT_TRUE(Wait()) |
298 << "Timed out while waiting for enough frames to be decoded."; | 297 << "Timed out while waiting for enough frames to be decoded."; |
299 } | 298 } |
300 | 299 |
301 void ModifyConfigs(VideoSendStream::Config* send_config, | 300 void ModifyConfigs(VideoSendStream::Config* send_config, |
302 std::vector<VideoReceiveStream::Config>* receive_configs, | 301 std::vector<VideoReceiveStream::Config>* receive_configs, |
303 VideoEncoderConfig* encoder_config) override { | 302 VideoEncoderConfig* encoder_config) override { |
304 send_config->rtp.nack.rtp_history_ms = | 303 send_config->rtp.nack.rtp_history_ms = |
305 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 304 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
306 send_config->encoder_settings.encoder = &fake_encoder_; | 305 send_config->encoder_settings.encoder = &fake_encoder_; |
307 send_config->encoder_settings.payload_name = "H264"; | 306 send_config->encoder_settings.payload_name = "H264"; |
308 send_config->encoder_settings.payload_type = kFakeSendPayloadType; | 307 send_config->encoder_settings.payload_type = kFakeSendPayloadType; |
309 encoder_config->streams[0].min_bitrate_bps = 50000; | 308 encoder_config->streams[0].min_bitrate_bps = 50000; |
310 encoder_config->streams[0].target_bitrate_bps = | 309 encoder_config->streams[0].target_bitrate_bps = |
311 encoder_config->streams[0].max_bitrate_bps = 2000000; | 310 encoder_config->streams[0].max_bitrate_bps = 2000000; |
312 | 311 |
313 (*receive_configs)[0].renderer = this; | 312 (*receive_configs)[0].renderer = this; |
314 (*receive_configs)[0].decoders.resize(1); | 313 (*receive_configs)[0].decoders.resize(1); |
315 (*receive_configs)[0].decoders[0].payload_type = | 314 (*receive_configs)[0].decoders[0].payload_type = |
316 send_config->encoder_settings.payload_type; | 315 send_config->encoder_settings.payload_type; |
317 (*receive_configs)[0].decoders[0].payload_name = | 316 (*receive_configs)[0].decoders[0].payload_name = |
318 send_config->encoder_settings.payload_name; | 317 send_config->encoder_settings.payload_name; |
319 (*receive_configs)[0].decoders[0].decoder = &fake_decoder_; | 318 (*receive_configs)[0].decoders[0].decoder = &fake_decoder_; |
320 } | 319 } |
321 | 320 |
322 void RenderFrame(const VideoFrame& video_frame, | 321 void RenderFrame(const VideoFrame& video_frame, |
323 int time_to_render_ms) override { | 322 int time_to_render_ms) override { |
324 const int kRequiredFrames = 500; | 323 const int kRequiredFrames = 500; |
325 if (++frame_counter_ == kRequiredFrames) | 324 if (++frame_counter_ == kRequiredFrames) |
326 observation_complete_->Set(); | 325 observation_complete_.Set(); |
327 } | 326 } |
328 | 327 |
329 bool IsTextureSupported() const override { return false; } | 328 bool IsTextureSupported() const override { return false; } |
330 | 329 |
331 private: | 330 private: |
332 test::FakeH264Decoder fake_decoder_; | 331 test::FakeH264Decoder fake_decoder_; |
333 test::FakeH264Encoder fake_encoder_; | 332 test::FakeH264Encoder fake_encoder_; |
334 int frame_counter_; | 333 int frame_counter_; |
335 } test; | 334 } test; |
336 | 335 |
337 RunBaseTest(&test, FakeNetworkPipe::Config()); | 336 RunBaseTest(&test, FakeNetworkPipe::Config()); |
338 } | 337 } |
339 | 338 |
340 TEST_F(EndToEndTest, ReceiverUsesLocalSsrc) { | 339 TEST_F(EndToEndTest, ReceiverUsesLocalSsrc) { |
341 class SyncRtcpObserver : public test::EndToEndTest { | 340 class SyncRtcpObserver : public test::EndToEndTest { |
342 public: | 341 public: |
343 SyncRtcpObserver() : EndToEndTest(kDefaultTimeoutMs) {} | 342 SyncRtcpObserver() : EndToEndTest(kDefaultTimeoutMs) {} |
344 | 343 |
345 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { | 344 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { |
346 RTCPUtility::RTCPParserV2 parser(packet, length, true); | 345 RTCPUtility::RTCPParserV2 parser(packet, length, true); |
347 EXPECT_TRUE(parser.IsValid()); | 346 EXPECT_TRUE(parser.IsValid()); |
348 uint32_t ssrc = 0; | 347 uint32_t ssrc = 0; |
349 ssrc |= static_cast<uint32_t>(packet[4]) << 24; | 348 ssrc |= static_cast<uint32_t>(packet[4]) << 24; |
350 ssrc |= static_cast<uint32_t>(packet[5]) << 16; | 349 ssrc |= static_cast<uint32_t>(packet[5]) << 16; |
351 ssrc |= static_cast<uint32_t>(packet[6]) << 8; | 350 ssrc |= static_cast<uint32_t>(packet[6]) << 8; |
352 ssrc |= static_cast<uint32_t>(packet[7]) << 0; | 351 ssrc |= static_cast<uint32_t>(packet[7]) << 0; |
353 EXPECT_EQ(kReceiverLocalSsrc, ssrc); | 352 EXPECT_EQ(kReceiverLocalSsrc, ssrc); |
354 observation_complete_->Set(); | 353 observation_complete_.Set(); |
355 | 354 |
356 return SEND_PACKET; | 355 return SEND_PACKET; |
357 } | 356 } |
358 | 357 |
359 void PerformTest() override { | 358 void PerformTest() override { |
360 EXPECT_EQ(kEventSignaled, Wait()) | 359 EXPECT_TRUE(Wait()) |
361 << "Timed out while waiting for a receiver RTCP packet to be sent."; | 360 << "Timed out while waiting for a receiver RTCP packet to be sent."; |
362 } | 361 } |
363 } test; | 362 } test; |
364 | 363 |
365 RunBaseTest(&test, FakeNetworkPipe::Config()); | 364 RunBaseTest(&test, FakeNetworkPipe::Config()); |
366 } | 365 } |
367 | 366 |
368 TEST_F(EndToEndTest, ReceivesAndRetransmitsNack) { | 367 TEST_F(EndToEndTest, ReceivesAndRetransmitsNack) { |
369 static const int kNumberOfNacksToObserve = 2; | 368 static const int kNumberOfNacksToObserve = 2; |
370 static const int kLossBurstSize = 2; | 369 static const int kLossBurstSize = 2; |
(...skipping 11 matching lines...) Expand all Loading... |
382 rtc::CritScope lock(&crit_); | 381 rtc::CritScope lock(&crit_); |
383 RTPHeader header; | 382 RTPHeader header; |
384 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 383 EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
385 | 384 |
386 // Never drop retransmitted packets. | 385 // Never drop retransmitted packets. |
387 if (dropped_packets_.find(header.sequenceNumber) != | 386 if (dropped_packets_.find(header.sequenceNumber) != |
388 dropped_packets_.end()) { | 387 dropped_packets_.end()) { |
389 retransmitted_packets_.insert(header.sequenceNumber); | 388 retransmitted_packets_.insert(header.sequenceNumber); |
390 if (nacks_left_ <= 0 && | 389 if (nacks_left_ <= 0 && |
391 retransmitted_packets_.size() == dropped_packets_.size()) { | 390 retransmitted_packets_.size() == dropped_packets_.size()) { |
392 observation_complete_->Set(); | 391 observation_complete_.Set(); |
393 } | 392 } |
394 return SEND_PACKET; | 393 return SEND_PACKET; |
395 } | 394 } |
396 | 395 |
397 ++sent_rtp_packets_; | 396 ++sent_rtp_packets_; |
398 | 397 |
399 // Enough NACKs received, stop dropping packets. | 398 // Enough NACKs received, stop dropping packets. |
400 if (nacks_left_ <= 0) | 399 if (nacks_left_ <= 0) |
401 return SEND_PACKET; | 400 return SEND_PACKET; |
402 | 401 |
(...skipping 28 matching lines...) Expand all Loading... |
431 } | 430 } |
432 | 431 |
433 void ModifyConfigs(VideoSendStream::Config* send_config, | 432 void ModifyConfigs(VideoSendStream::Config* send_config, |
434 std::vector<VideoReceiveStream::Config>* receive_configs, | 433 std::vector<VideoReceiveStream::Config>* receive_configs, |
435 VideoEncoderConfig* encoder_config) override { | 434 VideoEncoderConfig* encoder_config) override { |
436 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 435 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
437 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 436 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
438 } | 437 } |
439 | 438 |
440 void PerformTest() override { | 439 void PerformTest() override { |
441 EXPECT_EQ(kEventSignaled, Wait()) | 440 EXPECT_TRUE(Wait()) |
442 << "Timed out waiting for packets to be NACKed, retransmitted and " | 441 << "Timed out waiting for packets to be NACKed, retransmitted and " |
443 "rendered."; | 442 "rendered."; |
444 } | 443 } |
445 | 444 |
446 rtc::CriticalSection crit_; | 445 rtc::CriticalSection crit_; |
447 std::set<uint16_t> dropped_packets_; | 446 std::set<uint16_t> dropped_packets_; |
448 std::set<uint16_t> retransmitted_packets_; | 447 std::set<uint16_t> retransmitted_packets_; |
449 uint64_t sent_rtp_packets_; | 448 uint64_t sent_rtp_packets_; |
450 int packets_left_to_drop_; | 449 int packets_left_to_drop_; |
451 int nacks_left_ GUARDED_BY(&crit_); | 450 int nacks_left_ GUARDED_BY(&crit_); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
508 | 507 |
509 return SEND_PACKET; | 508 return SEND_PACKET; |
510 } | 509 } |
511 | 510 |
512 void RenderFrame(const VideoFrame& video_frame, | 511 void RenderFrame(const VideoFrame& video_frame, |
513 int time_to_render_ms) override { | 512 int time_to_render_ms) override { |
514 rtc::CritScope lock(&crit_); | 513 rtc::CritScope lock(&crit_); |
515 // Rendering frame with timestamp of packet that was dropped -> FEC | 514 // Rendering frame with timestamp of packet that was dropped -> FEC |
516 // protection worked. | 515 // protection worked. |
517 if (protected_timestamps_.count(video_frame.timestamp()) != 0) | 516 if (protected_timestamps_.count(video_frame.timestamp()) != 0) |
518 observation_complete_->Set(); | 517 observation_complete_.Set(); |
519 } | 518 } |
520 | 519 |
521 bool IsTextureSupported() const override { return false; } | 520 bool IsTextureSupported() const override { return false; } |
522 | 521 |
523 enum { | 522 enum { |
524 kFirstPacket, | 523 kFirstPacket, |
525 kDropEveryOtherPacketUntilFec, | 524 kDropEveryOtherPacketUntilFec, |
526 kDropNextMediaPacket, | 525 kDropNextMediaPacket, |
527 } state_; | 526 } state_; |
528 | 527 |
529 void ModifyConfigs(VideoSendStream::Config* send_config, | 528 void ModifyConfigs(VideoSendStream::Config* send_config, |
530 std::vector<VideoReceiveStream::Config>* receive_configs, | 529 std::vector<VideoReceiveStream::Config>* receive_configs, |
531 VideoEncoderConfig* encoder_config) override { | 530 VideoEncoderConfig* encoder_config) override { |
532 // TODO(pbos): Run this test with combined NACK/FEC enabled as well. | 531 // TODO(pbos): Run this test with combined NACK/FEC enabled as well. |
533 // int rtp_history_ms = 1000; | 532 // int rtp_history_ms = 1000; |
534 // (*receive_configs)[0].rtp.nack.rtp_history_ms = rtp_history_ms; | 533 // (*receive_configs)[0].rtp.nack.rtp_history_ms = rtp_history_ms; |
535 // send_config->rtp.nack.rtp_history_ms = rtp_history_ms; | 534 // send_config->rtp.nack.rtp_history_ms = rtp_history_ms; |
536 send_config->rtp.fec.red_payload_type = kRedPayloadType; | 535 send_config->rtp.fec.red_payload_type = kRedPayloadType; |
537 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; | 536 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; |
538 | 537 |
539 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType; | 538 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType; |
540 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; | 539 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; |
541 (*receive_configs)[0].renderer = this; | 540 (*receive_configs)[0].renderer = this; |
542 } | 541 } |
543 | 542 |
544 void PerformTest() override { | 543 void PerformTest() override { |
545 EXPECT_EQ(kEventSignaled, Wait()) | 544 EXPECT_TRUE(Wait()) |
546 << "Timed out waiting for dropped frames frames to be rendered."; | 545 << "Timed out waiting for dropped frames frames to be rendered."; |
547 } | 546 } |
548 | 547 |
549 rtc::CriticalSection crit_; | 548 rtc::CriticalSection crit_; |
550 std::set<uint32_t> protected_sequence_numbers_ GUARDED_BY(crit_); | 549 std::set<uint32_t> protected_sequence_numbers_ GUARDED_BY(crit_); |
551 std::set<uint32_t> protected_timestamps_ GUARDED_BY(crit_); | 550 std::set<uint32_t> protected_timestamps_ GUARDED_BY(crit_); |
552 } test; | 551 } test; |
553 | 552 |
554 RunBaseTest(&test, FakeNetworkPipe::Config()); | 553 RunBaseTest(&test, FakeNetworkPipe::Config()); |
555 } | 554 } |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
620 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { | 619 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { |
621 rtc::CritScope lock_(&crit_); | 620 rtc::CritScope lock_(&crit_); |
622 if (state_ == kVerifyFecPacketNotInNackList) { | 621 if (state_ == kVerifyFecPacketNotInNackList) { |
623 test::RtcpPacketParser rtcp_parser; | 622 test::RtcpPacketParser rtcp_parser; |
624 rtcp_parser.Parse(packet, length); | 623 rtcp_parser.Parse(packet, length); |
625 std::vector<uint16_t> nacks = rtcp_parser.nack_item()->last_nack_list(); | 624 std::vector<uint16_t> nacks = rtcp_parser.nack_item()->last_nack_list(); |
626 if (!nacks.empty() && | 625 if (!nacks.empty() && |
627 IsNewerSequenceNumber(nacks.back(), fec_sequence_number_)) { | 626 IsNewerSequenceNumber(nacks.back(), fec_sequence_number_)) { |
628 EXPECT_TRUE(std::find( | 627 EXPECT_TRUE(std::find( |
629 nacks.begin(), nacks.end(), fec_sequence_number_) == nacks.end()); | 628 nacks.begin(), nacks.end(), fec_sequence_number_) == nacks.end()); |
630 observation_complete_->Set(); | 629 observation_complete_.Set(); |
631 } | 630 } |
632 } | 631 } |
633 return SEND_PACKET; | 632 return SEND_PACKET; |
634 } | 633 } |
635 | 634 |
636 // TODO(holmer): Investigate why we don't send FEC packets when the bitrate | 635 // TODO(holmer): Investigate why we don't send FEC packets when the bitrate |
637 // is 10 kbps. | 636 // is 10 kbps. |
638 Call::Config GetSenderCallConfig() override { | 637 Call::Config GetSenderCallConfig() override { |
639 Call::Config config; | 638 Call::Config config; |
640 const int kMinBitrateBps = 30000; | 639 const int kMinBitrateBps = 30000; |
641 config.bitrate_config.min_bitrate_bps = kMinBitrateBps; | 640 config.bitrate_config.min_bitrate_bps = kMinBitrateBps; |
642 return config; | 641 return config; |
643 } | 642 } |
644 | 643 |
645 void ModifyConfigs(VideoSendStream::Config* send_config, | 644 void ModifyConfigs(VideoSendStream::Config* send_config, |
646 std::vector<VideoReceiveStream::Config>* receive_configs, | 645 std::vector<VideoReceiveStream::Config>* receive_configs, |
647 VideoEncoderConfig* encoder_config) override { | 646 VideoEncoderConfig* encoder_config) override { |
648 // Configure hybrid NACK/FEC. | 647 // Configure hybrid NACK/FEC. |
649 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 648 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
650 send_config->rtp.fec.red_payload_type = kRedPayloadType; | 649 send_config->rtp.fec.red_payload_type = kRedPayloadType; |
651 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; | 650 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; |
652 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 651 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
653 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType; | 652 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType; |
654 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; | 653 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; |
655 } | 654 } |
656 | 655 |
657 void PerformTest() override { | 656 void PerformTest() override { |
658 EXPECT_EQ(kEventSignaled, Wait()) | 657 EXPECT_TRUE(Wait()) |
659 << "Timed out while waiting for FEC packets to be received."; | 658 << "Timed out while waiting for FEC packets to be received."; |
660 } | 659 } |
661 | 660 |
662 enum { | 661 enum { |
663 kFirstPacket, | 662 kFirstPacket, |
664 kDropEveryOtherPacketUntilFec, | 663 kDropEveryOtherPacketUntilFec, |
665 kDropAllMediaPacketsUntilFec, | 664 kDropAllMediaPacketsUntilFec, |
666 kVerifyFecPacketNotInNackList, | 665 kVerifyFecPacketNotInNackList, |
667 } state_; | 666 } state_; |
668 | 667 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
730 return DROP_PACKET; | 729 return DROP_PACKET; |
731 } | 730 } |
732 | 731 |
733 return SEND_PACKET; | 732 return SEND_PACKET; |
734 } | 733 } |
735 | 734 |
736 void FrameCallback(VideoFrame* frame) override { | 735 void FrameCallback(VideoFrame* frame) override { |
737 rtc::CritScope lock(&crit_); | 736 rtc::CritScope lock(&crit_); |
738 if (frame->timestamp() == retransmitted_timestamp_) { | 737 if (frame->timestamp() == retransmitted_timestamp_) { |
739 EXPECT_TRUE(frame_retransmitted_); | 738 EXPECT_TRUE(frame_retransmitted_); |
740 observation_complete_->Set(); | 739 observation_complete_.Set(); |
741 } | 740 } |
742 } | 741 } |
743 | 742 |
744 void ModifyConfigs(VideoSendStream::Config* send_config, | 743 void ModifyConfigs(VideoSendStream::Config* send_config, |
745 std::vector<VideoReceiveStream::Config>* receive_configs, | 744 std::vector<VideoReceiveStream::Config>* receive_configs, |
746 VideoEncoderConfig* encoder_config) override { | 745 VideoEncoderConfig* encoder_config) override { |
747 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 746 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
748 (*receive_configs)[0].pre_render_callback = this; | 747 (*receive_configs)[0].pre_render_callback = this; |
749 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 748 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
750 | 749 |
751 if (payload_type_ == kRedPayloadType) { | 750 if (payload_type_ == kRedPayloadType) { |
752 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; | 751 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; |
753 send_config->rtp.fec.red_payload_type = kRedPayloadType; | 752 send_config->rtp.fec.red_payload_type = kRedPayloadType; |
754 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType; | 753 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType; |
755 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; | 754 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; |
756 } | 755 } |
757 | 756 |
758 if (retransmission_ssrc_ == kSendRtxSsrcs[0]) { | 757 if (retransmission_ssrc_ == kSendRtxSsrcs[0]) { |
759 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); | 758 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); |
760 send_config->rtp.rtx.payload_type = kSendRtxPayloadType; | 759 send_config->rtp.rtx.payload_type = kSendRtxPayloadType; |
761 (*receive_configs)[0].rtp.rtx[kFakeSendPayloadType].ssrc = | 760 (*receive_configs)[0].rtp.rtx[kFakeSendPayloadType].ssrc = |
762 kSendRtxSsrcs[0]; | 761 kSendRtxSsrcs[0]; |
763 (*receive_configs)[0].rtp.rtx[kFakeSendPayloadType].payload_type = | 762 (*receive_configs)[0].rtp.rtx[kFakeSendPayloadType].payload_type = |
764 kSendRtxPayloadType; | 763 kSendRtxPayloadType; |
765 } | 764 } |
766 } | 765 } |
767 | 766 |
768 void PerformTest() override { | 767 void PerformTest() override { |
769 EXPECT_EQ(kEventSignaled, Wait()) | 768 EXPECT_TRUE(Wait()) |
770 << "Timed out while waiting for retransmission to render."; | 769 << "Timed out while waiting for retransmission to render."; |
771 } | 770 } |
772 | 771 |
773 int GetPayloadType(bool use_rtx, bool use_red) { | 772 int GetPayloadType(bool use_rtx, bool use_red) { |
774 return use_rtx ? kSendRtxPayloadType | 773 return use_rtx ? kSendRtxPayloadType |
775 : (use_red ? kRedPayloadType : kFakeSendPayloadType); | 774 : (use_red ? kRedPayloadType : kFakeSendPayloadType); |
776 } | 775 } |
777 | 776 |
778 rtc::CriticalSection crit_; | 777 rtc::CriticalSection crit_; |
779 const int payload_type_; | 778 const int payload_type_; |
(...skipping 23 matching lines...) Expand all Loading... |
803 TEST_F(EndToEndTest, DecodesRetransmittedFrameByRedOverRtx) { | 802 TEST_F(EndToEndTest, DecodesRetransmittedFrameByRedOverRtx) { |
804 DecodesRetransmittedFrame(true, true); | 803 DecodesRetransmittedFrame(true, true); |
805 } | 804 } |
806 | 805 |
807 TEST_F(EndToEndTest, UsesFrameCallbacks) { | 806 TEST_F(EndToEndTest, UsesFrameCallbacks) { |
808 static const int kWidth = 320; | 807 static const int kWidth = 320; |
809 static const int kHeight = 240; | 808 static const int kHeight = 240; |
810 | 809 |
811 class Renderer : public VideoRenderer { | 810 class Renderer : public VideoRenderer { |
812 public: | 811 public: |
813 Renderer() : event_(EventWrapper::Create()) {} | 812 Renderer() : event_(false, false) {} |
814 | 813 |
815 void RenderFrame(const VideoFrame& video_frame, | 814 void RenderFrame(const VideoFrame& video_frame, |
816 int /*time_to_render_ms*/) override { | 815 int /*time_to_render_ms*/) override { |
817 EXPECT_EQ(0, *video_frame.buffer(kYPlane)) | 816 EXPECT_EQ(0, *video_frame.buffer(kYPlane)) |
818 << "Rendered frame should have zero luma which is applied by the " | 817 << "Rendered frame should have zero luma which is applied by the " |
819 "pre-render callback."; | 818 "pre-render callback."; |
820 event_->Set(); | 819 event_.Set(); |
821 } | 820 } |
822 | 821 |
823 bool IsTextureSupported() const override { return false; } | 822 bool IsTextureSupported() const override { return false; } |
824 | 823 |
825 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); } | 824 bool Wait() { return event_.Wait(kDefaultTimeoutMs); } |
826 rtc::scoped_ptr<EventWrapper> event_; | 825 rtc::Event event_; |
827 } renderer; | 826 } renderer; |
828 | 827 |
829 class TestFrameCallback : public I420FrameCallback { | 828 class TestFrameCallback : public I420FrameCallback { |
830 public: | 829 public: |
831 TestFrameCallback(int expected_luma_byte, int next_luma_byte) | 830 TestFrameCallback(int expected_luma_byte, int next_luma_byte) |
832 : event_(EventWrapper::Create()), | 831 : event_(false, false), |
833 expected_luma_byte_(expected_luma_byte), | 832 expected_luma_byte_(expected_luma_byte), |
834 next_luma_byte_(next_luma_byte) {} | 833 next_luma_byte_(next_luma_byte) {} |
835 | 834 |
836 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); } | 835 bool Wait() { return event_.Wait(kDefaultTimeoutMs); } |
837 | 836 |
838 private: | 837 private: |
839 virtual void FrameCallback(VideoFrame* frame) { | 838 virtual void FrameCallback(VideoFrame* frame) { |
840 EXPECT_EQ(kWidth, frame->width()) | 839 EXPECT_EQ(kWidth, frame->width()) |
841 << "Width not as expected, callback done before resize?"; | 840 << "Width not as expected, callback done before resize?"; |
842 EXPECT_EQ(kHeight, frame->height()) | 841 EXPECT_EQ(kHeight, frame->height()) |
843 << "Height not as expected, callback done before resize?"; | 842 << "Height not as expected, callback done before resize?"; |
844 | 843 |
845 // Previous luma specified, observed luma should be fairly close. | 844 // Previous luma specified, observed luma should be fairly close. |
846 if (expected_luma_byte_ != -1) { | 845 if (expected_luma_byte_ != -1) { |
847 EXPECT_NEAR(expected_luma_byte_, *frame->buffer(kYPlane), 10); | 846 EXPECT_NEAR(expected_luma_byte_, *frame->buffer(kYPlane), 10); |
848 } | 847 } |
849 | 848 |
850 memset(frame->buffer(kYPlane), | 849 memset(frame->buffer(kYPlane), |
851 next_luma_byte_, | 850 next_luma_byte_, |
852 frame->allocated_size(kYPlane)); | 851 frame->allocated_size(kYPlane)); |
853 | 852 |
854 event_->Set(); | 853 event_.Set(); |
855 } | 854 } |
856 | 855 |
857 rtc::scoped_ptr<EventWrapper> event_; | 856 rtc::Event event_; |
858 int expected_luma_byte_; | 857 int expected_luma_byte_; |
859 int next_luma_byte_; | 858 int next_luma_byte_; |
860 }; | 859 }; |
861 | 860 |
862 TestFrameCallback pre_encode_callback(-1, 255); // Changes luma to 255. | 861 TestFrameCallback pre_encode_callback(-1, 255); // Changes luma to 255. |
863 TestFrameCallback pre_render_callback(255, 0); // Changes luma from 255 to 0. | 862 TestFrameCallback pre_render_callback(255, 0); // Changes luma from 255 to 0. |
864 | 863 |
865 CreateCalls(Call::Config(), Call::Config()); | 864 CreateCalls(Call::Config(), Call::Config()); |
866 | 865 |
867 test::DirectTransport sender_transport(sender_call_.get()); | 866 test::DirectTransport sender_transport(sender_call_.get()); |
(...skipping 17 matching lines...) Expand all Loading... |
885 | 884 |
886 CreateStreams(); | 885 CreateStreams(); |
887 Start(); | 886 Start(); |
888 | 887 |
889 // Create frames that are smaller than the send width/height, this is done to | 888 // Create frames that are smaller than the send width/height, this is done to |
890 // check that the callbacks are done after processing video. | 889 // check that the callbacks are done after processing video. |
891 rtc::scoped_ptr<test::FrameGenerator> frame_generator( | 890 rtc::scoped_ptr<test::FrameGenerator> frame_generator( |
892 test::FrameGenerator::CreateChromaGenerator(kWidth / 2, kHeight / 2)); | 891 test::FrameGenerator::CreateChromaGenerator(kWidth / 2, kHeight / 2)); |
893 send_stream_->Input()->IncomingCapturedFrame(*frame_generator->NextFrame()); | 892 send_stream_->Input()->IncomingCapturedFrame(*frame_generator->NextFrame()); |
894 | 893 |
895 EXPECT_EQ(kEventSignaled, pre_encode_callback.Wait()) | 894 EXPECT_TRUE(pre_encode_callback.Wait()) |
896 << "Timed out while waiting for pre-encode callback."; | 895 << "Timed out while waiting for pre-encode callback."; |
897 EXPECT_EQ(kEventSignaled, pre_render_callback.Wait()) | 896 EXPECT_TRUE(pre_render_callback.Wait()) |
898 << "Timed out while waiting for pre-render callback."; | 897 << "Timed out while waiting for pre-render callback."; |
899 EXPECT_EQ(kEventSignaled, renderer.Wait()) | 898 EXPECT_TRUE(renderer.Wait()) |
900 << "Timed out while waiting for the frame to render."; | 899 << "Timed out while waiting for the frame to render."; |
901 | 900 |
902 Stop(); | 901 Stop(); |
903 | 902 |
904 sender_transport.StopSending(); | 903 sender_transport.StopSending(); |
905 receiver_transport.StopSending(); | 904 receiver_transport.StopSending(); |
906 | 905 |
907 DestroyStreams(); | 906 DestroyStreams(); |
908 } | 907 } |
909 | 908 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
956 } | 955 } |
957 } | 956 } |
958 return SEND_PACKET; | 957 return SEND_PACKET; |
959 } | 958 } |
960 | 959 |
961 void RenderFrame(const VideoFrame& video_frame, | 960 void RenderFrame(const VideoFrame& video_frame, |
962 int time_to_render_ms) override { | 961 int time_to_render_ms) override { |
963 rtc::CritScope lock(&crit_); | 962 rtc::CritScope lock(&crit_); |
964 if (received_pli_ && | 963 if (received_pli_ && |
965 video_frame.timestamp() > highest_dropped_timestamp_) { | 964 video_frame.timestamp() > highest_dropped_timestamp_) { |
966 observation_complete_->Set(); | 965 observation_complete_.Set(); |
967 } | 966 } |
968 if (!received_pli_) | 967 if (!received_pli_) |
969 frames_to_drop_ = kPacketsToDrop; | 968 frames_to_drop_ = kPacketsToDrop; |
970 } | 969 } |
971 | 970 |
972 bool IsTextureSupported() const override { return false; } | 971 bool IsTextureSupported() const override { return false; } |
973 | 972 |
974 void ModifyConfigs(VideoSendStream::Config* send_config, | 973 void ModifyConfigs(VideoSendStream::Config* send_config, |
975 std::vector<VideoReceiveStream::Config>* receive_configs, | 974 std::vector<VideoReceiveStream::Config>* receive_configs, |
976 VideoEncoderConfig* encoder_config) override { | 975 VideoEncoderConfig* encoder_config) override { |
977 send_config->rtp.nack.rtp_history_ms = rtp_history_ms_; | 976 send_config->rtp.nack.rtp_history_ms = rtp_history_ms_; |
978 (*receive_configs)[0].rtp.nack.rtp_history_ms = rtp_history_ms_; | 977 (*receive_configs)[0].rtp.nack.rtp_history_ms = rtp_history_ms_; |
979 (*receive_configs)[0].renderer = this; | 978 (*receive_configs)[0].renderer = this; |
980 } | 979 } |
981 | 980 |
982 void PerformTest() override { | 981 void PerformTest() override { |
983 EXPECT_EQ(kEventSignaled, Wait()) << "Timed out waiting for PLI to be " | 982 EXPECT_TRUE(Wait()) << "Timed out waiting for PLI to be " |
984 "received and a frame to be " | 983 "received and a frame to be " |
985 "rendered afterwards."; | 984 "rendered afterwards."; |
986 } | 985 } |
987 | 986 |
988 rtc::CriticalSection crit_; | 987 rtc::CriticalSection crit_; |
989 int rtp_history_ms_; | 988 int rtp_history_ms_; |
990 bool nack_enabled_; | 989 bool nack_enabled_; |
991 uint32_t highest_dropped_timestamp_ GUARDED_BY(&crit_); | 990 uint32_t highest_dropped_timestamp_ GUARDED_BY(&crit_); |
992 int frames_to_drop_ GUARDED_BY(&crit_); | 991 int frames_to_drop_ GUARDED_BY(&crit_); |
993 bool received_pli_ GUARDED_BY(&crit_); | 992 bool received_pli_ GUARDED_BY(&crit_); |
994 } test(rtp_history_ms); | 993 } test(rtp_history_ms); |
995 | 994 |
996 RunBaseTest(&test, FakeNetworkPipe::Config()); | 995 RunBaseTest(&test, FakeNetworkPipe::Config()); |
997 } | 996 } |
998 | 997 |
999 TEST_F(EndToEndTest, ReceivesPliAndRecoversWithNack) { | 998 TEST_F(EndToEndTest, ReceivesPliAndRecoversWithNack) { |
1000 ReceivesPliAndRecovers(1000); | 999 ReceivesPliAndRecovers(1000); |
1001 } | 1000 } |
1002 | 1001 |
1003 TEST_F(EndToEndTest, ReceivesPliAndRecoversWithoutNack) { | 1002 TEST_F(EndToEndTest, ReceivesPliAndRecoversWithoutNack) { |
1004 ReceivesPliAndRecovers(0); | 1003 ReceivesPliAndRecovers(0); |
1005 } | 1004 } |
1006 | 1005 |
1007 TEST_F(EndToEndTest, UnknownRtpPacketGivesUnknownSsrcReturnCode) { | 1006 TEST_F(EndToEndTest, UnknownRtpPacketGivesUnknownSsrcReturnCode) { |
1008 class PacketInputObserver : public PacketReceiver { | 1007 class PacketInputObserver : public PacketReceiver { |
1009 public: | 1008 public: |
1010 explicit PacketInputObserver(PacketReceiver* receiver) | 1009 explicit PacketInputObserver(PacketReceiver* receiver) |
1011 : receiver_(receiver), delivered_packet_(EventWrapper::Create()) {} | 1010 : receiver_(receiver), delivered_packet_(false, false) {} |
1012 | 1011 |
1013 EventTypeWrapper Wait() { | 1012 bool Wait() { return delivered_packet_.Wait(kDefaultTimeoutMs); } |
1014 return delivered_packet_->Wait(kDefaultTimeoutMs); | |
1015 } | |
1016 | 1013 |
1017 private: | 1014 private: |
1018 DeliveryStatus DeliverPacket(MediaType media_type, | 1015 DeliveryStatus DeliverPacket(MediaType media_type, |
1019 const uint8_t* packet, | 1016 const uint8_t* packet, |
1020 size_t length, | 1017 size_t length, |
1021 const PacketTime& packet_time) override { | 1018 const PacketTime& packet_time) override { |
1022 if (RtpHeaderParser::IsRtcp(packet, length)) { | 1019 if (RtpHeaderParser::IsRtcp(packet, length)) { |
1023 return receiver_->DeliverPacket(media_type, packet, length, | 1020 return receiver_->DeliverPacket(media_type, packet, length, |
1024 packet_time); | 1021 packet_time); |
1025 } else { | 1022 } else { |
1026 DeliveryStatus delivery_status = | 1023 DeliveryStatus delivery_status = |
1027 receiver_->DeliverPacket(media_type, packet, length, packet_time); | 1024 receiver_->DeliverPacket(media_type, packet, length, packet_time); |
1028 EXPECT_EQ(DELIVERY_UNKNOWN_SSRC, delivery_status); | 1025 EXPECT_EQ(DELIVERY_UNKNOWN_SSRC, delivery_status); |
1029 delivered_packet_->Set(); | 1026 delivered_packet_.Set(); |
1030 return delivery_status; | 1027 return delivery_status; |
1031 } | 1028 } |
1032 } | 1029 } |
1033 | 1030 |
1034 PacketReceiver* receiver_; | 1031 PacketReceiver* receiver_; |
1035 rtc::scoped_ptr<EventWrapper> delivered_packet_; | 1032 rtc::Event delivered_packet_; |
1036 }; | 1033 }; |
1037 | 1034 |
1038 CreateCalls(Call::Config(), Call::Config()); | 1035 CreateCalls(Call::Config(), Call::Config()); |
1039 | 1036 |
1040 test::DirectTransport send_transport(sender_call_.get()); | 1037 test::DirectTransport send_transport(sender_call_.get()); |
1041 test::DirectTransport receive_transport(receiver_call_.get()); | 1038 test::DirectTransport receive_transport(receiver_call_.get()); |
1042 PacketInputObserver input_observer(receiver_call_->Receiver()); | 1039 PacketInputObserver input_observer(receiver_call_->Receiver()); |
1043 send_transport.SetReceiver(&input_observer); | 1040 send_transport.SetReceiver(&input_observer); |
1044 receive_transport.SetReceiver(sender_call_->Receiver()); | 1041 receive_transport.SetReceiver(sender_call_->Receiver()); |
1045 | 1042 |
1046 CreateSendConfig(1, &send_transport); | 1043 CreateSendConfig(1, &send_transport); |
1047 CreateMatchingReceiveConfigs(&receive_transport); | 1044 CreateMatchingReceiveConfigs(&receive_transport); |
1048 | 1045 |
1049 CreateStreams(); | 1046 CreateStreams(); |
1050 CreateFrameGeneratorCapturer(); | 1047 CreateFrameGeneratorCapturer(); |
1051 Start(); | 1048 Start(); |
1052 | 1049 |
1053 receiver_call_->DestroyVideoReceiveStream(receive_streams_[0]); | 1050 receiver_call_->DestroyVideoReceiveStream(receive_streams_[0]); |
1054 receive_streams_.clear(); | 1051 receive_streams_.clear(); |
1055 | 1052 |
1056 // Wait() waits for a received packet. | 1053 // Wait() waits for a received packet. |
1057 EXPECT_EQ(kEventSignaled, input_observer.Wait()); | 1054 EXPECT_TRUE(input_observer.Wait()); |
1058 | 1055 |
1059 Stop(); | 1056 Stop(); |
1060 | 1057 |
1061 DestroyStreams(); | 1058 DestroyStreams(); |
1062 | 1059 |
1063 send_transport.StopSending(); | 1060 send_transport.StopSending(); |
1064 receive_transport.StopSending(); | 1061 receive_transport.StopSending(); |
1065 } | 1062 } |
1066 | 1063 |
1067 void EndToEndTest::RespectsRtcpMode(RtcpMode rtcp_mode) { | 1064 void EndToEndTest::RespectsRtcpMode(RtcpMode rtcp_mode) { |
(...skipping 28 matching lines...) Expand all Loading... |
1096 break; | 1093 break; |
1097 } | 1094 } |
1098 packet_type = parser.Iterate(); | 1095 packet_type = parser.Iterate(); |
1099 } | 1096 } |
1100 | 1097 |
1101 switch (rtcp_mode_) { | 1098 switch (rtcp_mode_) { |
1102 case RtcpMode::kCompound: | 1099 case RtcpMode::kCompound: |
1103 if (!has_report_block) { | 1100 if (!has_report_block) { |
1104 ADD_FAILURE() << "Received RTCP packet without receiver report for " | 1101 ADD_FAILURE() << "Received RTCP packet without receiver report for " |
1105 "RtcpMode::kCompound."; | 1102 "RtcpMode::kCompound."; |
1106 observation_complete_->Set(); | 1103 observation_complete_.Set(); |
1107 } | 1104 } |
1108 | 1105 |
1109 if (sent_rtcp_ >= kNumCompoundRtcpPacketsToObserve) | 1106 if (sent_rtcp_ >= kNumCompoundRtcpPacketsToObserve) |
1110 observation_complete_->Set(); | 1107 observation_complete_.Set(); |
1111 | 1108 |
1112 break; | 1109 break; |
1113 case RtcpMode::kReducedSize: | 1110 case RtcpMode::kReducedSize: |
1114 if (!has_report_block) | 1111 if (!has_report_block) |
1115 observation_complete_->Set(); | 1112 observation_complete_.Set(); |
1116 break; | 1113 break; |
1117 case RtcpMode::kOff: | 1114 case RtcpMode::kOff: |
1118 RTC_NOTREACHED(); | 1115 RTC_NOTREACHED(); |
1119 break; | 1116 break; |
1120 } | 1117 } |
1121 | 1118 |
1122 return SEND_PACKET; | 1119 return SEND_PACKET; |
1123 } | 1120 } |
1124 | 1121 |
1125 void ModifyConfigs(VideoSendStream::Config* send_config, | 1122 void ModifyConfigs(VideoSendStream::Config* send_config, |
1126 std::vector<VideoReceiveStream::Config>* receive_configs, | 1123 std::vector<VideoReceiveStream::Config>* receive_configs, |
1127 VideoEncoderConfig* encoder_config) override { | 1124 VideoEncoderConfig* encoder_config) override { |
1128 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 1125 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
1129 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 1126 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
1130 (*receive_configs)[0].rtp.rtcp_mode = rtcp_mode_; | 1127 (*receive_configs)[0].rtp.rtcp_mode = rtcp_mode_; |
1131 } | 1128 } |
1132 | 1129 |
1133 void PerformTest() override { | 1130 void PerformTest() override { |
1134 EXPECT_EQ(kEventSignaled, Wait()) | 1131 EXPECT_TRUE(Wait()) |
1135 << (rtcp_mode_ == RtcpMode::kCompound | 1132 << (rtcp_mode_ == RtcpMode::kCompound |
1136 ? "Timed out before observing enough compound packets." | 1133 ? "Timed out before observing enough compound packets." |
1137 : "Timed out before receiving a non-compound RTCP packet."); | 1134 : "Timed out before receiving a non-compound RTCP packet."); |
1138 } | 1135 } |
1139 | 1136 |
1140 RtcpMode rtcp_mode_; | 1137 RtcpMode rtcp_mode_; |
1141 int sent_rtp_; | 1138 int sent_rtp_; |
1142 int sent_rtcp_; | 1139 int sent_rtcp_; |
1143 } test(rtcp_mode); | 1140 } test(rtcp_mode); |
1144 | 1141 |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1275 // as every renderer has received a frame, the test finishes. | 1272 // as every renderer has received a frame, the test finishes. |
1276 TEST_F(EndToEndTest, SendsAndReceivesMultipleStreams) { | 1273 TEST_F(EndToEndTest, SendsAndReceivesMultipleStreams) { |
1277 class VideoOutputObserver : public VideoRenderer { | 1274 class VideoOutputObserver : public VideoRenderer { |
1278 public: | 1275 public: |
1279 VideoOutputObserver(const MultiStreamTest::CodecSettings& settings, | 1276 VideoOutputObserver(const MultiStreamTest::CodecSettings& settings, |
1280 uint32_t ssrc, | 1277 uint32_t ssrc, |
1281 test::FrameGeneratorCapturer** frame_generator) | 1278 test::FrameGeneratorCapturer** frame_generator) |
1282 : settings_(settings), | 1279 : settings_(settings), |
1283 ssrc_(ssrc), | 1280 ssrc_(ssrc), |
1284 frame_generator_(frame_generator), | 1281 frame_generator_(frame_generator), |
1285 done_(EventWrapper::Create()) {} | 1282 done_(false, false) {} |
1286 | 1283 |
1287 void RenderFrame(const VideoFrame& video_frame, | 1284 void RenderFrame(const VideoFrame& video_frame, |
1288 int time_to_render_ms) override { | 1285 int time_to_render_ms) override { |
1289 EXPECT_EQ(settings_.width, video_frame.width()); | 1286 EXPECT_EQ(settings_.width, video_frame.width()); |
1290 EXPECT_EQ(settings_.height, video_frame.height()); | 1287 EXPECT_EQ(settings_.height, video_frame.height()); |
1291 (*frame_generator_)->Stop(); | 1288 (*frame_generator_)->Stop(); |
1292 done_->Set(); | 1289 done_.Set(); |
1293 } | 1290 } |
1294 | 1291 |
1295 uint32_t Ssrc() { return ssrc_; } | 1292 uint32_t Ssrc() { return ssrc_; } |
1296 | 1293 |
1297 bool IsTextureSupported() const override { return false; } | 1294 bool IsTextureSupported() const override { return false; } |
1298 | 1295 |
1299 EventTypeWrapper Wait() { return done_->Wait(kDefaultTimeoutMs); } | 1296 bool Wait() { return done_.Wait(kDefaultTimeoutMs); } |
1300 | 1297 |
1301 private: | 1298 private: |
1302 const MultiStreamTest::CodecSettings& settings_; | 1299 const MultiStreamTest::CodecSettings& settings_; |
1303 const uint32_t ssrc_; | 1300 const uint32_t ssrc_; |
1304 test::FrameGeneratorCapturer** const frame_generator_; | 1301 test::FrameGeneratorCapturer** const frame_generator_; |
1305 rtc::scoped_ptr<EventWrapper> done_; | 1302 rtc::Event done_; |
1306 }; | 1303 }; |
1307 | 1304 |
1308 class Tester : public MultiStreamTest { | 1305 class Tester : public MultiStreamTest { |
1309 public: | 1306 public: |
1310 Tester() {} | 1307 Tester() {} |
1311 virtual ~Tester() {} | 1308 virtual ~Tester() {} |
1312 | 1309 |
1313 protected: | 1310 protected: |
1314 void Wait() override { | 1311 void Wait() override { |
1315 for (const auto& observer : observers_) { | 1312 for (const auto& observer : observers_) { |
1316 EXPECT_EQ(EventTypeWrapper::kEventSignaled, observer->Wait()) | 1313 EXPECT_TRUE(observer->Wait()) << "Time out waiting for from on ssrc " |
1317 << "Time out waiting for from on ssrc " << observer->Ssrc(); | 1314 << observer->Ssrc(); |
1318 } | 1315 } |
1319 } | 1316 } |
1320 | 1317 |
1321 void UpdateSendConfig( | 1318 void UpdateSendConfig( |
1322 size_t stream_index, | 1319 size_t stream_index, |
1323 VideoSendStream::Config* send_config, | 1320 VideoSendStream::Config* send_config, |
1324 VideoEncoderConfig* encoder_config, | 1321 VideoEncoderConfig* encoder_config, |
1325 test::FrameGeneratorCapturer** frame_generator) override { | 1322 test::FrameGeneratorCapturer** frame_generator) override { |
1326 observers_[stream_index].reset(new VideoOutputObserver( | 1323 observers_[stream_index].reset(new VideoOutputObserver( |
1327 codec_settings[stream_index], send_config->rtp.ssrcs.front(), | 1324 codec_settings[stream_index], send_config->rtp.ssrcs.front(), |
(...skipping 15 matching lines...) Expand all Loading... |
1343 | 1340 |
1344 TEST_F(EndToEndTest, AssignsTransportSequenceNumbers) { | 1341 TEST_F(EndToEndTest, AssignsTransportSequenceNumbers) { |
1345 static const int kExtensionId = 5; | 1342 static const int kExtensionId = 5; |
1346 | 1343 |
1347 class RtpExtensionHeaderObserver : public test::DirectTransport { | 1344 class RtpExtensionHeaderObserver : public test::DirectTransport { |
1348 public: | 1345 public: |
1349 RtpExtensionHeaderObserver(Call* sender_call, | 1346 RtpExtensionHeaderObserver(Call* sender_call, |
1350 const uint32_t& first_media_ssrc, | 1347 const uint32_t& first_media_ssrc, |
1351 const std::map<uint32_t, uint32_t>& ssrc_map) | 1348 const std::map<uint32_t, uint32_t>& ssrc_map) |
1352 : DirectTransport(sender_call), | 1349 : DirectTransport(sender_call), |
1353 done_(EventWrapper::Create()), | 1350 done_(false, false), |
1354 parser_(RtpHeaderParser::Create()), | 1351 parser_(RtpHeaderParser::Create()), |
1355 first_media_ssrc_(first_media_ssrc), | 1352 first_media_ssrc_(first_media_ssrc), |
1356 rtx_to_media_ssrcs_(ssrc_map), | 1353 rtx_to_media_ssrcs_(ssrc_map), |
1357 padding_observed_(false), | 1354 padding_observed_(false), |
1358 rtx_padding_observed_(false), | 1355 rtx_padding_observed_(false), |
1359 retransmit_observed_(false), | 1356 retransmit_observed_(false), |
1360 started_(false) { | 1357 started_(false) { |
1361 parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber, | 1358 parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber, |
1362 kExtensionId); | 1359 kExtensionId); |
1363 } | 1360 } |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1412 retransmit_observed_ = true; | 1409 retransmit_observed_ = true; |
1413 seq_no_map->erase(it); | 1410 seq_no_map->erase(it); |
1414 } else { | 1411 } else { |
1415 rtx_padding_observed_ = true; | 1412 rtx_padding_observed_ = true; |
1416 } | 1413 } |
1417 } else { | 1414 } else { |
1418 streams_observed_.insert(header.ssrc); | 1415 streams_observed_.insert(header.ssrc); |
1419 } | 1416 } |
1420 | 1417 |
1421 if (IsDone()) | 1418 if (IsDone()) |
1422 done_->Set(); | 1419 done_.Set(); |
1423 | 1420 |
1424 if (drop_packet) | 1421 if (drop_packet) |
1425 return true; | 1422 return true; |
1426 } | 1423 } |
1427 } | 1424 } |
1428 | 1425 |
1429 return test::DirectTransport::SendRtp(data, length, options); | 1426 return test::DirectTransport::SendRtp(data, length, options); |
1430 } | 1427 } |
1431 | 1428 |
1432 bool IsDone() { | 1429 bool IsDone() { |
1433 bool observed_types_ok = | 1430 bool observed_types_ok = |
1434 streams_observed_.size() == MultiStreamTest::kNumStreams && | 1431 streams_observed_.size() == MultiStreamTest::kNumStreams && |
1435 padding_observed_ && retransmit_observed_ && rtx_padding_observed_; | 1432 padding_observed_ && retransmit_observed_ && rtx_padding_observed_; |
1436 if (!observed_types_ok) | 1433 if (!observed_types_ok) |
1437 return false; | 1434 return false; |
1438 // We should not have any gaps in the sequence number range. | 1435 // We should not have any gaps in the sequence number range. |
1439 size_t seqno_range = | 1436 size_t seqno_range = |
1440 *received_packed_ids_.rbegin() - *received_packed_ids_.begin() + 1; | 1437 *received_packed_ids_.rbegin() - *received_packed_ids_.begin() + 1; |
1441 return seqno_range == received_packed_ids_.size(); | 1438 return seqno_range == received_packed_ids_.size(); |
1442 } | 1439 } |
1443 | 1440 |
1444 EventTypeWrapper Wait() { | 1441 bool Wait() { |
1445 { | 1442 { |
1446 // Can't be sure until this point that rtx_to_media_ssrcs_ etc have | 1443 // Can't be sure until this point that rtx_to_media_ssrcs_ etc have |
1447 // been initialized and are OK to read. | 1444 // been initialized and are OK to read. |
1448 rtc::CritScope cs(&lock_); | 1445 rtc::CritScope cs(&lock_); |
1449 started_ = true; | 1446 started_ = true; |
1450 } | 1447 } |
1451 return done_->Wait(kDefaultTimeoutMs); | 1448 return done_.Wait(kDefaultTimeoutMs); |
1452 } | 1449 } |
1453 | 1450 |
1454 rtc::CriticalSection lock_; | 1451 rtc::CriticalSection lock_; |
1455 rtc::scoped_ptr<EventWrapper> done_; | 1452 rtc::Event done_; |
1456 rtc::scoped_ptr<RtpHeaderParser> parser_; | 1453 rtc::scoped_ptr<RtpHeaderParser> parser_; |
1457 SequenceNumberUnwrapper unwrapper_; | 1454 SequenceNumberUnwrapper unwrapper_; |
1458 std::set<int64_t> received_packed_ids_; | 1455 std::set<int64_t> received_packed_ids_; |
1459 std::set<uint32_t> streams_observed_; | 1456 std::set<uint32_t> streams_observed_; |
1460 std::map<uint32_t, std::set<uint16_t>> dropped_seq_; | 1457 std::map<uint32_t, std::set<uint16_t>> dropped_seq_; |
1461 const uint32_t& first_media_ssrc_; | 1458 const uint32_t& first_media_ssrc_; |
1462 const std::map<uint32_t, uint32_t>& rtx_to_media_ssrcs_; | 1459 const std::map<uint32_t, uint32_t>& rtx_to_media_ssrcs_; |
1463 bool padding_observed_; | 1460 bool padding_observed_; |
1464 bool rtx_padding_observed_; | 1461 bool rtx_padding_observed_; |
1465 bool retransmit_observed_; | 1462 bool retransmit_observed_; |
1466 bool started_; | 1463 bool started_; |
1467 }; | 1464 }; |
1468 | 1465 |
1469 class TransportSequenceNumberTester : public MultiStreamTest { | 1466 class TransportSequenceNumberTester : public MultiStreamTest { |
1470 public: | 1467 public: |
1471 TransportSequenceNumberTester() | 1468 TransportSequenceNumberTester() |
1472 : first_media_ssrc_(0), observer_(nullptr) {} | 1469 : first_media_ssrc_(0), observer_(nullptr) {} |
1473 virtual ~TransportSequenceNumberTester() {} | 1470 virtual ~TransportSequenceNumberTester() {} |
1474 | 1471 |
1475 protected: | 1472 protected: |
1476 void Wait() override { | 1473 void Wait() override { |
1477 RTC_DCHECK(observer_ != nullptr); | 1474 RTC_DCHECK(observer_ != nullptr); |
1478 EXPECT_EQ(EventTypeWrapper::kEventSignaled, observer_->Wait()); | 1475 EXPECT_TRUE(observer_->Wait()); |
1479 } | 1476 } |
1480 | 1477 |
1481 void UpdateSendConfig( | 1478 void UpdateSendConfig( |
1482 size_t stream_index, | 1479 size_t stream_index, |
1483 VideoSendStream::Config* send_config, | 1480 VideoSendStream::Config* send_config, |
1484 VideoEncoderConfig* encoder_config, | 1481 VideoEncoderConfig* encoder_config, |
1485 test::FrameGeneratorCapturer** frame_generator) override { | 1482 test::FrameGeneratorCapturer** frame_generator) override { |
1486 send_config->rtp.extensions.clear(); | 1483 send_config->rtp.extensions.clear(); |
1487 send_config->rtp.extensions.push_back( | 1484 send_config->rtp.extensions.push_back( |
1488 RtpExtension(RtpExtension::kTransportSequenceNumber, kExtensionId)); | 1485 RtpExtension(RtpExtension::kTransportSequenceNumber, kExtensionId)); |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1605 } | 1602 } |
1606 | 1603 |
1607 TEST_F(EndToEndTest, TransportFeedbackNotConfigured) { | 1604 TEST_F(EndToEndTest, TransportFeedbackNotConfigured) { |
1608 TransportFeedbackTest(false); | 1605 TransportFeedbackTest(false); |
1609 } | 1606 } |
1610 | 1607 |
1611 TEST_F(EndToEndTest, ObserversEncodedFrames) { | 1608 TEST_F(EndToEndTest, ObserversEncodedFrames) { |
1612 class EncodedFrameTestObserver : public EncodedFrameObserver { | 1609 class EncodedFrameTestObserver : public EncodedFrameObserver { |
1613 public: | 1610 public: |
1614 EncodedFrameTestObserver() | 1611 EncodedFrameTestObserver() |
1615 : length_(0), | 1612 : length_(0), frame_type_(kEmptyFrame), called_(false, false) {} |
1616 frame_type_(kEmptyFrame), | |
1617 called_(EventWrapper::Create()) {} | |
1618 virtual ~EncodedFrameTestObserver() {} | 1613 virtual ~EncodedFrameTestObserver() {} |
1619 | 1614 |
1620 virtual void EncodedFrameCallback(const EncodedFrame& encoded_frame) { | 1615 virtual void EncodedFrameCallback(const EncodedFrame& encoded_frame) { |
1621 frame_type_ = encoded_frame.frame_type_; | 1616 frame_type_ = encoded_frame.frame_type_; |
1622 length_ = encoded_frame.length_; | 1617 length_ = encoded_frame.length_; |
1623 buffer_.reset(new uint8_t[length_]); | 1618 buffer_.reset(new uint8_t[length_]); |
1624 memcpy(buffer_.get(), encoded_frame.data_, length_); | 1619 memcpy(buffer_.get(), encoded_frame.data_, length_); |
1625 called_->Set(); | 1620 called_.Set(); |
1626 } | 1621 } |
1627 | 1622 |
1628 EventTypeWrapper Wait() { return called_->Wait(kDefaultTimeoutMs); } | 1623 bool Wait() { return called_.Wait(kDefaultTimeoutMs); } |
1629 | 1624 |
1630 void ExpectEqualFrames(const EncodedFrameTestObserver& observer) { | 1625 void ExpectEqualFrames(const EncodedFrameTestObserver& observer) { |
1631 ASSERT_EQ(length_, observer.length_) | 1626 ASSERT_EQ(length_, observer.length_) |
1632 << "Observed frames are of different lengths."; | 1627 << "Observed frames are of different lengths."; |
1633 EXPECT_EQ(frame_type_, observer.frame_type_) | 1628 EXPECT_EQ(frame_type_, observer.frame_type_) |
1634 << "Observed frames have different frame types."; | 1629 << "Observed frames have different frame types."; |
1635 EXPECT_EQ(0, memcmp(buffer_.get(), observer.buffer_.get(), length_)) | 1630 EXPECT_EQ(0, memcmp(buffer_.get(), observer.buffer_.get(), length_)) |
1636 << "Observed encoded frames have different content."; | 1631 << "Observed encoded frames have different content."; |
1637 } | 1632 } |
1638 | 1633 |
1639 private: | 1634 private: |
1640 rtc::scoped_ptr<uint8_t[]> buffer_; | 1635 rtc::scoped_ptr<uint8_t[]> buffer_; |
1641 size_t length_; | 1636 size_t length_; |
1642 FrameType frame_type_; | 1637 FrameType frame_type_; |
1643 rtc::scoped_ptr<EventWrapper> called_; | 1638 rtc::Event called_; |
1644 }; | 1639 }; |
1645 | 1640 |
1646 EncodedFrameTestObserver post_encode_observer; | 1641 EncodedFrameTestObserver post_encode_observer; |
1647 EncodedFrameTestObserver pre_decode_observer; | 1642 EncodedFrameTestObserver pre_decode_observer; |
1648 | 1643 |
1649 CreateCalls(Call::Config(), Call::Config()); | 1644 CreateCalls(Call::Config(), Call::Config()); |
1650 | 1645 |
1651 test::DirectTransport sender_transport(sender_call_.get()); | 1646 test::DirectTransport sender_transport(sender_call_.get()); |
1652 test::DirectTransport receiver_transport(receiver_call_.get()); | 1647 test::DirectTransport receiver_transport(receiver_call_.get()); |
1653 sender_transport.SetReceiver(receiver_call_->Receiver()); | 1648 sender_transport.SetReceiver(receiver_call_->Receiver()); |
1654 receiver_transport.SetReceiver(sender_call_->Receiver()); | 1649 receiver_transport.SetReceiver(sender_call_->Receiver()); |
1655 | 1650 |
1656 CreateSendConfig(1, &sender_transport); | 1651 CreateSendConfig(1, &sender_transport); |
1657 CreateMatchingReceiveConfigs(&receiver_transport); | 1652 CreateMatchingReceiveConfigs(&receiver_transport); |
1658 send_config_.post_encode_callback = &post_encode_observer; | 1653 send_config_.post_encode_callback = &post_encode_observer; |
1659 receive_configs_[0].pre_decode_callback = &pre_decode_observer; | 1654 receive_configs_[0].pre_decode_callback = &pre_decode_observer; |
1660 | 1655 |
1661 CreateStreams(); | 1656 CreateStreams(); |
1662 Start(); | 1657 Start(); |
1663 | 1658 |
1664 rtc::scoped_ptr<test::FrameGenerator> frame_generator( | 1659 rtc::scoped_ptr<test::FrameGenerator> frame_generator( |
1665 test::FrameGenerator::CreateChromaGenerator( | 1660 test::FrameGenerator::CreateChromaGenerator( |
1666 encoder_config_.streams[0].width, encoder_config_.streams[0].height)); | 1661 encoder_config_.streams[0].width, encoder_config_.streams[0].height)); |
1667 send_stream_->Input()->IncomingCapturedFrame(*frame_generator->NextFrame()); | 1662 send_stream_->Input()->IncomingCapturedFrame(*frame_generator->NextFrame()); |
1668 | 1663 |
1669 EXPECT_EQ(kEventSignaled, post_encode_observer.Wait()) | 1664 EXPECT_TRUE(post_encode_observer.Wait()) |
1670 << "Timed out while waiting for send-side encoded-frame callback."; | 1665 << "Timed out while waiting for send-side encoded-frame callback."; |
1671 | 1666 |
1672 EXPECT_EQ(kEventSignaled, pre_decode_observer.Wait()) | 1667 EXPECT_TRUE(pre_decode_observer.Wait()) |
1673 << "Timed out while waiting for pre-decode encoded-frame callback."; | 1668 << "Timed out while waiting for pre-decode encoded-frame callback."; |
1674 | 1669 |
1675 post_encode_observer.ExpectEqualFrames(pre_decode_observer); | 1670 post_encode_observer.ExpectEqualFrames(pre_decode_observer); |
1676 | 1671 |
1677 Stop(); | 1672 Stop(); |
1678 | 1673 |
1679 sender_transport.StopSending(); | 1674 sender_transport.StopSending(); |
1680 receiver_transport.StopSending(); | 1675 receiver_transport.StopSending(); |
1681 | 1676 |
1682 DestroyStreams(); | 1677 DestroyStreams(); |
(...skipping 19 matching lines...) Expand all Loading... |
1702 } else if (packet_type == RTCPUtility::RTCPPacketTypes::kPsfbRembItem) { | 1697 } else if (packet_type == RTCPUtility::RTCPPacketTypes::kPsfbRembItem) { |
1703 const RTCPUtility::RTCPPacket& packet = parser.Packet(); | 1698 const RTCPUtility::RTCPPacket& packet = parser.Packet(); |
1704 EXPECT_GT(packet.REMBItem.BitRate, 0u); | 1699 EXPECT_GT(packet.REMBItem.BitRate, 0u); |
1705 EXPECT_EQ(packet.REMBItem.NumberOfSSRCs, 1u); | 1700 EXPECT_EQ(packet.REMBItem.NumberOfSSRCs, 1u); |
1706 EXPECT_EQ(packet.REMBItem.SSRCs[0], kSendSsrcs[0]); | 1701 EXPECT_EQ(packet.REMBItem.SSRCs[0], kSendSsrcs[0]); |
1707 received_remb = true; | 1702 received_remb = true; |
1708 } | 1703 } |
1709 packet_type = parser.Iterate(); | 1704 packet_type = parser.Iterate(); |
1710 } | 1705 } |
1711 if (received_psfb && received_remb) | 1706 if (received_psfb && received_remb) |
1712 observation_complete_->Set(); | 1707 observation_complete_.Set(); |
1713 return SEND_PACKET; | 1708 return SEND_PACKET; |
1714 } | 1709 } |
1715 void PerformTest() override { | 1710 void PerformTest() override { |
1716 EXPECT_EQ(kEventSignaled, Wait()) << "Timed out while waiting for a " | 1711 EXPECT_TRUE(Wait()) << "Timed out while waiting for a " |
1717 "receiver RTCP REMB packet to be " | 1712 "receiver RTCP REMB packet to be " |
1718 "sent."; | 1713 "sent."; |
1719 } | 1714 } |
1720 } test; | 1715 } test; |
1721 | 1716 |
1722 RunBaseTest(&test, FakeNetworkPipe::Config()); | 1717 RunBaseTest(&test, FakeNetworkPipe::Config()); |
1723 } | 1718 } |
1724 | 1719 |
1725 TEST_F(EndToEndTest, VerifyBandwidthStats) { | 1720 TEST_F(EndToEndTest, VerifyBandwidthStats) { |
1726 class RtcpObserver : public test::EndToEndTest { | 1721 class RtcpObserver : public test::EndToEndTest { |
1727 public: | 1722 public: |
1728 RtcpObserver() | 1723 RtcpObserver() |
1729 : EndToEndTest(kDefaultTimeoutMs), | 1724 : EndToEndTest(kDefaultTimeoutMs), |
1730 sender_call_(nullptr), | 1725 sender_call_(nullptr), |
1731 receiver_call_(nullptr), | 1726 receiver_call_(nullptr), |
1732 has_seen_pacer_delay_(false) {} | 1727 has_seen_pacer_delay_(false) {} |
1733 | 1728 |
1734 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 1729 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
1735 Call::Stats sender_stats = sender_call_->GetStats(); | 1730 Call::Stats sender_stats = sender_call_->GetStats(); |
1736 Call::Stats receiver_stats = receiver_call_->GetStats(); | 1731 Call::Stats receiver_stats = receiver_call_->GetStats(); |
1737 if (!has_seen_pacer_delay_) | 1732 if (!has_seen_pacer_delay_) |
1738 has_seen_pacer_delay_ = sender_stats.pacer_delay_ms > 0; | 1733 has_seen_pacer_delay_ = sender_stats.pacer_delay_ms > 0; |
1739 if (sender_stats.send_bandwidth_bps > 0 && | 1734 if (sender_stats.send_bandwidth_bps > 0 && |
1740 receiver_stats.recv_bandwidth_bps > 0 && has_seen_pacer_delay_) { | 1735 receiver_stats.recv_bandwidth_bps > 0 && has_seen_pacer_delay_) { |
1741 observation_complete_->Set(); | 1736 observation_complete_.Set(); |
1742 } | 1737 } |
1743 return SEND_PACKET; | 1738 return SEND_PACKET; |
1744 } | 1739 } |
1745 | 1740 |
1746 void OnCallsCreated(Call* sender_call, Call* receiver_call) override { | 1741 void OnCallsCreated(Call* sender_call, Call* receiver_call) override { |
1747 sender_call_ = sender_call; | 1742 sender_call_ = sender_call; |
1748 receiver_call_ = receiver_call; | 1743 receiver_call_ = receiver_call; |
1749 } | 1744 } |
1750 | 1745 |
1751 void PerformTest() override { | 1746 void PerformTest() override { |
1752 EXPECT_EQ(kEventSignaled, Wait()) << "Timed out while waiting for " | 1747 EXPECT_TRUE(Wait()) << "Timed out while waiting for " |
1753 "non-zero bandwidth stats."; | 1748 "non-zero bandwidth stats."; |
1754 } | 1749 } |
1755 | 1750 |
1756 private: | 1751 private: |
1757 Call* sender_call_; | 1752 Call* sender_call_; |
1758 Call* receiver_call_; | 1753 Call* receiver_call_; |
1759 bool has_seen_pacer_delay_; | 1754 bool has_seen_pacer_delay_; |
1760 } test; | 1755 } test; |
1761 | 1756 |
1762 RunBaseTest(&test, FakeNetworkPipe::Config()); | 1757 RunBaseTest(&test, FakeNetworkPipe::Config()); |
1763 } | 1758 } |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1813 stream_stats.rtcp_packet_type_counts.nack_packets; | 1808 stream_stats.rtcp_packet_type_counts.nack_packets; |
1814 } | 1809 } |
1815 for (size_t i = 0; i < receive_streams_.size(); ++i) { | 1810 for (size_t i = 0; i < receive_streams_.size(); ++i) { |
1816 VideoReceiveStream::Stats stats = receive_streams_[i]->GetStats(); | 1811 VideoReceiveStream::Stats stats = receive_streams_[i]->GetStats(); |
1817 receive_stream_nack_packets += | 1812 receive_stream_nack_packets += |
1818 stats.rtcp_packet_type_counts.nack_packets; | 1813 stats.rtcp_packet_type_counts.nack_packets; |
1819 } | 1814 } |
1820 if (send_stream_nack_packets >= 1 && receive_stream_nack_packets >= 1) { | 1815 if (send_stream_nack_packets >= 1 && receive_stream_nack_packets >= 1) { |
1821 // NACK packet sent on receive stream and received on sent stream. | 1816 // NACK packet sent on receive stream and received on sent stream. |
1822 if (MinMetricRunTimePassed()) | 1817 if (MinMetricRunTimePassed()) |
1823 observation_complete_->Set(); | 1818 observation_complete_.Set(); |
1824 } | 1819 } |
1825 } | 1820 } |
1826 | 1821 |
1827 bool MinMetricRunTimePassed() { | 1822 bool MinMetricRunTimePassed() { |
1828 int64_t now = Clock::GetRealTimeClock()->TimeInMilliseconds(); | 1823 int64_t now = Clock::GetRealTimeClock()->TimeInMilliseconds(); |
1829 if (start_runtime_ms_ == -1) { | 1824 if (start_runtime_ms_ == -1) { |
1830 start_runtime_ms_ = now; | 1825 start_runtime_ms_ = now; |
1831 return false; | 1826 return false; |
1832 } | 1827 } |
1833 int64_t elapsed_sec = (now - start_runtime_ms_) / 1000; | 1828 int64_t elapsed_sec = (now - start_runtime_ms_) / 1000; |
1834 return elapsed_sec > metrics::kMinRunTimeInSeconds; | 1829 return elapsed_sec > metrics::kMinRunTimeInSeconds; |
1835 } | 1830 } |
1836 | 1831 |
1837 void ModifyConfigs(VideoSendStream::Config* send_config, | 1832 void ModifyConfigs(VideoSendStream::Config* send_config, |
1838 std::vector<VideoReceiveStream::Config>* receive_configs, | 1833 std::vector<VideoReceiveStream::Config>* receive_configs, |
1839 VideoEncoderConfig* encoder_config) override { | 1834 VideoEncoderConfig* encoder_config) override { |
1840 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 1835 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
1841 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 1836 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
1842 } | 1837 } |
1843 | 1838 |
1844 void OnStreamsCreated( | 1839 void OnStreamsCreated( |
1845 VideoSendStream* send_stream, | 1840 VideoSendStream* send_stream, |
1846 const std::vector<VideoReceiveStream*>& receive_streams) override { | 1841 const std::vector<VideoReceiveStream*>& receive_streams) override { |
1847 send_stream_ = send_stream; | 1842 send_stream_ = send_stream; |
1848 receive_streams_ = receive_streams; | 1843 receive_streams_ = receive_streams; |
1849 } | 1844 } |
1850 | 1845 |
1851 void PerformTest() override { | 1846 void PerformTest() override { |
1852 EXPECT_EQ(kEventSignaled, Wait()) | 1847 EXPECT_TRUE(Wait()) << "Timed out waiting for packet to be NACKed."; |
1853 << "Timed out waiting for packet to be NACKed."; | |
1854 } | 1848 } |
1855 | 1849 |
1856 rtc::CriticalSection crit_; | 1850 rtc::CriticalSection crit_; |
1857 uint64_t sent_rtp_packets_; | 1851 uint64_t sent_rtp_packets_; |
1858 uint16_t dropped_rtp_packet_ GUARDED_BY(&crit_); | 1852 uint16_t dropped_rtp_packet_ GUARDED_BY(&crit_); |
1859 bool dropped_rtp_packet_requested_ GUARDED_BY(&crit_); | 1853 bool dropped_rtp_packet_requested_ GUARDED_BY(&crit_); |
1860 std::vector<VideoReceiveStream*> receive_streams_; | 1854 std::vector<VideoReceiveStream*> receive_streams_; |
1861 VideoSendStream* send_stream_; | 1855 VideoSendStream* send_stream_; |
1862 int64_t start_runtime_ms_; | 1856 int64_t start_runtime_ms_; |
1863 } test; | 1857 } test; |
(...skipping 21 matching lines...) Expand all Loading... |
1885 use_rtx_(use_rtx), | 1879 use_rtx_(use_rtx), |
1886 use_red_(use_red), | 1880 use_red_(use_red), |
1887 screenshare_(screenshare), | 1881 screenshare_(screenshare), |
1888 sender_call_(nullptr), | 1882 sender_call_(nullptr), |
1889 receiver_call_(nullptr), | 1883 receiver_call_(nullptr), |
1890 start_runtime_ms_(-1) {} | 1884 start_runtime_ms_(-1) {} |
1891 | 1885 |
1892 private: | 1886 private: |
1893 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 1887 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
1894 if (MinMetricRunTimePassed()) | 1888 if (MinMetricRunTimePassed()) |
1895 observation_complete_->Set(); | 1889 observation_complete_.Set(); |
1896 | 1890 |
1897 // GetStats calls GetSendChannelRtcpStatistics | 1891 // GetStats calls GetSendChannelRtcpStatistics |
1898 // (via VideoSendStream::GetRtt) which updates ReportBlockStats used by | 1892 // (via VideoSendStream::GetRtt) which updates ReportBlockStats used by |
1899 // WebRTC.Video.SentPacketsLostInPercent. | 1893 // WebRTC.Video.SentPacketsLostInPercent. |
1900 // TODO(asapersson): Remove dependency on calling GetStats. | 1894 // TODO(asapersson): Remove dependency on calling GetStats. |
1901 sender_call_->GetStats(); | 1895 sender_call_->GetStats(); |
1902 | 1896 |
1903 return SEND_PACKET; | 1897 return SEND_PACKET; |
1904 } | 1898 } |
1905 | 1899 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1939 screenshare_ ? VideoEncoderConfig::ContentType::kScreen | 1933 screenshare_ ? VideoEncoderConfig::ContentType::kScreen |
1940 : VideoEncoderConfig::ContentType::kRealtimeVideo; | 1934 : VideoEncoderConfig::ContentType::kRealtimeVideo; |
1941 } | 1935 } |
1942 | 1936 |
1943 void OnCallsCreated(Call* sender_call, Call* receiver_call) override { | 1937 void OnCallsCreated(Call* sender_call, Call* receiver_call) override { |
1944 sender_call_ = sender_call; | 1938 sender_call_ = sender_call; |
1945 receiver_call_ = receiver_call; | 1939 receiver_call_ = receiver_call; |
1946 } | 1940 } |
1947 | 1941 |
1948 void PerformTest() override { | 1942 void PerformTest() override { |
1949 EXPECT_EQ(kEventSignaled, Wait()) | 1943 EXPECT_TRUE(Wait()) << "Timed out waiting for packet to be NACKed."; |
1950 << "Timed out waiting for packet to be NACKed."; | |
1951 } | 1944 } |
1952 | 1945 |
1953 const bool use_rtx_; | 1946 const bool use_rtx_; |
1954 const bool use_red_; | 1947 const bool use_red_; |
1955 const bool screenshare_; | 1948 const bool screenshare_; |
1956 Call* sender_call_; | 1949 Call* sender_call_; |
1957 Call* receiver_call_; | 1950 Call* receiver_call_; |
1958 int64_t start_runtime_ms_; | 1951 int64_t start_runtime_ms_; |
1959 } test(use_rtx, use_red, screenshare); | 1952 } test(use_rtx, use_red, screenshare); |
1960 | 1953 |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2147 } | 2140 } |
2148 if (sent_rtcp_sr_ > kNumRtcpReportPacketsToObserve && | 2141 if (sent_rtcp_sr_ > kNumRtcpReportPacketsToObserve && |
2149 sent_rtcp_rr_ > kNumRtcpReportPacketsToObserve) { | 2142 sent_rtcp_rr_ > kNumRtcpReportPacketsToObserve) { |
2150 if (enable_rrtr_) { | 2143 if (enable_rrtr_) { |
2151 EXPECT_GT(sent_rtcp_rrtr_, 0); | 2144 EXPECT_GT(sent_rtcp_rrtr_, 0); |
2152 EXPECT_GT(sent_rtcp_dlrr_, 0); | 2145 EXPECT_GT(sent_rtcp_dlrr_, 0); |
2153 } else { | 2146 } else { |
2154 EXPECT_EQ(0, sent_rtcp_rrtr_); | 2147 EXPECT_EQ(0, sent_rtcp_rrtr_); |
2155 EXPECT_EQ(0, sent_rtcp_dlrr_); | 2148 EXPECT_EQ(0, sent_rtcp_dlrr_); |
2156 } | 2149 } |
2157 observation_complete_->Set(); | 2150 observation_complete_.Set(); |
2158 } | 2151 } |
2159 return SEND_PACKET; | 2152 return SEND_PACKET; |
2160 } | 2153 } |
2161 | 2154 |
2162 void ModifyConfigs(VideoSendStream::Config* send_config, | 2155 void ModifyConfigs(VideoSendStream::Config* send_config, |
2163 std::vector<VideoReceiveStream::Config>* receive_configs, | 2156 std::vector<VideoReceiveStream::Config>* receive_configs, |
2164 VideoEncoderConfig* encoder_config) override { | 2157 VideoEncoderConfig* encoder_config) override { |
2165 (*receive_configs)[0].rtp.rtcp_mode = RtcpMode::kReducedSize; | 2158 (*receive_configs)[0].rtp.rtcp_mode = RtcpMode::kReducedSize; |
2166 (*receive_configs)[0].rtp.rtcp_xr.receiver_reference_time_report = | 2159 (*receive_configs)[0].rtp.rtcp_xr.receiver_reference_time_report = |
2167 enable_rrtr_; | 2160 enable_rrtr_; |
2168 } | 2161 } |
2169 | 2162 |
2170 void PerformTest() override { | 2163 void PerformTest() override { |
2171 EXPECT_EQ(kEventSignaled, Wait()) | 2164 EXPECT_TRUE(Wait()) |
2172 << "Timed out while waiting for RTCP SR/RR packets to be sent."; | 2165 << "Timed out while waiting for RTCP SR/RR packets to be sent."; |
2173 } | 2166 } |
2174 | 2167 |
2175 rtc::CriticalSection crit_; | 2168 rtc::CriticalSection crit_; |
2176 bool enable_rrtr_; | 2169 bool enable_rrtr_; |
2177 int sent_rtcp_sr_; | 2170 int sent_rtcp_sr_; |
2178 int sent_rtcp_rr_ GUARDED_BY(&crit_); | 2171 int sent_rtcp_rr_ GUARDED_BY(&crit_); |
2179 int sent_rtcp_rrtr_ GUARDED_BY(&crit_); | 2172 int sent_rtcp_rrtr_ GUARDED_BY(&crit_); |
2180 int sent_rtcp_dlrr_; | 2173 int sent_rtcp_dlrr_; |
2181 } test(enable_rrtr); | 2174 } test(enable_rrtr); |
(...skipping 20 matching lines...) Expand all Loading... |
2202 | 2195 |
2203 private: | 2196 private: |
2204 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 2197 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
2205 RTPHeader header; | 2198 RTPHeader header; |
2206 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 2199 EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
2207 | 2200 |
2208 EXPECT_TRUE(valid_ssrcs_[header.ssrc]) | 2201 EXPECT_TRUE(valid_ssrcs_[header.ssrc]) |
2209 << "Received unknown SSRC: " << header.ssrc; | 2202 << "Received unknown SSRC: " << header.ssrc; |
2210 | 2203 |
2211 if (!valid_ssrcs_[header.ssrc]) | 2204 if (!valid_ssrcs_[header.ssrc]) |
2212 observation_complete_->Set(); | 2205 observation_complete_.Set(); |
2213 | 2206 |
2214 if (!is_observed_[header.ssrc]) { | 2207 if (!is_observed_[header.ssrc]) { |
2215 is_observed_[header.ssrc] = true; | 2208 is_observed_[header.ssrc] = true; |
2216 --ssrcs_to_observe_; | 2209 --ssrcs_to_observe_; |
2217 if (expect_single_ssrc_) { | 2210 if (expect_single_ssrc_) { |
2218 expect_single_ssrc_ = false; | 2211 expect_single_ssrc_ = false; |
2219 observation_complete_->Set(); | 2212 observation_complete_.Set(); |
2220 } | 2213 } |
2221 } | 2214 } |
2222 | 2215 |
2223 if (ssrcs_to_observe_ == 0) | 2216 if (ssrcs_to_observe_ == 0) |
2224 observation_complete_->Set(); | 2217 observation_complete_.Set(); |
2225 | 2218 |
2226 return SEND_PACKET; | 2219 return SEND_PACKET; |
2227 } | 2220 } |
2228 | 2221 |
2229 size_t GetNumStreams() const override { return num_ssrcs_; } | 2222 size_t GetNumStreams() const override { return num_ssrcs_; } |
2230 | 2223 |
2231 void ModifyConfigs(VideoSendStream::Config* send_config, | 2224 void ModifyConfigs(VideoSendStream::Config* send_config, |
2232 std::vector<VideoReceiveStream::Config>* receive_configs, | 2225 std::vector<VideoReceiveStream::Config>* receive_configs, |
2233 VideoEncoderConfig* encoder_config) override { | 2226 VideoEncoderConfig* encoder_config) override { |
2234 if (num_ssrcs_ > 1) { | 2227 if (num_ssrcs_ > 1) { |
(...skipping 10 matching lines...) Expand all Loading... |
2245 encoder_config->streams.resize(1); | 2238 encoder_config->streams.resize(1); |
2246 } | 2239 } |
2247 | 2240 |
2248 void OnStreamsCreated( | 2241 void OnStreamsCreated( |
2249 VideoSendStream* send_stream, | 2242 VideoSendStream* send_stream, |
2250 const std::vector<VideoReceiveStream*>& receive_streams) override { | 2243 const std::vector<VideoReceiveStream*>& receive_streams) override { |
2251 send_stream_ = send_stream; | 2244 send_stream_ = send_stream; |
2252 } | 2245 } |
2253 | 2246 |
2254 void PerformTest() override { | 2247 void PerformTest() override { |
2255 EXPECT_EQ(kEventSignaled, Wait()) | 2248 EXPECT_TRUE(Wait()) << "Timed out while waiting for " |
2256 << "Timed out while waiting for " | 2249 << (send_single_ssrc_first_ ? "first SSRC." |
2257 << (send_single_ssrc_first_ ? "first SSRC." : "SSRCs."); | 2250 : "SSRCs."); |
2258 | 2251 |
2259 if (send_single_ssrc_first_) { | 2252 if (send_single_ssrc_first_) { |
2260 // Set full simulcast and continue with the rest of the SSRCs. | 2253 // Set full simulcast and continue with the rest of the SSRCs. |
2261 send_stream_->ReconfigureVideoEncoder(encoder_config_all_streams_); | 2254 send_stream_->ReconfigureVideoEncoder(encoder_config_all_streams_); |
2262 EXPECT_EQ(kEventSignaled, Wait()) | 2255 EXPECT_TRUE(Wait()) << "Timed out while waiting on additional SSRCs."; |
2263 << "Timed out while waiting on additional SSRCs."; | |
2264 } | 2256 } |
2265 } | 2257 } |
2266 | 2258 |
2267 private: | 2259 private: |
2268 std::map<uint32_t, bool> valid_ssrcs_; | 2260 std::map<uint32_t, bool> valid_ssrcs_; |
2269 std::map<uint32_t, bool> is_observed_; | 2261 std::map<uint32_t, bool> is_observed_; |
2270 | 2262 |
2271 const size_t num_ssrcs_; | 2263 const size_t num_ssrcs_; |
2272 const bool send_single_ssrc_first_; | 2264 const bool send_single_ssrc_first_; |
2273 | 2265 |
(...skipping 28 matching lines...) Expand all Loading... |
2302 VideoEncoderConfig* encoder_config) override { | 2294 VideoEncoderConfig* encoder_config) override { |
2303 send_config->encoder_settings.encoder = this; | 2295 send_config->encoder_settings.encoder = this; |
2304 } | 2296 } |
2305 | 2297 |
2306 int32_t SetRates(uint32_t new_target_bitrate, uint32_t framerate) override { | 2298 int32_t SetRates(uint32_t new_target_bitrate, uint32_t framerate) override { |
2307 // Make sure not to trigger on any default zero bitrates. | 2299 // Make sure not to trigger on any default zero bitrates. |
2308 if (new_target_bitrate == 0) | 2300 if (new_target_bitrate == 0) |
2309 return 0; | 2301 return 0; |
2310 rtc::CritScope lock(&crit_); | 2302 rtc::CritScope lock(&crit_); |
2311 bitrate_kbps_ = new_target_bitrate; | 2303 bitrate_kbps_ = new_target_bitrate; |
2312 observation_complete_->Set(); | 2304 observation_complete_.Set(); |
2313 return 0; | 2305 return 0; |
2314 } | 2306 } |
2315 | 2307 |
2316 void PerformTest() override { | 2308 void PerformTest() override { |
2317 ASSERT_EQ(kEventSignaled, Wait()) | 2309 ASSERT_TRUE(Wait()) |
2318 << "Timed out while waiting for encoder SetRates() call."; | 2310 << "Timed out while waiting for encoder SetRates() call."; |
2319 // Wait for GetStats to report a corresponding bitrate. | 2311 // Wait for GetStats to report a corresponding bitrate. |
2320 for (unsigned int i = 0; i < kDefaultTimeoutMs; ++i) { | 2312 for (int i = 0; i < kDefaultTimeoutMs; ++i) { |
2321 VideoSendStream::Stats stats = send_stream_->GetStats(); | 2313 VideoSendStream::Stats stats = send_stream_->GetStats(); |
2322 { | 2314 { |
2323 rtc::CritScope lock(&crit_); | 2315 rtc::CritScope lock(&crit_); |
2324 if ((stats.target_media_bitrate_bps + 500) / 1000 == | 2316 if ((stats.target_media_bitrate_bps + 500) / 1000 == |
2325 static_cast<int>(bitrate_kbps_)) { | 2317 static_cast<int>(bitrate_kbps_)) { |
2326 return; | 2318 return; |
2327 } | 2319 } |
2328 } | 2320 } |
2329 SleepMs(1); | 2321 SleepMs(1); |
2330 } | 2322 } |
(...skipping 12 matching lines...) Expand all Loading... |
2343 | 2335 |
2344 TEST_F(EndToEndTest, GetStats) { | 2336 TEST_F(EndToEndTest, GetStats) { |
2345 static const int kStartBitrateBps = 3000000; | 2337 static const int kStartBitrateBps = 3000000; |
2346 static const int kExpectedRenderDelayMs = 20; | 2338 static const int kExpectedRenderDelayMs = 20; |
2347 class StatsObserver : public test::EndToEndTest, public I420FrameCallback { | 2339 class StatsObserver : public test::EndToEndTest, public I420FrameCallback { |
2348 public: | 2340 public: |
2349 StatsObserver() | 2341 StatsObserver() |
2350 : EndToEndTest(kLongTimeoutMs), | 2342 : EndToEndTest(kLongTimeoutMs), |
2351 send_stream_(nullptr), | 2343 send_stream_(nullptr), |
2352 expected_send_ssrcs_(), | 2344 expected_send_ssrcs_(), |
2353 check_stats_event_(EventWrapper::Create()) {} | 2345 check_stats_event_(false, false) {} |
2354 | 2346 |
2355 private: | 2347 private: |
2356 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 2348 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
2357 check_stats_event_->Set(); | 2349 check_stats_event_.Set(); |
2358 return SEND_PACKET; | 2350 return SEND_PACKET; |
2359 } | 2351 } |
2360 | 2352 |
2361 Action OnSendRtcp(const uint8_t* packet, size_t length) override { | 2353 Action OnSendRtcp(const uint8_t* packet, size_t length) override { |
2362 check_stats_event_->Set(); | 2354 check_stats_event_.Set(); |
2363 return SEND_PACKET; | 2355 return SEND_PACKET; |
2364 } | 2356 } |
2365 | 2357 |
2366 Action OnReceiveRtp(const uint8_t* packet, size_t length) override { | 2358 Action OnReceiveRtp(const uint8_t* packet, size_t length) override { |
2367 check_stats_event_->Set(); | 2359 check_stats_event_.Set(); |
2368 return SEND_PACKET; | 2360 return SEND_PACKET; |
2369 } | 2361 } |
2370 | 2362 |
2371 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { | 2363 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { |
2372 check_stats_event_->Set(); | 2364 check_stats_event_.Set(); |
2373 return SEND_PACKET; | 2365 return SEND_PACKET; |
2374 } | 2366 } |
2375 | 2367 |
2376 void FrameCallback(VideoFrame* video_frame) override { | 2368 void FrameCallback(VideoFrame* video_frame) override { |
2377 // Ensure that we have at least 5ms send side delay. | 2369 // Ensure that we have at least 5ms send side delay. |
2378 int64_t render_time = video_frame->render_time_ms(); | 2370 int64_t render_time = video_frame->render_time_ms(); |
2379 if (render_time > 0) | 2371 if (render_time > 0) |
2380 video_frame->set_render_time_ms(render_time - 5); | 2372 video_frame->set_render_time_ms(render_time - 5); |
2381 } | 2373 } |
2382 | 2374 |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2552 if (!receive_ok) | 2544 if (!receive_ok) |
2553 receive_ok = CheckReceiveStats(); | 2545 receive_ok = CheckReceiveStats(); |
2554 if (!send_ok) | 2546 if (!send_ok) |
2555 send_ok = CheckSendStats(); | 2547 send_ok = CheckSendStats(); |
2556 | 2548 |
2557 if (receive_ok && send_ok) | 2549 if (receive_ok && send_ok) |
2558 return; | 2550 return; |
2559 | 2551 |
2560 int64_t time_until_timout_ = stop_time - now; | 2552 int64_t time_until_timout_ = stop_time - now; |
2561 if (time_until_timout_ > 0) | 2553 if (time_until_timout_ > 0) |
2562 check_stats_event_->Wait(time_until_timout_); | 2554 check_stats_event_.Wait(time_until_timout_); |
2563 now = clock->TimeInMilliseconds(); | 2555 now = clock->TimeInMilliseconds(); |
2564 } | 2556 } |
2565 | 2557 |
2566 ADD_FAILURE() << "Timed out waiting for filled stats."; | 2558 ADD_FAILURE() << "Timed out waiting for filled stats."; |
2567 for (std::map<std::string, bool>::const_iterator it = | 2559 for (std::map<std::string, bool>::const_iterator it = |
2568 receive_stats_filled_.begin(); | 2560 receive_stats_filled_.begin(); |
2569 it != receive_stats_filled_.end(); | 2561 it != receive_stats_filled_.end(); |
2570 ++it) { | 2562 ++it) { |
2571 if (!it->second) { | 2563 if (!it->second) { |
2572 ADD_FAILURE() << "Missing receive stats: " << it->first; | 2564 ADD_FAILURE() << "Missing receive stats: " << it->first; |
(...skipping 13 matching lines...) Expand all Loading... |
2586 std::vector<VideoReceiveStream*> receive_streams_; | 2578 std::vector<VideoReceiveStream*> receive_streams_; |
2587 std::map<std::string, bool> receive_stats_filled_; | 2579 std::map<std::string, bool> receive_stats_filled_; |
2588 | 2580 |
2589 VideoSendStream* send_stream_; | 2581 VideoSendStream* send_stream_; |
2590 std::map<std::string, bool> send_stats_filled_; | 2582 std::map<std::string, bool> send_stats_filled_; |
2591 | 2583 |
2592 std::vector<uint32_t> expected_receive_ssrcs_; | 2584 std::vector<uint32_t> expected_receive_ssrcs_; |
2593 std::set<uint32_t> expected_send_ssrcs_; | 2585 std::set<uint32_t> expected_send_ssrcs_; |
2594 std::string expected_cname_; | 2586 std::string expected_cname_; |
2595 | 2587 |
2596 rtc::scoped_ptr<EventWrapper> check_stats_event_; | 2588 rtc::Event check_stats_event_; |
2597 } test; | 2589 } test; |
2598 | 2590 |
2599 FakeNetworkPipe::Config network_config; | 2591 FakeNetworkPipe::Config network_config; |
2600 network_config.loss_percent = 5; | 2592 network_config.loss_percent = 5; |
2601 RunBaseTest(&test, network_config); | 2593 RunBaseTest(&test, network_config); |
2602 } | 2594 } |
2603 | 2595 |
2604 TEST_F(EndToEndTest, ReceiverReferenceTimeReportEnabled) { | 2596 TEST_F(EndToEndTest, ReceiverReferenceTimeReportEnabled) { |
2605 TestXrReceiverReferenceTimeReport(true); | 2597 TestXrReceiverReferenceTimeReport(true); |
2606 } | 2598 } |
(...skipping 15 matching lines...) Expand all Loading... |
2622 void OnStreamsCreated( | 2614 void OnStreamsCreated( |
2623 VideoSendStream* send_stream, | 2615 VideoSendStream* send_stream, |
2624 const std::vector<VideoReceiveStream*>& receive_streams) override { | 2616 const std::vector<VideoReceiveStream*>& receive_streams) override { |
2625 receive_stream_ = receive_streams[0]; | 2617 receive_stream_ = receive_streams[0]; |
2626 } | 2618 } |
2627 | 2619 |
2628 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 2620 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
2629 if (sent_rtp_ >= kNumRtpPacketsToSend) { | 2621 if (sent_rtp_ >= kNumRtpPacketsToSend) { |
2630 VideoReceiveStream::Stats stats = receive_stream_->GetStats(); | 2622 VideoReceiveStream::Stats stats = receive_stream_->GetStats(); |
2631 if (kNumRtpPacketsToSend == stats.rtp_stats.transmitted.packets) { | 2623 if (kNumRtpPacketsToSend == stats.rtp_stats.transmitted.packets) { |
2632 observation_complete_->Set(); | 2624 observation_complete_.Set(); |
2633 } | 2625 } |
2634 return DROP_PACKET; | 2626 return DROP_PACKET; |
2635 } | 2627 } |
2636 ++sent_rtp_; | 2628 ++sent_rtp_; |
2637 return SEND_PACKET; | 2629 return SEND_PACKET; |
2638 } | 2630 } |
2639 | 2631 |
2640 void PerformTest() override { | 2632 void PerformTest() override { |
2641 EXPECT_EQ(kEventSignaled, Wait()) | 2633 EXPECT_TRUE(Wait()) |
2642 << "Timed out while verifying number of received RTP packets."; | 2634 << "Timed out while verifying number of received RTP packets."; |
2643 } | 2635 } |
2644 | 2636 |
2645 VideoReceiveStream* receive_stream_; | 2637 VideoReceiveStream* receive_stream_; |
2646 uint32_t sent_rtp_; | 2638 uint32_t sent_rtp_; |
2647 } test; | 2639 } test; |
2648 | 2640 |
2649 RunBaseTest(&test, FakeNetworkPipe::Config()); | 2641 RunBaseTest(&test, FakeNetworkPipe::Config()); |
2650 } | 2642 } |
2651 | 2643 |
(...skipping 28 matching lines...) Expand all Loading... |
2680 EXPECT_LE(header.headerLength + header.paddingLength, length); | 2672 EXPECT_LE(header.headerLength + header.paddingLength, length); |
2681 const bool packet_is_redundant_payload = | 2673 const bool packet_is_redundant_payload = |
2682 header.headerLength + header.paddingLength < length; | 2674 header.headerLength + header.paddingLength < length; |
2683 | 2675 |
2684 if (!packet_is_redundant_payload) | 2676 if (!packet_is_redundant_payload) |
2685 return SEND_PACKET; | 2677 return SEND_PACKET; |
2686 | 2678 |
2687 if (!observed_redundant_retransmission_[header.ssrc]) { | 2679 if (!observed_redundant_retransmission_[header.ssrc]) { |
2688 observed_redundant_retransmission_[header.ssrc] = true; | 2680 observed_redundant_retransmission_[header.ssrc] = true; |
2689 if (--ssrcs_to_observe_ == 0) | 2681 if (--ssrcs_to_observe_ == 0) |
2690 observation_complete_->Set(); | 2682 observation_complete_.Set(); |
2691 } | 2683 } |
2692 | 2684 |
2693 return SEND_PACKET; | 2685 return SEND_PACKET; |
2694 } | 2686 } |
2695 | 2687 |
2696 size_t GetNumStreams() const override { return kNumSsrcs; } | 2688 size_t GetNumStreams() const override { return kNumSsrcs; } |
2697 | 2689 |
2698 void ModifyConfigs(VideoSendStream::Config* send_config, | 2690 void ModifyConfigs(VideoSendStream::Config* send_config, |
2699 std::vector<VideoReceiveStream::Config>* receive_configs, | 2691 std::vector<VideoReceiveStream::Config>* receive_configs, |
2700 VideoEncoderConfig* encoder_config) override { | 2692 VideoEncoderConfig* encoder_config) override { |
2701 // Set low simulcast bitrates to not have to wait for bandwidth ramp-up. | 2693 // Set low simulcast bitrates to not have to wait for bandwidth ramp-up. |
2702 for (size_t i = 0; i < encoder_config->streams.size(); ++i) { | 2694 for (size_t i = 0; i < encoder_config->streams.size(); ++i) { |
2703 encoder_config->streams[i].min_bitrate_bps = 10000; | 2695 encoder_config->streams[i].min_bitrate_bps = 10000; |
2704 encoder_config->streams[i].target_bitrate_bps = 15000; | 2696 encoder_config->streams[i].target_bitrate_bps = 15000; |
2705 encoder_config->streams[i].max_bitrate_bps = 20000; | 2697 encoder_config->streams[i].max_bitrate_bps = 20000; |
2706 } | 2698 } |
2707 | 2699 |
2708 send_config->rtp.rtx.payload_type = kSendRtxPayloadType; | 2700 send_config->rtp.rtx.payload_type = kSendRtxPayloadType; |
2709 | 2701 |
2710 for (size_t i = 0; i < kNumSsrcs; ++i) | 2702 for (size_t i = 0; i < kNumSsrcs; ++i) |
2711 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]); | 2703 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]); |
2712 | 2704 |
2713 // Significantly higher than max bitrates for all video streams -> forcing | 2705 // Significantly higher than max bitrates for all video streams -> forcing |
2714 // padding to trigger redundant padding on all RTX SSRCs. | 2706 // padding to trigger redundant padding on all RTX SSRCs. |
2715 encoder_config->min_transmit_bitrate_bps = 100000; | 2707 encoder_config->min_transmit_bitrate_bps = 100000; |
2716 } | 2708 } |
2717 | 2709 |
2718 void PerformTest() override { | 2710 void PerformTest() override { |
2719 EXPECT_EQ(kEventSignaled, Wait()) | 2711 EXPECT_TRUE(Wait()) |
2720 << "Timed out while waiting for redundant payloads on all SSRCs."; | 2712 << "Timed out while waiting for redundant payloads on all SSRCs."; |
2721 } | 2713 } |
2722 | 2714 |
2723 private: | 2715 private: |
2724 size_t ssrcs_to_observe_; | 2716 size_t ssrcs_to_observe_; |
2725 std::map<uint32_t, bool> observed_redundant_retransmission_; | 2717 std::map<uint32_t, bool> observed_redundant_retransmission_; |
2726 std::map<uint32_t, bool> registered_rtx_ssrc_; | 2718 std::map<uint32_t, bool> registered_rtx_ssrc_; |
2727 } test; | 2719 } test; |
2728 | 2720 |
2729 RunBaseTest(&test, FakeNetworkPipe::Config()); | 2721 RunBaseTest(&test, FakeNetworkPipe::Config()); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2798 << " -> " << timestamp << ") too large for SSRC: " << ssrc << "."; | 2790 << " -> " << timestamp << ") too large for SSRC: " << ssrc << "."; |
2799 } | 2791 } |
2800 last_observed_timestamp_[ssrc] = timestamp; | 2792 last_observed_timestamp_[ssrc] = timestamp; |
2801 } | 2793 } |
2802 | 2794 |
2803 rtc::CritScope lock(&crit_); | 2795 rtc::CritScope lock(&crit_); |
2804 // Wait for media packets on all ssrcs. | 2796 // Wait for media packets on all ssrcs. |
2805 if (!ssrc_observed_[ssrc] && !only_padding) { | 2797 if (!ssrc_observed_[ssrc] && !only_padding) { |
2806 ssrc_observed_[ssrc] = true; | 2798 ssrc_observed_[ssrc] = true; |
2807 if (--ssrcs_to_observe_ == 0) | 2799 if (--ssrcs_to_observe_ == 0) |
2808 observation_complete_->Set(); | 2800 observation_complete_.Set(); |
2809 } | 2801 } |
2810 | 2802 |
2811 return SEND_PACKET; | 2803 return SEND_PACKET; |
2812 } | 2804 } |
2813 | 2805 |
2814 std::map<uint32_t, uint16_t> last_observed_sequence_number_; | 2806 std::map<uint32_t, uint16_t> last_observed_sequence_number_; |
2815 std::map<uint32_t, uint32_t> last_observed_timestamp_; | 2807 std::map<uint32_t, uint32_t> last_observed_timestamp_; |
2816 std::map<uint32_t, bool> configured_ssrcs_; | 2808 std::map<uint32_t, bool> configured_ssrcs_; |
2817 | 2809 |
2818 rtc::CriticalSection crit_; | 2810 rtc::CriticalSection crit_; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2859 one_stream.streams.front().max_bitrate_bps += | 2851 one_stream.streams.front().max_bitrate_bps += |
2860 encoder_config_.streams[i].max_bitrate_bps; | 2852 encoder_config_.streams[i].max_bitrate_bps; |
2861 } | 2853 } |
2862 | 2854 |
2863 CreateMatchingReceiveConfigs(&receive_transport); | 2855 CreateMatchingReceiveConfigs(&receive_transport); |
2864 | 2856 |
2865 CreateStreams(); | 2857 CreateStreams(); |
2866 CreateFrameGeneratorCapturer(); | 2858 CreateFrameGeneratorCapturer(); |
2867 | 2859 |
2868 Start(); | 2860 Start(); |
2869 EXPECT_EQ(kEventSignaled, observer.Wait()) | 2861 EXPECT_TRUE(observer.Wait()) |
2870 << "Timed out waiting for all SSRCs to send packets."; | 2862 << "Timed out waiting for all SSRCs to send packets."; |
2871 | 2863 |
2872 // Test stream resetting more than once to make sure that the state doesn't | 2864 // Test stream resetting more than once to make sure that the state doesn't |
2873 // get set once (this could be due to using std::map::insert for instance). | 2865 // get set once (this could be due to using std::map::insert for instance). |
2874 for (size_t i = 0; i < 3; ++i) { | 2866 for (size_t i = 0; i < 3; ++i) { |
2875 frame_generator_capturer_->Stop(); | 2867 frame_generator_capturer_->Stop(); |
2876 sender_call_->DestroyVideoSendStream(send_stream_); | 2868 sender_call_->DestroyVideoSendStream(send_stream_); |
2877 | 2869 |
2878 // Re-create VideoSendStream with only one stream. | 2870 // Re-create VideoSendStream with only one stream. |
2879 send_stream_ = | 2871 send_stream_ = |
2880 sender_call_->CreateVideoSendStream(send_config_, one_stream); | 2872 sender_call_->CreateVideoSendStream(send_config_, one_stream); |
2881 send_stream_->Start(); | 2873 send_stream_->Start(); |
2882 CreateFrameGeneratorCapturer(); | 2874 CreateFrameGeneratorCapturer(); |
2883 frame_generator_capturer_->Start(); | 2875 frame_generator_capturer_->Start(); |
2884 | 2876 |
2885 observer.ResetExpectedSsrcs(1); | 2877 observer.ResetExpectedSsrcs(1); |
2886 EXPECT_EQ(kEventSignaled, observer.Wait()) | 2878 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for single RTP packet."; |
2887 << "Timed out waiting for single RTP packet."; | |
2888 | 2879 |
2889 // Reconfigure back to use all streams. | 2880 // Reconfigure back to use all streams. |
2890 send_stream_->ReconfigureVideoEncoder(encoder_config_); | 2881 send_stream_->ReconfigureVideoEncoder(encoder_config_); |
2891 observer.ResetExpectedSsrcs(kNumSsrcs); | 2882 observer.ResetExpectedSsrcs(kNumSsrcs); |
2892 EXPECT_EQ(kEventSignaled, observer.Wait()) | 2883 EXPECT_TRUE(observer.Wait()) |
2893 << "Timed out waiting for all SSRCs to send packets."; | 2884 << "Timed out waiting for all SSRCs to send packets."; |
2894 | 2885 |
2895 // Reconfigure down to one stream. | 2886 // Reconfigure down to one stream. |
2896 send_stream_->ReconfigureVideoEncoder(one_stream); | 2887 send_stream_->ReconfigureVideoEncoder(one_stream); |
2897 observer.ResetExpectedSsrcs(1); | 2888 observer.ResetExpectedSsrcs(1); |
2898 EXPECT_EQ(kEventSignaled, observer.Wait()) | 2889 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for single RTP packet."; |
2899 << "Timed out waiting for single RTP packet."; | |
2900 | 2890 |
2901 // Reconfigure back to use all streams. | 2891 // Reconfigure back to use all streams. |
2902 send_stream_->ReconfigureVideoEncoder(encoder_config_); | 2892 send_stream_->ReconfigureVideoEncoder(encoder_config_); |
2903 observer.ResetExpectedSsrcs(kNumSsrcs); | 2893 observer.ResetExpectedSsrcs(kNumSsrcs); |
2904 EXPECT_EQ(kEventSignaled, observer.Wait()) | 2894 EXPECT_TRUE(observer.Wait()) |
2905 << "Timed out waiting for all SSRCs to send packets."; | 2895 << "Timed out waiting for all SSRCs to send packets."; |
2906 } | 2896 } |
2907 | 2897 |
2908 send_transport.StopSending(); | 2898 send_transport.StopSending(); |
2909 receive_transport.StopSending(); | 2899 receive_transport.StopSending(); |
2910 | 2900 |
2911 Stop(); | 2901 Stop(); |
2912 DestroyStreams(); | 2902 DestroyStreams(); |
2913 } | 2903 } |
2914 | 2904 |
(...skipping 13 matching lines...) Expand all Loading... |
2928 // checking paused_ again. This should be enough for one round of pacing, | 2918 // checking paused_ again. This should be enough for one round of pacing, |
2929 // otherwise increase. | 2919 // otherwise increase. |
2930 static const int kNumAcceptedDowntimeRtp = 5; | 2920 static const int kNumAcceptedDowntimeRtp = 5; |
2931 // A single RTCP may be in the pipeline. | 2921 // A single RTCP may be in the pipeline. |
2932 static const int kNumAcceptedDowntimeRtcp = 1; | 2922 static const int kNumAcceptedDowntimeRtcp = 1; |
2933 class NetworkStateTest : public test::EndToEndTest, public test::FakeEncoder { | 2923 class NetworkStateTest : public test::EndToEndTest, public test::FakeEncoder { |
2934 public: | 2924 public: |
2935 NetworkStateTest() | 2925 NetworkStateTest() |
2936 : EndToEndTest(kDefaultTimeoutMs), | 2926 : EndToEndTest(kDefaultTimeoutMs), |
2937 FakeEncoder(Clock::GetRealTimeClock()), | 2927 FakeEncoder(Clock::GetRealTimeClock()), |
2938 encoded_frames_(EventWrapper::Create()), | 2928 encoded_frames_(false, false), |
2939 packet_event_(EventWrapper::Create()), | 2929 packet_event_(false, false), |
2940 sender_call_(nullptr), | 2930 sender_call_(nullptr), |
2941 receiver_call_(nullptr), | 2931 receiver_call_(nullptr), |
2942 sender_state_(kNetworkUp), | 2932 sender_state_(kNetworkUp), |
2943 sender_rtp_(0), | 2933 sender_rtp_(0), |
2944 sender_rtcp_(0), | 2934 sender_rtcp_(0), |
2945 receiver_rtcp_(0), | 2935 receiver_rtcp_(0), |
2946 down_frames_(0) {} | 2936 down_frames_(0) {} |
2947 | 2937 |
2948 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 2938 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
2949 rtc::CritScope lock(&test_crit_); | 2939 rtc::CritScope lock(&test_crit_); |
2950 ++sender_rtp_; | 2940 ++sender_rtp_; |
2951 packet_event_->Set(); | 2941 packet_event_.Set(); |
2952 return SEND_PACKET; | 2942 return SEND_PACKET; |
2953 } | 2943 } |
2954 | 2944 |
2955 Action OnSendRtcp(const uint8_t* packet, size_t length) override { | 2945 Action OnSendRtcp(const uint8_t* packet, size_t length) override { |
2956 rtc::CritScope lock(&test_crit_); | 2946 rtc::CritScope lock(&test_crit_); |
2957 ++sender_rtcp_; | 2947 ++sender_rtcp_; |
2958 packet_event_->Set(); | 2948 packet_event_.Set(); |
2959 return SEND_PACKET; | 2949 return SEND_PACKET; |
2960 } | 2950 } |
2961 | 2951 |
2962 Action OnReceiveRtp(const uint8_t* packet, size_t length) override { | 2952 Action OnReceiveRtp(const uint8_t* packet, size_t length) override { |
2963 ADD_FAILURE() << "Unexpected receiver RTP, should not be sending."; | 2953 ADD_FAILURE() << "Unexpected receiver RTP, should not be sending."; |
2964 return SEND_PACKET; | 2954 return SEND_PACKET; |
2965 } | 2955 } |
2966 | 2956 |
2967 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { | 2957 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { |
2968 rtc::CritScope lock(&test_crit_); | 2958 rtc::CritScope lock(&test_crit_); |
2969 ++receiver_rtcp_; | 2959 ++receiver_rtcp_; |
2970 packet_event_->Set(); | 2960 packet_event_.Set(); |
2971 return SEND_PACKET; | 2961 return SEND_PACKET; |
2972 } | 2962 } |
2973 | 2963 |
2974 void OnCallsCreated(Call* sender_call, Call* receiver_call) override { | 2964 void OnCallsCreated(Call* sender_call, Call* receiver_call) override { |
2975 sender_call_ = sender_call; | 2965 sender_call_ = sender_call; |
2976 receiver_call_ = receiver_call; | 2966 receiver_call_ = receiver_call; |
2977 } | 2967 } |
2978 | 2968 |
2979 void ModifyConfigs(VideoSendStream::Config* send_config, | 2969 void ModifyConfigs(VideoSendStream::Config* send_config, |
2980 std::vector<VideoReceiveStream::Config>* receive_configs, | 2970 std::vector<VideoReceiveStream::Config>* receive_configs, |
2981 VideoEncoderConfig* encoder_config) override { | 2971 VideoEncoderConfig* encoder_config) override { |
2982 send_config->encoder_settings.encoder = this; | 2972 send_config->encoder_settings.encoder = this; |
2983 } | 2973 } |
2984 | 2974 |
2985 void PerformTest() override { | 2975 void PerformTest() override { |
2986 EXPECT_EQ(kEventSignaled, encoded_frames_->Wait(kDefaultTimeoutMs)) | 2976 EXPECT_TRUE(encoded_frames_.Wait(kDefaultTimeoutMs)) |
2987 << "No frames received by the encoder."; | 2977 << "No frames received by the encoder."; |
2988 // Wait for packets from both sender/receiver. | 2978 // Wait for packets from both sender/receiver. |
2989 WaitForPacketsOrSilence(false, false); | 2979 WaitForPacketsOrSilence(false, false); |
2990 | 2980 |
2991 // Sender-side network down. | 2981 // Sender-side network down. |
2992 sender_call_->SignalNetworkState(kNetworkDown); | 2982 sender_call_->SignalNetworkState(kNetworkDown); |
2993 { | 2983 { |
2994 rtc::CritScope lock(&test_crit_); | 2984 rtc::CritScope lock(&test_crit_); |
2995 // After network goes down we shouldn't be encoding more frames. | 2985 // After network goes down we shouldn't be encoding more frames. |
2996 sender_state_ = kNetworkDown; | 2986 sender_state_ = kNetworkDown; |
(...skipping 20 matching lines...) Expand all Loading... |
3017 int32_t Encode(const VideoFrame& input_image, | 3007 int32_t Encode(const VideoFrame& input_image, |
3018 const CodecSpecificInfo* codec_specific_info, | 3008 const CodecSpecificInfo* codec_specific_info, |
3019 const std::vector<FrameType>* frame_types) override { | 3009 const std::vector<FrameType>* frame_types) override { |
3020 { | 3010 { |
3021 rtc::CritScope lock(&test_crit_); | 3011 rtc::CritScope lock(&test_crit_); |
3022 if (sender_state_ == kNetworkDown) { | 3012 if (sender_state_ == kNetworkDown) { |
3023 ++down_frames_; | 3013 ++down_frames_; |
3024 EXPECT_LE(down_frames_, 1) | 3014 EXPECT_LE(down_frames_, 1) |
3025 << "Encoding more than one frame while network is down."; | 3015 << "Encoding more than one frame while network is down."; |
3026 if (down_frames_ > 1) | 3016 if (down_frames_ > 1) |
3027 encoded_frames_->Set(); | 3017 encoded_frames_.Set(); |
3028 } else { | 3018 } else { |
3029 encoded_frames_->Set(); | 3019 encoded_frames_.Set(); |
3030 } | 3020 } |
3031 } | 3021 } |
3032 return test::FakeEncoder::Encode( | 3022 return test::FakeEncoder::Encode( |
3033 input_image, codec_specific_info, frame_types); | 3023 input_image, codec_specific_info, frame_types); |
3034 } | 3024 } |
3035 | 3025 |
3036 private: | 3026 private: |
3037 void WaitForPacketsOrSilence(bool sender_down, bool receiver_down) { | 3027 void WaitForPacketsOrSilence(bool sender_down, bool receiver_down) { |
3038 int64_t initial_time_ms = clock_->TimeInMilliseconds(); | 3028 int64_t initial_time_ms = clock_->TimeInMilliseconds(); |
3039 int initial_sender_rtp; | 3029 int initial_sender_rtp; |
3040 int initial_sender_rtcp; | 3030 int initial_sender_rtcp; |
3041 int initial_receiver_rtcp; | 3031 int initial_receiver_rtcp; |
3042 { | 3032 { |
3043 rtc::CritScope lock(&test_crit_); | 3033 rtc::CritScope lock(&test_crit_); |
3044 initial_sender_rtp = sender_rtp_; | 3034 initial_sender_rtp = sender_rtp_; |
3045 initial_sender_rtcp = sender_rtcp_; | 3035 initial_sender_rtcp = sender_rtcp_; |
3046 initial_receiver_rtcp = receiver_rtcp_; | 3036 initial_receiver_rtcp = receiver_rtcp_; |
3047 } | 3037 } |
3048 bool sender_done = false; | 3038 bool sender_done = false; |
3049 bool receiver_done = false; | 3039 bool receiver_done = false; |
3050 while (!sender_done || !receiver_done) { | 3040 while (!sender_done || !receiver_done) { |
3051 packet_event_->Wait(kSilenceTimeoutMs); | 3041 packet_event_.Wait(kSilenceTimeoutMs); |
3052 int64_t time_now_ms = clock_->TimeInMilliseconds(); | 3042 int64_t time_now_ms = clock_->TimeInMilliseconds(); |
3053 rtc::CritScope lock(&test_crit_); | 3043 rtc::CritScope lock(&test_crit_); |
3054 if (sender_down) { | 3044 if (sender_down) { |
3055 ASSERT_LE(sender_rtp_ - initial_sender_rtp, kNumAcceptedDowntimeRtp) | 3045 ASSERT_LE(sender_rtp_ - initial_sender_rtp, kNumAcceptedDowntimeRtp) |
3056 << "RTP sent during sender-side downtime."; | 3046 << "RTP sent during sender-side downtime."; |
3057 ASSERT_LE(sender_rtcp_ - initial_sender_rtcp, | 3047 ASSERT_LE(sender_rtcp_ - initial_sender_rtcp, |
3058 kNumAcceptedDowntimeRtcp) | 3048 kNumAcceptedDowntimeRtcp) |
3059 << "RTCP sent during sender-side downtime."; | 3049 << "RTCP sent during sender-side downtime."; |
3060 if (time_now_ms - initial_time_ms >= | 3050 if (time_now_ms - initial_time_ms >= |
3061 static_cast<int64_t>(kSilenceTimeoutMs)) { | 3051 static_cast<int64_t>(kSilenceTimeoutMs)) { |
(...skipping 12 matching lines...) Expand all Loading... |
3074 receiver_done = true; | 3064 receiver_done = true; |
3075 } | 3065 } |
3076 } else { | 3066 } else { |
3077 if (receiver_rtcp_ > initial_receiver_rtcp) | 3067 if (receiver_rtcp_ > initial_receiver_rtcp) |
3078 receiver_done = true; | 3068 receiver_done = true; |
3079 } | 3069 } |
3080 } | 3070 } |
3081 } | 3071 } |
3082 | 3072 |
3083 rtc::CriticalSection test_crit_; | 3073 rtc::CriticalSection test_crit_; |
3084 const rtc::scoped_ptr<EventWrapper> encoded_frames_; | 3074 rtc::Event encoded_frames_; |
3085 const rtc::scoped_ptr<EventWrapper> packet_event_; | 3075 rtc::Event packet_event_; |
3086 Call* sender_call_; | 3076 Call* sender_call_; |
3087 Call* receiver_call_; | 3077 Call* receiver_call_; |
3088 NetworkState sender_state_ GUARDED_BY(test_crit_); | 3078 NetworkState sender_state_ GUARDED_BY(test_crit_); |
3089 int sender_rtp_ GUARDED_BY(test_crit_); | 3079 int sender_rtp_ GUARDED_BY(test_crit_); |
3090 int sender_rtcp_ GUARDED_BY(test_crit_); | 3080 int sender_rtcp_ GUARDED_BY(test_crit_); |
3091 int receiver_rtcp_ GUARDED_BY(test_crit_); | 3081 int receiver_rtcp_ GUARDED_BY(test_crit_); |
3092 int down_frames_ GUARDED_BY(test_crit_); | 3082 int down_frames_ GUARDED_BY(test_crit_); |
3093 } test; | 3083 } test; |
3094 | 3084 |
3095 RunBaseTest(&test, FakeNetworkPipe::Config()); | 3085 RunBaseTest(&test, FakeNetworkPipe::Config()); |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3223 EXPECT_TRUE(default_receive_config.rtp.rtx.empty()) | 3213 EXPECT_TRUE(default_receive_config.rtp.rtx.empty()) |
3224 << "Enabling RTX requires rtpmap: rtx negotiation."; | 3214 << "Enabling RTX requires rtpmap: rtx negotiation."; |
3225 EXPECT_TRUE(default_receive_config.rtp.extensions.empty()) | 3215 EXPECT_TRUE(default_receive_config.rtp.extensions.empty()) |
3226 << "Enabling RTP extensions require negotiation."; | 3216 << "Enabling RTP extensions require negotiation."; |
3227 | 3217 |
3228 VerifyEmptyNackConfig(default_receive_config.rtp.nack); | 3218 VerifyEmptyNackConfig(default_receive_config.rtp.nack); |
3229 VerifyEmptyFecConfig(default_receive_config.rtp.fec); | 3219 VerifyEmptyFecConfig(default_receive_config.rtp.fec); |
3230 } | 3220 } |
3231 | 3221 |
3232 } // namespace webrtc | 3222 } // namespace webrtc |
OLD | NEW |