Index: webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller.cc |
diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller.cc b/webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller.cc |
index d684e956a8a95c6ea36cfe61ede19022993f09da..0ab543b8c335b952d5c74a311a05c946abedadfc 100644 |
--- a/webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller.cc |
+++ b/webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller.cc |
@@ -17,14 +17,25 @@ |
namespace webrtc { |
+namespace { |
+int OverheadRateBps(size_t overhead_bytes_per_packet, int frame_length_ms) { |
+ return static_cast<int>(overhead_bytes_per_packet * 8 * 1000 / |
+ frame_length_ms); |
+} |
+} |
+ |
FrameLengthController::Config::Config( |
const std::vector<int>& encoder_frame_lengths_ms, |
int initial_frame_length_ms, |
+ int min_encoder_bitrate_bps, |
+ int prevent_overuse_margin_bps, |
minyue-webrtc
2017/02/21 10:41:24
I'd like this to be hard coded in frame length con
michaelt
2017/02/21 15:56:41
I put it here because of the testing. Other wise i
minyue-webrtc
2017/02/22 09:10:47
I think redefine in test is acceptable. otherwise,
michaelt
2017/02/22 13:57:06
Acknowledged.
|
float fl_increasing_packet_loss_fraction, |
float fl_decreasing_packet_loss_fraction, |
std::map<FrameLengthChange, int> fl_changing_bandwidths_bps) |
: encoder_frame_lengths_ms(encoder_frame_lengths_ms), |
initial_frame_length_ms(initial_frame_length_ms), |
+ min_encoder_bitrate_bps(min_encoder_bitrate_bps), |
+ prevent_overuse_margin_bps(prevent_overuse_margin_bps), |
fl_increasing_packet_loss_fraction(fl_increasing_packet_loss_fraction), |
fl_decreasing_packet_loss_fraction(fl_decreasing_packet_loss_fraction), |
fl_changing_bandwidths_bps(std::move(fl_changing_bandwidths_bps)) {} |
@@ -50,6 +61,8 @@ void FrameLengthController::UpdateNetworkMetrics( |
uplink_bandwidth_bps_ = network_metrics.uplink_bandwidth_bps; |
if (network_metrics.uplink_packet_loss_fraction) |
uplink_packet_loss_fraction_ = network_metrics.uplink_packet_loss_fraction; |
+ if (network_metrics.overhead_bytes_per_packet) |
+ overhead_bytes_per_packet_ = network_metrics.overhead_bytes_per_packet; |
} |
void FrameLengthController::MakeDecision( |
@@ -85,7 +98,10 @@ bool FrameLengthController::FrameLengthIncreasingDecision( |
// 2. |uplink_bandwidth_bps| is known to be smaller than a threshold AND |
// 3. |uplink_packet_loss_fraction| is known to be smaller than a threshold |
// AND |
- // 4. FEC is not decided or is OFF. |
+ // 4. FEC is not decided or is OFF OR |
+ // 5. |uplink_bandwidth_bps| is known to be smaller or equal than |
minyue-webrtc
2017/02/21 10:41:24
This can be misleading because of order of operati
michaelt
2017/02/21 15:56:41
Changed order
minyue-webrtc
2017/02/22 09:10:47
not sure if this is clearly enough. may add "all t
michaelt
2017/02/22 13:57:06
Done.
|
+ // |min_encoder_bitrate_bps| plus |prevent_overuse_margin_bps| plus the |
+ // current overhead rate. |
auto longer_frame_length_ms = std::next(frame_length_ms_); |
if (longer_frame_length_ms == config_.encoder_frame_lengths_ms.end()) |
return false; |
@@ -96,6 +112,13 @@ bool FrameLengthController::FrameLengthIncreasingDecision( |
if (increase_threshold == config_.fl_changing_bandwidths_bps.end()) |
return false; |
+ if (uplink_bandwidth_bps_ && overhead_bytes_per_packet_ && |
+ *uplink_bandwidth_bps_ <= |
+ config_.min_encoder_bitrate_bps + config_.prevent_overuse_margin_bps + |
+ OverheadRateBps(*overhead_bytes_per_packet_, *frame_length_ms_)) { |
+ return true; |
+ } |
+ |
return (uplink_bandwidth_bps_ && |
*uplink_bandwidth_bps_ <= increase_threshold->second) && |
(uplink_packet_loss_fraction_ && |
@@ -107,10 +130,14 @@ bool FrameLengthController::FrameLengthIncreasingDecision( |
bool FrameLengthController::FrameLengthDecreasingDecision( |
const AudioNetworkAdaptor::EncoderRuntimeConfig& config) const { |
// Decrease frame length if |
- // 1. shorter frame length is available AND one or more of the followings: |
- // 2. |uplink_bandwidth_bps| is known to be larger than a threshold, |
- // 3. |uplink_packet_loss_fraction| is known to be larger than a threshold, |
- // 4. FEC is decided ON. |
+ // 1. shorter frame length is available AND |
+ // 2. |uplink_bandwidth_bps| is known to be bigger than |
+ // |min_encoder_bitrate_bps| plus |prevent_overuse_margin_bps| plus the |
+ // overhead which would be produced with the shorter frame length AND |
+ // one or more of the followings: |
+ // 3. |uplink_bandwidth_bps| is known to be larger than a threshold, |
+ // 4. |uplink_packet_loss_fraction| is known to be larger than a threshold, |
+ // 5. FEC is decided ON. |
if (frame_length_ms_ == config_.encoder_frame_lengths_ms.begin()) |
return false; |
@@ -121,6 +148,14 @@ bool FrameLengthController::FrameLengthDecreasingDecision( |
if (decrease_threshold == config_.fl_changing_bandwidths_bps.end()) |
return false; |
+ if (uplink_bandwidth_bps_ && overhead_bytes_per_packet_ && |
+ *uplink_bandwidth_bps_ <= config_.min_encoder_bitrate_bps + |
+ config_.prevent_overuse_margin_bps + |
+ OverheadRateBps(*overhead_bytes_per_packet_, |
+ *shorter_frame_length_ms)) { |
+ return false; |
+ } |
+ |
return (uplink_bandwidth_bps_ && |
*uplink_bandwidth_bps_ >= decrease_threshold->second) || |
(uplink_packet_loss_fraction_ && |