OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 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 | 10 |
(...skipping 16 matching lines...) Expand all Loading... |
27 #include "webrtc/test/gtest.h" | 27 #include "webrtc/test/gtest.h" |
28 #include "webrtc/video/send_statistics_proxy.h" | 28 #include "webrtc/video/send_statistics_proxy.h" |
29 #include "webrtc/video/video_stream_encoder.h" | 29 #include "webrtc/video/video_stream_encoder.h" |
30 | 30 |
31 namespace { | 31 namespace { |
32 // TODO(kthelgason): Lower this limit when better testing | 32 // TODO(kthelgason): Lower this limit when better testing |
33 // on MediaCodec and fallback implementations are in place. | 33 // on MediaCodec and fallback implementations are in place. |
34 const int kMinPixelsPerFrame = 320 * 180; | 34 const int kMinPixelsPerFrame = 320 * 180; |
35 const int kMinFramerateFps = 2; | 35 const int kMinFramerateFps = 2; |
36 const int64_t kFrameTimeoutMs = 100; | 36 const int64_t kFrameTimeoutMs = 100; |
| 37 const unsigned char kNumSlDummy = 0; |
37 } // namespace | 38 } // namespace |
38 | 39 |
39 namespace webrtc { | 40 namespace webrtc { |
40 | 41 |
41 using DegredationPreference = VideoSendStream::DegradationPreference; | 42 using DegredationPreference = VideoSendStream::DegradationPreference; |
42 using ScaleReason = AdaptationObserverInterface::AdaptReason; | 43 using ScaleReason = AdaptationObserverInterface::AdaptReason; |
43 using ::testing::_; | 44 using ::testing::_; |
44 using ::testing::Return; | 45 using ::testing::Return; |
45 | 46 |
46 namespace { | 47 namespace { |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 VideoSendStream::DegradationPreference::kMaintainFramerate); | 311 VideoSendStream::DegradationPreference::kMaintainFramerate); |
311 video_stream_encoder_->SetStartBitrate(kTargetBitrateBps); | 312 video_stream_encoder_->SetStartBitrate(kTargetBitrateBps); |
312 video_stream_encoder_->ConfigureEncoder(std::move(video_encoder_config), | 313 video_stream_encoder_->ConfigureEncoder(std::move(video_encoder_config), |
313 kMaxPayloadLength, nack_enabled); | 314 kMaxPayloadLength, nack_enabled); |
314 video_stream_encoder_->WaitUntilTaskQueueIsIdle(); | 315 video_stream_encoder_->WaitUntilTaskQueueIsIdle(); |
315 } | 316 } |
316 | 317 |
317 void ResetEncoder(const std::string& payload_name, | 318 void ResetEncoder(const std::string& payload_name, |
318 size_t num_streams, | 319 size_t num_streams, |
319 size_t num_temporal_layers, | 320 size_t num_temporal_layers, |
| 321 unsigned char num_spatial_layers, |
320 bool nack_enabled, | 322 bool nack_enabled, |
321 bool screenshare) { | 323 bool screenshare) { |
322 video_send_config_.encoder_settings.payload_name = payload_name; | 324 video_send_config_.encoder_settings.payload_name = payload_name; |
323 | 325 |
324 VideoEncoderConfig video_encoder_config; | 326 VideoEncoderConfig video_encoder_config; |
325 video_encoder_config.number_of_streams = num_streams; | 327 video_encoder_config.number_of_streams = num_streams; |
326 video_encoder_config.max_bitrate_bps = kTargetBitrateBps; | 328 video_encoder_config.max_bitrate_bps = kTargetBitrateBps; |
327 video_encoder_config.video_stream_factory = | 329 video_encoder_config.video_stream_factory = |
328 new rtc::RefCountedObject<VideoStreamFactory>(num_temporal_layers, | 330 new rtc::RefCountedObject<VideoStreamFactory>(num_temporal_layers, |
329 kDefaultFramerate); | 331 kDefaultFramerate); |
330 video_encoder_config.content_type = | 332 video_encoder_config.content_type = |
331 screenshare ? VideoEncoderConfig::ContentType::kScreen | 333 screenshare ? VideoEncoderConfig::ContentType::kScreen |
332 : VideoEncoderConfig::ContentType::kRealtimeVideo; | 334 : VideoEncoderConfig::ContentType::kRealtimeVideo; |
| 335 if (payload_name == "VP9") { |
| 336 VideoCodecVP9 vp9_settings = VideoEncoder::GetDefaultVp9Settings(); |
| 337 vp9_settings.numberOfSpatialLayers = num_spatial_layers; |
| 338 video_encoder_config.encoder_specific_settings = |
| 339 new rtc::RefCountedObject< |
| 340 VideoEncoderConfig::Vp9EncoderSpecificSettings>(vp9_settings); |
| 341 } |
333 ConfigureEncoder(std::move(video_encoder_config), nack_enabled); | 342 ConfigureEncoder(std::move(video_encoder_config), nack_enabled); |
334 } | 343 } |
335 | 344 |
336 VideoFrame CreateFrame(int64_t ntp_time_ms, | 345 VideoFrame CreateFrame(int64_t ntp_time_ms, |
337 rtc::Event* destruction_event) const { | 346 rtc::Event* destruction_event) const { |
338 VideoFrame frame(new rtc::RefCountedObject<TestBuffer>( | 347 VideoFrame frame(new rtc::RefCountedObject<TestBuffer>( |
339 destruction_event, codec_width_, codec_height_), | 348 destruction_event, codec_width_, codec_height_), |
340 99, 99, kVideoRotation_0); | 349 99, 99, kVideoRotation_0); |
341 frame.set_ntp_time_ms(ntp_time_ms); | 350 frame.set_ntp_time_ms(ntp_time_ms); |
342 return frame; | 351 return frame; |
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
792 EXPECT_EQ(codec_height_, fake_encoder_.codec_config().height); | 801 EXPECT_EQ(codec_height_, fake_encoder_.codec_config().height); |
793 EXPECT_EQ(2, sink_.number_of_reconfigurations()); | 802 EXPECT_EQ(2, sink_.number_of_reconfigurations()); |
794 | 803 |
795 video_stream_encoder_->Stop(); | 804 video_stream_encoder_->Stop(); |
796 } | 805 } |
797 | 806 |
798 TEST_F(VideoStreamEncoderTest, Vp8ResilienceIsOffFor1S1TLWithNackEnabled) { | 807 TEST_F(VideoStreamEncoderTest, Vp8ResilienceIsOffFor1S1TLWithNackEnabled) { |
799 const bool kNackEnabled = true; | 808 const bool kNackEnabled = true; |
800 const size_t kNumStreams = 1; | 809 const size_t kNumStreams = 1; |
801 const size_t kNumTl = 1; | 810 const size_t kNumTl = 1; |
802 ResetEncoder("VP8", kNumStreams, kNumTl, kNackEnabled, false); | 811 ResetEncoder("VP8", kNumStreams, kNumTl, kNumSlDummy, kNackEnabled, false); |
803 video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 812 video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
804 | 813 |
805 // Capture a frame and wait for it to synchronize with the encoder thread. | 814 // Capture a frame and wait for it to synchronize with the encoder thread. |
806 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); | 815 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); |
807 WaitForEncodedFrame(1); | 816 WaitForEncodedFrame(1); |
808 // The encoder have been configured once when the first frame is received. | 817 // The encoder have been configured once when the first frame is received. |
809 EXPECT_EQ(1, sink_.number_of_reconfigurations()); | 818 EXPECT_EQ(1, sink_.number_of_reconfigurations()); |
810 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType); | 819 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType); |
811 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams); | 820 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams); |
812 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers); | 821 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers); |
813 // Resilience is off for no temporal layers with nack on. | 822 // Resilience is off for no temporal layers with nack on. |
814 EXPECT_EQ(kResilienceOff, fake_encoder_.codec_config().VP8()->resilience); | 823 EXPECT_EQ(kResilienceOff, fake_encoder_.codec_config().VP8()->resilience); |
815 video_stream_encoder_->Stop(); | 824 video_stream_encoder_->Stop(); |
816 } | 825 } |
817 | 826 |
818 TEST_F(VideoStreamEncoderTest, Vp8ResilienceIsOffFor2S1TlWithNackEnabled) { | 827 TEST_F(VideoStreamEncoderTest, Vp8ResilienceIsOffFor2S1TlWithNackEnabled) { |
819 const bool kNackEnabled = true; | 828 const bool kNackEnabled = true; |
820 const size_t kNumStreams = 2; | 829 const size_t kNumStreams = 2; |
821 const size_t kNumTl = 1; | 830 const size_t kNumTl = 1; |
822 ResetEncoder("VP8", kNumStreams, kNumTl, kNackEnabled, false); | 831 ResetEncoder("VP8", kNumStreams, kNumTl, kNumSlDummy, kNackEnabled, false); |
823 video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 832 video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
824 | 833 |
825 // Capture a frame and wait for it to synchronize with the encoder thread. | 834 // Capture a frame and wait for it to synchronize with the encoder thread. |
826 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); | 835 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); |
827 WaitForEncodedFrame(1); | 836 WaitForEncodedFrame(1); |
828 // The encoder have been configured once when the first frame is received. | 837 // The encoder have been configured once when the first frame is received. |
829 EXPECT_EQ(1, sink_.number_of_reconfigurations()); | 838 EXPECT_EQ(1, sink_.number_of_reconfigurations()); |
830 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType); | 839 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType); |
831 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams); | 840 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams); |
832 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers); | 841 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers); |
833 // Resilience is off for no temporal layers and >1 streams with nack on. | 842 // Resilience is off for no temporal layers and >1 streams with nack on. |
834 EXPECT_EQ(kResilienceOff, fake_encoder_.codec_config().VP8()->resilience); | 843 EXPECT_EQ(kResilienceOff, fake_encoder_.codec_config().VP8()->resilience); |
835 video_stream_encoder_->Stop(); | 844 video_stream_encoder_->Stop(); |
836 } | 845 } |
837 | 846 |
838 TEST_F(VideoStreamEncoderTest, Vp8ResilienceIsOnFor1S1TLWithNackDisabled) { | 847 TEST_F(VideoStreamEncoderTest, Vp8ResilienceIsOnFor1S1TLWithNackDisabled) { |
839 const bool kNackEnabled = false; | 848 const bool kNackEnabled = false; |
840 const size_t kNumStreams = 1; | 849 const size_t kNumStreams = 1; |
841 const size_t kNumTl = 1; | 850 const size_t kNumTl = 1; |
842 ResetEncoder("VP8", kNumStreams, kNumTl, kNackEnabled, false); | 851 ResetEncoder("VP8", kNumStreams, kNumTl, kNumSlDummy, kNackEnabled, false); |
843 video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 852 video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
844 | 853 |
845 // Capture a frame and wait for it to synchronize with the encoder thread. | 854 // Capture a frame and wait for it to synchronize with the encoder thread. |
846 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); | 855 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); |
847 WaitForEncodedFrame(1); | 856 WaitForEncodedFrame(1); |
848 // The encoder have been configured once when the first frame is received. | 857 // The encoder have been configured once when the first frame is received. |
849 EXPECT_EQ(1, sink_.number_of_reconfigurations()); | 858 EXPECT_EQ(1, sink_.number_of_reconfigurations()); |
850 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType); | 859 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType); |
851 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams); | 860 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams); |
852 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers); | 861 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers); |
853 // Resilience is on for no temporal layers with nack off. | 862 // Resilience is on for no temporal layers with nack off. |
854 EXPECT_EQ(kResilientStream, fake_encoder_.codec_config().VP8()->resilience); | 863 EXPECT_EQ(kResilientStream, fake_encoder_.codec_config().VP8()->resilience); |
855 video_stream_encoder_->Stop(); | 864 video_stream_encoder_->Stop(); |
856 } | 865 } |
857 | 866 |
858 TEST_F(VideoStreamEncoderTest, Vp8ResilienceIsOnFor1S2TlWithNackEnabled) { | 867 TEST_F(VideoStreamEncoderTest, Vp8ResilienceIsOnFor1S2TlWithNackEnabled) { |
859 const bool kNackEnabled = true; | 868 const bool kNackEnabled = true; |
860 const size_t kNumStreams = 1; | 869 const size_t kNumStreams = 1; |
861 const size_t kNumTl = 2; | 870 const size_t kNumTl = 2; |
862 ResetEncoder("VP8", kNumStreams, kNumTl, kNackEnabled, false); | 871 ResetEncoder("VP8", kNumStreams, kNumTl, kNumSlDummy, kNackEnabled, false); |
863 video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 872 video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
864 | 873 |
865 // Capture a frame and wait for it to synchronize with the encoder thread. | 874 // Capture a frame and wait for it to synchronize with the encoder thread. |
866 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); | 875 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); |
867 WaitForEncodedFrame(1); | 876 WaitForEncodedFrame(1); |
868 // The encoder have been configured once when the first frame is received. | 877 // The encoder have been configured once when the first frame is received. |
869 EXPECT_EQ(1, sink_.number_of_reconfigurations()); | 878 EXPECT_EQ(1, sink_.number_of_reconfigurations()); |
870 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType); | 879 EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType); |
871 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams); | 880 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams); |
872 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers); | 881 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers); |
873 // Resilience is on for temporal layers. | 882 // Resilience is on for temporal layers. |
874 EXPECT_EQ(kResilientStream, fake_encoder_.codec_config().VP8()->resilience); | 883 EXPECT_EQ(kResilientStream, fake_encoder_.codec_config().VP8()->resilience); |
875 video_stream_encoder_->Stop(); | 884 video_stream_encoder_->Stop(); |
876 } | 885 } |
877 | 886 |
| 887 TEST_F(VideoStreamEncoderTest, Vp9ResilienceIsOffFor1SL1TLWithNackEnabled) { |
| 888 const bool kNackEnabled = true; |
| 889 const size_t kNumStreams = 1; |
| 890 const size_t kNumTl = 1; |
| 891 const unsigned char kNumSl = 1; |
| 892 ResetEncoder("VP9", kNumStreams, kNumTl, kNumSl, kNackEnabled, false); |
| 893 video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 894 |
| 895 // Capture a frame and wait for it to synchronize with the encoder thread. |
| 896 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); |
| 897 sink_.WaitForEncodedFrame(1); |
| 898 // The encoder have been configured once when the first frame is received. |
| 899 EXPECT_EQ(1, sink_.number_of_reconfigurations()); |
| 900 EXPECT_EQ(kVideoCodecVP9, fake_encoder_.codec_config().codecType); |
| 901 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams); |
| 902 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP9()->numberOfTemporalLayers); |
| 903 EXPECT_EQ(kNumSl, fake_encoder_.codec_config().VP9()->numberOfSpatialLayers); |
| 904 // Resilience is off for no spatial and temporal layers with nack on. |
| 905 EXPECT_FALSE(fake_encoder_.codec_config().VP9()->resilienceOn); |
| 906 video_stream_encoder_->Stop(); |
| 907 } |
| 908 |
| 909 TEST_F(VideoStreamEncoderTest, Vp9ResilienceIsOnFor1SL1TLWithNackDisabled) { |
| 910 const bool kNackEnabled = false; |
| 911 const size_t kNumStreams = 1; |
| 912 const size_t kNumTl = 1; |
| 913 const unsigned char kNumSl = 1; |
| 914 ResetEncoder("VP9", kNumStreams, kNumTl, kNumSl, kNackEnabled, false); |
| 915 video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 916 |
| 917 // Capture a frame and wait for it to synchronize with the encoder thread. |
| 918 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); |
| 919 sink_.WaitForEncodedFrame(1); |
| 920 // The encoder have been configured once when the first frame is received. |
| 921 EXPECT_EQ(1, sink_.number_of_reconfigurations()); |
| 922 EXPECT_EQ(kVideoCodecVP9, fake_encoder_.codec_config().codecType); |
| 923 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams); |
| 924 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP9()->numberOfTemporalLayers); |
| 925 EXPECT_EQ(kNumSl, fake_encoder_.codec_config().VP9()->numberOfSpatialLayers); |
| 926 // Resilience is on if nack is off. |
| 927 EXPECT_TRUE(fake_encoder_.codec_config().VP9()->resilienceOn); |
| 928 video_stream_encoder_->Stop(); |
| 929 } |
| 930 |
| 931 TEST_F(VideoStreamEncoderTest, Vp9ResilienceIsOnFor2SL1TLWithNackEnabled) { |
| 932 const bool kNackEnabled = true; |
| 933 const size_t kNumStreams = 1; |
| 934 const size_t kNumTl = 1; |
| 935 const unsigned char kNumSl = 2; |
| 936 ResetEncoder("VP9", kNumStreams, kNumTl, kNumSl, kNackEnabled, false); |
| 937 video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 938 |
| 939 // Capture a frame and wait for it to synchronize with the encoder thread. |
| 940 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); |
| 941 sink_.WaitForEncodedFrame(1); |
| 942 // The encoder have been configured once when the first frame is received. |
| 943 EXPECT_EQ(1, sink_.number_of_reconfigurations()); |
| 944 EXPECT_EQ(kVideoCodecVP9, fake_encoder_.codec_config().codecType); |
| 945 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams); |
| 946 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP9()->numberOfTemporalLayers); |
| 947 EXPECT_EQ(kNumSl, fake_encoder_.codec_config().VP9()->numberOfSpatialLayers); |
| 948 // Resilience is on for spatial layers. |
| 949 EXPECT_TRUE(fake_encoder_.codec_config().VP9()->resilienceOn); |
| 950 video_stream_encoder_->Stop(); |
| 951 } |
| 952 |
| 953 TEST_F(VideoStreamEncoderTest, Vp9ResilienceIsOnFor1SL2TLWithNackEnabled) { |
| 954 const bool kNackEnabled = true; |
| 955 const size_t kNumStreams = 1; |
| 956 const size_t kNumTl = 2; |
| 957 const unsigned char kNumSl = 1; |
| 958 ResetEncoder("VP9", kNumStreams, kNumTl, kNumSl, kNackEnabled, false); |
| 959 video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 960 |
| 961 // Capture a frame and wait for it to synchronize with the encoder thread. |
| 962 video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); |
| 963 sink_.WaitForEncodedFrame(1); |
| 964 // The encoder have been configured once when the first frame is received. |
| 965 EXPECT_EQ(1, sink_.number_of_reconfigurations()); |
| 966 EXPECT_EQ(kVideoCodecVP9, fake_encoder_.codec_config().codecType); |
| 967 EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams); |
| 968 EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP9()->numberOfTemporalLayers); |
| 969 EXPECT_EQ(kNumSl, fake_encoder_.codec_config().VP9()->numberOfSpatialLayers); |
| 970 // Resilience is on for temporal layers. |
| 971 EXPECT_TRUE(fake_encoder_.codec_config().VP9()->resilienceOn); |
| 972 video_stream_encoder_->Stop(); |
| 973 } |
| 974 |
878 TEST_F(VideoStreamEncoderTest, SwitchSourceDeregisterEncoderAsSink) { | 975 TEST_F(VideoStreamEncoderTest, SwitchSourceDeregisterEncoderAsSink) { |
879 EXPECT_TRUE(video_source_.has_sinks()); | 976 EXPECT_TRUE(video_source_.has_sinks()); |
880 test::FrameForwarder new_video_source; | 977 test::FrameForwarder new_video_source; |
881 video_stream_encoder_->SetSource( | 978 video_stream_encoder_->SetSource( |
882 &new_video_source, | 979 &new_video_source, |
883 VideoSendStream::DegradationPreference::kMaintainFramerate); | 980 VideoSendStream::DegradationPreference::kMaintainFramerate); |
884 EXPECT_FALSE(video_source_.has_sinks()); | 981 EXPECT_FALSE(video_source_.has_sinks()); |
885 EXPECT_TRUE(new_video_source.has_sinks()); | 982 EXPECT_TRUE(new_video_source.has_sinks()); |
886 | 983 |
887 video_stream_encoder_->Stop(); | 984 video_stream_encoder_->Stop(); |
(...skipping 1568 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2456 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); | 2553 EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution); |
2457 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate); | 2554 EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate); |
2458 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); | 2555 EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes); |
2459 | 2556 |
2460 video_stream_encoder_->Stop(); | 2557 video_stream_encoder_->Stop(); |
2461 } | 2558 } |
2462 | 2559 |
2463 TEST_F(VideoStreamEncoderTest, FailingInitEncodeDoesntCauseCrash) { | 2560 TEST_F(VideoStreamEncoderTest, FailingInitEncodeDoesntCauseCrash) { |
2464 fake_encoder_.ForceInitEncodeFailure(true); | 2561 fake_encoder_.ForceInitEncodeFailure(true); |
2465 video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 2562 video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
2466 ResetEncoder("VP8", 2, 1, true, false); | 2563 ResetEncoder("VP8", 2, 1, 1, true, false); |
2467 const int kFrameWidth = 1280; | 2564 const int kFrameWidth = 1280; |
2468 const int kFrameHeight = 720; | 2565 const int kFrameHeight = 720; |
2469 video_source_.IncomingCapturedFrame( | 2566 video_source_.IncomingCapturedFrame( |
2470 CreateFrame(1, kFrameWidth, kFrameHeight)); | 2567 CreateFrame(1, kFrameWidth, kFrameHeight)); |
2471 ExpectDroppedFrame(); | 2568 ExpectDroppedFrame(); |
2472 video_stream_encoder_->Stop(); | 2569 video_stream_encoder_->Stop(); |
2473 } | 2570 } |
2474 | 2571 |
2475 // TODO(sprang): Extend this with fps throttling and any "balanced" extensions. | 2572 // TODO(sprang): Extend this with fps throttling and any "balanced" extensions. |
2476 TEST_F(VideoStreamEncoderTest, | 2573 TEST_F(VideoStreamEncoderTest, |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2603 | 2700 |
2604 TEST_F(VideoStreamEncoderTest, DoesntAdaptDownPastMinFramerate) { | 2701 TEST_F(VideoStreamEncoderTest, DoesntAdaptDownPastMinFramerate) { |
2605 const int kFramerateFps = 5; | 2702 const int kFramerateFps = 5; |
2606 const int kFrameIntervalMs = rtc::kNumMillisecsPerSec / kFramerateFps; | 2703 const int kFrameIntervalMs = rtc::kNumMillisecsPerSec / kFramerateFps; |
2607 const int kMinFpsFrameInterval = rtc::kNumMillisecsPerSec / kMinFramerateFps; | 2704 const int kMinFpsFrameInterval = rtc::kNumMillisecsPerSec / kMinFramerateFps; |
2608 const int kFrameWidth = 1280; | 2705 const int kFrameWidth = 1280; |
2609 const int kFrameHeight = 720; | 2706 const int kFrameHeight = 720; |
2610 | 2707 |
2611 // Reconfigure encoder with two temporal layers and screensharing, which will | 2708 // Reconfigure encoder with two temporal layers and screensharing, which will |
2612 // disable frame dropping and make testing easier. | 2709 // disable frame dropping and make testing easier. |
2613 ResetEncoder("VP8", 1, 2, true, true); | 2710 ResetEncoder("VP8", 1, 2, 1, true, true); |
2614 | 2711 |
2615 video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); | 2712 video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
2616 video_stream_encoder_->SetSource( | 2713 video_stream_encoder_->SetSource( |
2617 &video_source_, | 2714 &video_source_, |
2618 VideoSendStream::DegradationPreference::kMaintainResolution); | 2715 VideoSendStream::DegradationPreference::kMaintainResolution); |
2619 video_source_.set_adaptation_enabled(true); | 2716 video_source_.set_adaptation_enabled(true); |
2620 | 2717 |
2621 int64_t timestamp_ms = fake_clock_.TimeNanos() / rtc::kNumNanosecsPerMillisec; | 2718 int64_t timestamp_ms = fake_clock_.TimeNanos() / rtc::kNumNanosecsPerMillisec; |
2622 | 2719 |
2623 // Trigger overuse as much as we can. | 2720 // Trigger overuse as much as we can. |
(...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3176 // Bitrate observer should not be called. | 3273 // Bitrate observer should not be called. |
3177 EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(_)).Times(0); | 3274 EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(_)).Times(0); |
3178 video_source_.IncomingCapturedFrame( | 3275 video_source_.IncomingCapturedFrame( |
3179 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight)); | 3276 CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight)); |
3180 ExpectDroppedFrame(); | 3277 ExpectDroppedFrame(); |
3181 | 3278 |
3182 video_stream_encoder_->Stop(); | 3279 video_stream_encoder_->Stop(); |
3183 } | 3280 } |
3184 | 3281 |
3185 } // namespace webrtc | 3282 } // namespace webrtc |
OLD | NEW |