@ -399,6 +399,7 @@ static void session_media_dtor(void *obj)
}
ast_free ( session_media - > mid ) ;
ast_free ( session_media - > remote_mslabel ) ;
}
struct ast_sip_session_media * ast_sip_session_media_state_add ( struct ast_sip_session * session ,
@ -553,6 +554,70 @@ static int set_mid_and_bundle_group(struct ast_sip_session *session,
return 0 ;
}
static void set_remote_mslabel_and_stream_group ( struct ast_sip_session * session ,
struct ast_sip_session_media * session_media ,
const pjmedia_sdp_session * sdp ,
const struct pjmedia_sdp_media * stream ,
struct ast_stream * asterisk_stream )
{
int index ;
ast_free ( session_media - > remote_mslabel ) ;
session_media - > remote_mslabel = NULL ;
for ( index = 0 ; index < stream - > attr_count ; + + index ) {
pjmedia_sdp_attr * attr = stream - > attr [ index ] ;
char attr_value [ pj_strlen ( & attr - > value ) + 1 ] ;
char * ssrc_attribute_name , * ssrc_attribute_value = NULL ;
char * msid , * tmp = attr_value ;
static const pj_str_t STR_msid = { " msid " , 4 } ;
static const pj_str_t STR_ssrc = { " ssrc " , 4 } ;
if ( ! pj_strcmp ( & attr - > name , & STR_msid ) ) {
ast_copy_pj_str ( attr_value , & attr - > value , sizeof ( attr_value ) ) ;
msid = strsep ( & tmp , " " ) ;
session_media - > remote_mslabel = ast_strdup ( msid ) ;
break ;
} else if ( ! pj_strcmp ( & attr - > name , & STR_ssrc ) ) {
ast_copy_pj_str ( attr_value , & attr - > value , sizeof ( attr_value ) ) ;
if ( ( ssrc_attribute_name = strchr ( attr_value , ' ' ) ) ) {
/* This has an actual attribute */
* ssrc_attribute_name + + = ' \0 ' ;
ssrc_attribute_value = strchr ( ssrc_attribute_name , ' : ' ) ;
if ( ssrc_attribute_value ) {
/* Values are actually optional according to the spec */
* ssrc_attribute_value + + = ' \0 ' ;
}
if ( ! strcasecmp ( ssrc_attribute_name , " mslabel " ) & & ! ast_strlen_zero ( ssrc_attribute_value ) ) {
session_media - > remote_mslabel = ast_strdup ( ssrc_attribute_value ) ;
break ;
}
}
}
}
if ( ast_strlen_zero ( session_media - > remote_mslabel ) ) {
return ;
}
/* Iterate through the existing streams looking for a match and if so then group this with it */
for ( index = 0 ; index < AST_VECTOR_SIZE ( & session - > pending_media_state - > sessions ) ; + + index ) {
struct ast_sip_session_media * group_session_media ;
group_session_media = AST_VECTOR_GET ( & session - > pending_media_state - > sessions , index ) ;
if ( ast_strlen_zero ( group_session_media - > remote_mslabel ) | |
strcmp ( group_session_media - > remote_mslabel , session_media - > remote_mslabel ) ) {
continue ;
}
ast_stream_set_group ( asterisk_stream , index ) ;
break ;
}
}
static void remove_stream_from_bundle ( struct ast_sip_session_media * session_media ,
struct ast_stream * stream )
{
@ -630,6 +695,7 @@ static int handle_incoming_sdp(struct ast_sip_session *session, const pjmedia_sd
}
set_mid_and_bundle_group ( session , session_media , sdp , remote_stream ) ;
set_remote_mslabel_and_stream_group ( session , session_media , sdp , remote_stream , stream ) ;
if ( session_media - > handler ) {
handler = session_media - > handler ;
@ -730,6 +796,7 @@ static int handle_negotiated_sdp_session_media(struct ast_sip_session_media *ses
ast_copy_pj_str ( media , & local - > media [ index ] - > desc . media , sizeof ( media ) ) ;
set_mid_and_bundle_group ( session , session_media , remote , remote - > media [ index ] ) ;
set_remote_mslabel_and_stream_group ( session , session_media , remote , remote - > media [ index ] , asterisk_stream ) ;
handler = session_media - > handler ;
if ( handler ) {