From f5fd1c8cc9664a9b33b392ec18cdf09d34bf4cfc Mon Sep 17 00:00:00 2001 From: VincentVerdynanta Date: Mon, 7 Apr 2025 16:35:11 +0000 Subject: [PATCH] sd_ass: handle past subs with unknown duration on every decode Unknown duration subtitle handling must be executed on every decode call, because we are actually adjusting the duration value of subtitles that are decoded in the past. It should not only execute when the newest packet has an unknown duration. --- sub/sd_ass.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/sub/sd_ass.c b/sub/sd_ass.c index 7c80ddac6f..aaec0d746c 100644 --- a/sub/sd_ass.c +++ b/sub/sd_ass.c @@ -476,17 +476,19 @@ static void decode(struct sd *sd, struct demux_packet *packet) }; filter_and_add(sd, &pkt2); } - if (sub_duration == UNKNOWN_DURATION) { - for (int n = track->n_events - 2; n >= 0; n--) { - if (track->events[n].Duration == UNKNOWN_DURATION * 1000) { - if (track->events[n].Start != track->events[n + 1].Start) { - track->events[n].Duration = track->events[n + 1].Start - - track->events[n].Start; - } else { - track->events[n].Duration = track->events[n + 1].Duration; - } + for (int n = track->n_events - 1; n >= 0; n--) { + if (track->events[track->n_events - 1].Start == track->events[n].Start) + continue; + if (track->events[n].Duration == UNKNOWN_DURATION * 1000) { + if (track->events[n].Start < track->events[n + 1].Start) { + track->events[n].Duration = track->events[n + 1].Start - + track->events[n].Start; + } else if (track->events[n].Start == track->events[n + 1].Start) { + track->events[n].Duration = track->events[n + 1].Duration; } } + if (n > 0 && track->events[n].Start != track->events[n - 1].Start) + break; } } else { // Note that for this packet format, libass has an internal mechanism