static int parse(AVCodecParserContext *ctx,

                 AVCodecContext *avctx,

                 const uint8_t **out_data, int *out_size,

                 const uint8_t *data, int size)

{

    VP9ParseContext *s = ctx->priv_data;

    int marker;



    if (size <= 0) {

        *out_size = 0;

        *out_data = data;



        return 0;

    }



    if (s->n_frames > 0) {

        *out_data = data;

        *out_size = s->size[--s->n_frames];

        parse_frame(ctx, *out_data, *out_size);



        return s->n_frames > 0 ? *out_size : size /* i.e. include idx tail */;

    }



    marker = data[size - 1];

    if ((marker & 0xe0) == 0xc0) {

        int nbytes = 1 + ((marker >> 3) & 0x3);

        int n_frames = 1 + (marker & 0x7), idx_sz = 2 + n_frames * nbytes;



        if (size >= idx_sz && data[size - idx_sz] == marker) {

            const uint8_t *idx = data + size + 1 - idx_sz;

            int first = 1;



            switch (nbytes) {

#define case_n(a, rd) \

            case a: \

                while (n_frames--) { \

                    int sz = rd; \

                    idx += a; \

                    if (sz > size) { \

                        s->n_frames = 0; \

                        av_log(avctx, AV_LOG_ERROR, \

                               "Superframe packet size too big: %d > %d\n", \

                               sz, size); \

                        return AVERROR_INVALIDDATA; \

                    } \

                    if (first) { \

                        first = 0; \

                        *out_data = data; \

                        *out_size = sz; \

                        s->n_frames = n_frames; \

                    } else { \

                        s->size[n_frames] = sz; \

                    } \

                    data += sz; \

                    size -= sz; \

                } \

                parse_frame(ctx, *out_data, *out_size); \

                return *out_size



                case_n(1, *idx);

                case_n(2, AV_RL16(idx));

                case_n(3, AV_RL24(idx));

                case_n(4, AV_RL32(idx));

            }

        }

    }



    *out_data = data;

    *out_size = size;

    parse_frame(ctx, data, size);



    return size;

}

static int parse(AVCodecParserContext *ctx,

                 AVCodecContext *avctx,

                 const uint8_t **out_data, int *out_size,

                 const uint8_t *data, int size)

{

    VP9ParseContext *s = ctx->priv_data;

    int marker;



    if (size <= 0) {

        *out_size = 0;

        *out_data = data;



        return 0;

    }



    if (s->n_frames > 0) {

        *out_data = data;

        *out_size = s->size[--s->n_frames];

        parse_frame(ctx, *out_data, *out_size);



        return s->n_frames > 0 ? *out_size : size ;

    }



    marker = data[size - 1];

    if ((marker & 0xe0) == 0xc0) {

        int nbytes = 1 + ((marker >> 3) & 0x3);

        int n_frames = 1 + (marker & 0x7), idx_sz = 2 + n_frames * nbytes;



        if (size >= idx_sz && data[size - idx_sz] == marker) {

            const uint8_t *idx = data + size + 1 - idx_sz;

            int first = 1;



            switch (nbytes) {

#define case_n(a, rd) \

            case a: \

                while (n_frames--) { \

                    int sz = rd; \

                    idx += a; \

                    if (sz > size) { \

                        s->n_frames = 0; \

                        av_log(avctx, AV_LOG_ERROR, \

                               "Superframe packet size too big: %d > %d\n", \

                               sz, size); \

                        return AVERROR_INVALIDDATA; \

                    } \

                    if (first) { \

                        first = 0; \

                        *out_data = data; \

                        *out_size = sz; \

                        s->n_frames = n_frames; \

                    } else { \

                        s->size[n_frames] = sz; \

                    } \

                    data += sz; \

                    size -= sz; \

                } \

                parse_frame(ctx, *out_data, *out_size); \

                return *out_size



                case_n(1, *idx);

                case_n(2, AV_RL16(idx));

                case_n(3, AV_RL24(idx));

                case_n(4, AV_RL32(idx));

            }

        }

    }



    *out_data = data;

    *out_size = size;

    parse_frame(ctx, data, size);



    return size;

}

static int FUNC_0(AVCodecParserContext *VAR_0,

                 AVCodecContext *VAR_1,

                 const uint8_t **VAR_2, int *VAR_3,

                 const uint8_t *VAR_4, int VAR_5)

