Catch RTP FEC queue corruption earlier

This commit is contained in:
Cameron Gutman 2018-09-04 15:56:02 -07:00
parent 4a3521cfc6
commit fa7b23f339
2 changed files with 6 additions and 6 deletions

View File

@ -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;

View File

@ -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