summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libmpdemux/demux_mov.c13
-rw-r--r--mpcommon.c10
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;