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:22:15 -0500 |
commit | 4aaccb7795fac3a599b5ab2426fa40e4c46d098e (patch) | |
tree | 7b60de5457c2a8dff2da587090a8f667a7666d14 /bridges | |
parent | 2d69137bf446aba4b690e6e07ff3ba1108250f34 (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.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/bridges/bridge_native_rtp.c b/bridges/bridge_native_rtp.c index e25559363..58af24c43 100644 --- a/bridges/bridge_native_rtp.c +++ b/bridges/bridge_native_rtp.c @@ -541,10 +541,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; } @@ -563,14 +565,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); } |