int ff_mpeg4_decode_video_packet_header(Mpeg4DecContext *ctx)

{

    MpegEncContext *s = &ctx->m;



    int mb_num_bits      = av_log2(s->mb_num - 1) + 1;

    int header_extension = 0, mb_num, len;



    /* is there enough space left for a video packet + header */

    if (get_bits_count(&s->gb) > s->gb.size_in_bits - 20)

        return -1;



    for (len = 0; len < 32; len++)

        if (get_bits1(&s->gb))

            break;



    if (len != ff_mpeg4_get_video_packet_prefix_length(s)) {

        av_log(s->avctx, AV_LOG_ERROR, "marker does not match f_code\n");

        return -1;

    }



    if (ctx->shape != RECT_SHAPE) {

        header_extension = get_bits1(&s->gb);

        // FIXME more stuff here

    }



    mb_num = get_bits(&s->gb, mb_num_bits);

    if (mb_num >= s->mb_num) {

        av_log(s->avctx, AV_LOG_ERROR,

               "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num);

        return -1;

    }



    s->mb_x = mb_num % s->mb_width;

    s->mb_y = mb_num / s->mb_width;



    if (ctx->shape != BIN_ONLY_SHAPE) {

        int qscale = get_bits(&s->gb, s->quant_precision);

        if (qscale)

            s->chroma_qscale = s->qscale = qscale;

    }



    if (ctx->shape == RECT_SHAPE)

        header_extension = get_bits1(&s->gb);



    if (header_extension) {

        int time_incr = 0;



        while (get_bits1(&s->gb) != 0)

            time_incr++;



        check_marker(s->avctx, &s->gb, "before time_increment in video packed header");

        skip_bits(&s->gb, ctx->time_increment_bits);      /* time_increment */

        check_marker(s->avctx, &s->gb, "before vop_coding_type in video packed header");



        skip_bits(&s->gb, 2); /* vop coding type */

        // FIXME not rect stuff here



        if (ctx->shape != BIN_ONLY_SHAPE) {

            skip_bits(&s->gb, 3); /* intra dc vlc threshold */

            // FIXME don't just ignore everything

            if (s->pict_type == AV_PICTURE_TYPE_S &&

                ctx->vol_sprite_usage == GMC_SPRITE) {

                if (mpeg4_decode_sprite_trajectory(ctx, &s->gb) < 0)

                    return AVERROR_INVALIDDATA;

                av_log(s->avctx, AV_LOG_ERROR, "untested\n");

            }



            // FIXME reduced res stuff here



            if (s->pict_type != AV_PICTURE_TYPE_I) {

                int f_code = get_bits(&s->gb, 3);       /* fcode_for */

                if (f_code == 0)

                    av_log(s->avctx, AV_LOG_ERROR,

                           "Error, video packet header damaged (f_code=0)\n");

            }

            if (s->pict_type == AV_PICTURE_TYPE_B) {

                int b_code = get_bits(&s->gb, 3);

                if (b_code == 0)

                    av_log(s->avctx, AV_LOG_ERROR,

                           "Error, video packet header damaged (b_code=0)\n");

            }

        }

    }

    if (ctx->new_pred)

        decode_new_pred(ctx, &s->gb);



    return 0;

}

int ff_mpeg4_decode_video_packet_header(Mpeg4DecContext *ctx)

{

    MpegEncContext *s = &ctx->m;



    int mb_num_bits      = av_log2(s->mb_num - 1) + 1;

    int header_extension = 0, mb_num, len;



    

    if (get_bits_count(&s->gb) > s->gb.size_in_bits - 20)

        return -1;



    for (len = 0; len < 32; len++)

        if (get_bits1(&s->gb))

            break;



    if (len != ff_mpeg4_get_video_packet_prefix_length(s)) {

        av_log(s->avctx, AV_LOG_ERROR, "marker does not match f_code\n");

        return -1;

    }



    if (ctx->shape != RECT_SHAPE) {

        header_extension = get_bits1(&s->gb);

        

    }



    mb_num = get_bits(&s->gb, mb_num_bits);

    if (mb_num >= s->mb_num) {

        av_log(s->avctx, AV_LOG_ERROR,

               "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num);

        return -1;

    }



    s->mb_x = mb_num % s->mb_width;

    s->mb_y = mb_num / s->mb_width;



    if (ctx->shape != BIN_ONLY_SHAPE) {

        int qscale = get_bits(&s->gb, s->quant_precision);

        if (qscale)

            s->chroma_qscale = s->qscale = qscale;

    }



    if (ctx->shape == RECT_SHAPE)

        header_extension = get_bits1(&s->gb);



    if (header_extension) {

        int time_incr = 0;



        while (get_bits1(&s->gb) != 0)

            time_incr++;



        check_marker(s->avctx, &s->gb, "before time_increment in video packed header");

        skip_bits(&s->gb, ctx->time_increment_bits);      

        check_marker(s->avctx, &s->gb, "before vop_coding_type in video packed header");



        skip_bits(&s->gb, 2); 

        



        if (ctx->shape != BIN_ONLY_SHAPE) {

            skip_bits(&s->gb, 3); 

            

            if (s->pict_type == AV_PICTURE_TYPE_S &&

                ctx->vol_sprite_usage == GMC_SPRITE) {

                if (mpeg4_decode_sprite_trajectory(ctx, &s->gb) < 0)

                    return AVERROR_INVALIDDATA;

                av_log(s->avctx, AV_LOG_ERROR, "untested\n");

            }



            



            if (s->pict_type != AV_PICTURE_TYPE_I) {

                int f_code = get_bits(&s->gb, 3);       

                if (f_code == 0)

                    av_log(s->avctx, AV_LOG_ERROR,

                           "Error, video packet header damaged (f_code=0)\n");

            }

            if (s->pict_type == AV_PICTURE_TYPE_B) {

                int b_code = get_bits(&s->gb, 3);

                if (b_code == 0)

                    av_log(s->avctx, AV_LOG_ERROR,

                           "Error, video packet header damaged (b_code=0)\n");

            }

        }

    }

    if (ctx->new_pred)

        decode_new_pred(ctx, &s->gb);



    return 0;

}

int FUNC_0(Mpeg4DecContext *VAR_0)

{

    MpegEncContext *s = &VAR_0->m;



    int VAR_1      = av_log2(s->VAR_3 - 1) + 1;

    int VAR_2 = 0, VAR_3, VAR_4;



    

    if (get_bits_count(&s->gb) > s->gb.size_in_bits - 20)

        return -1;



    for (VAR_4 = 0; VAR_4 < 32; VAR_4++)

        if (get_bits1(&s->gb))

            break;



    if (VAR_4 != ff_mpeg4_get_video_packet_prefix_length(s)) {

        av_log(s->avctx, AV_LOG_ERROR, "marker does not match VAR_7\n");

        return -1;

    }



    if (VAR_0->shape != RECT_SHAPE) {

        VAR_2 = get_bits1(&s->gb);

        

    }



    VAR_3 = get_bits(&s->gb, VAR_1);

    if (VAR_3 >= s->VAR_3) {

        av_log(s->avctx, AV_LOG_ERROR,

               "illegal VAR_3 in video packet (%d %d) \n", VAR_3, s->VAR_3);

        return -1;

    }



    s->mb_x = VAR_3 % s->mb_width;

    s->mb_y = VAR_3 / s->mb_width;



    if (VAR_0->shape != BIN_ONLY_SHAPE) {

        int VAR_5 = get_bits(&s->gb, s->quant_precision);

        if (VAR_5)

            s->chroma_qscale = s->VAR_5 = VAR_5;

    }



    if (VAR_0->shape == RECT_SHAPE)

        VAR_2 = get_bits1(&s->gb);



    if (VAR_2) {

        int VAR_6 = 0;



        while (get_bits1(&s->gb) != 0)

            VAR_6++;



        check_marker(s->avctx, &s->gb, "before time_increment in video packed header");

        skip_bits(&s->gb, VAR_0->time_increment_bits);      

        check_marker(s->avctx, &s->gb, "before vop_coding_type in video packed header");



        skip_bits(&s->gb, 2); 

        



        if (VAR_0->shape != BIN_ONLY_SHAPE) {

            skip_bits(&s->gb, 3); 

            

            if (s->pict_type == AV_PICTURE_TYPE_S &&

                VAR_0->vol_sprite_usage == GMC_SPRITE) {

                if (mpeg4_decode_sprite_trajectory(VAR_0, &s->gb) < 0)

                    return AVERROR_INVALIDDATA;

                av_log(s->avctx, AV_LOG_ERROR, "untested\n");

            }



            



            if (s->pict_type != AV_PICTURE_TYPE_I) {

                int VAR_7 = get_bits(&s->gb, 3);       

                if (VAR_7 == 0)

                    av_log(s->avctx, AV_LOG_ERROR,

                           "Error, video packet header damaged (VAR_7=0)\n");

            }

            if (s->pict_type == AV_PICTURE_TYPE_B) {

                int VAR_8 = get_bits(&s->gb, 3);

                if (VAR_8 == 0)

                    av_log(s->avctx, AV_LOG_ERROR,

                           "Error, video packet header damaged (VAR_8=0)\n");

            }

        }

    }

    if (VAR_0->new_pred)

        decode_new_pred(VAR_0, &s->gb);



    return 0;

}

int FUNC_0(Mpeg4DecContext *VAR_0)
{ MpegEncContext *s = &VAR_0->m; int VAR_1      = av_log2(s->VAR_3 - 1) + 1; int VAR_2 = 0, VAR_3, VAR_4; if (get_bits_count(&s->gb) > s->gb.size_in_bits - 20)
return -1; for (VAR_4 = 0; VAR_4 < 32; VAR_4++) if (get_bits1(&s->gb))
break; if (VAR_4 != ff_mpeg4_get_video_packet_prefix_length(s)) { av_log(s->avctx, AV_LOG_ERROR, "marker does not match VAR_7\n"); return -1; } if (VAR_0->shape != RECT_SHAPE) { VAR_2 = get_bits1(&s->gb); } VAR_3 = get_bits(&s->gb, VAR_1); if (VAR_3 >= s->VAR_3) { av_log(s->avctx, AV_LOG_ERROR,
"illegal VAR_3 in video packet (%d %d) \n", VAR_3, s->VAR_3); return -1; } s->mb_x = VAR_3 % s->mb_width; s->mb_y = VAR_3 / s->mb_width; if (VAR_0->shape != BIN_ONLY_SHAPE) { int VAR_5 = get_bits(&s->gb, s->quant_precision); if (VAR_5)
s->chroma_qscale = s->VAR_5 = VAR_5; } if (VAR_0->shape == RECT_SHAPE)
VAR_2 = get_bits1(&s->gb); if (VAR_2) { int VAR_6 = 0; while (get_bits1(&s->gb) != 0)
VAR_6++; check_marker(s->avctx, &s->gb, "before time_increment in video packed header"); skip_bits(&s->gb, VAR_0->time_increment_bits); check_marker(s->avctx, &s->gb, "before vop_coding_type in video packed header"); skip_bits(&s->gb, 2); if (VAR_0->shape != BIN_ONLY_SHAPE) { skip_bits(&s->gb, 3); if (s->pict_type == AV_PICTURE_TYPE_S &&
VAR_0->vol_sprite_usage == GMC_SPRITE) { if (mpeg4_decode_sprite_trajectory(VAR_0, &s->gb) < 0)
return AVERROR_INVALIDDATA; av_log(s->avctx, AV_LOG_ERROR, "untested\n"); } if (s->pict_type != AV_PICTURE_TYPE_I) { int VAR_7 = get_bits(&s->gb, 3); if (VAR_7 == 0)
av_log(s->avctx, AV_LOG_ERROR,
"Error, video packet header damaged (VAR_7=0)\n"); } if (s->pict_type == AV_PICTURE_TYPE_B) { int VAR_8 = get_bits(&s->gb, 3); if (VAR_8 == 0)
av_log(s->avctx, AV_LOG_ERROR,
"Error, video packet header damaged (VAR_8=0)\n"); } } } if (VAR_0->new_pred)
decode_new_pred(VAR_0, &s->gb); return 0; }