--- a/libass/ass.c
+++ b/libass/ass.c
@@ -627,6 +627,26 @@
             "No event format found, using fallback");
 }
 
+// we may get duplicate events from a rewinded stream ...
+static int check_duplicate_event_adv(ASS_Track *track)
+{
+	int i, last = track->n_events - 1;
+	for (i = 0; i < last; ++i)
+		if (track->events[i].Start == track->events[last].Start
+			&& track->events[i].Duration == track->events[last].Duration
+			&& track->events[i].Layer == track->events[last].Layer
+			&& track->events[i].Style == track->events[last].Style
+			&& track->events[i].MarginL == track->events[last].MarginL
+			&& track->events[i].MarginR == track->events[last].MarginR
+			&& track->events[i].MarginV == track->events[last].MarginV
+			&& !strcmp(track->events[i].Name, track->events[last].Name)
+			&& !strcmp(track->events[i].Effect, track->events[last].Effect)
+			&& !strcmp(track->events[i].Text, track->events[last].Text)
+		)
+			return 1;
+	return 0;
+}
+
 static int process_events_line(ASS_Track *track, char *str)
 {
     if (!strncmp(str, "Format:", 7)) {
@@ -653,6 +673,11 @@
             event_format_fallback(track);
 
         process_event_tail(track, event, str, 0);
+
+	if (check_duplicate_event_adv(track)) {
+		ass_free_event(track, eid);
+		track->n_events--;
+	}
     } else {
         ass_msg(track->library, MSGL_V, "Not understood: '%.30s'", str);
     }
@@ -939,6 +964,9 @@
 
         event->Start = timecode;
         event->Duration = duration;
+
+	if (check_duplicate_event_adv(track))
+		break;
 
         free(str);
         return;