@ -1409,89 +1409,89 @@ struct ast_rtp_instance *ast_rtp_instance_get_bridged(struct ast_rtp_instance *i
return instance - > bridged ;
}
void ast_rtp_instance_early_bridge_make_compatible ( struct ast_channel * c 0, struct ast_channel * c1 )
{
struct ast_rtp_instance * instance 0 = NULL , * instance1 = NULL ,
* vinstance 0 = NULL , * vinstance1 = NULL ,
* tinstance 0 = NULL , * tinstance1 = NULL ;
struct ast_rtp_glue * glue 0, * glue1 ;
enum ast_rtp_glue_result audio_glue 0_res = AST_RTP_GLUE_RESULT_FORBID , video_glue0 _res = AST_RTP_GLUE_RESULT_FORBID ;
enum ast_rtp_glue_result audio_glue 1_res = AST_RTP_GLUE_RESULT_FORBID , video_glue1 _res = AST_RTP_GLUE_RESULT_FORBID ;
format_t codec 0 = 0 , codec1 = 0 ;
void ast_rtp_instance_early_bridge_make_compatible ( struct ast_channel * c _dst, struct ast_channel * c_src )
{
struct ast_rtp_instance * instance _dst = NULL , * instance_src = NULL ,
* vinstance _dst = NULL , * vinstance_src = NULL ,
* tinstance _dst = NULL , * tinstance_src = NULL ;
struct ast_rtp_glue * glue _dst, * glue_src ;
enum ast_rtp_glue_result audio_glue _dst_res = AST_RTP_GLUE_RESULT_FORBID , video_glue_dst _res = AST_RTP_GLUE_RESULT_FORBID ;
enum ast_rtp_glue_result audio_glue _src_res = AST_RTP_GLUE_RESULT_FORBID , video_glue_src _res = AST_RTP_GLUE_RESULT_FORBID ;
format_t codec _dst = 0 , codec_src = 0 ;
int res = 0 ;
/* Lock both channels so we can look for the glue that binds them together */
ast_channel_lock ( c 0 ) ;
while ( ast_channel_trylock ( c 1 ) ) {
ast_channel_unlock ( c 0 ) ;
ast_channel_lock ( c _dst ) ;
while ( ast_channel_trylock ( c _src ) ) {
ast_channel_unlock ( c _dst ) ;
usleep ( 1 ) ;
ast_channel_lock ( c 0 ) ;
ast_channel_lock ( c _dst ) ;
}
/* Grab glue that binds each channel to something using the RTP engine */
if ( ! ( glue 0 = ast_rtp_instance_get_glue ( c0 - > tech - > type ) ) | | ! ( glue 1 = ast_rtp_instance_get_glue ( c1 - > tech - > type ) ) ) {
ast_debug ( 1 , " Can't find native functions for channel '%s' \n " , glue 0 ? c1 - > name : c0 - > name ) ;
if ( ! ( glue _dst = ast_rtp_instance_get_glue ( c_dst - > tech - > type ) ) | | ! ( glue _src = ast_rtp_instance_get_glue ( c_src - > tech - > type ) ) ) {
ast_debug ( 1 , " Can't find native functions for channel '%s' \n " , glue _dst ? c_src - > name : c_dst - > name ) ;
goto done ;
}
audio_glue 0_res = glue0 - > get_rtp_info ( c0 , & instance0 ) ;
video_glue 0_res = glue0 - > get_vrtp_info ? glue0 - > get_vrtp_info ( c0 , & vinstance0 ) : AST_RTP_GLUE_RESULT_FORBID ;
audio_glue _dst_res = glue_dst - > get_rtp_info ( c_dst , & instance_dst ) ;
video_glue _dst_res = glue_dst - > get_vrtp_info ? glue_dst - > get_vrtp_info ( c_dst , & vinstance_dst ) : AST_RTP_GLUE_RESULT_FORBID ;
audio_glue 1_res = glue1 - > get_rtp_info ( c1 , & instance1 ) ;
video_glue 1_res = glue1 - > get_vrtp_info ? glue1 - > get_vrtp_info ( c1 , & vinstance1 ) : AST_RTP_GLUE_RESULT_FORBID ;
audio_glue _src_res = glue_src - > get_rtp_info ( c_src , & instance_src ) ;
video_glue _src_res = glue_src - > get_vrtp_info ? glue_src - > get_vrtp_info ( c_src , & vinstance_src ) : AST_RTP_GLUE_RESULT_FORBID ;
/* If we are carrying video, and both sides are not going to remotely bridge... fail the native bridge */
if ( video_glue 0 _res ! = AST_RTP_GLUE_RESULT_FORBID & & ( audio_glue 0_res ! = AST_RTP_GLUE_RESULT_REMOTE | | video_glue0 _res ! = AST_RTP_GLUE_RESULT_REMOTE ) ) {
audio_glue 0 _res = AST_RTP_GLUE_RESULT_FORBID ;
if ( video_glue _dst _res ! = AST_RTP_GLUE_RESULT_FORBID & & ( audio_glue _dst_res ! = AST_RTP_GLUE_RESULT_REMOTE | | video_glue_dst _res ! = AST_RTP_GLUE_RESULT_REMOTE ) ) {
audio_glue _dst _res = AST_RTP_GLUE_RESULT_FORBID ;
}
if ( video_glue 1 _res ! = AST_RTP_GLUE_RESULT_FORBID & & ( audio_glue 1_res ! = AST_RTP_GLUE_RESULT_REMOTE | | video_glue1 _res ! = AST_RTP_GLUE_RESULT_REMOTE ) ) {
audio_glue 1 _res = AST_RTP_GLUE_RESULT_FORBID ;
if ( video_glue _src _res ! = AST_RTP_GLUE_RESULT_FORBID & & ( audio_glue _src_res ! = AST_RTP_GLUE_RESULT_REMOTE | | video_glue_src _res ! = AST_RTP_GLUE_RESULT_REMOTE ) ) {
audio_glue _src _res = AST_RTP_GLUE_RESULT_FORBID ;
}
if ( audio_glue 0 _res = = AST_RTP_GLUE_RESULT_REMOTE & & ( video_glue 0_res = = AST_RTP_GLUE_RESULT_FORBID | | video_glue0 _res = = AST_RTP_GLUE_RESULT_REMOTE ) & & glue 0 - > get_codec ) {
codec 0 = glue0 - > get_codec ( c0 ) ;
if ( audio_glue _dst _res = = AST_RTP_GLUE_RESULT_REMOTE & & ( video_glue _dst_res = = AST_RTP_GLUE_RESULT_FORBID | | video_glue_dst _res = = AST_RTP_GLUE_RESULT_REMOTE ) & & glue _dst - > get_codec ) {
codec _dst = glue_dst - > get_codec ( c_dst ) ;
}
if ( audio_glue 1 _res = = AST_RTP_GLUE_RESULT_REMOTE & & ( video_glue 1_res = = AST_RTP_GLUE_RESULT_FORBID | | video_glue1 _res = = AST_RTP_GLUE_RESULT_REMOTE ) & & glue 1 - > get_codec ) {
codec 1 = glue1 - > get_codec ( c1 ) ;
if ( audio_glue _src _res = = AST_RTP_GLUE_RESULT_REMOTE & & ( video_glue _src_res = = AST_RTP_GLUE_RESULT_FORBID | | video_glue_src _res = = AST_RTP_GLUE_RESULT_REMOTE ) & & glue _src - > get_codec ) {
codec _src = glue_src - > get_codec ( c_src ) ;
}
/* If any sort of bridge is forbidden just completely bail out and go back to generic bridging */
if ( audio_glue 0_res ! = AST_RTP_GLUE_RESULT_REMOTE | | audio_glue1 _res ! = AST_RTP_GLUE_RESULT_REMOTE ) {
if ( audio_glue _dst_res ! = AST_RTP_GLUE_RESULT_REMOTE | | audio_glue_src _res ! = AST_RTP_GLUE_RESULT_REMOTE ) {
goto done ;
}
/* Make sure we have matching codecs */
if ( ! ( codec 0 & codec1 ) ) {
if ( ! ( codec _dst & codec_src ) ) {
goto done ;
}
ast_rtp_codecs_payloads_copy ( & instance 0- > codecs , & instance1 - > codecs , instance1 ) ;
ast_rtp_codecs_payloads_copy ( & instance _src- > codecs , & instance_dst - > codecs , instance_dst ) ;
if ( vinstance 0 & & vinstance1 ) {
ast_rtp_codecs_payloads_copy ( & vinstance 0- > codecs , & vinstance1 - > codecs , vinstance1 ) ;
if ( vinstance _dst & & vinstance_src ) {
ast_rtp_codecs_payloads_copy ( & vinstance _src- > codecs , & vinstance_dst - > codecs , vinstance_dst ) ;
}
if ( tinstance 0 & & tinstance1 ) {
ast_rtp_codecs_payloads_copy ( & tinstance 0- > codecs , & tinstance1 - > codecs , tinstance1 ) ;
if ( tinstance _dst & & tinstance_src ) {
ast_rtp_codecs_payloads_copy ( & tinstance _src- > codecs , & tinstance_dst - > codecs , tinstance_dst ) ;
}
if ( glue 0- > update_peer ( c0 , instance1 , vinstance1 , tinstance1 , codec1 , 0 ) ) {
ast_log ( LOG_WARNING , " Channel '%s' failed to setup early bridge to '%s' \n " , c 0- > name , c1 ? c1 - > name : " <unspecified> " ) ;
if ( glue _dst- > update_peer ( c_dst , instance_src , vinstance_src , tinstance_src , codec_src , 0 ) ) {
ast_log ( LOG_WARNING , " Channel '%s' failed to setup early bridge to '%s' \n " , c _dst- > name , c_src ? c_src - > name : " <unspecified> " ) ;
}
res = 0 ;
done :
ast_channel_unlock ( c 0 ) ;
ast_channel_unlock ( c 1 ) ;
ast_channel_unlock ( c _dst ) ;
ast_channel_unlock ( c _src ) ;
unref_instance_cond ( & instance 0 ) ;
unref_instance_cond ( & instance 1 ) ;
unref_instance_cond ( & vinstance 0 ) ;
unref_instance_cond ( & vinstance 1 ) ;
unref_instance_cond ( & tinstance 0 ) ;
unref_instance_cond ( & tinstance 1 ) ;
unref_instance_cond ( & instance _dst ) ;
unref_instance_cond ( & instance _src ) ;
unref_instance_cond ( & vinstance _dst ) ;
unref_instance_cond ( & vinstance _src ) ;
unref_instance_cond ( & tinstance _dst ) ;
unref_instance_cond ( & tinstance _src ) ;
if ( ! res ) {
ast_debug ( 1 , " Seeded SDP of '%s' with that of '%s' \n " , c 0- > name , c1 ? c1 - > name : " <unspecified> " ) ;
ast_debug ( 1 , " Seeded SDP of '%s' with that of '%s' \n " , c _dst- > name , c_src ? c_src - > name : " <unspecified> " ) ;
}
}