summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorrey Searle <torrey@voxbone.com>2017-07-26 16:17:02 +0200
committerJoshua Colp <jcolp@digium.com>2017-08-07 12:07:51 +0000
commit3608f96ea378d6b37bcf26e6ca182077140a7b90 (patch)
treee2944c037e8cf98c191cee757bfcc1e2d69336a4
parent6dd12aaacd4a0e6926962cabb62ef0926d079a4f (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
-rw-r--r--res/res_rtp_asterisk.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c
index a93bb7758..bf0d9cc82 100644
--- a/res/res_rtp_asterisk.c
+++ b/res/res_rtp_asterisk.c
@@ -4854,9 +4854,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");
@@ -5092,13 +5089,6 @@ static struct ast_frame *ast_rtp_read(struct ast_rtp_instance *instance, int rtc
}
}
- /* 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;
- }
-
/* If the version is not what we expected by this point then just drop the packet */
if (version != 2) {
return &ast_null_frame;
@@ -5203,6 +5193,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),