Skip to content

Commit 223c926

Browse files
committed
demux_mkv: group EL+BL dovi tracks
1 parent a0b19d2 commit 223c926

1 file changed

Lines changed: 46 additions & 0 deletions

File tree

demux/demux_mkv.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
22632308
static 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

Comments
 (0)