Index: webrtc/modules/video_coding/main/source/media_optimization_unittest.cc |
diff --git a/webrtc/modules/video_coding/main/source/media_optimization_unittest.cc b/webrtc/modules/video_coding/main/source/media_optimization_unittest.cc |
index c894d722035ed81c7b6a2608b605bfb8bf453163..be528d9932297f0a3fefeeaa33421f1b9b4515d0 100644 |
--- a/webrtc/modules/video_coding/main/source/media_optimization_unittest.cc |
+++ b/webrtc/modules/video_coding/main/source/media_optimization_unittest.cc |
@@ -65,10 +65,9 @@ TEST_F(TestMediaOptimization, VerifyMuting) { |
uint32_t target_bitrate_kbps = 100; |
media_opt_.SetTargetRates(target_bitrate_kbps * 1000, |
- 0, // Lossrate. |
- 100, |
- NULL, |
- NULL); // RTT in ms. |
+ 0, // Lossrate. |
+ 100, // RTT in ms. |
+ nullptr, nullptr); |
media_opt_.EnableFrameDropper(true); |
for (int time = 0; time < 2000; time += frame_time_ms_) { |
ASSERT_NO_FATAL_FAILURE(AddFrameAndAdvanceTime(target_bitrate_kbps, false)); |
@@ -76,10 +75,9 @@ TEST_F(TestMediaOptimization, VerifyMuting) { |
// Set the target rate below the limit for muting. |
media_opt_.SetTargetRates(kThresholdBps - 1000, |
- 0, // Lossrate. |
- 100, |
- NULL, |
- NULL); // RTT in ms. |
+ 0, // Lossrate. |
+ 100, // RTT in ms. |
+ nullptr, nullptr); |
// Expect the muter to engage immediately and stay muted. |
// Test during 2 seconds. |
for (int time = 0; time < 2000; time += frame_time_ms_) { |
@@ -90,11 +88,10 @@ TEST_F(TestMediaOptimization, VerifyMuting) { |
// Set the target above the limit for muting, but not above the |
// limit + window. |
media_opt_.SetTargetRates(kThresholdBps + 1000, |
- 0, // Lossrate. |
- 100, |
- NULL, |
- NULL); // RTT in ms. |
- // Expect the muter to stay muted. |
+ 0, // Lossrate. |
+ 100, // RTT in ms. |
+ nullptr, nullptr); |
+ // Expect the muter to stay muted. |
// Test during 2 seconds. |
for (int time = 0; time < 2000; time += frame_time_ms_) { |
EXPECT_TRUE(media_opt_.IsVideoSuspended()); |
@@ -103,10 +100,9 @@ TEST_F(TestMediaOptimization, VerifyMuting) { |
// Set the target above limit + window. |
media_opt_.SetTargetRates(kThresholdBps + kWindowBps + 1000, |
- 0, // Lossrate. |
- 100, |
- NULL, |
- NULL); // RTT in ms. |
+ 0, // Lossrate. |
+ 100, // RTT in ms. |
+ nullptr, nullptr); |
// Expect the muter to disengage immediately. |
// Test during 2 seconds. |
for (int time = 0; time < 2000; time += frame_time_ms_) { |
@@ -116,5 +112,44 @@ TEST_F(TestMediaOptimization, VerifyMuting) { |
} |
} |
+TEST_F(TestMediaOptimization, ProtectsUsingFecBitrateAboveCodecMax) { |
+ static const int kCodecBitrateBps = 100000; |
+ static const int kMaxBitrateBps = 130000; |
+ |
+ class ProtectionCallback : public VCMProtectionCallback { |
+ int ProtectionRequest(const FecProtectionParams* delta_params, |
+ const FecProtectionParams* key_params, |
+ uint32_t* sent_video_rate_bps, |
+ uint32_t* sent_nack_rate_bps, |
+ uint32_t* sent_fec_rate_bps) override { |
+ *sent_video_rate_bps = kCodecBitrateBps; |
+ *sent_nack_rate_bps = 0; |
+ *sent_fec_rate_bps = fec_rate_bps_; |
+ return 0; |
+ } |
+ |
+ public: |
+ uint32_t fec_rate_bps_; |
+ } protection_callback; |
+ |
+ media_opt_.SetProtectionMethod(kFec); |
+ media_opt_.SetEncodingData(kVideoCodecVP8, kCodecBitrateBps, kCodecBitrateBps, |
+ 640, 480, 30, 1, 1000); |
+ |
+ // Using 10% of codec bitrate for FEC, should still be able to use all of it. |
+ protection_callback.fec_rate_bps_ = kCodecBitrateBps / 10; |
+ uint32_t target_bitrate = media_opt_.SetTargetRates( |
+ kMaxBitrateBps, 0, 0, &protection_callback, nullptr); |
+ |
+ EXPECT_EQ(kCodecBitrateBps, static_cast<int>(target_bitrate)); |
+ |
+ // Using as much for codec bitrate as fec rate, new target rate should share |
+ // both equally, but only be half of max (since that ceiling should be hit). |
+ protection_callback.fec_rate_bps_ = kCodecBitrateBps; |
+ target_bitrate = media_opt_.SetTargetRates(kMaxBitrateBps, 128, 100, |
+ &protection_callback, nullptr); |
+ EXPECT_EQ(kMaxBitrateBps / 2, static_cast<int>(target_bitrate)); |
+} |
+ |
} // namespace media_optimization |
} // namespace webrtc |