From 4ddc96baaeb59b9e8ef1d8ea07a3911ee465ade6 Mon Sep 17 00:00:00 2001 From: reimar Date: Sun, 27 Jan 2008 16:13:21 +0000 Subject: [PATCH] Support mov subtitle format directly instead of converting to text in the demuxer git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@25883 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpdemux/demux_mov.c | 13 ++++--------- mpcommon.c | 10 ++++++++-- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/libmpdemux/demux_mov.c b/libmpdemux/demux_mov.c index 1ae11f5122..7bf061698b 100644 --- a/libmpdemux/demux_mov.c +++ b/libmpdemux/demux_mov.c @@ -1327,8 +1327,10 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_SubtitleID, "mov", priv->track_db); if (trak->fourcc == mmioFOURCC('m','p','4','s')) init_vobsub(sh, trak); - else - sh->type = 't'; + else { + sh->type = 'm'; + sub_utf8 = 1; + } } else mp_msg(MSGT_DEMUX, MSGL_V, "Generic track - not completely understood! (id: %d)\n", trak->id); @@ -2188,13 +2190,6 @@ if(trak->pos==0 && trak->stream_header_len>0){ int len = trak->samples[samplenr].size; double subpts = (double)trak->samples[samplenr].pts / (double)trak->timescale; stream_seek(demuxer->stream, pos); - if (sh->type != 'v') { - stream_skip(demuxer->stream, 2); // size - len -= 2; - if (len < 0) len = 0; - if (len > MOV_MAX_SUBLEN) len = MOV_MAX_SUBLEN; - sub_utf8 = 1; - } ds_read_packet(demuxer->sub, demuxer->stream, len, subpts, pos, 0); priv->current_sub = samplenr; } diff --git a/mpcommon.c b/mpcommon.c index 1d1578c4e1..f6d4c940cb 100644 --- a/mpcommon.c +++ b/mpcommon.c @@ -10,6 +10,7 @@ #ifdef HAVE_TV_TELETEXT #include "stream/tv.h" #endif +#include "libavutil/intreadwrite.h" double sub_last_pts = -303; @@ -99,7 +100,7 @@ void update_subtitles(sh_video_t *sh_video, demux_stream_t *d_dvdsub, int reset) if (spudec_changed(vo_spudec)) vo_osd_changed(OSDTYPE_SPU); - } else if (dvdsub_id >= 0 && (type == 't' || type == 'a')) { + } else if (dvdsub_id >= 0 && (type == 't' || type == 'm' || type == 'a')) { double curpts = sh_video->pts + sub_delay; double endpts; vo_sub = &subs; @@ -109,6 +110,11 @@ void update_subtitles(sh_video_t *sh_video, demux_stream_t *d_dvdsub, int reset) break; endpts = d_dvdsub->first->endpts; len = ds_get_packet_sub(d_dvdsub, &packet); + if (type == 'm') { + if (len < 2) continue; + len = FFMIN(len - 2, AV_RB16(packet)); + packet += 2; + } #ifdef USE_ASS if (type == 'a' && ass_enabled) { // ssa/ass subs with libass sh_sub_t* sh = d_dvdsub->sh; @@ -119,7 +125,7 @@ void update_subtitles(sh_video_t *sh_video, demux_stream_t *d_dvdsub, int reset) (long long)((endpts-pts)*1000 + 0.5)); continue; } - if (type == 't' && ass_enabled) { // plaintext subs with libass + if ((type == 't' || type == 'm') && ass_enabled) { // plaintext subs with libass sh_sub_t* sh = d_dvdsub->sh; ass_track = sh ? sh->ass_track : NULL; vo_sub = NULL;