diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c index bdb6b009b3..b5bf68d683 100644 --- a/libavcodec/mpeg12.c +++ b/libavcodec/mpeg12.c @@ -1278,8 +1278,12 @@ static int mpeg_decode_postinit(AVCodecContext *avctx) return -2; avcodec_set_dimensions(avctx, s->width, s->height); - if (s->bit_rate && s->bit_rate != 0x3FFFF*400) - avctx->bit_rate = s->bit_rate; + if (avctx->codec_id == AV_CODEC_ID_MPEG2VIDEO && s->bit_rate) { + avctx->rc_max_rate = s->bit_rate; + } else if (avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO && s->bit_rate && + (s->bit_rate != 0x3FFFF*400 || s->vbv_delay != 0xFFFF)) { + avctx->bit_rate = s->bit_rate; + } s1->save_aspect_info = s->aspect_ratio_info; s1->save_width = s->width; s1->save_height = s->height; @@ -1378,6 +1382,7 @@ static int mpeg1_decode_picture(AVCodecContext *avctx, return -1; vbv_delay = get_bits(&s->gb, 16); + s->vbv_delay = vbv_delay; if (s->pict_type == AV_PICTURE_TYPE_P || s->pict_type == AV_PICTURE_TYPE_B) { s->full_pel[0] = get_bits1(&s->gb); f_code = get_bits(&s->gb, 3); diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index 61cc3e10de..b04f3801c7 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -343,6 +343,7 @@ typedef struct MpegEncContext { int dquant; ///< qscale difference to prev qscale int closed_gop; ///< MPEG1/2 GOP is closed int pict_type; ///< AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ... + int vbv_delay; int last_pict_type; //FIXME removes int last_non_b_pict_type; ///< used for mpeg4 gmc b-frames & ratecontrol int dropable; diff --git a/libavcodec/mpegvideo_parser.c b/libavcodec/mpegvideo_parser.c index 5fb2799814..c112a94841 100644 --- a/libavcodec/mpegvideo_parser.c +++ b/libavcodec/mpegvideo_parser.c @@ -44,6 +44,7 @@ static void mpegvideo_extract_headers(AVCodecParserContext *s, int horiz_size_ext, vert_size_ext, bit_rate_ext; int did_set_size=0; int bit_rate = 0; + int vbv_delay = 0; //FIXME replace the crap with get_bits() s->repeat_pict = 0; @@ -55,6 +56,7 @@ static void mpegvideo_extract_headers(AVCodecParserContext *s, case PICTURE_START_CODE: if (bytes_left >= 2) { s->pict_type = (buf[1] >> 3) & 7; + vbv_delay = ((buf[1] & 0x07) << 13) | (buf[2] << 5) | (buf[3] >> 3); } break; case SEQ_START_CODE: @@ -131,8 +133,11 @@ static void mpegvideo_extract_headers(AVCodecParserContext *s, } } the_end: ; - if (bit_rate && bit_rate != 0x3FFFF) { - avctx->bit_rate = 400 * bit_rate; + if (avctx->codec_id == AV_CODEC_ID_MPEG2VIDEO && bit_rate) { + avctx->rc_max_rate = 400*bit_rate; + } else if (avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO && bit_rate && + (bit_rate != 0x3FFFF || vbv_delay != 0xFFFF)) { + avctx->bit_rate = 400*bit_rate; } }