[MPlayer-dev-eng] [PATCH] USF support - second time around NOVIRUS

Attila Kinali attila at kinali.ch
Sat Jan 24 12:28:10 CET 2004


On Sun, 14 Dec 2003 04:38:41 -0500
Avery Morrow <ashitaka-san at comcast.net> wrote:

> I have improved on my patch for USF support. It fixes
> everything that Moritz pointed out, and now supports XML more
> fully and displays multi-line subtitles properly. I tested it
> with a somewhat complex USF subtitle file which I've made, and
> it works perfectly. However, there still might be some
> Schroedinbug I didn't see.

diff -Naur 1/subreader.c 2/subreader.c
--- 1/subreader.c	2003-12-14 04:11:35.792026584 -0500
+++ 2/subreader.c	2003-12-14 04:11:23.621876728 -0500
@@ -262,6 +262,83 @@
     return current;
 }
 
+subtitle *sub_read_line_usf(FILE *fd,subtitle *current) {
+	char line[LINE_LEN+1];
+	int i, j, count, skip, start, a1, a2, a3, a4, b1, b2, b3, b4;
+	char *p=NULL;
+	count = 0;
+
+while (!current->text[0]) {
+	while (!strstr(line, "<subtitle ")) {
+		if(!fgets(line, LINE_LEN, fd))
+			return NULL;
+	}
+	if (sscanf(line, " <subtitle start=\"%d:%d:%d.%d\" stop=\"%d:%d:%d.%d\"", &a1, &a2, &a3, &a4, &b1, &b2, &b3, &b4) != 8) {
+		mp_msg(MSGT_SUBREADER,MSGL_WARN,"USF decoding doesn't parse XML correctly.\n"); //TODO: allow more than one line per time marker
+		break;
+	}
+	current->start = a1*360000+a2*6000+a3*100+a4/10;
+	current->end   = b1*360000+b2*6000+b3*100+b4/10;
+	if (current->end <= current->start)
+	  current->end = current->start+200;
+	while (!(p = strstr(line, "<text"))) {
+		if(!fgets(line, LINE_LEN, fd))
+			return NULL;
+	}
+	int len = 0, addline = 2;
+	// detects </text
+	p = &line[0];
+	for (;!(*p=='<' && *(p+1)=='/' && *(p+2)=='t' && *(p+3)=='e' && *(p+4)=='x' && *(p+5)=='t') && *p; p++,len++) {
+		if (*p=='\n' || *p=='\r') { 
+		char tmp[LINE_LEN+1];

This is imho a bad idea. This allocates 1KB on the stack 
and might lead to stack overflows.

[...]
+				char temp[LINE_LEN+1];

Another KB on the stack.

+				strncpy(temp, current->text[count], curptr-&(current->text[count][0]));
+				temp[curptr-&(current->text[count][0])] = '\0';
+				current->text[count]=(char *)malloc(j-1);

You should do a realloc here -> memleak

+				strcpy(current->text[count], temp);
+				count++;
+			        curptr=current->text[count]=(char *)malloc (len-j);
+		    	}
+			continue;
+		    }
+		    if(skip || eol(line[j]))
+			continue;

What's the intention of the check for eol ?
You know that eol also matches for '\0' ?

+		    if(line[j] == '\t') {
+		    	if(line[j-1] == ' ')
+				continue;
+			else
+		    		line[j] = ' ';
+			}
+		     *curptr=line[j];
+		    curptr++;
+		}
+		*curptr='\0';
+	count++;

There should be a check whether count reached SUB_MAX_TEXT somewhere in this loop.
-> sig11

+}
+    current->lines=count;
+    return current;
+}
+
 subtitle *sub_read_line_subviewer(FILE *fd,subtitle *current) {
     char line[LINE_LEN+1];
     int a1,a2,a3,a4,b1,b2,b3,b4;
@@ -923,10 +1000,14 @@
 		{*uses_time=1;return SUB_VPLAYER;}
 	if (sscanf (line, "%d:%d:%d ",     &i, &i, &i )==3)
 		{*uses_time=1;return SUB_VPLAYER;}
+	// If it's XML, it's USF... this is just as bad as the RT detection
+	if (strstr(line, "<?xml"))
+		{*uses_time=1;return SUB_USF;}

IMHO sub_autodetect() should be reworked to use multiple lines for
detection, but that's something that could be done later.

 	//TODO: just checking if first line of sub starts with "<" is WAY
 	// too weak test for RT
 	// Please someone who knows the format of RT... FIX IT!!!
 	// It may conflict with other sub formats in the future (actually it doesn't)
+	// ... it doesn't only if it comes last
 	if ( *line == '<' )
 		{*uses_time=1;return SUB_RT;}

------------------

Otherwise the patch looks ok and could be applied if those few things
are fixed.


				Attila Kinali




-- 
egp ist vergleichbar mit einem ikea bausatz fuer flugzeugtraeger
			-- reeler in +kaosu




More information about the MPlayer-dev-eng mailing list