Index: main/rtp.c =================================================================== --- main/rtp.c (revision 58347) +++ main/rtp.c (working copy) @@ -1533,7 +1533,7 @@ struct ast_rtp_protocol *destpr = NULL, *srcpr = NULL; enum ast_rtp_get_result audio_dest_res = AST_RTP_GET_FAILED, video_dest_res = AST_RTP_GET_FAILED; enum ast_rtp_get_result audio_src_res = AST_RTP_GET_FAILED, video_src_res = AST_RTP_GET_FAILED; - int srccodec; + int srccodec, destcodec; /* Lock channels */ ast_channel_lock(dest); @@ -1565,9 +1565,19 @@ audio_src_res = srcpr->get_rtp_info(src, &srcp); video_src_res = srcpr->get_vrtp_info ? srcpr->get_vrtp_info(src, &vsrcp) : AST_RTP_GET_FAILED; + /* Ensure we have at least one matching codec */ + if (srcpr->get_codec) + srccodec = srcpr->get_codec(src); + else + srccodec = 0; + if (destpr->get_codec) + destcodec = destpr->get_codec(dest); + else + destcodec = 0; + /* Check if bridge is still possible (In SIP canreinvite=no stops this, like NAT) */ - if (audio_dest_res != AST_RTP_TRY_NATIVE || audio_src_res != AST_RTP_TRY_NATIVE) { - /* Somebody doesn't want to play... */ + if (audio_dest_res != AST_RTP_TRY_NATIVE || audio_src_res != AST_RTP_TRY_NATIVE || !(srccodec & destcodec)) { + /* Somebody doesn't want to play or we have no matching codec... */ ast_channel_unlock(dest); ast_channel_unlock(src); return 0; @@ -1575,10 +1585,6 @@ ast_rtp_pt_copy(destp, srcp); if (vdestp && vsrcp) ast_rtp_pt_copy(vdestp, vsrcp); - if (srcpr->get_codec) - srccodec = srcpr->get_codec(src); - else - srccodec = 0; if (media) { /* Bridge early */ if (destpr->set_rtp_peer(dest, srcp, vsrcp, srccodec, ast_test_flag(srcp, FLAG_NAT_ACTIVE)))