From 1fcb6b1b21484473b10f1bc02dc9f16bb3e76683 Mon Sep 17 00:00:00 2001
From: "Joshua C. Colp" <jcolp@sangoma.com>
Date: Fri, 5 Jun 2020 06:45:18 -0300
Subject: [PATCH] bridge_channel: Don't queue unmapped frames.

If a frame is written to a channel in a bridge we
would normally queue this frame up and the channel
thread would then act upon it. If this frame had no
stream mapping on the channel it would then be
discarded.

This change adds a check before the queueing occurs
to determine if a mapping exists. If it does not
exist then the frame is not even queued at all. This
stops a frame duplication from happening and from
the channel thread having to wake up and deal with
it.

Change-Id: I17189b9b1dec45fc7e4490e8081d444a25a00bda
---
 main/bridge_channel.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/main/bridge_channel.c b/main/bridge_channel.c
index 8566187cc1..251dea7e35 100644
--- a/main/bridge_channel.c
+++ b/main/bridge_channel.c
@@ -1043,6 +1043,23 @@ int ast_bridge_channel_queue_frame(struct ast_bridge_channel *bridge_channel, st
 		return 0;
 	}
 
+	if ((fr->frametype == AST_FRAME_VOICE || fr->frametype == AST_FRAME_VIDEO ||
+		fr->frametype == AST_FRAME_TEXT || fr->frametype == AST_FRAME_IMAGE ||
+		fr->frametype == AST_FRAME_RTCP) && fr->stream_num > -1) {
+		int num = -1;
+
+		ast_bridge_channel_lock(bridge_channel);
+		if (fr->stream_num < (int)AST_VECTOR_SIZE(&bridge_channel->stream_map.to_channel)) {
+			num = AST_VECTOR_GET(&bridge_channel->stream_map.to_channel, fr->stream_num);
+		}
+		ast_bridge_channel_unlock(bridge_channel);
+
+		if (num == -1) {
+			/* We don't have a mapped stream so just discard this frame. */
+			return 0;
+		}
+	}
+
 	dup = ast_frdup(fr);
 	if (!dup) {
 		return -1;
-- 
GitLab