summaryrefslogtreecommitdiffstats
path: root/libass
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
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')
-rw-r--r--libass/ass.c12
-rw-r--r--libass/ass.h12
-rw-r--r--libass/libass.sym1
3 files changed, 22 insertions, 3 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;
}
diff --git a/libass/ass.h b/libass/ass.h
index c2802f7..bafbe8a 100644
--- a/libass/ass.h
+++ b/libass/ass.h
@@ -24,7 +24,7 @@
#include <stdarg.h>
#include "ass_types.h"
-#define LIBASS_VERSION 0x01301000
+#define LIBASS_VERSION 0x01302000
#ifdef __cplusplus
extern "C" {
@@ -577,6 +577,16 @@ void ass_process_chunk(ASS_Track *track, char *data, int size,
long long timecode, long long duration);
/**
+ * \brief Set whether the ReadOrder field when processing a packet with
+ * ass_process_chunk() should be used for eliminating duplicates.
+ * \param check_readorder 0 means do not try to eliminate duplicates; 1 means
+ * use the ReadOrder field embedded in the packet as unique identifier, and
+ * discard the packet if there was already a packet with the same ReadOrder.
+ * Other values are undefined.
+ */
+void ass_set_check_readorder(ASS_Track *track, int check_readorder);
+
+/**
* \brief Flush buffered events.
* \param track track
*/
diff --git a/libass/libass.sym b/libass/libass.sym
index 5cdca1f..42ca0cd 100644
--- a/libass/libass.sym
+++ b/libass/libass.sym
@@ -42,3 +42,4 @@ ass_set_line_position
ass_set_pixel_aspect
ass_set_selective_style_override_enabled
ass_set_selective_style_override
+ass_set_check_readorder