Fix the potential infinite loop error in MediaQualityAnalyzer

Fix potential infinite loop in MediaQualityAnalyzer
Modify to keep maximum number of packets stored in MediaQualityAnalyzer
Modify to use signed integer in loop

Bug: 259051981
Test: Long voice call case with device, atest ImsMediaNativeTests

Change-Id: I9b8a01f2d777217e0aa58e4ffaf655ca0ec74938
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioJitterBuffer.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioJitterBuffer.cpp
index 3893e50..0ab5134 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioJitterBuffer.cpp
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioJitterBuffer.cpp
@@ -256,11 +256,10 @@
         else
         {
             // find the position of current data and insert current data to the correct position
-            uint32_t i;
             bool bIsLateArrival = false;
             mDataQueue.SetReadPosFirst();
 
-            for (i = 0; mDataQueue.GetNext(&pEntry); i++)
+            for (int32_t i = 0; mDataQueue.GetNext(&pEntry); i++)
             {
                 // late arrival packet
                 if (!USHORT_SEQ_ROUND_COMPARE(nSeqNum, pEntry->nSeqNum))
@@ -598,8 +597,8 @@
             break;
         }
 
-        IMLOGD4("[Get]  D [ %d / %u / %u / %d ]", pEntry->nSeqNum, pEntry->nTimestamp,
-                mCurrPlayingTS, mDataQueue.GetCount());
+        IMLOGD_PACKET4(IM_PACKET_LOG_JITTER, "[Get]  D [ %d / %u / %u / %d ]", pEntry->nSeqNum,
+                pEntry->nTimestamp, mCurrPlayingTS, mDataQueue.GetCount());
     }
 
     // decrease jitter buffer
@@ -766,12 +765,13 @@
         if (mLastPlayedSeqNum > 0)
         {
             /** Report the loss gap if the loss gap is over 0 */
-            uint32_t lossGap = GET_SEQ_GAP(pEntry->nSeqNum, mLastPlayedSeqNum) - 1;
+            uint16_t lostGap = GET_SEQ_GAP(pEntry->nSeqNum, mLastPlayedSeqNum);
 
-            if (lossGap > 0)
+            if (lostGap > 1)
             {
-                SessionCallbackParameter* param = new SessionCallbackParameter(
-                        kReportPacketLossGap, mLastPlayedSeqNum + 1, lossGap);
+                uint16_t lostSeq = mLastPlayedSeqNum + 1;
+                SessionCallbackParameter* param =
+                        new SessionCallbackParameter(kReportPacketLossGap, lostSeq, lostGap - 1);
                 mCallback->SendEvent(kCollectOptionalInfo, reinterpret_cast<uint64_t>(param), 0);
             }
         }
