summaryrefslogtreecommitdiffstats
path: root/player
diff options
context:
space:
mode:
Diffstat (limited to 'player')
-rw-r--r--player/core.h4
-rw-r--r--player/loadfile.c24
-rw-r--r--player/sub.c34
3 files changed, 27 insertions, 35 deletions
diff --git a/player/core.h b/player/core.h
index db453e097e..1d68019c1a 100644
--- a/player/core.h
+++ b/player/core.h
@@ -139,6 +139,9 @@ struct track {
// Invariant: !stream || stream->demuxer == demuxer
struct sh_stream *stream;
+ // Current subtitle state (or cached state if selected==false).
+ struct dec_sub *dec_sub;
+
// For external subtitles, which are read fully on init. Do not attempt
// to read packets from them.
bool preloaded;
@@ -517,7 +520,6 @@ void mp_load_scripts(struct MPContext *mpctx);
// sub.c
void reset_subtitle_state(struct MPContext *mpctx);
-void uninit_stream_sub_decoders(struct demuxer *demuxer);
void reinit_subs(struct MPContext *mpctx, int order);
void uninit_sub(struct MPContext *mpctx, int order);
void uninit_sub_all(struct MPContext *mpctx);
diff --git a/player/loadfile.c b/player/loadfile.c
index 8b35209d9f..f1664b2d9d 100644
--- a/player/loadfile.c
+++ b/player/loadfile.c
@@ -72,17 +72,15 @@ static void uninit_demuxer(struct MPContext *mpctx)
mpctx->chapters = NULL;
mpctx->num_chapters = 0;
- // per-stream cached subtitle state
- for (int i = 0; i < mpctx->num_sources; i++)
- uninit_stream_sub_decoders(mpctx->sources[i]);
-
// close demuxers for external tracks
for (int n = mpctx->num_tracks - 1; n >= 0; n--) {
mpctx->tracks[n]->selected = false;
mp_remove_track(mpctx, mpctx->tracks[n]);
}
- for (int i = 0; i < mpctx->num_tracks; i++)
+ for (int i = 0; i < mpctx->num_tracks; i++) {
+ sub_destroy(mpctx->tracks[i]->dec_sub);
talloc_free(mpctx->tracks[i]);
+ }
mpctx->num_tracks = 0;
mpctx->timeline = NULL;
@@ -337,10 +335,15 @@ bool timeline_switch_to_time(struct MPContext *mpctx, double pts)
track->user_tid - 1);
}
- if (track->type == STREAM_SUB && track->stream) {
- struct dec_sub *dec = track->stream->sub->dec_sub;
- if (dec)
- sub_control(dec, SD_CTRL_CLEAR, NULL);
+ if (track->dec_sub) {
+ for (int order = 0; order < 2; order++) {
+ if (mpctx->d_sub[order] == track->dec_sub) {
+ mpctx->d_sub[order] = NULL;
+ osd_set_sub(mpctx->osd, OSDTYPE_SUB + order, NULL);
+ }
+ }
+ sub_destroy(track->dec_sub);
+ track->dec_sub = NULL;
}
}
}
@@ -654,6 +657,8 @@ bool mp_remove_track(struct MPContext *mpctx, struct track *track)
struct demuxer *d = track->demuxer;
+ sub_destroy(track->dec_sub);
+
int index = 0;
while (index < mpctx->num_tracks && mpctx->tracks[index] != track)
index++;
@@ -674,7 +679,6 @@ bool mp_remove_track(struct MPContext *mpctx, struct track *track)
break;
}
}
- uninit_stream_sub_decoders(d);
free_demuxer_and_stream(d);
}
diff --git a/player/sub.c b/player/sub.c
index df84e910af..25af9e5c15 100644
--- a/player/sub.c
+++ b/player/sub.c
@@ -144,22 +144,11 @@ void reset_subtitle_state(struct MPContext *mpctx)
reset_subtitles(mpctx, 1);
}
-void uninit_stream_sub_decoders(struct demuxer *demuxer)
-{
- for (int i = 0; i < demux_get_num_stream(demuxer); i++) {
- struct sh_stream *sh = demux_get_stream(demuxer, i);
- if (sh->sub) {
- sub_destroy(sh->sub->dec_sub);
- sh->sub->dec_sub = NULL;
- }
- }
-}
-
void uninit_sub(struct MPContext *mpctx, int order)
{
if (mpctx->d_sub[order]) {
reset_subtitles(mpctx, order);
- mpctx->d_sub[order] = NULL; // Note: not free'd.
+ mpctx->d_sub[order] = NULL; // not destroyed
osd_set_sub(mpctx->osd, OSDTYPE_SUB + order, NULL);
reselect_demux_streams(mpctx);
}
@@ -211,8 +200,6 @@ static void update_subtitle(struct MPContext *mpctx, int order)
struct sh_stream *sh_stream = track->stream;
bool interleaved = is_interleaved(mpctx, track);
- assert(sh_stream->sub->dec_sub == dec_sub);
-
while (1) {
if (interleaved && !demux_has_packet(sh_stream))
break;
@@ -248,11 +235,12 @@ void update_subtitles(struct MPContext *mpctx)
update_subtitle(mpctx, 1);
}
-static void reinit_subdec(struct MPContext *mpctx, struct track *track,
- struct dec_sub *dec_sub)
+static void reinit_subdec(struct MPContext *mpctx, struct track *track)
{
struct MPOpts *opts = mpctx->opts;
+ struct dec_sub *dec_sub = track->dec_sub;
+
if (sub_is_initialized(dec_sub))
return;
@@ -288,13 +276,11 @@ void reinit_subs(struct MPContext *mpctx, int order)
if (!sh)
return;
- // The decoder is cached in the stream header in order to make ordered
- // chapters work better.
- if (!sh->sub->dec_sub)
- sh->sub->dec_sub = sub_create(mpctx->global);
- mpctx->d_sub[order] = sh->sub->dec_sub;
+ if (!track->dec_sub)
+ track->dec_sub = sub_create(mpctx->global);
+ mpctx->d_sub[order] = track->dec_sub;
- reinit_subdec(mpctx, track, sh->sub->dec_sub);
- osd_set_sub(mpctx->osd, OSDTYPE_SUB + order, sh->sub->dec_sub);
- sub_control(sh->sub->dec_sub, SD_CTRL_SET_TOP, &(bool){!!order});
+ reinit_subdec(mpctx, track);
+ osd_set_sub(mpctx->osd, OSDTYPE_SUB + order, track->dec_sub);
+ sub_control(track->dec_sub, SD_CTRL_SET_TOP, &(bool){!!order});
}