summaryrefslogtreecommitdiffstats
path: root/libass/ass.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-12-31 17:26:46 +0100
committerwm4 <wm4@nowhere>2015-12-31 17:58:28 +0100
commit11f121859c3d3f81f3de3153a18752a70c689580 (patch)
treedc9e016595ad0eb962abbd6639e42eea74520aac /libass/ass.c
parent59f858b22477a02f835b6464928f28e4aaf38baa (diff)
downloadlibass-11f121859c3d3f81f3de3153a18752a70c689580.tar.bz2
libass-11f121859c3d3f81f3de3153a18752a70c689580.tar.xz
ass: add ass_set_check_readorder() API function
Not all API users will keep the event list on seeking. This also gives the opportunity to API users to handle severely broken files with duplicate ReadOrder entries. (It is not known whether this is really needed, however VSFilter does not deduplicate using the ReadOrder field.)
Diffstat (limited to 'libass/ass.c')
-rw-r--r--libass/ass.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/libass/ass.c b/libass/ass.c
index 6cfa361..14264dc 100644
--- a/libass/ass.c
+++ b/libass/ass.c
@@ -57,6 +57,7 @@ struct parser_priv {
// contains bitmap of ReadOrder IDs of all read events
uint32_t *read_order_bitmap;
int read_order_elems; // size in uint32_t units of read_order_bitmap
+ int check_readorder;
};
#define ASS_STYLES_ALLOC 20
@@ -899,6 +900,11 @@ static int check_duplicate_event(ASS_Track *track, int ReadOrder)
return 0;
}
+void ass_set_check_readorder(ASS_Track *track, int check_readorder)
+{
+ track->parser_priv->check_readorder = check_readorder == 1;
+}
+
/**
* \brief Process a chunk of subtitle stream data. In Matroska, this contains exactly 1 event (or a commentary).
* \param track track
@@ -915,8 +921,9 @@ void ass_process_chunk(ASS_Track *track, char *data, int size,
char *p;
char *token;
ASS_Event *event;
+ int check_readorder = track->parser_priv->check_readorder;
- if (!track->parser_priv->read_order_bitmap) {
+ if (check_readorder && !track->parser_priv->read_order_bitmap) {
for (int i = 0; i < track->n_events; i++) {
if (test_and_set_read_order_bit(track, track->events[i].ReadOrder) < 0)
break;
@@ -944,7 +951,7 @@ void ass_process_chunk(ASS_Track *track, char *data, int size,
do {
NEXT(p, token);
event->ReadOrder = atoi(token);
- if (check_duplicate_event(track, event->ReadOrder))
+ if (check_readorder && check_duplicate_event(track, event->ReadOrder))
break;
NEXT(p, token);
@@ -1332,6 +1339,7 @@ ASS_Track *ass_new_track(ASS_Library *library)
free(track);
return NULL;
}
+ track->parser_priv->check_readorder = 1;
return track;
}