@ -1648,6 +1648,30 @@ 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 ;
@ -2007,6 +2031,8 @@ static int matroska_parse_tracks(AVFormatContext *s)
if ( track - > type = = MATROSKA_TRACK_TYPE_VIDEO ) {
MatroskaTrackPlane * planes = track - > operation . combine_planes . elem ;
int display_width_mul = 1 ;
int display_height_mul = 1 ;
st - > codec - > codec_type = AVMEDIA_TYPE_VIDEO ;
st - > codec - > codec_tag = fourcc ;
@ -2014,10 +2040,14 @@ static int matroska_parse_tracks(AVFormatContext *s)
st - > codec - > bits_per_coded_sample = bit_depth ;
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_HEVC )
st - > need_parsing = AVSTREAM_PARSE_HEADERS ;