Prevent the depacketizer from receiving parity packets

This commit is contained in:
Cameron Gutman
2017-06-10 15:42:51 -07:00
parent 6fb3472aec
commit 4134ea3c23
3 changed files with 22 additions and 4 deletions

View File

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

View File

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

View File

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