From febfb49a70e82f5ac46dc7ea34dabd4d56b19b31 Mon Sep 17 00:00:00 2001 From: Aaron Colwell Date: Wed, 2 Dec 2015 18:13:18 -0500 Subject: matroskadec: Fix sample_aspect_ratio for stereo matroska content matroskaenc applies divisors to the display width/height when generating stereo content. This patch adds the corresponding multipliers to matroskadec so that the original sample aspect ratio can be recovered. Signed-off-by: wm4 Signed-off-by: Vittorio Giovara --- libavformat/matroskadec.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) (limited to 'libavformat/matroskadec.c') diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index bdf2eb4219..0757bf586f 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -1525,6 +1525,31 @@ static int matroska_parse_flac(AVFormatContext *s, return 0; } +static void mkv_stereo_mode_display_mul(int stereo_mode, + int *h_width, int *h_height) +{ + switch (stereo_mode) { + case MATROSKA_VIDEO_STEREOMODE_TYPE_MONO: + case MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_RL: + case MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_LR: + case MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_RL: + case MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_LR: + break; + case MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT: + case MATROSKA_VIDEO_STEREOMODE_TYPE_LEFT_RIGHT: + case MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_RL: + case MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_LR: + *h_width = 2; + break; + case MATROSKA_VIDEO_STEREOMODE_TYPE_BOTTOM_TOP: + case MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM: + case MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_RL: + case MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_LR: + *h_height = 2; + break; + } +} + static int matroska_parse_tracks(AVFormatContext *s) { MatroskaDemuxContext *matroska = s->priv_data; @@ -1810,14 +1835,21 @@ static int matroska_parse_tracks(AVFormatContext *s) } if (track->type == MATROSKA_TRACK_TYPE_VIDEO) { + int display_width_mul = 1; + int display_height_mul = 1; + st->codec->codec_type = AVMEDIA_TYPE_VIDEO; st->codec->codec_tag = track->video.fourcc; st->codec->width = track->video.pixel_width; st->codec->height = track->video.pixel_height; + + if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB) + mkv_stereo_mode_display_mul(track->video.stereo_mode, &display_width_mul, &display_height_mul); + av_reduce(&st->sample_aspect_ratio.num, &st->sample_aspect_ratio.den, - st->codec->height * track->video.display_width, - st->codec->width * track->video.display_height, + st->codec->height * track->video.display_width * display_width_mul, + st->codec->width * track->video.display_height * display_height_mul, 255); if (st->codec->codec_id != AV_CODEC_ID_H264 && st->codec->codec_id != AV_CODEC_ID_HEVC) -- cgit v1.2.3