[vlc-devel] mpl2 subtitles

Roman Bednarek roman at mikronika.com.pl
Wed Feb 14 09:45:26 CET 2007


   Hi all,

    Subtitles in MPL2 format are very popular in poland, unfortunately  vlc 
do not support them. I have added mpl2 support to vlc parsing module. I 
have tested it on few movies and it works fine. I attached the patch to 
the current svn version (if you prefer I can do a patch against 0.8.6a).


  With Regards,
  Roman Bednarek
-------------- next part --------------
Index: modules/demux/subtitle.c
===================================================================
--- modules/demux/subtitle.c	(revision 18807)
+++ modules/demux/subtitle.c	(working copy)
@@ -54,12 +54,12 @@
 #define SUB_TYPE_LONGTEXT \
     N_("Force the subtiles format. Valid values are : \"microdvd\", " \
     "\"subrip\",  \"ssa1\", \"ssa2-4\", \"ass\", \"vplayer\" " \
-    "\"sami\", \"dvdsubtitle\" and \"auto\" (meaning autodetection, this " \
+    "\"sami\", \"dvdsubtitle\", \"mpl2\" and \"auto\" (meaning autodetection, this " \
     "should always work).")
 static const char *ppsz_sub_type[] =
 {
     "auto", "microdvd", "subrip", "subviewer", "ssa1",
-    "ssa2-4", "ass", "vplayer", "sami", "dvdsubtitle"
+    "ssa2-4", "ass", "vplayer", "sami", "dvdsubtitle", "mpl2"
 };
 
 vlc_module_begin();
@@ -96,7 +96,8 @@
     SUB_TYPE_VPLAYER,
     SUB_TYPE_SAMI,
     SUB_TYPE_SUBVIEWER,
-    SUB_TYPE_DVDSUBTITLE
+    SUB_TYPE_DVDSUBTITLE,
+    SUB_TYPE_MPL2
 };
 
 typedef struct
@@ -141,6 +142,7 @@
 static int  ParseVplayer    ( demux_t *, subtitle_t * );
 static int  ParseSami       ( demux_t *, subtitle_t * );
 static int  ParseDVDSubtitle( demux_t *, subtitle_t * );
+static int  ParseMPL2       ( demux_t *, subtitle_t * );
 
 static struct
 {
@@ -159,6 +161,7 @@
     { "vplayer",    SUB_TYPE_VPLAYER,     "VPlayer",     ParseVplayer },
     { "sami",       SUB_TYPE_SAMI,        "SAMI",        ParseSami },
     { "dvdsubtitle",SUB_TYPE_DVDSUBTITLE, "DVDSubtitle", ParseDVDSubtitle },
+    { "mpl2",       SUB_TYPE_MPL2,        "MPL2",        ParseMPL2 },
     { NULL,         SUB_TYPE_UNKNOWN,     "Unknown",     NULL }
 };
 
@@ -313,6 +316,12 @@
                 p_sys->i_type = SUB_TYPE_DVDSUBTITLE;
                 break;
             }
+            else if( sscanf( s, "[%d][%d]", &i_dummy, &i_dummy ) == 2 ||
+                     sscanf( s, "[%d][]", &i_dummy ) == 1)
+            {
+                p_sys->i_type = SUB_TYPE_MPL2;
+                break;
+            }
 
             free( s );
             s = NULL;
@@ -1287,3 +1296,54 @@
     }
 }
 
+static int ParseMPL2( demux_t *p_demux, subtitle_t *p_subtitle )
+{
+    demux_sys_t *p_sys = p_demux->p_sys;
+    text_t      *txt = &p_sys->txt;
+    /*
+     * each line:
+     *  {n1}{n2}Line1|Line2|Line3....
+     * where n1 and n2 are the video frame number...
+     * {n2} can also be {}
+     */
+    char *s;
+
+    char buffer_text[MAX_LINE + 1];
+    int    i_start;
+    int    i_stop;
+    unsigned int i;
+
+    p_subtitle->i_start = 0;
+    p_subtitle->i_stop  = 0;
+    p_subtitle->psz_text = NULL;
+
+    for( ;; )
+    {
+        if( ( s = TextGetLine( txt ) ) == NULL )
+        {
+            return( VLC_EGENERIC );
+        }
+        i_start = 0;
+        i_stop  = 0;
+
+        memset( buffer_text, '\0', MAX_LINE );
+        if( sscanf( s, "[%d][]%[^\r\n]", &i_start, buffer_text ) == 2 ||
+            sscanf( s, "[%d][%d]%[^\r\n]", &i_start, &i_stop, buffer_text ) == 3)
+        {
+            break;
+        }
+    }
+
+    /* replace | by \n */
+    for( i = 0; i < strlen( buffer_text ); i++ )
+    {
+        if( buffer_text[i] == '|' )
+        {
+            buffer_text[i] = '\n';
+        }
+    }
+    p_subtitle->i_start = (int64_t)i_start * 100000;
+    p_subtitle->i_stop  = (int64_t)i_stop  * 100000;
+    p_subtitle->psz_text = strndup( buffer_text, MAX_LINE );
+    return( 0 );
+}


More information about the vlc-devel mailing list