summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-03-08 02:08:02 +0100
committerwm4 <wm4@nowhere>2013-03-08 02:12:53 +0100
commitbc20f2cb00234ce436be2f939cb62dbbde5e8dd2 (patch)
treec4c55ae65b8f468578de5eb7253c9c2cd6c44c5c
parent14427ae2ee1923eeeb5189f6a0a3c9ebf391eff6 (diff)
downloadmpv-bc20f2cb00234ce436be2f939cb62dbbde5e8dd2.tar.bz2
mpv-bc20f2cb00234ce436be2f939cb62dbbde5e8dd2.tar.xz
core: remove a number of global variables
Move them into per-instance structs. This should get rid of all global variables in mplayer.c (not counting those referenced by cfg-mplayer.h). In core/input/ar.c, just remove checking the slave_mode variable. I'm not sure what this code was supposed to achieve, but slave mode is broken, slave mode is actually infeasible on OSX (ar.c is completely OSX specific), and the correct way of doing this would be to disable this input device per command line switch.
-rw-r--r--core/cfg-mplayer.h26
-rw-r--r--core/command.c12
-rw-r--r--core/defaultopts.c1
-rw-r--r--core/input/ar.c5
-rw-r--r--core/m_option.h3
-rw-r--r--core/mp_core.h9
-rw-r--r--core/mplayer.c137
-rw-r--r--core/mplayer.h8
-rw-r--r--core/options.h14
9 files changed, 103 insertions, 112 deletions
diff --git a/core/cfg-mplayer.h b/core/cfg-mplayer.h
index 9e33ae67dd..38dd28b432 100644
--- a/core/cfg-mplayer.h
+++ b/core/cfg-mplayer.h
@@ -342,11 +342,11 @@ const m_option_t common_opts[] = {
// ------------------------- demuxer options --------------------
- // number of frames to play/convert
- {"frames", &play_n_frames_mf, CONF_TYPE_INT, CONF_MIN, 0, 0, NULL},
+ OPT_CHOICE_OR_INT("frames", play_frames, 0, 0, INT_MAX,
+ ({"all", -1})),
// seek to byte/seconds position
- {"sb", &seek_to_byte, CONF_TYPE_INT64, CONF_MIN, 0, 0, NULL},
+ OPT_INT64("sb", seek_to_byte, 0),
OPT_REL_TIME("start", play_start, 0),
OPT_REL_TIME("end", play_end, 0),
OPT_REL_TIME("length", play_length, 0),
@@ -412,20 +412,20 @@ const m_option_t common_opts[] = {
{"bps", &pts_from_bps, CONF_TYPE_FLAG, 0, 0, 1, NULL},
// set A-V sync correction speed (0=disables it):
- {"mc", &default_max_pts_correction, CONF_TYPE_FLOAT, CONF_RANGE, 0, 100, NULL},
+ OPT_FLOATRANGE("mc", default_max_pts_correction, 0, 0, 100),
// force video/audio rate:
- {"fps", &force_fps, CONF_TYPE_DOUBLE, CONF_MIN, 0, 0, NULL},
- {"srate", &force_srate, CONF_TYPE_INT, CONF_RANGE, 1000, 8*48000, NULL},
+ OPT_DOUBLE("fps", force_fps, CONF_MIN, 0),
+ OPT_INTRANGE("srate", force_srate, 0, 1000, 8*48000),
OPT_INTRANGE("channels", audio_output_channels, 0, 1, 8),
OPT_AUDIOFORMAT("format", audio_output_format, 0),
OPT_FLOATRANGE("speed", playback_speed, 0, 0.01, 100.0),
// set a-v distance
- {"audio-delay", &audio_delay, CONF_TYPE_FLOAT, CONF_RANGE, -100.0, 100.0, NULL},
+ OPT_FLOATRANGE("audio-delay", audio_delay, 0, -100.0, 100.0),
// ignore header-specified delay (dwStart)
- {"ignore-start", &ignore_start, CONF_TYPE_FLAG, 0, 0, 1, NULL},
+ OPT_FLAG("ignore-start", ignore_start, 0),
OPT_FLOATRANGE("a52drc", drc_level, 0, 0, 2),
@@ -478,7 +478,7 @@ const m_option_t common_opts[] = {
{"sub-delay", &sub_delay, CONF_TYPE_FLOAT, 0, 0.0, 10.0, NULL},
{"subfps", &sub_fps, CONF_TYPE_FLOAT, 0, 0.0, 10.0, NULL},
OPT_FLAG("autosub", sub_auto, 0),
- {"sub-forced-only", &forced_subs_only, CONF_TYPE_FLAG, 0, 0, 1, NULL},
+ OPT_FLAG("sub-forced-only", forced_subs_only, 0),
// enable Closed Captioning display
{"overlapsub", &suboverlap_enabled, CONF_TYPE_FLAG, 0, 0, 2, NULL},
{"sub-no-text-pp", &sub_no_text_pp, CONF_TYPE_FLAG, 0, 0, 1, NULL},
@@ -595,7 +595,7 @@ const m_option_t mplayer_opts[]={
OPT_FLAG("stop-xscreensaver", vo.stop_screensaver, 0),
OPT_STRINGLIST("fstype", vo.fstype_list, 0),
#endif
- {"heartbeat-cmd", &heartbeat_cmd, CONF_TYPE_STRING, 0, 0, 0, NULL},
+ OPT_STRING("heartbeat-cmd", heartbeat_cmd, 0),
OPT_FLAG("mouseinput", vo.nomouse_input, 0),
OPT_CHOICE_OR_INT("screen", vo.screen_id, 0, 0, 32,
@@ -613,13 +613,13 @@ const m_option_t mplayer_opts[]={
//---------------------- mplayer-only options ------------------------
- {"use-filedir-conf", &use_filedir_conf, CONF_TYPE_FLAG, CONF_GLOBAL, 0, 1, NULL},
+ OPT_FLAG("use-filedir-conf", use_filedir_conf, CONF_GLOBAL),
OPT_CHOICE("osd-level", osd_level, 0,
({"0", 0}, {"1", 1}, {"2", 2}, {"3", 3})),
OPT_INTRANGE("osd-duration", osd_duration, 0, 0, 3600000),
OPT_FLAG("osd-fractions", osd_fractions, 0),
- {"sstep", &step_sec, CONF_TYPE_DOUBLE, CONF_MIN, 0, 0, NULL},
+ OPT_DOUBLE("sstep", step_sec, CONF_MIN, 0),
OPT_CHOICE("framedrop", frame_dropping, 0,
({"no", 0},
@@ -670,7 +670,7 @@ const m_option_t mplayer_opts[]={
OPT_STRING("status-msg", status_msg, M_OPT_PARSE_ESCAPES),
OPT_STRING("osd-status-msg", osd_status_msg, M_OPT_PARSE_ESCAPES),
- {"slave-broken", &slave_mode, CONF_TYPE_FLAG,CONF_GLOBAL , 0, 1, NULL},
+ OPT_FLAG("slave-broken", slave_mode, CONF_GLOBAL),
OPT_FLAG("idle", player_idle_mode, CONF_GLOBAL),
OPT_INTRANGE("key-fifo-size", input.key_fifo_size, CONF_GLOBAL, 2, 65000),
OPT_FLAG("consolecontrols", consolecontrols, CONF_GLOBAL),
diff --git a/core/command.c b/core/command.c
index 3553a192ad..1d6e0c976d 100644
--- a/core/command.c
+++ b/core/command.c
@@ -594,14 +594,14 @@ static int mp_property_audio_delay(m_option_t *prop, int action,
{
if (!(mpctx->sh_audio && mpctx->sh_video))
return M_PROPERTY_UNAVAILABLE;
- float delay = audio_delay;
+ float delay = mpctx->opts.audio_delay;
switch (action) {
case M_PROPERTY_PRINT:
*(char **)arg = format_delay(delay);
return M_PROPERTY_OK;
case M_PROPERTY_SET:
- audio_delay = *(float *)arg;
- mpctx->delay -= audio_delay - delay;
+ mpctx->audio_delay = mpctx->opts.audio_delay = *(float *)arg;
+ mpctx->delay -= mpctx->audio_delay - delay;
return M_PROPERTY_OK;
}
return mp_property_generic_option(prop, action, arg, mpctx);
@@ -1247,12 +1247,14 @@ static int mp_property_sub_visibility(m_option_t *prop, int action,
static int mp_property_sub_forced_only(m_option_t *prop, int action,
void *arg, MPContext *mpctx)
{
+ struct MPOpts *opts = &mpctx->opts;
+
if (!vo_spudec)
return M_PROPERTY_UNAVAILABLE;
if (action == M_PROPERTY_SET) {
- forced_subs_only = *(int *)arg;
- spudec_set_forced_subs_only(vo_spudec, forced_subs_only);
+ opts->forced_subs_only = *(int *)arg;
+ spudec_set_forced_subs_only(vo_spudec, opts->forced_subs_only);
return M_PROPERTY_OK;
}
return mp_property_generic_option(prop, action, arg, mpctx);
diff --git a/core/defaultopts.c b/core/defaultopts.c
index ca01ba1df3..9f544d6d55 100644
--- a/core/defaultopts.c
+++ b/core/defaultopts.c
@@ -57,6 +57,7 @@ void set_default_mplayer_options(struct MPOpts *opts)
.term_osd = 2,
.consolecontrols = 1,
.doubleclick_time = 300,
+ .play_frames = -1,
.keep_open = 0,
.audio_id = -1,
.video_id = -1,
diff --git a/core/input/ar.c b/core/input/ar.c
index 4dc1c27f5a..844ad680b3 100644
--- a/core/input/ar.c
+++ b/core/input/ar.c
@@ -33,8 +33,6 @@
#include "ar.h"
#include "keycodes.h"
-extern int slave_mode;
-
extern const double NSAppKitVersionNumber;
typedef struct cookie_keycode_map {
@@ -313,9 +311,6 @@ static int is_mplayer_front(void)
&& SameProcess(&frProc, &myProc, &sameProc) == noErr) {
if (sameProc)
return 1;
- // If MPlayer is running in slave mode, also check parent process.
- if (slave_mode && GetProcessPID(&frProc, &parentPID) == noErr)
- return parentPID==getppid();
}
return 0;
}
diff --git a/core/m_option.h b/core/m_option.h
index ef2df4e12c..d34b6b8495 100644
--- a/core/m_option.h
+++ b/core/m_option.h
@@ -563,6 +563,9 @@ static inline void m_option_free(const m_option_t *opt, void *dst)
#define OPT_FLOAT(...) \
OPT_GENERAL(float, __VA_ARGS__, .type = &m_option_type_float)
+#define OPT_DOUBLE(...) \
+ OPT_GENERAL(double, __VA_ARGS__, .type = &m_option_type_double)
+
#define OPT_STRING(...) \
OPT_GENERAL(char*, __VA_ARGS__, .type = &m_option_type_string)
diff --git a/core/mp_core.h b/core/mp_core.h
index 58d6bb4791..8e76160a08 100644
--- a/core/mp_core.h
+++ b/core/mp_core.h
@@ -199,6 +199,11 @@ typedef struct MPContext {
// How much video timing has been changed to make it match the audio
// timeline. Used for status line information only.
double total_avsync_change;
+ // Total number of dropped frames that were "approved" to be dropped.
+ // Actual dropping depends on --framedrop and decoder internals.
+ int drop_frame_cnt;
+ // Number of frames dropped in a row.
+ int dropped_frames;
// A-V sync difference when last frame was displayed. Kept to display
// the same value if the status line is updated at a time where no new
// video frame is shown.
@@ -211,6 +216,8 @@ typedef struct MPContext {
// period of time until a new frame is decoded and shown.)
double last_vo_pts;
+ float audio_delay;
+
// used to prevent hanging in some error cases
unsigned int start_timestamp;
@@ -246,6 +253,8 @@ typedef struct MPContext {
int paused;
// step this many frames, then pause
int step_frames;
+ // Counted down each frame, stop playback if 0 is reached. (-1 = disable)
+ int max_frames;
bool paused_for_cache;
diff --git a/core/mplayer.c b/core/mplayer.c
index 041b7da67b..e5838e0a7a 100644
--- a/core/mplayer.c
+++ b/core/mplayer.c
@@ -94,16 +94,10 @@
#include "osdep/timer.h"
#include "core/input/input.h"
-
#include "core/encode.h"
-int slave_mode = 0;
-int enable_mouse_movements = 0;
-
#include "osdep/priority.h"
-char *heartbeat_cmd;
-
#include "stream/tv.h"
#include "stream/stream_radio.h"
#ifdef CONFIG_DVBIN
@@ -194,36 +188,11 @@ static const char av_desync_help_text[] = _(
//**************************************************************************//
#include "core/mp_fifo.h"
-
-static int drop_frame_cnt; // total number of dropped frames
-
-// seek:
-static int64_t seek_to_byte;
-static double step_sec;
-
-// this dvdsub_id was selected via slang
-// use this to allow dvdnav to follow -slang across stream resets,
-// in particular the subtitle ID for a language changes
-int dvdsub_lang_id;
-int forced_subs_only = 0;
-
-// A-V sync:
-static float default_max_pts_correction = -1;
-float audio_delay = 0;
-static int ignore_start = 0;
-
-double force_fps = 0;
-static int force_srate = 0;
-static int play_n_frames = -1;
-static int play_n_frames_mf = -1;
-
#include "sub/ass_mp.h"
// ---
-int use_filedir_conf;
-
#include "core/mp_common.h"
#include "core/command.h"
@@ -440,7 +409,7 @@ static void init_demux_stream(struct MPContext *mpctx, enum stream_type type)
demuxer_switch_track(stream->demuxer, type, stream);
if (track->is_external) {
double pts = get_main_demux_pts(mpctx);
- demux_seek(stream->demuxer, pts, audio_delay, SEEK_ABSOLUTE);
+ demux_seek(stream->demuxer, pts, mpctx->audio_delay, SEEK_ABSOLUTE);
}
}
}
@@ -752,7 +721,8 @@ static int try_load_config(m_config_t *conf, const char *file)
return 1;
}
-static void load_per_file_config(m_config_t *conf, const char * const file)
+static void load_per_file_config(m_config_t *conf, const char * const file,
+ bool search_file_dir)
{
char *confpath;
char cfg[MP_PATH_MAX];
@@ -766,7 +736,7 @@ static void load_per_file_config(m_config_t *conf, const char * const file)
sprintf(cfg, "%s.conf", file);
name = mp_basename(cfg);
- if (use_filedir_conf) {
+ if (search_file_dir) {
char dircfg[MP_PATH_MAX];
strcpy(dircfg, cfg);
strcpy(dircfg + (name - cfg), "mpv.conf");
@@ -1002,8 +972,8 @@ void init_vo_spudec(struct MPContext *mpctx)
if (vo_spudec != NULL) {
mpctx->initialized_flags |= INITIALIZED_SPUDEC;
- mp_property_do("sub-forced-only", M_PROPERTY_SET, &forced_subs_only,
- mpctx);
+ mp_property_do("sub-forced-only", M_PROPERTY_SET,
+ &mpctx->opts.forced_subs_only, mpctx);
}
}
@@ -1131,9 +1101,9 @@ static void print_status(struct MPContext *mpctx)
if (endpos != -1)
position = max(position, (get_current_time(mpctx) - startpos)
/ (endpos - startpos));
- if (play_n_frames_mf)
+ if (opts->play_frames > 0)
position = max(position,
- 1.0 - play_n_frames / (double) play_n_frames_mf);
+ 1.0 - mpctx->max_frames / (double) opts->play_frames);
char lavcbuf[80];
if (encode_lavc_getstatus(mpctx->encode_lavc_ctx, lavcbuf, sizeof(lavcbuf),
position, get_current_time(mpctx) - startpos) >= 0)
@@ -1144,8 +1114,8 @@ static void print_status(struct MPContext *mpctx)
#endif
{
// VO stats
- if (sh_video && drop_frame_cnt)
- saddf(&line, " D: %d", drop_frame_cnt);
+ if (sh_video && mpctx->drop_frame_cnt)
+ saddf(&line, " D: %d", mpctx->drop_frame_cnt);
}
int cache = mp_get_cache_percent(mpctx);
@@ -1563,7 +1533,7 @@ void reinit_audio_chain(struct MPContext *mpctx)
if (!(mpctx->initialized_flags & INITIALIZED_AO)) {
mpctx->initialized_flags |= INITIALIZED_AO;
mpctx->ao = ao_create(opts, mpctx->input);
- mpctx->ao->samplerate = force_srate;
+ mpctx->ao->samplerate = opts->force_srate;
mpctx->ao->format = opts->audio_output_format;
}
ao = mpctx->ao;
@@ -1859,18 +1829,17 @@ static int check_framedrop(struct MPContext *mpctx, double frame_time)
struct MPOpts *opts = &mpctx->opts;
// check for frame-drop:
if (mpctx->sh_audio && !mpctx->ao->untimed && !mpctx->sh_audio->ds->eof) {
- static int dropped_frames;
float delay = opts->playback_speed * ao_get_delay(mpctx->ao);
float d = delay - mpctx->delay;
// we should avoid dropping too many frames in sequence unless we
// are too late. and we allow 100ms A-V delay here:
- if (d < -dropped_frames * frame_time - 0.100 && !mpctx->paused
+ if (d < -mpctx->dropped_frames * frame_time - 0.100 && !mpctx->paused
&& !mpctx->restart_playback) {
- ++drop_frame_cnt;
- ++dropped_frames;
+ mpctx->drop_frame_cnt++;
+ mpctx->dropped_frames++;
return mpctx->opts.frame_dropping;
} else
- dropped_frames = 0;
+ mpctx->dropped_frames = 0;
}
return 0;
}
@@ -2091,6 +2060,8 @@ bool mp_remove_track(struct MPContext *mpctx, struct track *track)
*/
static void adjust_sync(struct MPContext *mpctx, double frame_time)
{
+ struct MPOpts *opts = &mpctx->opts;
+
if (!mpctx->sh_audio || mpctx->syncing_audio)
return;
@@ -2099,11 +2070,11 @@ static void adjust_sync(struct MPContext *mpctx, double frame_time)
double av_delay = a_pts - v_pts;
// Try to sync vo_flip() so it will *finish* at given time
av_delay += mpctx->last_vo_flip_duration;
- av_delay -= audio_delay; // This much pts difference is desired
+ av_delay -= mpctx->audio_delay; // This much pts difference is desired
double change = av_delay * 0.1;
- double max_change = default_max_pts_correction >= 0 ?
- default_max_pts_correction : frame_time * 0.1;
+ double max_change = opts->default_max_pts_correction >= 0 ?
+ opts->default_max_pts_correction : frame_time * 0.1;
if (change < -max_change)
change = -max_change;
else if (change > max_change)
@@ -2157,7 +2128,7 @@ static int audio_start_sync(struct MPContext *mpctx, int playsize)
ptsdiff = written_pts - mpctx->hrseek_pts;
else
ptsdiff = written_pts - mpctx->sh_video->pts - mpctx->delay
- - audio_delay;
+ - mpctx->audio_delay;
bytes = ptsdiff * bps;
bytes -= bytes % (ao->channels * af_fmt2bits(ao->format) / 8);
@@ -2265,7 +2236,7 @@ static int fill_audio_out_buffers(struct MPContext *mpctx, double endpts)
}
if (endpts != MP_NOPTS_VALUE && modifiable_audio_format) {
- double bytes = (endpts - written_audio_pts(mpctx) + audio_delay)
+ double bytes = (endpts - written_audio_pts(mpctx) + mpctx->audio_delay)
* ao->bps / opts->playback_speed;
if (playsize > bytes) {
playsize = FFMAX(bytes, 0);
@@ -2343,13 +2314,13 @@ int reinit_video_chain(struct MPContext *mpctx)
mpctx->master_demuxer->file_format, mpctx->sh_video->format,
mpctx->sh_video->disp_w, mpctx->sh_video->disp_h,
mpctx->sh_video->fps, mpctx->sh_video->frametime);
- if (force_fps) {
- mpctx->sh_video->fps = force_fps;
+ if (opts->force_fps) {
+ mpctx->sh_video->fps = opts->force_fps;
mpctx->sh_video->frametime = 1.0f / mpctx->sh_video->fps;
}
update_fps(mpctx);
- if (!mpctx->sh_video->fps && !force_fps && !opts->correct_pts) {
+ if (!mpctx->sh_video->fps && !opts->force_fps && !opts->correct_pts) {
mp_tmsg(MSGT_CPLAYER, MSGL_ERR, "FPS not specified in the "
"header or invalid, use the -fps option.\n");
}
@@ -2455,7 +2426,7 @@ static double update_video_nocorrect_pts(struct MPContext *mpctx)
int in_size = 0;
while (!in_size)
in_size = video_read_frame(sh_video, &sh_video->next_frame_time,
- &packet, force_fps);
+ &packet, mpctx->opts.force_fps);
if (in_size < 0)
return -1;
sh_video->timer += frame_time;
@@ -2700,7 +2671,8 @@ static void seek_reset(struct MPContext *mpctx, bool reset_ao, bool reset_ac)
mpctx->hrseek_framedrop = false;
mpctx->total_avsync_change = 0;
mpctx->step_frames = 0;
- drop_frame_cnt = 0;
+ mpctx->drop_frame_cnt = 0;
+ mpctx->dropped_frames = 0;
#ifdef CONFIG_ENCODING
encode_lavc_discontinuity(mpctx->encode_lavc_ctx);
@@ -2832,8 +2804,8 @@ static int seek(MPContext *mpctx, struct seek_params seek,
if (hr_seek)
demuxer_amount -= opts->hr_seek_demuxer_offset;
- int seekresult = demux_seek(mpctx->demuxer, demuxer_amount, audio_delay,
- demuxer_style);
+ int seekresult = demux_seek(mpctx->demuxer, demuxer_amount,
+ mpctx->audio_delay, demuxer_style);
if (seekresult == 0) {
if (need_reset) {
reinit_audio_chain(mpctx);
@@ -2858,7 +2830,7 @@ static int seek(MPContext *mpctx, struct seek_params seek,
for (int type = 0; type < STREAM_TYPE_COUNT; type++) {
struct track *track = mpctx->current_track[type];
if (track && track->is_external && track->demuxer)
- demux_seek(track->demuxer, main_new_pos, audio_delay,
+ demux_seek(track->demuxer, main_new_pos, mpctx->audio_delay,
SEEK_ABSOLUTE);
}
}
@@ -3127,13 +3099,13 @@ static void update_avsync(struct MPContext *mpctx)
double a_pos = playing_audio_pts(mpctx);
- mpctx->last_av_difference = a_pos - mpctx->video_pts - audio_delay;
+ mpctx->last_av_difference = a_pos - mpctx->video_pts - mpctx->audio_delay;
if (mpctx->time_frame > 0)
mpctx->last_av_difference +=
mpctx->time_frame * mpctx->opts.playback_speed;
if (a_pos == MP_NOPTS_VALUE || mpctx->video_pts == MP_NOPTS_VALUE)
mpctx->last_av_difference = MP_NOPTS_VALUE;
- if (mpctx->last_av_difference > 0.5 && drop_frame_cnt > 50
+ if (mpctx->last_av_difference > 0.5 && mpctx->drop_frame_cnt > 50
&& !mpctx->drop_message_shown) {
mp_tmsg(MSGT_AVSYNC, MSGL_WARN, "%s", mp_gtext(av_desync_help_text));
mpctx->drop_message_shown = true;
@@ -3258,12 +3230,12 @@ static void run_playloop(struct MPContext *mpctx)
// ================================================================
vo_check_events(vo);
- if (heartbeat_cmd) {
+ if (opts->heartbeat_cmd) {
static unsigned last_heartbeat;
unsigned now = GetTimerMS();
if (now - last_heartbeat > 30000) {
last_heartbeat = now;
- system(heartbeat_cmd);
+ system(opts->heartbeat_cmd);
}
}
@@ -3373,9 +3345,9 @@ static void run_playloop(struct MPContext *mpctx)
screenshot_flip(mpctx);
new_video_frame_shown = true;
- if (play_n_frames >= 0) {
- --play_n_frames;
- if (play_n_frames <= 0)
+ if (mpctx->max_frames >= 0) {
+ mpctx->max_frames--;
+ if (mpctx->max_frames <= 0)
mpctx->stop_play = PT_NEXT_ENTRY;
}
break;
@@ -3512,9 +3484,9 @@ static void run_playloop(struct MPContext *mpctx)
}
// handle -sstep
- if (step_sec > 0 && !mpctx->paused && !mpctx->restart_playback) {
+ if (opts->step_sec > 0 && !mpctx->paused && !mpctx->restart_playback) {
set_osd_function(mpctx, OSD_FFW);
- queue_seek(mpctx, MPSEEK_RELATIVE, step_sec, 0);
+ queue_seek(mpctx, MPSEEK_RELATIVE, opts->step_sec, 0);
}
if (opts->keep_open && mpctx->stop_play == AT_END_OF_FILE) {
@@ -3650,7 +3622,7 @@ static void init_input(struct MPContext *mpctx)
{
mpctx->input = mp_input_init(&mpctx->opts.input, mpctx->opts.load_config);
mpctx->key_fifo = mp_fifo_create(mpctx->input, &mpctx->opts);
- if (slave_mode)
+ if (mpctx->opts.slave_mode)
mp_input_add_cmd_fd(mpctx->input, 0, USE_FD0_CMD_SELECT, MP_INPUT_SLAVE_CMD_FUNC, NULL);
else if (mpctx->opts.consolecontrols)
mp_input_add_key_fd(mpctx->input, 0, 1, read_keys, NULL, mpctx->key_fifo);
@@ -3848,7 +3820,7 @@ static void play_current_file(struct MPContext *mpctx)
load_per_protocol_config(mpctx->mconfig, mpctx->filename);
load_per_extension_config(mpctx->mconfig, mpctx->filename);
- load_per_file_config(mpctx->mconfig, mpctx->filename);
+ load_per_file_config(mpctx->mconfig, mpctx->filename, opts->use_filedir_conf);
if (opts->vo.video_driver_list)
load_per_output_config(mpctx->mconfig, PROFILE_CFG_VO,
@@ -3863,7 +3835,7 @@ static void play_current_file(struct MPContext *mpctx)
// We must enable getch2 here to be able to interrupt network connection
// or cache filling
- if (opts->consolecontrols && !slave_mode) {
+ if (opts->consolecontrols && !opts->slave_mode) {
if (mpctx->initialized_flags & INITIALIZED_GETCH2)
mp_tmsg(MSGT_CPLAYER, MSGL_WARN,
"WARNING: getch2_init called twice!\n");
@@ -3923,7 +3895,7 @@ static void play_current_file(struct MPContext *mpctx)
goto terminate_playback;
#endif
}
- mpctx->stream->start_pos += seek_to_byte;
+ mpctx->stream->start_pos += opts->seek_to_byte;
// CACHE2: initial prefill: 20% later: 5% (should be set by -cacheopts)
#ifdef CONFIG_DVBIN
@@ -3939,6 +3911,8 @@ goto_enable_cache: ;
//============ Open DEMUXERS --- DETECT file type =======================
+ mpctx->audio_delay = opts->audio_delay;
+
mpctx->demuxer = demux_open(opts, mpctx->stream, mpctx->file_format,
opts->audio_id, opts->video_id, opts->sub_id,
mpctx->filename);
@@ -4049,8 +4023,8 @@ goto_enable_cache: ;
if (mpctx->sh_video) {
mpctx->sh_video->timer = 0;
- if (!ignore_start)
- audio_delay += mpctx->sh_video->stream_delay;
+ if (!opts->ignore_start)
+ mpctx->audio_delay += mpctx->sh_video->stream_delay;
}
if (mpctx->sh_audio) {
if (opts->mixer_init_volume >= 0)
@@ -4058,12 +4032,12 @@ goto_enable_cache: ;
opts->mixer_init_volume);
if (opts->mixer_init_mute >= 0)
mixer_setmute(&mpctx->mixer, opts->mixer_init_mute);
- if (!ignore_start)
- audio_delay -= mpctx->sh_audio->stream_delay;
+ if (!opts->ignore_start)
+ mpctx->audio_delay -= mpctx->sh_audio->stream_delay;
}
- if (force_fps && mpctx->sh_video) {
- mpctx->sh_video->fps = force_fps;
+ if (opts->force_fps && mpctx->sh_video) {
+ mpctx->sh_video->fps = opts->force_fps;
mpctx->sh_video->frametime = 1.0f / mpctx->sh_video->fps;
mp_tmsg(MSGT_CPLAYER, MSGL_INFO,
"FPS forced to be %5.3f (ftime: %5.3f).\n",
@@ -4081,10 +4055,11 @@ goto_enable_cache: ;
mp_tmsg(MSGT_CPLAYER, MSGL_V, "Starting playback...\n");
- drop_frame_cnt = 0; // fix for multifile fps benchmark
- play_n_frames = play_n_frames_mf;
+ mpctx->drop_frame_cnt = 0;
+ mpctx->dropped_frames = 0;
+ mpctx->max_frames = opts->play_frames;
- if (play_n_frames == 0) {
+ if (mpctx->max_frames == 0) {
mpctx->stop_play = PT_NEXT_ENTRY;
goto terminate_playback;
}
diff --git a/core/mplayer.h b/core/mplayer.h
index 0471a3137d..b96f814b68 100644
--- a/core/mplayer.h
+++ b/core/mplayer.h
@@ -23,14 +23,6 @@
#include "core/mp_msg.h"
-extern char ** audio_fm_list;
-extern char ** video_fm_list;
-extern char ** video_driver_list;
-extern char ** audio_driver_list;
-extern float audio_delay;
-
-extern double force_fps;
-
struct MPContext;
struct MPOpts;
struct subtitle;
diff --git a/core/options.h b/core/options.h
index a6724959aa..4483d6bed2 100644
--- a/core/options.h
+++ b/core/options.h
@@ -2,6 +2,7 @@
#define MPLAYER_OPTIONS_H
#include <stdbool.h>
+#include <stdint.h>
#include "core/m_option.h"
typedef struct mp_vo_opts {
@@ -83,6 +84,7 @@ typedef struct MPOpts {
int chapter_merge_threshold;
int quiet;
int load_config;
+ int use_filedir_conf;
int stream_cache_size;
float stream_cache_min_percent;
float stream_cache_seek_min_percent;
@@ -95,6 +97,9 @@ typedef struct MPOpts {
int initial_audio_sync;
int hr_seek;
float hr_seek_demuxer_offset;
+ float audio_delay;
+ float default_max_pts_correction;
+ int ignore_start;
int autosync;
int softsleep;
int frame_dropping;
@@ -103,13 +108,18 @@ typedef struct MPOpts {
char *playing_msg;
char *status_msg;
char *osd_status_msg;
+ char *heartbeat_cmd;
int player_idle_mode;
+ int slave_mode;
int consolecontrols;
int doubleclick_time;
int list_properties;
struct m_rel_time play_start;
struct m_rel_time play_end;
struct m_rel_time play_length;
+ int play_frames;
+ double step_sec;
+ int64_t seek_to_byte;
int start_paused;
int keep_open;
int audio_id;
@@ -119,6 +129,7 @@ typedef struct MPOpts {
char **sub_lang;
int audio_display;
int sub_visibility;
+ int forced_subs_only;
char *quvi_format;
char *audio_stream;
@@ -132,8 +143,11 @@ typedef struct MPOpts {
struct image_writer_opts *screenshot_image_opts;
char *screenshot_template;
+ double force_fps;
+
int audio_output_channels;
int audio_output_format;
+ int force_srate;
int dtshd;
float playback_speed;
float drc_level;