From 571861572b2421793b1c652c4e4a0a66685bb84e Mon Sep 17 00:00:00 2001 From: Antoine Cellerier Date: Sat, 17 Feb 2007 23:53:06 +0000 Subject: [PATCH] mpl2 subtitles support by Roman Bednarek. Thanks. --- THANKS | 3 +- modules/demux/subtitle.c | 66 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/THANKS b/THANKS index 477cb05972..41fea5c6c3 100644 --- a/THANKS +++ b/THANKS @@ -152,8 +152,9 @@ Régis Duchesne - original VLC code Remco Poortinga - IPv6 multicast patch Rene Gollent - BeOS interface fix Rob Casey (rob dot casey AT swishgroup dot com dot au) - Amino RTSP fix -Roine Gustafsson - spudec bug fixes Rudolf Cornelissen - BeOS fixes +Roine Gustafsson - spudec bug fixes +Roman Bednarek - MPL2 subtitles support Sašo Kiselkov - RTSP session timeout fix for some STBs, multipass x264 patch Scott Caudle - Visualization, WX improvements diff --git a/modules/demux/subtitle.c b/modules/demux/subtitle.c index 8688bc0e12..fee8338cfe 100644 --- a/modules/demux/subtitle.c +++ b/modules/demux/subtitle.c @@ -54,12 +54,12 @@ static void Close( vlc_object_t *p_this ); #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 @@ enum 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 ParseSSA ( demux_t *, subtitle_t * ); 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 @@ static struct { "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 @@ static int Open ( vlc_object_t *p_this ) 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 ParseDVDSubtitle( demux_t *p_demux, subtitle_t *p_subtitle ) } } +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 ); +} -- 2.39.2