summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/options.rst4
-rw-r--r--options/options.c2
-rw-r--r--options/options.h1
-rw-r--r--player/loadfile.c30
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,