/** @internal @This creates regularly empty urefs. * * @param upump description structure of the timer */ static void upipe_voidsrc_worker(struct upump *upump) { struct upipe *upipe = upump_get_opaque(upump, struct upipe *); struct upipe_voidsrc *upipe_voidsrc = upipe_voidsrc_from_upipe(upipe); uint64_t now; if (upipe_voidsrc->pts == UINT64_MAX) upipe_voidsrc->pts = uclock_now(upipe_voidsrc->uclock); for (now = uclock_now(upipe_voidsrc->uclock); !upipe_single(upipe) && upipe_voidsrc->pts <= now; now = uclock_now(upipe_voidsrc->uclock)) { struct uref *uref = uref_alloc(upipe_voidsrc->uref_mgr); if (unlikely(!uref)) { upipe_throw_fatal(upipe, UBASE_ERR_ALLOC); return; } uref_clock_set_duration(uref, upipe_voidsrc->interval); uref_clock_set_pts_sys(uref, upipe_voidsrc->pts); uref_clock_set_pts_prog(uref, upipe_voidsrc->pts); upipe_voidsrc->pts += upipe_voidsrc->interval; upipe_voidsrc_output(upipe, uref, &upipe_voidsrc->timer); } if (!upipe_single(upipe)) upipe_voidsrc_wait_timer(upipe, upipe_voidsrc->pts - now, upipe_voidsrc_worker); }
static void upipe_rtp_opus_input(struct upipe *upipe, struct uref *uref, struct upump **upump_p) { struct upipe_rtp_opus *upipe_rtp_opus = upipe_rtp_opus_from_upipe(upipe); uint64_t timestamp = 0; size_t block_size = 0; if (!ubase_check(uref_block_size(uref, &block_size))) { upipe_warn(upipe, "fail to get uref block size"); return; } uref_rtp_get_timestamp(uref, ×tamp); uref_clock_set_pts_orig(uref, timestamp * TS_MULTIPLIER); uint64_t delta = (UINT_MAX + timestamp - (upipe_rtp_opus->last_rtp_timestamp % UINT_MAX)) % UINT_MAX; upipe_rtp_opus->last_rtp_timestamp += delta; uref_clock_set_pts_prog(uref, upipe_rtp_opus->last_rtp_timestamp * TS_MULTIPLIER); upipe_throw_clock_ref(upipe, uref, upipe_rtp_opus->last_rtp_timestamp * TS_MULTIPLIER, 0); upipe_throw_clock_ts(upipe, uref); upipe_rtp_opus_output(upipe, uref, upump_p); }