vo: change vo_frame field units

This was just converting back and forth between int64_t/microseconds and
double/seconds. Remove this stupidity. The pts/duration fields are still
in microseconds, but they have no meaning in the display-sync case (also
drop printing the pts field from opengl/video.c - it's always 0).
This commit is contained in:
wm4 2015-11-27 22:04:44 +01:00
parent 2bee47fd27
commit 7023c383b2
4 changed files with 8 additions and 10 deletions

View File

@ -992,7 +992,6 @@ static void handle_display_sync_frame(struct MPContext *mpctx,
int num_vsyncs = MPMAX(lrint(ratio), 0);
double prev_error = mpctx->display_sync_error;
mpctx->display_sync_error += frame_duration - num_vsyncs * vsync;
frame->vsync_offset = mpctx->display_sync_error * 1e6;
MP_DBG(mpctx, "s=%f vsyncs=%d dur=%f ratio=%f err=%.20f (%f/%f)\n",
mpctx->speed_factor_v, num_vsyncs, adjusted_duration, ratio,
@ -1046,6 +1045,8 @@ static void handle_display_sync_frame(struct MPContext *mpctx,
// A bad guess, only needed when reverting to audio sync.
mpctx->time_frame = time_left;
frame->vsync_interval = vsync;
frame->vsync_offset = mpctx->display_sync_error;
frame->num_vsyncs = num_vsyncs;
frame->display_synced = true;

View File

@ -2088,7 +2088,7 @@ static void gl_video_interpolate_frame(struct gl_video *p, struct vo_frame *t,
double pts_now = p->surfaces[surface_now].pts,
pts_nxt = p->surfaces[surface_nxt].pts;
double mix = (t->vsync_offset / 1e6) / (pts_nxt - pts_now);
double mix = t->vsync_offset / (pts_nxt - pts_now);
// The scaler code always wants the fcoord to be between 0 and 1,
// so we try to adjust by using the previous set of N frames instead
// (which requires some extra checking to make sure it's valid)
@ -2107,7 +2107,7 @@ static void gl_video_interpolate_frame(struct gl_video *p, struct vo_frame *t,
// Blend the frames together
if (oversample) {
double vsync_dist = t->vsync_interval / 1e6 / (pts_nxt - pts_now),
double vsync_dist = t->vsync_interval / (pts_nxt - pts_now),
threshold = tscale->conf.kernel.params[0];
threshold = isnan(threshold) ? 0.0 : threshold;
mix = (1 - mix) / vsync_dist;
@ -2130,8 +2130,7 @@ static void gl_video_interpolate_frame(struct gl_video *p, struct vo_frame *t,
}
MP_STATS(p, "frame-mix");
MP_DBG(p, "inter frame pts: %lld, vsync: %lld, mix: %f\n",
(long long)t->pts, (long long)t->vsync_interval, mix);
MP_DBG(p, "inter frame vsync: %f, mix: %f\n", t->vsync_interval, mix);
p->is_interpolated = true;
}
pass_draw_to_screen(p, fbo);

View File

@ -741,8 +741,6 @@ static bool render_frame(struct vo *vo)
int64_t duration = frame->duration;
int64_t end_time = pts + duration;
frame->vsync_interval = in->vsync_interval;
// Time at which we should flip_page on the VO.
int64_t target = frame->display_synced ? 0 : pts - in->flip_queue_offset;
@ -761,7 +759,7 @@ static bool render_frame(struct vo *vo)
// frame currently drawn, while in->current_frame is the potentially next.)
in->current_frame->repeat = true;
if (frame->display_synced) {
in->current_frame->vsync_offset += in->vsync_interval;
in->current_frame->vsync_offset += in->current_frame->vsync_interval;
in->dropped_frame |= in->current_frame->num_vsyncs < 1;
}
if (in->current_frame->num_vsyncs > 0)

View File

@ -165,9 +165,9 @@ struct vo_frame {
// Approximate frame duration, in us.
int duration;
// Realtime of estimated distance between 2 vsync events.
int64_t vsync_interval;
double vsync_interval;
// "ideal" display time within the vsync
int64_t vsync_offset;
double vsync_offset;
// how often the frame will be repeated (does not include OSD redraws)
int num_vsyncs;
// Set if the current frame is repeated from the previous. It's guaranteed