Index: webrtc/media/engine/webrtcvideoengine2_unittest.cc |
diff --git a/webrtc/media/engine/webrtcvideoengine2_unittest.cc b/webrtc/media/engine/webrtcvideoengine2_unittest.cc |
index f5e4cff94df03eaa9701b1620c1c7e995ceaeeef..b44eb9907d7a2a2bacb731532dee1aab0f4f3533 100644 |
--- a/webrtc/media/engine/webrtcvideoengine2_unittest.cc |
+++ b/webrtc/media/engine/webrtcvideoengine2_unittest.cc |
@@ -1080,6 +1080,38 @@ class WebRtcVideoChannel2Test : public WebRtcVideoEngine2Test { |
return AddSendStream(CreateSimStreamParams("cname", ssrcs)); |
} |
+ int GetMaxEncoderBitrate(cricket::FakeVideoCapturer& capturer) { |
+ EXPECT_TRUE(capturer.CaptureFrame()); |
+ |
+ std::vector<FakeVideoSendStream*> streams = |
+ fake_call_->GetVideoSendStreams(); |
+ EXPECT_TRUE(streams.size() > 0); |
+ FakeVideoSendStream* stream = streams[streams.size() - 1]; |
+ |
+ webrtc::VideoEncoderConfig encoder_config = stream->GetEncoderConfig(); |
+ EXPECT_EQ(1, encoder_config.streams.size()); |
+ return encoder_config.streams[0].max_bitrate_bps; |
+ } |
+ |
+ void SetAndExpectMaxBitrate(cricket::FakeVideoCapturer& capturer, |
+ int global_max, |
+ int stream_max, |
+ int expected_encoder_bitrate) { |
+ VideoSendParameters limited_send_params = send_parameters_; |
+ limited_send_params.max_bandwidth_bps = global_max; |
+ EXPECT_TRUE(channel_->SetSendParameters(limited_send_params)); |
+ webrtc::RtpParameters parameters = channel_->GetRtpParameters(last_ssrc_); |
+ EXPECT_EQ(1UL, parameters.encodings.size()); |
+ parameters.encodings[0].max_bitrate_bps = stream_max; |
+ EXPECT_TRUE(channel_->SetRtpParameters(last_ssrc_, parameters)); |
+ // Read back the parameteres and verify they have the correct value |
+ parameters = channel_->GetRtpParameters(last_ssrc_); |
+ EXPECT_EQ(1UL, parameters.encodings.size()); |
+ EXPECT_EQ(stream_max, parameters.encodings[0].max_bitrate_bps); |
+ // Verify that the new value propagated down to the encoder |
+ EXPECT_EQ(expected_encoder_bitrate, GetMaxEncoderBitrate(capturer)); |
+ } |
+ |
std::unique_ptr<FakeCall> fake_call_; |
std::unique_ptr<VideoMediaChannel> channel_; |
cricket::VideoSendParameters send_parameters_; |
@@ -3113,6 +3145,66 @@ TEST_F(WebRtcVideoChannel2Test, RedRtxPacketDoesntCreateUnsignalledStream) { |
TestReceiveUnsignalledSsrcPacket(kRedRtxPayloadType, false); |
} |
+TEST_F(WebRtcVideoChannel2Test, CanSentMaxBitrateForExistingStream) { |
+ AddSendStream(); |
+ |
+ cricket::FakeVideoCapturer capturer; |
+ EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer)); |
+ cricket::VideoFormat capture_format_hd = |
+ capturer.GetSupportedFormats()->front(); |
+ EXPECT_EQ(1280, capture_format_hd.width); |
+ EXPECT_EQ(720, capture_format_hd.height); |
+ EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd)); |
+ EXPECT_TRUE(channel_->SetSend(true)); |
+ |
+ int default_encoder_bitrate = GetMaxEncoderBitrate(capturer); |
+ EXPECT_TRUE(default_encoder_bitrate > 1000); |
+ |
+ // TODO(skvlad): Resolve the inconsistency between the interpretation |
+ // of the global bitrate limit for audio and video: |
+ // - Audio: max_bandwidth_bps = 0 - fail the operation, |
+ // max_bandwidth_bps = -1 - remove the bandwidth limit |
+ // - Video: max_bandwidth_bps = 0 - remove the bandwidth limit, |
+ // max_bandwidth_bps = -1 - do not change the previously set |
+ // limit. |
+ |
+ SetAndExpectMaxBitrate(capturer, 1000, 0, 1000); |
+ SetAndExpectMaxBitrate(capturer, 1000, 800, 800); |
+ SetAndExpectMaxBitrate(capturer, 600, 800, 600); |
+ SetAndExpectMaxBitrate(capturer, 0, 800, 800); |
+ SetAndExpectMaxBitrate(capturer, 0, 0, default_encoder_bitrate); |
+ |
+ EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL)); |
+} |
+ |
+TEST_F(WebRtcVideoChannel2Test, CannotSetMaxBitrateForNonexistentStream) { |
+ webrtc::RtpParameters nonexistent_parameters = |
+ channel_->GetRtpParameters(last_ssrc_); |
+ EXPECT_EQ(0, nonexistent_parameters.encodings.size()); |
+ |
+ nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters()); |
+ EXPECT_FALSE(channel_->SetRtpParameters(last_ssrc_, nonexistent_parameters)); |
+} |
+ |
+TEST_F(WebRtcVideoChannel2Test, |
+ CannotSetRtpParametersWithIncorrectNumberOfEncodings) { |
+ // This test verifies that setting RtpParameters succeeds only if |
+ // the structure contains exactly one encoding. |
+ // TODO(skvlad): Update this test when we strat supporting setting parameters |
+ // for each encoding individually. |
+ |
+ AddSendStream(); |
+ // Setting RtpParameters with no encoding is expected to fail. |
+ webrtc::RtpParameters parameters; |
+ EXPECT_FALSE(channel_->SetRtpParameters(last_ssrc_, parameters)); |
+ // Setting RtpParameters with exactly one encoding should succeed. |
+ parameters.encodings.push_back(webrtc::RtpEncodingParameters()); |
+ EXPECT_TRUE(channel_->SetRtpParameters(last_ssrc_, parameters)); |
+ // Two or more encodings should result in failure. |
+ parameters.encodings.push_back(webrtc::RtpEncodingParameters()); |
+ EXPECT_FALSE(channel_->SetRtpParameters(last_ssrc_, parameters)); |
+} |
+ |
void WebRtcVideoChannel2Test::TestReceiverLocalSsrcConfiguration( |
bool receiver_first) { |
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_)); |