mirror of
https://github.com/moonlight-stream/moonlight-common-c.git
synced 2026-04-24 00:47:26 +00:00
Prevent the depacketizer from receiving parity packets
This commit is contained in:
@@ -28,7 +28,7 @@ void RtpfCleanupQueue(PRTP_FEC_QUEUE queue) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// newEntry is contained within the packet buffer so we free the whole entry by freeing entry->packet
|
// newEntry is contained within the packet buffer so we free the whole entry by freeing entry->packet
|
||||||
static int queuePacket(PRTP_FEC_QUEUE queue, PRTPFEC_QUEUE_ENTRY newEntry, int head, PRTP_PACKET packet, int length) {
|
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(!isBefore(packet->sequenceNumber, queue->nextRtpSequenceNumber));
|
LC_ASSERT(!isBefore(packet->sequenceNumber, queue->nextRtpSequenceNumber));
|
||||||
@@ -45,6 +45,7 @@ static int queuePacket(PRTP_FEC_QUEUE queue, PRTPFEC_QUEUE_ENTRY newEntry, int h
|
|||||||
|
|
||||||
newEntry->packet = packet;
|
newEntry->packet = packet;
|
||||||
newEntry->length = length;
|
newEntry->length = length;
|
||||||
|
newEntry->isParity = isParity;
|
||||||
newEntry->prev = NULL;
|
newEntry->prev = NULL;
|
||||||
newEntry->next = NULL;
|
newEntry->next = NULL;
|
||||||
|
|
||||||
@@ -170,7 +171,8 @@ cleanup_packets:
|
|||||||
// discarded by decoders. It's not safe to strip all zero padding because
|
// discarded by decoders. It's not safe to strip all zero padding because
|
||||||
// it may be a legitimate part of the H.264 bytestream.
|
// it may be a legitimate part of the H.264 bytestream.
|
||||||
|
|
||||||
queuePacket(queue, queueEntry, 0, rtpPacket, StreamConfig.packetSize + dataOffset);
|
LC_ASSERT(isBefore(rtpPacket->sequenceNumber, queue->bufferFirstParitySequenceNumber));
|
||||||
|
queuePacket(queue, queueEntry, 0, rtpPacket, StreamConfig.packetSize + dataOffset, 0);
|
||||||
} else if (packets[i] != NULL) {
|
} else if (packets[i] != NULL) {
|
||||||
free(packets[i]);
|
free(packets[i]);
|
||||||
}
|
}
|
||||||
@@ -264,7 +266,7 @@ int RtpfAddPacket(PRTP_FEC_QUEUE queue, PRTP_PACKET packet, int length, PRTPFEC_
|
|||||||
queue->bufferHighestSequenceNumber = packet->sequenceNumber;
|
queue->bufferHighestSequenceNumber = packet->sequenceNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!queuePacket(queue, packetEntry, 0, packet, length)) {
|
if (!queuePacket(queue, packetEntry, 0, packet, length, !isBefore(packet->sequenceNumber, queue->bufferFirstParitySequenceNumber))) {
|
||||||
return RTPF_RET_REJECTED;
|
return RTPF_RET_REJECTED;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -307,6 +309,22 @@ PRTPFEC_QUEUE_ENTRY RtpfGetQueuedPacket(PRTP_FEC_QUEUE queue) {
|
|||||||
unsigned int lowestRtpSequenceNumber = UINT16_MAX;
|
unsigned int lowestRtpSequenceNumber = UINT16_MAX;
|
||||||
|
|
||||||
while (entry != NULL) {
|
while (entry != NULL) {
|
||||||
|
// Never return parity packets
|
||||||
|
if (entry->isParity) {
|
||||||
|
PRTPFEC_QUEUE_ENTRY parityEntry = entry;
|
||||||
|
|
||||||
|
// Skip this entry
|
||||||
|
entry = parityEntry->next;
|
||||||
|
|
||||||
|
// Remove this entry
|
||||||
|
removeEntry(queue, parityEntry);
|
||||||
|
|
||||||
|
// Free the entry and packet
|
||||||
|
free(parityEntry->packet);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (queuedEntry == NULL || isBefore(entry->packet->sequenceNumber, lowestRtpSequenceNumber)) {
|
if (queuedEntry == NULL || isBefore(entry->packet->sequenceNumber, lowestRtpSequenceNumber)) {
|
||||||
lowestRtpSequenceNumber = entry->packet->sequenceNumber;
|
lowestRtpSequenceNumber = entry->packet->sequenceNumber;
|
||||||
queuedEntry = entry;
|
queuedEntry = entry;
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
typedef struct _RTPFEC_QUEUE_ENTRY {
|
typedef struct _RTPFEC_QUEUE_ENTRY {
|
||||||
PRTP_PACKET packet;
|
PRTP_PACKET packet;
|
||||||
int length;
|
int length;
|
||||||
|
int isParity;
|
||||||
|
|
||||||
struct _RTPFEC_QUEUE_ENTRY* next;
|
struct _RTPFEC_QUEUE_ENTRY* next;
|
||||||
struct _RTPFEC_QUEUE_ENTRY* prev;
|
struct _RTPFEC_QUEUE_ENTRY* prev;
|
||||||
|
|||||||
@@ -65,7 +65,6 @@ static void ReceiveThreadProc(void* context) {
|
|||||||
int bufferSize, receiveSize;
|
int bufferSize, receiveSize;
|
||||||
char* buffer;
|
char* buffer;
|
||||||
int queueStatus;
|
int queueStatus;
|
||||||
int length;
|
|
||||||
PRTPFEC_QUEUE_ENTRY queueEntry;
|
PRTPFEC_QUEUE_ENTRY queueEntry;
|
||||||
|
|
||||||
receiveSize = StreamConfig.packetSize + MAX_RTP_HEADER_SIZE;
|
receiveSize = StreamConfig.packetSize + MAX_RTP_HEADER_SIZE;
|
||||||
|
|||||||
Reference in New Issue
Block a user