History

avformat/matroskadec: Fix sample_aspect_ratio for stereo matroska content

matroskaenc.c applies divisors to the display width/height when generating stereo content. This patch adds the corresponding multipliers to matroskadec.c so that the original sample aspect ratio can be recovered.

Aaron Colwell committed 10 years ago

Commit ec83efd1 parent 5e6ce281 file · +32 −2Browse files

Unified · Split

libavformat/matroskadec.c+32−2
@@ -1648,6 +1648,30 @@ static int matroska_parse_flac(AVFormatContext *s, · 1647 unmodified lines
16481648 return 0;
16491649 }
16501650
1651+static void mkv_stereo_mode_display_mul(int stereo_mode, int *h_width, int *h_height)
1652+{
1653+ switch (stereo_mode) {
1654+ case MATROSKA_VIDEO_STEREOMODE_TYPE_MONO:
1655+ case MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_RL:
1656+ case MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_LR:
1657+ case MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_RL:
1658+ case MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_LR:
1659+ break;
1660+ case MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT:
1661+ case MATROSKA_VIDEO_STEREOMODE_TYPE_LEFT_RIGHT:
1662+ case MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_RL:
1663+ case MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_LR:
1664+ *h_width = 2;
1665+ break;
1666+ case MATROSKA_VIDEO_STEREOMODE_TYPE_BOTTOM_TOP:
1667+ case MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM:
1668+ case MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_RL:
1669+ case MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_LR:
1670+ *h_height = 2;
1671+ break;
1672+ }
1673+}
1674+
16511675 static int matroska_parse_tracks(AVFormatContext *s)
16521676 {
16531677 MatroskaDemuxContext *matroska = s->priv_data;
@@ -2007,6 +2031,8 @@ static int matroska_parse_tracks(AVFormatContext *s) · 353 unmodified lines
20072031
20082032 if (track->type == MATROSKA_TRACK_TYPE_VIDEO) {
20092033 MatroskaTrackPlane *planes = track->operation.combine_planes.elem;
2034+ int display_width_mul = 1;
2035+ int display_height_mul = 1;
20102036
20112037 st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
20122038 st->codec->codec_tag = fourcc;
@@ -2014,10 +2040,14 @@ static int matroska_parse_tracks(AVFormatContext *s) · 1 unmodified line
20142040 st->codec->bits_per_coded_sample = bit_depth;
20152041 st->codec->width = track->video.pixel_width;
20162042 st->codec->height = track->video.pixel_height;
2043+
2044+ if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB)
2045+ mkv_stereo_mode_display_mul(track->video.stereo_mode, &display_width_mul, &display_height_mul);
2046+
20172047 av_reduce(&st->sample_aspect_ratio.num,
20182048 &st->sample_aspect_ratio.den,
2019− st->codec->height * track->video.display_width,
2020− st->codec->width * track->video.display_height,
2049+ st->codec->height * track->video.display_width * display_width_mul,
2050+ st->codec->width * track->video.display_height * display_height_mul,
20212051 255);
20222052 if (st->codec->codec_id != AV_CODEC_ID_HEVC)
20232053 st->need_parsing = AVSTREAM_PARSE_HEADERS;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t