mirror of
https://github.com/mpv-player/mpv
synced 2025-04-03 20:35:31 +02:00
Preliminary support for RT-type subs.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@851 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
e772047266
commit
aeef5ea24a
2
configure
vendored
2
configure
vendored
@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
#
|
#
|
||||||
# MPlayer configurator. (C) 2000 Pontscho/fresh!mindworkz
|
# MPlayer configurator. (C) 2000 Pontscho/fresh!mindworkz
|
||||||
|
2
debian/files
vendored
2
debian/files
vendored
@ -1 +1 @@
|
|||||||
mplayer_0.17a-1_i386.deb unknown optional
|
mplayer_0.17a-2_i386.deb unknown optional
|
||||||
|
3
debian/mplayer.conf
vendored
3
debian/mplayer.conf
vendored
@ -41,7 +41,6 @@ zoom=no # Enable software scaling (powerful CPU needed)
|
|||||||
##
|
##
|
||||||
|
|
||||||
sound = 1
|
sound = 1
|
||||||
nosound = nein
|
|
||||||
mixer = /dev/mixer
|
mixer = /dev/mixer
|
||||||
master = no # no : set PCM volume yes : set MASTER volume
|
master = no # no : set PCM volume yes : set MASTER volume
|
||||||
|
|
||||||
@ -83,7 +82,7 @@ ffactor = 1
|
|||||||
# forcexv = yes # force XVideo even if not detected
|
# forcexv = yes # force XVideo even if not detected
|
||||||
|
|
||||||
|
|
||||||
# nodshow # disable usage of DirectShow video codecs
|
# nodshow = 1 # disable usage of DirectShow video codecs
|
||||||
|
|
||||||
##
|
##
|
||||||
## You can also include other configfiles
|
## You can also include other configfiles
|
||||||
|
59
subreader.c
59
subreader.c
@ -24,6 +24,7 @@ int sub_format=-1; // 0 for microdvd
|
|||||||
// 2 for the third format (what's this?)
|
// 2 for the third format (what's this?)
|
||||||
// 3 for SAMI (smi)
|
// 3 for SAMI (smi)
|
||||||
// 4 for vplayer format
|
// 4 for vplayer format
|
||||||
|
// 5 for RT format
|
||||||
|
|
||||||
int eol(char p) {
|
int eol(char p) {
|
||||||
return (p=='\r' || p=='\n' || p=='\0');
|
return (p=='\r' || p=='\n' || p=='\0');
|
||||||
@ -253,6 +254,46 @@ subtitle *sub_read_line_vplayer(FILE *fd,subtitle *current) {
|
|||||||
return 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) {
|
int sub_autodetect (FILE *fd) {
|
||||||
@ -275,7 +316,10 @@ int sub_autodetect (FILE *fd) {
|
|||||||
{sub_uses_time=1; return 3;}
|
{sub_uses_time=1; return 3;}
|
||||||
if (sscanf (line, "%d:%d:%d:", &i, &i, &i )==3)
|
if (sscanf (line, "%d:%d:%d:", &i, &i, &i )==3)
|
||||||
{sub_uses_time=1;return 4;}
|
{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
|
return -1; // too many bad lines
|
||||||
@ -286,13 +330,14 @@ subtitle* sub_read_file (char *filename) {
|
|||||||
FILE *fd;
|
FILE *fd;
|
||||||
int n_max;
|
int n_max;
|
||||||
subtitle *first;
|
subtitle *first;
|
||||||
subtitle * (*func[5])(FILE *fd,subtitle *dest)=
|
subtitle * (*func[6])(FILE *fd,subtitle *dest)=
|
||||||
{
|
{
|
||||||
sub_read_line_microdvd,
|
sub_read_line_microdvd,
|
||||||
sub_read_line_subrip,
|
sub_read_line_subrip,
|
||||||
sub_read_line_third,
|
sub_read_line_third,
|
||||||
sub_read_line_sami,
|
sub_read_line_sami,
|
||||||
sub_read_line_vplayer
|
sub_read_line_vplayer,
|
||||||
|
sub_read_line_rt
|
||||||
};
|
};
|
||||||
|
|
||||||
fd=fopen (filename, "r"); if (!fd) return NULL;
|
fd=fopen (filename, "r"); if (!fd) return NULL;
|
||||||
@ -344,14 +389,18 @@ char * sub_filename( char * fname )
|
|||||||
char * sub_name = NULL;
|
char * sub_name = NULL;
|
||||||
char * sub_tmp = NULL;
|
char * sub_tmp = NULL;
|
||||||
int i;
|
int i;
|
||||||
#define SUB_EXTS 6
|
#define SUB_EXTS 10
|
||||||
char * sub_exts[SUB_EXTS] =
|
char * sub_exts[SUB_EXTS] =
|
||||||
{ ".sub",
|
{ ".sub",
|
||||||
".SUB",
|
".SUB",
|
||||||
".srt",
|
".srt",
|
||||||
".SRT",
|
".SRT",
|
||||||
".smi",
|
".smi",
|
||||||
".SMI"};
|
".SMI",
|
||||||
|
".rt",
|
||||||
|
".RT",
|
||||||
|
".txt",
|
||||||
|
".TXT"};
|
||||||
|
|
||||||
if ( fname == NULL ) return NULL;
|
if ( fname == NULL ) return NULL;
|
||||||
for( i=strlen( fname );i>0;i-- )
|
for( i=strlen( fname );i>0;i-- )
|
||||||
|
Loading…
x
Reference in New Issue
Block a user