Fix division by zero in FindTMMBRBoundingSet
BUG=webrtc:5490
Review URL: https://codereview.webrtc.org/1727273003
Cr-Commit-Position: refs/heads/master@{#11749}
diff --git a/webrtc/modules/rtp_rtcp/source/tmmbr_help.cc b/webrtc/modules/rtp_rtcp/source/tmmbr_help.cc
index 5c09050..1001bf4 100644
--- a/webrtc/modules/rtp_rtcp/source/tmmbr_help.cc
+++ b/webrtc/modules/rtp_rtcp/source/tmmbr_help.cc
@@ -15,6 +15,7 @@
#include <limits>
+#include "webrtc/base/checks.h"
#include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h"
namespace webrtc {
@@ -300,6 +301,7 @@
&& j != currentMinIndexTMMBR)
{
candidateSet.ClearEntry(j);
+ numCandidates--;
}
}
}
@@ -336,9 +338,15 @@
// set intersection value
_ptrIntersectionBoundingSet[numBoundingSet] = 0;
// calculate its maximum packet rate (where its line crosses x-axis)
- _ptrMaxPRBoundingSet[numBoundingSet]
- = _boundingSet.Tmmbr(numBoundingSet) * 1000
- / float(8 * _boundingSet.PacketOH(numBoundingSet));
+ uint32_t packet_overhead_bits = 8 * _boundingSet.PacketOH(numBoundingSet);
+ if (packet_overhead_bits == 0) {
+ // Avoid division by zero.
+ _ptrMaxPRBoundingSet[numBoundingSet] = std::numeric_limits<float>::max();
+ } else {
+ _ptrMaxPRBoundingSet[numBoundingSet] =
+ _boundingSet.Tmmbr(numBoundingSet) * 1000 /
+ static_cast<float>(packet_overhead_bits);
+ }
numBoundingSet++;
// remove from candidate list
candidateSet.ClearEntry(minIndexTMMBR);
@@ -364,10 +372,10 @@
}
bool getNewCandidate = true;
- int curCandidateTMMBR = 0;
- int curCandidateIndex = 0;
- int curCandidatePacketOH = 0;
- int curCandidateSSRC = 0;
+ uint32_t curCandidateTMMBR = 0;
+ size_t curCandidateIndex = 0;
+ uint32_t curCandidatePacketOH = 0;
+ uint32_t curCandidateSSRC = 0;
do
{
if (getNewCandidate)
@@ -389,6 +397,8 @@
// 6. Calculate packet rate and intersection of the current
// line with line of last tuple in selected list
+ RTC_DCHECK_NE(curCandidatePacketOH,
+ _boundingSet.PacketOH(numBoundingSet - 1));
float packetRate
= float(curCandidateTMMBR
- _boundingSet.Tmmbr(numBoundingSet-1))*1000
@@ -418,9 +428,12 @@
curCandidatePacketOH,
curCandidateSSRC);
_ptrIntersectionBoundingSet[numBoundingSet] = packetRate;
- _ptrMaxPRBoundingSet[numBoundingSet]
- = _boundingSet.Tmmbr(numBoundingSet)*1000
- / float(8*_boundingSet.PacketOH(numBoundingSet));
+ float packet_overhead_bits =
+ 8 * _boundingSet.PacketOH(numBoundingSet);
+ RTC_DCHECK_NE(packet_overhead_bits, 0.0f);
+ _ptrMaxPRBoundingSet[numBoundingSet] =
+ _boundingSet.Tmmbr(numBoundingSet) * 1000 /
+ packet_overhead_bits;
numBoundingSet++;
}
numCandidates--;