diff options
author | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2011-01-26 20:42:15 +0200 |
---|---|---|
committer | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2011-01-26 20:42:15 +0200 |
commit | f50f34245efa1012855a693558680bcfb7c348e5 (patch) | |
tree | 76e8fc186a96fdc1106b5c634d5937e514a06037 /libmpdemux | |
parent | ec55a188e4d0232acd50fcabc0a3db3be2b9538e (diff) | |
parent | c9026cb3210205b07e2e068467a18ee40f9259a3 (diff) | |
download | mpv-f50f34245efa1012855a693558680bcfb7c348e5.tar.bz2 mpv-f50f34245efa1012855a693558680bcfb7c348e5.tar.xz |
Merge branch 'sub'
* sub:
sub/OSD: move some related files to sub/
subtitles: options: enable -ass by default
subtitles: change default libass rendering style
demux_mkv, chapters: change millisecond arithmetic to ns
cleanup: rename ass_* functions to mp_ass_*
subs: use correct font aspect ratio for libass + converted subs
cleanup: some random minor code simplification and cleanup
vf_vo: fix EOSD change detection bug
sd_ass: remove subreader use, support plaintext markup
subtitles: style support for common SubRip tags and MicroDVD
core: ordered chapters: fix bad subtitle parameter
subs/demux: don't try to enable sub track when creating it
subtitles/demux: store duration instead of endpts in demux packets
subtitles: add framework for subtitle decoders
options: add special -leak-report option
subtitles: remove code trying to handle text subs with libavcodec
cleanup: move MP_NOPTS_VALUE definition to mpcommon.h
subtitles: move global ass_track to struct osd_state
core: move most mpcommon.c contents to mplayer.c
core: move global "subdata" and "vo_sub_last" to mpctx
subtitles: remove sub_last_pts hack
options: move -noconfig to option struct, simplify
Diffstat (limited to 'libmpdemux')
-rw-r--r-- | libmpdemux/demux_lavf.c | 10 | ||||
-rw-r--r-- | libmpdemux/demux_mkv.c | 64 | ||||
-rw-r--r-- | libmpdemux/demux_mov.c | 2 | ||||
-rw-r--r-- | libmpdemux/demux_ogg.c | 4 | ||||
-rw-r--r-- | libmpdemux/demux_ty.c | 2 | ||||
-rw-r--r-- | libmpdemux/demux_ty_osd.c | 4 | ||||
-rw-r--r-- | libmpdemux/demuxer.c | 38 | ||||
-rw-r--r-- | libmpdemux/demuxer.h | 6 | ||||
-rw-r--r-- | libmpdemux/stheader.h | 5 | ||||
-rw-r--r-- | libmpdemux/video.c | 2 |
10 files changed, 53 insertions, 84 deletions
diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c index 7f665a86bb..6a32240ebd 100644 --- a/libmpdemux/demux_lavf.c +++ b/libmpdemux/demux_lavf.c @@ -36,7 +36,7 @@ #include "demuxer.h" #include "stheader.h" #include "m_option.h" -#include "libvo/sub.h" +#include "sub/sub.h" #include "libavformat/avformat.h" #include "libavformat/avio.h" @@ -588,8 +588,8 @@ static demuxer_t* demux_open_lavf(demuxer_t *demuxer){ for(i=0; i < avfc->nb_chapters; i++) { AVChapter *c = avfc->chapters[i]; - uint64_t start = av_rescale_q(c->start, c->time_base, (AVRational){1,1000}); - uint64_t end = av_rescale_q(c->end, c->time_base, (AVRational){1,1000}); + uint64_t start = av_rescale_q(c->start, c->time_base, (AVRational){1,1000000000}); + uint64_t end = av_rescale_q(c->end, c->time_base, (AVRational){1,1000000000}); t = av_metadata_get(c->metadata, "title", NULL, 0); demuxer_add_chapter(demuxer, t ? BSTR(t->value) : BSTR(NULL), start, end); } @@ -756,11 +756,11 @@ static int demux_lavf_fill_buffer(demuxer_t *demux, demux_stream_t *dsds){ if(ts != AV_NOPTS_VALUE){ dp->pts = ts * av_q2d(priv->avfc->streams[id]->time_base); priv->last_pts= dp->pts * AV_TIME_BASE; - // always set endpts for subtitles, even if PKT_FLAG_KEY is not set, + // always set duration for subtitles, even if PKT_FLAG_KEY is not set, // otherwise they will stay on screen to long if e.g. ASS is demuxed from mkv if((ds == demux->sub || (pkt.flags & PKT_FLAG_KEY)) && pkt.convergence_duration > 0) - dp->endpts = dp->pts + pkt.convergence_duration * av_q2d(priv->avfc->streams[id]->time_base); + dp->duration = pkt.convergence_duration * av_q2d(priv->avfc->streams[id]->time_base); } dp->pos=demux->filepos; dp->flags= !!(pkt.flags&PKT_FLAG_KEY); diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c index 2414b01b4b..7432b59d46 100644 --- a/libmpdemux/demux_mkv.c +++ b/libmpdemux/demux_mkv.c @@ -41,11 +41,7 @@ #include "mp_msg.h" -#include "vobsub.h" -#include "subreader.h" -#include "libvo/sub.h" - -#include "ass_mp.h" +#include "sub/sub.h" #include "libavutil/common.h" @@ -184,7 +180,7 @@ typedef struct mkv_demuxer { } *cluster_positions; int num_cluster_pos; - int64_t skip_to_timecode; + uint64_t skip_to_timecode; int v_skip_to_keyframe, a_skip_to_keyframe; int num_audio_tracks; @@ -786,8 +782,8 @@ static int demux_mkv_read_chapters(struct demuxer *demuxer) if (!ca->n_chapter_time_start) mp_msg(MSGT_DEMUX, warn_level, "[mkv] Chapter lacks start time\n"); - chapter.start = ca->chapter_time_start / 1000000; - chapter.end = ca->chapter_time_end / 1000000; + chapter.start = ca->chapter_time_start; + chapter.end = ca->chapter_time_end; if (ca->n_chapter_display) { if (ca->n_chapter_display > 1) @@ -824,14 +820,14 @@ static int demux_mkv_read_chapters(struct demuxer *demuxer) mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Chapter %u from %02d:%02d:%02d.%03d " "to %02d:%02d:%02d.%03d, %.*s\n", i, - (int) (chapter.start / 60 / 60 / 1000), - (int) ((chapter.start / 60 / 1000) % 60), - (int) ((chapter.start / 1000) % 60), - (int) (chapter.start % 1000), - (int) (chapter.end / 60 / 60 / 1000), - (int) ((chapter.end / 60 / 1000) % 60), - (int) ((chapter.end / 1000) % 60), - (int) (chapter.end % 1000), + (int) (chapter.start / 60 / 60 / 1000000000), + (int) ((chapter.start / 60 / 1000000000) % 60), + (int) ((chapter.start / 1000000000) % 60), + (int) (chapter.start % 1000000000), + (int) (chapter.end / 60 / 60 / 1000000000), + (int) ((chapter.end / 60 / 1000000000) % 60), + (int) ((chapter.end / 1000000000) % 60), + (int) (chapter.end % 1000000000), BSTR_P(name)); if (idx == selected_edition){ @@ -1883,13 +1879,13 @@ static void handle_subtitles(demuxer_t *demuxer, mkv_track_t *track, sub_utf8 = 1; dp = new_demux_packet(size); memcpy(dp->buffer, block, size); - dp->pts = timecode / 1000.0; - dp->endpts = (timecode + block_duration) / 1000.0; + dp->pts = timecode / 1e9; + dp->duration = block_duration / 1e9; ds_add_packet(demuxer->sub, dp); } static void handle_realvideo(demuxer_t *demuxer, mkv_track_t *track, - uint8_t *buffer, uint32_t size, int block_bref) + uint8_t *buffer, uint32_t size, int64_t block_bref) { mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; demux_packet_t *dp; @@ -1915,7 +1911,7 @@ static void handle_realvideo(demuxer_t *demuxer, mkv_track_t *track, } static void handle_realaudio(demuxer_t *demuxer, mkv_track_t *track, - uint8_t *buffer, uint32_t size, int block_bref) + uint8_t *buffer, uint32_t size, int64_t block_bref) { mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; int sps = track->sub_packet_size; @@ -2028,7 +2024,7 @@ static int handle_block(demuxer_t *demuxer, uint8_t *block, uint64_t length, mkv_track_t *track = NULL; demux_stream_t *ds = NULL; uint64_t old_length; - int64_t tc; + uint64_t tc; uint32_t *lace_size; uint8_t laces, flags; int i, num, tmp, use_this_block = 1; @@ -2048,10 +2044,8 @@ static int handle_block(demuxer_t *demuxer, uint8_t *block, uint64_t length, return 0; block += old_length - length; - tc = (time * mkv_d->tc_scale + mkv_d->cluster_tc) / 1000000.0 + 0.5; - if (tc < 0) - tc = 0; - current_pts = tc / 1000.0; + tc = time * mkv_d->tc_scale + mkv_d->cluster_tc; + current_pts = tc / 1e9; for (i = 0; i < mkv_d->num_tracks; i++) if (mkv_d->tracks[i]->tnum == num) { @@ -2080,7 +2074,7 @@ static int handle_block(demuxer_t *demuxer, uint8_t *block, uint64_t length, sh_audio_t *sh = (sh_audio_t *) ds->sh; if (block_duration != 0) { - sh->i_bps = length * 1000 / block_duration; + sh->i_bps = length * 1e9 / block_duration; track->fix_i_bps = 0; } else if (track->qt_last_a_pts == 0.0) track->qt_last_a_pts = current_pts; @@ -2186,8 +2180,7 @@ static int demux_mkv_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds) free(block); return 0; } - block_duration = - block_duration * mkv_d->tc_scale / 1000000.0 + 0.5; + block_duration *= mkv_d->tc_scale; break; case MATROSKA_ID_BLOCK: @@ -2387,7 +2380,7 @@ static struct mkv_index *seek_with_cues(struct demuxer *demuxer, int seek_id, * target time after the last entry - then still seek to the first/last * entry if that's further in the direction wanted than mkv_d->last_pts. */ - int64_t min_diff = target_timecode - mkv_d->last_pts * 1000; + int64_t min_diff = target_timecode - (int64_t)(mkv_d->last_pts * 1e9 + 0.5); if (flags & SEEK_BACKWARD) min_diff = -min_diff; min_diff = FFMAX(min_diff, 1); @@ -2395,8 +2388,7 @@ static struct mkv_index *seek_with_cues(struct demuxer *demuxer, int seek_id, if (seek_id < 0 || mkv_d->indexes[i].tnum == seek_id) { int64_t diff = target_timecode - - (int64_t) (mkv_d->indexes[i].timecode * - mkv_d->tc_scale / 1000000.0 + 0.5); + (int64_t) (mkv_d->indexes[i].timecode * mkv_d->tc_scale); if (flags & SEEK_BACKWARD) diff = -diff; if (diff <= 0) { @@ -2442,9 +2434,8 @@ static void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs, if (!(flags & SEEK_ABSOLUTE)) /* relative seek */ rel_seek_secs += mkv_d->last_pts; - int64_t target_timecode = rel_seek_secs * 1000.0; - if (target_timecode < 0) - target_timecode = 0; + rel_seek_secs = FFMAX(rel_seek_secs, 0); + int64_t target_timecode = rel_seek_secs * 1e9 + 0.5; if (mkv_d->indexes == NULL) { /* no index was found */ if (seek_creating_index(demuxer, rel_seek_secs, flags) < 0) @@ -2462,7 +2453,8 @@ static void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs, if (flags & SEEK_FORWARD) mkv_d->skip_to_timecode = target_timecode; else - mkv_d->skip_to_timecode = index ? index->timecode : 0; + mkv_d->skip_to_timecode = index ? index->timecode * mkv_d->tc_scale + : 0; mkv_d->a_skip_to_keyframe = 1; demux_mkv_fill_buffer(demuxer, NULL); @@ -2496,7 +2488,7 @@ static void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs, if (demuxer->video->id >= 0) mkv_d->v_skip_to_keyframe = 1; - mkv_d->skip_to_timecode = index->timecode; + mkv_d->skip_to_timecode = index->timecode * mkv_d->tc_scale; mkv_d->a_skip_to_keyframe = 1; demux_mkv_fill_buffer(demuxer, NULL); diff --git a/libmpdemux/demux_mov.c b/libmpdemux/demux_mov.c index 3175ae34bd..5ecb076698 100644 --- a/libmpdemux/demux_mov.c +++ b/libmpdemux/demux_mov.c @@ -64,7 +64,7 @@ #include "libavutil/common.h" #include "ffmpeg_files/intreadwrite.h" -#include "libvo/sub.h" +#include "sub/sub.h" #include "demux_mov.h" #include "qtpalette.h" diff --git a/libmpdemux/demux_ogg.c b/libmpdemux/demux_ogg.c index 1883c36cd1..3ba2627414 100644 --- a/libmpdemux/demux_ogg.c +++ b/libmpdemux/demux_ogg.c @@ -166,8 +166,8 @@ typedef struct ogg_demuxer { //-------- subtitle support - should be moved to decoder layer, and queue // - subtitles up in demuxer buffer... -#include "subreader.h" -#include "libvo/sub.h" +#include "sub/subreader.h" +#include "sub/sub.h" #define OGG_SUB_MAX_LINE 128 static subtitle ogg_sub; diff --git a/libmpdemux/demux_ty.c b/libmpdemux/demux_ty.c index 5d6958a970..4309ad1387 100644 --- a/libmpdemux/demux_ty.c +++ b/libmpdemux/demux_ty.c @@ -44,7 +44,7 @@ #include "demux_ty_osd.h" #include "parse_es.h" #include "stheader.h" -#include "sub_cc.h" +#include "sub/sub_cc.h" #include "libavutil/avstring.h" #include "ffmpeg_files/intreadwrite.h" diff --git a/libmpdemux/demux_ty_osd.c b/libmpdemux/demux_ty_osd.c index 0d419b0813..983c243f98 100644 --- a/libmpdemux/demux_ty_osd.c +++ b/libmpdemux/demux_ty_osd.c @@ -23,8 +23,8 @@ //#include "stheader.h" //#include "mp3_hdr.h" //#include "subreader.h" -#include "sub_cc.h" -#include "libvo/sub.h" +#include "sub/sub_cc.h" +#include "sub/sub.h" #include "demux_ty_osd.h" //#include "dvdauth.h" diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c index 056822e1ab..6607f2399f 100644 --- a/libmpdemux/demuxer.c +++ b/libmpdemux/demuxer.c @@ -43,8 +43,6 @@ #include "libmpcodecs/dec_teletext.h" #include "libmpcodecs/vd_ffmpeg.h" -#include "ass_mp.h" - #ifdef CONFIG_FFMPEG #include "libavcodec/avcodec.h" #if MP_INPUT_BUFFER_PADDING_SIZE < FF_INPUT_BUFFER_PADDING_SIZE @@ -188,7 +186,7 @@ struct demux_packet *new_demux_packet(size_t len) dp->len = len; dp->next = NULL; dp->pts = MP_NOPTS_VALUE; - dp->endpts = MP_NOPTS_VALUE; + dp->duration = -1; dp->stream_pts = MP_NOPTS_VALUE; dp->pos = 0; dp->flags = 0; @@ -351,10 +349,6 @@ sh_sub_t *new_sh_sub_sid(demuxer_t *demuxer, int id, int sid) sh->opts = demuxer->opts; mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SUBTITLE_ID=%d\n", sid); } - if (sid == demuxer->opts->sub_id) { - demuxer->sub->id = id; - demuxer->sub->sh = demuxer->s_streams[id]; - } return demuxer->s_streams[id]; } @@ -373,10 +367,6 @@ static void free_sh_sub(sh_sub_t *sh) { mp_msg(MSGT_DEMUXER, MSGL_DBG2, "DEMUXER: freeing sh_sub at %p\n", sh); free(sh->extradata); -#ifdef CONFIG_ASS - if (sh->ass_track) - ass_free_track(sh->ass_track); -#endif free(sh->lang); #ifdef CONFIG_FFMPEG clear_parser((sh_common_t *)sh); @@ -1076,20 +1066,6 @@ static struct demuxer *demux_open_stream(struct MPOpts *opts, sh_video->fps, sh_video->i_bps * 0.008f, sh_video->i_bps / 1024.0f); } -#ifdef CONFIG_ASS - if (opts->ass_enabled && ass_library) { - for (int i = 0; i < MAX_S_STREAMS; ++i) { - sh_sub_t *sh = demuxer->s_streams[i]; - if (sh && sh->type == 'a') { - sh->ass_track = ass_new_track(ass_library); - if (sh->ass_track && sh->extradata) - ass_process_codec_private(sh->ass_track, sh->extradata, - sh->extradata_len); - } else if (sh && sh->type != 'v') - sh->ass_track = ass_default_track(ass_library); - } - } -#endif return demuxer; } @@ -1418,9 +1394,9 @@ int demuxer_add_chapter(demuxer_t *demuxer, struct bstr name, talloc_strdup(demuxer->chapters, mp_gtext("unknown")); mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CHAPTER_ID=%d\n", demuxer->num_chapters); - mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CHAPTER_%d_START=%"PRIu64"\n", demuxer->num_chapters, start); + mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CHAPTER_%d_START=%"PRIu64"\n", demuxer->num_chapters, start / 1000000); if (end) - mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CHAPTER_%d_END=%"PRIu64"\n", demuxer->num_chapters, end); + mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CHAPTER_%d_END=%"PRIu64"\n", demuxer->num_chapters, end / 1000000); if (name.start) mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CHAPTER_%d_NAME=%.*s\n", demuxer->num_chapters, BSTR_P(name)); @@ -1473,7 +1449,7 @@ int demuxer_seek_chapter(demuxer_t *demuxer, int chapter, double *seek_pts, if (chapter < 0) chapter = 0; - *seek_pts = demuxer->chapters[chapter].start / 1000.0; + *seek_pts = demuxer->chapters[chapter].start / 1e9; if (chapter_name) *chapter_name = talloc_strdup(NULL, demuxer->chapters[chapter].name); @@ -1490,7 +1466,7 @@ int demuxer_get_current_chapter(demuxer_t *demuxer, double time_now) &chapter) == STREAM_UNSUPPORTED) chapter = -2; } else { - uint64_t now = time_now * 1000 + 0.5; + uint64_t now = time_now * 1e9 + 0.5; for (chapter = demuxer->num_chapters - 1; chapter >= 0; --chapter) { if (demuxer->chapters[chapter].start <= now) break; @@ -1533,8 +1509,8 @@ float demuxer_chapter_time(demuxer_t *demuxer, int chapter, float *end) if (demuxer->num_chapters && demuxer->chapters && chapter >= 0 && chapter < demuxer->num_chapters) { if (end) - *end = demuxer->chapters[chapter].end / 1000.0; - return demuxer->chapters[chapter].start / 1000.0; + *end = demuxer->chapters[chapter].end / 1e9; + return demuxer->chapters[chapter].start / 1e9; } return -1.0; } diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h index 742e42aa74..e66b8f8a12 100644 --- a/libmpdemux/demuxer.h +++ b/libmpdemux/demuxer.h @@ -27,6 +27,7 @@ #include "stream/stream.h" #include "bstr.h" +#include "mpcommon.h" struct MPOpts; @@ -96,9 +97,6 @@ struct MPOpts; // A virtual demuxer type for the network code #define DEMUXER_TYPE_PLAYLIST (2<<16) - -#define MP_NOPTS_VALUE (-1LL<<63) //both int64_t and double should be able to represent this exactly - enum timestamp_type { TIMESTAMP_TYPE_PTS, TIMESTAMP_TYPE_SORT, @@ -129,7 +127,7 @@ enum timestamp_type { typedef struct demux_packet { int len; double pts; - double endpts; + double duration; double stream_pts; off_t pos; // position in index (AVI) or file (MPG) unsigned char* buffer; diff --git a/libmpdemux/stheader.h b/libmpdemux/stheader.h index 4bb2da3ac7..dc84518abc 100644 --- a/libmpdemux/stheader.h +++ b/libmpdemux/stheader.h @@ -19,6 +19,8 @@ #ifndef MPLAYER_STHEADER_H #define MPLAYER_STHEADER_H +#include <stdbool.h> + #include "aviheader.h" #include "ms_hdr.h" struct MPOpts; @@ -135,9 +137,10 @@ typedef struct sh_sub { SH_COMMON int sid; char type; // t = text, v = VobSub, a = SSA/ASS + bool active; // after track switch decoder may stay initialized, not active unsigned char* extradata; // extra header data passed from demuxer int extradata_len; - struct ass_track *ass_track; // for SSA/ASS streams (type == 'a') + const struct sd_functions *sd_driver; } sh_sub_t; // demuxer.c: diff --git a/libmpdemux/video.c b/libmpdemux/video.c index bda6e661ae..400a995d57 100644 --- a/libmpdemux/video.c +++ b/libmpdemux/video.c @@ -38,7 +38,7 @@ #include "mpeg_hdr.h" /* sub_cc (closed captions)*/ -#include "sub_cc.h" +#include "sub/sub_cc.h" /* biCompression constant */ #define BI_RGB 0L |