# HG changeset patch # User reimar # Date 1163434523 0 # Node ID a8b42366e68a1817ae8ce7742e474afc7286ffa8 # Parent a479262a8abf31767654ee091fb94a242cd5f0ef Make subtitle stream handling more similar to audio and video streams. diff -r a479262a8abf -r a8b42366e68a libmpdemux/demux_mkv.c --- 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); diff -r a479262a8abf -r a8b42366e68a libmpdemux/demux_mpg.c --- 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) diff -r a479262a8abf -r a8b42366e68a libmpdemux/demuxer.c --- 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) { diff -r a479262a8abf -r a8b42366e68a libmpdemux/demuxer.h --- 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;