Improved loss handling for bitrate reductions in WebRTC push input
This commit is contained in:
parent
7a5f5d5855
commit
78a1cd240d
2 changed files with 41 additions and 11 deletions
|
@ -1642,10 +1642,42 @@ namespace Mist{
|
||||||
stats_lossperc = (double)(rtcTrack.sorter.lostCurrent * 100.) / (double)(rtcTrack.sorter.lostCurrent + rtcTrack.sorter.packCurrent);
|
stats_lossperc = (double)(rtcTrack.sorter.lostCurrent * 100.) / (double)(rtcTrack.sorter.lostCurrent + rtcTrack.sorter.packCurrent);
|
||||||
stats_jitter = rtcTrack.jitter/rtcTrack.rtpToDTSC.multiplier;
|
stats_jitter = rtcTrack.jitter/rtcTrack.rtpToDTSC.multiplier;
|
||||||
stats_lossnum = rtcTrack.sorter.lostTotal;
|
stats_lossnum = rtcTrack.sorter.lostTotal;
|
||||||
//If we have > 5% loss, constrain video by 10%
|
|
||||||
if (stats_lossperc > 5){
|
//Print stats at appropriate log levels
|
||||||
videoConstraint *= 0.9;
|
if (stats_lossperc > 1 || stats_jitter > 20){
|
||||||
if (videoConstraint < 1024){videoConstraint = 1024;}
|
INFO_MSG("Receiver Report (%s): %.2f%% loss, %" PRIu32 " total lost, %.2f ms jitter", rtcTrack.rtpToDTSC.codec.c_str(), stats_lossperc, rtcTrack.sorter.lostTotal, stats_jitter);
|
||||||
|
}else{
|
||||||
|
HIGH_MSG("Receiver Report (%s): %.2f%% loss, %" PRIu32 " total lost, %.2f ms jitter", rtcTrack.rtpToDTSC.codec.c_str(), stats_lossperc, rtcTrack.sorter.lostTotal, stats_jitter);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Calculate loss percentage average over moving window
|
||||||
|
stats_loss_avg.push_back(stats_lossperc);
|
||||||
|
while (stats_loss_avg.size() > 5){stats_loss_avg.pop_front();}
|
||||||
|
if (stats_loss_avg.size()){
|
||||||
|
double curr_avg_loss = 0;
|
||||||
|
for (std::deque<double>::iterator it = stats_loss_avg.begin(); it != stats_loss_avg.end(); ++it){
|
||||||
|
curr_avg_loss += *it;
|
||||||
|
}
|
||||||
|
curr_avg_loss /= stats_loss_avg.size();
|
||||||
|
|
||||||
|
uint32_t preConstraint = videoConstraint;
|
||||||
|
|
||||||
|
if (curr_avg_loss > 50){
|
||||||
|
//If we have > 50% loss, constrain video by 9%
|
||||||
|
videoConstraint *= 0.91;
|
||||||
|
}else if (curr_avg_loss > 10){
|
||||||
|
//If we have > 10% loss, constrain video by 5%
|
||||||
|
videoConstraint *= 0.95;
|
||||||
|
}else if (curr_avg_loss > 5){
|
||||||
|
//If we have > 5% loss, constrain video by 1%
|
||||||
|
videoConstraint *= 0.99;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Do not reduce under 32 kbps
|
||||||
|
if (videoConstraint < 1024*32){videoConstraint = 1024*32;}
|
||||||
|
|
||||||
|
if (videoConstraint != preConstraint){
|
||||||
|
INFO_MSG("Reduced video bandwidth maximum to %" PRIu32 " because average loss is %.2f", videoConstraint, curr_avg_loss);
|
||||||
JSON::Value commandResult;
|
JSON::Value commandResult;
|
||||||
commandResult["type"] = "on_video_bitrate";
|
commandResult["type"] = "on_video_bitrate";
|
||||||
commandResult["result"] = true;
|
commandResult["result"] = true;
|
||||||
|
@ -1653,12 +1685,9 @@ namespace Mist{
|
||||||
commandResult["video_bitrate_constraint"] = videoConstraint;
|
commandResult["video_bitrate_constraint"] = videoConstraint;
|
||||||
webSock->sendFrame(commandResult.toString());
|
webSock->sendFrame(commandResult.toString());
|
||||||
}
|
}
|
||||||
if (stats_lossperc > 1 || stats_jitter > 20){
|
|
||||||
INFO_MSG("Receiver Report (%s): %.2f%% loss, %" PRIu32 " total lost, %.2f ms jitter", rtcTrack.rtpToDTSC.codec.c_str(), stats_lossperc, rtcTrack.sorter.lostTotal, stats_jitter);
|
|
||||||
}else{
|
|
||||||
HIGH_MSG("Receiver Report (%s): %.2f%% loss, %" PRIu32 " total lost, %.2f ms jitter", rtcTrack.rtpToDTSC.codec.c_str(), stats_lossperc, rtcTrack.sorter.lostTotal, stats_jitter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (packetLog.is_open()){
|
if (packetLog.is_open()){
|
||||||
packetLog << "[" << Util::bootMS() << "] Receiver Report (" << rtcTrack.rtpToDTSC.codec << "): " << stats_lossperc << " percent loss, " << rtcTrack.sorter.lostTotal << " total lost, " << stats_jitter << " ms jitter" << std::endl;
|
packetLog << "[" << Util::bootMS() << "] Receiver Report (" << rtcTrack.rtpToDTSC.codec << "): " << stats_lossperc << " percent loss, " << rtcTrack.sorter.lostTotal << " total lost, " << stats_jitter << " ms jitter" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
|
@ -220,6 +220,7 @@ namespace Mist{
|
||||||
uint64_t stats_nacknum;
|
uint64_t stats_nacknum;
|
||||||
uint64_t stats_lossnum;
|
uint64_t stats_lossnum;
|
||||||
double stats_lossperc;
|
double stats_lossperc;
|
||||||
|
std::deque<double> stats_loss_avg;
|
||||||
|
|
||||||
#if defined(WEBRTC_PCAP)
|
#if defined(WEBRTC_PCAP)
|
||||||
PCAPWriter pcapOut; ///< Used during development to write unprotected packets that can be
|
PCAPWriter pcapOut; ///< Used during development to write unprotected packets that can be
|
||||||
|
|
Loading…
Add table
Reference in a new issue