mirror of
https://github.com/moonlight-stream/moonlight-common-c.git
synced 2025-08-18 01:15:46 +00:00
Catch RTP FEC queue corruption earlier
This commit is contained in:
parent
4a3521cfc6
commit
fa7b23f339
@ -5,7 +5,6 @@
|
|||||||
void RtpfInitializeQueue(PRTP_FEC_QUEUE queue) {
|
void RtpfInitializeQueue(PRTP_FEC_QUEUE queue) {
|
||||||
reed_solomon_init();
|
reed_solomon_init();
|
||||||
memset(queue, 0, sizeof(*queue));
|
memset(queue, 0, sizeof(*queue));
|
||||||
queue->nextRtpSequenceNumber = UINT16_MAX;
|
|
||||||
|
|
||||||
queue->currentFrameNumber = UINT16_MAX;
|
queue->currentFrameNumber = UINT16_MAX;
|
||||||
}
|
}
|
||||||
@ -28,7 +27,7 @@ void RtpfCleanupQueue(PRTP_FEC_QUEUE queue) {
|
|||||||
static int queuePacket(PRTP_FEC_QUEUE queue, PRTPFEC_QUEUE_ENTRY newEntry, int head, PRTP_PACKET packet, int length, int isParity) {
|
static int queuePacket(PRTP_FEC_QUEUE queue, PRTPFEC_QUEUE_ENTRY newEntry, int head, PRTP_PACKET packet, int length, int isParity) {
|
||||||
PRTPFEC_QUEUE_ENTRY entry;
|
PRTPFEC_QUEUE_ENTRY entry;
|
||||||
|
|
||||||
LC_ASSERT(!isBefore16(packet->sequenceNumber, queue->nextRtpSequenceNumber));
|
LC_ASSERT(!isBefore16(packet->sequenceNumber, queue->bufferLowestSequenceNumber));
|
||||||
|
|
||||||
// Don't queue duplicates either
|
// Don't queue duplicates either
|
||||||
entry = queue->bufferHead;
|
entry = queue->bufferHead;
|
||||||
@ -212,8 +211,8 @@ static void removeEntry(PRTP_FEC_QUEUE queue, PRTPFEC_QUEUE_ENTRY entry) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int RtpfAddPacket(PRTP_FEC_QUEUE queue, PRTP_PACKET packet, int length, PRTPFEC_QUEUE_ENTRY packetEntry) {
|
int RtpfAddPacket(PRTP_FEC_QUEUE queue, PRTP_PACKET packet, int length, PRTPFEC_QUEUE_ENTRY packetEntry) {
|
||||||
if (isBefore16(packet->sequenceNumber, queue->nextRtpSequenceNumber)) {
|
if (isBefore16(packet->sequenceNumber, queue->bufferLowestSequenceNumber)) {
|
||||||
// Reject packets behind our current sequence number
|
// Reject packets behind our current buffer window
|
||||||
return RTPF_RET_REJECTED;
|
return RTPF_RET_REJECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -241,7 +240,6 @@ int RtpfAddPacket(PRTP_FEC_QUEUE queue, PRTP_PACKET packet, int length, PRTPFEC_
|
|||||||
}
|
}
|
||||||
|
|
||||||
queue->currentFrameNumber = nvPacket->frameIndex;
|
queue->currentFrameNumber = nvPacket->frameIndex;
|
||||||
queue->nextRtpSequenceNumber = queue->bufferHighestSequenceNumber;
|
|
||||||
|
|
||||||
// Discard any unsubmitted buffers from the previous frame
|
// Discard any unsubmitted buffers from the previous frame
|
||||||
while (queue->bufferHead != NULL) {
|
while (queue->bufferHead != NULL) {
|
||||||
@ -263,6 +261,9 @@ int RtpfAddPacket(PRTP_FEC_QUEUE queue, PRTP_PACKET packet, int length, PRTPFEC_
|
|||||||
} else if (isBefore16(queue->bufferHighestSequenceNumber, packet->sequenceNumber)) {
|
} else if (isBefore16(queue->bufferHighestSequenceNumber, packet->sequenceNumber)) {
|
||||||
queue->bufferHighestSequenceNumber = packet->sequenceNumber;
|
queue->bufferHighestSequenceNumber = packet->sequenceNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LC_ASSERT(((nvPacket->fecInfo & 0xFF0) >> 4) == queue->fecPercentage);
|
||||||
|
LC_ASSERT(((nvPacket->fecInfo & 0xFFF00000) >> 20) / 4 == queue->bufferDataPackets);
|
||||||
|
|
||||||
if (!queuePacket(queue, packetEntry, 0, packet, length, !isBefore16(packet->sequenceNumber, queue->bufferFirstParitySequenceNumber))) {
|
if (!queuePacket(queue, packetEntry, 0, packet, length, !isBefore16(packet->sequenceNumber, queue->bufferFirstParitySequenceNumber))) {
|
||||||
return RTPF_RET_REJECTED;
|
return RTPF_RET_REJECTED;
|
||||||
|
@ -28,7 +28,6 @@ typedef struct _RTP_FEC_QUEUE {
|
|||||||
int fecPercentage;
|
int fecPercentage;
|
||||||
|
|
||||||
int currentFrameNumber;
|
int currentFrameNumber;
|
||||||
unsigned int nextRtpSequenceNumber;
|
|
||||||
} RTP_FEC_QUEUE, *PRTP_FEC_QUEUE;
|
} RTP_FEC_QUEUE, *PRTP_FEC_QUEUE;
|
||||||
|
|
||||||
#define RTPF_RET_QUEUED_NOTHING_READY 0
|
#define RTPF_RET_QUEUED_NOTHING_READY 0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user