From 1cebd16350229d2ab1441f5061079ce9240fb22f Mon Sep 17 00:00:00 2001 From: wm4 Date: Sun, 2 Nov 2014 16:47:23 +0100 Subject: player: add --chapters-file option Note that you can't pass .cue or .edl files to it, at least not yet. Requested in context of allowing to specify custom chapters. For that to work well, we probably need to add some sort of chapter metadata pseudo-demuxer. --- DOCS/man/options.rst | 4 ++++ options/options.c | 2 ++ options/options.h | 1 + player/loadfile.c | 30 +++++++++++++++++++++++++----- 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst index ee84169609..440647f448 100644 --- a/DOCS/man/options.rst +++ b/DOCS/man/options.rst @@ -247,6 +247,10 @@ Playback Control Note: a playlist can be as simple as a text file containing filenames separated by newlines. +``--chapters-file=`` + Load chapters from this file, instead of using the chapter metadata found + in the main file. + ``--sstep=`` Skip seconds after every frame. diff --git a/options/options.c b/options/options.c index 473e04f56e..ef1a383450 100644 --- a/options/options.c +++ b/options/options.c @@ -497,6 +497,8 @@ const m_option_t mp_opts[] = { OPT_DOUBLE("chapter-seek-threshold", chapter_seek_threshold, 0), + OPT_STRING("chapters-file", chapter_file, M_OPT_FILE), + OPT_FLAG("load-unsafe-playlists", load_unsafe_playlists, 0), OPT_FLAG("merge-files", merge_files, 0), diff --git a/options/options.h b/options/options.h index d9065c1877..9dddf9b94e 100644 --- a/options/options.h +++ b/options/options.h @@ -118,6 +118,7 @@ typedef struct MPOpts { char *ordered_chapters_files; int chapter_merge_threshold; double chapter_seek_threshold; + char *chapter_file; int load_unsafe_playlists; int merge_files; int quiet; diff --git a/player/loadfile.c b/player/loadfile.c index c4ddf51cc5..a7905a8a36 100644 --- a/player/loadfile.c +++ b/player/loadfile.c @@ -779,20 +779,40 @@ static void print_timeline(struct MPContext *mpctx) static void load_chapters(struct MPContext *mpctx) { - if (!mpctx->chapters && mpctx->master_demuxer && - mpctx->master_demuxer->num_chapters) - { - int count = mpctx->master_demuxer->num_chapters; + struct demuxer *src = mpctx->master_demuxer; + bool free_src = false; + char *chapter_file = mpctx->opts->chapter_file; + if (chapter_file && chapter_file[0]) { + struct stream *stream = stream_create(chapter_file, STREAM_READ, + mpctx->playback_abort, mpctx->global); + if (stream) { + struct demuxer *demux = demux_open(stream, NULL, NULL, mpctx->global); + if (demux) { + src = demux; + free_src = true; + } + } + talloc_free(mpctx->chapters); + mpctx->chapters = NULL; + } + if (src && !mpctx->chapters) { + talloc_free(mpctx->chapters); + int count = src->num_chapters; mpctx->chapters = talloc_array(NULL, struct chapter, count); mpctx->num_chapters = count; for (int n = 0; n < count; n++) { - struct demux_chapter *dchapter = &mpctx->master_demuxer->chapters[n]; + struct demux_chapter *dchapter = &src->chapters[n]; mpctx->chapters[n] = (struct chapter){ .start = dchapter->start / 1e9, .name = talloc_strdup(mpctx->chapters, dchapter->name), }; } } + if (free_src) { + struct stream *s = src->stream; + free_demuxer(src); + free_stream(s); + } } static void load_per_file_options(m_config_t *conf, -- cgit v1.2.3