| 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 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 static const int kHeight = 240; | 120 static const int kHeight = 240; |
| 121 // This constant is chosen to be higher than the timeout in the video_render | 121 // This constant is chosen to be higher than the timeout in the video_render |
| 122 // module. This makes sure that frames aren't dropped if there are no other | 122 // module. This makes sure that frames aren't dropped if there are no other |
| 123 // frames in the queue. | 123 // frames in the queue. |
| 124 static const int kDelayRenderCallbackMs = 1000; | 124 static const int kDelayRenderCallbackMs = 1000; |
| 125 | 125 |
| 126 class Renderer : public VideoRenderer { | 126 class Renderer : public VideoRenderer { |
| 127 public: | 127 public: |
| 128 Renderer() : event_(false, false) {} | 128 Renderer() : event_(false, false) {} |
| 129 | 129 |
| 130 void RenderFrame(const VideoFrame& video_frame, | 130 void OnFrame(const VideoFrame& video_frame) override { event_.Set(); } |
| 131 int /*time_to_render_ms*/) override { | |
| 132 event_.Set(); | |
| 133 } | |
| 134 | |
| 135 bool IsTextureSupported() const override { return false; } | |
| 136 | 131 |
| 137 bool Wait() { return event_.Wait(kDefaultTimeoutMs); } | 132 bool Wait() { return event_.Wait(kDefaultTimeoutMs); } |
| 138 | 133 |
| 139 rtc::Event event_; | 134 rtc::Event event_; |
| 140 } renderer; | 135 } renderer; |
| 141 | 136 |
| 142 class TestFrameCallback : public I420FrameCallback { | 137 class TestFrameCallback : public I420FrameCallback { |
| 143 public: | 138 public: |
| 144 TestFrameCallback() : event_(false, false) {} | 139 TestFrameCallback() : event_(false, false) {} |
| 145 | 140 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 receiver_transport.StopSending(); | 183 receiver_transport.StopSending(); |
| 189 | 184 |
| 190 DestroyStreams(); | 185 DestroyStreams(); |
| 191 } | 186 } |
| 192 | 187 |
| 193 TEST_F(EndToEndTest, TransmitsFirstFrame) { | 188 TEST_F(EndToEndTest, TransmitsFirstFrame) { |
| 194 class Renderer : public VideoRenderer { | 189 class Renderer : public VideoRenderer { |
| 195 public: | 190 public: |
| 196 Renderer() : event_(false, false) {} | 191 Renderer() : event_(false, false) {} |
| 197 | 192 |
| 198 void RenderFrame(const VideoFrame& video_frame, | 193 void OnFrame(const VideoFrame& video_frame) override { event_.Set(); } |
| 199 int /*time_to_render_ms*/) override { | |
| 200 event_.Set(); | |
| 201 } | |
| 202 bool IsTextureSupported() const override { return false; } | |
| 203 | 194 |
| 204 bool Wait() { return event_.Wait(kDefaultTimeoutMs); } | 195 bool Wait() { return event_.Wait(kDefaultTimeoutMs); } |
| 205 | 196 |
| 206 rtc::Event event_; | 197 rtc::Event event_; |
| 207 } renderer; | 198 } renderer; |
| 208 | 199 |
| 209 CreateCalls(Call::Config(), Call::Config()); | 200 CreateCalls(Call::Config(), Call::Config()); |
| 210 | 201 |
| 211 test::DirectTransport sender_transport(sender_call_.get()); | 202 test::DirectTransport sender_transport(sender_call_.get()); |
| 212 test::DirectTransport receiver_transport(receiver_call_.get()); | 203 test::DirectTransport receiver_transport(receiver_call_.get()); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 | 256 |
| 266 (*receive_configs)[0].renderer = this; | 257 (*receive_configs)[0].renderer = this; |
| 267 (*receive_configs)[0].decoders.resize(1); | 258 (*receive_configs)[0].decoders.resize(1); |
| 268 (*receive_configs)[0].decoders[0].payload_type = | 259 (*receive_configs)[0].decoders[0].payload_type = |
| 269 send_config->encoder_settings.payload_type; | 260 send_config->encoder_settings.payload_type; |
| 270 (*receive_configs)[0].decoders[0].payload_name = | 261 (*receive_configs)[0].decoders[0].payload_name = |
| 271 send_config->encoder_settings.payload_name; | 262 send_config->encoder_settings.payload_name; |
| 272 (*receive_configs)[0].decoders[0].decoder = decoder_.get(); | 263 (*receive_configs)[0].decoders[0].decoder = decoder_.get(); |
| 273 } | 264 } |
| 274 | 265 |
| 275 void RenderFrame(const VideoFrame& video_frame, | 266 void OnFrame(const VideoFrame& video_frame) override { |
| 276 int time_to_render_ms) override { | |
| 277 const int kRequiredFrames = 500; | 267 const int kRequiredFrames = 500; |
| 278 if (++frame_counter_ == kRequiredFrames) | 268 if (++frame_counter_ == kRequiredFrames) |
| 279 observation_complete_.Set(); | 269 observation_complete_.Set(); |
| 280 } | 270 } |
| 281 | 271 |
| 282 bool IsTextureSupported() const override { return false; } | |
| 283 | |
| 284 private: | 272 private: |
| 285 std::unique_ptr<webrtc::VideoEncoder> encoder_; | 273 std::unique_ptr<webrtc::VideoEncoder> encoder_; |
| 286 std::unique_ptr<webrtc::VideoDecoder> decoder_; | 274 std::unique_ptr<webrtc::VideoDecoder> decoder_; |
| 287 int frame_counter_; | 275 int frame_counter_; |
| 288 } test; | 276 } test; |
| 289 | 277 |
| 290 RunBaseTest(&test); | 278 RunBaseTest(&test); |
| 291 } | 279 } |
| 292 | 280 |
| 293 #if defined(WEBRTC_END_TO_END_H264_TESTS) | 281 #if defined(WEBRTC_END_TO_END_H264_TESTS) |
| (...skipping 27 matching lines...) Expand all Loading... |
| 321 | 309 |
| 322 (*receive_configs)[0].renderer = this; | 310 (*receive_configs)[0].renderer = this; |
| 323 (*receive_configs)[0].decoders.resize(1); | 311 (*receive_configs)[0].decoders.resize(1); |
| 324 (*receive_configs)[0].decoders[0].payload_type = | 312 (*receive_configs)[0].decoders[0].payload_type = |
| 325 send_config->encoder_settings.payload_type; | 313 send_config->encoder_settings.payload_type; |
| 326 (*receive_configs)[0].decoders[0].payload_name = | 314 (*receive_configs)[0].decoders[0].payload_name = |
| 327 send_config->encoder_settings.payload_name; | 315 send_config->encoder_settings.payload_name; |
| 328 (*receive_configs)[0].decoders[0].decoder = decoder_.get(); | 316 (*receive_configs)[0].decoders[0].decoder = decoder_.get(); |
| 329 } | 317 } |
| 330 | 318 |
| 331 void RenderFrame(const VideoFrame& video_frame, | 319 void OnFrame(const VideoFrame& video_frame) override { |
| 332 int time_to_render_ms) override { | |
| 333 const int kRequiredFrames = 500; | 320 const int kRequiredFrames = 500; |
| 334 if (++frame_counter_ == kRequiredFrames) | 321 if (++frame_counter_ == kRequiredFrames) |
| 335 observation_complete_.Set(); | 322 observation_complete_.Set(); |
| 336 } | 323 } |
| 337 | 324 |
| 338 bool IsTextureSupported() const override { return false; } | |
| 339 | |
| 340 private: | 325 private: |
| 341 std::unique_ptr<webrtc::VideoEncoder> encoder_; | 326 std::unique_ptr<webrtc::VideoEncoder> encoder_; |
| 342 std::unique_ptr<webrtc::VideoDecoder> decoder_; | 327 std::unique_ptr<webrtc::VideoDecoder> decoder_; |
| 343 int frame_counter_; | 328 int frame_counter_; |
| 344 } test; | 329 } test; |
| 345 | 330 |
| 346 RunBaseTest(&test); | 331 RunBaseTest(&test); |
| 347 } | 332 } |
| 348 | 333 |
| 349 #endif // defined(WEBRTC_END_TO_END_H264_TESTS) | 334 #endif // defined(WEBRTC_END_TO_END_H264_TESTS) |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 514 protected_timestamps_.insert(header.timestamp); | 499 protected_timestamps_.insert(header.timestamp); |
| 515 state_ = kDropEveryOtherPacketUntilFec; | 500 state_ = kDropEveryOtherPacketUntilFec; |
| 516 return DROP_PACKET; | 501 return DROP_PACKET; |
| 517 } | 502 } |
| 518 break; | 503 break; |
| 519 } | 504 } |
| 520 | 505 |
| 521 return SEND_PACKET; | 506 return SEND_PACKET; |
| 522 } | 507 } |
| 523 | 508 |
| 524 void RenderFrame(const VideoFrame& video_frame, | 509 void OnFrame(const VideoFrame& video_frame) override { |
| 525 int time_to_render_ms) override { | |
| 526 rtc::CritScope lock(&crit_); | 510 rtc::CritScope lock(&crit_); |
| 527 // Rendering frame with timestamp of packet that was dropped -> FEC | 511 // Rendering frame with timestamp of packet that was dropped -> FEC |
| 528 // protection worked. | 512 // protection worked. |
| 529 if (protected_timestamps_.count(video_frame.timestamp()) != 0) | 513 if (protected_timestamps_.count(video_frame.timestamp()) != 0) |
| 530 observation_complete_.Set(); | 514 observation_complete_.Set(); |
| 531 } | 515 } |
| 532 | 516 |
| 533 bool IsTextureSupported() const override { return false; } | |
| 534 | |
| 535 enum { | 517 enum { |
| 536 kFirstPacket, | 518 kFirstPacket, |
| 537 kDropEveryOtherPacketUntilFec, | 519 kDropEveryOtherPacketUntilFec, |
| 538 kDropNextMediaPacket, | 520 kDropNextMediaPacket, |
| 539 } state_; | 521 } state_; |
| 540 | 522 |
| 541 void ModifyVideoConfigs( | 523 void ModifyVideoConfigs( |
| 542 VideoSendStream::Config* send_config, | 524 VideoSendStream::Config* send_config, |
| 543 std::vector<VideoReceiveStream::Config>* receive_configs, | 525 std::vector<VideoReceiveStream::Config>* receive_configs, |
| 544 VideoEncoderConfig* encoder_config) override { | 526 VideoEncoderConfig* encoder_config) override { |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 843 } | 825 } |
| 844 | 826 |
| 845 TEST_F(EndToEndTest, UsesFrameCallbacks) { | 827 TEST_F(EndToEndTest, UsesFrameCallbacks) { |
| 846 static const int kWidth = 320; | 828 static const int kWidth = 320; |
| 847 static const int kHeight = 240; | 829 static const int kHeight = 240; |
| 848 | 830 |
| 849 class Renderer : public VideoRenderer { | 831 class Renderer : public VideoRenderer { |
| 850 public: | 832 public: |
| 851 Renderer() : event_(false, false) {} | 833 Renderer() : event_(false, false) {} |
| 852 | 834 |
| 853 void RenderFrame(const VideoFrame& video_frame, | 835 void OnFrame(const VideoFrame& video_frame) override { |
| 854 int /*time_to_render_ms*/) override { | |
| 855 EXPECT_EQ(0, *video_frame.buffer(kYPlane)) | 836 EXPECT_EQ(0, *video_frame.buffer(kYPlane)) |
| 856 << "Rendered frame should have zero luma which is applied by the " | 837 << "Rendered frame should have zero luma which is applied by the " |
| 857 "pre-render callback."; | 838 "pre-render callback."; |
| 858 event_.Set(); | 839 event_.Set(); |
| 859 } | 840 } |
| 860 | 841 |
| 861 bool IsTextureSupported() const override { return false; } | |
| 862 | |
| 863 bool Wait() { return event_.Wait(kDefaultTimeoutMs); } | 842 bool Wait() { return event_.Wait(kDefaultTimeoutMs); } |
| 864 rtc::Event event_; | 843 rtc::Event event_; |
| 865 } renderer; | 844 } renderer; |
| 866 | 845 |
| 867 class TestFrameCallback : public I420FrameCallback { | 846 class TestFrameCallback : public I420FrameCallback { |
| 868 public: | 847 public: |
| 869 TestFrameCallback(int expected_luma_byte, int next_luma_byte) | 848 TestFrameCallback(int expected_luma_byte, int next_luma_byte) |
| 870 : event_(false, false), | 849 : event_(false, false), |
| 871 expected_luma_byte_(expected_luma_byte), | 850 expected_luma_byte_(expected_luma_byte), |
| 872 next_luma_byte_(next_luma_byte) {} | 851 next_luma_byte_(next_luma_byte) {} |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 990 EXPECT_NE(packet_type, RTCPUtility::RTCPPacketTypes::kRtpfbNack); | 969 EXPECT_NE(packet_type, RTCPUtility::RTCPPacketTypes::kRtpfbNack); |
| 991 | 970 |
| 992 if (packet_type == RTCPUtility::RTCPPacketTypes::kPsfbPli) { | 971 if (packet_type == RTCPUtility::RTCPPacketTypes::kPsfbPli) { |
| 993 received_pli_ = true; | 972 received_pli_ = true; |
| 994 break; | 973 break; |
| 995 } | 974 } |
| 996 } | 975 } |
| 997 return SEND_PACKET; | 976 return SEND_PACKET; |
| 998 } | 977 } |
| 999 | 978 |
| 1000 void RenderFrame(const VideoFrame& video_frame, | 979 void OnFrame(const VideoFrame& video_frame) override { |
| 1001 int time_to_render_ms) override { | |
| 1002 rtc::CritScope lock(&crit_); | 980 rtc::CritScope lock(&crit_); |
| 1003 if (received_pli_ && | 981 if (received_pli_ && |
| 1004 video_frame.timestamp() > highest_dropped_timestamp_) { | 982 video_frame.timestamp() > highest_dropped_timestamp_) { |
| 1005 observation_complete_.Set(); | 983 observation_complete_.Set(); |
| 1006 } | 984 } |
| 1007 if (!received_pli_) | 985 if (!received_pli_) |
| 1008 frames_to_drop_ = kPacketsToDrop; | 986 frames_to_drop_ = kPacketsToDrop; |
| 1009 } | 987 } |
| 1010 | 988 |
| 1011 bool IsTextureSupported() const override { return false; } | |
| 1012 | |
| 1013 void ModifyVideoConfigs( | 989 void ModifyVideoConfigs( |
| 1014 VideoSendStream::Config* send_config, | 990 VideoSendStream::Config* send_config, |
| 1015 std::vector<VideoReceiveStream::Config>* receive_configs, | 991 std::vector<VideoReceiveStream::Config>* receive_configs, |
| 1016 VideoEncoderConfig* encoder_config) override { | 992 VideoEncoderConfig* encoder_config) override { |
| 1017 send_config->rtp.nack.rtp_history_ms = rtp_history_ms_; | 993 send_config->rtp.nack.rtp_history_ms = rtp_history_ms_; |
| 1018 (*receive_configs)[0].rtp.nack.rtp_history_ms = rtp_history_ms_; | 994 (*receive_configs)[0].rtp.nack.rtp_history_ms = rtp_history_ms_; |
| 1019 (*receive_configs)[0].renderer = this; | 995 (*receive_configs)[0].renderer = this; |
| 1020 } | 996 } |
| 1021 | 997 |
| 1022 void PerformTest() override { | 998 void PerformTest() override { |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1316 class VideoOutputObserver : public VideoRenderer { | 1292 class VideoOutputObserver : public VideoRenderer { |
| 1317 public: | 1293 public: |
| 1318 VideoOutputObserver(const MultiStreamTest::CodecSettings& settings, | 1294 VideoOutputObserver(const MultiStreamTest::CodecSettings& settings, |
| 1319 uint32_t ssrc, | 1295 uint32_t ssrc, |
| 1320 test::FrameGeneratorCapturer** frame_generator) | 1296 test::FrameGeneratorCapturer** frame_generator) |
| 1321 : settings_(settings), | 1297 : settings_(settings), |
| 1322 ssrc_(ssrc), | 1298 ssrc_(ssrc), |
| 1323 frame_generator_(frame_generator), | 1299 frame_generator_(frame_generator), |
| 1324 done_(false, false) {} | 1300 done_(false, false) {} |
| 1325 | 1301 |
| 1326 void RenderFrame(const VideoFrame& video_frame, | 1302 void OnFrame(const VideoFrame& video_frame) override { |
| 1327 int time_to_render_ms) override { | |
| 1328 EXPECT_EQ(settings_.width, video_frame.width()); | 1303 EXPECT_EQ(settings_.width, video_frame.width()); |
| 1329 EXPECT_EQ(settings_.height, video_frame.height()); | 1304 EXPECT_EQ(settings_.height, video_frame.height()); |
| 1330 (*frame_generator_)->Stop(); | 1305 (*frame_generator_)->Stop(); |
| 1331 done_.Set(); | 1306 done_.Set(); |
| 1332 } | 1307 } |
| 1333 | 1308 |
| 1334 uint32_t Ssrc() { return ssrc_; } | 1309 uint32_t Ssrc() { return ssrc_; } |
| 1335 | 1310 |
| 1336 bool IsTextureSupported() const override { return false; } | |
| 1337 | |
| 1338 bool Wait() { return done_.Wait(kDefaultTimeoutMs); } | 1311 bool Wait() { return done_.Wait(kDefaultTimeoutMs); } |
| 1339 | 1312 |
| 1340 private: | 1313 private: |
| 1341 const MultiStreamTest::CodecSettings& settings_; | 1314 const MultiStreamTest::CodecSettings& settings_; |
| 1342 const uint32_t ssrc_; | 1315 const uint32_t ssrc_; |
| 1343 test::FrameGeneratorCapturer** const frame_generator_; | 1316 test::FrameGeneratorCapturer** const frame_generator_; |
| 1344 rtc::Event done_; | 1317 rtc::Event done_; |
| 1345 }; | 1318 }; |
| 1346 | 1319 |
| 1347 class Tester : public MultiStreamTest { | 1320 class Tester : public MultiStreamTest { |
| (...skipping 2179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3527 private: | 3500 private: |
| 3528 bool video_observed_; | 3501 bool video_observed_; |
| 3529 bool audio_observed_; | 3502 bool audio_observed_; |
| 3530 SequenceNumberUnwrapper unwrapper_; | 3503 SequenceNumberUnwrapper unwrapper_; |
| 3531 std::set<int64_t> received_packet_ids_; | 3504 std::set<int64_t> received_packet_ids_; |
| 3532 } test; | 3505 } test; |
| 3533 | 3506 |
| 3534 RunBaseTest(&test); | 3507 RunBaseTest(&test); |
| 3535 } | 3508 } |
| 3536 } // namespace webrtc | 3509 } // namespace webrtc |
| OLD | NEW |