diff options
author | Torrey Searle <torrey@voxbone.com> | 2017-07-26 16:17:02 +0200 |
---|---|---|
committer | Torrey Searle <torrey@voxbone.com> | 2017-08-09 16:18:26 +0200 |
commit | 4873e5ff337fd1dbd13936ce7b86f33738129aa8 (patch) | |
tree | fa68106a9ad9136d996b80b19f0877beda8b922a /res | |
parent | 709b837c35197d399d31d1db0947a87d5cdb0cf2 (diff) |
res_rtp_asterisk: enable rtcp & QOS stats on native bridge
Asterisk wasn't generating or forwarding RTCP packets when native
bridge was activated. Also the stats weren't available via
CHANNEL(qos). Now the RTCP stats are always calculated.
ASTERISK-27158 #close
Change-Id: I46fb8f61c95e836b9d2dda6054b0cf205c16037b
Diffstat (limited to 'res')
-rw-r--r-- | res/res_rtp_asterisk.c | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c index 65ab9020f..ce899dffe 100644 --- a/res/res_rtp_asterisk.c +++ b/res/res_rtp_asterisk.c @@ -5088,9 +5088,6 @@ static int bridge_p2p_rtp_write(struct ast_rtp_instance *instance, return -1; } - rtp->rxcount++; - rtp->rxoctetcount += (len - hdrlen); - /* If the payload coming in is not one of the negotiated ones then send it to the core, this will cause formats to change and the bridge to break */ if (ast_rtp_codecs_find_payload_code(ast_rtp_instance_get_codecs(instance1), bridged_payload) == -1) { ast_debug(1, "Unsupported payload type received \n"); @@ -5362,13 +5359,6 @@ static struct ast_frame *ast_rtp_read(struct ast_rtp_instance *instance, int rtc ast_rtp_dtmf_continuation(instance); } - /* If we are directly bridged to another instance send the audio directly out */ - instance1 = ast_rtp_instance_get_bridged(instance); - if (instance1 - && !bridge_p2p_rtp_write(instance, instance1, rtpheader, res, hdrlen)) { - return &ast_null_frame; - } - /* Pull out the various other fields we will need */ payloadtype = (seqno & 0x7f0000) >> 16; padding = seqno & (1 << 29); @@ -5467,6 +5457,28 @@ static struct ast_frame *ast_rtp_read(struct ast_rtp_instance *instance, int rtc rtp->themssrc = ntohl(rtpheader[2]); /* Record their SSRC to put in future RR */ } + + /* If we are directly bridged to another instance send the audio directly out, + * but only after updating core information about the received traffic so that + * outgoing RTCP reflects it. + */ + instance1 = ast_rtp_instance_get_bridged(instance); + if (instance1 + && !bridge_p2p_rtp_write(instance, instance1, rtpheader, res, hdrlen)) { + struct timeval rxtime; + struct ast_frame *f; + + /* Update statistics for jitter so they are correct in RTCP */ + calc_rxstamp(&rxtime, rtp, timestamp, mark); + + /* When doing P2P we don't need to raise any frames about SSRC change to the core */ + while ((f = AST_LIST_REMOVE_HEAD(&frames, frame_list)) != NULL) { + ast_frfree(f); + } + + return &ast_null_frame; + } + if (rtp_debug_test_addr(&addr)) { ast_verbose("Got RTP packet from %s (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6d)\n", ast_sockaddr_stringify(&addr), |