static int h264_mp4toannexb_filter(AVBitStreamFilterContext *bsfc,
                                   AVCodecContext *avctx, const char *args,
                                   uint8_t  **poutbuf, int *poutbuf_size,
                                   const uint8_t *buf, int      buf_size,
                                   int keyframe) {
    H264BSFContext *ctx = bsfc->priv_data;
    uint8_t unit_type;
    uint32_t nal_size, cumul_size = 0;
    if (!avctx->extradata || avctx->extradata_size < 6) {
        *poutbuf = (uint8_t*) buf;
        *poutbuf_size = buf_size;
        return 0;
    }
    if (!ctx->sps_pps_data) {
        uint16_t unit_size;
        uint32_t total_size = 0;
        uint8_t *out = NULL, unit_nb, sps_done = 0;
        const uint8_t *extradata = avctx->extradata+4;
        static const uint8_t nalu_header[4] = {0, 0, 0, 1};
        ctx->length_size = (*extradata++ & 0x3) + 1;
        if (ctx->length_size == 3)
            return AVERROR(EINVAL);
        unit_nb = *extradata++ & 0x1f;
        if (!unit_nb) {
            unit_nb = *extradata++;
            sps_done++;
        }
        while (unit_nb--) {
            unit_size = AV_RB16(extradata);
            total_size += unit_size+4;
            if (extradata+2+unit_size > avctx->extradata+avctx->extradata_size) {
                av_free(out);
                return AVERROR(EINVAL);
            }
            out = av_realloc(out, total_size);
            if (!out)
                return AVERROR(ENOMEM);
            memcpy(out+total_size-unit_size-4, nalu_header, 4);
            memcpy(out+total_size-unit_size,   extradata+2, unit_size);
            extradata += 2+unit_size;
            if (!unit_nb && !sps_done++)
                unit_nb = *extradata++;
        }
        ctx->sps_pps_data = out;
        ctx->size = total_size;
        ctx->first_idr = 1;
    }
    *poutbuf_size = 0;
    *poutbuf = NULL;
    do {
        if (ctx->length_size == 1)
            nal_size = buf[0];
        else if (ctx->length_size == 2)
            nal_size = AV_RB16(buf);
        else
            nal_size = AV_RB32(buf);
        buf += ctx->length_size;
        unit_type = *buf & 0x1f;
        if (ctx->first_idr && unit_type == 5) {
            alloc_and_copy(poutbuf, poutbuf_size,
                           ctx->sps_pps_data, ctx->size,
                           buf, nal_size);
            ctx->first_idr = 0;
        }
        else {
            alloc_and_copy(poutbuf, poutbuf_size,
                           NULL, 0,
                           buf, nal_size);
            if (!ctx->first_idr && unit_type == 1)
                ctx->first_idr = 1;
        }
        buf += nal_size;
        cumul_size += nal_size + ctx->length_size;
    } while (cumul_size < buf_size);
    return 1;
}
['static int h264_mp4toannexb_filter(AVBitStreamFilterContext *bsfc,\n                                   AVCodecContext *avctx, const char *args,\n                                   uint8_t  **poutbuf, int *poutbuf_size,\n                                   const uint8_t *buf, int      buf_size,\n                                   int keyframe) {\n    H264BSFContext *ctx = bsfc->priv_data;\n    uint8_t unit_type;\n    uint32_t nal_size, cumul_size = 0;\n    if (!avctx->extradata || avctx->extradata_size < 6) {\n        *poutbuf = (uint8_t*) buf;\n        *poutbuf_size = buf_size;\n        return 0;\n    }\n    if (!ctx->sps_pps_data) {\n        uint16_t unit_size;\n        uint32_t total_size = 0;\n        uint8_t *out = NULL, unit_nb, sps_done = 0;\n        const uint8_t *extradata = avctx->extradata+4;\n        static const uint8_t nalu_header[4] = {0, 0, 0, 1};\n        ctx->length_size = (*extradata++ & 0x3) + 1;\n        if (ctx->length_size == 3)\n            return AVERROR(EINVAL);\n        unit_nb = *extradata++ & 0x1f;\n        if (!unit_nb) {\n            unit_nb = *extradata++;\n            sps_done++;\n        }\n        while (unit_nb--) {\n            unit_size = AV_RB16(extradata);\n            total_size += unit_size+4;\n            if (extradata+2+unit_size > avctx->extradata+avctx->extradata_size) {\n                av_free(out);\n                return AVERROR(EINVAL);\n            }\n            out = av_realloc(out, total_size);\n            if (!out)\n                return AVERROR(ENOMEM);\n            memcpy(out+total_size-unit_size-4, nalu_header, 4);\n            memcpy(out+total_size-unit_size,   extradata+2, unit_size);\n            extradata += 2+unit_size;\n            if (!unit_nb && !sps_done++)\n                unit_nb = *extradata++;\n        }\n        ctx->sps_pps_data = out;\n        ctx->size = total_size;\n        ctx->first_idr = 1;\n    }\n    *poutbuf_size = 0;\n    *poutbuf = NULL;\n    do {\n        if (ctx->length_size == 1)\n            nal_size = buf[0];\n        else if (ctx->length_size == 2)\n            nal_size = AV_RB16(buf);\n        else\n            nal_size = AV_RB32(buf);\n        buf += ctx->length_size;\n        unit_type = *buf & 0x1f;\n        if (ctx->first_idr && unit_type == 5) {\n            alloc_and_copy(poutbuf, poutbuf_size,\n                           ctx->sps_pps_data, ctx->size,\n                           buf, nal_size);\n            ctx->first_idr = 0;\n        }\n        else {\n            alloc_and_copy(poutbuf, poutbuf_size,\n                           NULL, 0,\n                           buf, nal_size);\n            if (!ctx->first_idr && unit_type == 1)\n                ctx->first_idr = 1;\n        }\n        buf += nal_size;\n        cumul_size += nal_size + ctx->length_size;\n    } while (cumul_size < buf_size);\n    return 1;\n}', 'void *av_realloc(void *ptr, unsigned int size)\n{\n#ifdef CONFIG_MEMALIGN_HACK\n    int diff;\n#endif\n    if(size > (INT_MAX-16) )\n        return NULL;\n#ifdef CONFIG_MEMALIGN_HACK\n    if(!ptr) return av_malloc(size);\n    diff= ((char*)ptr)[-1];\n    return (char*)realloc((char*)ptr - diff, size + diff) + diff;\n#else\n    return realloc(ptr, size);\n#endif\n}']