From: Richard Mudgett Date: Tue, 29 Aug 2017 19:22:15 +0000 (-0500) Subject: bridge_native_rtp.c: Fixup native_rtp_framehook() X-Git-Tag: 14.7.0-rc1~80 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b96306e3a680f04b3bdce69892f82b61891aed27;p=thirdparty%2Fasterisk.git 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 --- diff --git a/bridges/bridge_native_rtp.c b/bridges/bridge_native_rtp.c index 899523ed3a..a166258923 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); }