Merge "Implement packet loss calculations in Receiver Reports"
diff --git a/media/libstagefright/rtsp/ARTPSource.cpp b/media/libstagefright/rtsp/ARTPSource.cpp
index 576a0a4..4827cd2 100644
--- a/media/libstagefright/rtsp/ARTPSource.cpp
+++ b/media/libstagefright/rtsp/ARTPSource.cpp
@@ -43,7 +43,10 @@
const sp<AMessage> ¬ify)
: mID(id),
mHighestSeqNumber(0),
+ mPrevExpected(0),
+ mBaseSeqNumber(0),
mNumBuffersReceived(0),
+ mPrevNumBuffersReceived(0),
mLastNTPTime(0),
mLastNTPTimeUpdateUs(0),
mIssueFIRRequests(false),
@@ -107,6 +110,7 @@
if (mNumBuffersReceived++ == 0) {
mHighestSeqNumber = seqNum;
+ mBaseSeqNumber = seqNum;
mQueue.push_back(buffer);
return true;
}
@@ -226,6 +230,22 @@
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 @@
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;
diff --git a/media/libstagefright/rtsp/ARTPSource.h b/media/libstagefright/rtsp/ARTPSource.h
index b70f94e..f44e83f 100644
--- a/media/libstagefright/rtsp/ARTPSource.h
+++ b/media/libstagefright/rtsp/ARTPSource.h
@@ -49,7 +49,10 @@
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;