mirror of
https://github.com/moonlight-stream/moonlight-android.git
synced 2025-07-21 12:03:02 +00:00
Return the oldest packet instead of removing it upon RTP queue constraint violation
This commit is contained in:
parent
537a50bee5
commit
3c11ff63a7
@ -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();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user