Return the oldest packet instead of removing it upon RTP queue constraint violation

This commit is contained in:
Cameron Gutman 2016-05-07 20:26:44 -04:00
parent 537a50bee5
commit 3c11ff63a7

View File

@ -14,7 +14,6 @@ public class RtpReorderQueue {
private short nextRtpSequenceNumber; private short nextRtpSequenceNumber;
private long oldestQueuedTime; private long oldestQueuedTime;
private RtpQueueEntry oldestQueuedEntry;
public enum RtpQueueStatus { public enum RtpQueueStatus {
HANDLE_IMMEDIATELY, HANDLE_IMMEDIATELY,
@ -65,7 +64,6 @@ public class RtpReorderQueue {
if (oldestQueuedTime == Long.MAX_VALUE) { if (oldestQueuedTime == Long.MAX_VALUE) {
oldestQueuedTime = entry.queueTime; oldestQueuedTime = entry.queueTime;
oldestQueuedEntry = entry;
} }
// Add a reference to the packet while it's in the queue // Add a reference to the packet while it's in the queue
@ -83,10 +81,8 @@ public class RtpReorderQueue {
private void updateOldestQueued() { private void updateOldestQueued() {
oldestQueuedTime = Long.MAX_VALUE; oldestQueuedTime = Long.MAX_VALUE;
oldestQueuedEntry = null;
for (RtpQueueEntry entry : queue) { for (RtpQueueEntry entry : queue) {
if (entry.queueTime < oldestQueuedTime) { if (entry.queueTime < oldestQueuedTime) {
oldestQueuedEntry = entry;
oldestQueuedTime = entry.queueTime; oldestQueuedTime = entry.queueTime;
} }
} }
@ -114,36 +110,28 @@ public class RtpReorderQueue {
return lowestSeqEntry; return lowestSeqEntry;
} }
private void removeEntry(RtpQueueEntry entry) {
queue.remove(entry);
entry.packet.dereferencePacket();
}
private RtpQueueEntry validateQueueConstraints() { private RtpQueueEntry validateQueueConstraints() {
if (queue.isEmpty()) { if (queue.isEmpty()) {
return null; return null;
} }
boolean needsUpdate = false; boolean dequeuePacket = false;
// Check that the queue's time constraint is satisfied // Check that the queue's time constraint is satisfied
if (TimeHelper.getMonotonicMillis() - oldestQueuedTime > maxQueueTime) { if (TimeHelper.getMonotonicMillis() - oldestQueuedTime > maxQueueTime) {
LimeLog.info("Discarding RTP packet queued for too long: "+(TimeHelper.getMonotonicMillis() - oldestQueuedTime)); LimeLog.info("Returning RTP packet queued for too long: "+(TimeHelper.getMonotonicMillis() - oldestQueuedTime));
removeEntry(oldestQueuedEntry); dequeuePacket = true;
needsUpdate = true;
} }
// Check that the queue's size constraint is satisfied // Check that the queue's size constraint is satisfied. We subtract one
if (queue.size() == maxSize) { // because this is validating that the queue will meet constraints _after_
// the current packet is enqueued.
if (!dequeuePacket && queue.size() == maxSize - 1) {
LimeLog.info("Discarding RTP packet after queue overgrowth"); LimeLog.info("Discarding RTP packet after queue overgrowth");
removeEntry(oldestQueuedEntry); dequeuePacket = true;
needsUpdate = true;
} }
if (needsUpdate) { if (dequeuePacket) {
// Recalculate the oldest entry if needed
updateOldestQueued();
// Return the lowest seq queued // Return the lowest seq queued
return getEntryByLowestSeq(); return getEntryByLowestSeq();
} }