Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d18a2c7d authored by Josh Hou's avatar Josh Hou Committed by Android (Google) Code Review
Browse files

Merge "VT: Fix overflow condition in JitterCalc" into sc-qpr1-dev

parents ff5e1684 fa2ed5eb
Loading
Loading
Loading
Loading
+11 −17
Original line number Diff line number Diff line
@@ -38,14 +38,13 @@ void JitterCalc::init(uint32_t rtpTime, int64_t arrivalTimeUs, int32_t base, int
    mInterArrivalJitterUs = inter;
}

void JitterCalc::putBaseData(int64_t rtpTime, int64_t arrivalTimeUs) {
    // A RTP time wraps around after UINT32_MAX. We must consider this case.
    const int64_t UINT32_MSB = 0x80000000;
    int64_t overflowMask = (mFirstTimeStamp & UINT32_MSB & ~rtpTime) << 1;
    int64_t tempRtpTime = overflowMask | rtpTime;
void JitterCalc::putBaseData(uint32_t rtpTime, int64_t arrivalTimeUs) {
    // A RTP time wraps around after UINT32_MAX. Overflow can present.
    uint32_t diff = 0;
    __builtin_usub_overflow(rtpTime, mFirstTimeStamp, &diff);

    // Base jitter implementation can be various
    int64_t scheduledTimeUs = (tempRtpTime - (int64_t)mFirstTimeStamp) * 1000000ll / mClockRate;
    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;
@@ -53,18 +52,13 @@ void JitterCalc::putBaseData(int64_t rtpTime, int64_t arrivalTimeUs) {
            (long long)mBaseJitterUs, (long long)correctionTimeUs);
}

void JitterCalc::putInterArrivalData(int64_t rtpTime, int64_t arrivalTimeUs) {
    const int64_t UINT32_MSB = 0x80000000;
    int64_t tempRtpTime = rtpTime;
    int64_t tempLastTimeStamp = mLastTimeStamp;

    // A RTP time wraps around after UINT32_MAX. We must consider this case.
    int64_t overflowMask = (mLastTimeStamp ^ rtpTime) & UINT32_MSB;
    tempRtpTime |= ((overflowMask & ~rtpTime) << 1);
    tempLastTimeStamp |= ((overflowMask & ~mLastTimeStamp) << 1);
void JitterCalc::putInterArrivalData(uint32_t rtpTime, int64_t arrivalTimeUs) {
    // A RTP time wraps around after UINT32_MAX. Overflow can present.
    uint32_t diff = 0;
    __builtin_usub_overflow(rtpTime, mLastTimeStamp, &diff);

    // 6.4.1 of RFC3550 defines this interarrival jitter value.
    int64_t diffTimeStampUs = abs(tempRtpTime - tempLastTimeStamp) * 1000000ll / mClockRate;
    int64_t diffTimeStampUs = abs((int32_t)diff) * 1000000ll / mClockRate;
    int64_t diffArrivalUs = arrivalTimeUs - mLastArrivalTimeUs; // Can't be minus
    ALOGV("diffTimeStampUs %lld \t\t diffArrivalUs %lld",
            (long long)diffTimeStampUs, (long long)diffArrivalUs);
@@ -72,7 +66,7 @@ void JitterCalc::putInterArrivalData(int64_t rtpTime, int64_t arrivalTimeUs) {
    int64_t varianceUs = diffArrivalUs - diffTimeStampUs;
    mInterArrivalJitterUs = (mInterArrivalJitterUs * 15 + abs(varianceUs)) / 16;

    mLastTimeStamp = (uint32_t)rtpTime;
    mLastTimeStamp = rtpTime;
    mLastArrivalTimeUs = arrivalTimeUs;
}

+2 −2
Original line number Diff line number Diff line
@@ -40,8 +40,8 @@ public:
    JitterCalc(int32_t clockRate);

    void init(uint32_t rtpTime, int64_t arrivalTimeUs, int32_t base, int32_t inter);
    void putInterArrivalData(int64_t rtpTime, int64_t arrivalTime);
    void putBaseData(int64_t rtpTime, int64_t arrivalTimeUs);
    void putInterArrivalData(uint32_t rtpTime, int64_t arrivalTime);
    void putBaseData(uint32_t rtpTime, int64_t arrivalTimeUs);
    int32_t getBaseJitterMs();
    int32_t getInterArrivalJitterMs();
};