Exemplo n.º 1
0
/** @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);
}
Exemplo n.º 2
0
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, &timestamp);
    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);
}