mirror of https://github.com/mpv-player/mpv
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:
parent
ec7dd2435e
commit
de73d4dd97
|
@ -166,8 +166,6 @@ typedef struct mkv_demuxer
|
||||||
uint64_t tc_scale, cluster_tc, first_tc;
|
uint64_t tc_scale, cluster_tc, first_tc;
|
||||||
int has_first_tc;
|
int has_first_tc;
|
||||||
|
|
||||||
subtitle subs;
|
|
||||||
|
|
||||||
uint64_t cluster_size;
|
uint64_t cluster_size;
|
||||||
uint64_t blockgroup_size;
|
uint64_t blockgroup_size;
|
||||||
|
|
||||||
|
@ -523,7 +521,6 @@ demux_mkv_parse_idx (mkv_track_t *t)
|
||||||
return 0;
|
return 0;
|
||||||
memcpy(buf, t->private_data, t->private_size);
|
memcpy(buf, t->private_data, t->private_size);
|
||||||
buf[t->private_size] = 0;
|
buf[t->private_size] = 0;
|
||||||
t->sh_sub.type = 'v';
|
|
||||||
t->sh_sub.has_palette = 0;
|
t->sh_sub.has_palette = 0;
|
||||||
|
|
||||||
pos = buf;
|
pos = buf;
|
||||||
|
@ -2376,8 +2373,6 @@ demux_mkv_parse_ass_data (demuxer_t *demuxer)
|
||||||
track->subtitle_type == MATROSKA_SUBTYPE_VOBSUB)
|
track->subtitle_type == MATROSKA_SUBTYPE_VOBSUB)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
track->sh_sub.type = 'a';
|
|
||||||
|
|
||||||
if (track->subtitle_type == MATROSKA_SUBTYPE_SSA)
|
if (track->subtitle_type == MATROSKA_SUBTYPE_SSA)
|
||||||
{
|
{
|
||||||
track->sh_sub.ass_track = ass_new_track(ass_library);
|
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);
|
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
|
#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)
|
if (track->subtitle_type != MATROSKA_SUBTYPE_UNKNOWN)
|
||||||
{
|
{
|
||||||
sh_sub_t *sh = new_sh_sub_sid(demuxer, track->tnum, sid);
|
sh_sub_t *sh = new_sh_sub_sid(demuxer, track->tnum, sid);
|
||||||
if ((track->subtitle_type == MATROSKA_SUBTYPE_VOBSUB) ||
|
track->sh_sub.type = 't';
|
||||||
(track->subtitle_type == MATROSKA_SUBTYPE_SSA))
|
if (track->subtitle_type == MATROSKA_SUBTYPE_VOBSUB)
|
||||||
{
|
track->sh_sub.type = 'v';
|
||||||
if (track->private_data != NULL)
|
if (track->subtitle_type == MATROSKA_SUBTYPE_SSA)
|
||||||
{
|
track->sh_sub.type = 'a';
|
||||||
if (sh)
|
if (sh)
|
||||||
memcpy(sh, &track->sh_sub, sizeof(sh_sub_t));
|
memcpy(sh, &track->sh_sub, sizeof(sh_sub_t));
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2717,9 +2706,6 @@ demux_mkv_open (demuxer_t *demuxer)
|
||||||
return DEMUXER_TYPE_MATROSKA;
|
return DEMUXER_TYPE_MATROSKA;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
clear_subtitles(demuxer_t *demuxer, uint64_t timecode, int clear_all);
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
demux_close_mkv (demuxer_t *demuxer)
|
demux_close_mkv (demuxer_t *demuxer)
|
||||||
{
|
{
|
||||||
|
@ -2731,7 +2717,6 @@ demux_close_mkv (demuxer_t *demuxer)
|
||||||
#ifdef USE_ICONV
|
#ifdef USE_ICONV
|
||||||
subcp_close();
|
subcp_close();
|
||||||
#endif
|
#endif
|
||||||
clear_subtitles(demuxer, 0, 1);
|
|
||||||
free_cached_dps (demuxer);
|
free_cached_dps (demuxer);
|
||||||
if (mkv_d->tracks)
|
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)
|
int64_t size, uint64_t block_duration, uint64_t timecode)
|
||||||
{
|
{
|
||||||
mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
|
mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
|
||||||
|
demux_packet_t *dp;
|
||||||
char *ptr1;
|
char *ptr1;
|
||||||
int i;
|
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);
|
ass_process_chunk(track->sh_sub.ass_track, block, size, (long long)timecode, (long long)block_duration);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Use code below only to parse this single sub, old subs timed in libass
|
|
||||||
if (ass_enabled)
|
|
||||||
clear_subtitles(demuxer, timecode, 1);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ptr1 = block;
|
ptr1 = block;
|
||||||
|
@ -2885,27 +2868,12 @@ handle_subtitles(demuxer_t *demuxer, mkv_track_t *track, char *block,
|
||||||
}
|
}
|
||||||
|
|
||||||
sub_utf8 = 1;
|
sub_utf8 = 1;
|
||||||
sub_add_text(&mkv_d->subs, ptr1, size - (ptr1 - block),
|
size -= ptr1 - block;
|
||||||
(timecode + block_duration) / 1000.0f);
|
dp = new_demux_packet(size);
|
||||||
#ifdef USE_ASS
|
memcpy(dp->buffer, ptr1, size);
|
||||||
if (ass_enabled) {
|
dp->pts = timecode / 1000.0f;
|
||||||
mkv_d->subs.start = timecode / 10;
|
dp->endpts = (timecode + block_duration) / 1000.0f;
|
||||||
mkv_d->subs.end = (timecode + block_duration) / 10;
|
ds_add_packet(demuxer->sub, dp);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Taken from demux_real.c. Thanks to the original developpers :)
|
// 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;
|
current_pts = tc / 1000.0;
|
||||||
|
|
||||||
clear_subtitles(demuxer, tc, 0);
|
|
||||||
|
|
||||||
for (i=0; i<mkv_d->num_tracks; i++)
|
for (i=0; i<mkv_d->num_tracks; i++)
|
||||||
if (mkv_d->tracks[i]->tnum == num) {
|
if (mkv_d->tracks[i]->tnum == num) {
|
||||||
track = mkv_d->tracks[i];
|
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->skip_to_timecode = target_timecode;
|
||||||
mkv_d->a_skip_to_keyframe = 1;
|
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);
|
demux_mkv_fill_buffer(demuxer, NULL);
|
||||||
}
|
}
|
||||||
else if ((demuxer->movi_end <= 0) || !(flags & 1))
|
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->skip_to_timecode = index->timecode;
|
||||||
mkv_d->a_skip_to_keyframe = 1;
|
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);
|
demux_mkv_fill_buffer(demuxer, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,6 +85,7 @@
|
||||||
typedef struct demux_packet_st {
|
typedef struct demux_packet_st {
|
||||||
int len;
|
int len;
|
||||||
double pts;
|
double pts;
|
||||||
|
double endpts;
|
||||||
double stream_pts;
|
double stream_pts;
|
||||||
off_t pos; // position in index (AVI) or file (MPG)
|
off_t pos; // position in index (AVI) or file (MPG)
|
||||||
unsigned char* buffer;
|
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
|
// still using 0 by default in case there is some code that uses 0 for both
|
||||||
// unknown and a valid pts value
|
// unknown and a valid pts value
|
||||||
dp->pts=correct_pts ? MP_NOPTS_VALUE : 0;
|
dp->pts=correct_pts ? MP_NOPTS_VALUE : 0;
|
||||||
|
dp->endpts=MP_NOPTS_VALUE;
|
||||||
dp->stream_pts = MP_NOPTS_VALUE;
|
dp->stream_pts = MP_NOPTS_VALUE;
|
||||||
dp->pos=0;
|
dp->pos=0;
|
||||||
dp->flags=0;
|
dp->flags=0;
|
||||||
|
|
39
mplayer.c
39
mplayer.c
|
@ -2899,6 +2899,11 @@ static void update_subtitles(void)
|
||||||
unsigned char *packet=NULL;
|
unsigned char *packet=NULL;
|
||||||
int len;
|
int len;
|
||||||
char type = d_dvdsub->sh ? ((sh_sub_t *)d_dvdsub->sh)->type : 'v';
|
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
|
// find sub
|
||||||
if (subdata) {
|
if (subdata) {
|
||||||
double pts = sh_video->pts;
|
double pts = sh_video->pts;
|
||||||
|
@ -2959,21 +2964,43 @@ static void update_subtitles(void)
|
||||||
if (spudec_changed(vo_spudec))
|
if (spudec_changed(vo_spudec))
|
||||||
vo_osd_changed(OSDTYPE_SPU);
|
vo_osd_changed(OSDTYPE_SPU);
|
||||||
} else if (dvdsub_id >= 0 && type == 't') {
|
} else if (dvdsub_id >= 0 && type == 't') {
|
||||||
|
static subtitle subs;
|
||||||
|
double curpts = sh_video->pts + sub_delay;
|
||||||
double pts = MP_NOPTS_VALUE;
|
double pts = MP_NOPTS_VALUE;
|
||||||
|
double endpts;
|
||||||
|
vo_sub = &subs;
|
||||||
while (d_dvdsub->first) {
|
while (d_dvdsub->first) {
|
||||||
double nextpts = ds_get_next_pts(d_dvdsub);
|
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;
|
break;
|
||||||
|
endpts = d_dvdsub->first->endpts;
|
||||||
len = ds_get_packet_sub(d_dvdsub, &packet);
|
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) {
|
if (pts != MP_NOPTS_VALUE) {
|
||||||
static subtitle subs;
|
if (endpts == MP_NOPTS_VALUE)
|
||||||
sub_clear_text(&subs, MP_NOPTS_VALUE);
|
sub_clear_text(&subs, MP_NOPTS_VALUE);
|
||||||
sub_add_text(&subs, packet, len, MP_NOPTS_VALUE);
|
sub_add_text(&subs, packet, len, endpts);
|
||||||
vo_sub = &subs;
|
vo_osd_changed(OSDTYPE_SUBTITLE);
|
||||||
|
} else if (sub_clear_text(&subs, curpts))
|
||||||
vo_osd_changed(OSDTYPE_SUBTITLE);
|
vo_osd_changed(OSDTYPE_SUBTITLE);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
current_module=NULL;
|
current_module=NULL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue