diff options
author | Uoti Urpala <uau@mplayer2.org> | 2011-08-04 08:38:39 +0300 |
---|---|---|
committer | Uoti Urpala <uau@mplayer2.org> | 2011-08-04 08:38:39 +0300 |
commit | 0ece360eeaf95f2c33df2c0177cb98ffd5fc0338 (patch) | |
tree | 3717c71405b255342f75008b8d357f421f9f24f0 /libmpdemux/demuxer.c | |
parent | 1f3ad329601486e2e2e36ddef4d79f0f486ddc99 (diff) | |
download | mpv-0ece360eeaf95f2c33df2c0177cb98ffd5fc0338.tar.bz2 mpv-0ece360eeaf95f2c33df2c0177cb98ffd5fc0338.tar.xz |
demux_mkv: skip files faster in ordered chapter file search
Ordered chapter code tries opening files to find those matching the
SegmentUID values specified in the timeline. Previously this scan did
a full initialization of the Matroska demuxer for each file, then
checked whether the UID value in the demuxer was a match. Make the
scan code instead provide a list of searched-for UIDs to the demuxer
open code, and make that do a comparison against the list as soon as
it sees the UID in the file, aborting if there is no match.
Also fix units used in "Merging timeline part" verbose message.
Diffstat (limited to 'libmpdemux/demuxer.c')
-rw-r--r-- | libmpdemux/demuxer.c | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c index ef3bd36e29..c59fd3fdc7 100644 --- a/libmpdemux/demuxer.c +++ b/libmpdemux/demuxer.c @@ -911,12 +911,14 @@ static struct demuxer *open_given_type(struct MPOpts *opts, const struct demuxer_desc *desc, struct stream *stream, bool force, int audio_id, int video_id, int sub_id, - char *filename) + char *filename, + struct demuxer_params *params) { struct demuxer *demuxer; int fformat; demuxer = new_demuxer(opts, stream, desc->type, audio_id, video_id, sub_id, filename); + demuxer->params = params; if (desc->check_file) fformat = desc->check_file(demuxer); else @@ -960,7 +962,7 @@ static struct demuxer *open_given_type(struct MPOpts *opts, return NULL; } return open_given_type(opts, desc, stream, false, audio_id, - video_id, sub_id, filename); + video_id, sub_id, filename, params); } fail: free_demuxer(demuxer); @@ -971,7 +973,8 @@ static struct demuxer *demux_open_stream(struct MPOpts *opts, struct stream *stream, int file_format, bool force, int audio_id, int video_id, int sub_id, - char *filename) + char *filename, + struct demuxer_params *params) { struct demuxer *demuxer = NULL; const struct demuxer_desc *desc; @@ -983,7 +986,7 @@ static struct demuxer *demux_open_stream(struct MPOpts *opts, // should only happen with obsolete -demuxer 99 numeric format return NULL; demuxer = open_given_type(opts, desc, stream, force, audio_id, - video_id, sub_id, filename); + video_id, sub_id, filename, params); if (demuxer) goto dmx_open; return NULL; @@ -993,7 +996,7 @@ static struct demuxer *demux_open_stream(struct MPOpts *opts, for (int i = 0; (desc = demuxer_list[i]); i++) { if (desc->safe_check) { demuxer = open_given_type(opts, desc, stream, false, audio_id, - video_id, sub_id, filename); + video_id, sub_id, filename, params); if (demuxer) goto dmx_open; } @@ -1006,7 +1009,7 @@ static struct demuxer *demux_open_stream(struct MPOpts *opts, desc = get_demuxer_desc_from_type(demuxer_type_by_filename(filename)); if (desc) demuxer = open_given_type(opts, desc, stream, false, audio_id, - video_id, sub_id, filename); + video_id, sub_id, filename, params); if (demuxer) goto dmx_open; } @@ -1015,7 +1018,7 @@ static struct demuxer *demux_open_stream(struct MPOpts *opts, for (int i = 0; (desc = demuxer_list[i]); i++) { if (!desc->safe_check && desc->check_file) { demuxer = open_given_type(opts, desc, stream, false, audio_id, - video_id, sub_id, filename); + video_id, sub_id, filename, params); if (demuxer) goto dmx_open; } @@ -1041,9 +1044,17 @@ static struct demuxer *demux_open_stream(struct MPOpts *opts, return demuxer; } -demuxer_t *demux_open(struct MPOpts *opts, stream_t *vs, int file_format, - int audio_id, int video_id, int dvdsub_id, - char *filename) +struct demuxer *demux_open(struct MPOpts *opts, stream_t *vs, int file_format, + int audio_id, int video_id, int sub_id, + char *filename) +{ + return demux_open_withparams(opts, vs, file_format, audio_id, video_id, + sub_id, filename, NULL); +} + +struct demuxer *demux_open_withparams(struct MPOpts *opts, stream_t *vs, + int file_format, int audio_id, int video_id, int dvdsub_id, + char *filename, struct demuxer_params *params) { stream_t *as = NULL, *ss = NULL; demuxer_t *vd, *ad = NULL, *sd = NULL; @@ -1108,7 +1119,8 @@ demuxer_t *demux_open(struct MPOpts *opts, stream_t *vs, int file_format, vd = demux_open_stream(opts, vs, demuxer_type ? demuxer_type : file_format, demuxer_force, opts->audio_stream ? -2 : audio_id, - video_id, opts->sub_stream ? -2 : dvdsub_id, filename); + video_id, opts->sub_stream ? -2 : dvdsub_id, + filename, params); if (!vd) { if (as) free_stream(as); @@ -1120,7 +1132,7 @@ demuxer_t *demux_open(struct MPOpts *opts, stream_t *vs, int file_format, ad = demux_open_stream(opts, as, audio_demuxer_type ? audio_demuxer_type : afmt, audio_demuxer_force, audio_id, -2, -2, - opts->audio_stream); + opts->audio_stream, params); if (!ad) { mp_tmsg(MSGT_DEMUXER, MSGL_WARN, "Failed to open audio demuxer: %s\n", opts->audio_stream); @@ -1133,7 +1145,7 @@ demuxer_t *demux_open(struct MPOpts *opts, stream_t *vs, int file_format, sd = demux_open_stream(opts, ss, sub_demuxer_type ? sub_demuxer_type : sfmt, sub_demuxer_force, -2, -2, dvdsub_id, - opts->sub_stream); + opts->sub_stream, params); if (!sd) { mp_tmsg(MSGT_DEMUXER, MSGL_WARN, "Failed to open subtitle demuxer: %s\n", opts->sub_stream); |