diff options
author | Richard Mudgett <rmudgett@digium.com> | 2017-08-29 14:22:15 -0500 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2017-08-29 14:37:30 -0500 |
commit | 4650fc477a88e84e9b3845dd60eeb43d64b30a3a (patch) | |
tree | 4dfb967bfc422a1d81acf16b3563da31e6ecc46d | |
parent | c4a006613c6c279f79fa8f8cb71b7ad1001e4311 (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
-rw-r--r-- | bridges/bridge_native_rtp.c | 18 |
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); } |