@@ -2259,6 +2259,51 @@ static int demux_mkv_open_sub(demuxer_t *demuxer, mkv_track_t *track)
22592259 return 0 ;
22602260}
22612261
2262+ static void pair_dovi_tracks (demuxer_t * demuxer )
2263+ {
2264+ mkv_demuxer_t * mkv_d = demuxer -> priv ;
2265+ mkv_track_t * bl_track = NULL , * el_track = NULL ;
2266+
2267+ for (int i = 0 ; i < mkv_d -> num_tracks ; i ++ ) {
2268+ mkv_track_t * track = mkv_d -> tracks [i ];
2269+ if (!track -> stream || track -> stream -> type != STREAM_VIDEO ||
2270+ !track -> codec_id || strcmp (track -> codec_id , "V_MPEGH/ISO/HEVC" ))
2271+ continue ;
2272+
2273+ AVDOVIDecoderConfigurationRecord * dovi = track -> dovi_config ;
2274+ if (dovi && dovi -> dv_profile == 7 && dovi -> el_present_flag ) {
2275+ // bl_present_flag is not checked, because the files in the
2276+ // wild set it to 1 for EL stream, while the expectation, based
2277+ // on Dolby spec for MPEG-TS would be that it's set to 0.
2278+ // Ignore this, if we have EL track and single other video track
2279+ // it's safe to assume it's BL.
2280+ if (el_track )
2281+ return ;
2282+ el_track = track ;
2283+ continue ;
2284+ }
2285+
2286+ if (bl_track )
2287+ return ;
2288+ bl_track = track ;
2289+ }
2290+
2291+ if (!el_track || !bl_track )
2292+ return ;
2293+
2294+ struct sh_stream * bl_sh = bl_track -> stream ;
2295+ struct sh_stream * el_sh = el_track -> stream ;
2296+
2297+ // Group storage is attached to the BL so its lifetime tracks the demuxer.
2298+ struct sh_stream_group * group = talloc_zero (bl_sh , struct sh_stream_group );
2299+ MP_TARRAY_APPEND (group , group -> members , group -> num_members , bl_sh );
2300+ MP_TARRAY_APPEND (group , group -> members , group -> num_members , el_sh );
2301+
2302+ bl_sh -> group = group ;
2303+ el_sh -> group = group ;
2304+ el_sh -> dependent_track = true;
2305+ }
2306+
22622307// Workaround for broken files that don't set attached_picture
22632308static void probe_if_image (demuxer_t * demuxer )
22642309{
@@ -2540,6 +2585,7 @@ static int demux_mkv_open(demuxer_t *demuxer, enum demux_check check)
25402585 MP_VERBOSE (demuxer , "All headers are parsed!\n" );
25412586
25422587 display_create_tracks (demuxer );
2588+ pair_dovi_tracks (demuxer );
25432589 add_coverart (demuxer );
25442590 process_tags (demuxer );
25452591
0 commit comments