From 4a0684db333247b83eee90cabc00abe08c816fbd 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