stagefright: rtsp: handle overflow in jitter calculation
Handle scenario when base jitter is fully 32-bit long.
Bug: 301990510
Test: Video long call / VT generic test
Change-Id: Ic0a4807885429da5354f0b3fc83c6198a20d9c44
diff --git a/media/libstagefright/rtsp/JitterCalculator.cpp b/media/libstagefright/rtsp/JitterCalculator.cpp
index 93afe9c..5411a22 100644
--- a/media/libstagefright/rtsp/JitterCalculator.cpp
+++ b/media/libstagefright/rtsp/JitterCalculator.cpp
@@ -47,7 +47,14 @@
int64_t scheduledTimeUs = ((int32_t)diff) * 1000000ll / mClockRate;
int64_t elapsedTimeUs = arrivalTimeUs - mFirstArrivalTimeUs;
int64_t correctionTimeUs = elapsedTimeUs - scheduledTimeUs; // additional propagation delay;
- mBaseJitterUs = (mBaseJitterUs * 15 + correctionTimeUs) / 16;
+
+ // We want to approximate correctionTimeUs by slowly (1:15) averaging into jitter base, but
+ // both correction time and base jitter can roll over. Adjust correctionTime to be close to
+ // base jitter. Accomplish this by calculating the closest 32-bit delta (positive or
+ // negative) and applying 1/16th of it to the base jitter.
+ int32_t correctionDiff;
+ (void)__builtin_sub_overflow(correctionTimeUs, mBaseJitterUs, &correctionDiff);
+ mBaseJitterUs = int32_t(int64_t(mBaseJitterUs) + correctionDiff / 16);
ALOGV("BaseJitterUs : %lld \t\t correctionTimeUs : %lld",
(long long)mBaseJitterUs, (long long)correctionTimeUs);
}