Distinguish speculative RFIs from normal FEC-initiated RFIs

This commit is contained in:
Cameron Gutman
2022-10-06 21:18:05 -05:00
parent 73f1ec64a8
commit 44668bd256
3 changed files with 13 additions and 8 deletions

View File

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

View File

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

View File

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