summaryrefslogtreecommitdiffstats
path: root/demux
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2016-09-06 20:09:56 +0200
committerwm4 <wm4@nowhere>2016-09-06 20:09:56 +0200
commitd4d8b3a4fcf8d50af9cef9766cfefc5538be28f4 (patch)
tree1eb69ef2876dcf541bab2018e733dbe1053a0fe3 /demux
parent9f0e7bb9982eef36bf2f14fd750bbe6a359011ba (diff)
downloadmpv-d4d8b3a4fcf8d50af9cef9766cfefc5538be28f4.tar.bz2
mpv-d4d8b3a4fcf8d50af9cef9766cfefc5538be28f4.tar.xz
demux: do not access global options
Don't access MPOpts directly, and always use the new m_config.h functions for accessing them in a thread-safe way. The goal is eventually removing the mpv_global.opts field, and the demuxer/stream-layer specific hack that copies MPOpts to deal with thread-safety issues. This moves around a lot of options. For one, we often change the physical storage location of options to make them more localized, but these changes are not user-visible (or should not be). For shared options on the other hand it's better to do messy direct access, which is worrying as in that somehow renaming an option or changing its type would break code reading them manually, without causing a compilation error.
Diffstat (limited to 'demux')
-rw-r--r--demux/demux.c56
-rw-r--r--demux/demux.h1
-rw-r--r--demux/demux_lavf.c63
-rw-r--r--demux/demux_mf.c14
-rw-r--r--demux/demux_mkv.c37
-rw-r--r--demux/demux_mkv_timeline.c24
-rw-r--r--demux/demux_raw.c8
7 files changed, 137 insertions, 66 deletions
diff --git a/demux/demux.c b/demux/demux.c
index 29e13f3344..9404629ad4 100644
--- a/demux/demux.c
+++ b/demux/demux.c
@@ -20,6 +20,7 @@
#include <string.h>
#include <assert.h>
#include <unistd.h>
+#include <limits.h>
#include <pthread.h>
#include <math.h>
@@ -28,7 +29,8 @@
#include <sys/stat.h>
#include "config.h"
-#include "options/options.h"
+#include "options/m_config.h"
+#include "options/m_option.h"
#include "mpv_talloc.h"
#include "common/msg.h"
#include "common/global.h"
@@ -81,6 +83,34 @@ const demuxer_desc_t *const demuxer_list[] = {
NULL
};
+struct demux_opts {
+ int max_packs;
+ int max_bytes;
+ double min_secs;
+ int force_seekable;
+ double min_secs_cache;
+};
+
+#define OPT_BASE_STRUCT struct demux_opts
+
+const struct m_sub_options demux_conf = {
+ .opts = (const struct m_option[]){
+ OPT_DOUBLE("demuxer-readahead-secs", min_secs, M_OPT_MIN, .min = 0),
+ OPT_INTRANGE("demuxer-max-packets", max_packs, 0, 0, INT_MAX),
+ OPT_INTRANGE("demuxer-max-bytes", max_bytes, 0, 0, INT_MAX),
+ OPT_FLAG("force-seekable", force_seekable, 0),
+ OPT_DOUBLE("cache-secs", min_secs_cache, M_OPT_MIN, .min = 0),
+ {0}
+ },
+ .size = sizeof(struct demux_opts),
+ .defaults = &(const struct demux_opts){
+ .max_packs = 16000,
+ .max_bytes = 400 * 1024 * 1024,
+ .min_secs = 1.0,
+ .min_secs_cache = 10.0,
+ },
+};
+
struct demux_internal {
struct mp_log *log;
@@ -1185,7 +1215,6 @@ static struct demuxer *open_given_type(struct mpv_global *global,
.stream = stream,
.seekable = stream->seekable,
.filepos = -1,
- .opts = global->opts,
.global = global,
.log = mp_log_new(demuxer, log, desc->name),
.glog = log,
@@ -1198,22 +1227,24 @@ static struct demuxer *open_given_type(struct mpv_global *global,
!demuxer->stream->uncached_stream->seekable)
demuxer->seekable = false;
+ struct demux_opts *opts = mp_get_config_group(demuxer, global, &demux_conf);
+
struct demux_internal *in = demuxer->in = talloc_ptrtype(demuxer, in);
*in = (struct demux_internal){
.log = demuxer->log,
.d_thread = talloc(demuxer, struct demuxer),
.d_buffer = talloc(demuxer, struct demuxer),
.d_user = demuxer,
- .min_secs = demuxer->opts->demuxer_min_secs,
- .max_packs = demuxer->opts->demuxer_max_packs,
- .max_bytes = demuxer->opts->demuxer_max_bytes,
+ .min_secs = opts->min_secs,
+ .max_packs = opts->max_packs,
+ .max_bytes = opts->max_bytes,
.initial_state = true,
};
pthread_mutex_init(&in->lock, NULL);
pthread_cond_init(&in->wakeup, NULL);
if (stream->uncached_stream)
- in->min_secs = MPMAX(in->min_secs, demuxer->opts->demuxer_min_secs_cache);
+ in->min_secs = MPMAX(in->min_secs, opts->min_secs_cache);
*in->d_thread = *demuxer;
*in->d_buffer = *demuxer;
@@ -1244,7 +1275,7 @@ static struct demuxer *open_given_type(struct mpv_global *global,
mp_verbose(log, "Detected file format: %s\n", desc->desc);
if (!in->d_thread->seekable)
mp_verbose(log, "Stream is not seekable.\n");
- if (!in->d_thread->seekable && demuxer->opts->force_seekable) {
+ if (!in->d_thread->seekable && opts->force_seekable) {
mp_warn(log, "Not seekable, but enabling seeking on user request.\n");
in->d_thread->seekable = true;
in->d_thread->partially_seekable = true;
@@ -1336,7 +1367,6 @@ struct demuxer *demux_open_url(const char *url,
struct mp_cancel *cancel,
struct mpv_global *global)
{
- struct MPOpts *opts = global->opts;
struct demuxer_params dummy = {0};
if (!params)
params = &dummy;
@@ -1344,10 +1374,14 @@ struct demuxer *demux_open_url(const char *url,
cancel, global);
if (!s)
return NULL;
- if (params->allow_capture)
- stream_set_capture_file(s, opts->stream_capture);
+ if (params->allow_capture) {
+ char *f;
+ mp_read_option_raw(global, "stream-capture", &m_option_type_string, &f);
+ stream_set_capture_file(s, f);
+ talloc_free(f);
+ }
if (!params->disable_cache)
- stream_enable_cache(&s, &opts->stream_cache);
+ stream_enable_cache_defaults(&s);
struct demuxer *d = demux_open(s, params, global);
if (d) {
demux_maybe_replace_stream(d);
diff --git a/demux/demux.h b/demux/demux.h
index 9978335cfd..39c2600257 100644
--- a/demux/demux.h
+++ b/demux/demux.h
@@ -207,7 +207,6 @@ typedef struct demuxer {
struct mp_tags *metadata;
void *priv; // demuxer-specific internal data
- struct MPOpts *opts;
struct mpv_global *global;
struct mp_log *log, *glog;
struct demuxer_params *params;
diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c
index d7dbfe3ff1..43f2569369 100644
--- a/demux/demux_lavf.c
+++ b/demux/demux_lavf.c
@@ -35,7 +35,6 @@
#include <libavutil/display.h>
#include <libavutil/opt.h>
-#include "options/options.h"
#include "common/msg.h"
#include "common/tags.h"
#include "common/av_common.h"
@@ -45,6 +44,7 @@
#include "stream/stream.h"
#include "demux.h"
#include "stheader.h"
+#include "options/m_config.h"
#include "options/m_option.h"
#include "options/path.h"
@@ -69,22 +69,32 @@ struct demux_lavf_opts {
char **avopts;
int hacks;
int genptsmode;
+ char *sub_cp;
+ int rtsp_transport;
};
const struct m_sub_options demux_lavf_conf = {
.opts = (const m_option_t[]) {
- OPT_INTRANGE("probesize", probesize, 0, 32, INT_MAX),
- OPT_STRING("format", format, 0),
- OPT_FLOATRANGE("analyzeduration", analyzeduration, 0, 0, 3600),
- OPT_INTRANGE("buffersize", buffersize, 0, 1, 10 * 1024 * 1024,
- OPTDEF_INT(BIO_BUFFER_SIZE)),
- OPT_FLAG("allow-mimetype", allow_mimetype, 0),
- OPT_INTRANGE("probescore", probescore, 0, 1, AVPROBE_SCORE_MAX),
- OPT_STRING("cryptokey", cryptokey, 0),
- OPT_FLAG("hacks", hacks, 0),
- OPT_CHOICE("genpts-mode", genptsmode, 0,
+ OPT_INTRANGE("demuxer-lavf-probesize", probesize, 0, 32, INT_MAX),
+ OPT_STRING("demuxer-lavf-format", format, 0),
+ OPT_FLOATRANGE("demuxer-lavf-analyzeduration", analyzeduration, 0,
+ 0, 3600),
+ OPT_INTRANGE("demuxer-lavf-buffersize", buffersize, 0, 1,
+ 10 * 1024 * 1024, OPTDEF_INT(BIO_BUFFER_SIZE)),
+ OPT_FLAG("demuxer-lavf-allow-mimetype", allow_mimetype, 0),
+ OPT_INTRANGE("demuxer-lavf-probescore", probescore, 0,
+ 1, AVPROBE_SCORE_MAX),
+ OPT_STRING("demuxer-lavf-cryptokey", cryptokey, 0),
+ OPT_FLAG("demuxer-lavf-hacks", hacks, 0),
+ OPT_CHOICE("demuxer-lavf-genpts-mode", genptsmode, 0,
({"lavf", 1}, {"no", 0})),
- OPT_KEYVALUELIST("o", avopts, 0),
+ OPT_KEYVALUELIST("demuxer-lavf-o", avopts, 0),
+ OPT_STRING("sub-codepage", sub_cp, 0),
+ OPT_CHOICE("rtsp-transport", rtsp_transport, 0,
+ ({"lavf", 0},
+ {"udp", 1},
+ {"tcp", 2},
+ {"http", 3})),
{0}
},
.size = sizeof(struct demux_lavf_opts),
@@ -95,6 +105,8 @@ const struct m_sub_options demux_lavf_conf = {
// user is supposed to retry with larger probe sizes until a higher
// value is reached.
.probescore = AVPROBE_SCORE_MAX/4 + 1,
+ .sub_cp = "auto",
+ .rtsp_transport = 2,
},
};
@@ -174,6 +186,9 @@ typedef struct lavf_priv {
int cur_program;
char *mime_type;
double seek_delay;
+
+ struct demux_lavf_opts *opts;
+ double mf_fps;
} lavf_priv_t;
// At least mp4 has name="mov,mp4,m4a,3gp,3g2,mj2", so we split the name
@@ -271,7 +286,7 @@ static void list_formats(struct demuxer *demuxer)
static void convert_charset(struct demuxer *demuxer)
{
lavf_priv_t *priv = demuxer->priv;
- char *cp = demuxer->opts->sub_cp;
+ char *cp = priv->opts->sub_cp;
if (!cp || mp_charset_is_utf8(cp))
return;
bstr data = stream_read_complete(priv->stream, NULL, 128 * 1024 * 1024);
@@ -313,9 +328,8 @@ static const char *const prefixes[] =
static int lavf_check_file(demuxer_t *demuxer, enum demux_check check)
{
- struct MPOpts *opts = demuxer->opts;
- struct demux_lavf_opts *lavfdopts = opts->demux_lavf;
lavf_priv_t *priv = demuxer->priv;
+ struct demux_lavf_opts *lavfdopts = priv->opts;
struct stream *s = priv->stream;
priv->filename = remove_prefix(s->url, prefixes);
@@ -606,7 +620,7 @@ static void handle_new_stream(demuxer_t *demuxer, int i)
if (st->avg_frame_rate.num)
sh->codec->fps = av_q2d(st->avg_frame_rate);
if (priv->format_hack.image_format)
- sh->codec->fps = demuxer->opts->mf_fps;
+ sh->codec->fps = priv->mf_fps;
sh->codec->par_w = st->sample_aspect_ratio.num;
sh->codec->par_h = st->sample_aspect_ratio.den;
@@ -736,8 +750,6 @@ static int interrupt_cb(void *ctx)
static int demux_open_lavf(demuxer_t *demuxer, enum demux_check check)
{
- struct MPOpts *opts = demuxer->opts;
- struct demux_lavf_opts *lavfdopts = opts->demux_lavf;
AVFormatContext *avfc;
AVDictionaryEntry *t = NULL;
float analyze_duration = 0;
@@ -745,6 +757,15 @@ static int demux_open_lavf(demuxer_t *demuxer, enum demux_check check)
demuxer->priv = priv;
priv->stream = demuxer->stream;
+ priv->opts = mp_get_config_group(priv, demuxer->global, &demux_lavf_conf);
+ struct demux_lavf_opts *lavfdopts = priv->opts;
+
+ int index_mode;
+ mp_read_option_raw(demuxer->global, "index", &m_option_type_choice,
+ &index_mode);
+ mp_read_option_raw(demuxer->global, "mf-fps", &m_option_type_double,
+ &priv->mf_fps);
+
if (lavf_check_file(demuxer, check) < 0)
return -1;
@@ -756,7 +777,7 @@ static int demux_open_lavf(demuxer_t *demuxer, enum demux_check check)
parse_cryptokey(avfc, lavfdopts->cryptokey);
if (lavfdopts->genptsmode)
avfc->flags |= AVFMT_FLAG_GENPTS;
- if (opts->index_mode != 1)
+ if (index_mode != 1)
avfc->flags |= AVFMT_FLAG_IGNIDX;
#if LIBAVFORMAT_VERSION_MICRO >= 100
@@ -789,7 +810,7 @@ static int demux_open_lavf(demuxer_t *demuxer, enum demux_check check)
priv->stream->type == STREAMTYPE_AVDEVICE ||
priv->format_hack.no_stream)
{
- mp_setup_av_network_options(&dopts, demuxer->global, demuxer->log, opts);
+ mp_setup_av_network_options(&dopts, demuxer->global, demuxer->log);
// This might be incorrect.
demuxer->seekable = true;
} else {
@@ -812,7 +833,7 @@ static int demux_open_lavf(demuxer_t *demuxer, enum demux_check check)
if (matches_avinputformat_name(priv, "rtsp")) {
const char *transport = NULL;
- switch (opts->network_rtsp_transport) {
+ switch (lavfdopts->rtsp_transport) {
case 1: transport = "udp"; break;
case 2: transport = "tcp"; break;
case 3: transport = "http"; break;
diff --git a/demux/demux_mf.c b/demux/demux_mf.c
index 20b948630c..4abd394317 100644
--- a/demux/demux_mf.c
+++ b/demux/demux_mf.c
@@ -27,6 +27,7 @@
#include "mpv_talloc.h"
#include "common/msg.h"
#include "options/options.h"
+#include "options/m_config.h"
#include "options/path.h"
#include "misc/ctype.h"
@@ -304,10 +305,15 @@ static int demux_open_mf(demuxer_t *demuxer, enum demux_check check)
if (!mf || mf->nr_of_files < 1)
goto error;
- char *force_type = demuxer->opts->mf_type;
+ double mf_fps;
+ char *mf_type;
+ mp_read_option_raw(demuxer->global, "mf-fps", &m_option_type_double, &mf_fps);
+ mp_read_option_raw(demuxer->global, "mf-type", &m_option_type_string, &mf_type);
+
const char *codec = mp_map_mimetype_to_video_codec(demuxer->stream->mime_type);
- if (!codec || (force_type && force_type[0]))
- codec = probe_format(mf, force_type, check);
+ if (!codec || (mf_type && mf_type[0]))
+ codec = probe_format(mf, mf_type, check);
+ talloc_free(mf_type);
if (!codec)
goto error;
@@ -320,7 +326,7 @@ static int demux_open_mf(demuxer_t *demuxer, enum demux_check check)
c->codec = codec;
c->disp_w = 0;
c->disp_h = 0;
- c->fps = demuxer->opts->mf_fps;
+ c->fps = mf_fps;
c->reliable_fps = true;
demux_add_sh_stream(demuxer, sh);
diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c
index da15c0fc0f..95eab29ec9 100644
--- a/demux/demux_mkv.c
+++ b/demux/demux_mkv.c
@@ -43,7 +43,7 @@
#include "mpv_talloc.h"
#include "common/av_common.h"
-#include "options/options.h"
+#include "options/m_config.h"
#include "options/m_option.h"
#include "misc/bstr.h"
#include "stream/stream.h"
@@ -162,6 +162,8 @@ struct block_info {
};
typedef struct mkv_demuxer {
+ struct demux_mkv_opts *opts;
+
int64_t segment_start, segment_end;
double duration;
@@ -179,6 +181,9 @@ typedef struct mkv_demuxer {
mkv_index_t *indexes;
size_t num_indexes;
bool index_complete;
+ int index_mode;
+
+ int edition_id;
struct header_elem {
int32_t id;
@@ -747,11 +752,10 @@ static void add_block_position(demuxer_t *demuxer, struct mkv_track *track,
static int demux_mkv_read_cues(demuxer_t *demuxer)
{
- struct MPOpts *opts = demuxer->opts;
mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
stream_t *s = demuxer->stream;
- if (opts->index_mode != 1 || mkv_d->index_complete) {
+ if (mkv_d->index_mode != 1 || mkv_d->index_complete) {
ebml_read_skip(demuxer->log, -1, s);
return 0;
}
@@ -810,9 +814,9 @@ done:
static int demux_mkv_read_chapters(struct demuxer *demuxer)
{
- struct MPOpts *opts = demuxer->opts;
+ mkv_demuxer_t *mkv_d = demuxer->priv;
stream_t *s = demuxer->stream;
- int wanted_edition = opts->edition_id;
+ int wanted_edition = mkv_d->edition_id;
uint64_t wanted_edition_uid = demuxer->matroska_data.uid.edition;
/* A specific edition UID was requested; ignore the user option which is
@@ -1191,10 +1195,9 @@ static int read_deferred_element(struct demuxer *demuxer,
static void read_deferred_cues(demuxer_t *demuxer)
{
- struct MPOpts *opts = demuxer->opts;
mkv_demuxer_t *mkv_d = demuxer->priv;
- if (mkv_d->index_complete || opts->index_mode != 1)
+ if (mkv_d->index_complete || mkv_d->index_mode != 1)
return;
for (int n = 0; n < mkv_d->num_headers; n++) {
@@ -1855,7 +1858,6 @@ static int read_mkv_segment_header(demuxer_t *demuxer, int64_t *segment_end)
static int demux_mkv_open(demuxer_t *demuxer, enum demux_check check)
{
stream_t *s = demuxer->stream;
- struct MPOpts *opts = demuxer->opts;
mkv_demuxer_t *mkv_d;
int64_t start_pos;
int64_t end_pos;
@@ -1882,6 +1884,12 @@ static int demux_mkv_open(demuxer_t *demuxer, enum demux_check check)
mkv_d->a_skip_preroll = 1;
mkv_d->skip_to_timecode = INT64_MIN;
+ mp_read_option_raw(demuxer->global, "index", &m_option_type_choice,
+ &mkv_d->index_mode);
+ mp_read_option_raw(demuxer->global, "edition", &m_option_type_choice,
+ &mkv_d->edition_id);
+ mkv_d->opts = mp_get_config_group(mkv_d, demuxer->global, &demux_mkv_conf);
+
if (demuxer->params && demuxer->params->matroska_was_valid)
*demuxer->params->matroska_was_valid = true;
@@ -1941,7 +1949,7 @@ static int demux_mkv_open(demuxer_t *demuxer, enum demux_check check)
process_tags(demuxer);
probe_first_timestamp(demuxer);
- if (opts->demux_mkv->probe_duration)
+ if (mkv_d->opts->probe_duration)
probe_last_timestamp(demuxer, start_pos);
return 0;
@@ -2730,7 +2738,6 @@ static int create_index_until(struct demuxer *demuxer, int64_t timecode)
static struct mkv_index *seek_with_cues(struct demuxer *demuxer, int seek_id,
int64_t target_timecode, int flags)
{
- struct MPOpts *opts = demuxer->opts;
struct mkv_demuxer *mkv_d = demuxer->priv;
struct mkv_index *index = NULL;
@@ -2758,9 +2765,9 @@ static struct mkv_index *seek_with_cues(struct demuxer *demuxer, int seek_id,
if (flags & FLAG_SUBPREROLL) {
// Find the cluster with the highest filepos, that has a timestamp
// still lower than min_tc.
- double secs = opts->demux_mkv->subtitle_preroll_secs;
+ double secs = mkv_d->opts->subtitle_preroll_secs;
if (mkv_d->index_has_durations)
- secs = MPMAX(secs, opts->demux_mkv->subtitle_preroll_secs_index);
+ secs = MPMAX(secs, mkv_d->opts->subtitle_preroll_secs_index);
int64_t pre = MPMIN(INT64_MAX, secs * 1e9 / mkv_d->tc_scale);
int64_t min_tc = pre < index->timecode ? index->timecode - pre : 0;
uint64_t prev_target = 0;
@@ -2823,7 +2830,7 @@ static void demux_mkv_seek(demuxer_t *demuxer, double seek_pts, int flags)
int cueflags = (flags & SEEK_BACKWARD) ? FLAG_BACKWARD : 0;
mkv_d->subtitle_preroll = NUM_SUB_PREROLL_PACKETS;
- int preroll_opt = demuxer->opts->demux_mkv->subtitle_preroll;
+ int preroll_opt = mkv_d->opts->subtitle_preroll;
if (((flags & SEEK_HR) || preroll_opt == 1 ||
(preroll_opt == 2 && mkv_d->index_has_durations))
&& st_active[STREAM_SUB] && st_active[STREAM_VIDEO])
@@ -2917,7 +2924,7 @@ static void probe_last_timestamp(struct demuxer *demuxer, int64_t start_pos)
// In full mode, we start reading data from the current file position,
// which works because this function is called after headers are parsed.
- if (demuxer->opts->demux_mkv->probe_duration != 2) {
+ if (mkv_d->opts->probe_duration != 2) {
read_deferred_cues(demuxer);
if (mkv_d->index_complete) {
// Find last cluster that still has video packets
@@ -2974,7 +2981,7 @@ static void probe_first_timestamp(struct demuxer *demuxer)
{
mkv_demuxer_t *mkv_d = demuxer->priv;
- if (!demuxer->opts->demux_mkv->probe_start_time)
+ if (!mkv_d->opts->probe_start_time)
return;
struct block_info block;
diff --git a/demux/demux_mkv_timeline.c b/demux/demux_mkv_timeline.c
index 256e009753..30d669c77f 100644
--- a/demux/demux_mkv_timeline.c
+++ b/demux/demux_mkv_timeline.c
@@ -32,10 +32,10 @@
#include "mpv_talloc.h"
#include "common/msg.h"
-#include "common/global.h"
#include "demux/demux.h"
#include "demux/timeline.h"
#include "demux/matroska.h"
+#include "options/m_config.h"
#include "options/options.h"
#include "options/path.h"
#include "misc/bstr.h"
@@ -46,6 +46,7 @@
struct tl_ctx {
struct mp_log *log;
struct mpv_global *global;
+ struct MPOpts *opts;
struct timeline *tl;
struct demuxer *demuxer;
@@ -209,8 +210,7 @@ static bool check_file_seg(struct tl_ctx *ctx, char *filename, int segment)
MP_TARRAY_APPEND(NULL, ctx->sources, ctx->num_sources, NULL);
}
- if (stream_wants_cache(d->stream, &ctx->global->opts->stream_cache))
- {
+ if (stream_wants_cache(d->stream, ctx->opts->stream_cache)) {
free_demuxer_and_stream(d);
params.disable_cache = false;
params.matroska_wanted_uids = ctx->uids; // potentially reallocated, same data
@@ -247,7 +247,7 @@ static bool missing(struct tl_ctx *ctx)
static void find_ordered_chapter_sources(struct tl_ctx *ctx)
{
- struct MPOpts *opts = ctx->global->opts;
+ struct MPOpts *opts = ctx->opts;
void *tmp = talloc_new(NULL);
int num_filenames = 0;
char **filenames = NULL;
@@ -317,7 +317,7 @@ static int64_t add_timeline_part(struct tl_ctx *ctx,
* early; we don't want to try seeking over a one frame gap. */
int64_t join_diff = start - ctx->last_end_time;
if (ctx->num_parts == 0
- || FFABS(join_diff) > ctx->global->opts->chapter_merge_threshold * 1e6
+ || FFABS(join_diff) > ctx->opts->chapter_merge_threshold * 1e6
|| source != ctx->timeline[ctx->num_parts - 1].source)
{
struct timeline_part new = {
@@ -505,20 +505,22 @@ void build_ordered_chapter_timeline(struct timeline *tl)
if (!demuxer->matroska_data.ordered_chapters)
return;
- if (!demuxer->global->opts->ordered_chapters) {
- MP_INFO(demuxer, "File uses ordered chapters, but "
- "you have disabled support for them. Ignoring.\n");
- return;
- }
-
struct tl_ctx *ctx = talloc_ptrtype(tl, ctx);
*ctx = (struct tl_ctx){
.log = tl->log,
.global = tl->global,
.tl = tl,
.demuxer = demuxer,
+ .opts = mp_get_config_group(ctx, tl->global, NULL),
};
+ if (!ctx->opts->ordered_chapters) {
+ MP_INFO(demuxer, "File uses ordered chapters, but "
+ "you have disabled support for them. Ignoring.\n");
+ talloc_free(ctx);
+ return;
+ }
+
MP_INFO(ctx, "File uses ordered chapters, will build edit timeline.\n");
struct matroska_data *m = &demuxer->matroska_data;
diff --git a/demux/demux_raw.c b/demux/demux_raw.c
index 51378e7031..674d4e7fea 100644
--- a/demux/demux_raw.c
+++ b/demux/demux_raw.c
@@ -22,8 +22,8 @@
#include <unistd.h>
#include <string.h>
+#include "options/m_config.h"
#include "options/m_option.h"
-#include "options/options.h"
#include "stream/stream.h"
#include "demux.h"
@@ -129,7 +129,8 @@ struct priv {
static int demux_rawaudio_open(demuxer_t *demuxer, enum demux_check check)
{
- struct demux_rawaudio_opts *opts = demuxer->opts->demux_rawaudio;
+ struct demux_rawaudio_opts *opts =
+ mp_get_config_group(demuxer, demuxer->global, &demux_rawaudio_conf);
if (check != DEMUX_CHECK_REQUEST && check != DEMUX_CHECK_FORCE)
return -1;
@@ -169,7 +170,8 @@ static int demux_rawaudio_open(demuxer_t *demuxer, enum demux_check check)
static int demux_rawvideo_open(demuxer_t *demuxer, enum demux_check check)
{
- struct demux_rawvideo_opts *opts = demuxer->opts->demux_rawvideo;
+ struct demux_rawvideo_opts *opts =
+ mp_get_config_group(demuxer, demuxer->global, &demux_rawvideo_conf);
if (check != DEMUX_CHECK_REQUEST && check != DEMUX_CHECK_FORCE)
return -1;