[FFmpeg-devel] [PATCH] avcodec/vc1: correct aspect ratio calculation
Michael Niedermayer
michael at niedermayer.cc
Wed Nov 14 22:51:45 EET 2018
Hi
On Wed, Nov 14, 2018 at 10:57:25AM +0100, Jerome Borsboom wrote:
> 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 <jerome.borsboom at carpalis.nl>
> ---
> 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};
iam not sure this is valid C and not undefined
but either way this patch breaks fate
TEST vc1-ism
--- ./tests/ref/fate/vc1-ism 2018-11-13 19:52:23.489023763 +0100
+++ tests/data/fate/vc1-ism 2018-11-14 21:50:11.522992878 +0100
@@ -2,7 +2,7 @@
#media_type 0: video
#codec_id 0: rawvideo
#dimensions 0: 240x104
-#sar 0: 156/156
+#sar 0: 13/30
0, 0, 0, 1, 37440, 0xd1bc5235
0, 2, 2, 1, 37440, 0x158e6167
0, 3, 3, 1, 37440, 0x0faa4481
Test vc1-ism failed. Look at tests/data/fate/vc1-ism.err for details.
make: *** [fate-vc1-ism] Error 1
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
it is not once nor twice but times without number that the same ideas make
their appearance in the world. -- Aristotle
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20181114/de7761f3/attachment.sig>
More information about the ffmpeg-devel
mailing list