diff --git a/DOCS/OUTDATED-tech/slave.txt b/DOCS/OUTDATED-tech/slave.txt index 4359aa1a29..d57a8aca46 100644 --- a/DOCS/OUTDATED-tech/slave.txt +++ b/DOCS/OUTDATED-tech/slave.txt @@ -496,6 +496,9 @@ volume [abs] show_chapters_osd Show the list of chapters in the currently played file on the OSD. +show_tracks_osd + Show the list audio and subtitle tracks in the currently played file on the OSD. + Available properties: name type min max get set step comment diff --git a/command.c b/command.c index f7a0529eeb..cfb8d0ec17 100644 --- a/command.c +++ b/command.c @@ -2844,6 +2844,85 @@ static void show_chapters_on_osd(MPContext *mpctx) talloc_free(res); } +static void show_tracks_on_osd(MPContext *mpctx) +{ + struct MPOpts *opts = &mpctx->opts; + char *res = NULL; + const char *IND = ""; + int n; + int cnt = 0; + struct sh_audio *cur_a; + struct sh_sub *cur_s; + demux_stream_t *d_sub; + demuxer_t *demuxer = mpctx->demuxer; + + if (!demuxer) + return; + + cur_a = mpctx->sh_audio; + d_sub = mpctx->d_sub; + cur_s = d_sub && opts->sub_id >= 0 ? d_sub->sh : NULL; + + for (n = 0; n < MAX_V_STREAMS; n++) { + struct sh_video *v = demuxer->v_streams[n]; + if (v) { + cnt++; + } + } + if (cnt > 1) + res = talloc_asprintf_append(res, "(Warning: more than one video stream.)\n"); + +#define STD_TRACK_HDR(st, id) \ + res = talloc_asprintf_append(res, "%s(%d) ", IND, st->id); \ + if (st->title) { \ + res = talloc_asprintf_append(res, "'%s' ", st->title); \ + } \ + if (st->lang) { \ + res = talloc_asprintf_append(res, "(%s) ", st->lang); \ + } + + for (n = 0; n < MAX_A_STREAMS; n++) { + struct sh_audio *a = demuxer->a_streams[n]; + if (a) { + cnt++; + if (a == cur_a) + res = talloc_asprintf_append(res, "> "); + STD_TRACK_HDR(a, aid) + if (a == cur_a) + res = talloc_asprintf_append(res, "<"); + res = talloc_asprintf_append(res, "\n"); + } + } + + res = talloc_asprintf_append(res, "\n"); + + for (n = 0; n < MAX_S_STREAMS; n++) { + struct sh_sub *s = demuxer->s_streams[n]; + if (s) { + cnt++; + if (s == cur_s) + res = talloc_asprintf_append(res, "> "); + STD_TRACK_HDR(s, sid) + char *type = "?"; + switch (s->type) { + case 't': type = "SRT"; break; + case 'v': type = "VOB"; break; + case 'a': type = NULL; break; //"ASS/SSA"; + } + if (type) + res = talloc_asprintf_append(res, " [%s]", type); + if (s == cur_s) + res = talloc_asprintf_append(res, "<"); + res = talloc_asprintf_append(res, "\n"); + } + } + +#undef STD_TRACK_HDR + + set_osd_msg(OSD_MSG_TEXT, 1, opts->osd_duration, "%s", res); + talloc_free(res); +} + void run_command(MPContext *mpctx, mp_cmd_t *cmd) { struct MPOpts *opts = &mpctx->opts; @@ -3663,6 +3742,9 @@ void run_command(MPContext *mpctx, mp_cmd_t *cmd) case MP_CMD_SHOW_CHAPTERS: show_chapters_on_osd(mpctx); break; + case MP_CMD_SHOW_TRACKS: + show_tracks_on_osd(mpctx); + break; default: mp_msg(MSGT_CPLAYER, MSGL_V, diff --git a/input/input.c b/input/input.c index f99c3218dc..014216e093 100644 --- a/input/input.c +++ b/input/input.c @@ -223,6 +223,7 @@ static const mp_cmd_t mp_cmds[] = { { MP_CMD_AF_CMDLINE, "af_cmdline", { ARG_STRING, ARG_STRING } }, { MP_CMD_SHOW_CHAPTERS, "show_chapters_osd", }, + { MP_CMD_SHOW_TRACKS, "show_tracks_osd", }, {0} }; diff --git a/input/input.h b/input/input.h index 9bbf6bf7df..977901b6d3 100644 --- a/input/input.h +++ b/input/input.h @@ -155,6 +155,7 @@ enum mp_command_type { MP_CMD_AF_CMDLINE, MP_CMD_SHOW_CHAPTERS, + MP_CMD_SHOW_TRACKS, }; // The arg types