diff options
Diffstat (limited to 'command.c')
-rw-r--r-- | command.c | 1104 |
1 files changed, 625 insertions, 479 deletions
@@ -20,8 +20,10 @@ #include <inttypes.h> #include <unistd.h> #include <string.h> +#include <stdbool.h> #include "config.h" +#include "talloc.h" #include "command.h" #include "input/input.h" #include "stream/stream.h" @@ -32,10 +34,10 @@ #include "libvo/sub.h" #include "m_option.h" #include "m_property.h" -#include "help_mp.h" #include "metadata.h" #include "libmpcodecs/vf.h" #include "libmpcodecs/vd.h" +#include "mp_osd.h" #include "libvo/video_out.h" #include "libvo/font_load.h" #include "playtree.h" @@ -43,10 +45,12 @@ #include "mpcommon.h" #include "mixer.h" #include "libmpcodecs/dec_video.h" +#include "libmpcodecs/dec_audio.h" #include "libmpcodecs/dec_teletext.h" #include "vobsub.h" #include "spudec.h" #include "path.h" +#include "ass_mp.h" #include "stream/tv.h" #include "stream/stream_radio.h" #include "stream/pvr.h" @@ -57,10 +61,8 @@ #include "stream/stream_dvd.h" #endif #include "stream/stream_dvdnav.h" -#include "libass/ass_mp.h" #include "m_struct.h" #include "libmenu/menu.h" -#include "gui/interface.h" #include "mp_core.h" #include "mp_fifo.h" @@ -70,35 +72,38 @@ extern int use_menu; -static void rescale_input_coordinates(int ix, int iy, double *dx, double *dy) +static void rescale_input_coordinates(struct MPContext *mpctx, int ix, int iy, + double *dx, double *dy) { + struct MPOpts *opts = &mpctx->opts; + struct vo *vo = mpctx->video_out; //remove the borders, if any, and rescale to the range [0,1],[0,1] if (vo_fs) { //we are in full-screen mode - if (vo_screenwidth > vo_dwidth) //there are borders along the x axis - ix -= (vo_screenwidth - vo_dwidth) / 2; - if (vo_screenheight > vo_dheight) //there are borders along the y axis (usual way) - iy -= (vo_screenheight - vo_dheight) / 2; + if (opts->vo_screenwidth > vo->dwidth) //there are borders along the x axis + ix -= (opts->vo_screenwidth - vo->dwidth) / 2; + if (opts->vo_screenheight > vo->dheight) //there are borders along the y axis (usual way) + iy -= (opts->vo_screenheight - vo->dheight) / 2; - if (ix < 0 || ix > vo_dwidth) { + if (ix < 0 || ix > vo->dwidth) { *dx = *dy = -1.0; return; } //we are on one of the borders - if (iy < 0 || iy > vo_dheight) { + if (iy < 0 || iy > vo->dheight) { *dx = *dy = -1.0; return; } //we are on one of the borders } - *dx = (double) ix / (double) vo_dwidth; - *dy = (double) iy / (double) vo_dheight; + *dx = (double) ix / (double) vo->dwidth; + *dy = (double) iy / (double) vo->dheight; mp_msg(MSGT_CPLAYER, MSGL_V, - "\r\nrescaled coordinates: %.3lf, %.3lf, screen (%d x %d), vodisplay: (%d, %d), fullscreen: %d\r\n", - *dx, *dy, vo_screenwidth, vo_screenheight, vo_dwidth, - vo_dheight, vo_fs); + "\r\nrescaled coordinates: %.3f, %.3f, screen (%d x %d), vodisplay: (%d, %d), fullscreen: %d\r\n", + *dx, *dy, opts->vo_screenwidth, opts->vo_screenheight, vo->dwidth, + vo->dheight, vo_fs); } -static int sub_source_by_pos(MPContext * mpctx, int pos) +static int sub_source_by_pos(MPContext *mpctx, int pos) { int source = -1; int top = -1; @@ -113,7 +118,7 @@ static int sub_source_by_pos(MPContext * mpctx, int pos) return source; } -static int sub_source(MPContext * mpctx) +static int sub_source(MPContext *mpctx) { return sub_source_by_pos(mpctx, mpctx->global_sub_pos); } @@ -128,7 +133,7 @@ static int sub_source(MPContext * mpctx) * which need to be fixed while watching the movie. */ -static void log_sub(void) +static void log_sub(struct MPContext *mpctx) { char *fname; FILE *f; @@ -144,14 +149,14 @@ static void log_sub(void) if (subdata->sub_uses_time) { fprintf(f, "N: %s S: %02ld:%02ld:%02ld.%02ld E: %02ld:%02ld:%02ld.%02ld\n", - filename, vo_sub_last->start / 360000, + mpctx->filename, vo_sub_last->start / 360000, (vo_sub_last->start / 6000) % 60, (vo_sub_last->start / 100) % 60, vo_sub_last->start % 100, vo_sub_last->end / 360000, (vo_sub_last->end / 6000) % 60, (vo_sub_last->end / 100) % 60, vo_sub_last->end % 100); } else { - fprintf(f, "N: %s S: %ld E: %ld\n", filename, vo_sub_last->start, - vo_sub_last->end); + fprintf(f, "N: %s S: %ld E: %ld\n", mpctx->filename, + vo_sub_last->start, vo_sub_last->end); } for (i = 0; i < vo_sub_last->lines; i++) { fprintf(f, "%s\n", vo_sub_last->text[i]); @@ -168,77 +173,80 @@ static void log_sub(void) ///@{ /// OSD level (RW) -static int mp_property_osdlevel(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_osdlevel(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { - return m_property_choice(prop, action, arg, &osd_level); + return m_property_choice(prop, action, arg, &mpctx->opts.osd_level); } /// Loop (RW) -static int mp_property_loop(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_loop(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { + struct MPOpts *opts = &mpctx->opts; switch (action) { case M_PROPERTY_PRINT: if (!arg) return M_PROPERTY_ERROR; - if (mpctx->loop_times < 0) + if (opts->loop_times < 0) *(char**)arg = strdup("off"); - else if (mpctx->loop_times == 0) + else if (opts->loop_times == 0) *(char**)arg = strdup("inf"); else break; return M_PROPERTY_OK; } - return m_property_int_range(prop, action, arg, &mpctx->loop_times); + return m_property_int_range(prop, action, arg, &opts->loop_times); } /// Playback speed (RW) -static int mp_property_playback_speed(m_option_t * prop, int action, - void *arg, MPContext * mpctx) +static int mp_property_playback_speed(m_option_t *prop, int action, + void *arg, MPContext *mpctx) { + struct MPOpts *opts = &mpctx->opts; switch (action) { case M_PROPERTY_SET: if (!arg) return M_PROPERTY_ERROR; M_PROPERTY_CLAMP(prop, *(float *) arg); - playback_speed = *(float *) arg; - build_afilter_chain(mpctx->sh_audio, &ao_data); + opts->playback_speed = *(float *) arg; + 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) * + opts->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); + M_PROPERTY_CLAMP(prop, opts->playback_speed); + build_afilter_chain(mpctx, mpctx->sh_audio, &ao_data); return M_PROPERTY_OK; } - return m_property_float_range(prop, action, arg, &playback_speed); + return m_property_float_range(prop, action, arg, &opts->playback_speed); } /// filename with path (RO) -static int mp_property_path(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_path(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { - return m_property_string_ro(prop, action, arg, filename); + return m_property_string_ro(prop, action, arg, mpctx->filename); } /// filename without path (RO) -static int mp_property_filename(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_filename(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { char *f; - if (!filename) + if (!mpctx->filename) return M_PROPERTY_UNAVAILABLE; - if (((f = strrchr(filename, '/')) || (f = strrchr(filename, '\\'))) && f[1]) + if (((f = strrchr(mpctx->filename, '/')) + || (f = strrchr(mpctx->filename, '\\'))) && f[1]) f++; else - f = filename; + f = mpctx->filename; return m_property_string_ro(prop, action, arg, f); } /// Demuxer name (RO) -static int mp_property_demuxer(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_demuxer(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { if (!mpctx->demuxer) return M_PROPERTY_UNAVAILABLE; @@ -247,8 +255,8 @@ static int mp_property_demuxer(m_option_t * prop, int action, void *arg, } /// Position in the stream (RW) -static int mp_property_stream_pos(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_stream_pos(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { if (!mpctx->demuxer || !mpctx->demuxer->stream) return M_PROPERTY_UNAVAILABLE; @@ -267,8 +275,8 @@ static int mp_property_stream_pos(m_option_t * prop, int action, void *arg, } /// Stream start offset (RO) -static int mp_property_stream_start(m_option_t * prop, int action, - void *arg, MPContext * mpctx) +static int mp_property_stream_start(m_option_t *prop, int action, + void *arg, MPContext *mpctx) { if (!mpctx->demuxer || !mpctx->demuxer->stream) return M_PROPERTY_UNAVAILABLE; @@ -281,8 +289,8 @@ static int mp_property_stream_start(m_option_t * prop, int action, } /// Stream end offset (RO) -static int mp_property_stream_end(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_stream_end(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { if (!mpctx->demuxer || !mpctx->demuxer->stream) return M_PROPERTY_UNAVAILABLE; @@ -295,8 +303,8 @@ static int mp_property_stream_end(m_option_t * prop, int action, void *arg, } /// Stream length (RO) -static int mp_property_stream_length(m_option_t * prop, int action, - void *arg, MPContext * mpctx) +static int mp_property_stream_length(m_option_t *prop, int action, + void *arg, MPContext *mpctx) { if (!mpctx->demuxer || !mpctx->demuxer->stream) return M_PROPERTY_UNAVAILABLE; @@ -310,8 +318,8 @@ static int mp_property_stream_length(m_option_t * prop, int action, } /// Media length in seconds (RO) -static int mp_property_length(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_length(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { double len; @@ -323,8 +331,8 @@ static int mp_property_length(m_option_t * prop, int action, void *arg, } /// Current position in percent (RW) -static int mp_property_percent_pos(m_option_t * prop, int action, - void *arg, MPContext * mpctx) { +static int mp_property_percent_pos(m_option_t *prop, int action, + void *arg, MPContext *mpctx) { int pos; if (!mpctx->demuxer) @@ -348,14 +356,14 @@ static int mp_property_percent_pos(m_option_t * prop, int action, demuxer_get_percent_pos(mpctx->demuxer)); } - abs_seek_pos = SEEK_ABSOLUTE | SEEK_FACTOR; - rel_seek_secs = pos / 100.0; + mpctx->abs_seek_pos = SEEK_ABSOLUTE | SEEK_FACTOR; + mpctx->rel_seek_secs = pos / 100.0; return M_PROPERTY_OK; } /// Current position in seconds (RW) -static int mp_property_time_pos(m_option_t * prop, int action, - void *arg, MPContext * mpctx) { +static int mp_property_time_pos(m_option_t *prop, int action, + void *arg, MPContext *mpctx) { if (!(mpctx->sh_video || (mpctx->sh_audio && mpctx->audio_out))) return M_PROPERTY_UNAVAILABLE; @@ -363,35 +371,32 @@ static int mp_property_time_pos(m_option_t * prop, int action, case M_PROPERTY_SET: if(!arg) return M_PROPERTY_ERROR; M_PROPERTY_CLAMP(prop, *(double*)arg); - abs_seek_pos = SEEK_ABSOLUTE; - rel_seek_secs = *(double*)arg; + mpctx->abs_seek_pos = SEEK_ABSOLUTE; + mpctx->rel_seek_secs = *(double*)arg; return M_PROPERTY_OK; case M_PROPERTY_STEP_UP: case M_PROPERTY_STEP_DOWN: - rel_seek_secs += (arg ? *(double*)arg : 10.0) * + mpctx->rel_seek_secs += (arg ? *(double*)arg : 10.0) * (action == M_PROPERTY_STEP_UP ? 1.0 : -1.0); return M_PROPERTY_OK; } return m_property_time_ro(prop, action, arg, mpctx->sh_video ? mpctx->sh_video->pts : - playing_audio_pts(mpctx->sh_audio, - mpctx->d_audio, - mpctx->audio_out)); + playing_audio_pts(mpctx)); } /// Current chapter (RW) static int mp_property_chapter(m_option_t *prop, int action, void *arg, MPContext *mpctx) { + struct MPOpts *opts = &mpctx->opts; int chapter = -1; - float next_pts = 0; - int chapter_num; int step_all; char *chapter_name = NULL; if (mpctx->demuxer) - chapter = demuxer_get_current_chapter(mpctx->demuxer); - if (chapter < 0) + chapter = get_current_chapter(mpctx); + if (chapter < -1) return M_PROPERTY_UNAVAILABLE; switch (action) { @@ -403,7 +408,7 @@ static int mp_property_chapter(m_option_t *prop, int action, void *arg, case M_PROPERTY_PRINT: { if (!arg) return M_PROPERTY_ERROR; - chapter_name = demuxer_chapter_display_name(mpctx->demuxer, chapter); + chapter_name = chapter_display_name(mpctx, chapter); if (!chapter_name) return M_PROPERTY_UNAVAILABLE; *(char **) arg = chapter_name; @@ -428,26 +433,27 @@ static int mp_property_chapter(m_option_t *prop, int action, void *arg, default: return M_PROPERTY_NOT_IMPLEMENTED; } - rel_seek_secs = 0; - abs_seek_pos = 0; - chapter = demuxer_seek_chapter(mpctx->demuxer, chapter, 1, - &next_pts, &chapter_num, &chapter_name); + + double next_pts = 0; + chapter = seek_chapter(mpctx, chapter, &next_pts, &chapter_name); + mpctx->rel_seek_secs = 0; + mpctx->abs_seek_pos = 0; if (chapter >= 0) { if (next_pts > -1.0) { - abs_seek_pos = SEEK_ABSOLUTE; - rel_seek_secs = next_pts; + mpctx->abs_seek_pos = SEEK_ABSOLUTE; + mpctx->rel_seek_secs = next_pts; } if (chapter_name) - set_osd_msg(OSD_MSG_TEXT, 1, osd_duration, - MSGTR_OSDChapter, chapter + 1, chapter_name); + set_osd_tmsg(OSD_MSG_TEXT, 1, opts->osd_duration, + "Chapter: (%d) %s", chapter + 1, chapter_name); } else if (step_all > 0) - rel_seek_secs = 1000000000.; + mpctx->rel_seek_secs = 1000000000.; else - set_osd_msg(OSD_MSG_TEXT, 1, osd_duration, - MSGTR_OSDChapter, 0, MSGTR_Unknown); + set_osd_tmsg(OSD_MSG_TEXT, 1, opts->osd_duration, + "Chapter: (%d) %s", 0, mp_gtext("unknown")); if (chapter_name) - free(chapter_name); + talloc_free(chapter_name); return M_PROPERTY_OK; } @@ -466,6 +472,7 @@ static int mp_property_chapters(m_option_t *prop, int action, void *arg, static int mp_property_angle(m_option_t *prop, int action, void *arg, MPContext *mpctx) { + struct MPOpts *opts = &mpctx->opts; int angle = -1; int angles; char *angle_name = NULL; @@ -517,19 +524,29 @@ static int mp_property_angle(m_option_t *prop, int action, void *arg, return M_PROPERTY_NOT_IMPLEMENTED; } angle = demuxer_set_angle(mpctx->demuxer, angle); - set_osd_msg(OSD_MSG_TEXT, 1, osd_duration, - MSGTR_OSDAngle, angle, angles); + if (angle >= 0) { + struct sh_video *sh_video = mpctx->demuxer->video->sh; + if (sh_video) + resync_video_stream(sh_video); + + struct sh_audio *sh_audio = mpctx->demuxer->audio->sh; + if (sh_audio) + resync_audio_stream(sh_audio); + } + + set_osd_tmsg(OSD_MSG_TEXT, 1, opts->osd_duration, + "Angle: %d/%d", angle, angles); if (angle_name) free(angle_name); return M_PROPERTY_OK; } /// Demuxer meta data -static int mp_property_metadata(m_option_t * prop, int action, void *arg, - MPContext * mpctx) { +static int mp_property_metadata(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { m_property_action_t* ka; char* meta; - static m_option_t key_type = + static const m_option_t key_type = { "metadata", NULL, CONF_TYPE_STRING, 0, 0, 0, NULL }; if (!mpctx->demuxer) return M_PROPERTY_UNAVAILABLE; @@ -558,10 +575,31 @@ static int mp_property_metadata(m_option_t * prop, int action, void *arg, return M_PROPERTY_NOT_IMPLEMENTED; } -static int mp_property_pause(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_pause(m_option_t *prop, int action, void *arg, + void *ctx) { - return m_property_flag_ro(prop, action, arg, mpctx->osd_function == OSD_PAUSE); + MPContext *mpctx = ctx; + + switch (action) { + case M_PROPERTY_SET: + if (!arg) + return M_PROPERTY_ERROR; + if (mpctx->paused == (bool)*(int *) arg) + return M_PROPERTY_OK; + case M_PROPERTY_STEP_UP: + case M_PROPERTY_STEP_DOWN: + if (mpctx->paused) { + unpause_player(mpctx); + mpctx->osd_function = OSD_PLAY; + } + else { + pause_player(mpctx); + mpctx->osd_function = OSD_PAUSE; + } + return M_PROPERTY_OK; + default: + return m_property_flag(prop, action, arg, &mpctx->paused); + } } @@ -572,8 +610,8 @@ static int mp_property_pause(m_option_t * prop, int action, void *arg, ///@{ /// Volume (RW) -static int mp_property_volume(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_volume(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { if (!mpctx->sh_audio) @@ -628,8 +666,8 @@ static int mp_property_volume(m_option_t * prop, int action, void *arg, } /// Mute (RW) -static int mp_property_mute(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_mute(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { if (!mpctx->sh_audio) @@ -656,7 +694,7 @@ static int mp_property_mute(m_option_t * prop, int action, void *arg, if (!arg) return M_PROPERTY_ERROR; if (mpctx->edl_muted) { - *(char **) arg = strdup(MSGTR_EnabledEdl); + *(char **) arg = strdup(mp_gtext("enabled (EDL)")); return M_PROPERTY_OK; } default: @@ -666,8 +704,8 @@ static int mp_property_mute(m_option_t * prop, int action, void *arg, } /// Audio delay (RW) -static int mp_property_audio_delay(m_option_t * prop, int action, - void *arg, MPContext * mpctx) +static int mp_property_audio_delay(m_option_t *prop, int action, + void *arg, MPContext *mpctx) { if (!(mpctx->sh_audio && mpctx->sh_video)) return M_PROPERTY_UNAVAILABLE; @@ -690,8 +728,8 @@ static int mp_property_audio_delay(m_option_t * prop, int action, } /// Audio codec tag (RO) -static int mp_property_audio_format(m_option_t * prop, int action, - void *arg, MPContext * mpctx) +static int mp_property_audio_format(m_option_t *prop, int action, + void *arg, MPContext *mpctx) { if (!mpctx->sh_audio) return M_PROPERTY_UNAVAILABLE; @@ -699,8 +737,8 @@ static int mp_property_audio_format(m_option_t * prop, int action, } /// Audio codec name (RO) -static int mp_property_audio_codec(m_option_t * prop, int action, - void *arg, MPContext * mpctx) +static int mp_property_audio_codec(m_option_t *prop, int action, + void *arg, MPContext *mpctx) { if (!mpctx->sh_audio || !mpctx->sh_audio->codec) return M_PROPERTY_UNAVAILABLE; @@ -708,8 +746,8 @@ static int mp_property_audio_codec(m_option_t * prop, int action, } /// Audio bitrate (RO) -static int mp_property_audio_bitrate(m_option_t * prop, int action, - void *arg, MPContext * mpctx) +static int mp_property_audio_bitrate(m_option_t *prop, int action, + void *arg, MPContext *mpctx) { if (!mpctx->sh_audio) return M_PROPERTY_UNAVAILABLE; @@ -717,8 +755,8 @@ static int mp_property_audio_bitrate(m_option_t * prop, int action, } /// Samplerate (RO) -static int mp_property_samplerate(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_samplerate(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { if (!mpctx->sh_audio) return M_PROPERTY_UNAVAILABLE; @@ -733,8 +771,8 @@ static int mp_property_samplerate(m_option_t * prop, int action, void *arg, } /// Number of channels (RO) -static int mp_property_channels(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_channels(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { if (!mpctx->sh_audio) return M_PROPERTY_UNAVAILABLE; @@ -759,8 +797,8 @@ static int mp_property_channels(m_option_t * prop, int action, void *arg, } /// Balance (RW) -static int mp_property_balance(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_balance(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { float bal; @@ -810,9 +848,10 @@ static int mp_property_balance(m_option_t * prop, int action, void *arg, } /// Selected audio id (RW) -static int mp_property_audio(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_audio(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { + struct MPOpts *opts = &mpctx->opts; int current_id, tmp; if (!mpctx->demuxer || !mpctx->demuxer->audio) return M_PROPERTY_UNAVAILABLE; @@ -829,9 +868,10 @@ static int mp_property_audio(m_option_t * prop, int action, void *arg, return M_PROPERTY_ERROR; if (current_id < 0) - *(char **) arg = strdup(MSGTR_Disabled); + *(char **) arg = strdup(mp_gtext("disabled")); else { - char lang[40] = MSGTR_Unknown; + char lang[40]; + strncpy(lang, mp_gtext("unknown"), sizeof(lang)); sh_audio_t* sh = mpctx->sh_audio; if (sh && sh->lang) av_strlcpy(lang, sh->lang, 40); @@ -861,21 +901,21 @@ static int mp_property_audio(m_option_t * prop, int action, void *arg, tmp = *((int *) arg); else tmp = -1; - audio_id = demuxer_switch_audio(mpctx->demuxer, tmp); - if (audio_id == -2 - || (audio_id > -1 + opts->audio_id = demuxer_switch_audio(mpctx->demuxer, tmp); + if (opts->audio_id == -2 + || (opts->audio_id > -1 && mpctx->demuxer->audio->id != current_id && current_id != -2)) - uninit_player(INITIALIZED_AO | INITIALIZED_ACODEC); - if (audio_id > -1 && mpctx->demuxer->audio->id != current_id) { + uninit_player(mpctx, INITIALIZED_AO | INITIALIZED_ACODEC); + if (opts->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); + mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AUDIO_TRACK=%d\n", opts->audio_id); return M_PROPERTY_OK; default: return M_PROPERTY_NOT_IMPLEMENTED; @@ -884,9 +924,10 @@ static int mp_property_audio(m_option_t * prop, int action, void *arg, } /// Selected video id (RW) -static int mp_property_video(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_video(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { + struct MPOpts *opts = &mpctx->opts; int current_id, tmp; if (!mpctx->demuxer || !mpctx->demuxer->video) return M_PROPERTY_UNAVAILABLE; @@ -903,9 +944,10 @@ static int mp_property_video(m_option_t * prop, int action, void *arg, return M_PROPERTY_ERROR; if (current_id < 0) - *(char **) arg = strdup(MSGTR_Disabled); + *(char **) arg = strdup(mp_gtext("disabled")); else { - char lang[40] = MSGTR_Unknown; + char lang[40]; + strncpy(lang, mp_gtext("unknown"), sizeof(lang)); *(char **) arg = malloc(64); snprintf(*(char **) arg, 64, "(%d) %s", current_id, lang); } @@ -917,22 +959,22 @@ static int mp_property_video(m_option_t * prop, int action, void *arg, tmp = *((int *) arg); else tmp = -1; - video_id = demuxer_switch_video(mpctx->demuxer, tmp); - if (video_id == -2 - || (video_id > -1 && mpctx->demuxer->video->id != current_id + opts->video_id = demuxer_switch_video(mpctx->demuxer, tmp); + if (opts->video_id == -2 + || (opts->video_id > -1 && mpctx->demuxer->video->id != current_id && current_id != -2)) - uninit_player(INITIALIZED_VCODEC | - (fixed_vo && video_id != -2 ? 0 : INITIALIZED_VO)); - if (video_id > -1 && mpctx->demuxer->video->id != current_id) { + uninit_player(mpctx, INITIALIZED_VCODEC | + (mpctx->opts.fixed_vo && opts->video_id != -2 ? 0 : INITIALIZED_VO)); + if (opts->video_id > -1 && mpctx->demuxer->video->id != current_id) { sh_video_t *sh2; sh2 = mpctx->demuxer->v_streams[mpctx->demuxer->video->id]; 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); + mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_TRACK=%d\n", opts->video_id); return M_PROPERTY_OK; default: @@ -940,8 +982,8 @@ static int mp_property_video(m_option_t * prop, int action, void *arg, } } -static int mp_property_program(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_program(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { demux_program_t prog; @@ -977,8 +1019,8 @@ static int mp_property_program(m_option_t * prop, int action, void *arg, ///@{ /// Fullscreen state (RW) -static int mp_property_fullscreen(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_fullscreen(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { if (!mpctx->video_out) @@ -993,21 +1035,17 @@ static int mp_property_fullscreen(m_option_t * prop, int action, void *arg, return M_PROPERTY_OK; case M_PROPERTY_STEP_UP: case M_PROPERTY_STEP_DOWN: -#ifdef CONFIG_GUI - if (use_gui) - guiGetEvent(guiIEvent, (char *) MP_CMD_GUI_FULLSCREEN); - else -#endif - if (vo_config_count) - mpctx->video_out->control(VOCTRL_FULLSCREEN, 0); + if (mpctx->video_out->config_ok) + vo_control(mpctx->video_out, VOCTRL_FULLSCREEN, 0); + mpctx->opts.fullscreen = vo_fs; return M_PROPERTY_OK; default: return m_property_flag(prop, action, arg, &vo_fs); } } -static int mp_property_deinterlace(m_option_t * prop, int action, - void *arg, MPContext * mpctx) +static int mp_property_deinterlace(m_option_t *prop, int action, + void *arg, MPContext *mpctx) { int deinterlace; vf_instance_t *vf; @@ -1031,20 +1069,62 @@ static int mp_property_deinterlace(m_option_t * prop, int action, vf->control(vf, VFCTRL_GET_DEINTERLACE, &deinterlace); deinterlace = !deinterlace; vf->control(vf, VFCTRL_SET_DEINTERLACE, &deinterlace); - set_osd_msg(OSD_MSG_SPEED, 1, osd_duration, MSGTR_OSDDeinterlace, - deinterlace ? MSGTR_Enabled : MSGTR_Disabled); + return M_PROPERTY_OK; + } + int value = 0; + vf->control(vf, VFCTRL_GET_DEINTERLACE, &value); + return m_property_flag_ro(prop, action, arg, value); +} + +static int mp_property_yuv_colorspace(m_option_t *prop, int action, + void *arg, MPContext *mpctx) +{ + if (!mpctx->sh_video || !mpctx->sh_video->vfilter) + return M_PROPERTY_UNAVAILABLE; + + struct vf_instance *vf = mpctx->sh_video->vfilter; + int colorspace; + switch (action) { + case M_PROPERTY_GET: + if (!arg) + return M_PROPERTY_ERROR; + if (vf->control(vf, VFCTRL_GET_YUV_COLORSPACE, arg) != true) + return M_PROPERTY_UNAVAILABLE; + return M_PROPERTY_OK; + case M_PROPERTY_PRINT: + if (!arg) + return M_PROPERTY_ERROR; + if (vf->control(vf, VFCTRL_GET_YUV_COLORSPACE, &colorspace) != true) + return M_PROPERTY_UNAVAILABLE; + char * const names[] = {"BT.601 (SD)", "BT.709 (HD)", "SMPTE-240M"}; + if (colorspace < 0 || colorspace >= sizeof(names) / sizeof(names[0])) + *(char **)arg = strdup("Unknown"); + else + *(char**)arg = strdup(names[colorspace]); + return M_PROPERTY_OK; + case M_PROPERTY_SET: + if (!arg) + return M_PROPERTY_ERROR; + M_PROPERTY_CLAMP(prop, *(int *) arg); + vf->control(vf, VFCTRL_SET_YUV_COLORSPACE, arg); + return M_PROPERTY_OK; + case M_PROPERTY_STEP_UP:; + if (vf->control(vf, VFCTRL_GET_YUV_COLORSPACE, &colorspace) != true) + return M_PROPERTY_UNAVAILABLE; + colorspace += 1; + vf->control(vf, VFCTRL_SET_YUV_COLORSPACE, &colorspace); return M_PROPERTY_OK; } return M_PROPERTY_NOT_IMPLEMENTED; } /// Panscan (RW) -static int mp_property_panscan(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_panscan(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { if (!mpctx->video_out - || mpctx->video_out->control(VOCTRL_GET_PANSCAN, NULL) != VO_TRUE) + || vo_control(mpctx->video_out, VOCTRL_GET_PANSCAN, NULL) != VO_TRUE) return M_PROPERTY_UNAVAILABLE; switch (action) { @@ -1053,7 +1133,7 @@ static int mp_property_panscan(m_option_t * prop, int action, void *arg, return M_PROPERTY_ERROR; M_PROPERTY_CLAMP(prop, *(float *) arg); vo_panscan = *(float *) arg; - mpctx->video_out->control(VOCTRL_SET_PANSCAN, NULL); + vo_control(mpctx->video_out, VOCTRL_SET_PANSCAN, NULL); return M_PROPERTY_OK; case M_PROPERTY_STEP_UP: case M_PROPERTY_STEP_DOWN: @@ -1063,7 +1143,7 @@ static int mp_property_panscan(m_option_t * prop, int action, void *arg, vo_panscan = 1; else if (vo_panscan < 0) vo_panscan = 0; - mpctx->video_out->control(VOCTRL_SET_PANSCAN, NULL); + vo_control(mpctx->video_out, VOCTRL_SET_PANSCAN, NULL); return M_PROPERTY_OK; default: return m_property_float_range(prop, action, arg, &vo_panscan); @@ -1073,8 +1153,8 @@ static int mp_property_panscan(m_option_t * prop, int action, void *arg, /// Helper to set vo flags. /** \ingroup PropertyImplHelper */ -static int mp_property_vo_flag(m_option_t * prop, int action, void *arg, - int vo_ctrl, int *vo_var, MPContext * mpctx) +static int mp_property_vo_flag(m_option_t *prop, int action, void *arg, + int vo_ctrl, int *vo_var, MPContext *mpctx) { if (!mpctx->video_out) @@ -1089,8 +1169,8 @@ static int mp_property_vo_flag(m_option_t * prop, int action, void *arg, return M_PROPERTY_OK; case M_PROPERTY_STEP_UP: case M_PROPERTY_STEP_DOWN: - if (vo_config_count) - mpctx->video_out->control(vo_ctrl, 0); + if (mpctx->video_out->config_ok) + vo_control(mpctx->video_out, vo_ctrl, 0); return M_PROPERTY_OK; default: return m_property_flag(prop, action, arg, vo_var); @@ -1098,32 +1178,32 @@ static int mp_property_vo_flag(m_option_t * prop, int action, void *arg, } /// Window always on top (RW) -static int mp_property_ontop(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_ontop(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { - return mp_property_vo_flag(prop, action, arg, VOCTRL_ONTOP, &vo_ontop, - mpctx); + return mp_property_vo_flag(prop, action, arg, VOCTRL_ONTOP, + &mpctx->opts.vo_ontop, mpctx); } /// Display in the root window (RW) -static int mp_property_rootwin(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_rootwin(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { return mp_property_vo_flag(prop, action, arg, VOCTRL_ROOTWIN, &vo_rootwin, mpctx); } /// Show window borders (RW) -static int mp_property_border(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_border(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { return mp_property_vo_flag(prop, action, arg, VOCTRL_BORDER, &vo_border, mpctx); } /// Framedropping state (RW) -static int mp_property_framedropping(m_option_t * prop, int action, - void *arg, MPContext * mpctx) +static int mp_property_framedropping(m_option_t *prop, int action, + void *arg, MPContext *mpctx) { if (!mpctx->sh_video) @@ -1133,9 +1213,9 @@ static int mp_property_framedropping(m_option_t * prop, int action, case M_PROPERTY_PRINT: if (!arg) return M_PROPERTY_ERROR; - *(char **) arg = strdup(frame_dropping == 1 ? MSGTR_Enabled : - (frame_dropping == 2 ? MSGTR_HardFrameDrop : - MSGTR_Disabled)); + *(char **) arg = strdup(frame_dropping == 1 ? mp_gtext("enabled") : + (frame_dropping == 2 ? mp_gtext("hard") : + mp_gtext("disabled"))); return M_PROPERTY_OK; default: return m_property_choice(prop, action, arg, &frame_dropping); @@ -1143,10 +1223,11 @@ static int mp_property_framedropping(m_option_t * prop, int action, } /// Color settings, try to use vf/vo then fall back on TV. (RW) -static int mp_property_gamma(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_gamma(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { - int *gamma = prop->priv, r, val; + int *gamma = (int *)((char *)&mpctx->opts + (int)prop->priv); + int r, val; if (!mpctx->sh_video) return M_PROPERTY_UNAVAILABLE; @@ -1200,15 +1281,15 @@ static int mp_property_gamma(m_option_t * prop, int action, void *arg, } /// VSync (RW) -static int mp_property_vsync(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_vsync(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { return m_property_flag(prop, action, arg, &vo_vsync); } /// Video codec tag (RO) -static int mp_property_video_format(m_option_t * prop, int action, - void *arg, MPContext * mpctx) +static int mp_property_video_format(m_option_t *prop, int action, + void *arg, MPContext *mpctx) { char* meta; if (!mpctx->sh_video) @@ -1242,8 +1323,8 @@ static int mp_property_video_format(m_option_t * prop, int action, } /// Video codec name (RO) -static int mp_property_video_codec(m_option_t * prop, int action, - void *arg, MPContext * mpctx) +static int mp_property_video_codec(m_option_t *prop, int action, + void *arg, MPContext *mpctx) { if (!mpctx->sh_video || !mpctx->sh_video->codec) return M_PROPERTY_UNAVAILABLE; @@ -1252,8 +1333,8 @@ static int mp_property_video_codec(m_option_t * prop, int action, /// Video bitrate (RO) -static int mp_property_video_bitrate(m_option_t * prop, int action, - void *arg, MPContext * mpctx) +static int mp_property_video_bitrate(m_option_t *prop, int action, + void *arg, MPContext *mpctx) { if (!mpctx->sh_video) return M_PROPERTY_UNAVAILABLE; @@ -1261,8 +1342,8 @@ static int mp_property_video_bitrate(m_option_t * prop, int action, } /// Video display width (RO) -static int mp_property_width(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_width(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { if (!mpctx->sh_video) return M_PROPERTY_UNAVAILABLE; @@ -1270,8 +1351,8 @@ static int mp_property_width(m_option_t * prop, int action, void *arg, } /// Video display height (RO) -static int mp_property_height(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_height(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { if (!mpctx->sh_video) return M_PROPERTY_UNAVAILABLE; @@ -1279,8 +1360,8 @@ static int mp_property_height(m_option_t * prop, int action, void *arg, } /// Video fps (RO) -static int mp_property_fps(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_fps(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { if (!mpctx->sh_video) return M_PROPERTY_UNAVAILABLE; @@ -1288,8 +1369,8 @@ static int mp_property_fps(m_option_t * prop, int action, void *arg, } /// Video aspect (RO) -static int mp_property_aspect(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_aspect(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { if (!mpctx->sh_video) return M_PROPERTY_UNAVAILABLE; @@ -1303,8 +1384,8 @@ static int mp_property_aspect(m_option_t * prop, int action, void *arg, ///@{ /// Text subtitle position (RW) -static int mp_property_sub_pos(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_sub_pos(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { switch (action) { case M_PROPERTY_SET: @@ -1319,17 +1400,17 @@ static int mp_property_sub_pos(m_option_t * prop, int action, void *arg, } /// Selected subtitles (RW) -static int mp_property_sub(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_sub(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { + struct MPOpts *opts = &mpctx->opts; demux_stream_t *const d_sub = mpctx->d_sub; const int global_sub_size = mpctx->global_sub_size; int source = -1, reset_spu = 0; - double pts = 0; char *sub_name; if (global_sub_size <= 0) - return M_PROPERTY_UNAVAILABLE; + return M_PROPERTY_UNAVAILABLE; switch (action) { case M_PROPERTY_GET: @@ -1363,10 +1444,10 @@ static int mp_property_sub(m_option_t * prop, int action, void *arg, } #ifdef CONFIG_DVDNAV if (mpctx->stream->type == STREAMTYPE_DVDNAV) { - if (vo_spudec && dvdsub_id >= 0) { + if (vo_spudec && opts->sub_id >= 0) { unsigned char lang[3]; - if (mp_dvdnav_lang_from_sid(mpctx->stream, dvdsub_id, lang)) { - snprintf(*(char **) arg, 63, "(%d) %s", dvdsub_id, lang); + if (mp_dvdnav_lang_from_sid(mpctx->stream, opts->sub_id, lang)) { + snprintf(*(char **) arg, 63, "(%d) %s", opts->sub_id, lang); return M_PROPERTY_OK; } } @@ -1377,37 +1458,38 @@ static int mp_property_sub(m_option_t * prop, int action, void *arg, || mpctx->demuxer->type == DEMUXER_TYPE_LAVF || mpctx->demuxer->type == DEMUXER_TYPE_LAVF_PREFERRED || mpctx->demuxer->type == DEMUXER_TYPE_OGG) - && d_sub && d_sub->sh && dvdsub_id >= 0) { + && d_sub && d_sub->sh && opts->sub_id >= 0) { const char* lang = ((sh_sub_t*)d_sub->sh)->lang; - if (!lang) lang = MSGTR_Unknown; - snprintf(*(char **) arg, 63, "(%d) %s", dvdsub_id, lang); + if (!lang) lang = mp_gtext("unknown"); + snprintf(*(char **) arg, 63, "(%d) %s", opts->sub_id, lang); return M_PROPERTY_OK; } if (vo_vobsub && vobsub_id >= 0) { - const char *language = MSGTR_Unknown; + const char *language = mp_gtext("unknown"); language = vobsub_get_id(vo_vobsub, (unsigned int) vobsub_id); snprintf(*(char **) arg, 63, "(%d) %s", - vobsub_id, language ? language : MSGTR_Unknown); + vobsub_id, language ? language : mp_gtext("unknown")); return M_PROPERTY_OK; } #ifdef CONFIG_DVDREAD if (vo_spudec && mpctx->stream->type == STREAMTYPE_DVD - && dvdsub_id >= 0) { + && opts->sub_id >= 0) { char lang[3]; - int code = dvd_lang_from_sid(mpctx->stream, dvdsub_id); + int code = dvd_lang_from_sid(mpctx->stream, opts->sub_id); lang[0] = code >> 8; lang[1] = code; lang[2] = 0; - snprintf(*(char **) arg, 63, "(%d) %s", dvdsub_id, lang); + snprintf(*(char **) arg, 63, "(%d) %s", opts->sub_id, lang); return M_PROPERTY_OK; } #endif - if (dvdsub_id >= 0) { - snprintf(*(char **) arg, 63, "(%d) %s", dvdsub_id, MSGTR_Unknown); + if (opts->sub_id >= 0) { + snprintf(*(char **) arg, 63, "(%d) %s", opts->sub_id, + mp_gtext("unknown")); return M_PROPERTY_OK; } - snprintf(*(char **) arg, 63, MSGTR_Disabled); + snprintf(*(char **) arg, 63, mp_gtext("disabled")); return M_PROPERTY_OK; case M_PROPERTY_SET: @@ -1448,7 +1530,7 @@ static int mp_property_sub(m_option_t * prop, int action, void *arg, subdata = NULL; vobsub_id = -1; - dvdsub_id = -1; + opts->sub_id = -1; if (d_sub) { if (d_sub->id > -2) reset_spu = 1; @@ -1464,7 +1546,7 @@ static int mp_property_sub(m_option_t * prop, int action, void *arg, mpctx->set_of_sub_pos = mpctx->global_sub_pos - mpctx->global_sub_indices[SUB_SOURCE_SUBS]; #ifdef CONFIG_ASS - if (ass_enabled && mpctx->set_of_ass_tracks[mpctx->set_of_sub_pos]) + if (opts->ass_enabled && mpctx->set_of_ass_tracks[mpctx->set_of_sub_pos]) ass_track = mpctx->set_of_ass_tracks[mpctx->set_of_sub_pos]; else #endif @@ -1473,17 +1555,17 @@ static int mp_property_sub(m_option_t * prop, int action, void *arg, vo_osd_changed(OSDTYPE_SUBTITLE); } } else if (source == SUB_SOURCE_DEMUX) { - dvdsub_id = + opts->sub_id = mpctx->global_sub_pos - mpctx->global_sub_indices[SUB_SOURCE_DEMUX]; - if (d_sub && dvdsub_id < MAX_S_STREAMS) { + if (d_sub && opts->sub_id < MAX_S_STREAMS) { int i = 0; // default: assume 1:1 mapping of sid and stream id - d_sub->id = dvdsub_id; + d_sub->id = opts->sub_id; d_sub->sh = mpctx->demuxer->s_streams[d_sub->id]; ds_free_packs(d_sub); for (i = 0; i < MAX_S_STREAMS; i++) { sh_sub_t *sh = mpctx->demuxer->s_streams[i]; - if (sh && sh->sid == dvdsub_id) { + if (sh && sh->sid == opts->sub_id) { d_sub->id = i; d_sub->sh = sh; break; @@ -1492,9 +1574,9 @@ 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 CONFIG_ASS - else if (ass_enabled) + else if (opts->ass_enabled) ass_track = sh->ass_track; #endif } else { @@ -1507,23 +1589,20 @@ static int mp_property_sub(m_option_t * prop, int action, void *arg, if (vo_spudec && (mpctx->stream->type == STREAMTYPE_DVD || mpctx->stream->type == STREAMTYPE_DVDNAV) - && dvdsub_id < 0 && reset_spu) { + && opts->sub_id < 0 && reset_spu) { d_sub->id = -2; d_sub->sh = NULL; } #endif - if (mpctx->sh_audio) - pts = mpctx->sh_audio->pts; - if (mpctx->sh_video) - pts = mpctx->sh_video->pts; - update_subtitles(mpctx->sh_video, pts, d_sub, 1); + + update_subtitles(mpctx, &mpctx->opts, mpctx->sh_video, 0, 0, d_sub, 1); return M_PROPERTY_OK; } /// Selected sub source (RW) -static int mp_property_sub_source(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_sub_source(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { int source; if (!mpctx->sh_video || mpctx->global_sub_size <= 0) @@ -1543,16 +1622,16 @@ static int mp_property_sub_source(m_option_t * prop, int action, void *arg, switch (sub_source(mpctx)) { case SUB_SOURCE_SUBS: - snprintf(*(char **) arg, 63, MSGTR_SubSourceFile); + snprintf(*(char **) arg, 63, mp_gtext("file")); break; case SUB_SOURCE_VOBSUB: - snprintf(*(char **) arg, 63, MSGTR_SubSourceVobsub); + snprintf(*(char **) arg, 63, mp_gtext("vobsub")); break; case SUB_SOURCE_DEMUX: - snprintf(*(char **) arg, 63, MSGTR_SubSourceDemux); + snprintf(*(char **) arg, 63, mp_gtext("embedded")); break; default: - snprintf(*(char **) arg, 63, MSGTR_Disabled); + snprintf(*(char **) arg, 63, mp_gtext("disabled")); } return M_PROPERTY_OK; case M_PROPERTY_SET: @@ -1600,8 +1679,8 @@ static int mp_property_sub_source(m_option_t * prop, int action, void *arg, } /// Selected subtitles from specific source (RW) -static int mp_property_sub_by_type(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_sub_by_type(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { int source, is_cur_source, offset; if (!mpctx->sh_video || mpctx->global_sub_size <= 0) @@ -1640,7 +1719,7 @@ static int mp_property_sub_by_type(m_option_t * prop, int action, void *arg, return mp_property_sub(prop, M_PROPERTY_PRINT, arg, mpctx); *(char **) arg = malloc(64); (*(char **) arg)[63] = 0; - snprintf(*(char **) arg, 63, MSGTR_Disabled); + snprintf(*(char **) arg, 63, mp_gtext("disabled")); return M_PROPERTY_OK; case M_PROPERTY_SET: if (!arg) @@ -1700,8 +1779,8 @@ static int mp_property_sub_by_type(m_option_t * prop, int action, void *arg, } /// Subtitle delay (RW) -static int mp_property_sub_delay(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_sub_delay(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { if (!mpctx->sh_video) return M_PROPERTY_UNAVAILABLE; @@ -1709,10 +1788,10 @@ static int mp_property_sub_delay(m_option_t * prop, int action, void *arg, } /// Alignment of text subtitles (RW) -static int mp_property_sub_alignment(m_option_t * prop, int action, - void *arg, MPContext * mpctx) +static int mp_property_sub_alignment(m_option_t *prop, int action, + void *arg, MPContext *mpctx) { - char *name[] = { MSGTR_Top, MSGTR_Center, MSGTR_Bottom }; + char *name[] = { _("top"), _("center"), _("bottom") }; if (!mpctx->sh_video || mpctx->global_sub_pos < 0 || sub_source(mpctx) != SUB_SOURCE_SUBS) @@ -1723,7 +1802,7 @@ static int mp_property_sub_alignment(m_option_t * prop, int action, if (!arg) return M_PROPERTY_ERROR; M_PROPERTY_CLAMP(prop, sub_alignment); - *(char **) arg = strdup(name[sub_alignment]); + *(char **) arg = strdup(mp_gtext(name[sub_alignment])); return M_PROPERTY_OK; case M_PROPERTY_SET: if (!arg) @@ -1737,8 +1816,8 @@ static int mp_property_sub_alignment(m_option_t * prop, int action, } /// Subtitle visibility (RW) -static int mp_property_sub_visibility(m_option_t * prop, int action, - void *arg, MPContext * mpctx) +static int mp_property_sub_visibility(m_option_t *prop, int action, + void *arg, MPContext *mpctx) { if (!mpctx->sh_video) return M_PROPERTY_UNAVAILABLE; @@ -1759,8 +1838,8 @@ static int mp_property_sub_visibility(m_option_t * prop, int action, #ifdef CONFIG_ASS /// Use margins for libass subtitles (RW) -static int mp_property_ass_use_margins(m_option_t * prop, int action, - void *arg, MPContext * mpctx) +static int mp_property_ass_use_margins(m_option_t *prop, int action, + void *arg, MPContext *mpctx) { if (!mpctx->sh_video) return M_PROPERTY_UNAVAILABLE; @@ -1779,8 +1858,8 @@ static int mp_property_ass_use_margins(m_option_t * prop, int action, #endif /// Show only forced subtitles (RW) -static int mp_property_sub_forced_only(m_option_t * prop, int action, - void *arg, MPContext * mpctx) +static int mp_property_sub_forced_only(m_option_t *prop, int action, + void *arg, MPContext *mpctx) { if (!vo_spudec) return M_PROPERTY_UNAVAILABLE; @@ -1802,9 +1881,10 @@ static int mp_property_sub_forced_only(m_option_t * prop, int action, #ifdef CONFIG_FREETYPE /// Subtitle scale (RW) -static int mp_property_sub_scale(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_sub_scale(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { + struct MPOpts *opts = &mpctx->opts; switch (action) { case M_PROPERTY_SET: @@ -1812,7 +1892,7 @@ static int mp_property_sub_scale(m_option_t * prop, int action, void *arg, return M_PROPERTY_ERROR; M_PROPERTY_CLAMP(prop, *(float *) arg); #ifdef CONFIG_ASS - if (ass_enabled) { + if (opts->ass_enabled) { ass_font_scale = *(float *) arg; ass_force_reload = 1; } @@ -1823,7 +1903,7 @@ static int mp_property_sub_scale(m_option_t * prop, int action, void *arg, case M_PROPERTY_STEP_UP: case M_PROPERTY_STEP_DOWN: #ifdef CONFIG_ASS - if (ass_enabled) { + if (opts->ass_enabled) { ass_font_scale += (arg ? *(float *) arg : 0.1)* (action == M_PROPERTY_STEP_UP ? 1.0 : -1.0); M_PROPERTY_CLAMP(prop, ass_font_scale); @@ -1837,7 +1917,7 @@ static int mp_property_sub_scale(m_option_t * prop, int action, void *arg, return M_PROPERTY_OK; default: #ifdef CONFIG_ASS - if (ass_enabled) + if (opts->ass_enabled) return m_property_float_ro(prop, action, arg, ass_font_scale); else #endif @@ -1855,8 +1935,8 @@ static int mp_property_sub_scale(m_option_t * prop, int action, void *arg, #ifdef CONFIG_TV /// TV color settings (RW) -static int mp_property_tv_color(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_tv_color(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { int r, val; tvi_handle_t *tvh = mpctx->demuxer->priv; @@ -1888,8 +1968,8 @@ static int mp_property_tv_color(m_option_t * prop, int action, void *arg, #endif -static int mp_property_teletext_common(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_teletext_common(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { int val,result; int base_ioctl=(int)prop->priv; @@ -1928,8 +2008,8 @@ static int mp_property_teletext_common(m_option_t * prop, int action, void *arg, return result == VBI_CONTROL_TRUE ? M_PROPERTY_OK : M_PROPERTY_ERROR; } -static int mp_property_teletext_mode(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_teletext_mode(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { int result; int val; @@ -1941,14 +2021,14 @@ static int mp_property_teletext_mode(m_option_t * prop, int action, void *arg, if(teletext_control(mpctx->demuxer->teletext, (int)prop->priv, &val)==VBI_CONTROL_TRUE && val) - mp_input_set_section("teletext"); + mp_input_set_section(mpctx->input, "teletext"); else - mp_input_set_section("tv"); + mp_input_set_section(mpctx->input, "tv"); return M_PROPERTY_OK; } -static int mp_property_teletext_page(m_option_t * prop, int action, void *arg, - MPContext * mpctx) +static int mp_property_teletext_page(m_option_t *prop, int action, void *arg, + MPContext *mpctx) { int result; int val; @@ -2039,6 +2119,8 @@ static const m_option_t mp_properties[] = { M_OPT_RANGE, 0, 1, NULL }, { "deinterlace", mp_property_deinterlace, CONF_TYPE_FLAG, M_OPT_RANGE, 0, 1, NULL }, + { "yuv_colorspace", mp_property_yuv_colorspace, CONF_TYPE_INT, + M_OPT_RANGE, 0, 2, NULL }, { "ontop", mp_property_ontop, CONF_TYPE_FLAG, M_OPT_RANGE, 0, 1, NULL }, { "rootwin", mp_property_rootwin, CONF_TYPE_FLAG, @@ -2048,15 +2130,15 @@ static const m_option_t mp_properties[] = { { "framedropping", mp_property_framedropping, CONF_TYPE_INT, M_OPT_RANGE, 0, 2, NULL }, { "gamma", mp_property_gamma, CONF_TYPE_INT, - M_OPT_RANGE, -100, 100, &vo_gamma_gamma }, + M_OPT_RANGE, -100, 100, (void *)offsetof(struct MPOpts, vo_gamma_gamma)}, { "brightness", mp_property_gamma, CONF_TYPE_INT, - M_OPT_RANGE, -100, 100, &vo_gamma_brightness }, + M_OPT_RANGE, -100, 100, (void *)offsetof(struct MPOpts, vo_gamma_brightness) }, { "contrast", mp_property_gamma, CONF_TYPE_INT, - M_OPT_RANGE, -100, 100, &vo_gamma_contrast }, + M_OPT_RANGE, -100, 100, (void *)offsetof(struct MPOpts, vo_gamma_contrast) }, { "saturation", mp_property_gamma, CONF_TYPE_INT, - M_OPT_RANGE, -100, 100, &vo_gamma_saturation }, + M_OPT_RANGE, -100, 100, (void *)offsetof(struct MPOpts, vo_gamma_saturation) }, { "hue", mp_property_gamma, CONF_TYPE_INT, - M_OPT_RANGE, -100, 100, &vo_gamma_hue }, + M_OPT_RANGE, -100, 100, (void *)offsetof(struct MPOpts, vo_gamma_hue) }, { "panscan", mp_property_panscan, CONF_TYPE_FLOAT, M_OPT_RANGE, 0, 1, NULL }, { "vsync", mp_property_vsync, CONF_TYPE_FLAG, @@ -2147,7 +2229,7 @@ char* mp_property_print(const char *name, void* ctx) return ret; } -char *property_expand_string(MPContext * mpctx, char *str) +char *property_expand_string(MPContext *mpctx, char *str) { return m_properties_expand_string(mp_properties, str, mpctx); } @@ -2158,8 +2240,120 @@ void property_print_help(void) } -///@} -// Properties group +/* List of default ways to show a property on OSD. + * + * Setting osd_progbar to -1 displays seek bar, other nonzero displays + * a bar showing the current position between min/max values of the + * property. In this case osd_msg is only used for terminal output + * if there is no video; it'll be a label shown together with percentage. + * + * Otherwise setting osd_msg will show the string on OSD, formatted with + * the text value of the property as argument. + */ +static struct property_osd_display { + /// property name + const char *name; + /// progressbar type + int osd_progbar; // -1 is special value for seek indicators + /// osd msg id if it must be shared + int osd_id; + /// osd msg template + const char *osd_msg; +} property_osd_display[] = { + // general + { "loop", 0, -1, _("Loop: %s") }, + { "chapter", -1, -1, NULL }, + // audio + { "volume", OSD_VOLUME, -1, _("Volume") }, + { "mute", 0, -1, _("Mute: %s") }, + { "audio_delay", 0, -1, _("A-V delay: %s") }, + { "switch_audio", 0, -1, _("Audio: %s") }, + { "balance", OSD_BALANCE, -1, _("Balance") }, + // video + { "panscan", OSD_PANSCAN, -1, _("Panscan") }, + { "ontop", 0, -1, _("Stay on top: %s") }, + { "rootwin", 0, -1, _("Rootwin: %s") }, + { "border", 0, -1, _("Border: %s") }, + { "framedropping", 0, -1, _("Framedropping: %s") }, + { "deinterlace", 0, -1, _("Deinterlace: %s") }, + { "yuv_colorspace", 0, -1, _("YUV colorspace: %s") }, + { "gamma", OSD_BRIGHTNESS, -1, _("Gamma") }, + { "brightness", OSD_BRIGHTNESS, -1, _("Brightness") }, + { "contrast", OSD_CONTRAST, -1, _("Contrast") }, + { "saturation", OSD_SATURATION, -1, _("Saturation") }, + { "hue", OSD_HUE, -1, _("Hue") }, + { "vsync", 0, -1, _("VSync: %s") }, + // subs + { "sub", 0, -1, _("Subtitles: %s") }, + { "sub_source", 0, -1, _("Sub source: %s") }, + { "sub_vob", 0, -1, _("Subtitles: %s") }, + { "sub_demux", 0, -1, _("Subtitles: %s") }, + { "sub_file", 0, -1, _("Subtitles: %s") }, + { "sub_pos", 0, -1, _("Sub position: %s/100") }, + { "sub_alignment", 0, -1, _("Sub alignment: %s") }, + { "sub_delay", 0, OSD_MSG_SUB_DELAY, _("Sub delay: %s") }, + { "sub_visibility", 0, -1, _("Subtitles: %s") }, + { "sub_forced_only", 0, -1, _("Forced sub only: %s") }, +#ifdef CONFIG_FREETYPE + { "sub_scale", 0, -1, _("Sub Scale: %s")}, +#endif +#ifdef CONFIG_TV + { "tv_brightness", OSD_BRIGHTNESS, -1, _("Brightness") }, + { "tv_hue", OSD_HUE, -1, _("Hue") }, + { "tv_saturation", OSD_SATURATION, -1, _("Saturation") }, + { "tv_contrast", OSD_CONTRAST, -1, _("Contrast") }, +#endif + {} +}; + +static int show_property_osd(MPContext *mpctx, const char *pname) +{ + struct MPOpts *opts = &mpctx->opts; + int r; + m_option_t* prop; + struct property_osd_display *p; + + // look for the command + for (p = property_osd_display; p->name; p++) + if (!strcmp(p->name, pname)) + break; + if (!p->name) + return -1; + + if (mp_property_do(pname, M_PROPERTY_GET_TYPE, &prop, mpctx) <= 0 || !prop) + return -1; + + if (p->osd_progbar == -1) + mpctx->add_osd_seek_info = true; + else if (p->osd_progbar) { + if (prop->type == CONF_TYPE_INT) { + if (mp_property_do(pname, M_PROPERTY_GET, &r, mpctx) > 0) + set_osd_bar(mpctx, p->osd_progbar, mp_gtext(p->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(mpctx, p->osd_progbar, mp_gtext(p->osd_msg), + prop->min, prop->max, f); + } else { + mp_msg(MSGT_CPLAYER, MSGL_ERR, + "Property use an unsupported type.\n"); + return -1; + } + return 0; + } + + if (p->osd_msg) { + char *val = mp_property_print(pname, mpctx); + if (val) { + int index = p - property_osd_display; + set_osd_tmsg(p->osd_id >= 0 ? p->osd_id : OSD_MSG_PROPERTY + index, + 1, opts->osd_duration, p->osd_msg, val); + free(val); + } + } + return 0; +} /** @@ -2189,65 +2383,59 @@ static struct { int cmd; /// set/adjust or toggle command int toggle; - /// progressbar type - int osd_progbar; - /// osd msg id if it must be shared - int osd_id; - /// osd msg template - const char *osd_msg; } set_prop_cmd[] = { // general - { "loop", MP_CMD_LOOP, 0, 0, -1, MSGTR_LoopStatus }, - { "chapter", MP_CMD_SEEK_CHAPTER, 0, 0, -1, NULL }, - { "angle", MP_CMD_SWITCH_ANGLE, 0, 0, -1, NULL }, + { "loop", MP_CMD_LOOP, 0}, + { "chapter", MP_CMD_SEEK_CHAPTER, 0}, + { "angle", MP_CMD_SWITCH_ANGLE, 0}, + { "pause", MP_CMD_PAUSE, 0}, // audio - { "volume", MP_CMD_VOLUME, 0, OSD_VOLUME, -1, MSGTR_Volume }, - { "mute", MP_CMD_MUTE, 1, 0, -1, MSGTR_MuteStatus }, - { "audio_delay", MP_CMD_AUDIO_DELAY, 0, 0, -1, MSGTR_AVDelayStatus }, - { "switch_audio", MP_CMD_SWITCH_AUDIO, 1, 0, -1, MSGTR_OSDAudio }, - { "balance", MP_CMD_BALANCE, 0, OSD_BALANCE, -1, MSGTR_Balance }, + { "volume", MP_CMD_VOLUME, 0}, + { "mute", MP_CMD_MUTE, 1}, + { "audio_delay", MP_CMD_AUDIO_DELAY, 0}, + { "switch_audio", MP_CMD_SWITCH_AUDIO, 1}, + { "balance", MP_CMD_BALANCE, 0}, // video - { "fullscreen", MP_CMD_VO_FULLSCREEN, 1, 0, -1, NULL }, - { "panscan", MP_CMD_PANSCAN, 0, OSD_PANSCAN, -1, MSGTR_Panscan }, - { "ontop", MP_CMD_VO_ONTOP, 1, 0, -1, MSGTR_OnTopStatus }, - { "rootwin", MP_CMD_VO_ROOTWIN, 1, 0, -1, MSGTR_RootwinStatus }, - { "border", MP_CMD_VO_BORDER, 1, 0, -1, MSGTR_BorderStatus }, - { "framedropping", MP_CMD_FRAMEDROPPING, 1, 0, -1, MSGTR_FramedroppingStatus }, - { "gamma", MP_CMD_GAMMA, 0, OSD_BRIGHTNESS, -1, MSGTR_Gamma }, - { "brightness", MP_CMD_BRIGHTNESS, 0, OSD_BRIGHTNESS, -1, MSGTR_Brightness }, - { "contrast", MP_CMD_CONTRAST, 0, OSD_CONTRAST, -1, MSGTR_Contrast }, - { "saturation", MP_CMD_SATURATION, 0, OSD_SATURATION, -1, MSGTR_Saturation }, - { "hue", MP_CMD_HUE, 0, OSD_HUE, -1, MSGTR_Hue }, - { "vsync", MP_CMD_SWITCH_VSYNC, 1, 0, -1, MSGTR_VSyncStatus }, - // subs - { "sub", MP_CMD_SUB_SELECT, 1, 0, -1, MSGTR_SubSelectStatus }, - { "sub_source", MP_CMD_SUB_SOURCE, 1, 0, -1, MSGTR_SubSourceStatus }, - { "sub_vob", MP_CMD_SUB_VOB, 1, 0, -1, MSGTR_SubSelectStatus }, - { "sub_demux", MP_CMD_SUB_DEMUX, 1, 0, -1, MSGTR_SubSelectStatus }, - { "sub_file", MP_CMD_SUB_FILE, 1, 0, -1, MSGTR_SubSelectStatus }, - { "sub_pos", MP_CMD_SUB_POS, 0, 0, -1, MSGTR_SubPosStatus }, - { "sub_alignment", MP_CMD_SUB_ALIGNMENT, 1, 0, -1, MSGTR_SubAlignStatus }, - { "sub_delay", MP_CMD_SUB_DELAY, 0, 0, OSD_MSG_SUB_DELAY, MSGTR_SubDelayStatus }, - { "sub_visibility", MP_CMD_SUB_VISIBILITY, 1, 0, -1, MSGTR_SubVisibleStatus }, - { "sub_forced_only", MP_CMD_SUB_FORCED_ONLY, 1, 0, -1, MSGTR_SubForcedOnlyStatus }, + { "fullscreen", MP_CMD_VO_FULLSCREEN, 1}, + { "panscan", MP_CMD_PANSCAN, 0}, + { "ontop", MP_CMD_VO_ONTOP, 1}, + { "rootwin", MP_CMD_VO_ROOTWIN, 1}, + { "border", MP_CMD_VO_BORDER, 1}, + { "framedropping", MP_CMD_FRAMEDROPPING, 1}, + { "gamma", MP_CMD_GAMMA, 0}, + { "brightness", MP_CMD_BRIGHTNESS, 0}, + { "contrast", MP_CMD_CONTRAST, 0}, + { "saturation", MP_CMD_SATURATION, 0}, + { "hue", MP_CMD_HUE, 0}, + { "vsync", MP_CMD_SWITCH_VSYNC, 1}, + // subs + { "sub", MP_CMD_SUB_SELECT, 1}, + { "sub_source", MP_CMD_SUB_SOURCE, 1}, + { "sub_vob", MP_CMD_SUB_VOB, 1}, + { "sub_demux", MP_CMD_SUB_DEMUX, 1}, + { "sub_file", MP_CMD_SUB_FILE, 1}, + { "sub_pos", MP_CMD_SUB_POS, 0}, + { "sub_alignment", MP_CMD_SUB_ALIGNMENT, 1}, + { "sub_delay", MP_CMD_SUB_DELAY, 0}, + { "sub_visibility", MP_CMD_SUB_VISIBILITY, 1}, + { "sub_forced_only", MP_CMD_SUB_FORCED_ONLY, 1}, #ifdef CONFIG_FREETYPE - { "sub_scale", MP_CMD_SUB_SCALE, 0, 0, -1, MSGTR_SubScale}, + { "sub_scale", MP_CMD_SUB_SCALE, 0}, #endif #ifdef CONFIG_ASS - { "ass_use_margins", MP_CMD_ASS_USE_MARGINS, 1, 0, -1, NULL }, + { "ass_use_margins", MP_CMD_ASS_USE_MARGINS, 1}, #endif #ifdef CONFIG_TV - { "tv_brightness", MP_CMD_TV_SET_BRIGHTNESS, 0, OSD_BRIGHTNESS, -1, MSGTR_Brightness }, - { "tv_hue", MP_CMD_TV_SET_HUE, 0, OSD_HUE, -1, MSGTR_Hue }, - { "tv_saturation", MP_CMD_TV_SET_SATURATION, 0, OSD_SATURATION, -1, MSGTR_Saturation }, - { "tv_contrast", MP_CMD_TV_SET_CONTRAST, 0, OSD_CONTRAST, -1, MSGTR_Contrast }, + { "tv_brightness", MP_CMD_TV_SET_BRIGHTNESS, 0}, + { "tv_hue", MP_CMD_TV_SET_HUE, 0}, + { "tv_saturation", MP_CMD_TV_SET_SATURATION, 0}, + { "tv_contrast", MP_CMD_TV_SET_CONTRAST, 0}, #endif - { NULL, 0, 0, 0, -1, NULL } + {} }; - /// Handle commands that set a property. -static int set_property_command(MPContext * mpctx, mp_cmd_t * cmd) +static int set_property_command(MPContext *mpctx, mp_cmd_t *cmd) { int i, r; m_option_t* prop; @@ -2278,31 +2466,8 @@ static int set_property_command(MPContext * mpctx, mp_cmd_t * cmd) if (r <= 0) return 1; - 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_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_prop_cmd[i].osd_msg, prop->min, prop->max, f); - } else - mp_msg(MSGT_CPLAYER, MSGL_ERR, - "Property use an unsupported type.\n"); - return 1; - } + show_property_osd(mpctx, pname); - if (set_prop_cmd[i].osd_msg) { - char *val = mp_property_print(pname, mpctx); - if (val) { - set_osd_msg(set_prop_cmd[i].osd_id >= - 0 ? set_prop_cmd[i].osd_id : OSD_MSG_PROPERTY + i, - 1, osd_duration, set_prop_cmd[i].osd_msg, val); - free(val); - } - } return 1; } @@ -2360,7 +2525,7 @@ static void remove_subtitle_range(MPContext *mpctx, int start, int count) int after = mpctx->set_of_sub_size - end; sub_data **subs = mpctx->set_of_subtitles; #ifdef CONFIG_ASS - ass_track_t **ass_tracks = mpctx->set_of_ass_tracks; + struct ass_track **ass_tracks = mpctx->set_of_ass_tracks; #endif if (count < 0 || count > mpctx->set_of_sub_size || start < 0 || start > mpctx->set_of_sub_size - count) { @@ -2371,7 +2536,7 @@ static void remove_subtitle_range(MPContext *mpctx, int start, int count) for (idx = start; idx < end; idx++) { sub_data *subd = subs[idx]; mp_msg(MSGT_CPLAYER, MSGL_STATUS, - MSGTR_RemovedSubtitleFile, idx + 1, + "SUB: Removed subtitle file (%d): %s\n", idx + 1, filename_recode(subd->filename)); sub_free(subd); subs[idx] = NULL; @@ -2400,46 +2565,49 @@ static void remove_subtitle_range(MPContext *mpctx, int start, int count) #ifdef CONFIG_ASS ass_track = NULL; #endif - mp_input_queue_cmd(mp_input_parse_cmd("sub_select")); + mp_input_queue_cmd(mpctx->input, mp_input_parse_cmd("sub_select")); } else if (mpctx->set_of_sub_pos >= end) { mpctx->set_of_sub_pos -= count; mpctx->global_sub_pos -= count; } } -int run_command(MPContext * mpctx, mp_cmd_t * cmd) +void run_command(MPContext *mpctx, mp_cmd_t *cmd) { + struct MPOpts *opts = &mpctx->opts; sh_audio_t * const sh_audio = mpctx->sh_audio; sh_video_t * const sh_video = mpctx->sh_video; - int brk_cmd = 0; + int osd_duration = opts->osd_duration; + int case_fallthrough_hack = 0; if (!set_property_command(mpctx, cmd)) switch (cmd->id) { case MP_CMD_SEEK:{ float v; int abs; - if (sh_video) - mpctx->osd_show_percentage = sh_video->fps; + mpctx->add_osd_seek_info = true; v = cmd->args[0].v.f; abs = (cmd->nargs > 1) ? cmd->args[1].v.i : 0; if (abs == 2) { /* Absolute seek to a specific timestamp in seconds */ - abs_seek_pos = SEEK_ABSOLUTE; + mpctx->abs_seek_pos = SEEK_ABSOLUTE; if (sh_video) mpctx->osd_function = (v > sh_video->pts) ? OSD_FFW : OSD_REW; - rel_seek_secs = v; + mpctx->rel_seek_secs = v; } else if (abs) { /* Absolute seek by percentage */ - abs_seek_pos = SEEK_ABSOLUTE | SEEK_FACTOR; + mpctx->abs_seek_pos = SEEK_ABSOLUTE | SEEK_FACTOR; if (sh_video) mpctx->osd_function = OSD_FFW; // Direction isn't set correctly - rel_seek_secs = v / 100.0; + mpctx->rel_seek_secs = v / 100.0; } else { - rel_seek_secs += v; + mpctx->rel_seek_secs += v; mpctx->osd_function = (v > 0) ? OSD_FFW : OSD_REW; } - brk_cmd = 1; } break; + case MP_CMD_SET_PROPERTY_OSD: + case_fallthrough_hack = 1; + case MP_CMD_SET_PROPERTY:{ int r = mp_property_do(cmd->args[0].v.s, M_PROPERTY_PARSE, cmd->args[1].v.s, mpctx); @@ -2450,11 +2618,16 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) mp_msg(MSGT_CPLAYER, MSGL_WARN, "Failed to set property '%s' to '%s'.\n", cmd->args[0].v.s, cmd->args[1].v.s); + else if (case_fallthrough_hack) + show_property_osd(mpctx, cmd->args[0].v.s); if (r <= 0) mp_msg(MSGT_GLOBAL, MSGL_INFO, "ANS_ERROR=%s\n", property_error_string(r)); } break; + case MP_CMD_STEP_PROPERTY_OSD: + case_fallthrough_hack = 1; + case MP_CMD_STEP_PROPERTY:{ void* arg = NULL; int r,i; @@ -2493,6 +2666,8 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) mp_msg(MSGT_CPLAYER, MSGL_WARN, "Failed to increment property '%s' by %f.\n", cmd->args[0].v.s, cmd->args[1].v.f); + else if (case_fallthrough_hack) + show_property_osd(mpctx, cmd->args[0].v.s); if (r <= 0) mp_msg(MSGT_GLOBAL, MSGL_INFO, "ANS_ERROR=%s\n", property_error_string(r)); } @@ -2518,18 +2693,16 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) case MP_CMD_EDL_MARK: if (edl_fd) { float v = sh_video ? sh_video->pts : - playing_audio_pts(sh_audio, mpctx->d_audio, - mpctx->audio_out); - + playing_audio_pts(mpctx); if (mpctx->begin_skip == MP_NOPTS_VALUE) { mpctx->begin_skip = v; - mp_msg(MSGT_CPLAYER, MSGL_INFO, MSGTR_EdloutStartSkip); + mp_tmsg(MSGT_CPLAYER, MSGL_INFO, "EDL skip start, press 'i' again to end block.\n"); } else { if (mpctx->begin_skip > v) - mp_msg(MSGT_CPLAYER, MSGL_WARN, MSGTR_EdloutBadStop); + mp_tmsg(MSGT_CPLAYER, MSGL_WARN, "EDL skip canceled, last start > stop\n"); else { fprintf(edl_fd, "%f %f %d\n", mpctx->begin_skip, v, 0); - mp_msg(MSGT_CPLAYER, MSGL_INFO, MSGTR_EdloutEndSkip); + mp_tmsg(MSGT_CPLAYER, MSGL_INFO, "EDL skip end, line written.\n"); } mpctx->begin_skip = MP_NOPTS_VALUE; } @@ -2540,40 +2713,38 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) if (!sh_video) break; if (cmd->nargs == 0 || cmd->args[0].v.f == -1) - movie_aspect = (float) sh_video->disp_w / sh_video->disp_h; + opts->movie_aspect = (float) sh_video->disp_w / sh_video->disp_h; else - movie_aspect = cmd->args[0].v.f; + opts->movie_aspect = cmd->args[0].v.f; mpcodecs_config_vo(sh_video, sh_video->disp_w, sh_video->disp_h, 0); break; case MP_CMD_SPEED_INCR:{ float v = cmd->args[0].v.f; - playback_speed += v; - build_afilter_chain(sh_audio, &ao_data); - set_osd_msg(OSD_MSG_SPEED, 1, osd_duration, MSGTR_OSDSpeed, - playback_speed); + opts->playback_speed += v; + build_afilter_chain(mpctx, sh_audio, &ao_data); + set_osd_tmsg(OSD_MSG_SPEED, 1, osd_duration, "Speed: x %6.2f", + opts->playback_speed); } break; case MP_CMD_SPEED_MULT:{ float v = cmd->args[0].v.f; - playback_speed *= v; - build_afilter_chain(sh_audio, &ao_data); - set_osd_msg(OSD_MSG_SPEED, 1, osd_duration, MSGTR_OSDSpeed, - playback_speed); + opts->playback_speed *= v; + build_afilter_chain(mpctx, sh_audio, &ao_data); + set_osd_tmsg(OSD_MSG_SPEED, 1, osd_duration, "Speed: x %6.2f", + opts->playback_speed); } break; case MP_CMD_SPEED_SET:{ float v = cmd->args[0].v.f; - playback_speed = v; - build_afilter_chain(sh_audio, &ao_data); - set_osd_msg(OSD_MSG_SPEED, 1, osd_duration, MSGTR_OSDSpeed, - playback_speed); + opts->playback_speed = v; + build_afilter_chain(mpctx, sh_audio, &ao_data); + set_osd_tmsg(OSD_MSG_SPEED, 1, osd_duration, "Speed: x %6.2f", + opts->playback_speed); } break; case MP_CMD_FRAME_STEP: - case MP_CMD_PAUSE: - cmd->pausing = 1; - brk_cmd = 1; + add_step_frame(mpctx); break; case MP_CMD_FILE_FILTER: @@ -2581,38 +2752,26 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) break; case MP_CMD_QUIT: - exit_player_with_rc(EXIT_QUIT, + exit_player_with_rc(mpctx, EXIT_QUIT, (cmd->nargs > 0) ? cmd->args[0].v.i : 0); case MP_CMD_PLAY_TREE_STEP:{ int n = cmd->args[0].v.i == 0 ? 1 : cmd->args[0].v.i; int force = cmd->args[1].v.i; -#ifdef CONFIG_GUI - if (use_gui) { - int i = 0; - if (n > 0) - for (i = 0; i < n; i++) - mplNext(); - else - for (i = 0; i < -1 * n; i++) - mplPrev(); - } else -#endif { if (!force && mpctx->playtree_iter) { play_tree_iter_t *i = play_tree_iter_new_copy(mpctx->playtree_iter); if (play_tree_iter_step(i, n, 0) == PLAY_TREE_ITER_ENTRY) - mpctx->eof = + mpctx->stop_play = (n > 0) ? PT_NEXT_ENTRY : PT_PREV_ENTRY; play_tree_iter_free(i); } else - mpctx->eof = (n > 0) ? PT_NEXT_ENTRY : PT_PREV_ENTRY; - if (mpctx->eof) + mpctx->stop_play = (n > 0) ? PT_NEXT_ENTRY : PT_PREV_ENTRY; + if (mpctx->stop_play) mpctx->play_tree_step = n; - brk_cmd = 1; } } break; @@ -2625,11 +2784,10 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) play_tree_iter_t *i = play_tree_iter_new_copy(mpctx->playtree_iter); if (play_tree_iter_up_step(i, n, 0) == PLAY_TREE_ITER_ENTRY) - mpctx->eof = (n > 0) ? PT_UP_NEXT : PT_UP_PREV; + mpctx->stop_play = (n > 0) ? PT_UP_NEXT : PT_UP_PREV; play_tree_iter_free(i); } else - mpctx->eof = (n > 0) ? PT_UP_NEXT : PT_UP_PREV; - brk_cmd = 1; + mpctx->stop_play = (n > 0) ? PT_UP_NEXT : PT_UP_PREV; } break; @@ -2639,11 +2797,10 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) if (v > 0 && mpctx->playtree_iter->file < mpctx->playtree_iter->num_files) - mpctx->eof = PT_NEXT_SRC; + mpctx->stop_play = PT_NEXT_SRC; else if (v < 0 && mpctx->playtree_iter->file > 1) - mpctx->eof = PT_PREV_SRC; + mpctx->stop_play = PT_PREV_SRC; } - brk_cmd = 1; break; case MP_CMD_SUB_STEP: @@ -2657,32 +2814,32 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) (sh_video->pts + sub_delay) * 1000 + .5, movement) / 1000.; #endif - set_osd_msg(OSD_MSG_SUB_DELAY, 1, osd_duration, - MSGTR_OSDSubDelay, ROUND(sub_delay * 1000)); + set_osd_tmsg(OSD_MSG_SUB_DELAY, 1, osd_duration, + "Sub delay: %d ms", ROUND(sub_delay * 1000)); } break; case MP_CMD_SUB_LOG: - log_sub(); + log_sub(mpctx); break; case MP_CMD_OSD:{ int v = cmd->args[0].v.i; int max = (term_osd && !sh_video) ? MAX_TERM_OSD_LEVEL : MAX_OSD_LEVEL; - if (osd_level > max) - osd_level = max; + if (opts->osd_level > max) + opts->osd_level = max; if (v < 0) - osd_level = (osd_level + 1) % (max + 1); + opts->osd_level = (opts->osd_level + 1) % (max + 1); else - osd_level = v > max ? max : v; + opts->osd_level = v > max ? max : v; /* Show OSD state when disabled, but not when an explicit argument is given to the OSD command, i.e. in slave mode. */ - if (v == -1 && osd_level <= 1) - set_osd_msg(OSD_MSG_OSD_STATUS, 0, osd_duration, - MSGTR_OSDosd, - osd_level ? MSGTR_OSDenabled : - MSGTR_OSDdisabled); + if (v == -1 && opts->osd_level <= 1) + set_osd_tmsg(OSD_MSG_OSD_STATUS, 0, osd_duration, + "OSD: %s", + opts->osd_level ? mp_gtext("enabled") : + mp_gtext("disabled")); else rm_osd_msg(OSD_MSG_OSD_STATUS); } @@ -2724,17 +2881,16 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) play_tree_free_list(mpctx->playtree->child, 1); play_tree_set_child(mpctx->playtree, e); pt_iter_goto_head(mpctx->playtree_iter); - mpctx->eof = PT_NEXT_SRC; + mpctx->stop_play = PT_NEXT_SRC; } - brk_cmd = 1; } break; case MP_CMD_LOADLIST:{ - play_tree_t *e = parse_playlist_file(cmd->args[0].v.s); + play_tree_t *e = parse_playlist_file(mpctx->mconfig, cmd->args[0].v.s); if (!e) - mp_msg(MSGT_CPLAYER, MSGL_ERR, - MSGTR_PlaylistLoadUnable, cmd->args[0].v.s); + mp_tmsg(MSGT_CPLAYER, MSGL_ERR, + "\nUnable to load playlist %s.\n", cmd->args[0].v.s); else { if (cmd->args[1].v.i) // append play_tree_append_entry(mpctx->playtree->child, e); @@ -2747,10 +2903,9 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) play_tree_free_list(mpctx->playtree->child, 1); play_tree_set_child(mpctx->playtree, e); pt_iter_goto_head(mpctx->playtree_iter); - mpctx->eof = PT_NEXT_SRC; + mpctx->stop_play = PT_NEXT_SRC; } } - brk_cmd = 1; } break; @@ -2759,14 +2914,13 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) while (play_tree_iter_up_step (mpctx->playtree_iter, 0, 1) != PLAY_TREE_ITER_END) /* NOP */ ; - mpctx->eof = PT_STOP; - brk_cmd = 1; + mpctx->stop_play = PT_STOP; break; case MP_CMD_OSD_SHOW_PROGRESSION:{ int len = demuxer_get_time_length(mpctx->demuxer); int pts = demuxer_get_current_time(mpctx->demuxer); - set_osd_bar(0, "Position", 0, 100, demuxer_get_percent_pos(mpctx->demuxer)); + set_osd_bar(mpctx, 0, "Position", 0, 100, demuxer_get_percent_pos(mpctx->demuxer)); set_osd_msg(OSD_MSG_TEXT, 1, osd_duration, "%c %02d:%02d:%02d / %02d:%02d:%02d", mpctx->osd_function, pts/3600, (pts/60)%60, pts%60, @@ -2785,9 +2939,9 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) radio_step_channel(mpctx->demuxer->stream, RADIO_CHANNEL_LOWER); if (radio_get_channel_name(mpctx->demuxer->stream)) { - set_osd_msg(OSD_MSG_RADIO_CHANNEL, 1, osd_duration, - MSGTR_OSDChannel, - radio_get_channel_name(mpctx->demuxer->stream)); + set_osd_tmsg(OSD_MSG_RADIO_CHANNEL, 1, osd_duration, + "Channel: %s", + radio_get_channel_name(mpctx->demuxer->stream)); } } break; @@ -2796,9 +2950,9 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) if (mpctx->demuxer->stream->type == STREAMTYPE_RADIO) { radio_set_channel(mpctx->demuxer->stream, cmd->args[0].v.s); if (radio_get_channel_name(mpctx->demuxer->stream)) { - set_osd_msg(OSD_MSG_RADIO_CHANNEL, 1, osd_duration, - MSGTR_OSDChannel, - radio_get_channel_name(mpctx->demuxer->stream)); + set_osd_tmsg(OSD_MSG_RADIO_CHANNEL, 1, osd_duration, + "Channel: %s", + radio_get_channel_name(mpctx->demuxer->stream)); } } break; @@ -2866,8 +3020,8 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) TV_CHANNEL_LOWER); } if (tv_channel_list) { - set_osd_msg(OSD_MSG_TV_CHANNEL, 1, osd_duration, - MSGTR_OSDChannel, tv_channel_current->name); + set_osd_tmsg(OSD_MSG_TV_CHANNEL, 1, osd_duration, + "Channel: %s", tv_channel_current->name); //vo_osd_changed(OSDTYPE_SUBTITLE); } } @@ -2893,8 +3047,10 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) dir = DVB_CHANNEL_LOWER; - if (dvb_step_channel(mpctx->stream, dir)) - mpctx->eof = mpctx->dvbin_reopen = 1; + if (dvb_step_channel(mpctx->stream, dir)) { + mpctx->stop_play = PT_NEXT_ENTRY; + mpctx->dvbin_reopen = 1; + } } #endif /* CONFIG_DVBIN */ break; @@ -2904,8 +3060,8 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) tv_set_channel((tvi_handle_t *) (mpctx->demuxer->priv), cmd->args[0].v.s); if (tv_channel_list) { - set_osd_msg(OSD_MSG_TV_CHANNEL, 1, osd_duration, - MSGTR_OSDChannel, tv_channel_current->name); + set_osd_tmsg(OSD_MSG_TV_CHANNEL, 1, osd_duration, + "Channel: %s", tv_channel_current->name); //vo_osd_changed(OSDTYPE_SUBTITLE); } } @@ -2924,9 +3080,11 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) if (mpctx->stream->type == STREAMTYPE_DVB) { mpctx->last_dvb_step = 1; - if (dvb_set_channel - (mpctx->stream, cmd->args[1].v.i, cmd->args[0].v.i)) - mpctx->eof = mpctx->dvbin_reopen = 1; + if (dvb_set_channel(mpctx->stream, cmd->args[1].v.i, + cmd->args[0].v.i)) { + mpctx->stop_play = PT_NEXT_ENTRY; + mpctx->dvbin_reopen = 1; + } } break; #endif /* CONFIG_DVBIN */ @@ -2935,8 +3093,8 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) if (mpctx->file_format == DEMUXER_TYPE_TV) { tv_last_channel((tvi_handle_t *) (mpctx->demuxer->priv)); if (tv_channel_list) { - set_osd_msg(OSD_MSG_TV_CHANNEL, 1, osd_duration, - MSGTR_OSDChannel, tv_channel_current->name); + set_osd_tmsg(OSD_MSG_TV_CHANNEL, 1, osd_duration, + "Channel: %s", tv_channel_current->name); //vo_osd_changed(OSDTYPE_SUBTITLE); } } @@ -2978,7 +3136,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] = @@ -3007,7 +3165,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) break; case MP_CMD_SCREENSHOT: - if (vo_config_count) { + if (mpctx->video_out && mpctx->video_out->config_ok) { mp_msg(MSGT_CPLAYER, MSGL_INFO, "sending VFCTRL_SCREENSHOT!\n"); if (CONTROL_OK != ((vf_instance_t *) sh_video->vfilter)-> @@ -3024,19 +3182,19 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) break; case MP_CMD_GET_TIME_LENGTH:{ - mp_msg(MSGT_GLOBAL, MSGL_INFO, "ANS_LENGTH=%.2lf\n", + mp_msg(MSGT_GLOBAL, MSGL_INFO, "ANS_LENGTH=%.2f\n", demuxer_get_time_length(mpctx->demuxer)); } break; 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); @@ -3045,7 +3203,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); @@ -3054,7 +3212,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, @@ -3064,7 +3222,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); @@ -3073,7 +3231,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); @@ -3082,7 +3240,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); @@ -3091,7 +3249,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); @@ -3100,7 +3258,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); @@ -3109,7 +3267,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); @@ -3118,7 +3276,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); @@ -3127,7 +3285,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); @@ -3136,7 +3294,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); @@ -3145,7 +3303,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); @@ -3154,7 +3312,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) break; case MP_CMD_GET_VO_FULLSCREEN: - if (mpctx->video_out && vo_config_count) + if (mpctx->video_out && mpctx->video_out->config_ok) mp_msg(MSGT_GLOBAL, MSGL_INFO, "ANS_VO_FULLSCREEN=%d\n", vo_fs); break; @@ -3168,9 +3326,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) if (sh_video) pos = sh_video->pts; else if (sh_audio && mpctx->audio_out) - pos = - playing_audio_pts(sh_audio, mpctx->d_audio, - mpctx->audio_out); + pos = playing_audio_pts(mpctx); mp_msg(MSGT_GLOBAL, MSGL_INFO, "ANS_TIME_POSITION=%.1f\n", pos); } break; @@ -3185,7 +3341,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) break; case MP_CMD_KEYDOWN_EVENTS: - mplayer_put_key(cmd->args[0].v.i); + mplayer_put_key(mpctx->key_fifo, cmd->args[0].v.i); break; case MP_CMD_SET_MOUSE_POS:{ @@ -3193,7 +3349,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) double dx, dy; pointer_x = cmd->args[0].v.i; pointer_y = cmd->args[1].v.i; - rescale_input_coordinates(pointer_x, pointer_y, &dx, &dy); + rescale_input_coordinates(mpctx, pointer_x, pointer_y, &dx, &dy); #ifdef CONFIG_DVDNAV if (mpctx->stream->type == STREAMTYPE_DVDNAV && dx > 0.0 && dy > 0.0) { @@ -3202,7 +3358,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) pointer_y = (int) (dy * (double) sh_video->disp_h); mp_dvdnav_update_mouse_pos(mpctx->stream, pointer_x, pointer_y, &button); - if (osd_level > 1 && button > 0) + if (opts->osd_level > 1 && button > 0) set_osd_msg(OSD_MSG_TEXT, 1, osd_duration, "Selected button number %d", button); } @@ -3229,7 +3385,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) command = mp_dvdnav_bindings[i].cmd; mp_dvdnav_handle_input(mpctx->stream,command,&button); - if (osd_level > 1 && button > 0) + if (opts->osd_level > 1 && button > 0) set_osd_msg(OSD_MSG_TEXT, 1, osd_duration, "Selected button number %d", button); } @@ -3268,7 +3424,7 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) else af_add(mpctx->mixer.afilter, af_command); } - build_afilter_chain(sh_audio, &ao_data); + build_afilter_chain(mpctx, sh_audio, &ao_data); free(af_args); } break; @@ -3277,32 +3433,22 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd) break; af_uninit(mpctx->mixer.afilter); af_init(mpctx->mixer.afilter); - build_afilter_chain(sh_audio, &ao_data); + build_afilter_chain(mpctx, sh_audio, &ao_data); break; default: -#ifdef CONFIG_GUI - if ((use_gui) && (cmd->id > MP_CMD_GUI_EVENTS)) - guiGetEvent(guiIEvent, (char *) cmd->id); - else -#endif mp_msg(MSGT_CPLAYER, MSGL_V, "Received unknown cmd %s\n", cmd->name); } switch (cmd->pausing) { case 1: // "pausing" - mpctx->osd_function = OSD_PAUSE; + pause_player(mpctx); break; case 3: // "pausing_toggle" - mpctx->was_paused = !mpctx->was_paused; - if (mpctx->was_paused) - mpctx->osd_function = OSD_PAUSE; - else if (mpctx->osd_function == OSD_PAUSE) - mpctx->osd_function = OSD_PLAY; + if (mpctx->paused) + unpause_player(mpctx); + else + pause_player(mpctx); break; - case 2: // "pausing_keep" - if (mpctx->was_paused) - mpctx->osd_function = OSD_PAUSE; } - return brk_cmd; } |