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

Commit 5451d9ce authored by joakim johansson's avatar joakim johansson Committed by Takahiro Aizawa
Browse files

Implement packet loss calculations in Receiver Reports

In order to support servers that have implemented the
dynamic bandwidth adaptation feature are these
fields added to the receiver report:
      -Fraction
      -Cumulative number of packet loss

The calculation is based on RFC 3550, section A.3.

Test: play RTSP video and check receiver reports with network tool
Bug: 62610498

Change-Id: I2092fb62698e7209c59fade1b17a6460ac236def
parent 809ea9d9
Loading
Loading
Loading
Loading
+24 −4
Original line number Diff line number Diff line
@@ -43,7 +43,10 @@ ARTPSource::ARTPSource(
        const sp<AMessage> &notify)
    : mID(id),
      mHighestSeqNumber(0),
      mPrevExpected(0),
      mBaseSeqNumber(0),
      mNumBuffersReceived(0),
      mPrevNumBuffersReceived(0),
      mLastNTPTime(0),
      mLastNTPTimeUpdateUs(0),
      mIssueFIRRequests(false),
@@ -107,6 +110,7 @@ bool ARTPSource::queuePacket(const sp<ABuffer> &buffer) {

    if (mNumBuffersReceived++ == 0) {
        mHighestSeqNumber = seqNum;
        mBaseSeqNumber = seqNum;
        mQueue.push_back(buffer);
        return true;
    }
@@ -226,6 +230,22 @@ void ARTPSource::addReceiverReport(const sp<ABuffer> &buffer) {
        return;
    }

    uint8_t fraction = 0;

    // According to appendix A.3 in RFC 3550
    uint32_t expected = mHighestSeqNumber - mBaseSeqNumber + 1;
    int64_t intervalExpected = expected - mPrevExpected;
    int64_t intervalReceived = mNumBuffersReceived - mPrevNumBuffersReceived;
    int64_t intervalPacketLost = intervalExpected - intervalReceived;

    if (intervalExpected > 0 && intervalPacketLost > 0) {
        fraction = (intervalPacketLost << 8) / intervalExpected;
    }

    mPrevExpected = expected;
    mPrevNumBuffersReceived = mNumBuffersReceived;
    int32_t cumulativePacketLost = (int32_t)expected - mNumBuffersReceived;

    uint8_t *data = buffer->data() + buffer->size();

    data[0] = 0x80 | 1;
@@ -242,11 +262,11 @@ void ARTPSource::addReceiverReport(const sp<ABuffer> &buffer) {
    data[10] = (mID >> 8) & 0xff;
    data[11] = mID & 0xff;

    data[12] = 0x00;  // fraction lost
    data[12] = fraction;  // fraction lost

    data[13] = 0x00;  // cumulative lost
    data[14] = 0x00;
    data[15] = 0x00;
    data[13] = cumulativePacketLost >> 16;  // cumulative lost
    data[14] = (cumulativePacketLost >> 8) & 0xff;
    data[15] = cumulativePacketLost & 0xff;

    data[16] = mHighestSeqNumber >> 24;
    data[17] = (mHighestSeqNumber >> 16) & 0xff;
+3 −0
Original line number Diff line number Diff line
@@ -49,7 +49,10 @@ struct ARTPSource : public RefBase {
private:
    uint32_t mID;
    uint32_t mHighestSeqNumber;
    uint32_t mPrevExpected;
    uint32_t mBaseSeqNumber;
    int32_t mNumBuffersReceived;
    int32_t mPrevNumBuffersReceived;

    List<sp<ABuffer> > mQueue;
    sp<ARTPAssembler> mAssembler;