changeset 7010:fed45d810822

ogg (.ogm) text subtitles support based on patch by Chris Forno <jcore@m-net.arbornet.org>
author arpi
date Wed, 14 Aug 2002 23:41:19 +0000
parents 98bed9e12087
children 5781b305040a
files libmpdemux/demux_ogg.c
diffstat 1 files changed, 81 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/demux_ogg.c	Wed Aug 14 23:02:45 2002 +0000
+++ b/libmpdemux/demux_ogg.c	Wed Aug 14 23:41:19 2002 +0000
@@ -129,6 +129,72 @@
 
 extern int index_mode;
 
+//-------- subtitle support - should be moved to decoder layer, and queue
+//                          - subtitles up in demuxer buffer...
+
+#include "../subreader.h"
+#include "../libvo/sub.h"
+#define OGG_SUB_MAX_LINE 128
+
+static subtitle ogg_sub;
+extern subtitle* vo_sub;
+//FILE* subout;
+
+void demux_ogg_init_sub () {
+  int lcv;
+  if(!ogg_sub.text[0]) // not yet allocated
+  for (lcv = 0; lcv < SUB_MAX_TEXT; lcv++) {
+    ogg_sub.text[lcv] = (char*)malloc(OGG_SUB_MAX_LINE);
+  }
+}
+
+void demux_ogg_add_sub (char* packet) {
+  int lcv;
+  int line_pos = 0;
+  int ignoring = 0;
+
+  mp_msg(MSGT_DEMUX,MSGL_DBG2,"\ndemux_ogg_add_sub %02X %02X %02X '%s'\n",
+      (unsigned char)packet[0],
+      (unsigned char)packet[1],
+      (unsigned char)packet[2],
+      &packet[3]);
+
+  ogg_sub.lines = 0;
+  if (((unsigned char)packet[0]) == 0x88) { // some subtitle text
+    lcv = 3;
+    while (1) {
+      int c = packet[lcv++];
+      if(c=='\r' || c==0 || line_pos >= OGG_SUB_MAX_LINE-1){
+	  ogg_sub.text[ogg_sub.lines][line_pos] = 0; // close sub
+          if(line_pos) ogg_sub.lines++;
+	  if(!c || ogg_sub.lines>=SUB_MAX_TEXT) break; // EOL or TooMany
+          line_pos = 0;
+      }
+      switch (c) {
+        case '\r':
+        case '\n': // just ignore linefeeds for now
+                   // their placement seems rather haphazard
+          break;
+        case '<': // some html markup, ignore for now
+          ignoring = 1;
+          break;
+        case '>':
+          ignoring = 0;
+          break;
+        default:
+          //if(!ignoring) 
+	  ogg_sub.text[ogg_sub.lines][line_pos++] = c;
+          break;
+      }
+    }
+  }
+
+  mp_msg(MSGT_DEMUX,MSGL_DBG2,"ogg sub lines: %d  first: '%s'\n",
+      ogg_sub.lines, ogg_sub.text[0]);
+  vo_sub = &ogg_sub;
+  vo_osd_changed(OSDTYPE_SUBTITLE);
+}
+
 
 // get the logical stream of the current page
 // fill os if non NULL and return the stream id
@@ -209,6 +275,10 @@
   float pts = 0;
   int flags = 0;
 
+  if (ds == d->sub) { // don't want to add subtitles to the demuxer for now
+    demux_ogg_add_sub(pack->packet);
+    return 0;
+  }
   // If packet is an header we jump it except for vorbis
   if((*pack->packet & PACKET_TYPE_HEADER) && 
      (ds == d->video || (ds == d->audio && ( ((sh_audio_t*)ds->sh)->format != 0xFFFE || os->hdr_packets >= NUM_VORBIS_HDR_PACKETS ) ) ))
@@ -345,7 +415,7 @@
   ogg_demuxer_t* ogg_d;
   stream_t *s;
   char* buf;
-  int np,s_no, n_audio = 0, n_video = 0;
+  int np,s_no, n_audio = 0, n_video = 0, n_text = 0;
   ogg_sync_state* sync;
   ogg_page* page;
   ogg_packet pack;
@@ -516,8 +586,11 @@
 	if(verbose) print_wave_header(sh_a->wf);
 
 	/// Check for text (subtitles) header
-      } else if(strncmp(st->streamtype,"text",4) == 0) {
-	mp_msg(MSGT_DEMUX,MSGL_WARN,"OGG text stream are not supported\n");
+      } else if (strncmp(st->streamtype, "text", 4) == 0) {
+          mp_msg(MSGT_DEMUX, MSGL_V, "OGG stream %d is text\n", ogg_d->num_sub);
+          if(demuxer->sub->id==-1) demuxer->sub->id = ogg_d->num_sub;
+          n_text++;
+          demux_ogg_init_sub();
 	//// Unknow header type
       } else
 	mp_msg(MSGT_DEMUX,MSGL_ERR,"OGG stream %d has a header marker but is of an unknow type\n",ogg_d->num_sub);
@@ -570,6 +643,8 @@
     demuxer->video->id = -2;
   if(!n_audio)
     demuxer->audio->id = -2;
+  if(!n_text)
+    demuxer->sub->id = -2;
 
   if(!s->end_pos)
     demuxer->seekable = 0;
@@ -581,7 +656,7 @@
       demux_ogg_build_syncpoints_table(demuxer);
   }
 
-  mp_msg(MSGT_DEMUX,MSGL_V,"OGG demuxer : found %d audio stream and %d video stream\n",n_audio,n_video);
+  mp_msg(MSGT_DEMUX,MSGL_V,"OGG demuxer : found %d audio stream%s, %d video stream%s and %d text stream%s\n",n_audio,n_audio>1?"s":"",n_video,n_video>1?"s":"",n_text,n_text>1?"s":"");
  
   return 1;
 }
@@ -658,6 +733,8 @@
       ds = d->audio;
     else if(id == d->video->id)
       ds = d->video;
+    else if (id == d->sub->id)
+      ds = d->sub;
 
     if(ds) {
       if(!demux_ogg_add_packet(ds,&ogg_d->subs[id],&pack))