in src/source/codec/nalu.c [126:212]
int NALU_getNaluFromAnnexBNalus(uint8_t *pAnnexBBuf, size_t uAnnexBLen, uint8_t uNaluType, uint8_t **ppNalu, size_t *puNaluLen)
{
int xRes = KVS_ERRNO_NONE;
uint8_t *pIdx = pAnnexBBuf;
uint8_t *pNalu = NULL;
size_t uNaluLen = 0;
if (pAnnexBBuf == NULL || uAnnexBLen < 5 || uNaluType >=32 || ppNalu == NULL || ppNalu == NULL)
{
LogError("Invalid argument");
xRes = KVS_ERRNO_FAIL;
}
else
{
while (pIdx - pAnnexBBuf < uAnnexBLen - 4)
{
if (pIdx[0] == 0x00)
{
if (pIdx[1] == 0x00)
{
if (pIdx[2] == 0x00)
{
if (pIdx[3] == 0x01)
{
/* It's a valid NALU here. */
if (pNalu != NULL)
{
uNaluLen = pIdx - pNalu;
break;
}
else if ((pIdx[4] & 0x80) == 0 && (pIdx[4] & 0x1F) == uNaluType)
{
pNalu = pIdx + 4;
}
pIdx += 4;
}
else
{
pIdx += 4;
}
}
else if (pIdx[2] == 0x01)
{
/* It's a valid NALU here. */
if (pNalu != NULL)
{
uNaluLen = pIdx - pNalu;
}
else if ((pIdx[3] & 0x80) == 0 && (pIdx[3] & 0x1F) == uNaluType)
{
pNalu = pIdx + 3;
}
pIdx += 3;
}
else
{
pIdx += 3;
}
}
else
{
pIdx += 2;
}
}
else
{
pIdx++;
}
}
if (pNalu != NULL)
{
if (uNaluLen == 0)
{
uNaluLen = uAnnexBLen - (pNalu - pAnnexBBuf);
}
*ppNalu = pNalu;
*puNaluLen = uNaluLen;
}
else
{
xRes = KVS_ERRNO_FAIL;
}
}
return xRes;
}