diff --git a/app/src/clock.c b/app/src/clock.c index 1b353347..fe072f01 100644 --- a/app/src/clock.c +++ b/app/src/clock.c @@ -19,6 +19,7 @@ static void sc_clock_estimate(struct sc_clock *clock, double *out_slope, sc_tick *out_offset) { assert(clock->count > 1); // two points are necessary + struct sc_clock_point left_avg = { .system = clock->left_sum.system / (clock->count / 2), .stream = clock->left_sum.stream / (clock->count / 2), @@ -27,6 +28,19 @@ sc_clock_estimate(struct sc_clock *clock, .system = clock->right_sum.system / ((clock->count + 1) / 2), .stream = clock->right_sum.stream / ((clock->count + 1) / 2), }; + + double slope = (double) (right_avg.system - left_avg.system) + / (right_avg.stream - left_avg.stream); + + if (clock->count < SC_CLOCK_RANGE) { + /* The first frames are typically received and decoded with more delay + * than the others, causing a wrong slope estimation on start. To + * compensate, assume an initial slope of 1, then progressively use the + * estimated slope. */ + slope = (clock->count * slope + (SC_CLOCK_RANGE - clock->count)) + / SC_CLOCK_RANGE; + } + struct sc_clock_point global_avg = { .system = (clock->left_sum.system + clock->right_sum.system) / clock->count, @@ -34,8 +48,6 @@ sc_clock_estimate(struct sc_clock *clock, / clock->count, }; - double slope = (double) (right_avg.system - left_avg.system) - / (right_avg.stream - left_avg.stream); sc_tick offset = global_avg.system - (sc_tick) (global_avg.stream * slope); *out_slope = slope;