Commit 4f49f2aa authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

RTP: apply de-jitter from last dequeuing rather than last queuing

Previously, if the absolute delay dropped by a longer interval than the
packetization time, we could end up repeatedly waiting into the future,
and never dequeue anything.
parent 2dbcfceb
......@@ -146,6 +146,7 @@ struct rtp_source_t
uint16_t last_seq; /* sequence of the next dequeued packet */
block_t *blocks; /* re-ordered blocks queue */
mtime_t last_dq; /* last dequeued (decoded) packet local timestamp */
void *opaque[0]; /* Per-source private payload data */
};
......@@ -314,6 +315,7 @@ rtp_queue (demux_t *demux, rtp_session_t *session, block_t *block)
}
}
src->last_rx = now;
block->i_pts = now;
src->last_ts = rtp_timestamp (block);
/* Check sequence number */
......@@ -410,6 +412,7 @@ rtp_decode (demux_t *demux, const rtp_session_t *session, rtp_source_t *src)
/* FIXME: handle timestamp wrap properly */
/* TODO: inter-medias/sessions sync (using RTCP-SR) */
const uint32_t timestamp = rtp_timestamp (block);
src->last_dq = block->i_pts;
block->i_pts = CLOCK_FREQ * timestamp / pt->frequency;
/* CSRC count */
......@@ -489,7 +492,7 @@ bool rtp_dequeue (demux_t *demux, const rtp_session_t *session,
* match for random gaussian jitter). Additionnaly, we implicitly
* wait for misordering times the packetization time.
*/
mtime_t deadline = src->last_rx;
mtime_t deadline = src->last_dq;
const rtp_pt_t *pt = rtp_find_ptype (session, src, block, NULL);
if (pt)
deadline += CLOCK_FREQ * 3 * src->jitter / pt->frequency;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment