mirror of https://git.ffmpeg.org/ffmpeg.git
avcodec/mpeg12dec: Recalculate SAR unconditionally
Fixes Ticket4161 Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
aeb36fd207
commit
1010b36d86
|
@ -1273,55 +1273,10 @@ static int mpeg_decode_postinit(AVCodecContext *avctx)
|
|||
uint8_t old_permutation[64];
|
||||
int ret;
|
||||
|
||||
if ((s1->mpeg_enc_ctx_allocated == 0) ||
|
||||
avctx->coded_width != s->width ||
|
||||
avctx->coded_height != s->height ||
|
||||
s1->save_width != s->width ||
|
||||
s1->save_height != s->height ||
|
||||
s1->save_aspect_info != s->aspect_ratio_info ||
|
||||
(s1->save_progressive_seq != s->progressive_sequence && FFALIGN(s->height, 16) != FFALIGN(s->height, 32)) ||
|
||||
0) {
|
||||
if (s1->mpeg_enc_ctx_allocated) {
|
||||
ParseContext pc = s->parse_context;
|
||||
s->parse_context.buffer = 0;
|
||||
ff_mpv_common_end(s);
|
||||
s->parse_context = pc;
|
||||
s1->mpeg_enc_ctx_allocated = 0;
|
||||
}
|
||||
|
||||
ret = ff_set_dimensions(avctx, s->width, s->height);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
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;
|
||||
s1->save_progressive_seq = s->progressive_sequence;
|
||||
|
||||
/* low_delay may be forced, in this case we will have B-frames
|
||||
* that behave like P-frames. */
|
||||
avctx->has_b_frames = !s->low_delay;
|
||||
|
||||
if (avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
|
||||
// MPEG-1 fps
|
||||
avctx->framerate = ff_mpeg12_frame_rate_tab[s->frame_rate_index];
|
||||
// MPEG-1 aspect
|
||||
avctx->sample_aspect_ratio = av_d2q(1.0 / ff_mpeg1_aspect[s->aspect_ratio_info], 255);
|
||||
avctx->ticks_per_frame = 1;
|
||||
} else { // MPEG-2
|
||||
// MPEG-2 fps
|
||||
av_reduce(&s->avctx->framerate.num,
|
||||
&s->avctx->framerate.den,
|
||||
ff_mpeg12_frame_rate_tab[s->frame_rate_index].num * s1->frame_rate_ext.num,
|
||||
ff_mpeg12_frame_rate_tab[s->frame_rate_index].den * s1->frame_rate_ext.den,
|
||||
1 << 30);
|
||||
avctx->ticks_per_frame = 2;
|
||||
// MPEG-2 aspect
|
||||
if (s->aspect_ratio_info > 1) {
|
||||
AVRational dar =
|
||||
|
@ -1362,6 +1317,55 @@ static int mpeg_decode_postinit(AVCodecContext *avctx)
|
|||
|
||||
ff_set_sar(s->avctx, s->avctx->sample_aspect_ratio);
|
||||
|
||||
if ((s1->mpeg_enc_ctx_allocated == 0) ||
|
||||
avctx->coded_width != s->width ||
|
||||
avctx->coded_height != s->height ||
|
||||
s1->save_width != s->width ||
|
||||
s1->save_height != s->height ||
|
||||
s1->save_aspect_info != s->aspect_ratio_info ||
|
||||
(s1->save_progressive_seq != s->progressive_sequence && FFALIGN(s->height, 16) != FFALIGN(s->height, 32)) ||
|
||||
0) {
|
||||
if (s1->mpeg_enc_ctx_allocated) {
|
||||
ParseContext pc = s->parse_context;
|
||||
s->parse_context.buffer = 0;
|
||||
ff_mpv_common_end(s);
|
||||
s->parse_context = pc;
|
||||
s1->mpeg_enc_ctx_allocated = 0;
|
||||
}
|
||||
|
||||
ret = ff_set_dimensions(avctx, s->width, s->height);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
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;
|
||||
s1->save_progressive_seq = s->progressive_sequence;
|
||||
|
||||
/* low_delay may be forced, in this case we will have B-frames
|
||||
* that behave like P-frames. */
|
||||
avctx->has_b_frames = !s->low_delay;
|
||||
|
||||
if (avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
|
||||
// MPEG-1 fps
|
||||
avctx->framerate = ff_mpeg12_frame_rate_tab[s->frame_rate_index];
|
||||
avctx->ticks_per_frame = 1;
|
||||
} else { // MPEG-2
|
||||
// MPEG-2 fps
|
||||
av_reduce(&s->avctx->framerate.num,
|
||||
&s->avctx->framerate.den,
|
||||
ff_mpeg12_frame_rate_tab[s->frame_rate_index].num * s1->frame_rate_ext.num,
|
||||
ff_mpeg12_frame_rate_tab[s->frame_rate_index].den * s1->frame_rate_ext.den,
|
||||
1 << 30);
|
||||
avctx->ticks_per_frame = 2;
|
||||
} // MPEG-2
|
||||
|
||||
avctx->pix_fmt = mpeg_get_pixelformat(avctx);
|
||||
setup_hwaccel_for_pixfmt(avctx);
|
||||
|
||||
|
|
Loading…
Reference in New Issue