From 50c701574dc6b52a695e417586875aa0066592e8 Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 21 Jan 2016 23:49:25 +0100 Subject: sub: change when/how subtitles are read completely Most text subtitles are read completely on loading (libavformat works this way, and there are good reasons to do it on the higher levels too). This leads to some messy problems. For example, the subtitle path is the only one which might read packets during decoder initialization. This is not neccessary; get rid of it. This fixes a potential problem of seeking to position 0 for image subtitles on init, and if the start position is not at the beginning of the timeline. --- player/sub.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) (limited to 'player/sub.c') diff --git a/player/sub.c b/player/sub.c index 6e707b3d95..ab9f714352 100644 --- a/player/sub.c +++ b/player/sub.c @@ -100,6 +100,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, SEEK_ABSOLUTE); + track->preloaded = sub_read_all_packets(track->d_sub); + } + if (!track->preloaded) { if (!sub_read_packets(dec_sub, video_pts)) return false; @@ -124,8 +132,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 +147,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; } -- cgit v1.2.3 From 71fa2e6fc22a1b53dd1ddb1ca877794867f7ac5f Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 25 Feb 2016 22:44:50 +0100 Subject: player: slightly simplify how demuxer streams are enabled/disabled Instead of having reselect_demux_streams() look at all streams, make it look at the current stream that is being enabled/disabled. --- player/sub.c | 1 - 1 file changed, 1 deletion(-) (limited to 'player/sub.c') diff --git a/player/sub.c b/player/sub.c index ab9f714352..6b2a3664dc 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); } } -- cgit v1.2.3 From 92ba63079617f6579c276dd3ec54197b56378913 Mon Sep 17 00:00:00 2001 From: wm4 Date: Sun, 28 Feb 2016 19:14:23 +0100 Subject: demux: remove relative seeking Ever since a change in mplayer2 or so, relative seeks were translated to absolute seeks before sending them to the demuxer in most cases. The only exception in current mpv is DVD seeking. Remove the SEEK_ABSOLUTE flag; it's not the implied default. SEEK_FACTOR is kept, because it's sometimes slightly useful for seeking in things like transport streams. (And maybe mkv files without duration set?) DVD seeking is terrible because DVD and libdvdnav are terrible, but mostly because libdvdnav is terrible. libdvdnav does not expose seeking with seek tables. (Although I know xbmc/kodi use an undocumented API that is not declared in the headers by dladdr()ing it - I think the function is dvdnav_jump_to_sector_by_time().) With the current mpv policy if not giving a shit about DVD, just revert our half-working seek hacks and always use dvdnav_time_search(). Relative seeking might get stuck sometimes; in this case --hr-seek=always is recommended. --- player/sub.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'player/sub.c') diff --git a/player/sub.c b/player/sub.c index 6b2a3664dc..6892ac935b 100644 --- a/player/sub.c +++ b/player/sub.c @@ -103,7 +103,7 @@ static bool update_subtitle(struct MPContext *mpctx, double video_pts, { // Assume fully_read implies no interleaved audio/video streams. // (Reading packets will change the demuxer position.) - demux_seek(track->demuxer, 0, SEEK_ABSOLUTE); + demux_seek(track->demuxer, 0, 0); track->preloaded = sub_read_all_packets(track->d_sub); } -- cgit v1.2.3