TT#14008 run jitter calculation for passthrough and egress

Change-Id: I004e8747d3f3dd83d43251ce93e4d98c3a739ecf
pull/1287/head
Richard Fuchs 5 years ago
parent a28df1f871
commit 891f45b4df

@ -1757,10 +1757,11 @@ void codec_handlers_free(struct call_media *m) {
}
void codec_add_raw_packet(struct media_packet *mp) {
void codec_add_raw_packet(struct media_packet *mp, unsigned int clockrate) {
struct codec_packet *p = g_slice_alloc0(sizeof(*p));
p->s = mp->raw;
p->free_func = NULL;
p->clockrate = clockrate;
if (mp->rtp && mp->ssrc_out) {
ssrc_ctx_hold(mp->ssrc_out);
p->ssrc_out = mp->ssrc_out;
@ -1772,7 +1773,9 @@ static int handler_func_passthrough(struct codec_handler *h, struct media_packet
if (mp->call->block_media || mp->media->monologue->block_media)
return 0;
codec_add_raw_packet(mp);
if (mp->rtp)
codec_calc_jitter(mp->ssrc_in, ntohl(mp->rtp->timestamp), h->source_pt.clock_rate, &mp->tv);
codec_add_raw_packet(mp, h->source_pt.clock_rate);
return 0;
}
@ -1956,6 +1959,7 @@ static void __output_rtp(struct media_packet *mp, struct codec_ssrc_handler *ch,
p->ttq_entry.source = handler;
p->rtp = rh;
p->ts = ts;
p->clockrate = handler->dest_pt.clock_rate;
ssrc_ctx_hold(ssrc_out);
p->ssrc_out = ssrc_out;
@ -2370,6 +2374,9 @@ static int handler_func_passthrough_ssrc(struct codec_handler *h, struct media_p
if (mp->call->block_media || mp->media->monologue->block_media)
return 0;
if (mp->rtp)
codec_calc_jitter(mp->ssrc_in, ntohl(mp->rtp->timestamp), h->source_pt.clock_rate, &mp->tv);
// substitute out SSRC etc
mp->rtp->ssrc = htonl(mp->ssrc_in->ssrc_map_out);
//mp->rtp->timestamp = htonl(ntohl(mp->rtp->timestamp));
@ -2377,7 +2384,7 @@ static int handler_func_passthrough_ssrc(struct codec_handler *h, struct media_p
// keep track of other stats here?
codec_add_raw_packet(mp);
codec_add_raw_packet(mp, h->source_pt.clock_rate);
return 0;
}
@ -3232,15 +3239,18 @@ out:
return ret;
}
#endif
static void codec_calc_jitter(struct media_packet *mp, unsigned int clockrate) {
if (!mp->ssrc_in)
void codec_calc_jitter(struct ssrc_ctx *ssrc, unsigned long ts, unsigned int clockrate,
const struct timeval *tv)
{
if (!ssrc || !clockrate)
return;
struct ssrc_entry_call *sec = mp->ssrc_in->parent;
struct ssrc_entry_call *sec = ssrc->parent;
// RFC 3550 A.8
uint32_t transit = (((timeval_us(&mp->tv) / 1000) * clockrate) / 1000)
- ntohl(mp->rtp->timestamp);
uint32_t transit = (((timeval_us(tv) / 1000) * clockrate) / 1000) - ts;
mutex_lock(&sec->h.lock);
int32_t d = 0;
if (sec->transit)
@ -3253,6 +3263,9 @@ static void codec_calc_jitter(struct media_packet *mp, unsigned int clockrate) {
}
#ifdef WITH_TRANSCODING
static int handler_func_transcode(struct codec_handler *h, struct media_packet *mp) {
if (G_UNLIKELY(!mp->rtp))
return handler_func_passthrough(h, mp);
@ -3265,7 +3278,7 @@ static int handler_func_transcode(struct codec_handler *h, struct media_packet *
ntohl(mp->rtp->ssrc), mp->rtp->m_pt, ntohs(mp->rtp->seq_num),
ntohl(mp->rtp->timestamp), mp->payload.len);
codec_calc_jitter(mp, h->source_pt.clock_rate);
codec_calc_jitter(mp->ssrc_in, ntohl(mp->rtp->timestamp), h->source_pt.clock_rate, &mp->tv);
if (h->stats_entry) {
unsigned int idx = rtpe_now.tv_sec & 1;

@ -188,12 +188,14 @@ static void __send_timer_send_common(struct send_timer *st, struct codec_packet
log_info_stream_fd(st->sink->selected_sfd);
struct rtp_header *rh = cp->rtp;
if (rh)
if (rh) {
ilog(LOG_DEBUG, "Forward to sink endpoint: %s%s:%d%s (RTP seq %u TS %u)",
FMT_M(sockaddr_print_buf(&st->sink->endpoint.address),
st->sink->endpoint.port),
ntohs(rh->seq_num),
ntohl(rh->timestamp));
codec_calc_jitter(cp->ssrc_out, ntohl(rh->timestamp), cp->clockrate, &rtpe_now);
}
else
ilog(LOG_DEBUG, "Forward to sink endpoint: %s%s:%d%s",
FMT_M(sockaddr_print_buf(&st->sink->endpoint.address),

@ -1925,7 +1925,7 @@ static int do_rtcp(struct packet_handler_ctx *phc) {
goto out;
// queue for output
codec_add_raw_packet(&phc->mp);
codec_add_raw_packet(&phc->mp, 0);
ok:
ret = 0;
out:

@ -60,6 +60,7 @@ struct codec_packet {
str s;
struct rtp_header *rtp;
unsigned long ts;
unsigned int clockrate;
struct ssrc_ctx *ssrc_out;
void (*free_func)(void *);
};
@ -78,8 +79,9 @@ void codec_handlers_free(struct call_media *);
struct codec_handler *codec_handler_make_playback(const struct rtp_payload_type *src_pt,
const struct rtp_payload_type *dst_pt, unsigned long ts, struct call_media *);
void ensure_codec_def(struct rtp_payload_type *pt, struct call_media *media);
void codec_calc_jitter(struct ssrc_ctx *, unsigned long ts, unsigned int clockrate, const struct timeval *);
void codec_add_raw_packet(struct media_packet *mp);
void codec_add_raw_packet(struct media_packet *mp, unsigned int clockrate);
void codec_packet_free(void *);
void codec_rtp_payload_types(struct call_media *media, struct call_media *other_media,

Loading…
Cancel
Save