diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/mplayer.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/core/mplayer.c b/core/mplayer.c index c16a38a3c0..a48bd4b37c 100644 --- a/core/mplayer.c +++ b/core/mplayer.c @@ -1675,6 +1675,23 @@ double playing_audio_pts(struct MPContext *mpctx) return pts - mpctx->opts.playback_speed *ao_get_delay(mpctx->ao); } +// When reading subtitles from a demuxer, and we don't read video or audio +// from the demuxer, we must explicitly read subtitle packets. (Normally, +// subs are interleaved with video and audio, so we get them automatically.) +static bool is_non_interleaved(struct MPContext *mpctx, struct track *track) +{ + if (track->is_external || !track->demuxer) + return true; + + struct demuxer *demuxer = track->demuxer; + for (int type = 0; type < STREAM_TYPE_COUNT; type++) { + struct track *other = mpctx->current_track[type]; + if (other != track && other->demuxer && other->demuxer == demuxer) + return false; + } + return true; +} + static void reset_subtitles(struct MPContext *mpctx) { if (mpctx->sh_sub) @@ -1765,7 +1782,7 @@ static void update_subtitles(struct MPContext *mpctx, double refpts_tl) spudec_assemble(vo_spudec, packet, len, timestamp); } } else if (d_sub && (is_text_sub(type) || (sh_sub && sh_sub->active))) { - bool non_interleaved = track->is_external; // if demuxing subs only + bool non_interleaved = is_non_interleaved(mpctx, track); if (non_interleaved) ds_get_next_pts(d_sub); |