int NALU_getNaluFromAnnexBNalus()

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