Commit 52960620 authored by Laurent Aimar's avatar Laurent Aimar

* Added support of vplayer subtitles files.

parent 9869e03d
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* sub.c * sub.c
***************************************************************************** *****************************************************************************
* Copyright (C) 1999-2001 VideoLAN * Copyright (C) 1999-2001 VideoLAN
* $Id: sub.c,v 1.6 2003/02/20 01:52:46 sigmunau Exp $ * $Id: sub.c,v 1.7 2003/03/11 20:01:23 fenrir Exp $
* *
* Authors: Laurent Aimar <fenrir@via.ecp.fr> * Authors: Laurent Aimar <fenrir@via.ecp.fr>
* *
...@@ -51,10 +51,11 @@ static int sub_MicroDvdRead( FILE *p_file, subtitle_t *p_subtitle, mtime_t i_mi ...@@ -51,10 +51,11 @@ static int sub_MicroDvdRead( FILE *p_file, subtitle_t *p_subtitle, mtime_t i_mi
static int sub_SubRipRead( FILE *p_file, subtitle_t *p_subtitle, mtime_t i_microsecperframe ); static int sub_SubRipRead( FILE *p_file, subtitle_t *p_subtitle, mtime_t i_microsecperframe );
static int sub_SSA1Read( FILE *p_file, subtitle_t *p_subtitle, mtime_t i_microsecperframe ); static int sub_SSA1Read( FILE *p_file, subtitle_t *p_subtitle, mtime_t i_microsecperframe );
static int sub_SSA2_4Read( FILE *p_file, subtitle_t *p_subtitle, mtime_t i_microsecperframe ); static int sub_SSA2_4Read( FILE *p_file, subtitle_t *p_subtitle, mtime_t i_microsecperframe );
static int sub_Vplayer( FILE *p_file, subtitle_t *p_subtitle, mtime_t i_microsecperframe );
static void sub_fix( subtitle_demux_t *p_sub ); static void sub_fix( subtitle_demux_t *p_sub );
static char *ppsz_sub_type[] = { "microdvd", "subrip", "ssa1", "ssa2-4", NULL }; static char *ppsz_sub_type[] = { "microdvd", "subrip", "ssa1", "ssa2-4", "vplayer", NULL };
/***************************************************************************** /*****************************************************************************
* Module descriptor * Module descriptor
*****************************************************************************/ *****************************************************************************/
...@@ -63,7 +64,7 @@ static char *ppsz_sub_type[] = { "microdvd", "subrip", "ssa1", "ssa2-4", NULL }; ...@@ -63,7 +64,7 @@ static char *ppsz_sub_type[] = { "microdvd", "subrip", "ssa1", "ssa2-4", NULL };
"Override frames per second. " \ "Override frames per second. " \
"It will work only with MicroDVD" "It will work only with MicroDVD"
#define SUB_TYPE_LONGTEXT \ #define SUB_TYPE_LONGTEXT \
"One from \"microdvd\", \"subrip\", \"ssa1\", \"ssa2-4\" " \ "One from \"microdvd\", \"subrip\", \"ssa1\", \"ssa2-4\", \"vplayer\" " \
"(nothing for autodetection, it should always work)" "(nothing for autodetection, it should always work)"
vlc_module_begin(); vlc_module_begin();
...@@ -177,6 +178,10 @@ static int sub_open ( subtitle_demux_t *p_sub, ...@@ -177,6 +178,10 @@ static int sub_open ( subtitle_demux_t *p_sub,
{ {
i_sub_type = SUB_TYPE_SSA2_4; i_sub_type = SUB_TYPE_SSA2_4;
} }
else if( !strcmp( psz_file_type, "vplayer" ) )
{
i_sub_type = SUB_TYPE_VPLAYER;
}
else else
{ {
i_sub_type = SUB_TYPE_UNKNOWN; i_sub_type = SUB_TYPE_UNKNOWN;
...@@ -225,11 +230,19 @@ static int sub_open ( subtitle_demux_t *p_sub, ...@@ -225,11 +230,19 @@ static int sub_open ( subtitle_demux_t *p_sub,
{ {
i_sub_type = SUB_TYPE_SSA2_4; // I hop this will work i_sub_type = SUB_TYPE_SSA2_4; // I hop this will work
} }
break;
} }
else if( !strcmp( buffer, else if( !strcmp( buffer,
"Dialogue: Marked" ) ) "Dialogue: Marked" ) )
{ {
i_sub_type = SUB_TYPE_SSA2_4; // could be wrong i_sub_type = SUB_TYPE_SSA2_4; // could be wrong
break;
}
else if( sscanf( buffer, "%d:%d:%d:", &i_dummy, &i_dummy, &i_dummy ) == 3 ||
sscanf( buffer, "%d:%d:%d ", &i_dummy, &i_dummy, &i_dummy ) == 3 )
{
i_sub_type = SUB_TYPE_VPLAYER;
break;
} }
} }
} }
...@@ -253,6 +266,10 @@ static int sub_open ( subtitle_demux_t *p_sub, ...@@ -253,6 +266,10 @@ static int sub_open ( subtitle_demux_t *p_sub,
msg_Dbg( p_input, "detected SSAv2-4 Script format" ); msg_Dbg( p_input, "detected SSAv2-4 Script format" );
pf_read_subtitle = sub_SSA2_4Read; pf_read_subtitle = sub_SSA2_4Read;
break; break;
case SUB_TYPE_VPLAYER:
msg_Dbg( p_input, "detected vplayer format" );
pf_read_subtitle = sub_Vplayer;
break;
default: default:
msg_Err( p_sub, "unknown subtitile file" ); msg_Err( p_sub, "unknown subtitile file" );
fclose( p_file ); fclose( p_file );
...@@ -507,7 +524,7 @@ static int sub_MicroDvdRead( FILE *p_file, subtitle_t *p_subtitle, mtime_t i_mi ...@@ -507,7 +524,7 @@ static int sub_MicroDvdRead( FILE *p_file, subtitle_t *p_subtitle, mtime_t i_mi
char buffer_text[MAX_LINE + 1]; char buffer_text[MAX_LINE + 1];
uint32_t i_start; uint32_t i_start;
uint32_t i_stop; uint32_t i_stop;
int i; unsigned int i;
for( ;; ) for( ;; )
{ {
...@@ -704,3 +721,54 @@ static int sub_SSA2_4Read( FILE *p_file, subtitle_t *p_subtitle, mtime_t i_micr ...@@ -704,3 +721,54 @@ static int sub_SSA2_4Read( FILE *p_file, subtitle_t *p_subtitle, mtime_t i_micr
return( sub_SSARead( p_file, p_subtitle, i_microsecperframe, 9 ) ); return( sub_SSARead( p_file, p_subtitle, i_microsecperframe, 9 ) );
} }
static int sub_Vplayer( FILE *p_file, subtitle_t *p_subtitle, mtime_t i_microsecperframe)
{
/*
* each line:
* h:m:s:Line1|Line2|Line3....
* or
* h:m:s Line1|Line2|Line3....
* where n1 and n2 are the video frame number...
*
*/
char buffer[MAX_LINE + 1];
char buffer_text[MAX_LINE + 1];
mtime_t i_start;
unsigned int i;
for( ;; )
{
int h, m, s;
char c;
if( fgets( buffer, MAX_LINE, p_file ) <= 0)
{
return( -1 );
}
i_start = 0;
buffer[MAX_LINE] = '\0';
memset( buffer_text, '\0', MAX_LINE );
if( sscanf( buffer, "%d:%d:%d%[ :]%[^\r\n]", &h, &m, &s, &c, buffer_text ) == 5 )
{
i_start = ( (mtime_t)h * 3600*1000 +
(mtime_t)m * 60*1000 +
(mtime_t)s * 1000 ) * 1000;
break;
}
}
/* replace | by \n */
for( i = 0; i < strlen( buffer_text ); i++ )
{
if( buffer_text[i] == '|' )
{
buffer_text[i] = '\n';
}
}
p_subtitle->i_start = i_start;
p_subtitle->i_stop = 0;
p_subtitle->psz_text = strndup( buffer_text, MAX_LINE );
return( 0 );
}
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* sub.h * sub.h
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: sub.h,v 1.2 2003/01/02 23:50:55 massiot Exp $ * $Id: sub.h,v 1.3 2003/03/11 20:01:23 fenrir Exp $
* *
* Authors: Laurent Aimar <fenrir@via.ecp.fr> * Authors: Laurent Aimar <fenrir@via.ecp.fr>
* *
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#define SUB_TYPE_SUBRIP 0x01 #define SUB_TYPE_SUBRIP 0x01
#define SUB_TYPE_SSA1 0x02 #define SUB_TYPE_SSA1 0x02
#define SUB_TYPE_SSA2_4 0x03 #define SUB_TYPE_SSA2_4 0x03
#define SUB_TYPE_VPLAYER 0x04
#define SUB_TYPE_UNKNOWN 0xffff #define SUB_TYPE_UNKNOWN 0xffff
typedef struct subtitle_s typedef struct subtitle_s
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment