From 4134ea3c23db6a5d9d7624237dcb382a91c4bbd4 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 10 Jun 2017 15:42:51 -0700 Subject: [PATCH] Prevent the depacketizer from receiving parity packets --- src/RtpFecQueue.c | 24 +++++++++++++++++++++--- src/RtpFecQueue.h | 1 + src/VideoStream.c | 1 - 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/RtpFecQueue.c b/src/RtpFecQueue.c index 07eebf9..8066e4d 100644 --- a/src/RtpFecQueue.c +++ b/src/RtpFecQueue.c @@ -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 -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; 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->length = length; + newEntry->isParity = isParity; newEntry->prev = NULL; newEntry->next = NULL; @@ -170,7 +171,8 @@ cleanup_packets: // discarded by decoders. It's not safe to strip all zero padding because // 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) { free(packets[i]); } @@ -264,7 +266,7 @@ int RtpfAddPacket(PRTP_FEC_QUEUE queue, PRTP_PACKET packet, int length, PRTPFEC_ 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; } else { @@ -307,6 +309,22 @@ PRTPFEC_QUEUE_ENTRY RtpfGetQueuedPacket(PRTP_FEC_QUEUE queue) { unsigned int lowestRtpSequenceNumber = UINT16_MAX; 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)) { lowestRtpSequenceNumber = entry->packet->sequenceNumber; queuedEntry = entry; diff --git a/src/RtpFecQueue.h b/src/RtpFecQueue.h index 2bcf0a5..93044e4 100644 --- a/src/RtpFecQueue.h +++ b/src/RtpFecQueue.h @@ -5,6 +5,7 @@ typedef struct _RTPFEC_QUEUE_ENTRY { PRTP_PACKET packet; int length; + int isParity; struct _RTPFEC_QUEUE_ENTRY* next; struct _RTPFEC_QUEUE_ENTRY* prev; diff --git a/src/VideoStream.c b/src/VideoStream.c index f49ef09..bd14cdb 100644 --- a/src/VideoStream.c +++ b/src/VideoStream.c @@ -65,7 +65,6 @@ static void ReceiveThreadProc(void* context) { int bufferSize, receiveSize; char* buffer; int queueStatus; - int length; PRTPFEC_QUEUE_ENTRY queueEntry; receiveSize = StreamConfig.packetSize + MAX_RTP_HEADER_SIZE;