@@ -32,6 +32,7 @@ namespace {
32
32
const int kMinPixelsPerFrame = 320 * 180 ;
33
33
const int kMinFramerateFps = 2 ;
34
34
const int64_t kFrameTimeoutMs = 100 ;
35
+ const unsigned char kNumSlDummy = 0 ;
35
36
} // namespace
36
37
37
38
namespace webrtc {
@@ -315,6 +316,7 @@ class VideoStreamEncoderTest : public ::testing::Test {
315
316
void ResetEncoder (const std::string& payload_name,
316
317
size_t num_streams,
317
318
size_t num_temporal_layers,
319
+ unsigned char num_spatial_layers,
318
320
bool nack_enabled,
319
321
bool screenshare) {
320
322
video_send_config_.encoder_settings .payload_name = payload_name;
@@ -328,6 +330,13 @@ class VideoStreamEncoderTest : public ::testing::Test {
328
330
video_encoder_config.content_type =
329
331
screenshare ? VideoEncoderConfig::ContentType::kScreen
330
332
: VideoEncoderConfig::ContentType::kRealtimeVideo ;
333
+ if (payload_name == " VP9" ) {
334
+ VideoCodecVP9 vp9_settings = VideoEncoder::GetDefaultVp9Settings ();
335
+ vp9_settings.numberOfSpatialLayers = num_spatial_layers;
336
+ video_encoder_config.encoder_specific_settings =
337
+ new rtc::RefCountedObject<
338
+ VideoEncoderConfig::Vp9EncoderSpecificSettings>(vp9_settings);
339
+ }
331
340
ConfigureEncoder (std::move (video_encoder_config), nack_enabled);
332
341
}
333
342
@@ -797,7 +806,7 @@ TEST_F(VideoStreamEncoderTest, Vp8ResilienceIsOffFor1S1TLWithNackEnabled) {
797
806
const bool kNackEnabled = true ;
798
807
const size_t kNumStreams = 1 ;
799
808
const size_t kNumTl = 1 ;
800
- ResetEncoder (" VP8" , kNumStreams , kNumTl , kNackEnabled , false );
809
+ ResetEncoder (" VP8" , kNumStreams , kNumTl , kNumSlDummy , kNackEnabled , false );
801
810
video_stream_encoder_->OnBitrateUpdated (kTargetBitrateBps , 0 , 0 );
802
811
803
812
// Capture a frame and wait for it to synchronize with the encoder thread.
@@ -817,7 +826,7 @@ TEST_F(VideoStreamEncoderTest, Vp8ResilienceIsOffFor2S1TlWithNackEnabled) {
817
826
const bool kNackEnabled = true ;
818
827
const size_t kNumStreams = 2 ;
819
828
const size_t kNumTl = 1 ;
820
- ResetEncoder (" VP8" , kNumStreams , kNumTl , kNackEnabled , false );
829
+ ResetEncoder (" VP8" , kNumStreams , kNumTl , kNumSlDummy , kNackEnabled , false );
821
830
video_stream_encoder_->OnBitrateUpdated (kTargetBitrateBps , 0 , 0 );
822
831
823
832
// Capture a frame and wait for it to synchronize with the encoder thread.
@@ -837,7 +846,7 @@ TEST_F(VideoStreamEncoderTest, Vp8ResilienceIsOnFor1S1TLWithNackDisabled) {
837
846
const bool kNackEnabled = false ;
838
847
const size_t kNumStreams = 1 ;
839
848
const size_t kNumTl = 1 ;
840
- ResetEncoder (" VP8" , kNumStreams , kNumTl , kNackEnabled , false );
849
+ ResetEncoder (" VP8" , kNumStreams , kNumTl , kNumSlDummy , kNackEnabled , false );
841
850
video_stream_encoder_->OnBitrateUpdated (kTargetBitrateBps , 0 , 0 );
842
851
843
852
// Capture a frame and wait for it to synchronize with the encoder thread.
@@ -857,7 +866,7 @@ TEST_F(VideoStreamEncoderTest, Vp8ResilienceIsOnFor1S2TlWithNackEnabled) {
857
866
const bool kNackEnabled = true ;
858
867
const size_t kNumStreams = 1 ;
859
868
const size_t kNumTl = 2 ;
860
- ResetEncoder (" VP8" , kNumStreams , kNumTl , kNackEnabled , false );
869
+ ResetEncoder (" VP8" , kNumStreams , kNumTl , kNumSlDummy , kNackEnabled , false );
861
870
video_stream_encoder_->OnBitrateUpdated (kTargetBitrateBps , 0 , 0 );
862
871
863
872
// Capture a frame and wait for it to synchronize with the encoder thread.
@@ -873,6 +882,94 @@ TEST_F(VideoStreamEncoderTest, Vp8ResilienceIsOnFor1S2TlWithNackEnabled) {
873
882
video_stream_encoder_->Stop ();
874
883
}
875
884
885
+ TEST_F (VideoStreamEncoderTest, Vp9ResilienceIsOffFor1SL1TLWithNackEnabled) {
886
+ const bool kNackEnabled = true ;
887
+ const size_t kNumStreams = 1 ;
888
+ const size_t kNumTl = 1 ;
889
+ const unsigned char kNumSl = 1 ;
890
+ ResetEncoder (" VP9" , kNumStreams , kNumTl , kNumSl , kNackEnabled , false );
891
+ video_stream_encoder_->OnBitrateUpdated (kTargetBitrateBps , 0 , 0 );
892
+
893
+ // Capture a frame and wait for it to synchronize with the encoder thread.
894
+ video_source_.IncomingCapturedFrame (CreateFrame (1 , nullptr ));
895
+ sink_.WaitForEncodedFrame (1 );
896
+ // The encoder have been configured once when the first frame is received.
897
+ EXPECT_EQ (1 , sink_.number_of_reconfigurations ());
898
+ EXPECT_EQ (kVideoCodecVP9 , fake_encoder_.codec_config ().codecType );
899
+ EXPECT_EQ (kNumStreams , fake_encoder_.codec_config ().numberOfSimulcastStreams );
900
+ EXPECT_EQ (kNumTl , fake_encoder_.codec_config ().VP9 ()->numberOfTemporalLayers );
901
+ EXPECT_EQ (kNumSl , fake_encoder_.codec_config ().VP9 ()->numberOfSpatialLayers );
902
+ // Resilience is off for no spatial and temporal layers with nack on.
903
+ EXPECT_FALSE (fake_encoder_.codec_config ().VP9 ()->resilienceOn );
904
+ video_stream_encoder_->Stop ();
905
+ }
906
+
907
+ TEST_F (VideoStreamEncoderTest, Vp9ResilienceIsOnFor1SL1TLWithNackDisabled) {
908
+ const bool kNackEnabled = false ;
909
+ const size_t kNumStreams = 1 ;
910
+ const size_t kNumTl = 1 ;
911
+ const unsigned char kNumSl = 1 ;
912
+ ResetEncoder (" VP9" , kNumStreams , kNumTl , kNumSl , kNackEnabled , false );
913
+ video_stream_encoder_->OnBitrateUpdated (kTargetBitrateBps , 0 , 0 );
914
+
915
+ // Capture a frame and wait for it to synchronize with the encoder thread.
916
+ video_source_.IncomingCapturedFrame (CreateFrame (1 , nullptr ));
917
+ sink_.WaitForEncodedFrame (1 );
918
+ // The encoder have been configured once when the first frame is received.
919
+ EXPECT_EQ (1 , sink_.number_of_reconfigurations ());
920
+ EXPECT_EQ (kVideoCodecVP9 , fake_encoder_.codec_config ().codecType );
921
+ EXPECT_EQ (kNumStreams , fake_encoder_.codec_config ().numberOfSimulcastStreams );
922
+ EXPECT_EQ (kNumTl , fake_encoder_.codec_config ().VP9 ()->numberOfTemporalLayers );
923
+ EXPECT_EQ (kNumSl , fake_encoder_.codec_config ().VP9 ()->numberOfSpatialLayers );
924
+ // Resilience is on if nack is off.
925
+ EXPECT_TRUE (fake_encoder_.codec_config ().VP9 ()->resilienceOn );
926
+ video_stream_encoder_->Stop ();
927
+ }
928
+
929
+ TEST_F (VideoStreamEncoderTest, Vp9ResilienceIsOnFor2SL1TLWithNackEnabled) {
930
+ const bool kNackEnabled = true ;
931
+ const size_t kNumStreams = 1 ;
932
+ const size_t kNumTl = 1 ;
933
+ const unsigned char kNumSl = 2 ;
934
+ ResetEncoder (" VP9" , kNumStreams , kNumTl , kNumSl , kNackEnabled , false );
935
+ video_stream_encoder_->OnBitrateUpdated (kTargetBitrateBps , 0 , 0 );
936
+
937
+ // Capture a frame and wait for it to synchronize with the encoder thread.
938
+ video_source_.IncomingCapturedFrame (CreateFrame (1 , nullptr ));
939
+ sink_.WaitForEncodedFrame (1 );
940
+ // The encoder have been configured once when the first frame is received.
941
+ EXPECT_EQ (1 , sink_.number_of_reconfigurations ());
942
+ EXPECT_EQ (kVideoCodecVP9 , fake_encoder_.codec_config ().codecType );
943
+ EXPECT_EQ (kNumStreams , fake_encoder_.codec_config ().numberOfSimulcastStreams );
944
+ EXPECT_EQ (kNumTl , fake_encoder_.codec_config ().VP9 ()->numberOfTemporalLayers );
945
+ EXPECT_EQ (kNumSl , fake_encoder_.codec_config ().VP9 ()->numberOfSpatialLayers );
946
+ // Resilience is on for spatial layers.
947
+ EXPECT_TRUE (fake_encoder_.codec_config ().VP9 ()->resilienceOn );
948
+ video_stream_encoder_->Stop ();
949
+ }
950
+
951
+ TEST_F (VideoStreamEncoderTest, Vp9ResilienceIsOnFor1SL2TLWithNackEnabled) {
952
+ const bool kNackEnabled = true ;
953
+ const size_t kNumStreams = 1 ;
954
+ const size_t kNumTl = 2 ;
955
+ const unsigned char kNumSl = 1 ;
956
+ ResetEncoder (" VP9" , kNumStreams , kNumTl , kNumSl , kNackEnabled , false );
957
+ video_stream_encoder_->OnBitrateUpdated (kTargetBitrateBps , 0 , 0 );
958
+
959
+ // Capture a frame and wait for it to synchronize with the encoder thread.
960
+ video_source_.IncomingCapturedFrame (CreateFrame (1 , nullptr ));
961
+ sink_.WaitForEncodedFrame (1 );
962
+ // The encoder have been configured once when the first frame is received.
963
+ EXPECT_EQ (1 , sink_.number_of_reconfigurations ());
964
+ EXPECT_EQ (kVideoCodecVP9 , fake_encoder_.codec_config ().codecType );
965
+ EXPECT_EQ (kNumStreams , fake_encoder_.codec_config ().numberOfSimulcastStreams );
966
+ EXPECT_EQ (kNumTl , fake_encoder_.codec_config ().VP9 ()->numberOfTemporalLayers );
967
+ EXPECT_EQ (kNumSl , fake_encoder_.codec_config ().VP9 ()->numberOfSpatialLayers );
968
+ // Resilience is on for temporal layers.
969
+ EXPECT_TRUE (fake_encoder_.codec_config ().VP9 ()->resilienceOn );
970
+ video_stream_encoder_->Stop ();
971
+ }
972
+
876
973
TEST_F (VideoStreamEncoderTest, SwitchSourceDeregisterEncoderAsSink) {
877
974
EXPECT_TRUE (video_source_.has_sinks ());
878
975
test::FrameForwarder new_video_source;
@@ -2461,7 +2558,7 @@ TEST_F(VideoStreamEncoderTest,
2461
2558
TEST_F (VideoStreamEncoderTest, FailingInitEncodeDoesntCauseCrash) {
2462
2559
fake_encoder_.ForceInitEncodeFailure (true );
2463
2560
video_stream_encoder_->OnBitrateUpdated (kTargetBitrateBps , 0 , 0 );
2464
- ResetEncoder (" VP8" , 2 , 1 , true , false );
2561
+ ResetEncoder (" VP8" , 2 , 1 , 1 , true , false );
2465
2562
const int kFrameWidth = 1280 ;
2466
2563
const int kFrameHeight = 720 ;
2467
2564
video_source_.IncomingCapturedFrame (
@@ -2608,7 +2705,7 @@ TEST_F(VideoStreamEncoderTest, DoesntAdaptDownPastMinFramerate) {
2608
2705
2609
2706
// Reconfigure encoder with two temporal layers and screensharing, which will
2610
2707
// disable frame dropping and make testing easier.
2611
- ResetEncoder (" VP8" , 1 , 2 , true , true );
2708
+ ResetEncoder (" VP8" , 1 , 2 , 1 , true , true );
2612
2709
2613
2710
video_stream_encoder_->OnBitrateUpdated (kTargetBitrateBps , 0 , 0 );
2614
2711
video_stream_encoder_->SetSource (
0 commit comments