summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/interface-changes.rst2
-rw-r--r--DOCS/man/options.rst5
-rw-r--r--options/options.c3
-rw-r--r--options/options.h2
-rw-r--r--player/command.c17
-rw-r--r--player/misc.c7
-rw-r--r--sub/dec_sub.c9
7 files changed, 33 insertions, 12 deletions
diff --git a/DOCS/interface-changes.rst b/DOCS/interface-changes.rst
index 53975f2a3a..94bc6772f2 100644
--- a/DOCS/interface-changes.rst
+++ b/DOCS/interface-changes.rst
@@ -28,6 +28,8 @@ Interface changes
--- mpv 0.38.0 ---
- remove shared-script-properties (user-data is a replacement)
+ - add `--secondary-sub-delay`, decouple secondary subtitles from
+ `--sub-delay`
--- mpv 0.37.0 ---
- `--save-position-on-quit` and its associated commands now store state files
in %LOCALAPPDATA% instead of %APPDATA% directory by default on Windows.
diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst
index 6025705a99..f80fc77904 100644
--- a/DOCS/man/options.rst
+++ b/DOCS/man/options.rst
@@ -2312,7 +2312,10 @@ Subtitles
printed by ``--sub-demuxer=help``.
``--sub-delay=<sec>``
- Delays subtitles by ``<sec>`` seconds. Can be negative.
+ Delays primary subtitles by ``<sec>`` seconds. Can be negative.
+
+``--secondary-sub-delay=<sec>``
+ Delays secondary subtitles by ``<sec>`` seconds. Can be negative.
``--sub-files=<file-list>``, ``--sub-file=<filename>``
Add a subtitle file to the list of external subtitles.
diff --git a/options/options.c b/options/options.c
index 7c6ffa5ccd..526ef7d634 100644
--- a/options/options.c
+++ b/options/options.c
@@ -281,7 +281,8 @@ const struct m_sub_options mp_sub_filter_opts = {
const struct m_sub_options mp_subtitle_sub_opts = {
.opts = (const struct m_option[]){
- {"sub-delay", OPT_FLOAT(sub_delay)},
+ {"sub-delay", OPT_FLOAT(sub_delay[0])},
+ {"secondary-sub-delay", OPT_FLOAT(sub_delay[1])},
{"sub-fps", OPT_FLOAT(sub_fps)},
{"sub-speed", OPT_FLOAT(sub_speed)},
{"sub-visibility", OPT_BOOL(sub_visibility)},
diff --git a/options/options.h b/options/options.h
index aa071b28f6..9f55d5b8b1 100644
--- a/options/options.h
+++ b/options/options.h
@@ -85,7 +85,7 @@ struct mp_subtitle_opts {
bool sub_visibility;
bool sec_sub_visibility;
float sub_pos;
- float sub_delay;
+ float sub_delay[2];
float sub_fps;
float sub_speed;
bool sub_forced_events_only;
diff --git a/player/command.c b/player/command.c
index 84cda39adb..4ec0b5277d 100644
--- a/player/command.c
+++ b/player/command.c
@@ -2874,9 +2874,10 @@ static int mp_property_sub_delay(void *ctx, struct m_property *prop,
{
MPContext *mpctx = ctx;
struct MPOpts *opts = mpctx->opts;
+ int track_ind = *(int *)prop->priv;
switch (action) {
case M_PROPERTY_PRINT:
- *(char **)arg = format_delay(opts->subs_rend->sub_delay);
+ *(char **)arg = format_delay(opts->subs_rend->sub_delay[track_ind]);
return M_PROPERTY_OK;
}
return mp_property_generic_option(mpctx, prop, action, arg);
@@ -3929,7 +3930,9 @@ static const struct m_property mp_properties_base[] = {
{"sid", property_switch_track, .priv = (void *)(const int[]){0, STREAM_SUB}},
{"secondary-sid", property_switch_track,
.priv = (void *)(const int[]){1, STREAM_SUB}},
- {"sub-delay", mp_property_sub_delay},
+ {"sub-delay", mp_property_sub_delay, .priv = (void *)&(const int){0}},
+ {"secondary-sub-delay", mp_property_sub_delay,
+ .priv = (void *)&(const int){1}},
{"sub-speed", mp_property_sub_speed},
{"sub-pos", mp_property_sub_pos},
{"sub-ass-extradata", mp_property_sub_ass_extradata},
@@ -4246,6 +4249,7 @@ static const struct property_osd_display {
{"secondary-sid", "Secondary subtitles"},
{"sub-pos", "Sub position"},
{"sub-delay", "Sub delay"},
+ {"secondary-sub-delay", "Secondary sub delay"},
{"sub-speed", "Sub speed"},
{"sub-visibility",
.msg = "Subtitles ${!sub-visibility==yes:hidden}"
@@ -5380,10 +5384,13 @@ static void cmd_sub_step_seek(void *p)
a[1] = cmd->args[0].v.i;
if (sub_control(sub, SD_CTRL_SUB_STEP, a) > 0) {
if (step) {
- mpctx->opts->subs_rend->sub_delay -= a[0] - refpts;
+ mpctx->opts->subs_rend->sub_delay[track_ind] -= a[0] - refpts;
m_config_notify_change_opt_ptr_notify(mpctx->mconfig,
- &mpctx->opts->subs_rend->sub_delay);
- show_property_osd(mpctx, "sub-delay", cmd->on_osd);
+ &mpctx->opts->subs_rend->sub_delay[track_ind]);
+ show_property_osd(
+ mpctx,
+ track_ind == 0 ? "sub-delay" : "secondary-sub-delay",
+ cmd->on_osd);
} else {
// We can easily seek/step to the wrong subtitle line (because
// video frame PTS and sub PTS rarely match exactly). Add an
diff --git a/player/misc.c b/player/misc.c
index b91d52a607..d267c51906 100644
--- a/player/misc.c
+++ b/player/misc.c
@@ -147,7 +147,12 @@ double get_track_seek_offset(struct MPContext *mpctx, struct track *track)
if (track->type == STREAM_AUDIO)
return -opts->audio_delay;
if (track->type == STREAM_SUB)
- return -opts->subs_rend->sub_delay;
+ {
+ for (int n = 0; n < num_ptracks[STREAM_SUB]; n++) {
+ if (mpctx->current_track[n][STREAM_SUB] == track)
+ return -opts->subs_rend->sub_delay[n];
+ }
+ }
}
return 0;
}
diff --git a/sub/dec_sub.c b/sub/dec_sub.c
index 18d826e8b5..195a14abea 100644
--- a/sub/dec_sub.c
+++ b/sub/dec_sub.c
@@ -92,9 +92,10 @@ static void update_subtitle_speed(struct dec_sub *sub)
static double pts_to_subtitle(struct dec_sub *sub, double pts)
{
struct mp_subtitle_opts *opts = sub->opts;
+ float delay = sub->order < 0 ? 0.0f : opts->sub_delay[sub->order];
if (pts != MP_NOPTS_VALUE)
- pts = (pts * sub->play_dir - opts->sub_delay) / sub->sub_speed;
+ pts = (pts * sub->play_dir - delay) / sub->sub_speed;
return pts;
}
@@ -102,9 +103,10 @@ static double pts_to_subtitle(struct dec_sub *sub, double pts)
static double pts_from_subtitle(struct dec_sub *sub, double pts)
{
struct mp_subtitle_opts *opts = sub->opts;
+ float delay = sub->order < 0 ? 0.0f : opts->sub_delay[sub->order];
if (pts != MP_NOPTS_VALUE)
- pts = (pts * sub->sub_speed + opts->sub_delay) * sub->play_dir;
+ pts = (pts * sub->sub_speed + delay) * sub->play_dir;
return pts;
}
@@ -291,7 +293,8 @@ bool sub_read_packets(struct dec_sub *sub, double video_pts, bool force)
break;
// (Use this mechanism only if sub_delay matters to avoid corner cases.)
- double min_pts = sub->opts->sub_delay < 0 || force ? video_pts : MP_NOPTS_VALUE;
+ float delay = sub->order < 0 ? 0.0f : sub->opts->sub_delay[sub->order];
+ double min_pts = delay < 0 || force ? video_pts : MP_NOPTS_VALUE;
struct demux_packet *pkt;
int st = demux_read_packet_async_until(sub->sh, min_pts, &pkt);