diff options
-rw-r--r-- | DOCS/man/options.rst | 4 | ||||
-rw-r--r-- | options/options.c | 2 | ||||
-rw-r--r-- | options/options.h | 1 | ||||
-rw-r--r-- | 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=<filename>`` + Load chapters from this file, instead of using the chapter metadata found + in the main file. + ``--sstep=<sec>`` Skip <sec> 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, |