summaryrefslogtreecommitdiffstats
path: root/core/mplayer.c
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 /core/mplayer.c
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.
Diffstat (limited to 'core/mplayer.c')
-rw-r--r--core/mplayer.c137
1 files changed, 56 insertions, 81 deletions
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;
}