diff options
-rw-r--r-- | audio/out/ao_jack.c | 4 | ||||
-rw-r--r-- | audio/out/ao_null.c | 8 | ||||
-rw-r--r-- | audio/out/ao_sdl.c | 20 | ||||
-rw-r--r-- | core/encode_lavc.c | 9 | ||||
-rw-r--r-- | core/encode_lavc.h | 2 | ||||
-rw-r--r-- | core/input/input.c | 18 | ||||
-rw-r--r-- | core/input/input.h | 2 | ||||
-rw-r--r-- | core/mp_core.h | 23 | ||||
-rw-r--r-- | core/mp_fifo.c | 6 | ||||
-rw-r--r-- | core/mplayer.c | 81 | ||||
-rw-r--r-- | osdep/timer.c | 10 | ||||
-rw-r--r-- | osdep/timer.h | 2 | ||||
-rw-r--r-- | stream/cache2.c | 6 | ||||
-rw-r--r-- | stream/tv.c | 2 | ||||
-rw-r--r-- | video/out/vo.h | 6 | ||||
-rw-r--r-- | video/out/vo_lavc.c | 2 | ||||
-rw-r--r-- | video/out/vo_vdpau.c | 26 | ||||
-rw-r--r-- | video/out/x11_common.c | 4 | ||||
-rw-r--r-- | video/out/x11_common.h | 2 |
19 files changed, 108 insertions, 125 deletions
diff --git a/audio/out/ao_jack.c b/audio/out/ao_jack.c index 0f8baeab86..1807a11c44 100644 --- a/audio/out/ao_jack.c +++ b/audio/out/ao_jack.c @@ -170,7 +170,7 @@ static int outputaudio(jack_nframes_t nframes, void *arg) { if (read_buffer(bufs, nframes, num_ports) < nframes) underrun = 1; if (estimate) { - float now = (float)GetTimer() / 1000000.0; + float now = mp_time_us() / 1000000.0; float diff = callback_time + callback_interval - now; if ((diff > -0.002) && (diff < 0.002)) callback_time += callback_interval; @@ -361,7 +361,7 @@ static float get_delay(void) { int buffered = av_fifo_size(buffer); // could be less float in_jack = jack_latency; if (estimate && callback_interval > 0) { - float elapsed = (float)GetTimer() / 1000000.0 - callback_time; + float elapsed = mp_time_us() / 1000000.0 - callback_time; in_jack += callback_interval - elapsed; if (in_jack < 0) in_jack = 0; } diff --git a/audio/out/ao_null.c b/audio/out/ao_null.c index 53ec2a9a83..32d02bea31 100644 --- a/audio/out/ao_null.c +++ b/audio/out/ao_null.c @@ -29,7 +29,7 @@ #include "ao.h" struct priv { - unsigned last_time; + double last_time; float buffered_bytes; }; @@ -37,8 +37,8 @@ static void drain(struct ao *ao) { struct priv *priv = ao->priv; - unsigned now = GetTimer(); - priv->buffered_bytes -= (now - priv->last_time) / 1e6 * ao->bps; + double now = mp_time_sec(); + priv->buffered_bytes -= (now - priv->last_time) * ao->bps; if (priv->buffered_bytes < 0) priv->buffered_bytes = 0; priv->last_time = now; @@ -59,7 +59,7 @@ static int init(struct ao *ao, char *params) // A "buffer" for about 0.2 seconds of audio ao->buffersize = (int)(ao->samplerate * 0.2 / 256 + 1) * ao->outburst; ao->bps = ao->channels.num * ao->samplerate * samplesize; - priv->last_time = GetTimer(); + priv->last_time = mp_time_sec(); return 0; } diff --git a/audio/out/ao_sdl.c b/audio/out/ao_sdl.c index 6678cd3bd3..63b1f3963d 100644 --- a/audio/out/ao_sdl.c +++ b/audio/out/ao_sdl.c @@ -42,8 +42,8 @@ struct priv bool unpause; bool paused; #ifdef ESTIMATE_DELAY - unsigned int callback_time0; - unsigned int callback_time1; + int64_t callback_time0; + int64_t callback_time1; #endif }; @@ -56,7 +56,7 @@ static void audio_callback(void *userdata, Uint8 *stream, int len) #ifdef ESTIMATE_DELAY priv->callback_time1 = priv->callback_time0; - priv->callback_time0 = GetTimer(); + priv->callback_time0 = mp_time_us(); #endif while (len > 0 && !priv->paused) { @@ -268,7 +268,7 @@ static int init(struct ao *ao, char *params) priv->unpause = 1; priv->paused = 1; - priv->callback_time0 = priv->callback_time1 = GetTimer(); + priv->callback_time0 = priv->callback_time1 = mp_time_us(); return 1; } @@ -340,8 +340,8 @@ static float get_delay(struct ao *ao) SDL_LockMutex(priv->buffer_mutex); int sz = av_fifo_size(priv->buffer); #ifdef ESTIMATE_DELAY - unsigned int callback_time0 = priv->callback_time0; - unsigned int callback_time1 = priv->callback_time1; + int64_t callback_time0 = priv->callback_time0; + int64_t callback_time1 = priv->callback_time1; #endif SDL_UnlockMutex(priv->buffer_mutex); @@ -351,16 +351,16 @@ static float get_delay(struct ao *ao) #ifdef ESTIMATE_DELAY // delay component: outstanding audio living in SDL - unsigned int current_time = GetTimer(); + int64_t current_time = mp_time_us(); // interval between callbacks - unsigned int callback_interval = callback_time0 - callback_time1; - unsigned int elapsed_interval = current_time - callback_time0; + int64_t callback_interval = callback_time0 - callback_time1; + int64_t elapsed_interval = current_time - callback_time0; if (elapsed_interval > callback_interval) elapsed_interval = callback_interval; // delay subcomponent: remaining audio from the currently played buffer - unsigned int buffer_interval = callback_interval - elapsed_interval; + int64_t buffer_interval = callback_interval - elapsed_interval; // delay subcomponent: remaining audio from the next played buffer, as // provided by the callback diff --git a/core/encode_lavc.c b/core/encode_lavc.c index 457f6ab987..1677baf838 100644 --- a/core/encode_lavc.c +++ b/core/encode_lavc.c @@ -269,7 +269,7 @@ int encode_lavc_start(struct encode_lavc_context *ctx) } } - ctx->t0 = GetTimerMS(); + ctx->t0 = mp_time_sec(); mp_msg(MSGT_ENCODE, MSGL_INFO, "Opening muxer: %s [%s]\n", ctx->avc->oformat->long_name, ctx->avc->oformat->name); @@ -997,6 +997,7 @@ int encode_lavc_getstatus(struct encode_lavc_context *ctx, char *buf, int bufsize, float relative_position, float playback_time) { + double now = mp_time_sec(); float minutes, megabytes, fps, x; float f = FFMAX(0.0001, relative_position); if (!ctx) @@ -1004,10 +1005,10 @@ int encode_lavc_getstatus(struct encode_lavc_context *ctx, CHECK_FAIL(ctx, -1); - minutes = (GetTimerMS() - ctx->t0) / 60000.0 * (1 - f) / f; + minutes = (now - ctx->t0) / 60.0 * (1 - f) / f; megabytes = ctx->avc->pb ? (avio_size(ctx->avc->pb) / 1048576.0 / f) : 0; - fps = ctx->frames / ((GetTimerMS() - ctx->t0) / 1000.0); - x = playback_time / ((GetTimerMS() - ctx->t0) / 1000.0); + fps = ctx->frames / ((now - ctx->t0)); + x = playback_time / ((now - ctx->t0)); if (ctx->frames) snprintf(buf, bufsize, "{%.1f%% %.1fmin %.1ffps %.1fMB}", relative_position * 100.0, minutes, fps, megabytes); diff --git a/core/encode_lavc.h b/core/encode_lavc.h index a0245c991a..7e53ae6a1d 100644 --- a/core/encode_lavc.h +++ b/core/encode_lavc.h @@ -61,7 +61,7 @@ struct encode_lavc_context { long long vbytes; struct stream *twopass_bytebuffer_a; struct stream *twopass_bytebuffer_v; - unsigned int t0; + double t0; unsigned int frames; bool expect_video; diff --git a/core/input/input.c b/core/input/input.c index c756efcbdc..3d8ba711b7 100644 --- a/core/input/input.c +++ b/core/input/input.c @@ -464,7 +464,7 @@ struct input_ctx { // Autorepeat stuff short ar_state; mp_cmd_t *ar_cmd; - unsigned int last_ar; + int64_t last_ar; // Autorepeat config unsigned int ar_delay; unsigned int ar_rate; @@ -475,7 +475,7 @@ struct input_ctx { // these are the keys currently down int key_down[MP_MAX_KEY_DOWN]; unsigned int num_key_down; - unsigned int last_key_down; + int64_t last_key_down; bool test; @@ -491,7 +491,7 @@ struct input_ctx { // events sources. If yes, the sources may have more queued. bool got_new_events; - unsigned int last_mouse_event; + unsigned int mouse_event_counter; struct input_fd key_fds[MP_MAX_KEY_FD]; unsigned int num_key_fd; @@ -1230,7 +1230,7 @@ static mp_cmd_t *interpret_key(struct input_ctx *ictx, int code) return NULL; ictx->key_down[ictx->num_key_down] = code; ictx->num_key_down++; - ictx->last_key_down = GetTimer(); + ictx->last_key_down = mp_time_us(); ictx->ar_state = 0; ret = NULL; if (!(code & MP_NO_REPEAT_KEY)) @@ -1287,7 +1287,7 @@ static mp_cmd_t *check_autorepeat(struct input_ctx *ictx) // No input : autorepeat ? if (ictx->ar_rate > 0 && ictx->ar_state >= 0 && ictx->num_key_down > 0 && !(ictx->key_down[ictx->num_key_down - 1] & MP_NO_REPEAT_KEY)) { - unsigned int t = GetTimer(); + int64_t t = mp_time_us(); if (ictx->last_ar + 2000000 < t) ictx->last_ar = t; // First time : wait delay @@ -1319,7 +1319,7 @@ void mp_input_feed_key(struct input_ctx *ictx, int code) ictx->got_new_events = true; int unmod = code & ~(MP_KEY_MODIFIER_MASK | MP_KEY_STATE_DOWN); if (unmod >= MP_MOUSE_BASE && unmod <= MP_MOUSE_BTN_END) - ictx->last_mouse_event = GetTimerMS(); + ictx->mouse_event_counter++; if (code == MP_INPUT_RELEASE_ALL) { mp_msg(MSGT_INPUT, MSGL_V, "input: release all\n"); memset(ictx->key_down, 0, sizeof(ictx->key_down)); @@ -1483,7 +1483,7 @@ int mp_input_queue_cmd(struct input_ctx *ictx, mp_cmd_t *cmd) if (!cmd) return 0; if (cmd->id == MP_CMD_SET_MOUSE_POS) - ictx->last_mouse_event = GetTimerMS(); + ictx->mouse_event_counter++; queue_add(&ictx->control_cmd_queue, cmd, false); return 1; } @@ -1914,7 +1914,7 @@ int mp_input_check_interrupt(struct input_ctx *ictx, int time) } } -unsigned int mp_input_get_last_mouse_event_time(struct input_ctx *ictx) +unsigned int mp_input_get_mouse_event_counter(struct input_ctx *ictx) { - return ictx->last_mouse_event; + return ictx->mouse_event_counter; } diff --git a/core/input/input.h b/core/input/input.h index 1f079e7451..6c33e47fdc 100644 --- a/core/input/input.h +++ b/core/input/input.h @@ -209,7 +209,7 @@ void mp_input_set_section(struct input_ctx *ictx, char *name, int flags); char *mp_input_get_section(struct input_ctx *ictx); // Used to detect mouse movement. -unsigned int mp_input_get_last_mouse_event_time(struct input_ctx *ictx); +unsigned int mp_input_get_mouse_event_counter(struct input_ctx *ictx); // Initialize the input system struct input_conf; diff --git a/core/mp_core.h b/core/mp_core.h index 6f784b4b7c..3b693d1658 100644 --- a/core/mp_core.h +++ b/core/mp_core.h @@ -132,9 +132,10 @@ typedef struct MPContext { subtitle subs; // subtitle list used when reading subtitles from demuxer int add_osd_seek_info; // bitfield of enum mp_osd_seek_info - unsigned int osd_visible; // for the osd bar only + double osd_visible; // for the osd bar only int osd_function; - unsigned int osd_function_visible; + double osd_function_visible; + double osd_last_update; struct playlist *playlist; char *filename; // currently playing file @@ -196,11 +197,11 @@ typedef struct MPContext { // by the audio CPU usage meter. double delay; // AV sync: time until next frame should be shown - float time_frame; + double time_frame; // How long the last vo flip() call took. Used to adjust timing with // the goal of making flip() calls finish (rather than start) at the // specified time. - float last_vo_flip_duration; + double last_vo_flip_duration; // How much video timing has been changed to make it match the audio // timeline. Used for status line information only. double total_avsync_change; @@ -232,23 +233,21 @@ typedef struct MPContext { uint64_t backstep_start_seek_ts; bool backstep_active; - float audio_delay; + double audio_delay; - unsigned int last_heartbeat; + double last_heartbeat; - unsigned int mouse_timer; - unsigned int mouse_last_time; + double mouse_timer; + unsigned int mouse_event_ts; int mouse_waiting_hide; - unsigned int next_wakup_time; - // used to prevent hanging in some error cases - unsigned int start_timestamp; + double start_timestamp; // Timestamp from the last time some timing functions read the // current time, in (occasionally wrapping) microseconds. Used // to turn a new time value to a delta from last time. - unsigned int last_time; + int64_t last_time; // Used to communicate the parameters of a seek between parts struct seek_params { diff --git a/core/mp_fifo.c b/core/mp_fifo.c index 386eda5e80..32036749d1 100644 --- a/core/mp_fifo.c +++ b/core/mp_fifo.c @@ -31,7 +31,7 @@ struct mp_fifo { struct MPOpts *opts; struct input_ctx *input; int last_key_down; - unsigned last_down_time; + double last_down_time; }; struct mp_fifo *mp_fifo_create(struct input_ctx *input, struct MPOpts *opts) @@ -50,7 +50,7 @@ static void put_double(struct mp_fifo *fifo, int code) void mplayer_put_key(struct mp_fifo *fifo, int code) { - unsigned now = GetTimerMS(); + double now = mp_time_sec(); int doubleclick_time = fifo->opts->doubleclick_time; // ignore system-doubleclick if we generate these events ourselves if (doubleclick_time @@ -61,7 +61,7 @@ void mplayer_put_key(struct mp_fifo *fifo, int code) if (code & MP_KEY_STATE_DOWN) { code &= ~MP_KEY_STATE_DOWN; if (fifo->last_key_down == code - && now - fifo->last_down_time < doubleclick_time) + && now - fifo->last_down_time < doubleclick_time / 1000.0) put_double(fifo, code); fifo->last_key_down = code; fifo->last_down_time = now; diff --git a/core/mplayer.c b/core/mplayer.c index 0b1bee4179..8e077e248d 100644 --- a/core/mplayer.c +++ b/core/mplayer.c @@ -207,10 +207,10 @@ static struct track *open_external_file(struct MPContext *mpctx, char *filename, char *demuxer_name, int stream_cache, enum stream_type filter); -static float get_relative_time(struct MPContext *mpctx) +static double get_relative_time(struct MPContext *mpctx) { - unsigned int new_time = GetTimer(); - unsigned int delta = new_time - mpctx->last_time; + int64_t new_time = mp_time_us(); + int64_t delta = new_time - mpctx->last_time; mpctx->last_time = new_time; return delta * 0.000001; } @@ -1329,13 +1329,14 @@ struct mp_osd_msg { /// Message text. char *msg; int id, level, started; - /// Display duration in ms. - unsigned time; + /// Display duration in seconds. + double time; // Show full OSD for duration of message instead of msg // (osd_show_progression command) bool show_position; }; +// time is in ms static mp_osd_msg_t *add_osd_msg(struct MPContext *mpctx, int id, int level, int time) { @@ -1345,7 +1346,7 @@ static mp_osd_msg_t *add_osd_msg(struct MPContext *mpctx, int id, int level, .msg = "", .id = id, .level = level, - .time = time, + .time = time / 1000.0, }); mpctx->osd_msg_stack = msg; return msg; @@ -1415,32 +1416,25 @@ static mp_osd_msg_t *get_osd_msg(struct MPContext *mpctx) { struct MPOpts *opts = &mpctx->opts; mp_osd_msg_t *msg, *prev, *last = NULL; - static unsigned last_update = 0; - unsigned now = GetTimerMS(); - unsigned diff; + double now = mp_time_sec(); + double diff; char hidden_dec_done = 0; - if (mpctx->osd_visible) { - // 36000000 means max timed visibility is 1 hour into the future, if - // the difference is greater assume it's wrapped around from below 0 - if (mpctx->osd_visible - now > 36000000) { - mpctx->osd_visible = 0; - mpctx->osd->progbar_type = -1; // disable - vo_osd_changed(OSDTYPE_PROGBAR); - } + if (mpctx->osd_visible && now >= mpctx->osd_visible) { + mpctx->osd_visible = 0; + mpctx->osd->progbar_type = -1; // disable + vo_osd_changed(OSDTYPE_PROGBAR); } - if (mpctx->osd_function_visible) { - if (mpctx->osd_function_visible - now > 36000000) { - mpctx->osd_function_visible = 0; - mpctx->osd_function = 0; - } + if (mpctx->osd_function_visible && now >= mpctx->osd_function_visible) { + mpctx->osd_function_visible = 0; + mpctx->osd_function = 0; } - if (!last_update) - last_update = now; - diff = now >= last_update ? now - last_update : 0; + if (!mpctx->osd_last_update) + mpctx->osd_last_update = now; + diff = now >= mpctx->osd_last_update ? now - mpctx->osd_last_update : 0; - last_update = now; + mpctx->osd_last_update = now; // Look for the first message in the stack with high enough level. for (msg = mpctx->osd_msg_stack; msg; last = msg, msg = prev) { @@ -1484,7 +1478,7 @@ void set_osd_bar(struct MPContext *mpctx, int type, const char *name, return; if (mpctx->sh_video && opts->term_osd != 1) { - mpctx->osd_visible = (GetTimerMS() + opts->osd_duration) | 1; + mpctx->osd_visible = mp_time_sec() + opts->osd_duration / 1000.0; mpctx->osd->progbar_type = type; mpctx->osd->progbar_value = (val - min) / (max - min); mpctx->osd->progbar_num_stops = 0; @@ -1535,7 +1529,7 @@ void set_osd_function(struct MPContext *mpctx, int osd_function) struct MPOpts *opts = &mpctx->opts; mpctx->osd_function = osd_function; - mpctx->osd_function_visible = (GetTimerMS() + opts->osd_duration) | 1; + mpctx->osd_function_visible = mp_time_sec() + opts->osd_duration / 1000.0; } /** @@ -2028,12 +2022,12 @@ static int check_framedrop(struct MPContext *mpctx, double frame_time) return 0; } -static float timing_sleep(struct MPContext *mpctx, float time_frame) +static double timing_sleep(struct MPContext *mpctx, double time_frame) { // assume kernel HZ=100 for softsleep, works with larger HZ but with // unnecessarily high CPU usage struct MPOpts *opts = &mpctx->opts; - float margin = opts->softsleep ? 0.011 : 0; + double margin = opts->softsleep ? 0.011 : 0; while (time_frame > margin) { usec_sleep(1000000 * (time_frame - margin)); time_frame -= get_relative_time(mpctx); @@ -3129,7 +3123,7 @@ static int seek(MPContext *mpctx, struct seek_params seek, : mpctx->timeline[mpctx->timeline_part].start; } - mpctx->start_timestamp = GetTimerMS(); + mpctx->start_timestamp = mp_time_sec(); return 0; } @@ -3507,32 +3501,29 @@ static void run_playloop(struct MPContext *mpctx) // ================================================================ vo_check_events(vo); - unsigned int mouse_last_time = - mp_input_get_last_mouse_event_time(mpctx->input); - if (mpctx->mouse_last_time != mouse_last_time) { - mpctx->mouse_last_time = mouse_last_time; + double mouse_event_ts = mp_input_get_mouse_event_counter(mpctx->input); + if (mpctx->mouse_event_ts != mouse_event_ts) { + mpctx->mouse_event_ts = mouse_event_ts; if (opts->vo.cursor_autohide_delay > -1) { vo_control(vo, VOCTRL_SET_CURSOR_VISIBILITY, &(bool){true}); if (opts->vo.cursor_autohide_delay >= 0) { mpctx->mouse_waiting_hide = 1; mpctx->mouse_timer = - GetTimerMS() + opts->vo.cursor_autohide_delay; + mp_time_sec() + opts->vo.cursor_autohide_delay / 1000.0; } } } if (mpctx->mouse_waiting_hide == 1 && - GetTimerMS() >= mpctx->mouse_timer) + mp_time_sec() >= mpctx->mouse_timer) { vo_control(vo, VOCTRL_SET_CURSOR_VISIBILITY, &(bool){false}); mpctx->mouse_waiting_hide = 2; } if (opts->heartbeat_cmd) { - unsigned now = GetTimerMS(); - if (now - mpctx->last_heartbeat > - (unsigned)(opts->heartbeat_interval * 1000)) - { + double now = mp_time_sec(); + if (now - mpctx->last_heartbeat > opts->heartbeat_interval) { mpctx->last_heartbeat = now; system(opts->heartbeat_cmd); } @@ -3602,12 +3593,12 @@ static void run_playloop(struct MPContext *mpctx) mpctx->time_frame = timing_sleep(mpctx, mpctx->time_frame); mpctx->time_frame += vo->flip_queue_offset; - unsigned int t2 = GetTimer(); + int64_t t2 = mp_time_us(); /* Playing with playback speed it's possible to get pathological * cases with mpctx->time_frame negative enough to cause an * overflow in pts_us calculation, thus the FFMAX. */ double time_frame = FFMAX(mpctx->time_frame, -1); - unsigned int pts_us = mpctx->last_time + time_frame * 1e6; + int64_t pts_us = mpctx->last_time + time_frame * 1e6; int duration = -1; double pts2 = vo->next_pts2; if (pts2 != MP_NOPTS_VALUE && opts->correct_pts && @@ -3625,7 +3616,7 @@ static void run_playloop(struct MPContext *mpctx) } vo_flip_page(vo, pts_us | 1, duration); - mpctx->last_vo_flip_duration = (GetTimer() - t2) * 0.000001; + mpctx->last_vo_flip_duration = (mp_time_us() - t2) * 0.000001; if (vo->driver->flip_page_timed) { // No need to adjust sync based on flip speed mpctx->last_vo_flip_duration = 0; @@ -3788,7 +3779,7 @@ static void run_playloop(struct MPContext *mpctx) * another seek (which could lead to unchanging display). */ if ((mpctx->seek.type && cmd->id != MP_CMD_SEEK) || (mpctx->restart_playback && cmd->id == MP_CMD_SEEK && - GetTimerMS() - mpctx->start_timestamp < 300)) + mp_time_sec() - mpctx->start_timestamp < 0.3)) break; cmd = mp_input_get_cmd(mpctx->input, 0, 0); run_command(mpctx, cmd); diff --git a/osdep/timer.c b/osdep/timer.c index 2304bb1297..c1efeff8b5 100644 --- a/osdep/timer.c +++ b/osdep/timer.c @@ -42,16 +42,6 @@ double mp_time_sec(void) return mp_time_us() / (double)(1000 * 1000); } -unsigned int GetTimer(void) -{ - return mp_time_us(); -} - -unsigned int GetTimerMS(void) -{ - return (mp_time_us() + 500) / 1000; -} - int usec_sleep(int usec_delay) { mp_sleep_us(usec_delay); diff --git a/osdep/timer.h b/osdep/timer.h index 033b366750..bdddf3d61a 100644 --- a/osdep/timer.h +++ b/osdep/timer.h @@ -39,8 +39,6 @@ uint64_t mp_raw_time_us(void); void mp_sleep_us(int64_t us); // Legacy timer functions. These can wrap. -unsigned int GetTimer(void); // in us -unsigned int GetTimerMS(void); // in ms int usec_sleep(int usec_delay); #endif /* MPLAYER_TIMER_H */ diff --git a/stream/cache2.c b/stream/cache2.c index 1337e44e37..671bd85c53 100644 --- a/stream/cache2.c +++ b/stream/cache2.c @@ -264,7 +264,7 @@ static int cache_execute_control(cache_vars_t *s) { unsigned uint_res; uint64_t uint64_res; int needs_flush = 0; - static unsigned last; + static double last; int quit = s->control == -2; uint64_t old_pos = s->stream->pos; int old_eof = s->stream->eof; @@ -275,7 +275,7 @@ static int cache_execute_control(cache_vars_t *s) { s->control = -1; return !quit; } - if (GetTimerMS() - last > 99) { + if (mp_time_sec() - last > 0.099) { double len, pos; if (s->stream->control(s->stream, STREAM_CTRL_GET_TIME_LENGTH, &len) == STREAM_OK) s->stream_time_length = len; @@ -296,7 +296,7 @@ static int cache_execute_control(cache_vars_t *s) { return 0; } #endif - last = GetTimerMS(); + last = mp_time_sec(); } if (s->control == -1) return 1; switch (s->control) { diff --git a/stream/tv.c b/stream/tv.c index 38368d4925..1fcb13037d 100644 --- a/stream/tv.c +++ b/stream/tv.c @@ -130,7 +130,7 @@ static void tv_scan(tvi_handle_t *tvh) } scan = tvh->scan; - now=GetTimer(); + now=(unsigned int)mp_time_us(); if (!scan) { scan=calloc(1,sizeof(tv_scan_t)); tvh->scan=scan; diff --git a/video/out/vo.h b/video/out/vo.h index f357b21797..3dcc58b6c3 100644 --- a/video/out/vo.h +++ b/video/out/vo.h @@ -195,9 +195,13 @@ struct vo_driver { /* * Blit/Flip buffer to the screen. Must be called after each frame! + * pts_us is the frame presentation time, linked to mp_time_us(). + * pts_us is 0 if the frame should be presented immediately. + * duration is estimated time in us until the next frame is shown. + * duration is -1 if it is unknown or unset. */ void (*flip_page)(struct vo *vo); - void (*flip_page_timed)(struct vo *vo, unsigned int pts_us, int duration); + void (*flip_page_timed)(struct vo *vo, int64_t pts_us, int duration); /* * Closes driver. Should restore the original state of the system. diff --git a/video/out/vo_lavc.c b/video/out/vo_lavc.c index 6d1eb5c6f8..5140720f92 100644 --- a/video/out/vo_lavc.c +++ b/video/out/vo_lavc.c @@ -460,7 +460,7 @@ static void draw_image(struct vo *vo, mp_image_t *mpi) } } -static void flip_page_timed(struct vo *vo, unsigned int pts_us, int duration) +static void flip_page_timed(struct vo *vo, int64_t pts_us, int duration) { } diff --git a/video/out/vo_vdpau.c b/video/out/vo_vdpau.c index d213b33c6f..975ef526c3 100644 --- a/video/out/vo_vdpau.c +++ b/video/out/vo_vdpau.c @@ -97,13 +97,13 @@ struct vdpctx { bool is_preempted; bool preemption_acked; bool preemption_user_notified; - unsigned int last_preemption_retry_fail; + double last_preemption_retry_fail; VdpGetProcAddress *vdp_get_proc_address; VdpPresentationQueueTarget flip_target; VdpPresentationQueue flip_queue; uint64_t last_vdp_time; - unsigned int last_sync_update; + uint64_t last_sync_update; VdpOutputSurface output_surfaces[MAX_OUTPUT_SURFACES]; VdpOutputSurface screenshot_surface; @@ -181,15 +181,15 @@ struct vdpctx { static bool status_ok(struct vo *vo); -static int change_vdptime_sync(struct vdpctx *vc, unsigned int *t) +static int change_vdptime_sync(struct vdpctx *vc, int64_t *t) { struct vdp_functions *vdp = vc->vdp; VdpStatus vdp_st; VdpTime vdp_time; vdp_st = vdp->presentation_queue_get_time(vc->flip_queue, &vdp_time); CHECK_ST_ERROR("Error when calling vdp_presentation_queue_get_time"); - unsigned int t1 = *t; - unsigned int t2 = GetTimer(); + uint64_t t1 = *t; + uint64_t t2 = mp_time_us(); uint64_t old = vc->last_vdp_time + (t1 - vc->last_sync_update) * 1000ULL; if (vdp_time > old) { if (vdp_time > old + (t2 - t1) * 1000ULL) @@ -209,7 +209,7 @@ static uint64_t sync_vdptime(struct vo *vo) { struct vdpctx *vc = vo->priv; - unsigned int t = GetTimer(); + uint64_t t = mp_time_us(); if (t - vc->last_sync_update > 5000000) change_vdptime_sync(vc, &t); uint64_t now = (t - vc->last_sync_update) * 1000ULL + vc->last_vdp_time; @@ -218,10 +218,10 @@ static uint64_t sync_vdptime(struct vo *vo) return now; } -static uint64_t convert_to_vdptime(struct vo *vo, unsigned int t) +static uint64_t convert_to_vdptime(struct vo *vo, uint64_t t) { struct vdpctx *vc = vo->priv; - return (int)(t - vc->last_sync_update) * 1000LL + vc->last_vdp_time; + return (t - vc->last_sync_update) * 1000LL + vc->last_vdp_time; } static int render_video_to_output_surface(struct vo *vo, @@ -513,7 +513,7 @@ static int win_x11_init_vdpau_flip_queue(struct vo *vo) vdp_st = vdp->presentation_queue_get_time(vc->flip_queue, &vdp_time); CHECK_ST_ERROR("Error when calling vdp_presentation_queue_get_time"); vc->last_vdp_time = vdp_time; - vc->last_sync_update = GetTimer(); + vc->last_sync_update = mp_time_us(); vc->vsync_interval = 1; if (vc->composite_detect && vo_x11_screen_is_composited(vo)) { @@ -822,11 +822,11 @@ static int handle_preemption(struct vo *vo) } /* Trying to initialize seems to be quite slow, so only try once a * second to avoid using 100% CPU. */ - if (vc->last_preemption_retry_fail - && GetTimerMS() - vc->last_preemption_retry_fail < 1000) + if (vc->last_preemption_retry_fail && + mp_time_sec() - vc->last_preemption_retry_fail < 1.0) return -1; if (win_x11_init_vdpau_procs(vo) < 0 || initialize_vdpau_objects(vo) < 0) { - vc->last_preemption_retry_fail = GetTimerMS() | 1; + vc->last_preemption_retry_fail = mp_time_sec(); return -1; } vc->last_preemption_retry_fail = 0; @@ -1102,7 +1102,7 @@ static inline uint64_t prev_vs2(struct vdpctx *vc, uint64_t ts, int shift) return ts - offset; } -static void flip_page_timed(struct vo *vo, unsigned int pts_us, int duration) +static void flip_page_timed(struct vo *vo, int64_t pts_us, int duration) { struct vdpctx *vc = vo->priv; struct vdp_functions *vdp = vc->vdp; diff --git a/video/out/x11_common.c b/video/out/x11_common.c index 571bc9032c..5eb6031d66 100644 --- a/video/out/x11_common.c +++ b/video/out/x11_common.c @@ -1398,10 +1398,10 @@ int vo_x11_control(struct vo *vo, int *events, int request, void *arg) static void xscreensaver_heartbeat(struct vo_x11_state *x11) { - unsigned int time = GetTimerMS(); + double time = mp_time_sec(); if (x11->display && x11->screensaver_off && - (time - x11->screensaver_time_last) > 30000) + (time - x11->screensaver_time_last) > 30) { x11->screensaver_time_last = time; diff --git a/video/out/x11_common.h b/video/out/x11_common.h index 8717c225e2..74822dcecb 100644 --- a/video/out/x11_common.h +++ b/video/out/x11_common.h @@ -40,7 +40,7 @@ struct vo_x11_state { int screensaver_off; int dpms_disabled; - unsigned int screensaver_time_last; + double screensaver_time_last; XIM xim; XIC xic; |