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 779 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1043 } test; | 1027 } test; |
1044 | 1028 |
1045 RunBaseTest(&test); | 1029 RunBaseTest(&test); |
1046 } | 1030 } |
1047 | 1031 |
1048 // This test drops second RTP packet with a marker bit set, makes sure it's | 1032 // This test drops second RTP packet with a marker bit set, makes sure it's |
1049 // retransmitted and renders. Retransmission SSRCs are also checked. | 1033 // retransmitted and renders. Retransmission SSRCs are also checked. |
1050 void EndToEndTest::DecodesRetransmittedFrame(bool enable_rtx, bool enable_red) { | 1034 void EndToEndTest::DecodesRetransmittedFrame(bool enable_rtx, bool enable_red) { |
1051 static const int kDroppedFrameNumber = 10; | 1035 static const int kDroppedFrameNumber = 10; |
1052 class RetransmissionObserver : public test::EndToEndTest, | 1036 class RetransmissionObserver : public test::EndToEndTest, |
1053 public I420FrameCallback { | 1037 public rtc::VideoSinkInterface<VideoFrame> { |
1054 public: | 1038 public: |
1055 RetransmissionObserver(bool enable_rtx, bool enable_red) | 1039 RetransmissionObserver(bool enable_rtx, bool enable_red) |
1056 : EndToEndTest(kDefaultTimeoutMs), | 1040 : EndToEndTest(kDefaultTimeoutMs), |
1057 payload_type_(GetPayloadType(false, enable_red)), | 1041 payload_type_(GetPayloadType(false, enable_red)), |
1058 retransmission_ssrc_(enable_rtx ? kSendRtxSsrcs[0] | 1042 retransmission_ssrc_(enable_rtx ? kSendRtxSsrcs[0] |
1059 : kVideoSendSsrcs[0]), | 1043 : kVideoSendSsrcs[0]), |
1060 retransmission_payload_type_(GetPayloadType(enable_rtx, enable_red)), | 1044 retransmission_payload_type_(GetPayloadType(enable_rtx, enable_red)), |
1061 encoder_(VP8Encoder::Create()), | 1045 encoder_(VP8Encoder::Create()), |
1062 marker_bits_observed_(0), | 1046 marker_bits_observed_(0), |
1063 retransmitted_timestamp_(0) {} | 1047 retransmitted_timestamp_(0) {} |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1099 // See https://bugs.chromium.org/p/webrtc/issues/detail?id=5540 for | 1083 // See https://bugs.chromium.org/p/webrtc/issues/detail?id=5540 for |
1100 // details. | 1084 // details. |
1101 observation_complete_.Set(); | 1085 observation_complete_.Set(); |
1102 } | 1086 } |
1103 return DROP_PACKET; | 1087 return DROP_PACKET; |
1104 } | 1088 } |
1105 | 1089 |
1106 return SEND_PACKET; | 1090 return SEND_PACKET; |
1107 } | 1091 } |
1108 | 1092 |
1109 void FrameCallback(VideoFrame* frame) override { | 1093 void OnFrame(const VideoFrame& frame) override { |
1110 rtc::CritScope lock(&crit_); | 1094 rtc::CritScope lock(&crit_); |
1111 if (frame->timestamp() == retransmitted_timestamp_) | 1095 if (frame.timestamp() == retransmitted_timestamp_) |
1112 observation_complete_.Set(); | 1096 observation_complete_.Set(); |
1113 rendered_timestamps_.push_back(frame->timestamp()); | 1097 rendered_timestamps_.push_back(frame.timestamp()); |
1098 orig_renderer_->OnFrame(frame); | |
1114 } | 1099 } |
1115 | 1100 |
1116 void ModifyVideoConfigs( | 1101 void ModifyVideoConfigs( |
1117 VideoSendStream::Config* send_config, | 1102 VideoSendStream::Config* send_config, |
1118 std::vector<VideoReceiveStream::Config>* receive_configs, | 1103 std::vector<VideoReceiveStream::Config>* receive_configs, |
1119 VideoEncoderConfig* encoder_config) override { | 1104 VideoEncoderConfig* encoder_config) override { |
1120 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 1105 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
1121 (*receive_configs)[0].pre_render_callback = this; | 1106 |
1107 // Insert ourselves into the rendering pipeline. | |
1108 orig_renderer_ = (*receive_configs)[0].renderer; | |
tommi
2017/02/07 11:58:20
first DCHECK_EQ(nullptr, orig_renderer_);
after a
nisse-webrtc
2017/02/07 13:30:59
Added DCHECK. DCHECK_NE and DCHECK_EQ doesn't work
| |
1109 (*receive_configs)[0].renderer = this; | |
1110 | |
1122 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 1111 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
1123 | 1112 |
1124 if (payload_type_ == kRedPayloadType) { | 1113 if (payload_type_ == kRedPayloadType) { |
1125 send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; | 1114 send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; |
1126 send_config->rtp.ulpfec.red_payload_type = kRedPayloadType; | 1115 send_config->rtp.ulpfec.red_payload_type = kRedPayloadType; |
1127 if (retransmission_ssrc_ == kSendRtxSsrcs[0]) | 1116 if (retransmission_ssrc_ == kSendRtxSsrcs[0]) |
1128 send_config->rtp.ulpfec.red_rtx_payload_type = kRtxRedPayloadType; | 1117 send_config->rtp.ulpfec.red_rtx_payload_type = kRtxRedPayloadType; |
1129 (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type = | 1118 (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type = |
1130 send_config->rtp.ulpfec.ulpfec_payload_type; | 1119 send_config->rtp.ulpfec.ulpfec_payload_type; |
1131 (*receive_configs)[0].rtp.ulpfec.red_payload_type = | 1120 (*receive_configs)[0].rtp.ulpfec.red_payload_type = |
(...skipping 27 matching lines...) Expand all Loading... | |
1159 if (use_rtx) | 1148 if (use_rtx) |
1160 return kRtxRedPayloadType; | 1149 return kRtxRedPayloadType; |
1161 return kRedPayloadType; | 1150 return kRedPayloadType; |
1162 } | 1151 } |
1163 if (use_rtx) | 1152 if (use_rtx) |
1164 return kSendRtxPayloadType; | 1153 return kSendRtxPayloadType; |
1165 return kFakeVideoSendPayloadType; | 1154 return kFakeVideoSendPayloadType; |
1166 } | 1155 } |
1167 | 1156 |
1168 rtc::CriticalSection crit_; | 1157 rtc::CriticalSection crit_; |
1158 rtc::VideoSinkInterface<VideoFrame>* orig_renderer_; | |
tommi
2017/02/07 11:58:20
initialize to nullptr
nisse-webrtc
2017/02/07 13:30:58
Done.
| |
1169 const int payload_type_; | 1159 const int payload_type_; |
1170 const uint32_t retransmission_ssrc_; | 1160 const uint32_t retransmission_ssrc_; |
1171 const int retransmission_payload_type_; | 1161 const int retransmission_payload_type_; |
1172 std::unique_ptr<VideoEncoder> encoder_; | 1162 std::unique_ptr<VideoEncoder> encoder_; |
1173 const std::string payload_name_; | 1163 const std::string payload_name_; |
1174 int marker_bits_observed_; | 1164 int marker_bits_observed_; |
1175 uint32_t retransmitted_timestamp_ GUARDED_BY(&crit_); | 1165 uint32_t retransmitted_timestamp_ GUARDED_BY(&crit_); |
1176 std::vector<uint32_t> rendered_timestamps_ GUARDED_BY(&crit_); | 1166 std::vector<uint32_t> rendered_timestamps_ GUARDED_BY(&crit_); |
1177 } test(enable_rtx, enable_red); | 1167 } test(enable_rtx, enable_red); |
1178 | 1168 |
(...skipping 2993 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4172 std::unique_ptr<VideoEncoder> encoder_; | 4162 std::unique_ptr<VideoEncoder> encoder_; |
4173 std::unique_ptr<VideoDecoder> decoder_; | 4163 std::unique_ptr<VideoDecoder> decoder_; |
4174 rtc::CriticalSection crit_; | 4164 rtc::CriticalSection crit_; |
4175 int recorded_frames_ GUARDED_BY(crit_); | 4165 int recorded_frames_ GUARDED_BY(crit_); |
4176 } test(this); | 4166 } test(this); |
4177 | 4167 |
4178 RunBaseTest(&test); | 4168 RunBaseTest(&test); |
4179 } | 4169 } |
4180 | 4170 |
4181 } // namespace webrtc | 4171 } // namespace webrtc |
OLD | NEW |