summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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;