From edf46e3fb8e566cb64862fdadcf8a4956557741e Mon Sep 17 00:00:00 2001 From: Miguel Freitas Date: Fri, 10 Jan 2003 22:23:54 +0000 Subject: just get it to compile, still not finished. i hope to have something working this weekend CVS patchset: 3857 CVS date: 2003/01/10 22:23:54 --- src/libsputext/Makefile.am | 11 +- src/libsputext/demux_sputext.c | 64 +-- src/libsputext/xine_decoder.c | 880 +++++------------------------------------ 3 files changed, 138 insertions(+), 817 deletions(-) (limited to 'src') diff --git a/src/libsputext/Makefile.am b/src/libsputext/Makefile.am index 642586265..2195433b1 100644 --- a/src/libsputext/Makefile.am +++ b/src/libsputext/Makefile.am @@ -3,8 +3,7 @@ LIBTOOL = $(SHELL) $(top_builddir)/libtool-nofpic libdir = $(XINE_PLUGINDIR) if HAVE_GICONV -#sputext_decoder = xineplug_decode_sputext.la xineplug_dmx_sputext.la -sputext_decoder = xineplug_dmx_sputext.la +sputext_decoder = xineplug_decode_sputext.la xineplug_dmx_sputext.la endif lib_LTLIBRARIES = $(sputext_decoder) @@ -14,10 +13,10 @@ xineplug_dmx_sputext_la_SOURCES = demux_sputext.c xineplug_dmx_sputext_la_LIBADD = $(XINELIB) $(GICONV_BSD_LIBS) xineplug_dmx_sputext_la_LDFLAGS = -avoid-version -module @XINE_PLUGIN_MIN_SYMS@ -#xineplug_decode_sputext_la_SOURCES = xine_decoder.c -## libgiconv is only needed with FreeBSD -#xineplug_decode_sputext_la_LIBADD = $(XINELIB) -#xineplug_decode_sputext_la_LDFLAGS = -avoid-version -module @XINE_PLUGIN_MIN_SYMS@ +xineplug_decode_sputext_la_SOURCES = xine_decoder.c +# libgiconv is only needed with FreeBSD +xineplug_decode_sputext_la_LIBADD = $(XINELIB) +xineplug_decode_sputext_la_LDFLAGS = -avoid-version -module @XINE_PLUGIN_MIN_SYMS@ ## ## Install header files (default=$includedir/xine) diff --git a/src/libsputext/demux_sputext.c b/src/libsputext/demux_sputext.c index 8d93faa48..11e956dad 100644 --- a/src/libsputext/demux_sputext.c +++ b/src/libsputext/demux_sputext.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: demux_sputext.c,v 1.5 2003/01/08 01:02:30 miguelfreitas Exp $ + * $Id: demux_sputext.c,v 1.6 2003/01/10 22:23:54 miguelfreitas Exp $ * * code based on old libsputext/xine_decoder.c * @@ -47,7 +47,6 @@ #include "xine_internal.h" #include "xineutils.h" #include "../demuxers/demux.h" -#include "osd.h" /* #define LOG 1 @@ -68,8 +67,8 @@ typedef struct { int lines; - unsigned long start; - unsigned long end; + unsigned long start; /* hsecs */ + unsigned long end; /* hsecs */ char *text[SUB_MAX_TEXT]; @@ -803,34 +802,30 @@ static void update_osd_dst_encoding(void *this_gen, xine_cfg_entry_t *entry) static int demux_sputext_next (demux_sputext_t *this_gen) { demux_sputext_t *this = (demux_sputext_t *) this_gen; buf_element_t *buf; - subtitle_t *sub = &this->subtitles[this->cur]; + uint32_t *val; + char *str; + subtitle_t *sub; int line; if (this->cur >= this->num) return 0; + + sub = &this->subtitles[this->cur]; buf = this->stream->video_fifo->buffer_pool_alloc(this->stream->video_fifo); buf->type = BUF_SPU_TEXT; - buf->decoder_info[1] = sub->lines; - for (line = 0; line < sub->lines; line++) - strncpy(buf->content + line * SUB_BUFSIZE, sub->text[line], SUB_BUFSIZE); - - /* calculate PTS */ - if (!this->uses_time) { - /* FIXME: framerate hardcoded - get from master stream instead */ - int64_t frame_pts = 3600; - - buf->pts = sub->start * frame_pts; - - /* duration */ - buf->decoder_info[0] = (sub->end - sub->start) * frame_pts; - - } else { - - buf->pts = sub->start * 900; - - /* duration */ - buf->decoder_info[0] = (sub->end - sub->start) * 900; + buf->pts = 0; + + val = (uint32_t * )buf->content; + *val++ = sub->lines; + *val++ = this->uses_time; + *val++ = sub->start * 10; + *val++ = sub->end * 10; + str = (char *)val; + for (line = 0; line < sub->lines; line++, str+=strlen(str)+1) { + if( strlen(sub->text[line]) > SUB_BUFSIZE ) + sub->text[line][SUB_BUFSIZE] = '\0'; + strcpy(str, sub->text[line]); } this->stream->video_fifo->put(this->stream->video_fifo, buf); @@ -857,18 +852,19 @@ static int demux_sputext_get_status (demux_plugin_t *this_gen) { } static int demux_sputext_get_stream_length (demux_plugin_t *this_gen) { - /* FIXME: what to return? Get length from master stream perhaps? */ - return 0; + demux_sputext_t *this = (demux_sputext_t *) this_gen; + + if( this->uses_time && this->num ) { + return this->subtitles[this->num-1].end * 10; + } else { + return 0; + } } static int demux_sputext_send_chunk (demux_plugin_t *this_gen) { demux_sputext_t *this = (demux_sputext_t *) this_gen; - /* send at most 10 buffers to fifo in advance */ - if (this->stream->video_fifo->size(this->stream->video_fifo) >= 10) - xine_usec_sleep(200000); - if (this->stream->video_fifo->size(this->stream->video_fifo) < 10 && - !demux_sputext_next (this)) { + if (!demux_sputext_next (this)) { this->status = DEMUX_FINISHED; } @@ -879,6 +875,10 @@ static int demux_sputext_seek (demux_plugin_t *this_gen, off_t start_pos, int start_time) { demux_sputext_t *this = (demux_sputext_t*)this_gen; /* FIXME: change this->cur according to seek target and set a discontinuity */ + + if( this->uses_time && start_time ) { + } + return this->status; } diff --git a/src/libsputext/xine_decoder.c b/src/libsputext/xine_decoder.c index 593c6c7f4..e4db27b16 100644 --- a/src/libsputext/xine_decoder.c +++ b/src/libsputext/xine_decoder.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: xine_decoder.c,v 1.41 2002/09/05 22:18:58 mroi Exp $ + * $Id: xine_decoder.c,v 1.42 2003/01/10 22:23:54 miguelfreitas Exp $ * * code based on mplayer module: * @@ -46,23 +46,9 @@ /* #define LOG 1 */ - -#define ERR (void *)-1 - #define SUB_MAX_TEXT 5 -typedef struct { - - int lines; - - unsigned long start; - unsigned long end; - - char *text[SUB_MAX_TEXT]; - - osd_object_t *osd; - -} subtitle_t; +#define SUB_BUFSIZE 1024 typedef enum { @@ -73,15 +59,25 @@ typedef enum { SUBTITLE_SIZE_NUM /* number of values in enum */ } subtitle_size; + +typedef struct sputext_class_s { + spu_decoder_class_t class; + + xine_t *xine; + + +} sputext_class_t; + + typedef struct sputext_decoder_s { spu_decoder_t spu_decoder; - xine_t *xine; + sputext_class_t *class; + xine_stream_t *stream; - vo_instance_t *vo_out; int output_open; - FILE *fd; + char text[SUB_MAX_TEXT][SUB_BUFSIZE]; float mpsub_position; @@ -90,691 +86,18 @@ typedef struct sputext_decoder_s { int font_size; int line_height; int uses_time; - int errs; - subtitle_t *subtitles; - int num; /* number of subtitle structs */ - int cur; /* current subtitle */ - int format; /* constants see below */ - subtitle_t *previous_aqt_sub ; - osd_renderer_t *renderer; - osd_object_t *osd; - char *font; - char *src_encoding; - char *dst_encoding; + char *font; subtitle_size subtitle_size; - int64_t last_subtitle_end; /* no new subtitle before this vpts */ int time_offset; /* offset in 1/100sec to add to vpts */ -} sputext_decoder_t; - -#define FORMAT_MICRODVD 0 -#define FORMAT_SUBRIP 1 -#define FORMAT_SUBVIEWER 2 -#define FORMAT_SAMI 3 -#define FORMAT_VPLAYER 4 -#define FORMAT_RT 5 -#define FORMAT_SSA 6 /* Sub Station Alpha */ -#define FORMAT_DUNNO 7 /*... erm ... dunnowhat. tell me if you know */ -#define FORMAT_MPSUB 8 -#define FORMAT_AQTITLE 9 - -static int eol(char p) { - return (p=='\r' || p=='\n' || p=='\0'); -} - -static inline void trail_space(char *s) { - int i; - while (isspace(*s)) - strcpy(s, s + 1); - i = strlen(s) - 1; - while (i > 0 && isspace(s[i])) - s[i--] = '\0'; -} - - -static subtitle_t *sub_read_line_sami(sputext_decoder_t *this, subtitle_t *current) { - - static char line[1001]; - static char *s = NULL; - char text[1000], *p, *q; - int state; - - p = NULL; - current->lines = current->start = current->end = 0; - state = 0; - - /* read the first line */ - if (!s) - if (!(s = fgets(line, 1000, this->fd))) return 0; - - do { - switch (state) { - - case 0: /* find "START=" */ - s = strstr (s, "Start="); - if (s) { - current->start = strtol (s + 6, &s, 0) / 10; - state = 1; continue; - } - break; - - case 1: /* find "" */ - if ((s = strchr (s, '>'))) { s++; state = 3; p = text; continue; } - break; - - case 3: /* get all text until '<' appears */ - if (*s == '\0') { break; } - else if (*s == '<') { state = 4; } - else if (!strncasecmp (s, " ", 6)) { *p++ = ' '; s += 6; } - else if (*s == '\r') { s++; } - else if (!strncasecmp (s, "
", 4) || *s == '\n') { - *p = '\0'; p = text; trail_space (text); - if (text[0] != '\0') - current->text[current->lines++] = strdup (text); - if (*s == '\n') s++; else s += 4; - } - else *p++ = *s++; - continue; - - case 4: /* get current->end or skip */ - q = strstr (s, "Start="); - if (q) { - current->end = strtol (q + 6, &q, 0) / 10 - 1; - *p = '\0'; trail_space (text); - if (text[0] != '\0') - current->text[current->lines++] = strdup (text); - if (current->lines > 0) { state = 99; break; } - state = 0; continue; - } - s = strchr (s, '>'); - if (s) { s++; state = 3; continue; } - break; - } - - /* read next line */ - if (state != 99 && !(s = fgets (line, 1000, this->fd))) - return 0; - - } while (state != 99); - - return current; -} - - -static char *sub_readtext(char *source, char **dest) { - int len=0; - char *p=source; - - while ( !eol(*p) && *p!= '|' ) { - p++,len++; - } - - *dest= (char *)xine_xmalloc (len+1); - if (!dest) - return ERR; - - strncpy(*dest, source, len); - (*dest)[len]=0; - - while (*p=='\r' || *p=='\n' || *p=='|') - p++; - - if (*p) return p; /* not-last text field */ - else return NULL; /* last text field */ -} - -static subtitle_t *sub_read_line_microdvd(sputext_decoder_t *this, subtitle_t *current) { - - char line[1001]; - char line2[1001]; - char *p, *next; - int i; - - bzero (current, sizeof(subtitle_t)); - - current->end=-1; - do { - if (!fgets (line, 1000, this->fd)) return NULL; - } while ((sscanf (line, "{%ld}{}%[^\r\n]", &(current->start), line2) !=2) && - (sscanf (line, "{%ld}{%ld}%[^\r\n]", &(current->start), &(current->end),line2) !=3) - ); - - p=line2; - - next=p, 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; - } - } - current->lines= ++i; - - return current; -} - -static subtitle_t *sub_read_line_subrip(sputext_decoder_t *this, subtitle_t *current) { - - char line[1001]; - int a1,a2,a3,a4,b1,b2,b3,b4; - char *p=NULL, *q=NULL; - int len; - - bzero (current, sizeof(subtitle_t)); - - while (1) { - if (!fgets (line, 1000, this->fd)) return NULL; - if (sscanf (line, "%d:%d:%d.%d,%d:%d:%d.%d",&a1,&a2,&a3,&a4,&b1,&b2,&b3,&b4) < 8) continue; - current->start = a1*360000+a2*6000+a3*100+a4; - current->end = b1*360000+b2*6000+b3*100+b4; - - if (!fgets (line, 1000, this->fd)) return NULL; - - p=q=line; - for (current->lines=1; current->lines < SUB_MAX_TEXT; current->lines++) { - for (q=p,len=0; *p && *p!='\r' && *p!='\n' && strncmp(p,"[br]",4); p++,len++); - current->text[current->lines-1]=(char *)xine_xmalloc (len+1); - if (!current->text[current->lines-1]) return ERR; - strncpy (current->text[current->lines-1], q, len); - current->text[current->lines-1][len]='\0'; - if (!*p || *p=='\r' || *p=='\n') break; - while (*p++!=']'); - } - break; - } - return current; -} - -static subtitle_t *sub_read_line_third(sputext_decoder_t *this,subtitle_t *current) { - char line[1001]; - int a1,a2,a3,a4,b1,b2,b3,b4; - char *p=NULL; - int i,len; - - bzero (current, sizeof(subtitle_t)); - - while (!current->text[0]) { - if (!fgets (line, 1000, this->fd)) return NULL; - if ((len=sscanf (line, "%d:%d:%d,%d --> %d:%d:%d,%d",&a1,&a2,&a3,&a4,&b1,&b2,&b3,&b4)) < 8) - continue; - current->start = a1*360000+a2*6000+a3*100+a4/10; - current->end = b1*360000+b2*6000+b3*100+b4/10; - for (i=0; ifd)) break; - len=0; - for (p=line; *p!='\n' && *p!='\r' && *p; p++,len++); - if (len) { - current->text[i]=(char *)xine_xmalloc (len+1); - if (!current->text[i]) return ERR; - strncpy (current->text[i], line, len); current->text[i][len]='\0'; - i++; - } else { - break; - } - } - current->lines=i; - } - return current; -} - -static subtitle_t *sub_read_line_vplayer(sputext_decoder_t *this,subtitle_t *current) { - char line[1001]; - char line2[1001]; - int a1,a2,a3,b1,b2,b3; - char *p=NULL, *next; - int i,len,len2,plen; - - bzero (current, sizeof(subtitle_t)); - - while (!current->text[0]) { - if (!fgets (line, 1000, this->fd)) return NULL; - if ((len=sscanf (line, "%d:%d:%d:%n",&a1,&a2,&a3,&plen)) < 3) - continue; - if (!fgets (line2, 1000, this->fd)) return NULL; - if ((len2=sscanf (line2, "%d:%d:%d:",&b1,&b2,&b3)) < 3) - continue; - /* przewiń o linijkę do tyłu: */ - fseek(this->fd,-strlen(line2),SEEK_CUR); - - current->start = a1*360000+a2*6000+a3*100; - current->end = b1*360000+b2*6000+b3*100; - if ((current->end - current->start) > 1000) - current->end = current->start + 1000; /* not too long though. */ - /* teraz czas na wkopiowanie stringu */ - p=line; - /* finds the body of the subtitle_t */ - for (i=0; i<3; i++){ - p=strchr(p,':')+1; - } - i=0; - - if (*p!='|') { - next = p,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; - } - } - current->lines=i+1; - } - } - return current; -} - -static subtitle_t *sub_read_line_rt(sputext_decoder_t *this,subtitle_t *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(subtitle_t)); - - while (!current->text[0]) { - if (!fgets (line, 1000, this->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, "