mirror of
https://github.com/moonlight-stream/moonlight-common-c.git
synced 2026-06-18 14:51:30 +00:00
Fix decoding of large FEC index values (greater than 255)
This commit is contained in:
+7
-5
@@ -228,6 +228,8 @@ int RtpfAddPacket(PRTP_FEC_QUEUE queue, PRTP_PACKET packet, int length, PRTPFEC_
|
|||||||
return RTPF_RET_REJECTED;
|
return RTPF_RET_REJECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int fecIndex = (nvPacket->fecInfo & 0x3FF000) >> 12;
|
||||||
|
|
||||||
// Reinitialize the queue if it's empty after a frame delivery or
|
// Reinitialize the queue if it's empty after a frame delivery or
|
||||||
// if we can't finish a frame before receiving the next one.
|
// if we can't finish a frame before receiving the next one.
|
||||||
if (queue->bufferSize == 0 || queue->currentFrameNumber != nvPacket->frameIndex) {
|
if (queue->bufferSize == 0 || queue->currentFrameNumber != nvPacket->frameIndex) {
|
||||||
@@ -251,19 +253,19 @@ int RtpfAddPacket(PRTP_FEC_QUEUE queue, PRTP_PACKET packet, int length, PRTPFEC_
|
|||||||
queue->bufferTail = NULL;
|
queue->bufferTail = NULL;
|
||||||
queue->bufferSize = 0;
|
queue->bufferSize = 0;
|
||||||
|
|
||||||
int fecIndex = (nvPacket->fecInfo & 0xFF000) >> 12;
|
|
||||||
queue->bufferLowestSequenceNumber = U16(packet->sequenceNumber - fecIndex);
|
queue->bufferLowestSequenceNumber = U16(packet->sequenceNumber - fecIndex);
|
||||||
queue->receivedBufferDataPackets = 0;
|
queue->receivedBufferDataPackets = 0;
|
||||||
queue->bufferHighestSequenceNumber = packet->sequenceNumber;
|
queue->bufferHighestSequenceNumber = packet->sequenceNumber;
|
||||||
queue->bufferDataPackets = ((nvPacket->fecInfo & 0xFFF00000) >> 20) / 4;
|
queue->bufferDataPackets = (nvPacket->fecInfo & 0xFFC00000) >> 22;
|
||||||
queue->fecPercentage = ((nvPacket->fecInfo & 0xFF0) >> 4);
|
queue->fecPercentage = (nvPacket->fecInfo & 0xFF0) >> 4;
|
||||||
queue->bufferFirstParitySequenceNumber = U16(queue->bufferLowestSequenceNumber + queue->bufferDataPackets);
|
queue->bufferFirstParitySequenceNumber = U16(queue->bufferLowestSequenceNumber + queue->bufferDataPackets);
|
||||||
} 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(U16(packet->sequenceNumber - fecIndex) == queue->bufferLowestSequenceNumber);
|
||||||
LC_ASSERT(((nvPacket->fecInfo & 0xFFF00000) >> 20) / 4 == queue->bufferDataPackets);
|
LC_ASSERT((nvPacket->fecInfo & 0xFF0) >> 4 == queue->fecPercentage);
|
||||||
|
LC_ASSERT((nvPacket->fecInfo & 0xFFC00000) >> 22 == 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;
|
||||||
|
|||||||
Reference in New Issue
Block a user