From 44668bd25615482272d274e9f4655d835bd8c5b1 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 6 Oct 2022 21:18:05 -0500 Subject: [PATCH] Distinguish speculative RFIs from normal FEC-initiated RFIs --- src/Limelight-internal.h | 2 +- src/RtpVideoQueue.c | 10 +++++----- src/VideoDepacketizer.c | 9 +++++++-- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/Limelight-internal.h b/src/Limelight-internal.h index d02dc6b..10cfc2d 100644 --- a/src/Limelight-internal.h +++ b/src/Limelight-internal.h @@ -98,7 +98,7 @@ void destroyVideoDepacketizer(void); void queueRtpPacket(PRTPV_QUEUE_ENTRY queueEntry); void stopVideoDepacketizer(void); void requestDecoderRefresh(void); -void notifyFrameLost(unsigned int frameNumber); +void notifyFrameLost(unsigned int frameNumber, bool speculative); void initializeVideoStream(void); void destroyVideoStream(void); diff --git a/src/RtpVideoQueue.c b/src/RtpVideoQueue.c index 2cdf91b..95a6cf9 100644 --- a/src/RtpVideoQueue.c +++ b/src/RtpVideoQueue.c @@ -177,14 +177,14 @@ static int reconstructFrame(PRTP_VIDEO_QUEUE queue) { if (queue->missingDataPackets > queue->bufferParityPackets) { // If the number of missing data shards exceeds the total number of possible parity shards, // we will presume the frame is lost. - notifyFrameLost(queue->currentFrameNumber); + notifyFrameLost(queue->currentFrameNumber, true); queue->reportedLostFrame = true; } else if (queue->receivedParityPackets != 0 && neededPackets - queue->pendingFecBlockList.count > U16(queue->bufferHighestSequenceNumber - queue->receivedParityHighestSequenceNumber)) { // If we've seen some parity shards but not enough parity shards remain to recover this frame // without additional data shards, we will presume the frame is lost. - notifyFrameLost(queue->currentFrameNumber); + notifyFrameLost(queue->currentFrameNumber, true); queue->reportedLostFrame = true; } } @@ -560,7 +560,7 @@ int RtpvAddPacket(PRTP_VIDEO_QUEUE queue, PRTP_PACKET packet, int length, PRTPV_ // Notify the host of the loss of this frame if (!queue->reportedLostFrame) { - notifyFrameLost(queue->currentFrameNumber); + notifyFrameLost(queue->currentFrameNumber, false); queue->reportedLostFrame = true; } @@ -593,7 +593,7 @@ int RtpvAddPacket(PRTP_VIDEO_QUEUE queue, PRTP_PACKET packet, int length, PRTPV_ // Notify the host of the loss of this frame if (!queue->reportedLostFrame) { - notifyFrameLost(queue->currentFrameNumber); + notifyFrameLost(queue->currentFrameNumber, false); queue->reportedLostFrame = true; } @@ -623,7 +623,7 @@ int RtpvAddPacket(PRTP_VIDEO_QUEUE queue, PRTP_PACKET packet, int length, PRTPV_ // NB: We only have to notify for the most recent lost frame, since // the depacketizer will report the RFI range starting at the last // frame it saw. - notifyFrameLost(nvPacket->frameIndex - 1); + notifyFrameLost(nvPacket->frameIndex - 1, false); } } diff --git a/src/VideoDepacketizer.c b/src/VideoDepacketizer.c index f294ae5..e143853 100644 --- a/src/VideoDepacketizer.c +++ b/src/VideoDepacketizer.c @@ -893,7 +893,7 @@ static void processRtpPayload(PNV_VIDEO_PACKET videoPacket, int length, // if it determines the frame to be unrecoverable. This lets us // avoid having to wait until the next received frame to determine // that we lost a frame and submit an RFI request. -void notifyFrameLost(unsigned int frameNumber) { +void notifyFrameLost(unsigned int frameNumber, bool speculative) { // This may only be called at frame boundaries LC_ASSERT(!decodingFrame); @@ -902,7 +902,12 @@ void notifyFrameLost(unsigned int frameNumber) { // If RFI is enabled, we will notify the host PC now if (isReferenceFrameInvalidationEnabled()) { - Limelog("Sending speculative RFI request for predicted loss of frame %d\n", frameNumber); + if (speculative) { + Limelog("Sending speculative RFI request for predicted loss of frame %d\n", frameNumber); + } + else { + Limelog("Sending RFI request for unrecoverable frame %d\n", frameNumber); + } // Advance the frame number since we won't be expecting this one anymore nextFrameNumber = frameNumber + 1;