mirror of
https://gitee.com/openharmony/third_party_ffmpeg
synced 2024-11-23 19:30:05 +00:00
Fix bit_rate in MPEG1/2 Video
In ISO/IEC 13818-2, bit rate is differently determined according to video type 1) MPEG1 Video Bit_rate and vbv_delay are set to 3FFFF and FFFF respectively to indicate variable bitrate. Other values are for constant bitrate. VBV is only defined for constant bit rate operation. Ths STD supersedes the VBV model for vbr. 2) MPEG2 Video Even if the bitrate is constant, the value of bit_rate may not be the actual bitrate since bit_rate need only be an upper bound to that actual bitrate. VBV is only defined for variable bit rate operation. Constant bit rate is viewed as a special case of vbr. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
77d89a5b16
commit
25b7aa980b
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user