{

    VP9ParseContext *s = VAR_0->priv_data;

    int VAR_6;



    if (VAR_5 <= 0) {

        *VAR_3 = 0;

        *VAR_2 = VAR_4;



        return 0;

    }



    if (s->VAR_8 > 0) {

        *VAR_2 = VAR_4;

        *VAR_3 = s->VAR_5[--s->VAR_8];

        parse_frame(VAR_0, *VAR_2, *VAR_3);



        return s->VAR_8 > 0 ? *VAR_3 : VAR_5 ;

    }



    VAR_6 = VAR_4[VAR_5 - 1];

    if ((VAR_6 & 0xe0) == 0xc0) {

        int VAR_7 = 1 + ((VAR_6 >> 3) & 0x3);

        int VAR_8 = 1 + (VAR_6 & 0x7), VAR_9 = 2 + VAR_8 * VAR_7;



        if (VAR_5 >= VAR_9 && VAR_4[VAR_5 - VAR_9] == VAR_6) {

            const uint8_t *VAR_10 = VAR_4 + VAR_5 + 1 - VAR_9;

            int VAR_11 = 1;



            switch (VAR_7) {

#define case_n(a, rd) \

            case a: \

                while (VAR_8--) { \

                    int VAR_12 = rd; \

                    VAR_10 += a; \

                    if (VAR_12 > VAR_5) { \

                        s->VAR_8 = 0; \

                        av_log(VAR_1, AV_LOG_ERROR, \

                               "Superframe packet VAR_5 too big: %d > %d\n", \

                               VAR_12, VAR_5); \

                        return AVERROR_INVALIDDATA; \

                    } \

                    if (VAR_11) { \

                        VAR_11 = 0; \

                        *VAR_2 = VAR_4; \

                        *VAR_3 = VAR_12; \

                        s->VAR_8 = VAR_8; \

                    } else { \

                        s->VAR_5[VAR_8] = VAR_12; \

                    } \

                    VAR_4 += VAR_12; \

                    VAR_5 -= VAR_12; \

                } \

                parse_frame(VAR_0, *VAR_2, *VAR_3); \

                return *VAR_3



                case_n(1, *VAR_10);

                case_n(2, AV_RL16(VAR_10));

                case_n(3, AV_RL24(VAR_10));

                case_n(4, AV_RL32(VAR_10));

            }

        }

    }



    *VAR_2 = VAR_4;

    *VAR_3 = VAR_5;

    parse_frame(VAR_0, VAR_4, VAR_5);



    return VAR_5;

}

static int FUNC_0(AVCodecParserContext *VAR_0,
AVCodecContext *VAR_1,
const uint8_t **VAR_2, int *VAR_3,
const uint8_t *VAR_4, int VAR_5)
{ VP9ParseContext *s = VAR_0->priv_data; int VAR_6; if (VAR_5 <= 0) { *VAR_3 = 0; *VAR_2 = VAR_4; return 0; } if (s->VAR_8 > 0) { *VAR_2 = VAR_4; *VAR_3 = s->VAR_5[--s->VAR_8]; parse_frame(VAR_0, *VAR_2, *VAR_3); return s->VAR_8 > 0 ? *VAR_3 : VAR_5 ; } VAR_6 = VAR_4[VAR_5 - 1]; if ((VAR_6 & 0xe0) == 0xc0) { int VAR_7 = 1 + ((VAR_6 >> 3) & 0x3); int VAR_8 = 1 + (VAR_6 & 0x7), VAR_9 = 2 + VAR_8 * VAR_7; if (VAR_5 >= VAR_9 && VAR_4[VAR_5 - VAR_9] == VAR_6) { const uint8_t *VAR_10 = VAR_4 + VAR_5 + 1 - VAR_9; int VAR_11 = 1; switch (VAR_7) { #define case_n(a, rd) \
case a: \
while (VAR_8--) { \ int VAR_12 = rd; \ VAR_10 += a; \ if (VAR_12 > VAR_5) { \ s->VAR_8 = 0; \ av_log(VAR_1, AV_LOG_ERROR, \
"Superframe packet VAR_5 too big: %d > %d\n", \
VAR_12, VAR_5); \ return AVERROR_INVALIDDATA; \ } \ if (VAR_11) { \ VAR_11 = 0; \ *VAR_2 = VAR_4; \ *VAR_3 = VAR_12; \ s->VAR_8 = VAR_8; \ } else { \ s->VAR_5[VAR_8] = VAR_12; \ } \ VAR_4 += VAR_12; \ VAR_5 -= VAR_12; \ } \ parse_frame(VAR_0, *VAR_2, *VAR_3); \ return *VAR_3
case_n(1, *VAR_10); case_n(2, AV_RL16(VAR_10)); case_n(3, AV_RL24(VAR_10)); case_n(4, AV_RL32(VAR_10)); } } } *VAR_2 = VAR_4; *VAR_3 = VAR_5; parse_frame(VAR_0, VAR_4, VAR_5); return VAR_5; }