mirror of
https://github.com/mpv-player/mpv.git
synced 2025-12-28 05:33:14 +00:00
@@ -259,7 +259,7 @@ typedef struct MPContext {
|
|||||||
struct osd_state *osd;
|
struct osd_state *osd;
|
||||||
char *term_osd_text;
|
char *term_osd_text;
|
||||||
char *term_osd_status;
|
char *term_osd_status;
|
||||||
char *term_osd_subs;
|
char *term_osd_subs[2];
|
||||||
char *term_osd_contents;
|
char *term_osd_contents;
|
||||||
char *term_osd_title;
|
char *term_osd_title;
|
||||||
char *last_window_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,
|
bool set_osd_msg(struct MPContext *mpctx, int level, int time,
|
||||||
const char* fmt, ...) PRINTF_ATTRIBUTE(4,5);
|
const char* fmt, ...) PRINTF_ATTRIBUTE(4,5);
|
||||||
void set_osd_function(struct MPContext *mpctx, int osd_function);
|
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 get_current_osd_sym(struct MPContext *mpctx, char *buf, size_t buf_size);
|
||||||
void set_osd_bar_chapters(struct MPContext *mpctx, int type);
|
void set_osd_bar_chapters(struct MPContext *mpctx, int type);
|
||||||
|
|
||||||
|
|||||||
22
player/osd.c
22
player/osd.c
@@ -75,13 +75,15 @@ static bool term_osd_empty(char *text)
|
|||||||
static void term_osd_update(struct MPContext *mpctx)
|
static void term_osd_update(struct MPContext *mpctx)
|
||||||
{
|
{
|
||||||
int num_parts = 0;
|
int num_parts = 0;
|
||||||
char *parts[3] = {0};
|
char *parts[4] = {0};
|
||||||
|
|
||||||
if (!mpctx->opts->use_terminal)
|
if (!mpctx->opts->use_terminal)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!term_osd_empty(mpctx->term_osd_subs))
|
if (!term_osd_empty(mpctx->term_osd_subs[0]))
|
||||||
parts[num_parts++] = mpctx->term_osd_subs;
|
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))
|
if (!term_osd_empty(mpctx->term_osd_text))
|
||||||
parts[num_parts++] = mpctx->term_osd_text;
|
parts[num_parts++] = mpctx->term_osd_text;
|
||||||
if (!term_osd_empty(mpctx->term_osd_status))
|
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);
|
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
|
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;
|
return;
|
||||||
talloc_replace(mpctx, mpctx->term_osd_subs, text);
|
talloc_replace(mpctx, mpctx->term_osd_subs[order], text);
|
||||||
term_osd_update(mpctx);
|
term_osd_update(mpctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
18
player/sub.c
18
player/sub.c
@@ -50,7 +50,6 @@ static void reset_subtitles(struct MPContext *mpctx, struct track *track)
|
|||||||
sub_reset(track->d_sub);
|
sub_reset(track->d_sub);
|
||||||
sub_set_play_dir(track->d_sub, mpctx->play_dir);
|
sub_set_play_dir(track->d_sub, mpctx->play_dir);
|
||||||
}
|
}
|
||||||
term_osd_set_subs(mpctx, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only matters for subs on an image.
|
// 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++)
|
for (int n = 0; n < mpctx->num_tracks; n++)
|
||||||
reset_subtitles(mpctx, mpctx->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)
|
void uninit_sub(struct MPContext *mpctx, struct track *track)
|
||||||
{
|
{
|
||||||
if (track && track->d_sub) {
|
if (track && track->d_sub) {
|
||||||
reset_subtitles(mpctx, track);
|
|
||||||
sub_select(track->d_sub, false);
|
|
||||||
int order = get_order(mpctx, track);
|
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);
|
osd_set_sub(mpctx->osd, order, NULL);
|
||||||
sub_destroy(track->d_sub);
|
sub_destroy(track->d_sub);
|
||||||
track->d_sub = NULL;
|
track->d_sub = NULL;
|
||||||
@@ -133,10 +133,16 @@ static bool update_subtitle(struct MPContext *mpctx, double video_pts,
|
|||||||
if (track->redraw_subs && still_image)
|
if (track->redraw_subs && still_image)
|
||||||
sub_redecode_cached_packets(dec_sub);
|
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) {
|
if (mpctx->current_track[0][STREAM_SUB] == track && !mpctx->video_out) {
|
||||||
char *text = sub_get_text(dec_sub, video_pts, SD_TEXT_TYPE_PLAIN);
|
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);
|
talloc_free(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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));
|
vo_set_paused(vo_c->vo, get_internal_paused(mpctx));
|
||||||
|
|
||||||
reset_video_state(mpctx);
|
reset_video_state(mpctx);
|
||||||
term_osd_set_subs(mpctx, NULL);
|
term_osd_clear_subs(mpctx);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user