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