From c5fa0bbf92c98fbfd859885147427cb1600c628c Mon Sep 17 00:00:00 2001 From: reimar Date: Mon, 13 Nov 2006 16:15:23 +0000 Subject: Make subtitle stream handling more similar to audio and video streams. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@20888 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpdemux/demux_mkv.c | 14 ++++++++------ libmpdemux/demux_mpg.c | 2 +- libmpdemux/demuxer.c | 17 +++++++++++++++++ libmpdemux/demuxer.h | 4 +++- 4 files changed, 29 insertions(+), 8 deletions(-) (limited to 'libmpdemux') diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c index 0efd3ab6e2..a72387253b 100644 --- a/libmpdemux/demux_mkv.c +++ b/libmpdemux/demux_mkv.c @@ -1766,6 +1766,8 @@ static int 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 @@ display_create_tracks (demuxer_t *demuxer) 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 @@ demux_mkv_parse_ass_data (demuxer_t *demuxer) #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 @@ demux_mkv_open (demuxer_t *demuxer) 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 --git a/libmpdemux/demux_mpg.c b/libmpdemux/demux_mpg.c index 07de9882bd..9e18ff13e1 100644 --- a/libmpdemux/demux_mpg.c +++ b/libmpdemux/demux_mpg.c @@ -298,7 +298,7 @@ static int demux_mpg_read_packet(demuxer_t *demux,int id){ 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 --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c index d65456cfd6..2448bf7ab2 100644 --- a/libmpdemux/demuxer.c +++ b/libmpdemux/demuxer.c @@ -201,6 +201,23 @@ demuxer_t* new_demuxer(stream_t *stream,int type,int a_id,int v_id,int s_id,char 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 --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h index bc2c79cff8..973887865b 100644 --- a/libmpdemux/demuxer.h +++ b/libmpdemux/demuxer.h @@ -128,6 +128,7 @@ typedef struct demuxer_info_st { } 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 @@ typedef struct { #define MAX_A_STREAMS 256 #define MAX_V_STREAMS 256 +#define MAX_S_STREAMS 32 struct demuxer_st; @@ -199,7 +201,7 @@ typedef struct demuxer_st { // 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; -- cgit v1.2.3