[vlc-devel] commit: Support for MPSub. (Jean-Baptiste Kempf )
git version control
git at videolan.org
Fri May 2 10:34:07 CEST 2008
vlc | branch: master | Jean-Baptiste Kempf <jb at videolan.org> | Fri May 2 01:35:13 2008 -0700| [36f89cb84d6b0e5952fc5f037b8fbebf07a9426f]
Support for MPSub.
Only TIME based, not Frame based, yet.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=36f89cb84d6b0e5952fc5f037b8fbebf07a9426f
---
modules/demux/subtitle.c | 62 +++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 61 insertions(+), 1 deletions(-)
diff --git a/modules/demux/subtitle.c b/modules/demux/subtitle.c
index d453f56..d5b89ba 100644
--- a/modules/demux/subtitle.c
+++ b/modules/demux/subtitle.c
@@ -102,7 +102,8 @@ enum
SUB_TYPE_DVDSUBTITLE,
SUB_TYPE_MPL2,
SUB_TYPE_AQT,
- SUB_TYPE_PJS
+ SUB_TYPE_PJS,
+ SUB_TYPE_MPSUB
};
typedef struct
@@ -150,6 +151,7 @@ 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 int ParsePJS ( demux_t *, subtitle_t *, int );
+static int ParseMPSub ( demux_t *, subtitle_t *, int );
static struct
{
@@ -171,6 +173,7 @@ static struct
{ "mpl2", SUB_TYPE_MPL2, "MPL2", ParseMPL2 },
{ "aqt", SUB_TYPE_AQT, "AQTitle", ParseAQT },
{ "pjs", SUB_TYPE_PJS, "PhoenixSub", ParsePJS },
+ { "mpsub", SUB_TYPE_MPSUB, "MPSub", ParseMPSub },
{ NULL, SUB_TYPE_UNKNOWN, "Unknown", NULL }
};
@@ -254,6 +257,7 @@ static int Open ( vlc_object_t *p_this )
for( i_try = 0; i_try < 256; i_try++ )
{
int i_dummy;
+ float f_dummy;
if( ( s = stream_ReadLine( p_demux->s ) ) == NULL )
break;
@@ -325,6 +329,10 @@ static int Open ( vlc_object_t *p_this )
p_sys->i_type = SUB_TYPE_MPL2;
break;
}
+ else if( sscanf( s, "%f %f", &f_dummy, &f_dummy ) == 2 )
+ {
+ p_sys->i_type = SUB_TYPE_MPSUB;
+ }
else if( sscanf( s, "-->> %d", &i_dummy) == 1 )
{
p_sys->i_type = SUB_TYPE_AQT;
@@ -1327,3 +1335,55 @@ static int ParsePJS( demux_t *p_demux, subtitle_t *p_subtitle, int i_idx )
return VLC_SUCCESS;
}
+static float mpsub_total = 0;
+
+static int ParseMPSub( 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( "" );
+
+ for( ;; )
+ {
+ const char *s = TextGetLine( txt );
+ float f1, f2;
+
+ if( !s )
+ return VLC_EGENERIC;
+
+ /* Data Lines */
+ if( sscanf (s, "%f %f", &f1, &f2 ) == 2 )
+ {
+ mpsub_total += f1;
+ p_subtitle->i_start = (int64_t)(1000000.0 * mpsub_total);
+ mpsub_total += f2;
+ p_subtitle->i_stop = (int64_t)(1000000.0 * mpsub_total);
+ break;
+ }
+ }
+
+ for( ;; )
+ {
+ const char *s = TextGetLine( txt );
+
+ if( !s )
+ return VLC_EGENERIC;
+
+ int i_len = strlen( s );
+ if( i_len == 0 )
+ break;
+
+ int i_old = strlen( psz_text );
+
+ psz_text = realloc( psz_text, i_old + i_len + 1 + 1 );
+ if( !psz_text )
+ return VLC_ENOMEM;
+
+ strcat( psz_text, s );
+ strcat( psz_text, "\n" );
+ }
+
+ p_subtitle->psz_text = psz_text;
+ return VLC_SUCCESS;
+}
+
More information about the vlc-devel
mailing list