diff --git a/sub/dec_sub.c b/sub/dec_sub.c index 9261e2570d..a9267112f4 100644 --- a/sub/dec_sub.c +++ b/sub/dec_sub.c @@ -356,8 +356,8 @@ static void multiply_timings(struct packet_list *subs, double factor) // overlapping lines. (It's not worth the trouble.) static void fix_overlaps_and_gaps(struct packet_list *subs) { - double threshold = 0.2; // up to 200 ms overlaps or gaps are removed - double keep = threshold * 2;// don't change timings if durations are smaller + double threshold = SUB_GAP_THRESHOLD; + double keep = SUB_GAP_KEEP; for (int i = 0; i < subs->num_packets - 1; i++) { struct demux_packet *cur = subs->packets[i]; struct demux_packet *next = subs->packets[i + 1]; diff --git a/sub/sd.h b/sub/sd.h index 4be48fedb8..9e6b1eb0ec 100644 --- a/sub/sd.h +++ b/sub/sd.h @@ -4,6 +4,11 @@ #include "dec_sub.h" #include "demux/packet.h" +// up to 200 ms overlaps or gaps are removed +#define SUB_GAP_THRESHOLD 0.2 +// don't change timings if durations are smaller +#define SUB_GAP_KEEP 0.4 + struct sd { struct mp_log *log; struct MPOpts *opts; diff --git a/sub/sd_lavc.c b/sub/sd_lavc.c index d6f6bf8e48..563ac554fc 100644 --- a/sub/sd_lavc.c +++ b/sub/sd_lavc.c @@ -202,6 +202,9 @@ static void decode(struct sd *sd, struct demux_packet *packet) if (prev->endpts == MP_NOPTS_VALUE || prev->endpts > pts) prev->endpts = pts; + if (opts->sub_fix_timing && pts - prev->endpts <= SUB_GAP_THRESHOLD) + prev->endpts = pts; + for (int n = 0; n < priv->num_seekpoints; n++) { if (priv->seekpoints[n].pts == prev->pts) { priv->seekpoints[n].endpts = prev->endpts;