summaryrefslogtreecommitdiff
path: root/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/MediaQualityAnalyzer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/MediaQualityAnalyzer.cpp')
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/MediaQualityAnalyzer.cpp82
1 files changed, 48 insertions, 34 deletions
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/MediaQualityAnalyzer.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/MediaQualityAnalyzer.cpp
index 55c2568b..491d9172 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/MediaQualityAnalyzer.cpp
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/MediaQualityAnalyzer.cpp
@@ -24,6 +24,7 @@
#include <AudioConfig.h>
#include <stdlib.h>
#include <algorithm>
+#include <numeric>
#define DEFAULT_PARAM (-1)
#define DEFAULT_INACTIVITY_TIME_FOR_CALL_QUALITY (4)
@@ -155,12 +156,7 @@ void MediaQualityAnalyzer::collectInfo(const int32_t streamType, RtpPacket* pack
}
else if (streamType == kStreamRtpRx && packet != nullptr)
{
- if (mSSRC != DEFAULT_PARAM && mSSRC != packet->ssrc)
- {
- IMLOGW0("[collectInfo] ssrc changed");
- }
-
- // for call qualty report
+ // for call quality report
mCallQuality.setNumRtpPacketsReceived(mCallQuality.getNumRtpPacketsReceived() + 1);
mCallQualitySumRelativeJitter += packet->jitter;
@@ -186,8 +182,8 @@ void MediaQualityAnalyzer::collectInfo(const int32_t streamType, RtpPacket* pack
break;
}
- // for loss rate, jitter check
- if (mSSRC == DEFAULT_PARAM) // stream is reset
+ // for jitter check
+ if (mSSRC != packet->ssrc) // stream is reset
{
mJitterRxPacket = std::abs(packet->jitter);
// update rtcp-xr params
@@ -424,7 +420,7 @@ void MediaQualityAnalyzer::processMediaQuality()
if (mPacketLossDuration != 0 && !mListLostPacket.empty())
{
- // calculate loss in duration
+ // counts received packets for the duration
int32_t numReceivedPacketsInDuration =
std::count_if(mListRxPacket.begin(), mListRxPacket.end(),
[=](RtpPacket* packet)
@@ -433,12 +429,21 @@ void MediaQualityAnalyzer::processMediaQuality()
mPacketLossDuration);
});
+ // cumulates the number of lost packets for the duration
+ std::list<LostPacket*> listLostPacketInDuration;
+ std::copy_if(mListLostPacket.begin(), mListLostPacket.end(),
+ std::back_inserter(listLostPacketInDuration),
+ [=](LostPacket* packet)
+ {
+ return (ImsMediaTimer::GetTimeInMilliSeconds() - packet->markedTime <=
+ mPacketLossDuration);
+ });
+
int32_t numLostPacketsInDuration =
- std::count_if(mListLostPacket.begin(), mListLostPacket.end(),
- [=](LostPacket* packet)
+ std::accumulate(begin(listLostPacketInDuration), end(listLostPacketInDuration), 0,
+ [=](int i, const LostPacket* packet)
{
- return (ImsMediaTimer::GetTimeInMilliSeconds() - packet->markedTime <=
- mPacketLossDuration);
+ return packet->numLoss + i;
});
if (numLostPacketsInDuration == 0 || numReceivedPacketsInDuration == 0)
@@ -450,8 +455,8 @@ void MediaQualityAnalyzer::processMediaQuality()
int32_t lossRate = numLostPacketsInDuration * 100 /
(numReceivedPacketsInDuration + numLostPacketsInDuration);
- IMLOGD3("[processData] mediaQualtyStatus lossRate[%d], received[%d], lost[%d]",
- lossRate, numReceivedPacketsInDuration, numLostPacketsInDuration);
+ IMLOGD3("[processMediaQuality] lossRate[%d], received[%d], lost[%d]", lossRate,
+ numReceivedPacketsInDuration, numLostPacketsInDuration);
mQualityStatus.setRtpPacketLossRate(lossRate);
}
}
@@ -460,6 +465,27 @@ void MediaQualityAnalyzer::processMediaQuality()
mQualityStatus.setRtpPacketLossRate(0);
}
+ bool shouldNotify = false;
+
+ // check jitter notification
+ if (!mJitterThreshold.empty())
+ {
+ if (mJitterChecker.checkNotifiable(mJitterThreshold, mQualityStatus.getRtpJitterMillis()))
+ {
+ shouldNotify = true;
+ }
+ }
+
+ // check packet loss notification
+ if (!mPacketLossThreshold.empty())
+ {
+ if (mPacketLossChecker.checkNotifiable(
+ mPacketLossThreshold, mQualityStatus.getRtpPacketLossRate()))
+ {
+ shouldNotify = true;
+ }
+ }
+
IMLOGD_PACKET4(IM_PACKET_LOG_RTP,
"[processMediaQuality] rtpInactivity[%d], rtcpInactivity[%d], lossRate[%d], "
"jitter[%d]",
@@ -499,25 +525,9 @@ void MediaQualityAnalyzer::processMediaQuality()
return;
}
- // check jitter notification
- if (!mJitterThreshold.empty())
- {
- if (mJitterChecker.checkNotifiable(mJitterThreshold, mQualityStatus.getRtpJitterMillis()))
- {
- notifyMediaQualityStatus();
- return;
- }
- }
-
- // check packet loss notification
- if (!mPacketLossThreshold.empty())
+ if (shouldNotify)
{
- if (mPacketLossChecker.checkNotifiable(
- mPacketLossThreshold, mQualityStatus.getRtpPacketLossRate()))
- {
- notifyMediaQualityStatus();
- return;
- }
+ notifyMediaQualityStatus();
}
}
@@ -585,7 +595,11 @@ uint32_t MediaQualityAnalyzer::getTxPacketSize()
uint32_t MediaQualityAnalyzer::getLostPacketSize()
{
- return mListLostPacket.size();
+ return std::accumulate(begin(mListLostPacket), end(mListLostPacket), 0,
+ [](int i, const LostPacket* packet)
+ {
+ return packet->numLoss + i;
+ });
}
void MediaQualityAnalyzer::SendEvent(uint32_t event, uint64_t paramA, uint64_t paramB)