summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUoti Urpala <uau@symbol.nonexistent.invalid>2008-04-21 06:07:22 +0300
committerUoti Urpala <uau@symbol.nonexistent.invalid>2008-04-23 13:48:33 +0300
commitc1f9fe7d673ab7c34232a1fe9312e60f81503ccf (patch)
tree2bfe895f3b56deede80ca8243bc0ed3c46231cd7
parentef74d21b1f1d96b2e3f180c021998fbdd80ffcba (diff)
downloadmpv-c1f9fe7d673ab7c34232a1fe9312e60f81503ccf.tar.bz2
mpv-c1f9fe7d673ab7c34232a1fe9312e60f81503ccf.tar.xz
Remove static mpctx from mplayer.c
Pass it in function calls instead. There's no reasonable way to pass it to exit_player() when used outside mplayer.c. However most of those uses seem to be wrong (the code should not make the program exit) and should be removed. For now just make exit_player() uses outside mplayer.c simply call exit() without any shutdown code.
-rw-r--r--command.c56
-rw-r--r--metadata.h4
-rw-r--r--mp_core.h14
-rw-r--r--mp_osd.h4
-rw-r--r--mplayer.c219
-rw-r--r--mplayer.h14
6 files changed, 168 insertions, 143 deletions
diff --git a/command.c b/command.c
index c5c3204d27..bc22c1d5b6 100644
--- a/command.c
+++ b/command.c
@@ -202,14 +202,14 @@ static int mp_property_playback_speed(m_option_t * prop, int action,
return M_PROPERTY_ERROR;
M_PROPERTY_CLAMP(prop, *(float *) arg);
playback_speed = *(float *) arg;
- build_afilter_chain(mpctx->sh_audio, &ao_data);
+ build_afilter_chain(mpctx, mpctx->sh_audio, &ao_data);
return M_PROPERTY_OK;
case M_PROPERTY_STEP_UP:
case M_PROPERTY_STEP_DOWN:
playback_speed += (arg ? *(float *) arg : 0.1) *
(action == M_PROPERTY_STEP_DOWN ? -1 : 1);
M_PROPERTY_CLAMP(prop, playback_speed);
- build_afilter_chain(mpctx->sh_audio, &ao_data);
+ build_afilter_chain(mpctx, mpctx->sh_audio, &ao_data);
return M_PROPERTY_OK;
}
return m_property_float_range(prop, action, arg, &playback_speed);
@@ -848,14 +848,14 @@ static int mp_property_audio(m_option_t * prop, int action, void *arg,
if (audio_id == -2
|| (audio_id > -1
&& mpctx->demuxer->audio->id != current_id && current_id != -2))
- uninit_player(INITIALIZED_AO | INITIALIZED_ACODEC);
+ uninit_player(mpctx, INITIALIZED_AO | INITIALIZED_ACODEC);
if (audio_id > -1 && mpctx->demuxer->audio->id != current_id) {
sh_audio_t *sh2;
sh2 = mpctx->demuxer->a_streams[mpctx->demuxer->audio->id];
if (sh2) {
sh2->ds = mpctx->demuxer->audio;
mpctx->sh_audio = sh2;
- reinit_audio_chain();
+ reinit_audio_chain(mpctx);
}
}
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AUDIO_TRACK=%d\n", audio_id);
@@ -906,7 +906,7 @@ static int mp_property_video(m_option_t * prop, int action, void *arg,
if (video_id == -2
|| (video_id > -1 && mpctx->demuxer->video->id != current_id
&& current_id != -2))
- uninit_player(INITIALIZED_VCODEC |
+ uninit_player(mpctx, INITIALIZED_VCODEC |
(mpctx->opts.fixed_vo && video_id != -2 ? 0 : INITIALIZED_VO));
if (video_id > -1 && mpctx->demuxer->video->id != current_id) {
sh_video_t *sh2;
@@ -914,7 +914,7 @@ static int mp_property_video(m_option_t * prop, int action, void *arg,
if (sh2) {
sh2->ds = mpctx->demuxer->video;
mpctx->sh_video = sh2;
- reinit_video_chain();
+ reinit_video_chain(mpctx);
}
}
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_TRACK=%d\n", video_id);
@@ -1472,7 +1472,7 @@ static int mp_property_sub(m_option_t * prop, int action, void *arg,
if (d_sub->sh && d_sub->id >= 0) {
sh_sub_t *sh = d_sub->sh;
if (sh->type == 'v')
- init_vo_spudec();
+ init_vo_spudec(mpctx);
#ifdef USE_ASS
else if (ass_enabled)
ass_track = sh->ass_track;
@@ -2260,12 +2260,12 @@ static int set_property_command(MPContext * mpctx, mp_cmd_t * cmd)
if (set_prop_cmd[i].osd_progbar) {
if (prop->type == CONF_TYPE_INT) {
if (mp_property_do(pname, M_PROPERTY_GET, &r, mpctx) > 0)
- set_osd_bar(set_prop_cmd[i].osd_progbar,
+ set_osd_bar(mpctx, set_prop_cmd[i].osd_progbar,
set_prop_cmd[i].osd_msg, prop->min, prop->max, r);
} else if (prop->type == CONF_TYPE_FLOAT) {
float f;
if (mp_property_do(pname, M_PROPERTY_GET, &f, mpctx) > 0)
- set_osd_bar(set_prop_cmd[i].osd_progbar,
+ set_osd_bar(mpctx, set_prop_cmd[i].osd_progbar,
set_prop_cmd[i].osd_msg, prop->min, prop->max, f);
} else
mp_msg(MSGT_CPLAYER, MSGL_ERR,
@@ -2420,7 +2420,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd)
case MP_CMD_SPEED_INCR:{
float v = cmd->args[0].v.f;
playback_speed += v;
- build_afilter_chain(sh_audio, &ao_data);
+ build_afilter_chain(mpctx, sh_audio, &ao_data);
set_osd_msg(OSD_MSG_SPEED, 1, osd_duration, MSGTR_OSDSpeed,
playback_speed);
} break;
@@ -2428,7 +2428,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd)
case MP_CMD_SPEED_MULT:{
float v = cmd->args[0].v.f;
playback_speed *= v;
- build_afilter_chain(sh_audio, &ao_data);
+ build_afilter_chain(mpctx, sh_audio, &ao_data);
set_osd_msg(OSD_MSG_SPEED, 1, osd_duration, MSGTR_OSDSpeed,
playback_speed);
} break;
@@ -2436,7 +2436,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd)
case MP_CMD_SPEED_SET:{
float v = cmd->args[0].v.f;
playback_speed = v;
- build_afilter_chain(sh_audio, &ao_data);
+ build_afilter_chain(mpctx, sh_audio, &ao_data);
set_osd_msg(OSD_MSG_SPEED, 1, osd_duration, MSGTR_OSDSpeed,
playback_speed);
} break;
@@ -2452,7 +2452,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd)
break;
case MP_CMD_QUIT:
- exit_player_with_rc(MSGTR_Exit_quit,
+ exit_player_with_rc(mpctx, MSGTR_Exit_quit,
(cmd->nargs > 0) ? cmd->args[0].v.i : 0);
case MP_CMD_PLAY_TREE_STEP:{
@@ -2831,7 +2831,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd)
case MP_CMD_SUB_LOAD:
if (sh_video) {
int n = mpctx->set_of_sub_size;
- add_subtitles(cmd->args[0].v.s, sh_video->fps, 0);
+ add_subtitles(mpctx, cmd->args[0].v.s, sh_video->fps, 0);
if (n != mpctx->set_of_sub_size) {
if (mpctx->global_sub_indices[SUB_SOURCE_SUBS] < 0)
mpctx->global_sub_indices[SUB_SOURCE_SUBS] =
@@ -2918,12 +2918,12 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd)
case MP_CMD_GET_FILENAME:{
mp_msg(MSGT_GLOBAL, MSGL_INFO, "ANS_FILENAME='%s'\n",
- get_metadata(META_NAME));
+ get_metadata(mpctx, META_NAME));
}
break;
case MP_CMD_GET_VIDEO_CODEC:{
- char *inf = get_metadata(META_VIDEO_CODEC);
+ char *inf = get_metadata(mpctx, META_VIDEO_CODEC);
if (!inf)
inf = strdup("");
mp_msg(MSGT_GLOBAL, MSGL_INFO, "ANS_VIDEO_CODEC='%s'\n", inf);
@@ -2932,7 +2932,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd)
break;
case MP_CMD_GET_VIDEO_BITRATE:{
- char *inf = get_metadata(META_VIDEO_BITRATE);
+ char *inf = get_metadata(mpctx, META_VIDEO_BITRATE);
if (!inf)
inf = strdup("");
mp_msg(MSGT_GLOBAL, MSGL_INFO, "ANS_VIDEO_BITRATE='%s'\n", inf);
@@ -2941,7 +2941,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd)
break;
case MP_CMD_GET_VIDEO_RESOLUTION:{
- char *inf = get_metadata(META_VIDEO_RESOLUTION);
+ char *inf = get_metadata(mpctx, META_VIDEO_RESOLUTION);
if (!inf)
inf = strdup("");
mp_msg(MSGT_GLOBAL, MSGL_INFO,
@@ -2951,7 +2951,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd)
break;
case MP_CMD_GET_AUDIO_CODEC:{
- char *inf = get_metadata(META_AUDIO_CODEC);
+ char *inf = get_metadata(mpctx, META_AUDIO_CODEC);
if (!inf)
inf = strdup("");
mp_msg(MSGT_GLOBAL, MSGL_INFO, "ANS_AUDIO_CODEC='%s'\n", inf);
@@ -2960,7 +2960,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd)
break;
case MP_CMD_GET_AUDIO_BITRATE:{
- char *inf = get_metadata(META_AUDIO_BITRATE);
+ char *inf = get_metadata(mpctx, META_AUDIO_BITRATE);
if (!inf)
inf = strdup("");
mp_msg(MSGT_GLOBAL, MSGL_INFO, "ANS_AUDIO_BITRATE='%s'\n", inf);
@@ -2969,7 +2969,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd)
break;
case MP_CMD_GET_AUDIO_SAMPLES:{
- char *inf = get_metadata(META_AUDIO_SAMPLES);
+ char *inf = get_metadata(mpctx, META_AUDIO_SAMPLES);
if (!inf)
inf = strdup("");
mp_msg(MSGT_GLOBAL, MSGL_INFO, "ANS_AUDIO_SAMPLES='%s'\n", inf);
@@ -2978,7 +2978,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd)
break;
case MP_CMD_GET_META_TITLE:{
- char *inf = get_metadata(META_INFO_TITLE);
+ char *inf = get_metadata(mpctx, META_INFO_TITLE);
if (!inf)
inf = strdup("");
mp_msg(MSGT_GLOBAL, MSGL_INFO, "ANS_META_TITLE='%s'\n", inf);
@@ -2987,7 +2987,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd)
break;
case MP_CMD_GET_META_ARTIST:{
- char *inf = get_metadata(META_INFO_ARTIST);
+ char *inf = get_metadata(mpctx, META_INFO_ARTIST);
if (!inf)
inf = strdup("");
mp_msg(MSGT_GLOBAL, MSGL_INFO, "ANS_META_ARTIST='%s'\n", inf);
@@ -2996,7 +2996,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd)
break;
case MP_CMD_GET_META_ALBUM:{
- char *inf = get_metadata(META_INFO_ALBUM);
+ char *inf = get_metadata(mpctx, META_INFO_ALBUM);
if (!inf)
inf = strdup("");
mp_msg(MSGT_GLOBAL, MSGL_INFO, "ANS_META_ALBUM='%s'\n", inf);
@@ -3005,7 +3005,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd)
break;
case MP_CMD_GET_META_YEAR:{
- char *inf = get_metadata(META_INFO_YEAR);
+ char *inf = get_metadata(mpctx, META_INFO_YEAR);
if (!inf)
inf = strdup("");
mp_msg(MSGT_GLOBAL, MSGL_INFO, "ANS_META_YEAR='%s'\n", inf);
@@ -3014,7 +3014,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd)
break;
case MP_CMD_GET_META_COMMENT:{
- char *inf = get_metadata(META_INFO_COMMENT);
+ char *inf = get_metadata(mpctx, META_INFO_COMMENT);
if (!inf)
inf = strdup("");
mp_msg(MSGT_GLOBAL, MSGL_INFO, "ANS_META_COMMENT='%s'\n", inf);
@@ -3023,7 +3023,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd)
break;
case MP_CMD_GET_META_TRACK:{
- char *inf = get_metadata(META_INFO_TRACK);
+ char *inf = get_metadata(mpctx, META_INFO_TRACK);
if (!inf)
inf = strdup("");
mp_msg(MSGT_GLOBAL, MSGL_INFO, "ANS_META_TRACK='%s'\n", inf);
@@ -3032,7 +3032,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd)
break;
case MP_CMD_GET_META_GENRE:{
- char *inf = get_metadata(META_INFO_GENRE);
+ char *inf = get_metadata(mpctx, META_INFO_GENRE);
if (!inf)
inf = strdup("");
mp_msg(MSGT_GLOBAL, MSGL_INFO, "ANS_META_GENRE='%s'\n", inf);
diff --git a/metadata.h b/metadata.h
index 6cd75ea3e0..b500358ed1 100644
--- a/metadata.h
+++ b/metadata.h
@@ -45,7 +45,9 @@ enum metadata_s {
META_INFO_GENRE
};
-char *get_metadata (metadata_t type);
+struct MPContext;
+
+char *get_metadata(struct MPContext *mpctx, metadata_t type);
#endif /* MPLAYER_METADATA_H */
diff --git a/mp_core.h b/mp_core.h
index df53fdbb5c..2307a88724 100644
--- a/mp_core.h
+++ b/mp_core.h
@@ -117,14 +117,14 @@ extern float playback_speed;
extern int forced_subs_only;
-int build_afilter_chain(sh_audio_t *sh_audio, ao_data_t *ao_data);
-void uninit_player(unsigned int mask);
-void reinit_audio_chain(void);
-void init_vo_spudec(void);
+int build_afilter_chain(struct MPContext *mpctx, sh_audio_t *sh_audio, ao_data_t *ao_data);
+void uninit_player(struct MPContext *mpctx, unsigned int mask);
+void reinit_audio_chain(struct MPContext *mpctx);
+void init_vo_spudec(struct MPContext *mpctx);
double playing_audio_pts(sh_audio_t *sh_audio, demux_stream_t *d_audio,
const ao_functions_t *audio_out);
-void exit_player_with_rc(const char* how, int rc);
-void add_subtitles(char *filename, float fps, int noerr);
-int reinit_video_chain(void);
+void exit_player_with_rc(struct MPContext *mpctx, const char* how, int rc);
+void add_subtitles(struct MPContext *mpctx, char *filename, float fps, int noerr);
+int reinit_video_chain(struct MPContext *mpctx);
#endif /* MPLAYER_MP_CORE_H */
diff --git a/mp_osd.h b/mp_osd.h
index f3b2a69561..d4ba8adbaf 100644
--- a/mp_osd.h
+++ b/mp_osd.h
@@ -19,7 +19,9 @@
extern int osd_duration;
extern int term_osd;
-void set_osd_bar(int type,const char* name,double min,double max,double val);
+struct MPContext;
+
+void set_osd_bar(struct MPContext *mpctx, int type,const char* name,double min,double max,double val);
void set_osd_msg(int id, int level, int time, const char* fmt, ...);
void rm_osd_msg(int id);
diff --git a/mplayer.c b/mplayer.c
index 97e00d18e5..752241577a 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -192,19 +192,6 @@ static int max_framesize=0;
int noconsolecontrols=0;
//**************************************************************************//
-// Not all functions in mplayer.c take the context as an argument yet
-static MPContext mpctx_s = {
- .osd_function = OSD_PLAY,
- .begin_skip = MP_NOPTS_VALUE,
- .play_tree_step = 1,
- .global_sub_pos = -1,
- .set_of_sub_pos = -1,
- .file_format = DEMUXER_TYPE_UNKNOWN,
- .last_dvb_step = 1,
-};
-
-static MPContext *mpctx = &mpctx_s;
-
// benchmark:
double video_time_usage=0;
double vout_time_usage=0;
@@ -399,7 +386,7 @@ int mpctx_get_osd_function(MPContext *mpctx)
return mpctx->osd_function;
}
-static int is_valid_metadata_type (metadata_t type) {
+static int is_valid_metadata_type(struct MPContext *mpctx, metadata_t type) {
switch (type)
{
/* check for valid video stream */
@@ -443,7 +430,7 @@ static int is_valid_metadata_type (metadata_t type) {
return 1;
}
-static char *get_demuxer_info (char *tag) {
+static char *get_demuxer_info(struct MPContext *mpctx, char *tag) {
char **info = mpctx->demuxer->info;
int n;
@@ -457,12 +444,13 @@ static char *get_demuxer_info (char *tag) {
return info[2*n+1] ? strdup (info[2*n+1]) : NULL;
}
-char *get_metadata (metadata_t type) {
+char *get_metadata(struct MPContext *mpctx, metadata_t type)
+{
char *meta = NULL;
sh_audio_t * const sh_audio = mpctx->sh_audio;
sh_video_t * const sh_video = mpctx->sh_video;
- if (!is_valid_metadata_type (type))
+ if (!is_valid_metadata_type(mpctx, type))
return NULL;
switch (type)
@@ -532,25 +520,25 @@ char *get_metadata (metadata_t type) {
/* check for valid demuxer */
case META_INFO_TITLE:
- return get_demuxer_info ("Title");
+ return get_demuxer_info(mpctx, "Title");
case META_INFO_ARTIST:
- return get_demuxer_info ("Artist");
+ return get_demuxer_info(mpctx, "Artist");
case META_INFO_ALBUM:
- return get_demuxer_info ("Album");
+ return get_demuxer_info(mpctx, "Album");
case META_INFO_YEAR:
- return get_demuxer_info ("Year");
+ return get_demuxer_info(mpctx, "Year");
case META_INFO_COMMENT:
- return get_demuxer_info ("Comment");
+ return get_demuxer_info(mpctx, "Comment");
case META_INFO_TRACK:
- return get_demuxer_info ("Track");
+ return get_demuxer_info(mpctx, "Track");
case META_INFO_GENRE:
- return get_demuxer_info ("Genre");
+ return get_demuxer_info(mpctx, "Genre");
default:
break;
@@ -573,7 +561,7 @@ static void mp_dvdnav_context_free(MPContext *ctx){
}
#endif
-void uninit_player(unsigned int mask){
+void uninit_player(struct MPContext *mpctx, unsigned int mask){
mask=initialized_flags&mask;
mp_msg(MSGT_CPLAYER,MSGL_DBG2,"\n*** uninit(0x%X)\n",mask);
@@ -678,10 +666,10 @@ void uninit_player(unsigned int mask){
current_module=NULL;
}
-void exit_player_with_rc(const char* how, int rc){
+void exit_player_with_rc(struct MPContext *mpctx, const char* how, int rc){
if (mpctx->user_muted && !mpctx->edl_muted) mixer_mute(&mpctx->mixer);
- uninit_player(INITIALIZED_ALL);
+ uninit_player(mpctx, INITIALIZED_ALL);
#ifdef HAVE_X11
#ifdef HAVE_NEW_GUI
if ( !use_gui )
@@ -720,8 +708,9 @@ void exit_player_with_rc(const char* how, int rc){
exit(rc);
}
-void exit_player(const char* how){
- exit_player_with_rc(how, 1);
+static void exit_player(struct MPContext *mpctx, const char* how)
+{
+ exit_player_with_rc(mpctx, how, 1);
}
#ifndef __MINGW32__
@@ -811,13 +800,13 @@ extern void mp_input_register_options(m_config_t* cfg);
#include "cfg-mplayer.h"
-static void parse_cfgfiles( m_config_t* conf )
+static void parse_cfgfiles(struct MPContext *mpctx, m_config_t* conf)
{
char *conffile;
int conffile_fd;
if (!disable_system_conf &&
m_config_parse_config_file(conf, MPLAYER_CONFDIR "/mplayer.conf") < 0)
- exit_player(NULL);
+ exit_player(mpctx, NULL);
if ((conffile = get_path("")) == NULL) {
mp_msg(MSGT_CPLAYER,MSGL_WARN,MSGTR_NoHomeDir);
} else {
@@ -837,7 +826,7 @@ if ((conffile = get_path("")) == NULL) {
}
if (!disable_user_conf &&
m_config_parse_config_file(conf, conffile) < 0)
- exit_player(NULL);
+ exit_player(mpctx, NULL);
free(conffile);
}
}
@@ -943,12 +932,13 @@ static void load_per_file_config (m_config_t* conf, const char *const file)
* cache filling) if the operation fails we use this function to check
* if it was interrupted by the user.
* The function returns a new value for eof. */
-static int libmpdemux_was_interrupted(int eof) {
+static int libmpdemux_was_interrupted(struct MPContext *mpctx, int eof)
+{
mp_cmd_t* cmd;
if((cmd = mp_input_get_cmd(0,0,0)) != NULL) {
switch(cmd->id) {
case MP_CMD_QUIT:
- exit_player_with_rc(MSGTR_Exit_quit, (cmd->nargs > 0)? cmd->args[0].v.i : 0);
+ exit_player_with_rc(mpctx, MSGTR_Exit_quit, (cmd->nargs > 0)? cmd->args[0].v.i : 0);
case MP_CMD_PLAY_TREE_STEP: {
eof = (cmd->args[0].v.i > 0) ? PT_NEXT_ENTRY : PT_PREV_ENTRY;
mpctx->play_tree_step = (cmd->args[0].v.i == 0) ? 1 : cmd->args[0].v.i;
@@ -967,7 +957,7 @@ static int libmpdemux_was_interrupted(int eof) {
#define mp_basename(s) (strrchr(s,'\\')==NULL?(mp_basename2(s)):(strrchr(s,'\\')+1))
-static int playtree_add_playlist(play_tree_t* entry)
+static int playtree_add_playlist(struct MPContext *mpctx, play_tree_t* entry)
{
play_tree_add_bpf(entry,filename);
@@ -1004,7 +994,7 @@ static int playtree_add_playlist(play_tree_t* entry)
return PT_NEXT_SRC;
}
-void add_subtitles(char *filename, float fps, int noerr)
+void add_subtitles(struct MPContext *mpctx, char *filename, float fps, int noerr)
{
sub_data *subd;
#ifdef USE_ASS
@@ -1049,7 +1039,7 @@ void add_subtitles(char *filename, float fps, int noerr)
}
// FIXME: if/when the GUI calls this, global sub numbering gets (potentially) broken.
-void update_set_of_subtitles(void)
+void update_set_of_subtitles(struct MPContext *mpctx)
// subdata was changed, set_of_sub... have to be updated.
{
sub_data ** const set_of_subtitles = mpctx->set_of_subtitles;
@@ -1070,7 +1060,8 @@ void update_set_of_subtitles(void)
}
}
-void init_vo_spudec(void) {
+void init_vo_spudec(struct MPContext *mpctx)
+{
if (vo_spudec)
spudec_free(vo_spudec);
initialized_flags &= ~INITIALIZED_SPUDEC;
@@ -1187,7 +1178,7 @@ static void sadd_hhmmssf(char *buf, unsigned *pos, int len, float time) {
* \param a_v A-V desynchronization
* \param corr amount out A-V synchronization
*/
-static void print_status(float a_pos, float a_v, float corr)
+static void print_status(struct MPContext *mpctx, float a_pos, float a_v, float corr)
{
sh_video_t * const sh_video = mpctx->sh_video;
int width;
@@ -1281,7 +1272,7 @@ static void print_status(float a_pos, float a_v, float corr)
* \param sh_audio describes the requested input format of the chain.
* \param ao_data describes the requested output format of the chain.
*/
-int build_afilter_chain(sh_audio_t *sh_audio, ao_data_t *ao_data)
+int build_afilter_chain(struct MPContext *mpctx, sh_audio_t *sh_audio, ao_data_t *ao_data)
{
int new_srate;
int result;
@@ -1416,7 +1407,8 @@ static void clear_osd_msgs(void) {
*
*/
-static mp_osd_msg_t* get_osd_msg(void) {
+static mp_osd_msg_t* get_osd_msg(struct MPContext *mpctx)
+{
mp_osd_msg_t *msg,*prev,*last = NULL;
static unsigned last_update = 0;
unsigned now = GetTimerMS();
@@ -1475,7 +1467,7 @@ static mp_osd_msg_t* get_osd_msg(void) {
*
*/
-void set_osd_bar(int type,const char* name,double min,double max,double val) {
+void set_osd_bar(struct MPContext *mpctx, int type,const char* name,double min,double max,double val) {
if(osd_level < 1) return;
@@ -1501,7 +1493,8 @@ void set_osd_bar(int type,const char* name,double min,double max,double val) {
*
*/
-static void update_osd_msg(void) {
+static void update_osd_msg(struct MPContext *mpctx)
+{
mp_osd_msg_t *msg;
static char osd_text[64] = "";
static char osd_text_timer[64];
@@ -1510,7 +1503,7 @@ static void update_osd_msg(void) {
vo_osd_text = (unsigned char*)osd_text;
// Look if we have a msg
- if((msg = get_osd_msg())) {
+ if((msg = get_osd_msg(mpctx))) {
if(strcmp(osd_text,msg->msg)) {
strncpy((char*)osd_text, msg->msg, 63);
if(mpctx->sh_video) vo_osd_changed(OSDTYPE_OSD); else
@@ -1569,7 +1562,8 @@ static void update_osd_msg(void) {
// OSDMsgStack
-void reinit_audio_chain(void) {
+void reinit_audio_chain(struct MPContext *mpctx)
+{
struct MPOpts *opts = &mpctx->opts;
if(mpctx->sh_audio){
current_module="init_audio_codec";
@@ -1596,7 +1590,7 @@ if(mpctx->sh_audio){
// output:
&ao_data.samplerate, &ao_data.channels, &ao_data.format)){
mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_AudioFilterChainPreinitError);
- exit_player(MSGTR_Exit_error);
+ exit_player(mpctx, MSGTR_Exit_error);
}
#endif
current_module="ao2_init";
@@ -1607,7 +1601,7 @@ if(mpctx->sh_audio){
ao_data.format,0))){
// FAILED:
mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CannotInitAO);
- uninit_player(INITIALIZED_ACODEC); // close codec
+ uninit_player(mpctx, INITIALIZED_ACODEC); // close codec
mpctx->sh_audio=mpctx->d_audio->sh=NULL; // -> nosound
mpctx->d_audio->id = -2;
return;
@@ -1626,10 +1620,10 @@ if(mpctx->sh_audio){
// init audio filters:
#if 1
current_module="af_init";
- if(!build_afilter_chain(mpctx->sh_audio, &ao_data)) {
+ if(!build_afilter_chain(mpctx, mpctx->sh_audio, &ao_data)) {
mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_NoMatchingFilter);
// mp_msg(MSGT_CPLAYER,MSGL_ERR,"Couldn't find matching filter / ao format! -> NOSOUND\n");
-// uninit_player(INITIALIZED_ACODEC|INITIALIZED_AO); // close codec & ao
+// uninit_player(mpctx, INITIALIZED_ACODEC|INITIALIZED_AO); // close codec & ao
// sh_audio=mpctx->d_audio->sh=NULL; // -> nosound
}
#endif
@@ -1703,7 +1697,7 @@ double playing_audio_pts(sh_audio_t *sh_audio, demux_stream_t *d_audio,
audio_out->get_delay();
}
-static int check_framedrop(double frame_time) {
+static int check_framedrop(struct MPContext *mpctx, double frame_time) {
// check for frame-drop:
current_module = "check_framedrop";
if (mpctx->sh_audio && !mpctx->d_audio->eof) {
@@ -1724,15 +1718,18 @@ static int check_framedrop(double frame_time) {
return 0;
}
-static int generate_video_frame(sh_video_t *sh_video, demux_stream_t *d_video)
+static int generate_video_frame(struct MPContext *mpctx)
{
+ sh_video_t * const sh_video = mpctx->sh_video;
+ demux_stream_t *d_video = mpctx->d_video;
+
unsigned char *start;
int in_size;
int hit_eof=0;
double pts;
while (1) {
- int drop_frame = check_framedrop(sh_video->frametime);
+ int drop_frame = check_framedrop(mpctx, sh_video->frametime);
void *decoded_frame;
current_module = "decode video";
// XXX Time used in this call is not counted in any performance
@@ -1754,7 +1751,7 @@ static int generate_video_frame(sh_video_t *sh_video, demux_stream_t *d_video)
if (decoded_frame) {
update_subtitles(sh_video, mpctx->d_sub, 0);
update_teletext(sh_video, mpctx->demuxer, 0);
- update_osd_msg();
+ update_osd_msg(mpctx);
current_module = "filter video";
if (filter_video(sh_video, decoded_frame, sh_video->pts))
break;
@@ -1933,7 +1930,9 @@ static void mp_dvdnav_save_smpi(int in_size,
}
#endif /* USE_DVDNAV */
-static void adjust_sync_and_print_status(int between_frames, float timing_error)
+static void adjust_sync_and_print_status(struct MPContext *mpctx,
+ int between_frames,
+ float timing_error)
{
current_module="av_sync";
@@ -1986,18 +1985,18 @@ static void adjust_sync_and_print_status(int between_frames, float timing_error)
c_total+=x;
}
if(!quiet)
- print_status(a_pts - audio_delay, AV_delay, c_total);
+ print_status(mpctx, a_pts - audio_delay, AV_delay, c_total);
}
} else {
// No audio:
if (!quiet)
- print_status(0, 0, 0);
+ print_status(mpctx, 0, 0, 0);
}
}
-static int fill_audio_out_buffers(void)
+static int fill_audio_out_buffers(struct MPContext *mpctx)
{
unsigned int t;
double tt;
@@ -2074,7 +2073,8 @@ static int fill_audio_out_buffers(void)
return 1;
}
-static int sleep_until_update(float *time_frame, float *aq_sleep_time)
+static int sleep_until_update(struct MPContext *mpctx, float *time_frame,
+ float *aq_sleep_time)
{
int frame_time_remaining = 0;
current_module="calc_sleep_time";
@@ -2130,7 +2130,8 @@ static int sleep_until_update(float *time_frame, float *aq_sleep_time)
return frame_time_remaining;
}
-int reinit_video_chain(void) {
+int reinit_video_chain(struct MPContext *mpctx)
+{
struct MPOpts *opts = &mpctx->opts;
sh_video_t * const sh_video = mpctx->sh_video;
double ar=-1.0;
@@ -2204,7 +2205,7 @@ int reinit_video_chain(void) {
mp_msg(MSGT_CPLAYER,MSGL_INFO,"==========================================================================\n");
if(!sh_video->initialized){
- if(!opts->fixed_vo) uninit_player(INITIALIZED_VO);
+ if(!opts->fixed_vo) uninit_player(mpctx, INITIALIZED_VO);
goto err_out;
}
@@ -2237,7 +2238,7 @@ err_out:
return 0;
}
-static double update_video(int *blit_frame)
+static double update_video(struct MPContext *mpctx, int *blit_frame)
{
struct MPOpts *opts = &mpctx->opts;
sh_video_t * const sh_video = mpctx->sh_video;
@@ -2272,10 +2273,10 @@ static double update_video(int *blit_frame)
mpctx->delay -= frame_time;
// video_read_frame can change fps (e.g. for ASF video)
vo_fps = sh_video->fps;
- drop_frame = check_framedrop(frame_time);
+ drop_frame = check_framedrop(mpctx, frame_time);
update_subtitles(sh_video, mpctx->d_sub, 0);
update_teletext(sh_video, mpctx->demuxer, 0);
- update_osd_msg();
+ update_osd_msg(mpctx);
current_module = "decode_video";
#ifdef USE_DVDNAV
decoded_frame = mp_dvdnav_restore_smpi(&in_size,&start,decoded_frame);
@@ -2293,7 +2294,7 @@ static double update_video(int *blit_frame)
sh_video->pts));
}
else {
- int res = generate_video_frame(sh_video, mpctx->d_video);
+ int res = generate_video_frame(mpctx);
if (!res)
return -1;
((vf_instance_t *)sh_video->vfilter)->control(sh_video->vfilter,
@@ -2318,7 +2319,7 @@ static double update_video(int *blit_frame)
return frame_time;
}
-static void pause_loop(void)
+static void pause_loop(struct MPContext *mpctx)
{
mp_cmd_t* cmd;
if (!quiet) {
@@ -2330,7 +2331,7 @@ static void pause_loop(void)
int mlen = strlen(msg);
msg[mlen-1] = '\0';
set_osd_msg(OSD_MSG_PAUSE, 1, 0, "%s", msg+1);
- update_osd_msg();
+ update_osd_msg(mpctx);
} else
mp_msg(MSGT_CPLAYER,MSGL_STATUS,MSGTR_Paused);
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_PAUSED\n");
@@ -2555,6 +2556,16 @@ int gui_no_filename=0;
srand((int) time(NULL));
+ struct MPContext *mpctx = &(struct MPContext){
+ .osd_function = OSD_PLAY,
+ .begin_skip = MP_NOPTS_VALUE,
+ .play_tree_step = 1,
+ .global_sub_pos = -1,
+ .set_of_sub_pos = -1,
+ .file_format = DEMUXER_TYPE_UNKNOWN,
+ .last_dvb_step = 1,
+ };
+
InitTimer();
mp_msg_init();
@@ -2597,7 +2608,7 @@ int gui_no_filename=0;
use_gui=1;
}
- parse_cfgfiles(mconfig);
+ parse_cfgfiles(mpctx, mconfig);
#ifdef HAVE_NEW_GUI
if ( use_gui ) cfg_read();
@@ -2691,7 +2702,7 @@ if(!codecs_file || !parse_codec_cfg(codecs_file)){
if(!parse_codec_cfg(mem_ptr=get_path("codecs.conf"))){
if(!parse_codec_cfg(MPLAYER_CONFDIR "/codecs.conf")){
if(!parse_codec_cfg(NULL)){
- exit_player_with_rc(NULL, 0);
+ exit_player_with_rc(mpctx, NULL, 0);
}
mp_msg(MSGT_CPLAYER,MSGL_V,MSGTR_BuiltinCodecsConf);
}
@@ -2756,18 +2767,18 @@ if(!codecs_file || !parse_codec_cfg(codecs_file)){
}
if(opt_exit)
- exit_player(NULL);
+ exit_player(mpctx, NULL);
if (player_idle_mode && use_gui) {
mp_msg(MSGT_CPLAYER, MSGL_FATAL, MSGTR_NoIdleAndGui);
- exit_player_with_rc(NULL, 1);
+ exit_player_with_rc(mpctx, NULL, 1);
}
if(!filename && !player_idle_mode){
if(!use_gui){
// no file/vcd/dvd -> show HELP:
mp_msg(MSGT_CPLAYER, MSGL_INFO, help_text);
- exit_player_with_rc(NULL, 0);
+ exit_player_with_rc(mpctx, NULL, 0);
} else gui_no_filename=1;
}
@@ -3021,7 +3032,7 @@ while (player_idle_mode && !filename) {
entry = parse_playlist_file(cmd->args[0].v.s);
break;
case MP_CMD_QUIT:
- exit_player_with_rc(MSGTR_Exit_quit, (cmd->nargs > 0)? cmd->args[0].v.i : 0);
+ exit_player_with_rc(mpctx, MSGTR_Exit_quit, (cmd->nargs > 0)? cmd->args[0].v.i : 0);
break;
case MP_CMD_GET_PROPERTY:
case MP_CMD_SET_PROPERTY:
@@ -3140,7 +3151,7 @@ if (edl_output_filename) {
current_module="open_stream";
mpctx->stream=open_stream(filename,0,&mpctx->file_format);
if(!mpctx->stream) { // error...
- mpctx->eof = libmpdemux_was_interrupted(PT_NEXT_ENTRY);
+ mpctx->eof = libmpdemux_was_interrupted(mpctx, PT_NEXT_ENTRY);
goto goto_next_file;
}
initialized_flags|=INITIALIZED_STREAM;
@@ -3156,7 +3167,7 @@ if (edl_output_filename) {
mp_msg(MSGT_CPLAYER,MSGL_V,"Parsing playlist %s...\n",
filename_recode(filename));
entry = parse_playtree(mpctx->stream,0);
- mpctx->eof=playtree_add_playlist(entry);
+ mpctx->eof=playtree_add_playlist(mpctx, entry);
goto goto_next_file;
}
mpctx->stream->start_pos+=seek_to_byte;
@@ -3168,30 +3179,30 @@ if(stream_dump_type==5){
current_module="dumpstream";
if(mpctx->stream->type==STREAMTYPE_STREAM && mpctx->stream->fd<0){
mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_DumpstreamFdUnavailable);
- exit_player(MSGTR_Exit_error);
+ exit_player(mpctx, MSGTR_Exit_error);
}
stream_reset(mpctx->stream);
stream_seek(mpctx->stream,mpctx->stream->start_pos);
f=fopen(stream_dump_name,"wb");
if(!f){
mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_CantOpenDumpfile);
- exit_player(MSGTR_Exit_error);
+ exit_player(mpctx, MSGTR_Exit_error);
}
while(!mpctx->stream->eof){
len=stream_read(mpctx->stream,buf,4096);
if(len>0) {
if(fwrite(buf,len,1,f) != 1) {
mp_msg(MSGT_MENCODER,MSGL_FATAL,MSGTR_ErrorWritingFile,stream_dump_name);
- exit_player(MSGTR_Exit_error);
+ exit_player(mpctx, MSGTR_Exit_error);
}
}
}
if(fclose(f)) {
mp_msg(MSGT_MENCODER,MSGL_FATAL,MSGTR_ErrorWritingFile,stream_dump_name);
- exit_player(MSGTR_Exit_error);
+ exit_player(mpctx, MSGTR_Exit_error);
}
mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_CoreDumped);
- exit_player_with_rc(MSGTR_Exit_eof, 0);
+ exit_player_with_rc(mpctx, MSGTR_Exit_eof, 0);
}
#ifdef USE_DVDREAD
@@ -3227,7 +3238,7 @@ if(stream_cache_size>0){
if(!stream_enable_cache(mpctx->stream,stream_cache_size*1024,
stream_cache_size*1024*(stream_cache_min_percent / 100.0),
stream_cache_size*1024*(stream_cache_seek_min_percent / 100.0)))
- if((mpctx->eof = libmpdemux_was_interrupted(PT_NEXT_ENTRY))) goto goto_next_file;
+ if((mpctx->eof = libmpdemux_was_interrupted(mpctx, PT_NEXT_ENTRY))) goto goto_next_file;
}
//============ Open DEMUXERS --- DETECT file type =======================
@@ -3287,7 +3298,7 @@ if (mpctx->demuxer && mpctx->demuxer->type==DEMUXER_TYPE_PLAYLIST)
{
entry = play_tree_new();
play_tree_set_child(entry,list);
- mpctx->eof=playtree_add_playlist(entry);
+ mpctx->eof=playtree_add_playlist(mpctx, entry);
goto goto_next_file;
}
}
@@ -3353,7 +3364,7 @@ if((stream_dump_type)&&(stream_dump_type<4)){
}
if(!ds){
mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_DumpSelectedStreamMissing);
- exit_player(MSGTR_Exit_error);
+ exit_player(mpctx, MSGTR_Exit_error);
}
// disable other streams:
if(mpctx->d_audio && mpctx->d_audio!=ds) {ds_free_packs(mpctx->d_audio); mpctx->d_audio->id=-2; }
@@ -3363,7 +3374,7 @@ if((stream_dump_type)&&(stream_dump_type<4)){
f=fopen(stream_dump_name,"wb");
if(!f){
mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_CantOpenDumpfile);
- exit_player(MSGTR_Exit_error);
+ exit_player(mpctx, MSGTR_Exit_error);
}
while(!ds->eof){
unsigned char* start;
@@ -3374,7 +3385,7 @@ if((stream_dump_type)&&(stream_dump_type<4)){
}
fclose(f);
mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_CoreDumped);
- exit_player_with_rc(MSGTR_Exit_eof, 0);
+ exit_player_with_rc(mpctx, MSGTR_Exit_eof, 0);
}
mpctx->sh_audio=mpctx->d_audio->sh;
@@ -3432,7 +3443,7 @@ demux_info_print(mpctx->demuxer);
//================== Read SUBTITLES (DVD & TEXT) ==========================
if(vo_spudec==NULL && mpctx->sh_video &&
(mpctx->stream->type==STREAMTYPE_DVD || mpctx->stream->type == STREAMTYPE_DVDNAV || mpctx->d_sub->id >= 0)){
- init_vo_spudec();
+ init_vo_spudec(mpctx);
}
// Apply current settings for forced subs
@@ -3446,7 +3457,7 @@ if(mpctx->sh_video) {
current_module="read_subtitles_file";
if(sub_name){
for (i = 0; sub_name[i] != NULL; ++i)
- add_subtitles (sub_name[i], mpctx->sh_video->fps, 0);
+ add_subtitles(mpctx, sub_name[i], mpctx->sh_video->fps, 0);
}
if(sub_auto) { // auto load sub file ...
char *psub = get_path( "sub/" );
@@ -3454,7 +3465,7 @@ if(mpctx->sh_video) {