summaryrefslogtreecommitdiffstats
path: root/subreader.c
diff options
context:
space:
mode:
authoreyck <eyck@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-05-22 11:09:26 +0000
committereyck <eyck@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-05-22 11:09:26 +0000
commitaeef5ea24a9b42e9081f0ae7accc34660c05210e (patch)
treea11af60b1d75a8752e4b89c3fb81da13b99449f0 /subreader.c
parente77204726661ed148d5f5c1889bdf5f361a0b51b (diff)
downloadmpv-aeef5ea24a9b42e9081f0ae7accc34660c05210e.tar.bz2
mpv-aeef5ea24a9b42e9081f0ae7accc34660c05210e.tar.xz
Preliminary support for RT-type subs.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@851 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'subreader.c')
-rw-r--r--subreader.c59
1 files changed, 54 insertions, 5 deletions
diff --git a/subreader.c b/subreader.c
index d0cb84567d..1a0c54cd03 100644
--- a/subreader.c
+++ b/subreader.c
@@ -24,6 +24,7 @@ int sub_format=-1; // 0 for microdvd
// 2 for the third format (what's this?)
// 3 for SAMI (smi)
// 4 for vplayer format
+ // 5 for RT format
int eol(char p) {
return (p=='\r' || p=='\n' || p=='\0');
@@ -253,6 +254,46 @@ subtitle *sub_read_line_vplayer(FILE *fd,subtitle *current) {
return current;
}
+subtitle *sub_read_line_rt(FILE *fd,subtitle *current) {
+ //TODO: This format uses quite rich (sub/super)set of xhtml
+ // I couldn't check it since DTD is not included.
+ // WARNING: full XML parses can be required for proper parsing
+ char line[1001];
+ int a1,a2,a3,a4,b1,b2,b3,b4;
+ char *p=NULL,*next=NULL;
+ int i,len,plen;
+
+ bzero (current, sizeof(current));
+
+ while (!current->text[0]) {
+ if (!fgets (line, 1000, fd)) return NULL;
+ //TODO: it seems that format of time is not easily determined, it may be 1:12, 1:12.0 or 0:1:12.0
+ //to describe the same moment in time. Maybe there are even more formats in use.
+ //if ((len=sscanf (line, "<Time Begin=\"%d:%d:%d.%d\" End=\"%d:%d:%d.%d\"",&a1,&a2,&a3,&a4,&b1,&b2,&b3,&b4)) < 8)
+ plen=a1=a2=a3=a4=b1=b2=b3=b4=0;
+ if (
+ ((len=sscanf (line, "<%*[tT]ime %*[bB]egin=\"%d:%d\" %*[Ee]nd=\"%d:%d\"%*[^<]<clear/>%n",&a2,&a3,&b2,&b3,&plen)) < 4) &&
+ ((len=sscanf (line, "<%*[tT]ime %*[bB]egin=\"%d:%d\" %*[Ee]nd=\"%d:%d.%d\"%*[^<]<clear/>%n",&a2,&a3,&b2,&b3,&b4,&plen)) < 5) &&
+// ((len=sscanf (line, "<%*[tT]ime %*[bB]egin=\"%d:%d.%d\" %*[Ee]nd=\"%d:%d\"%*[^<]<clear/>%n",&a2,&a3,&a4,&b2,&b3,&plen)) < 5) &&
+ ((len=sscanf (line, "<%*[tT]ime %*[bB]egin=\"%d:%d.%d\" %*[Ee]nd=\"%d:%d.%d\"%*[^<]<clear/>%n",&a2,&a3,&a4,&b2,&b3,&b4,&plen)) < 6) &&
+ ((len=sscanf (line, "<%*[tT]ime %*[bB]egin=\"%d:%d:%d.%d\" %*[Ee]nd=\"%d:%d:%d.%d\"%*[^<]<clear/>%n",&a1,&a2,&a3,&a4,&b1,&b2,&b3,&b4,&plen)) < 8)
+ )
+ continue;
+ current->start = a1*360000+a2*6000+a3*100+a4/10;
+ current->end = b1*360000+b2*6000+b3*100+b4/10;
+ p=line; p+=plen;i=0;
+ // TODO: I don't know what kind of convention is here for marking multiline subs, maybe <br/> like in xml?
+ next = strstr(line,"<clear/>")+8;i=0;
+ while ((next =sub_readtext (next, &(current->text[i])))) {
+ if (current->text[i]==ERR) {return ERR;}
+ i++;
+ if (i>=SUB_MAX_TEXT) { printf ("Too many lines in a subtitle\n");current->lines=i;return;}
+ }
+ current->lines=i+1;
+ }
+ return current;
+}
+
int sub_autodetect (FILE *fd) {
@@ -275,7 +316,10 @@ int sub_autodetect (FILE *fd) {
{sub_uses_time=1; return 3;}
if (sscanf (line, "%d:%d:%d:", &i, &i, &i )==3)
{sub_uses_time=1;return 4;}
-
+ //TODO: just checking if first line of sub starts with "<" is WAY
+ // to weak test for RT
+ if (strcmp("<",line))
+ {sub_uses_time=1;return 5;}
}
return -1; // too many bad lines
@@ -286,13 +330,14 @@ subtitle* sub_read_file (char *filename) {
FILE *fd;
int n_max;
subtitle *first;
- subtitle * (*func[5])(FILE *fd,subtitle *dest)=
+ subtitle * (*func[6])(FILE *fd,subtitle *dest)=
{
sub_read_line_microdvd,
sub_read_line_subrip,
sub_read_line_third,
sub_read_line_sami,
- sub_read_line_vplayer
+ sub_read_line_vplayer,
+ sub_read_line_rt
};
fd=fopen (filename, "r"); if (!fd) return NULL;
@@ -344,14 +389,18 @@ char * sub_filename( char * fname )
char * sub_name = NULL;
char * sub_tmp = NULL;
int i;
-#define SUB_EXTS 6
+#define SUB_EXTS 10
char * sub_exts[SUB_EXTS] =
{ ".sub",
".SUB",
".srt",
".SRT",
".smi",
- ".SMI"};
+ ".SMI",
+ ".rt",
+ ".RT",
+ ".txt",
+ ".TXT"};
if ( fname == NULL ) return NULL;
for( i=strlen( fname );i>0;i-- )