From 834d37c39ceb44c73c34bac9674136b50ec066e5 Mon Sep 17 00:00:00 2001
From: Robert Cripps <rcripps@voxbone.com>
Date: Wed, 17 Oct 2018 15:48:13 +0200
Subject: [PATCH] bridge_native_rtp.c: Fail native bridge if no framing match.

ASTERISK-28110 #close

Change-Id: Ic64b8fc6a140a93fbdb2f97550a40d0ff334e607
---
 bridges/bridge_native_rtp.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/bridges/bridge_native_rtp.c b/bridges/bridge_native_rtp.c
index d490183ff0..34a6a6492d 100644
--- a/bridges/bridge_native_rtp.c
+++ b/bridges/bridge_native_rtp.c
@@ -705,6 +705,18 @@ static int native_rtp_bridge_compatible_check(struct ast_bridge *bridge, struct
 		return 0;
 	}
 
+	if (glue0->audio.instance && glue1->audio.instance) {
+		unsigned int framing_inst0, framing_inst1;
+		framing_inst0 = ast_rtp_codecs_get_framing(ast_rtp_instance_get_codecs(glue0->audio.instance));
+		framing_inst1 = ast_rtp_codecs_get_framing(ast_rtp_instance_get_codecs(glue1->audio.instance));
+		if (framing_inst0 != framing_inst1) {
+			/* ptimes are asymmetric on the two call legs so we can't use the native bridge */
+			ast_debug(1, "Asymmetric ptimes on the two call legs (%u != %u). Cannot native bridge in RTP\n",
+				framing_inst0, framing_inst1);
+			return 0;
+		}
+	}
+
 	read_ptime0 = ast_format_cap_get_format_framing(cap0, ast_channel_rawreadformat(bc0->chan));
 	read_ptime1 = ast_format_cap_get_format_framing(cap1, ast_channel_rawreadformat(bc1->chan));
 	write_ptime0 = ast_format_cap_get_format_framing(cap0, ast_channel_rawwriteformat(bc0->chan));
-- 
GitLab