mirror of
				https://github.com/nyanmisaka/ffmpeg-rockchip.git
				synced 2025-10-31 04:26:37 +08:00 
			
		
		
		
	RV20: try keeping aspect during resolution changes.
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 <Reimar.Doeffinger@gmx.de>
This commit is contained in:
		| @@ -371,10 +371,19 @@ static int rv20_decode_picture_header(RVDecContext *rv) | |||||||
|             new_h= s->orig_height; |             new_h= s->orig_height; | ||||||
|         } |         } | ||||||
|         if(new_w != s->width || new_h != s->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); |             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) |             if (av_image_check_size(new_w, new_h, 0, s->avctx) < 0) | ||||||
|                 return -1; |                 return -1; | ||||||
|             ff_MPV_common_end(s); |             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); |             avcodec_set_dimensions(s->avctx, new_w, new_h); | ||||||
|             s->width  = new_w; |             s->width  = new_w; | ||||||
|             s->height = new_h; |             s->height = new_h; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Reimar Döffinger
					Reimar Döffinger