]> granicus.if.org Git - libass/commitdiff
ass: add ass_set_check_readorder() API function
authorwm4 <wm4@nowhere>
Thu, 31 Dec 2015 16:26:46 +0000 (17:26 +0100)
committerwm4 <wm4@nowhere>
Thu, 31 Dec 2015 16:58:28 +0000 (17:58 +0100)
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.)

Changelog
libass/ass.c
libass/ass.h
libass/libass.sym

index e7a25f44033ba2e0a969fb8bce5681ff8cc5c797..ebb68258cf95c31424c33acae9efd0e0f70238f4 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -1,4 +1,6 @@
 libass (0.13.2 - unreleased)
+ * Add ass_set_check_readorder() API function to disable use of the ReadOrder
+   field for duplicate checking in ass_process_chunk().
  * Bug fixes
    * Fix an issue with the new duplicate checking, which could lead to
      missing subtitles after seeking.
index 6cfa36188cae574508014e3abefa66fae108c3ca..14264dcd50ebb6344ec44ef1ca0e6dcc7cc80f57 100644 (file)
@@ -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;
 }
 
index c2802f7683dacf414dfb97eaf67713e1cc84cc26..bafbe8a7de1e72b83a4d480635d09aa7ffc99399 100644 (file)
@@ -24,7 +24,7 @@
 #include <stdarg.h>
 #include "ass_types.h"
 
-#define LIBASS_VERSION 0x01301000
+#define LIBASS_VERSION 0x01302000
 
 #ifdef __cplusplus
 extern "C" {
@@ -576,6 +576,16 @@ void ass_process_codec_private(ASS_Track *track, char *data, int size);
 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
index 5cdca1fcf55766fb93876d06062ba576e5d4a33f..42ca0cd5d41157ad2d1553ff11fc48978193ad3f 100644 (file)
@@ -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