Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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 <nfxjfg@googlemail.com>
Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com>
  • Loading branch information
acolwell authored and kodawah committed Dec 7, 2015
1 parent c34df42 commit febfb49
Showing 1 changed file with 34 additions and 2 deletions.
36 changes: 34 additions & 2 deletions libavformat/matroskadec.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit febfb49

Please sign in to comment.