diff options
Diffstat (limited to 'player/sub.c')
-rw-r--r-- | player/sub.c | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/player/sub.c b/player/sub.c index 6e707b3d95..6892ac935b 100644 --- a/player/sub.c +++ b/player/sub.c @@ -73,7 +73,6 @@ void uninit_sub(struct MPContext *mpctx, struct track *track) int order = get_order(mpctx, track); if (order >= 0 && order <= 1) osd_set_sub(mpctx->osd, OSDTYPE_SUB + order, NULL); - reselect_demux_streams(mpctx); } } @@ -100,6 +99,14 @@ static bool update_subtitle(struct MPContext *mpctx, double video_pts, video_pts -= opts->sub_delay; + if (!track->preloaded && track->demuxer->fully_read && !opts->sub_clear_on_seek) + { + // Assume fully_read implies no interleaved audio/video streams. + // (Reading packets will change the demuxer position.) + demux_seek(track->demuxer, 0, 0); + track->preloaded = sub_read_all_packets(track->d_sub); + } + if (!track->preloaded) { if (!sub_read_packets(dec_sub, video_pts)) return false; @@ -124,8 +131,6 @@ bool update_subtitles(struct MPContext *mpctx, double video_pts) static bool init_subdec(struct MPContext *mpctx, struct track *track) { - struct MPOpts *opts = mpctx->opts; - assert(!track->d_sub); if (!track->demuxer || !track->stream) @@ -141,16 +146,6 @@ static bool init_subdec(struct MPContext *mpctx, struct track *track) double fps = v_c ? v_c->fps : 25; sub_control(track->d_sub, SD_CTRL_SET_VIDEO_DEF_FPS, &fps); - // Don't do this if the file has video/audio streams. Don't do it even - // if it has only sub streams, because reading packets will change the - // demuxer position. - if (track->is_external && !opts->sub_clear_on_seek) { - demux_seek(track->demuxer, 0, SEEK_ABSOLUTE); - track->preloaded = sub_read_all_packets(track->d_sub); - if (track->preloaded) - demux_stop_thread(track->demuxer); - } - return true; } |