From bd57eaaeb3001b9e2af467053bd55f5f15b2a7ea Mon Sep 17 00:00:00 2001
From: Jean-Baptiste Kempf <jb@videolan.org>
Date: Thu, 1 May 2008 23:29:23 -0700
Subject: [PATCH] Support for AQT subtitles. Parsing is fine but timing is
 wrong since it must be multiplied by FPS.

---
 modules/demux/subtitle.c | 60 +++++++++++++++++++++++++++++++++++++++-
 1 file changed, 59 insertions(+), 1 deletion(-)

diff --git a/modules/demux/subtitle.c b/modules/demux/subtitle.c
index ef9a359d330c..38fecc27bc33 100644
--- a/modules/demux/subtitle.c
+++ b/modules/demux/subtitle.c
@@ -99,7 +99,8 @@ enum
     SUB_TYPE_SAMI,
     SUB_TYPE_SUBVIEWER,
     SUB_TYPE_DVDSUBTITLE,
-    SUB_TYPE_MPL2
+    SUB_TYPE_MPL2,
+    SUB_TYPE_AQT
 };
 
 typedef struct
@@ -145,6 +146,7 @@ static int  ParseVplayer    ( demux_t *, subtitle_t *, int );
 static int  ParseSami       ( demux_t *, subtitle_t *, int );
 static int  ParseDVDSubtitle( demux_t *, subtitle_t *, int );
 static int  ParseMPL2       ( demux_t *, subtitle_t *, int );
+static int  ParseAQT        ( demux_t *, subtitle_t *, int );
 
 static struct
 {
@@ -164,6 +166,7 @@ static struct
     { "sami",       SUB_TYPE_SAMI,        "SAMI",        ParseSami },
     { "dvdsubtitle",SUB_TYPE_DVDSUBTITLE, "DVDSubtitle", ParseDVDSubtitle },
     { "mpl2",       SUB_TYPE_MPL2,        "MPL2",        ParseMPL2 },
+    { "aqt",        SUB_TYPE_AQT,         "AQTitle",     ParseAQT },
     { NULL,         SUB_TYPE_UNKNOWN,     "Unknown",     NULL }
 };
 
@@ -317,6 +320,9 @@ static int Open ( vlc_object_t *p_this )
             {
                 p_sys->i_type = SUB_TYPE_MPL2;
                 break;
+            }else if( sscanf (s, "-->> %d", &i_dummy) == 1 )
+            {
+                p_sys->i_type = SUB_TYPE_AQT;
             }
 
             free( s );
@@ -1226,3 +1232,55 @@ static int ParseMPL2( demux_t *p_demux, subtitle_t *p_subtitle, int i_idx )
     return VLC_SUCCESS;
 }
 
+static int ParseAQT( demux_t *p_demux, subtitle_t *p_subtitle, int i_idx )
+{
+    demux_sys_t *p_sys = p_demux->p_sys;
+    text_t      *txt = &p_sys->txt;
+    char *psz_text = strdup( "" );
+    int i_old = 0;
+    int i_firstline = 1;
+
+    for( ;; )
+    {
+        int t; /* Time */
+
+        const char *s = TextGetLine( txt );
+
+        if( !s )
+            return VLC_EGENERIC;
+
+        /* Data Lines */
+        if( sscanf (s, "-->> %d", &t) == 1)
+        {
+            p_subtitle->i_start = (int64_t)t; /* * FPS*/
+            p_subtitle->i_stop  = 0;
+
+            /* Starting of a subtitle */
+            if( i_firstline )
+            {
+                i_firstline = 0;
+            }
+            /* We have been too far: end of the subtitle, begin of next */
+            else
+            {
+                txt->i_line--;
+                break;
+            }
+        }
+        /* Text Lines */
+        else
+        {
+            i_old = strlen( psz_text ) + 1;
+            psz_text = realloc( psz_text, i_old + strlen( s ) + 1 );
+            if( !psz_text )
+                 return VLC_ENOMEM;
+            strcat( psz_text, s );
+            strcat( psz_text, "\n" );
+            if( txt->i_line == txt->i_line_count )
+                break;
+        }
+    }
+    p_subtitle->psz_text = psz_text;
+    return VLC_SUCCESS;
+}
+
-- 
GitLab