# HG changeset patch # User eugeni # Date 1200087917 0 # Node ID e98ceb0190c19fd22910417466cbbf99fe9e6d4f # Parent 0190aa38aae26403d889b1b78801a738a48525ad Move all subtitle parsing from mkv demuxer to update_subtitles(). diff -r 0190aa38aae2 -r e98ceb0190c1 libmpdemux/demux_mkv.c --- a/libmpdemux/demux_mkv.c Fri Jan 11 21:45:15 2008 +0000 +++ b/libmpdemux/demux_mkv.c Fri Jan 11 21:45:17 2008 +0000 @@ -2702,8 +2702,6 @@ int64_t size, uint64_t block_duration, uint64_t timecode) { demux_packet_t *dp; - char *ptr1; - int i; if (block_duration == 0) { @@ -2712,28 +2710,9 @@ return; } -#ifdef USE_ASS - if (ass_enabled && track->subtitle_type == MATROSKA_SUBTYPE_SSA) { - ass_process_chunk(track->sh_sub->ass_track, block, size, (long long)timecode, (long long)block_duration); - return; - } -#endif - - ptr1 = block; - if (track->subtitle_type == MATROSKA_SUBTYPE_SSA) - { - /* Find text section. */ - for (i=0; i < 8 && *ptr1 != '\0'; ptr1++) - if (*ptr1 == ',') - i++; - if (*ptr1 == '\0') /* Broken line? */ - return; - } - sub_utf8 = 1; - size -= ptr1 - block; dp = new_demux_packet(size); - memcpy(dp->buffer, ptr1, size); + memcpy(dp->buffer, block, size); dp->pts = timecode / 1000.0f; dp->endpts = (timecode + block_duration) / 1000.0f; ds_add_packet(demuxer->sub, dp); diff -r 0190aa38aae2 -r e98ceb0190c1 mpcommon.c --- a/mpcommon.c Fri Jan 11 21:45:15 2008 +0000 +++ b/mpcommon.c Fri Jan 11 21:45:17 2008 +0000 @@ -28,11 +28,6 @@ int len; char type = d_dvdsub->sh ? ((sh_sub_t *)d_dvdsub->sh)->type : 'v'; static subtitle subs; - if (dvdsub_id >= 0 && type == 'a') -#ifdef USE_ASS - if (!ass_enabled) -#endif - type = 't'; if (reset) { sub_clear_text(&subs, MP_NOPTS_VALUE); if (vo_sub) { @@ -104,7 +99,7 @@ if (spudec_changed(vo_spudec)) vo_osd_changed(OSDTYPE_SPU); - } else if (dvdsub_id >= 0 && type == 't') { + } else if (dvdsub_id >= 0 && (type == 't' || type == 'a')) { double curpts = sh_video->pts + sub_delay; double endpts; vo_sub = &subs; @@ -115,7 +110,16 @@ endpts = d_dvdsub->first->endpts; len = ds_get_packet_sub(d_dvdsub, &packet); #ifdef USE_ASS - if (ass_enabled) { + if (type == 'a' && ass_enabled) { // ssa/ass subs with libass + sh_sub_t* sh = d_dvdsub->sh; + ass_track = sh ? sh->ass_track : NULL; + if (ass_track) + ass_process_chunk(ass_track, packet, len, + (long long)(pts*1000 + 0.5), + (long long)((endpts-pts)*1000 + 0.5)); + continue; + } + if (type == 't' && ass_enabled) { // plaintext subs with libass static ass_track_t *global_ass_track = NULL; if (!global_ass_track) global_ass_track = ass_default_track(ass_library); ass_track = global_ass_track; @@ -128,11 +132,23 @@ subs.end = endpts * 100; ass_process_subtitle(ass_track, &subs); } - } else + continue; + } #endif if (pts != MP_NOPTS_VALUE) { if (endpts == MP_NOPTS_VALUE) sub_clear_text(&subs, MP_NOPTS_VALUE); + if (type == 'a') { // ssa/ass subs without libass => convert to plaintext + int i; + unsigned char* p = packet; + for (i=0; i < 8 && *p != '\0'; p++) + if (*p == ',') + i++; + if (*p == '\0') /* Broken line? */ + continue; + len -= p - packet; + packet = p; + } sub_add_text(&subs, packet, len, endpts); vo_osd_changed(OSDTYPE_SUBTITLE); }