aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2011-03-25 01:13:08 +0100
committerMichael Niedermayer <michaelni@gmx.at>2011-03-25 01:45:47 +0100
commit628724b61d744738e21ada8341a282d6802625a3 (patch)
tree69ec9cc286575cdf107bf0cc3a2baa40b82b0feb /libavcodec
parent0a51362b3f3c3a0df09b24fbd9049711bff6fb94 (diff)
downloadffmpeg-628724b61d744738e21ada8341a282d6802625a3.tar.gz
More advanced ffmpeg mpeg2 aspect guessing code.
Fixes issue1613, 621, 562 simultaneously Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/mpeg12.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c
index 76995ad45c..30a6aaaf94 100644
--- a/libavcodec/mpeg12.c
+++ b/libavcodec/mpeg12.c
@@ -1293,9 +1293,19 @@ static int mpeg_decode_postinit(AVCodecContext *avctx){
avctx->ticks_per_frame=2;
//MPEG-2 aspect
if(s->aspect_ratio_info > 1){
- //we ignore the spec here as reality does not match the spec, see for example
+ 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
- if( (s1->pan_scan.width == 0 )||(s1->pan_scan.height == 0) || 1){
+ //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],
@@ -1307,6 +1317,12 @@ static int mpeg_decode_postinit(AVCodecContext *avctx){
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_log(NULL, AV_LOG_ERROR, "A %d/%d\n",ff_mpeg2_aspect[s->aspect_ratio_info].num, ff_mpeg2_aspect[s->aspect_ratio_info].den);
+//av_log(NULL, AV_LOG_ERROR, "B %d/%d\n",s->avctx->sample_aspect_ratio.num, s->avctx->sample_aspect_ratio.den);
}
}else{
s->avctx->sample_aspect_ratio=