Loading media/libstagefright/rtsp/ARTPSource.cpp +24 −4 Original line number Diff line number Diff line Loading @@ -43,7 +43,10 @@ ARTPSource::ARTPSource( const sp<AMessage> ¬ify) : mID(id), mHighestSeqNumber(0), mPrevExpected(0), mBaseSeqNumber(0), mNumBuffersReceived(0), mPrevNumBuffersReceived(0), mLastNTPTime(0), mLastNTPTimeUpdateUs(0), mIssueFIRRequests(false), Loading Loading @@ -107,6 +110,7 @@ bool ARTPSource::queuePacket(const sp<ABuffer> &buffer) { if (mNumBuffersReceived++ == 0) { mHighestSeqNumber = seqNum; mBaseSeqNumber = seqNum; mQueue.push_back(buffer); return true; } Loading Loading @@ -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; Loading @@ -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; Loading media/libstagefright/rtsp/ARTPSource.h +3 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading
media/libstagefright/rtsp/ARTPSource.cpp +24 −4 Original line number Diff line number Diff line Loading @@ -43,7 +43,10 @@ ARTPSource::ARTPSource( const sp<AMessage> ¬ify) : mID(id), mHighestSeqNumber(0), mPrevExpected(0), mBaseSeqNumber(0), mNumBuffersReceived(0), mPrevNumBuffersReceived(0), mLastNTPTime(0), mLastNTPTimeUpdateUs(0), mIssueFIRRequests(false), Loading Loading @@ -107,6 +110,7 @@ bool ARTPSource::queuePacket(const sp<ABuffer> &buffer) { if (mNumBuffersReceived++ == 0) { mHighestSeqNumber = seqNum; mBaseSeqNumber = seqNum; mQueue.push_back(buffer); return true; } Loading Loading @@ -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; Loading @@ -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; Loading
media/libstagefright/rtsp/ARTPSource.h +3 −0 Original line number Diff line number Diff line Loading @@ -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; Loading