OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
188 | 188 |
189 DestroyStreams(); | 189 DestroyStreams(); |
190 } | 190 } |
191 | 191 |
192 TEST_P(EndToEndTest, RendersSingleDelayedFrame) { | 192 TEST_P(EndToEndTest, RendersSingleDelayedFrame) { |
193 static const int kWidth = 320; | 193 static const int kWidth = 320; |
194 static const int kHeight = 240; | 194 static const int kHeight = 240; |
195 // This constant is chosen to be higher than the timeout in the video_render | 195 // This constant is chosen to be higher than the timeout in the video_render |
196 // module. This makes sure that frames aren't dropped if there are no other | 196 // module. This makes sure that frames aren't dropped if there are no other |
197 // frames in the queue. | 197 // frames in the queue. |
198 static const int kDelayRenderCallbackMs = 1000; | 198 static const int kRenderDelayMs = 1000; |
199 | 199 |
200 class Renderer : public rtc::VideoSinkInterface<VideoFrame> { | 200 class Renderer : public rtc::VideoSinkInterface<VideoFrame> { |
201 public: | 201 public: |
202 Renderer() : event_(false, false) {} | 202 Renderer() : event_(false, false) {} |
203 | 203 |
204 void OnFrame(const VideoFrame& video_frame) override { event_.Set(); } | 204 void OnFrame(const VideoFrame& video_frame) override { |
| 205 SleepMs(kRenderDelayMs); |
| 206 event_.Set(); |
| 207 } |
205 | 208 |
206 bool Wait() { return event_.Wait(kDefaultTimeoutMs); } | 209 bool Wait() { return event_.Wait(kDefaultTimeoutMs); } |
207 | 210 |
208 rtc::Event event_; | 211 rtc::Event event_; |
209 } renderer; | 212 } renderer; |
210 | 213 |
211 class TestFrameCallback : public I420FrameCallback { | |
212 public: | |
213 TestFrameCallback() : event_(false, false) {} | |
214 | |
215 bool Wait() { return event_.Wait(kDefaultTimeoutMs); } | |
216 | |
217 private: | |
218 void FrameCallback(VideoFrame* frame) override { | |
219 SleepMs(kDelayRenderCallbackMs); | |
220 event_.Set(); | |
221 } | |
222 | |
223 rtc::Event event_; | |
224 }; | |
225 | |
226 CreateCalls(Call::Config(&event_log_), Call::Config(&event_log_)); | 214 CreateCalls(Call::Config(&event_log_), Call::Config(&event_log_)); |
227 | 215 |
228 test::DirectTransport sender_transport(sender_call_.get()); | 216 test::DirectTransport sender_transport(sender_call_.get()); |
229 test::DirectTransport receiver_transport(receiver_call_.get()); | 217 test::DirectTransport receiver_transport(receiver_call_.get()); |
230 sender_transport.SetReceiver(receiver_call_->Receiver()); | 218 sender_transport.SetReceiver(receiver_call_->Receiver()); |
231 receiver_transport.SetReceiver(sender_call_->Receiver()); | 219 receiver_transport.SetReceiver(sender_call_->Receiver()); |
232 | 220 |
233 CreateSendConfig(1, 0, 0, &sender_transport); | 221 CreateSendConfig(1, 0, 0, &sender_transport); |
234 CreateMatchingReceiveConfigs(&receiver_transport); | 222 CreateMatchingReceiveConfigs(&receiver_transport); |
235 | 223 |
236 TestFrameCallback pre_render_callback; | |
237 video_receive_configs_[0].pre_render_callback = &pre_render_callback; | |
238 video_receive_configs_[0].renderer = &renderer; | 224 video_receive_configs_[0].renderer = &renderer; |
239 | 225 |
240 CreateVideoStreams(); | 226 CreateVideoStreams(); |
241 Start(); | 227 Start(); |
242 | 228 |
243 // Create frames that are smaller than the send width/height, this is done to | 229 // Create frames that are smaller than the send width/height, this is done to |
244 // check that the callbacks are done after processing video. | 230 // check that the callbacks are done after processing video. |
245 std::unique_ptr<test::FrameGenerator> frame_generator( | 231 std::unique_ptr<test::FrameGenerator> frame_generator( |
246 test::FrameGenerator::CreateChromaGenerator(kWidth, kHeight)); | 232 test::FrameGenerator::CreateChromaGenerator(kWidth, kHeight)); |
247 test::FrameForwarder frame_forwarder; | 233 test::FrameForwarder frame_forwarder; |
248 video_send_stream_->SetSource( | 234 video_send_stream_->SetSource( |
249 &frame_forwarder, VideoSendStream::DegradationPreference::kBalanced); | 235 &frame_forwarder, VideoSendStream::DegradationPreference::kBalanced); |
250 | 236 |
251 frame_forwarder.IncomingCapturedFrame(*frame_generator->NextFrame()); | 237 frame_forwarder.IncomingCapturedFrame(*frame_generator->NextFrame()); |
252 EXPECT_TRUE(pre_render_callback.Wait()) | |
253 << "Timed out while waiting for pre-render callback."; | |
254 EXPECT_TRUE(renderer.Wait()) | 238 EXPECT_TRUE(renderer.Wait()) |
255 << "Timed out while waiting for the frame to render."; | 239 << "Timed out while waiting for the frame to render."; |
256 | 240 |
257 Stop(); | 241 Stop(); |
258 | 242 |
259 sender_transport.StopSending(); | 243 sender_transport.StopSending(); |
260 receiver_transport.StopSending(); | 244 receiver_transport.StopSending(); |
261 | 245 |
262 DestroyStreams(); | 246 DestroyStreams(); |
263 } | 247 } |
(...skipping 781 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1045 } test; | 1029 } test; |
1046 | 1030 |
1047 RunBaseTest(&test); | 1031 RunBaseTest(&test); |
1048 } | 1032 } |
1049 | 1033 |
1050 // This test drops second RTP packet with a marker bit set, makes sure it's | 1034 // This test drops second RTP packet with a marker bit set, makes sure it's |
1051 // retransmitted and renders. Retransmission SSRCs are also checked. | 1035 // retransmitted and renders. Retransmission SSRCs are also checked. |
1052 void EndToEndTest::DecodesRetransmittedFrame(bool enable_rtx, bool enable_red) { | 1036 void EndToEndTest::DecodesRetransmittedFrame(bool enable_rtx, bool enable_red) { |
1053 static const int kDroppedFrameNumber = 10; | 1037 static const int kDroppedFrameNumber = 10; |
1054 class RetransmissionObserver : public test::EndToEndTest, | 1038 class RetransmissionObserver : public test::EndToEndTest, |
1055 public I420FrameCallback { | 1039 public rtc::VideoSinkInterface<VideoFrame> { |
1056 public: | 1040 public: |
1057 RetransmissionObserver(bool enable_rtx, bool enable_red) | 1041 RetransmissionObserver(bool enable_rtx, bool enable_red) |
1058 : EndToEndTest(kDefaultTimeoutMs), | 1042 : EndToEndTest(kDefaultTimeoutMs), |
1059 payload_type_(GetPayloadType(false, enable_red)), | 1043 payload_type_(GetPayloadType(false, enable_red)), |
1060 retransmission_ssrc_(enable_rtx ? kSendRtxSsrcs[0] | 1044 retransmission_ssrc_(enable_rtx ? kSendRtxSsrcs[0] |
1061 : kVideoSendSsrcs[0]), | 1045 : kVideoSendSsrcs[0]), |
1062 retransmission_payload_type_(GetPayloadType(enable_rtx, enable_red)), | 1046 retransmission_payload_type_(GetPayloadType(enable_rtx, enable_red)), |
1063 encoder_(VP8Encoder::Create()), | 1047 encoder_(VP8Encoder::Create()), |
1064 marker_bits_observed_(0), | 1048 marker_bits_observed_(0), |
1065 retransmitted_timestamp_(0) {} | 1049 retransmitted_timestamp_(0) {} |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1101 // See https://bugs.chromium.org/p/webrtc/issues/detail?id=5540 for | 1085 // See https://bugs.chromium.org/p/webrtc/issues/detail?id=5540 for |
1102 // details. | 1086 // details. |
1103 observation_complete_.Set(); | 1087 observation_complete_.Set(); |
1104 } | 1088 } |
1105 return DROP_PACKET; | 1089 return DROP_PACKET; |
1106 } | 1090 } |
1107 | 1091 |
1108 return SEND_PACKET; | 1092 return SEND_PACKET; |
1109 } | 1093 } |
1110 | 1094 |
1111 void FrameCallback(VideoFrame* frame) override { | 1095 void OnFrame(const VideoFrame& frame) override { |
1112 rtc::CritScope lock(&crit_); | 1096 rtc::CritScope lock(&crit_); |
1113 if (frame->timestamp() == retransmitted_timestamp_) | 1097 if (frame.timestamp() == retransmitted_timestamp_) |
1114 observation_complete_.Set(); | 1098 observation_complete_.Set(); |
1115 rendered_timestamps_.push_back(frame->timestamp()); | 1099 rendered_timestamps_.push_back(frame.timestamp()); |
| 1100 orig_renderer_->OnFrame(frame); |
1116 } | 1101 } |
1117 | 1102 |
1118 void ModifyVideoConfigs( | 1103 void ModifyVideoConfigs( |
1119 VideoSendStream::Config* send_config, | 1104 VideoSendStream::Config* send_config, |
1120 std::vector<VideoReceiveStream::Config>* receive_configs, | 1105 std::vector<VideoReceiveStream::Config>* receive_configs, |
1121 VideoEncoderConfig* encoder_config) override { | 1106 VideoEncoderConfig* encoder_config) override { |
1122 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 1107 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
1123 (*receive_configs)[0].pre_render_callback = this; | 1108 |
| 1109 // Insert ourselves into the rendering pipeline. |
| 1110 RTC_DCHECK(!orig_renderer_); |
| 1111 orig_renderer_ = (*receive_configs)[0].renderer; |
| 1112 RTC_DCHECK(orig_renderer_); |
| 1113 (*receive_configs)[0].renderer = this; |
| 1114 |
1124 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 1115 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
1125 | 1116 |
1126 if (payload_type_ == kRedPayloadType) { | 1117 if (payload_type_ == kRedPayloadType) { |
1127 send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; | 1118 send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; |
1128 send_config->rtp.ulpfec.red_payload_type = kRedPayloadType; | 1119 send_config->rtp.ulpfec.red_payload_type = kRedPayloadType; |
1129 if (retransmission_ssrc_ == kSendRtxSsrcs[0]) | 1120 if (retransmission_ssrc_ == kSendRtxSsrcs[0]) |
1130 send_config->rtp.ulpfec.red_rtx_payload_type = kRtxRedPayloadType; | 1121 send_config->rtp.ulpfec.red_rtx_payload_type = kRtxRedPayloadType; |
1131 (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type = | 1122 (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type = |
1132 send_config->rtp.ulpfec.ulpfec_payload_type; | 1123 send_config->rtp.ulpfec.ulpfec_payload_type; |
1133 (*receive_configs)[0].rtp.ulpfec.red_payload_type = | 1124 (*receive_configs)[0].rtp.ulpfec.red_payload_type = |
(...skipping 27 matching lines...) Expand all Loading... |
1161 if (use_rtx) | 1152 if (use_rtx) |
1162 return kRtxRedPayloadType; | 1153 return kRtxRedPayloadType; |
1163 return kRedPayloadType; | 1154 return kRedPayloadType; |
1164 } | 1155 } |
1165 if (use_rtx) | 1156 if (use_rtx) |
1166 return kSendRtxPayloadType; | 1157 return kSendRtxPayloadType; |
1167 return kFakeVideoSendPayloadType; | 1158 return kFakeVideoSendPayloadType; |
1168 } | 1159 } |
1169 | 1160 |
1170 rtc::CriticalSection crit_; | 1161 rtc::CriticalSection crit_; |
| 1162 rtc::VideoSinkInterface<VideoFrame>* orig_renderer_ = nullptr; |
1171 const int payload_type_; | 1163 const int payload_type_; |
1172 const uint32_t retransmission_ssrc_; | 1164 const uint32_t retransmission_ssrc_; |
1173 const int retransmission_payload_type_; | 1165 const int retransmission_payload_type_; |
1174 std::unique_ptr<VideoEncoder> encoder_; | 1166 std::unique_ptr<VideoEncoder> encoder_; |
1175 const std::string payload_name_; | 1167 const std::string payload_name_; |
1176 int marker_bits_observed_; | 1168 int marker_bits_observed_; |
1177 uint32_t retransmitted_timestamp_ GUARDED_BY(&crit_); | 1169 uint32_t retransmitted_timestamp_ GUARDED_BY(&crit_); |
1178 std::vector<uint32_t> rendered_timestamps_ GUARDED_BY(&crit_); | 1170 std::vector<uint32_t> rendered_timestamps_ GUARDED_BY(&crit_); |
1179 } test(enable_rtx, enable_red); | 1171 } test(enable_rtx, enable_red); |
1180 | 1172 |
(...skipping 3006 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4187 std::unique_ptr<VideoEncoder> encoder_; | 4179 std::unique_ptr<VideoEncoder> encoder_; |
4188 std::unique_ptr<VideoDecoder> decoder_; | 4180 std::unique_ptr<VideoDecoder> decoder_; |
4189 rtc::CriticalSection crit_; | 4181 rtc::CriticalSection crit_; |
4190 int recorded_frames_ GUARDED_BY(crit_); | 4182 int recorded_frames_ GUARDED_BY(crit_); |
4191 } test(this); | 4183 } test(this); |
4192 | 4184 |
4193 RunBaseTest(&test); | 4185 RunBaseTest(&test); |
4194 } | 4186 } |
4195 | 4187 |
4196 } // namespace webrtc | 4188 } // namespace webrtc |
OLD | NEW |