static int dnxhd_find_frame_end(DNXHDParserContext *dctx,

                                const uint8_t *buf, int buf_size)

{

    ParseContext *pc = &dctx->pc;

    uint64_t state = pc->state64;

    int pic_found = pc->frame_start_found;

    int i = 0;



    if (!pic_found) {

        for (i = 0; i < buf_size; i++) {

            state = (state << 8) | buf[i];

            if (ff_dnxhd_check_header_prefix(state & 0xffffffffff00LL) != 0) {

                i++;

                pic_found = 1;

                dctx->cur_byte = 0;

                dctx->remaining = 0;

                break;

            }

        }

    }



    if (pic_found && !dctx->remaining) {

        if (!buf_size) /* EOF considered as end of frame */

            return 0;

        for (; i < buf_size; i++) {

            dctx->cur_byte++;

            state = (state << 8) | buf[i];



            if (dctx->cur_byte == 24) {

                dctx->h = (state >> 32) & 0xFFFF;

            } else if (dctx->cur_byte == 26) {

                dctx->w = (state >> 32) & 0xFFFF;

            } else if (dctx->cur_byte == 42) {

                int cid = (state >> 32) & 0xFFFFFFFF;



                if (cid <= 0)

                    continue;



                dctx->remaining = avpriv_dnxhd_get_frame_size(cid);

                if (dctx->remaining <= 0) {

                    dctx->remaining = ff_dnxhd_get_hr_frame_size(cid, dctx->w, dctx->h);

                    if (dctx->remaining <= 0)

                        return dctx->remaining;

                }

                if (buf_size - i + 47 >= dctx->remaining) {

                    int remaining = dctx->remaining;



                    pc->frame_start_found = 0;

                    pc->state64 = -1;

                    dctx->cur_byte = 0;

                    dctx->remaining = 0;

                    return remaining;

                } else {

                    dctx->remaining -= buf_size;

                }

            }

        }

    } else if (pic_found) {

        if (dctx->remaining > buf_size) {

            dctx->remaining -= buf_size;

        } else {

            int remaining = dctx->remaining;



            pc->frame_start_found = 0;

            pc->state64 = -1;

            dctx->cur_byte = 0;

            dctx->remaining = 0;

            return remaining;

        }

    }

    pc->frame_start_found = pic_found;

    pc->state64 = state;

    return END_NOT_FOUND;

}
