From 438f3ef8214ddc3bc3f2c25328c34065df48d4e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reimar=20D=C3=B6ffinger?= Date: Mon, 9 Apr 2012 14:21:01 +0200 Subject: [PATCH] RV20: try keeping aspect during resolution changes. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolution changes are usually only used to scale with network bandwidth, the (full) resolution specified in the RM header really is authoritative. While I am not sure this is the best solution, it is a conservative approach that still should fix the most common cases. In particular, it fixes aspect with the sample from trac issue #785 (in MPlayer, ffplay seems to just ignore sample aspect changes in mid-playback). Signed-off-by: Reimar Döffinger --- libavcodec/rv10.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/libavcodec/rv10.c b/libavcodec/rv10.c index 78b81e97ca..f4ce1a38c9 100644 --- a/libavcodec/rv10.c +++ b/libavcodec/rv10.c @@ -371,10 +371,19 @@ static int rv20_decode_picture_header(RVDecContext *rv) new_h= s->orig_height; } if(new_w != s->width || new_h != s->height){ + AVRational old_aspect = s->avctx->sample_aspect_ratio; av_log(s->avctx, AV_LOG_DEBUG, "attempting to change resolution to %dx%d\n", new_w, new_h); if (av_image_check_size(new_w, new_h, 0, s->avctx) < 0) return -1; ff_MPV_common_end(s); + + // attempt to keep aspect during typical resolution switches + if (!old_aspect.num) + old_aspect = (AVRational){1, 1}; + if (2 * new_w * s->height == new_h * s->width) + s->avctx->sample_aspect_ratio = av_mul_q(old_aspect, (AVRational){2, 1}); + if (new_w * s->height == 2 * new_h * s->width) + s->avctx->sample_aspect_ratio = av_mul_q(old_aspect, (AVRational){1, 2}); avcodec_set_dimensions(s->avctx, new_w, new_h); s->width = new_w; s->height = new_h;