mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-02-17 12:27:18 +00:00
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,6 +1273,50 @@ static int mpeg_decode_postinit(AVCodecContext *avctx)
|
|||||||
uint8_t old_permutation[64];
|
uint8_t old_permutation[64];
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
|
||||||
|
// MPEG-1 aspect
|
||||||
|
avctx->sample_aspect_ratio = av_d2q(1.0 / ff_mpeg1_aspect[s->aspect_ratio_info], 255);
|
||||||
|
} else { // MPEG-2
|
||||||
|
// MPEG-2 aspect
|
||||||
|
if (s->aspect_ratio_info > 1) {
|
||||||
|
AVRational dar =
|
||||||
|
av_mul_q(av_div_q(ff_mpeg2_aspect[s->aspect_ratio_info],
|
||||||
|
(AVRational) { s1->pan_scan.width,
|
||||||
|
s1->pan_scan.height }),
|
||||||
|
(AVRational) { s->width, s->height });
|
||||||
|
|
||||||
|
/* We ignore the spec here and guess a bit as reality does not
|
||||||
|
* match the spec, see for example res_change_ffmpeg_aspect.ts
|
||||||
|
* and sequence-display-aspect.mpg.
|
||||||
|
* issue1613, 621, 562 */
|
||||||
|
if ((s1->pan_scan.width == 0) || (s1->pan_scan.height == 0) ||
|
||||||
|
(av_cmp_q(dar, (AVRational) { 4, 3 }) &&
|
||||||
|
av_cmp_q(dar, (AVRational) { 16, 9 }))) {
|
||||||
|
s->avctx->sample_aspect_ratio =
|
||||||
|
av_div_q(ff_mpeg2_aspect[s->aspect_ratio_info],
|
||||||
|
(AVRational) { s->width, s->height });
|
||||||
|
} else {
|
||||||
|
s->avctx->sample_aspect_ratio =
|
||||||
|
av_div_q(ff_mpeg2_aspect[s->aspect_ratio_info],
|
||||||
|
(AVRational) { s1->pan_scan.width, s1->pan_scan.height });
|
||||||
|
// issue1613 4/3 16/9 -> 16/9
|
||||||
|
// res_change_ffmpeg_aspect.ts 4/3 225/44 ->4/3
|
||||||
|
// widescreen-issue562.mpg 4/3 16/9 -> 16/9
|
||||||
|
// s->avctx->sample_aspect_ratio = av_mul_q(s->avctx->sample_aspect_ratio, (AVRational) {s->width, s->height});
|
||||||
|
av_dlog(avctx, "A %d/%d\n",
|
||||||
|
ff_mpeg2_aspect[s->aspect_ratio_info].num,
|
||||||
|
ff_mpeg2_aspect[s->aspect_ratio_info].den);
|
||||||
|
av_dlog(avctx, "B %d/%d\n", s->avctx->sample_aspect_ratio.num,
|
||||||
|
s->avctx->sample_aspect_ratio.den);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
s->avctx->sample_aspect_ratio =
|
||||||
|
ff_mpeg2_aspect[s->aspect_ratio_info];
|
||||||
|
}
|
||||||
|
} // MPEG-2
|
||||||
|
|
||||||
|
ff_set_sar(s->avctx, s->avctx->sample_aspect_ratio);
|
||||||
|
|
||||||
if ((s1->mpeg_enc_ctx_allocated == 0) ||
|
if ((s1->mpeg_enc_ctx_allocated == 0) ||
|
||||||
avctx->coded_width != s->width ||
|
avctx->coded_width != s->width ||
|
||||||
avctx->coded_height != s->height ||
|
avctx->coded_height != s->height ||
|
||||||
@ -1311,8 +1355,6 @@ static int mpeg_decode_postinit(AVCodecContext *avctx)
|
|||||||
if (avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
|
if (avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
|
||||||
// MPEG-1 fps
|
// MPEG-1 fps
|
||||||
avctx->framerate = ff_mpeg12_frame_rate_tab[s->frame_rate_index];
|
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;
|
avctx->ticks_per_frame = 1;
|
||||||
} else { // MPEG-2
|
} else { // MPEG-2
|
||||||
// MPEG-2 fps
|
// MPEG-2 fps
|
||||||
@ -1322,46 +1364,8 @@ static int mpeg_decode_postinit(AVCodecContext *avctx)
|
|||||||
ff_mpeg12_frame_rate_tab[s->frame_rate_index].den * s1->frame_rate_ext.den,
|
ff_mpeg12_frame_rate_tab[s->frame_rate_index].den * s1->frame_rate_ext.den,
|
||||||
1 << 30);
|
1 << 30);
|
||||||
avctx->ticks_per_frame = 2;
|
avctx->ticks_per_frame = 2;
|
||||||
// MPEG-2 aspect
|
|
||||||
if (s->aspect_ratio_info > 1) {
|
|
||||||
AVRational dar =
|
|
||||||
av_mul_q(av_div_q(ff_mpeg2_aspect[s->aspect_ratio_info],
|
|
||||||
(AVRational) { s1->pan_scan.width,
|
|
||||||
s1->pan_scan.height }),
|
|
||||||
(AVRational) { s->width, s->height });
|
|
||||||
|
|
||||||
/* We ignore the spec here and guess a bit as reality does not
|
|
||||||
* match the spec, see for example res_change_ffmpeg_aspect.ts
|
|
||||||
* and sequence-display-aspect.mpg.
|
|
||||||
* issue1613, 621, 562 */
|
|
||||||
if ((s1->pan_scan.width == 0) || (s1->pan_scan.height == 0) ||
|
|
||||||
(av_cmp_q(dar, (AVRational) { 4, 3 }) &&
|
|
||||||
av_cmp_q(dar, (AVRational) { 16, 9 }))) {
|
|
||||||
s->avctx->sample_aspect_ratio =
|
|
||||||
av_div_q(ff_mpeg2_aspect[s->aspect_ratio_info],
|
|
||||||
(AVRational) { s->width, s->height });
|
|
||||||
} else {
|
|
||||||
s->avctx->sample_aspect_ratio =
|
|
||||||
av_div_q(ff_mpeg2_aspect[s->aspect_ratio_info],
|
|
||||||
(AVRational) { s1->pan_scan.width, s1->pan_scan.height });
|
|
||||||
// issue1613 4/3 16/9 -> 16/9
|
|
||||||
// res_change_ffmpeg_aspect.ts 4/3 225/44 ->4/3
|
|
||||||
// widescreen-issue562.mpg 4/3 16/9 -> 16/9
|
|
||||||
// s->avctx->sample_aspect_ratio = av_mul_q(s->avctx->sample_aspect_ratio, (AVRational) {s->width, s->height});
|
|
||||||
av_dlog(avctx, "A %d/%d\n",
|
|
||||||
ff_mpeg2_aspect[s->aspect_ratio_info].num,
|
|
||||||
ff_mpeg2_aspect[s->aspect_ratio_info].den);
|
|
||||||
av_dlog(avctx, "B %d/%d\n", s->avctx->sample_aspect_ratio.num,
|
|
||||||
s->avctx->sample_aspect_ratio.den);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
s->avctx->sample_aspect_ratio =
|
|
||||||
ff_mpeg2_aspect[s->aspect_ratio_info];
|
|
||||||
}
|
|
||||||
} // MPEG-2
|
} // MPEG-2
|
||||||
|
|
||||||
ff_set_sar(s->avctx, s->avctx->sample_aspect_ratio);
|
|
||||||
|
|
||||||
avctx->pix_fmt = mpeg_get_pixelformat(avctx);
|
avctx->pix_fmt = mpeg_get_pixelformat(avctx);
|
||||||
setup_hwaccel_for_pixfmt(avctx);
|
setup_hwaccel_for_pixfmt(avctx);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user