changeset 20872:a8b42366e68a

Make subtitle stream handling more similar to audio and video streams.
author reimar
date Mon, 13 Nov 2006 16:15:23 +0000
parents a479262a8abf
children 8f0c616d7425
files libmpdemux/demux_mkv.c libmpdemux/demux_mpg.c libmpdemux/demuxer.c libmpdemux/demuxer.h
diffstat 4 files changed, 29 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/demux_mkv.c	Mon Nov 13 16:03:11 2006 +0000
+++ b/libmpdemux/demux_mkv.c	Mon Nov 13 16:15:23 2006 +0000
@@ -1766,6 +1766,8 @@
 demux_mkv_open_video (demuxer_t *demuxer, mkv_track_t *track, int vid);
 static int
 demux_mkv_open_audio (demuxer_t *demuxer, mkv_track_t *track, int aid);
+static int
+demux_mkv_open_sub (demuxer_t *demuxer, mkv_track_t *track, int sid);
 
 static void
 display_create_tracks (demuxer_t *demuxer)
@@ -1796,7 +1798,7 @@
           break;
         case MATROSKA_TRACK_SUBTITLE:
           type = "subtitles";
-          mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SUBTITLE_ID=%d\n", sid);
+          demux_mkv_open_sub(demuxer, mkv_d->tracks[i], sid);
           if (mkv_d->tracks[i]->name)
             mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_NAME=%s\n", sid, mkv_d->tracks[i]->name);
           mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_LANG=%s\n", sid, mkv_d->tracks[i]->language);
@@ -2408,18 +2410,18 @@
 #endif
 
 static int
-demux_mkv_open_sub (demuxer_t *demuxer, mkv_track_t *track)
+demux_mkv_open_sub (demuxer_t *demuxer, mkv_track_t *track, int sid)
 {
   if (track->subtitle_type != MATROSKA_SUBTYPE_UNKNOWN)
     {
+      sh_sub_t *sh = new_sh_sub_sid(demuxer, track->tnum, sid);
       if ((track->subtitle_type == MATROSKA_SUBTYPE_VOBSUB) ||
           (track->subtitle_type == MATROSKA_SUBTYPE_SSA))
         {
           if (track->private_data != NULL)
             {
-              demuxer->sub->sh = malloc(sizeof(sh_sub_t));
-              if (demuxer->sub->sh != NULL)
-                memcpy(demuxer->sub->sh, &track->sh_sub, sizeof(sh_sub_t));
+              if (sh)
+                memcpy(sh, &track->sh_sub, sizeof(sh_sub_t));
             }
         }
     }
@@ -2680,7 +2682,7 @@
     track = demux_mkv_find_track_by_language (mkv_d, dvdsub_lang,
                                               MATROSKA_TRACK_SUBTITLE);
 
-  if (track && !demux_mkv_open_sub (demuxer, track))
+  if (track)
           {
             mp_msg (MSGT_DEMUX, MSGL_INFO,
                     MSGTR_MPDEMUX_MKV_WillDisplaySubtitleTrack, track->tnum);
--- a/libmpdemux/demux_mpg.c	Mon Nov 13 16:03:11 2006 +0000
+++ b/libmpdemux/demux_mpg.c	Mon Nov 13 16:15:23 2006 +0000
@@ -298,7 +298,7 @@
 
         if(!demux->s_streams[aid]){
             mp_msg(MSGT_DEMUX,MSGL_V,"==> Found subtitle: %d\n",aid);
-            demux->s_streams[aid]=1;
+            new_sh_sub(demux, aid);
         }
 
         if(demux->sub->id > -1)
--- a/libmpdemux/demuxer.c	Mon Nov 13 16:03:11 2006 +0000
+++ b/libmpdemux/demuxer.c	Mon Nov 13 16:15:23 2006 +0000
@@ -201,6 +201,23 @@
   return d;
 }
 
+sh_sub_t *new_sh_sub_sid(demuxer_t *demuxer, int id, int sid) {
+  if (id > MAX_S_STREAMS - 1 || id < 0) {
+    mp_msg(MSGT_DEMUXER,MSGL_WARN,"Requested sub stream id overflow (%d > %d)\n",
+           id, MAX_S_STREAMS);
+    return NULL;
+  }
+  if (demuxer->s_streams[id])
+    mp_msg(MSGT_DEMUXER, MSGL_WARN, "Sub stream %i redefined\n", id);
+  else {
+    sh_sub_t *sh = calloc(1, sizeof(sh_sub_t));
+    demuxer->s_streams[id] = sh;
+    sh->sid = sid;
+    mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SUBTITLE_ID=%d\n", sid);
+  }
+  return demuxer->s_streams[id];
+}
+
 sh_audio_t* new_sh_audio_aid(demuxer_t *demuxer,int id,int aid){
     if(id > MAX_A_STREAMS-1 || id < 0)
     {
--- a/libmpdemux/demuxer.h	Mon Nov 13 16:03:11 2006 +0000
+++ b/libmpdemux/demuxer.h	Mon Nov 13 16:15:23 2006 +0000
@@ -128,6 +128,7 @@
 } demuxer_info_t;
 
 typedef struct {
+  int sid;
   char type;                    // t = text, v = VobSub, a = SSA/ASS
   int has_palette;              // If we have a valid palette
   unsigned int palette[16];     // for VobSubs
@@ -142,6 +143,7 @@
 
 #define MAX_A_STREAMS 256
 #define MAX_V_STREAMS 256
+#define MAX_S_STREAMS 32
 
 struct demuxer_st;
 
@@ -199,7 +201,7 @@
   // stream headers:
   void* a_streams[MAX_A_STREAMS]; // audio streams (sh_audio_t)
   void* v_streams[MAX_V_STREAMS]; // video sterams (sh_video_t)
-  char s_streams[32];   // dvd subtitles (flag)
+  void *s_streams[MAX_S_STREAMS];   // dvd subtitles (flag)
 
   demux_chapter_t* chapters;
   int num_chapters;