@@ -836,14 +836,20 @@
         uint32_t* pnDataSize, uint32_t* pnTimestamp, bool* pbMark, uint32_t* pnSeqNum,
         uint32_t* pnChecker)
 {
-    DataEntry* pEntry;
+    if (mDataQueue.GetCount() == 0)
+    {
+        return false;
+    }
+
+    DataEntry* pEntry = NULL;
     uint32_t nFindPartialRedundancyFrameSeq = mCurrPlayingSeq + mRedundancyOffSet;
     bool nFindPartialFrame = false;
 
-    // 1. find redundancy Frame from DataQueue using CAM offset(mRedundancyOffSet)
-    for (uint32_t i = 0; i < mDataQueue.GetCount(); i++)
+    // Find redundancy frame from the DataQueue using CAM offset(mRedundancyOffSet)
+    for (int32_t i = 0; i < mDataQueue.GetCount(); i++)
     {
         mDataQueue.GetAt(i, &pEntry);
+
         if ((pEntry != NULL) && (pEntry->nSeqNum == nFindPartialRedundancyFrameSeq))
         {
             if (psubtype)
@@ -863,7 +869,12 @@
         }
     }
 
-    // 2. check bitrate using dataSize (13.2kbps : data size -> 33 byte)
+    if (pEntry == NULL)
+    {
+        return false;
+    }
+
+    // Check bitrate using dataSize (13.2kbps : data size -> 33 byte)
     if ((nFindPartialFrame != true) || (pEntry->nBufferSize != 33))
     {
         IMLOGD1("[CheckPartialRedundancyFrame] not found or not adjust CAM -- PartialFrame[%d]",
@@ -871,19 +882,20 @@
         return false;
     }
 
-    // 3. check PartialRedundancyFrame using provided QCT code.
-    // need to porting QCT code.
     int16_t nPartialFrameOffset = 0;
     int16_t nPartialFlag = 0;
 
-    // 4. if PartialRedundancyFrame is useable, send ppData and set nChecker variable to
-    // 1, after that, return true. if not, return false.
+    // If PartialRedundancyFrame is useable, send ppData and set nChecker variable to 1, after that,
+    // return true. if not, return false.
     if ((nPartialFlag == 1) && (mRedundancyOffSet == (uint32_t)nPartialFrameOffset))
     {
         IMLOGD2("[CheckPartialRedundancyFrame] adjust CAM -- redundancyOffSet[%d], adjust seq[%d]",
                 mRedundancyOffSet, pEntry->nSeqNum);
         if (pnChecker)
+        {
             *pnChecker = 1;
+        }
+
         return true;
     }
     else
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 2a8074f..c1e8897 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
@@ -21,14 +21,13 @@
 #include <ImsMediaTrace.h>
 #include <ImsMediaAudioUtil.h>
 #include <RtcpXrEncoder.h>
-
 #include <AudioConfig.h>
-
 #include <stdlib.h>
 
 #define DEFAULT_PARAM                -1
 #define DEFAULT_INACTIVITY_TIME      5
 #define CALL_QUALITY_MONITORING_TIME 5
+#define MAX_NUM_PACKET_STORED        500
 
 MediaQualityAnalyzer::MediaQualityAnalyzer()
 {
@@ -151,9 +150,22 @@
 
 void MediaQualityAnalyzer::collectInfo(const int32_t streamType, RtpPacket* packet)
 {
+    if (packet == NULL)
+    {
+        return;
+    }
+
     if (streamType == kStreamRtpTx)
     {
         mListTxPacket.push_back(packet);
+
+        if (mListTxPacket.size() >= MAX_NUM_PACKET_STORED)
+        {
+            RtpPacket* pPacket = mListTxPacket.front();
+            mListTxPacket.pop_front();
+            delete pPacket;
+        }
+
         mMediaQuality->setNumRtpPacketsTransmitted(
                 mMediaQuality->getNumRtpPacketsTransmitted() + 1);
         IMLOGD_PACKET1(IM_PACKET_LOG_RTP, "[collectInfo] tx list size[%d]", mListTxPacket.size());
@@ -211,6 +223,13 @@
         mNumRxPacket++;
         mListRxPacket.push_back(packet);
 
+        if (mListRxPacket.size() >= MAX_NUM_PACKET_STORED)
+        {
+            RtpPacket* pPacket = mListRxPacket.front();
+            mListRxPacket.pop_front();
+            delete pPacket;
+        }
+
         IMLOGD_PACKET3(IM_PACKET_LOG_RTP, "[collectInfo] seq[%d], jitter[%d], rx list size[%d]",
                 packet->seqNum, packet->jitter, mListRxPacket.size());
     }
@@ -242,7 +261,7 @@
         LostPktEntry* entry = new LostPktEntry(seq, value);
         mListLostPacket.push_back(entry);
 
-        for (uint32_t i = 0; i < value; i++)
+        for (int32_t i = 0; i < value; i++)
         {
             // for rtcp xr
             mRtcpXrEncoder->stackRxRtpStatus(kRtpStatusLost, 0);
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/RtcpXrEncoder.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/RtcpXrEncoder.cpp
index e8e3dda..1069e32 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/RtcpXrEncoder.cpp
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/RtcpXrEncoder.cpp
@@ -221,7 +221,7 @@
     {
         if (packet->seqNum >= beginSeq && packet->seqNum <= endSeq)
         {
-            for (uint32_t i = 0; i < packet->param1; i++)
+            for (int32_t i = 0; i < packet->param1; i++)
             {
                 if (packet->seqNum + i > endSeq)
                 {
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/utils/ImsMediaBinaryFormat.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/utils/ImsMediaBinaryFormat.cpp
index be543a7..3d802bc 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/utils/ImsMediaBinaryFormat.cpp
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/utils/ImsMediaBinaryFormat.cpp
@@ -141,7 +141,7 @@
     if ((nDstBuffSize - 1) < ((nSrcSize + 2) / 3 * 4))
         return false;
 
-    for (uint32_t nPos = 0; nPos < nSrcSize; ++nPos)
+    for (int32_t nPos = 0; nPos < nSrcSize; ++nPos)
     {
         c6bit = (pbSrc[nPos] >> 2) & 0x3F;
         (*pEncBuffer) = BASE64_ENCODING_TABLE[(uint8_t)c6bit];
@@ -202,7 +202,7 @@
     if (nDstBuffSize < ((nSrcLen >> 2) * 3 + (nSrcLen & 0x3)))
         return false;
 
-    for (uint32_t nPos = 0; nPos < nSrcLen; ++nPos)
+    for (int32_t nPos = 0; nPos < nSrcLen; ++nPos)
     {
         if (pszSrc[nPos] == LF)
             nPos += 1;
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/utils/ImsMediaBitWriter.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/utils/ImsMediaBitWriter.cpp
index 7bafc1c..bc0bf90 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/utils/ImsMediaBitWriter.cpp
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/utils/ImsMediaBitWriter.cpp
@@ -103,7 +103,7 @@
 {
     uint32_t nRemainBitSize = 32;
 
-    for (uint32_t i = 0; i < 4; i++)
+    for (int32_t i = 0; i < 4; i++)
     {
         nRemainBitSize -= 8;
         uint8_t v = (value >> nRemainBitSize) & 0x00ff;
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/ImsMediaVideoUtil.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/ImsMediaVideoUtil.cpp
index 636364e..4635925 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/ImsMediaVideoUtil.cpp
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/ImsMediaVideoUtil.cpp
@@ -95,7 +95,7 @@
 
     memset(pSPSConfig, 0x00, MAX_CONFIG_LEN);
 
-    for (uint32_t i = 0; i < MAX_CONFIG_LEN; i++)
+    for (int32_t i = 0; i < MAX_CONFIG_LEN; i++)
     {
         uint8_t Comma = ',';
         uint8_t cmpConfig = *(inSpropparam + i);
@@ -179,7 +179,7 @@
 
     memset(pSPSConfig, 0x00, MAX_CONFIG_LEN);
 
-    for (uint32_t i = 0; i < MAX_CONFIG_LEN; i++)
+    for (int32_t i = 0; i < MAX_CONFIG_LEN; i++)
     {
         uint8_t Comma = ',';
         char cmpConfig = *(szSpropparam + i);
@@ -269,7 +269,7 @@
         bitreader.ReadByUEMode();  // Read offset_for_top_to_bottom_field
         uint32_t num_ref_frames_in_pic_order_cnt_cycle =
                 bitreader.ReadByUEMode();  // Read num_ref_frames_in_pic_order_cnt_cycle
-        for (uint32_t i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++)
+        for (int32_t i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++)
         {
             bitreader.ReadByUEMode();  // Read offset_for_ref_frame[i];
         }
@@ -378,7 +378,7 @@
 
     uint32_t nOffset = 0;
 
-    for (uint32_t i = 0; i < nSPSConfigSize - 6; i++)
+    for (int32_t i = 0; i < nSPSConfigSize - 6; i++)
     {
         // NAL unit header offset
         if (pszSpropparam[i] == 0x00 && pszSpropparam[i + 1] == 0x00 &&
@@ -422,7 +422,7 @@
     uint8_t sub_layer_profile_present_flag[sps_max_sub_layers_minus1];
     uint8_t sub_layer_level_present_flag[sps_max_sub_layers_minus1];
 
-    for (uint32_t i = 0; i < sps_max_sub_layers_minus1; i++)
+    for (int32_t i = 0; i < sps_max_sub_layers_minus1; i++)
     {
         sub_layer_profile_present_flag[i] = objBitReader.Read(1);
         sub_layer_level_present_flag[i] = objBitReader.Read(1);
@@ -430,13 +430,13 @@
 
     if (sps_max_sub_layers_minus1 > 0)
     {
-        for (uint32_t j = sps_max_sub_layers_minus1; j < 8; j++)
+        for (int32_t j = sps_max_sub_layers_minus1; j < 8; j++)
         {
             objBitReader.Read(2);
         }
     }
 
-    for (uint32_t i = 0; i < sps_max_sub_layers_minus1; i++)
+    for (int32_t i = 0; i < sps_max_sub_layers_minus1; i++)
     {
         if (sub_layer_profile_present_flag[i])
         {
@@ -595,7 +595,7 @@
         bitreader.ReadByUEMode();  // Read offset_for_top_to_bottom_field
         uint32_t num_ref_frames_in_pic_order_cnt_cycle = bitreader.ReadByUEMode();
 
-        for (uint32_t i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++)
+        for (int32_t i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++)
         {
             bitreader.ReadByUEMode();  // Read offset_for_ref_frame[i];
         }
@@ -665,7 +665,7 @@
 
     uint32_t nOffset = 0;
 
-    for (uint32_t i = 0; i < nBufferSize - 6; i++)
+    for (int32_t i = 0; i < nBufferSize - 6; i++)
     {
         // NAL unit header offset
         if (pbBuffer[i] == 0x00 && pbBuffer[i + 1] == 0x00 && pbBuffer[i + 2] == 0x00 &&
@@ -698,7 +698,7 @@
     uint8_t sub_layer_profile_present_flag[sps_max_sub_layers_minus1];
     uint8_t sub_layer_level_present_flag[sps_max_sub_layers_minus1];
 
-    for (uint32_t i = 0; i < sps_max_sub_layers_minus1; i++)
+    for (int32_t i = 0; i < sps_max_sub_layers_minus1; i++)
     {
         sub_layer_profile_present_flag[i] = objBitReader.Read(1);
         sub_layer_level_present_flag[i] = objBitReader.Read(1);
@@ -706,13 +706,13 @@
 
     if (sps_max_sub_layers_minus1 > 0)
     {
-        for (uint32_t j = sps_max_sub_layers_minus1; j < 8; j++)
+        for (int32_t j = sps_max_sub_layers_minus1; j < 8; j++)
         {
             objBitReader.Read(2);
         }
     }
 
-    for (uint32_t i = 0; i < sps_max_sub_layers_minus1; i++)
+    for (int32_t i = 0; i < sps_max_sub_layers_minus1; i++)
     {
         if (sub_layer_profile_present_flag[i])
         {
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/VideoJitterBuffer.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/VideoJitterBuffer.cpp
index 37823bf..1cc28bc 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/VideoJitterBuffer.cpp
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/VideoJitterBuffer.cpp
@@ -796,7 +796,7 @@
     bool bPLIPkt = false;
     bool bSentPLI = false;
 
-    for (uint32_t index = 0; index < nLossGap; index++)
+    for (int32_t index = 0; index < nLossGap; index++)
     {
         if (UpdateLostPacketList(PID + index, &countSecondNack, &nPLIPkt, &bPLIPkt))
         {
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/android/ImsMediaCamera.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/android/ImsMediaCamera.cpp
index eb2f41c..32bdc4b 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/android/ImsMediaCamera.cpp
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/android/ImsMediaCamera.cpp
@@ -637,8 +637,8 @@
 void OnSessionReady(void* context, ACameraCaptureSession* session)
 {
     IMLOGW1("[OnSessionReady] session[%p] ready", session);
-    reinterpret_cast<ImsMediaCamera*>(context)->OnSessionState(session,
-            CaptureSessionState::kStateReady);
+    reinterpret_cast<ImsMediaCamera*>(context)->OnSessionState(
+            session, CaptureSessionState::kStateReady);
 }
 
 void OnSessionActive(void* context, ACameraCaptureSession* session)
@@ -883,7 +883,7 @@
     ACameraMetadata_const_entry entry;
     ACameraMetadata_getConstEntry(metadata, ACAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, &entry);
 
-    for (uint32_t i = 0; i < entry.count; i += 4)
+    for (int32_t i = 0; i < entry.count; i += 4)
     {
         int32_t input = entry.data.i32[i + 3];
         int32_t format = entry.data.i32[i + 0];
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/nodes/IVideoRendererNode.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/nodes/IVideoRendererNode.cpp
index f67a020..1d30f52 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/nodes/IVideoRendererNode.cpp
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/nodes/IVideoRendererNode.cpp
@@ -832,7 +832,7 @@
         nNumOfConfigString = 3;
     }
 
-    for (uint32_t i = 0; i < nNumOfConfigString; i++)
+    for (int32_t i = 0; i < nNumOfConfigString; i++)
     {
         uint8_t* pConfigData = NULL;
         uint32_t nConfigLen = mConfigLen[i];
diff --git a/tests/native/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/MediaQualityAnalyzerTest.cpp b/tests/native/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/MediaQualityAnalyzerTest.cpp
index bb49c03..af9320f 100644
--- a/tests/native/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/MediaQualityAnalyzerTest.cpp
+++ b/tests/native/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/MediaQualityAnalyzerTest.cpp
@@ -148,7 +148,7 @@
     EXPECT_CALL(callback, onEvent(kAudioCallQualityChangedInd, _, _)).Times(2);
     analyzer->startTimer(1000);
 
-    for (uint32_t i = 0; i < 10; i++)
+    for (int32_t i = 0; i < 10; i++)
     {
         RtpPacket* packet = new RtpPacket();
 
@@ -177,7 +177,7 @@
     analyzer->setJitterThreshold(1, 10);
     analyzer->startTimer(1000);
 
-    for (uint32_t i = 0; i < 20; i++)
+    for (int32_t i = 0; i < 20; i++)
     {
         RtpPacket* packet = new RtpPacket();
         packet->seqNum = i;
@@ -197,7 +197,7 @@
     analyzer->setPacketLossThreshold(1, 1);
     analyzer->startTimer(1000);
 
-    for (uint32_t i = 0; i < 10; i++)
+    for (int32_t i = 0; i < 10; i++)
     {
         RtpPacket* packet = new RtpPacket();