summaryrefslogtreecommitdiff
path: root/bridges
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2017-08-29 14:22:15 -0500
committerRichard Mudgett <rmudgett@digium.com>2017-08-29 14:37:30 -0500
commit4650fc477a88e84e9b3845dd60eeb43d64b30a3a (patch)
tree4dfb967bfc422a1d81acf16b3563da31e6ecc46d /bridges
parentc4a006613c6c279f79fa8f8cb71b7ad1001e4311 (diff)
bridge_native_rtp.c: Fixup native_rtp_framehook()
* Fix framehook to test frame type for control frame. * Made framehook exit early if frame type is not a control frame. * Eliminated RAII_VAR in framehook. * Use switch instead of else-if ladder for control frame handling. Change-Id: Ia555fc3600bd85470e3c0141147dbe3ad07c1d18
Diffstat (limited to 'bridges')
-rw-r--r--bridges/bridge_native_rtp.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/bridges/bridge_native_rtp.c b/bridges/bridge_native_rtp.c
index 02b27e123..a46b42027 100644
--- a/bridges/bridge_native_rtp.c
+++ b/bridges/bridge_native_rtp.c
@@ -539,10 +539,12 @@ static void native_rtp_bridge_stop(struct ast_bridge *bridge, struct ast_channel
static struct ast_frame *native_rtp_framehook(struct ast_channel *chan,
struct ast_frame *f, enum ast_framehook_event event, void *data)
{
- RAII_VAR(struct ast_bridge *, bridge, NULL, ao2_cleanup);
+ struct ast_bridge *bridge;
struct native_rtp_framehook_data *native_data = data;
- if (!f || (event != AST_FRAMEHOOK_EVENT_WRITE)) {
+ if (!f
+ || f->frametype != AST_FRAME_CONTROL
+ || event != AST_FRAMEHOOK_EVENT_WRITE) {
return f;
}
@@ -561,14 +563,20 @@ static struct ast_frame *native_rtp_framehook(struct ast_channel *chan,
ast_channel_unlock(chan);
ast_bridge_lock(bridge);
if (!native_data->detached) {
- if (f->subclass.integer == AST_CONTROL_HOLD) {
+ switch (f->subclass.integer) {
+ case AST_CONTROL_HOLD:
native_rtp_bridge_stop(bridge, chan);
- } else if ((f->subclass.integer == AST_CONTROL_UNHOLD) ||
- (f->subclass.integer == AST_CONTROL_UPDATE_RTP_PEER)) {
+ break;
+ case AST_CONTROL_UNHOLD:
+ case AST_CONTROL_UPDATE_RTP_PEER:
native_rtp_bridge_start(bridge, chan);
+ break;
+ default:
+ break;
}
}
ast_bridge_unlock(bridge);
+ ao2_ref(bridge, -1);
ast_channel_lock(chan);
}