diff --git a/player/core.h b/player/core.h index 468d86bf31..e9dd9de768 100644 --- a/player/core.h +++ b/player/core.h @@ -259,7 +259,7 @@ typedef struct MPContext { struct osd_state *osd; char *term_osd_text; char *term_osd_status; - char *term_osd_subs; + char *term_osd_subs[2]; char *term_osd_contents; char *term_osd_title; char *last_window_title; @@ -585,7 +585,8 @@ void set_osd_bar(struct MPContext *mpctx, int type, bool set_osd_msg(struct MPContext *mpctx, int level, int time, const char* fmt, ...) PRINTF_ATTRIBUTE(4,5); void set_osd_function(struct MPContext *mpctx, int osd_function); -void term_osd_set_subs(struct MPContext *mpctx, const char *text); +void term_osd_clear_subs(struct MPContext *mpctx); +void term_osd_set_subs(struct MPContext *mpctx, const char *text, int order); void get_current_osd_sym(struct MPContext *mpctx, char *buf, size_t buf_size); void set_osd_bar_chapters(struct MPContext *mpctx, int type); diff --git a/player/osd.c b/player/osd.c index e32eaf123f..840dff88cc 100644 --- a/player/osd.c +++ b/player/osd.c @@ -75,13 +75,15 @@ static bool term_osd_empty(char *text) static void term_osd_update(struct MPContext *mpctx) { int num_parts = 0; - char *parts[3] = {0}; + char *parts[4] = {0}; if (!mpctx->opts->use_terminal) return; - if (!term_osd_empty(mpctx->term_osd_subs)) - parts[num_parts++] = mpctx->term_osd_subs; + if (!term_osd_empty(mpctx->term_osd_subs[0])) + parts[num_parts++] = mpctx->term_osd_subs[0]; + if (!term_osd_empty(mpctx->term_osd_subs[1])) + parts[num_parts++] = mpctx->term_osd_subs[1]; if (!term_osd_empty(mpctx->term_osd_text)) parts[num_parts++] = mpctx->term_osd_text; if (!term_osd_empty(mpctx->term_osd_status)) @@ -115,13 +117,19 @@ static void term_osd_update_title(struct MPContext *mpctx) mpctx->term_osd_title = talloc_steal(mpctx, s); } -void term_osd_set_subs(struct MPContext *mpctx, const char *text) +void term_osd_clear_subs(struct MPContext *mpctx) { - if (mpctx->video_out || !text || !mpctx->opts->subs_shared->sub_visibility[0]) + term_osd_set_subs(mpctx, NULL, 0); + term_osd_set_subs(mpctx, NULL, 1); +} + +void term_osd_set_subs(struct MPContext *mpctx, const char *text, int order) +{ + if (mpctx->video_out || !text || !mpctx->opts->subs_shared->sub_visibility[order]) text = ""; // disable - if (strcmp(mpctx->term_osd_subs ? mpctx->term_osd_subs : "", text) == 0) + if (strcmp(mpctx->term_osd_subs[order] ? mpctx->term_osd_subs[order] : "", text) == 0) return; - talloc_replace(mpctx, mpctx->term_osd_subs, text); + talloc_replace(mpctx, mpctx->term_osd_subs[order], text); term_osd_update(mpctx); } diff --git a/player/sub.c b/player/sub.c index 255c1e565e..dd12f7a658 100644 --- a/player/sub.c +++ b/player/sub.c @@ -50,7 +50,6 @@ static void reset_subtitles(struct MPContext *mpctx, struct track *track) sub_reset(track->d_sub); sub_set_play_dir(track->d_sub, mpctx->play_dir); } - term_osd_set_subs(mpctx, NULL); } // Only matters for subs on an image. @@ -69,15 +68,16 @@ void reset_subtitle_state(struct MPContext *mpctx) { for (int n = 0; n < mpctx->num_tracks; n++) reset_subtitles(mpctx, mpctx->tracks[n]); - term_osd_set_subs(mpctx, NULL); + term_osd_clear_subs(mpctx); } void uninit_sub(struct MPContext *mpctx, struct track *track) { if (track && track->d_sub) { - reset_subtitles(mpctx, track); - sub_select(track->d_sub, false); int order = get_order(mpctx, track); + reset_subtitles(mpctx, track); + term_osd_set_subs(mpctx, NULL, order); + sub_select(track->d_sub, false); osd_set_sub(mpctx->osd, order, NULL); sub_destroy(track->d_sub); track->d_sub = NULL; @@ -133,10 +133,16 @@ static bool update_subtitle(struct MPContext *mpctx, double video_pts, if (track->redraw_subs && still_image) sub_redecode_cached_packets(dec_sub); - // Handle displaying subtitles on terminal; never done for secondary subs + // Handle displaying subtitles on terminal. if (mpctx->current_track[0][STREAM_SUB] == track && !mpctx->video_out) { char *text = sub_get_text(dec_sub, video_pts, SD_TEXT_TYPE_PLAIN); - term_osd_set_subs(mpctx, text); + term_osd_set_subs(mpctx, text, 0); + talloc_free(text); + } + + if (mpctx->current_track[1][STREAM_SUB] == track && !mpctx->video_out) { + char *text = sub_get_text(dec_sub, video_pts, SD_TEXT_TYPE_PLAIN); + term_osd_set_subs(mpctx, text, 1); talloc_free(text); } diff --git a/player/video.c b/player/video.c index 78e956f42d..c39196551f 100644 --- a/player/video.c +++ b/player/video.c @@ -284,7 +284,7 @@ void reinit_video_chain_src(struct MPContext *mpctx, struct track *track) vo_set_paused(vo_c->vo, get_internal_paused(mpctx)); reset_video_state(mpctx); - term_osd_set_subs(mpctx, NULL); + term_osd_clear_subs(mpctx); return;