int tsproc_update_offset(struct tsproc *tsp, tmv_t *offset, double *weight) { tmv_t delay, raw_delay = 0; if (tmv_is_zero(tsp->t1) || tmv_is_zero(tsp->t2) || tmv_is_zero(tsp->t3) || tmv_is_zero(tsp->t4)) return -1; if (tsp->raw_mode || tsp->weighting) raw_delay = get_raw_delay(tsp); delay = tsp->raw_mode ? raw_delay : tsp->filtered_delay; /* offset = t2 - t1 - delay */ *offset = tmv_sub(tmv_sub(tsp->t2, tsp->t1), delay); if (!weight) return 0; if (tsp->weighting && tsp->filtered_delay > 0 && raw_delay > 0) { *weight = (double)tsp->filtered_delay / raw_delay; if (*weight > 1.0) *weight = 1.0; } else { *weight = 1.0; } return 0; }
tmv_t mave_accumulate(struct mave *m, tmv_t val) { m->sum = tmv_sub(m->sum, m->val[m->index]); m->val[m->index] = val; m->index = (1 + m->index) % m->len; m->sum = tmv_add(m->sum, val); if (m->cnt < m->len) { m->cnt++; } return tmv_div(m->sum, m->cnt); }
tmv_t get_raw_delay(struct tsproc *tsp) { tmv_t t23, t41, delay; /* delay = ((t2 - t3) * rr + (t4 - t1)) / 2 */ t23 = tmv_sub(tsp->t2, tsp->t3); if (tsp->clock_rate_ratio != 1.0) t23 = dbl_tmv(tmv_dbl(t23) * tsp->clock_rate_ratio); t41 = tmv_sub(tsp->t4, tsp->t1); delay = tmv_div(tmv_add(t23, t41), 2); if (delay < 0) { pr_debug("negative delay %10" PRId64, delay); pr_debug("delay = (t2 - t3) * rr + (t4 - t1)"); pr_debug("t2 - t3 = %+10" PRId64, t23); pr_debug("t4 - t1 = %+10" PRId64, t41); pr_debug("rr = %.9f", tsp->clock_rate_ratio); } return delay; }