summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDudemanguy <random342@airmail.cc>2023-09-17 20:44:05 -0500
committerDudemanguy <random342@airmail.cc>2023-10-10 19:10:55 +0000
commitc82c55b4b9d4015ba79fb36170defb328563cdea (patch)
tree326dfdfbe8d262d09d741945b89ccb1b111c3956
parent8fccd6bf91abe42a032b2c7c14bb7a0366ad19bf (diff)
downloadmpv-c82c55b4b9d4015ba79fb36170defb328563cdea.tar.bz2
mpv-c82c55b4b9d4015ba79fb36170defb328563cdea.tar.xz
vo: use nanoseconds for frame duration and pts
-rw-r--r--player/video.c4
-rw-r--r--video/out/vo.c20
-rw-r--r--video/out/vo.h6
-rw-r--r--video/out/vo_vdpau.c2
4 files changed, 16 insertions, 16 deletions
diff --git a/player/video.c b/player/video.c
index 7da9cf46fe..e5b0b6b3a2 100644
--- a/player/video.c
+++ b/player/video.c
@@ -1198,7 +1198,7 @@ void write_video(struct MPContext *mpctx)
}
double time_frame = MPMAX(mpctx->time_frame, -1);
- int64_t pts = mp_time_us() + (int64_t)(time_frame * 1e6);
+ int64_t pts = mp_time_ns() + (int64_t)(time_frame * 1e9);
// wait until VO wakes us up to get more frames
// (NB: in theory, the 1st frame after display sync mode change uses the
@@ -1240,7 +1240,7 @@ void write_video(struct MPContext *mpctx)
diff /= mpctx->video_speed;
if (mpctx->time_frame < 0)
diff += mpctx->time_frame;
- frame->duration = MPCLAMP(diff, 0, 10) * 1e6;
+ frame->duration = MPCLAMP(diff, 0, 10) * 1e9;
}
mpctx->video_pts = mpctx->next_frames[0]->pts;
diff --git a/video/out/vo.c b/video/out/vo.c
index 496f01f45e..7b50b90745 100644
--- a/video/out/vo.c
+++ b/video/out/vo.c
@@ -232,7 +232,7 @@ static void read_opts(struct vo *vo)
struct vo_internal *in = vo->in;
pthread_mutex_lock(&in->lock);
- in->timing_offset = (uint64_t)(vo->opts->timing_offset * 1e6);
+ in->timing_offset = (uint64_t)(vo->opts->timing_offset * 1e9);
pthread_mutex_unlock(&in->lock);
}
@@ -782,7 +782,7 @@ bool vo_is_ready_for_frame(struct vo *vo, int64_t next_pts)
// time.
next_pts -= in->timing_offset;
next_pts -= in->flip_queue_offset;
- int64_t now = mp_time_us();
+ int64_t now = mp_time_ns();
if (next_pts > now)
r = false;
if (!in->wakeup_pts || next_pts < in->wakeup_pts) {
@@ -830,9 +830,9 @@ void vo_wait_frame(struct vo *vo)
static void wait_until(struct vo *vo, int64_t target)
{
struct vo_internal *in = vo->in;
- struct timespec ts = mp_time_us_to_realtime(target);
+ struct timespec ts = mp_time_ns_to_realtime(target);
pthread_mutex_lock(&in->lock);
- while (target > mp_time_us()) {
+ while (target > mp_time_ns()) {
if (in->queued_events & VO_EVENT_LIVE_RESIZING)
break;
if (pthread_cond_timedwait(&in->wakeup, &in->lock, &ts))
@@ -873,7 +873,7 @@ static bool render_frame(struct vo *vo)
if (in->paused)
frame->vsync_offset = 0;
- int64_t now = mp_time_us();
+ int64_t now = mp_time_ns();
int64_t pts = frame->pts;
int64_t duration = frame->duration;
int64_t end_time = pts + duration;
@@ -889,7 +889,7 @@ static bool render_frame(struct vo *vo)
in->dropped_frame &= frame->can_drop;
// Even if we're hopelessly behind, rather degrade to 10 FPS playback,
// instead of just freezing the display forever.
- in->dropped_frame &= now - (in->prev_vsync / 1000.0) < 100 * 1000;
+ in->dropped_frame &= now - in->prev_vsync < 100 * 1e6;
in->dropped_frame &= in->hasframe_rendered;
// Setup parameters for the next time this frame is drawn. ("frame" is the
@@ -907,7 +907,7 @@ static bool render_frame(struct vo *vo)
bool use_vsync = in->current_frame->display_synced && !in->paused;
if (use_vsync && !in->expecting_vsync) // first DS frame in a row
- in->prev_vsync = now * 1000;
+ in->prev_vsync = now;
in->expecting_vsync = use_vsync;
// Store the initial value before we unlock.
@@ -1230,15 +1230,15 @@ void vo_get_src_dst_rects(struct vo *vo, struct mp_rect *out_src,
out_src, out_dst, out_osd);
}
-// flip_page[_timed] will be called offset_us microseconds too early.
+// flip_page[_timed] will be called offset_us nanoseconds too early.
// (For vo_vdpau, which does its own timing.)
// num_req_frames set the requested number of requested vo_frame.frames.
// (For vo_gpu interpolation.)
-void vo_set_queue_params(struct vo *vo, int64_t offset_us, int num_req_frames)
+void vo_set_queue_params(struct vo *vo, int64_t offset_ns, int num_req_frames)
{
struct vo_internal *in = vo->in;
pthread_mutex_lock(&in->lock);
- in->flip_queue_offset = offset_us;
+ in->flip_queue_offset = offset_ns;
in->req_frames = MPCLAMP(num_req_frames, 1, VO_MAX_REQ_FRAMES);
pthread_mutex_unlock(&in->lock);
}
diff --git a/video/out/vo.h b/video/out/vo.h
index ca120672f6..d67ca5fe51 100644
--- a/video/out/vo.h
+++ b/video/out/vo.h
@@ -207,10 +207,10 @@ struct vo_extra {
};
struct vo_frame {
- // If > 0, realtime when frame should be shown, in mp_time_us() units.
+ // If > 0, realtime when frame should be shown, in mp_time_ns() units.
// If 0, present immediately.
int64_t pts;
- // Approximate frame duration, in us.
+ // Approximate frame duration, in ns.
int duration;
// Realtime of estimated distance between 2 vsync events.
double vsync_interval;
@@ -508,7 +508,7 @@ void vo_query_formats(struct vo *vo, uint8_t *list);
void vo_event(struct vo *vo, int event);
int vo_query_and_reset_events(struct vo *vo, int events);
struct mp_image *vo_get_current_frame(struct vo *vo);
-void vo_set_queue_params(struct vo *vo, int64_t offset_us, int num_req_frames);
+void vo_set_queue_params(struct vo *vo, int64_t offset_ns, int num_req_frames);
int vo_get_num_req_frames(struct vo *vo);
double vo_get_vsync_interval(struct vo *vo);
double vo_get_estimated_vsync_interval(struct vo *vo);
diff --git a/video/out/vo_vdpau.c b/video/out/vo_vdpau.c
index 17ee6aba70..d6b261f057 100644
--- a/video/out/vo_vdpau.c
+++ b/video/out/vo_vdpau.c
@@ -279,7 +279,7 @@ static void resize(struct vo *vo)
vc->flip_offset_us = vo->opts->fullscreen ?
1000LL * vc->flip_offset_fs :
1000LL * vc->flip_offset_window;
- vo_set_queue_params(vo, vc->flip_offset_us, 1);
+ vo_set_queue_params(vo, vc->flip_offset_us * 1000, 1);
if (vc->output_surface_w < vo->dwidth || vc->output_surface_h < vo->dheight ||
vc->rotation != vo->params->rotate)