From ed7d72c07d43433839f44e009fa37c31b7e85595 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 6 Jul 2023 01:41:15 -0500 Subject: [PATCH] Fix single packet frame case for AV1 --- src/VideoDepacketizer.c | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/VideoDepacketizer.c b/src/VideoDepacketizer.c index acadd4c..a242d83 100644 --- a/src/VideoDepacketizer.c +++ b/src/VideoDepacketizer.c @@ -817,6 +817,7 @@ static void processRtpPayload(PNV_VIDEO_PACKET videoPacket, int length, lastPacketInStream = streamPacketIndex; // If this is the first packet, skip the frame header (if one exists) + uint8_t frameHeaderSize; if (firstPacket) { // Parse the frame type from the header if (APP_VERSION_AT_LEAST(7, 1, 350)) { @@ -880,13 +881,11 @@ static void processRtpPayload(PNV_VIDEO_PACKET videoPacket, int length, // 0x01 indicates an 8 byte header // 0x81 indicates a 44 byte header if (currentPos.data[0] == 0x01) { - currentPos.offset += 8; - currentPos.length -= 8; + frameHeaderSize = 8; } else { LC_ASSERT(currentPos.data[0] == (char)0x81); - currentPos.offset += 44; - currentPos.length -= 44; + frameHeaderSize = 44; } } else if (APP_VERSION_AT_LEAST(7, 1, 446)) { @@ -894,13 +893,11 @@ static void processRtpPayload(PNV_VIDEO_PACKET videoPacket, int length, // 0x01 indicates an 8 byte header // 0x81 indicates a 41 byte header if (currentPos.data[0] == 0x01) { - currentPos.offset += 8; - currentPos.length -= 8; + frameHeaderSize = 8; } else { LC_ASSERT(currentPos.data[0] == (char)0x81); - currentPos.offset += 41; - currentPos.length -= 41; + frameHeaderSize = 41; } } else if (APP_VERSION_AT_LEAST(7, 1, 415)) { @@ -908,34 +905,34 @@ static void processRtpPayload(PNV_VIDEO_PACKET videoPacket, int length, // 0x01 indicates an 8 byte header // 0x81 indicates a 24 byte header if (currentPos.data[0] == 0x01) { - currentPos.offset += 8; - currentPos.length -= 8; + frameHeaderSize = 8; } else { LC_ASSERT(currentPos.data[0] == (char)0x81); - currentPos.offset += 24; - currentPos.length -= 24; + frameHeaderSize = 24; } } else if (APP_VERSION_AT_LEAST(7, 1, 350)) { // [7.1.350, 7.1.415) should use the 8 byte header again - currentPos.offset += 8; - currentPos.length -= 8; + frameHeaderSize = 8; } else if (APP_VERSION_AT_LEAST(7, 1, 320)) { // [7.1.320, 7.1.350) should use the 12 byte frame header - currentPos.offset += 12; - currentPos.length -= 12; + frameHeaderSize = 12; } else if (APP_VERSION_AT_LEAST(5, 0, 0)) { // [5.x, 7.1.320) should use the 8 byte header - currentPos.offset += 8; - currentPos.length -= 8; + frameHeaderSize = 8; } else { // Other versions don't have a frame header at all + frameHeaderSize = 0; } + // Skip past the frame header + currentPos.offset += frameHeaderSize; + currentPos.length -= frameHeaderSize; + // We only parse H.264 and HEVC at the NALU level if (NegotiatedVideoFormat & (VIDEO_FORMAT_MASK_H264 | VIDEO_FORMAT_MASK_H265)) { // The Annex B NALU start prefix must be next @@ -962,6 +959,10 @@ static void processRtpPayload(PNV_VIDEO_PACKET videoPacket, int length, } } } + else { + // There is no frame header on later packets + frameHeaderSize = 0; + } if (NegotiatedVideoFormat & (VIDEO_FORMAT_MASK_H264 | VIDEO_FORMAT_MASK_H265)) { if (firstPacket && isIdrFrameStart(¤tPos)) { @@ -988,7 +989,7 @@ static void processRtpPayload(PNV_VIDEO_PACKET videoPacket, int length, else { // Other codecs are just passed through as is. queueFragment(existingEntry, currentPos.data, currentPos.offset, - lastPacket ? lastPacketPayloadLength : currentPos.length); + lastPacket ? (lastPacketPayloadLength - frameHeaderSize) : currentPos.length); } if (lastPacket) {