in libraries/amazon/amazon-kinesis-video-streams-webrtc-sdk-c/patch/src/source/Rtp/Codecs/RtpH264Payloader.c [49:141]
STATUS createPayloadForH264(UINT32 mtu, PBYTE nalus, UINT32 nalusLength, PBYTE payloadBuffer, PUINT32 pPayloadLength, PUINT32 pPayloadSubLength,
PUINT32 pPayloadSubLenSize)
{
ENTERS();
STATUS retStatus = STATUS_SUCCESS;
PBYTE curPtrInNalus = nalus;
UINT32 remainNalusLength = nalusLength;
UINT32 nextNaluLength = 0;
UINT32 startIndex = 0;
UINT32 singlePayloadLength = 0;
UINT32 singlePayloadSubLenSize = 0;
BOOL sizeCalculationOnly = (payloadBuffer == NULL);
PayloadArray payloadArray;
#ifdef SUPPORT_H264_AVCC_FRAME
BOOL isAnnexbFrame = FALSE;
#endif
CHK(nalus != NULL && pPayloadSubLenSize != NULL && pPayloadLength != NULL && (sizeCalculationOnly || pPayloadSubLength != NULL), STATUS_NULL_ARG);
CHK(mtu > FU_A_HEADER_SIZE, STATUS_RTP_INPUT_MTU_TOO_SMALL);
if (sizeCalculationOnly) {
payloadArray.payloadLength = 0;
payloadArray.payloadSubLenSize = 0;
payloadArray.maxPayloadLength = 0;
payloadArray.maxPayloadSubLenSize = 0;
} else {
payloadArray.payloadLength = *pPayloadLength;
payloadArray.payloadSubLenSize = *pPayloadSubLenSize;
payloadArray.maxPayloadLength = *pPayloadLength;
payloadArray.maxPayloadSubLenSize = *pPayloadSubLenSize;
#ifdef SUPPORT_SHARE_BUFFER
payloadArray.currentOffset = 0;
payloadArray.payloadRefOffset = pPayloadSubLength + (*pPayloadSubLenSize);
payloadArray.payloadRefLength = pPayloadSubLength + (*pPayloadSubLenSize) * 2;
#endif
}
payloadArray.payloadBuffer = payloadBuffer;
payloadArray.payloadSubLength = pPayloadSubLength;
#ifdef SUPPORT_H264_AVCC_FRAME
isAnnexbFrame = isNalueAnnexbFrame(nalus, nalusLength);
#endif
do {
#ifdef SUPPORT_H264_AVCC_FRAME
CHK_STATUS(getNextNaluLengthEx(curPtrInNalus, remainNalusLength, &startIndex, &nextNaluLength, isAnnexbFrame));
#else
CHK_STATUS(getNextNaluLength(curPtrInNalus, remainNalusLength, &startIndex, &nextNaluLength));
#endif
curPtrInNalus += startIndex;
#ifdef SUPPORT_SHARE_BUFFER
payloadArray.currentOffset += startIndex;
#endif
remainNalusLength -= startIndex;
CHK(remainNalusLength != 0, retStatus);
if (sizeCalculationOnly) {
CHK_STATUS(createPayloadFromNalu(mtu, curPtrInNalus, nextNaluLength, NULL, &singlePayloadLength, &singlePayloadSubLenSize));
payloadArray.payloadLength += singlePayloadLength;
payloadArray.payloadSubLenSize += singlePayloadSubLenSize;
} else {
CHK_STATUS(createPayloadFromNalu(mtu, curPtrInNalus, nextNaluLength, &payloadArray, &singlePayloadLength, &singlePayloadSubLenSize));
payloadArray.payloadBuffer += singlePayloadLength;
payloadArray.payloadSubLength += singlePayloadSubLenSize;
payloadArray.maxPayloadLength -= singlePayloadLength;
payloadArray.maxPayloadSubLenSize -= singlePayloadSubLenSize;
#ifdef SUPPORT_SHARE_BUFFER
payloadArray.payloadRefOffset += singlePayloadSubLenSize;
payloadArray.payloadRefLength += singlePayloadSubLenSize;
#endif
}
remainNalusLength -= nextNaluLength;
curPtrInNalus += nextNaluLength;
} while (remainNalusLength != 0);
CleanUp:
if (STATUS_FAILED(retStatus) && sizeCalculationOnly) {
payloadArray.payloadLength = 0;
payloadArray.payloadSubLenSize = 0;
}
if (pPayloadSubLenSize != NULL && pPayloadLength != NULL) {
*pPayloadLength = payloadArray.payloadLength;
*pPayloadSubLenSize = payloadArray.payloadSubLenSize;
}
LEAVES();
return retStatus;
}