diff options
author | wm4 <wm4@nowhere> | 2015-12-31 17:26:46 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2015-12-31 17:58:28 +0100 |
commit | 11f121859c3d3f81f3de3153a18752a70c689580 (patch) | |
tree | dc9e016595ad0eb962abbd6639e42eea74520aac /libass/ass.c | |
parent | 59f858b22477a02f835b6464928f28e4aaf38baa (diff) | |
download | libass-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.c | 12 |
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; } |