From patchwork Wed Nov 14 09:57:25 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerome Borsboom X-Patchwork-Id: 11021 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 4356244D422 for ; Wed, 14 Nov 2018 11:57:34 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 157F3689C2F; Wed, 14 Nov 2018 11:56:56 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from kyoto.xs4all.nl (kyoto.xs4all.nl [83.161.153.34]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1F3FB689832 for ; Wed, 14 Nov 2018 11:56:48 +0200 (EET) Received: from [10.1.48.93] ([87.215.30.74]) (authenticated bits=0) by kyoto.xs4all.nl (8.14.7/8.14.7) with ESMTP id wAE9vP8I012050 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 14 Nov 2018 10:57:26 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=carpalis.nl; s=default; t=1542189446; bh=hc/YJeC+hgTcsHcgmyhLu9+CC4eAXDU6nvLphLB46X0=; h=To:From:Subject:Date; b=o/cDasu6KGVH0NKZnH3Vg765KkPrDqOXIHZQx1EMBnEAF4o6Sj3ql4lGqtBpxa3tL eg5O+HUhVM6bHwx1ahZNy77PVdCIfJxohwxnlay2bqWnNyA9VowyUMkLjF5ci+hENg wAWyMkXY8j4dz6UPyFz0KfwrITBPg9dSAu7ODkQ9pabxmQk1cls1gAIhI9iolKdBl7 1slTdhdcc9oVv+onRkX7A+NW98FuKVevnbWh9BOnaE+Td+QA6Da1Ze62k7vuyGCtux LJw9j9tW6fgwmWiZdzhCo+RgtVzQeAhfb4NdYCiFIaLoOaug4kShI0TEB5jHNtXxPY hjOCd2zyidXtw== To: FFmpeg development discussions and patches From: Jerome Borsboom Message-ID: Date: Wed, 14 Nov 2018 10:57:25 +0100 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.3.0 MIME-Version: 1.0 Content-Language: nl Subject: [FFmpeg-devel] [PATCH] avcodec/vc1: correct aspect ratio calculation X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" According to VC-1 spec: * Display size defaults to max coded size when not explicitly set in sequence header * Aspect ratio in the sequence header refers to the Display size elements. Therefore, the aspect ratio for the coded samples (SAR) needs to take into account the scaling from coded size to display size, and the aspect ratio of the display size elements. Signed-off-by: Jerome Borsboom --- VC-1 spec assumes that the output of the decoder, i.e. the pixel matrix with dimensions coded_width x coded_height, is scaled to display size, i.e. a pixel matrix of display_horiz_size x display_vert_size. This may introduce part of the sample aspect ratio when the sizes of the two pixel matrices are not equal. A further part of the sample aspect ratio is optionally specified in the sequence header as the aspect ratio of the display size pixels. This patch takes both aspect ratios into account and aims to be correct even when the coded image includes overscan regions. libavcodec/vc1.c | 38 +++++++++++++++++++++----------------- libavcodec/vc1.h | 2 ++ 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c index 3581d87b57..efc6edc4b0 100644 --- a/libavcodec/vc1.c +++ b/libavcodec/vc1.c @@ -442,30 +442,24 @@ static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb) } v->s.max_b_frames = v->s.avctx->max_b_frames = 7; if (get_bits1(gb)) { //Display Info - decoding is not affected by it - int w, h, ar = 0; + int ar = 0; av_log(v->s.avctx, AV_LOG_DEBUG, "Display extended info:\n"); - w = get_bits(gb, 14) + 1; - h = get_bits(gb, 14) + 1; - av_log(v->s.avctx, AV_LOG_DEBUG, "Display dimensions: %ix%i\n", w, h); + v->disp_horiz_size = get_bits(gb, 14) + 1; + v->disp_vert_size = get_bits(gb, 14) + 1; + av_log(v->s.avctx, AV_LOG_DEBUG, "Display dimensions: %ix%i\n", + v->disp_horiz_size, v->disp_vert_size); if (get_bits1(gb)) ar = get_bits(gb, 4); if (ar && ar < 14) { - v->s.avctx->sample_aspect_ratio = ff_vc1_pixel_aspect[ar]; + v->aspect_ratio = ff_vc1_pixel_aspect[ar]; } else if (ar == 15) { - w = get_bits(gb, 8) + 1; - h = get_bits(gb, 8) + 1; - v->s.avctx->sample_aspect_ratio = (AVRational){w, h}; + v->aspect_ratio = (AVRational){get_bits(gb, 8) + 1, get_bits(gb, 8) + 1}; } else { - av_reduce(&v->s.avctx->sample_aspect_ratio.num, - &v->s.avctx->sample_aspect_ratio.den, - v->s.avctx->height * w, - v->s.avctx->width * h, - 1 << 30); + v->aspect_ratio = (AVRational){1, 1}; } - ff_set_sar(v->s.avctx, v->s.avctx->sample_aspect_ratio); - av_log(v->s.avctx, AV_LOG_DEBUG, "Aspect: %i:%i\n", - v->s.avctx->sample_aspect_ratio.num, - v->s.avctx->sample_aspect_ratio.den); + av_log(v->s.avctx, AV_LOG_DEBUG, "Aspect ratio: %i:%i\n", + v->aspect_ratio.num, + v->aspect_ratio.den); if (get_bits1(gb)) { //framerate stuff if (get_bits1(gb)) { @@ -490,6 +484,10 @@ static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb) v->transfer_char = get_bits(gb, 8); v->matrix_coef = get_bits(gb, 8); } + } else { + v->disp_horiz_size = v->max_coded_width; + v->disp_vert_size = v->max_coded_height; + v->aspect_ratio = (AVRational){1, 1}; } v->hrd_param_flag = get_bits1(gb); @@ -544,6 +542,12 @@ int ff_vc1_decode_entry_point(AVCodecContext *avctx, VC1Context *v, GetBitContex av_log(avctx, AV_LOG_ERROR, "Failed to set dimensions %d %d\n", w, h); return ret; } + av_reduce(&avctx->sample_aspect_ratio.num, + &avctx->sample_aspect_ratio.den, + v->disp_horiz_size * v->aspect_ratio.num * h, + v->disp_vert_size * v->aspect_ratio.den * w, + 1 << 30); + ff_set_sar(avctx, avctx->sample_aspect_ratio); if (v->extended_mv) v->extended_dmv = get_bits1(gb); diff --git a/libavcodec/vc1.h b/libavcodec/vc1.h index 69f6ca9e4d..7674b0f9a1 100644 --- a/libavcodec/vc1.h +++ b/libavcodec/vc1.h @@ -209,6 +209,8 @@ typedef struct VC1Context{ int hrd_param_flag; ///< Presence of Hypothetical Reference ///< Decoder parameters int psf; ///< Progressive Segmented Frame + int disp_horiz_size, disp_vert_size; + AVRational aspect_ratio; //@} /** Sequence header data for all Profiles