From 795e3f644a988d6fc34cfd6059ea19947ef71d41 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 2 Oct 2022 21:12:01 -0500 Subject: [PATCH] Ensure the next frame after a DU drop is always an IDR frame On RFI-capable decoders, this would sometimes be a P-frame --- src/VideoDepacketizer.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/VideoDepacketizer.c b/src/VideoDepacketizer.c index 579ae19..8ee7def 100644 --- a/src/VideoDepacketizer.c +++ b/src/VideoDepacketizer.c @@ -397,18 +397,19 @@ static void reassembleFrame(int frameNumber) { if (LbqOfferQueueItem(&decodeUnitQueue, qdu, &qdu->entry) == LBQ_BOUND_EXCEEDED) { Limelog("Video decode unit queue overflow\n"); - // Clear frame state and wait for an IDR + // Clear NAL state for the frame that we failed to enqueue nalChainHead = qdu->decodeUnit.bufferList; nalChainDataLength = qdu->decodeUnit.fullLength; dropFrameState(); - // Free the DU + // Free the DU we were going to queue free(qdu); - // Flush the decode unit queue + // Free all frames in the decode unit queue freeDecodeUnitList(LbqFlushQueueItems(&decodeUnitQueue)); - // FIXME: Get proper bounds to use reference frame invalidation + // Request an IDR frame to recover (RFI recovery is not supported here) + waitingForIdrFrame = true; requestIdrOnDemand(); return; } @@ -423,6 +424,9 @@ static void reassembleFrame(int frameNumber) { // Clear frame drops consecutiveFrameDrops = 0; + + // Move the start of our (potential) RFI window to the next frame + startFrameNumber = nextFrameNumber; } } } @@ -826,8 +830,6 @@ static void processRtpPayload(PNV_VIDEO_PACKET videoPacket, int length, } reassembleFrame(frameIndex); - - startFrameNumber = nextFrameNumber; } }