Another round of subtitle code cleanup

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@22155 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
reimar 2007-02-05 18:25:28 +00:00
parent ec7dd2435e
commit de73d4dd97
3 changed files with 47 additions and 60 deletions

View File

@ -166,8 +166,6 @@ typedef struct mkv_demuxer
uint64_t tc_scale, cluster_tc, first_tc;
int has_first_tc;
subtitle subs;
uint64_t cluster_size;
uint64_t blockgroup_size;
@ -523,7 +521,6 @@ demux_mkv_parse_idx (mkv_track_t *t)
return 0;
memcpy(buf, t->private_data, t->private_size);
buf[t->private_size] = 0;
t->sh_sub.type = 'v';
t->sh_sub.has_palette = 0;
pos = buf;
@ -2376,8 +2373,6 @@ demux_mkv_parse_ass_data (demuxer_t *demuxer)
track->subtitle_type == MATROSKA_SUBTYPE_VOBSUB)
continue;
track->sh_sub.type = 'a';
if (track->subtitle_type == MATROSKA_SUBTYPE_SSA)
{
track->sh_sub.ass_track = ass_new_track(ass_library);
@ -2391,10 +2386,6 @@ demux_mkv_parse_ass_data (demuxer_t *demuxer)
}
ass_process_codec_private(track->sh_sub.ass_track, track->private_data, track->private_size);
}
else
{
track->sh_sub.ass_track = ass_default_track(ass_library);
}
}
}
#endif
@ -2405,15 +2396,13 @@ 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)
{
track->sh_sub.type = 't';
if (track->subtitle_type == MATROSKA_SUBTYPE_VOBSUB)
track->sh_sub.type = 'v';
if (track->subtitle_type == MATROSKA_SUBTYPE_SSA)
track->sh_sub.type = 'a';
if (sh)
memcpy(sh, &track->sh_sub, sizeof(sh_sub_t));
}
}
}
else
{
@ -2717,9 +2706,6 @@ demux_mkv_open (demuxer_t *demuxer)
return DEMUXER_TYPE_MATROSKA;
}
static void
clear_subtitles(demuxer_t *demuxer, uint64_t timecode, int clear_all);
static void
demux_close_mkv (demuxer_t *demuxer)
{
@ -2731,7 +2717,6 @@ demux_close_mkv (demuxer_t *demuxer)
#ifdef USE_ICONV
subcp_close();
#endif
clear_subtitles(demuxer, 0, 1);
free_cached_dps (demuxer);
if (mkv_d->tracks)
{
@ -2853,6 +2838,7 @@ handle_subtitles(demuxer_t *demuxer, mkv_track_t *track, char *block,
int64_t size, uint64_t block_duration, uint64_t timecode)
{
mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
demux_packet_t *dp;
char *ptr1;
int i;
@ -2868,9 +2854,6 @@ handle_subtitles(demuxer_t *demuxer, mkv_track_t *track, char *block,
ass_process_chunk(track->sh_sub.ass_track, block, size, (long long)timecode, (long long)block_duration);
return;
}
// Use code below only to parse this single sub, old subs timed in libass
if (ass_enabled)
clear_subtitles(demuxer, timecode, 1);
#endif
ptr1 = block;
@ -2885,27 +2868,12 @@ handle_subtitles(demuxer_t *demuxer, mkv_track_t *track, char *block,
}
sub_utf8 = 1;
sub_add_text(&mkv_d->subs, ptr1, size - (ptr1 - block),
(timecode + block_duration) / 1000.0f);
#ifdef USE_ASS
if (ass_enabled) {
mkv_d->subs.start = timecode / 10;
mkv_d->subs.end = (timecode + block_duration) / 10;
ass_process_subtitle(track->sh_sub.ass_track, &mkv_d->subs);
return;
}
#endif
vo_sub = &mkv_d->subs;
vo_osd_changed (OSDTYPE_SUBTITLE);
}
static void
clear_subtitles(demuxer_t *demuxer, uint64_t timecode, int clear_all)
{
mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
double pts = clear_all ? MP_NOPTS_VALUE : (timecode / 1000.0f);
if (sub_clear_text(&mkv_d->subs, pts))
vo_osd_changed(OSDTYPE_SUBTITLE);
size -= ptr1 - block;
dp = new_demux_packet(size);
memcpy(dp->buffer, ptr1, size);
dp->pts = timecode / 1000.0f;
dp->endpts = (timecode + block_duration) / 1000.0f;
ds_add_packet(demuxer->sub, dp);
}
// Taken from demux_real.c. Thanks to the original developpers :)
@ -3241,8 +3209,6 @@ handle_block (demuxer_t *demuxer, uint8_t *block, uint64_t length,
}
current_pts = tc / 1000.0;
clear_subtitles(demuxer, tc, 0);
for (i=0; i<mkv_d->num_tracks; i++)
if (mkv_d->tracks[i]->tnum == num) {
track = mkv_d->tracks[i];
@ -3628,10 +3594,6 @@ demux_mkv_seek (demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int
mkv_d->skip_to_timecode = target_timecode;
mkv_d->a_skip_to_keyframe = 1;
/* Clear subtitles. */
if (target_timecode <= mkv_d->last_pts * 1000)
clear_subtitles(demuxer, 0, 1);
demux_mkv_fill_buffer(demuxer, NULL);
}
else if ((demuxer->movi_end <= 0) || !(flags & 1))
@ -3670,10 +3632,6 @@ demux_mkv_seek (demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int
mkv_d->skip_to_timecode = index->timecode;
mkv_d->a_skip_to_keyframe = 1;
/* Clear subtitles. */
if (index->timecode <= mkv_d->last_pts * 1000)
clear_subtitles(demuxer, 0, 1);
demux_mkv_fill_buffer(demuxer, NULL);
}
}

View File

@ -85,6 +85,7 @@
typedef struct demux_packet_st {
int len;
double pts;
double endpts;
double stream_pts;
off_t pos; // position in index (AVI) or file (MPG)
unsigned char* buffer;
@ -212,6 +213,7 @@ inline static demux_packet_t* new_demux_packet(int len){
// still using 0 by default in case there is some code that uses 0 for both
// unknown and a valid pts value
dp->pts=correct_pts ? MP_NOPTS_VALUE : 0;
dp->endpts=MP_NOPTS_VALUE;
dp->stream_pts = MP_NOPTS_VALUE;
dp->pos=0;
dp->flags=0;

View File

@ -2899,6 +2899,11 @@ static void update_subtitles(void)
unsigned char *packet=NULL;
int len;
char type = d_dvdsub->sh ? ((sh_sub_t *)d_dvdsub->sh)->type : 'v';
if (type == 'a')
#ifdef USE_ASS
if (!ass_enabled)
#endif
type = 't';
// find sub
if (subdata) {
double pts = sh_video->pts;
@ -2959,21 +2964,43 @@ static void update_subtitles(void)
if (spudec_changed(vo_spudec))
vo_osd_changed(OSDTYPE_SPU);
} else if (dvdsub_id >= 0 && type == 't') {
static subtitle subs;
double curpts = sh_video->pts + sub_delay;
double pts = MP_NOPTS_VALUE;
double endpts;
vo_sub = &subs;
while (d_dvdsub->first) {
double nextpts = ds_get_next_pts(d_dvdsub);
if (nextpts == MP_NOPTS_VALUE || nextpts - sub_delay > sh_video->pts)
if (nextpts == MP_NOPTS_VALUE || nextpts > curpts)
break;
endpts = d_dvdsub->first->endpts;
len = ds_get_packet_sub(d_dvdsub, &packet);
pts = nextpts - sub_delay;
pts = nextpts;
}
#ifdef USE_ASS
if (ass_enabled) {
static global_ass_track = NULL;
sh_sub_t *sh = (sh_sub_t *)d_dvdsub->sh;
if (!global_ass_track) global_ass_track = ass_default_track(ass_library);
ass_track = global_ass_track;
vo_sub = NULL;
if (pts != MP_NOPTS_VALUE) {
if (endpts == MP_NOPTS_VALUE) endpts = pts + 3;
sub_clear_text(&subs, MP_NOPTS_VALUE);
sub_add_text(&subs, packet, len, endpts);
subs.start = pts * 100;
subs.end = endpts * 100;
ass_process_subtitle(ass_track, &subs);
}
} else
#endif
if (pts != MP_NOPTS_VALUE) {
static subtitle subs;
if (endpts == MP_NOPTS_VALUE)
sub_clear_text(&subs, MP_NOPTS_VALUE);
sub_add_text(&subs, packet, len, MP_NOPTS_VALUE);
vo_sub = &subs;
sub_add_text(&subs, packet, len, endpts);
vo_osd_changed(OSDTYPE_SUBTITLE);
} else if (sub_clear_text(&subs, curpts))
vo_osd_changed(OSDTYPE_SUBTITLE);
}
}
current_module=NULL;
}