@ -1534,8 +1534,9 @@ const char *janus_trickle(JsonReader *reader, struct janus_session *session, uin
if ( ! sdp_mid & & sdp_m_line < 0 )
return " Neither sdpMid nor sdpMLineIndex given " ;
// fetch call and monologue
// fetch call
AUTO_CLEANUP_GBUF ( call_id ) ;
AUTO_CLEANUP_NULL ( struct call * call , call_unlock_release ) ;
{
LOCK ( & janus_lock ) ;
@ -1545,20 +1546,14 @@ const char *janus_trickle(JsonReader *reader, struct janus_session *session, uin
if ( ! handle | | ! handle - > room | | handle - > session ! = session )
return " Unhandled request method " ;
call_id = janus_call_id ( handle - > room ) ;
struct janus_room * room = g_hash_table_lookup ( janus_rooms , & handle - > room ) ;
* retcode = 426 ;
if ( ! room )
return " No such room " ;
call = call_get ( & room - > call_id ) ;
if ( ! call )
return " No such room " ;
if ( room )
call = call_get ( & room - > call_id ) ;
}
struct call_monologue * ml = janus_get_monologue ( handle_id , call , call_get_monologue ) ;
if ( ! ml )
return " Handle not found in room " ;
// set up "streams" structures to use an trickle ICE update. these must be
// allocated in case of delayed trickle ICE updates. it's using a refcounted
// ng_buffer as storage.
@ -1568,6 +1563,8 @@ const char *janus_trickle(JsonReader *reader, struct janus_session *session, uin
// top-level structures first, with auto cleanup
AUTO_CLEANUP ( GQueue streams , sdp_streams_free ) = G_QUEUE_INIT ;
AUTO_CLEANUP ( struct ng_buffer * ngbuf , ng_buffer_auto_release ) = ng_buffer_new ( NULL ) ;
AUTO_CLEANUP ( struct sdp_ng_flags flags , call_ng_free_flags ) ;
call_ng_flags_init ( & flags , OP_OTHER ) ;
// then the contained structures, and add them in
struct stream_params * sp = g_slice_alloc0 ( sizeof ( * sp ) ) ;
@ -1575,12 +1572,9 @@ const char *janus_trickle(JsonReader *reader, struct janus_session *session, uin
struct ice_candidate * cand = g_slice_alloc0 ( sizeof ( * cand ) ) ;
g_queue_push_tail ( & sp - > ice_candidates , cand ) ;
// populate and allocate a=mid
if ( sdp_mid )
bencode_strdup_str ( & ngbuf - > buffer , & sp - > media_id , sdp_mid ) ;
// allocate and parse candidate
str cand_str = STR_CONST_INIT_LEN ( bencode_strdup ( & ngbuf - > buffer , candidate ) , strlen ( candidate ) ) ;
str cand_str ;
bencode_strdup_str ( & ngbuf - > buffer , & cand_str , candidate ) ;
str_shift_cmp ( & cand_str , " candidate: " ) ; // skip prefix
if ( ! cand_str . len ) // end of candidates
return NULL ;
@ -1592,13 +1586,29 @@ const char *janus_trickle(JsonReader *reader, struct janus_session *session, uin
if ( ret > 0 )
return NULL ; // unsupported candidate type, accept and ignore it
// set required signalling flags
flags . fragment = 1 ;
AUTO_CLEANUP_GBUF ( handle_buf ) ;
handle_buf = g_strdup_printf ( " % " PRIu64 , handle_id ) ;
bencode_strdup_str ( & ngbuf - > buffer , & flags . from_tag , handle_buf ) ;
bencode_strdup_str ( & ngbuf - > buffer , & flags . call_id , call_id ) ;
// populate and allocate a=mid
if ( sdp_mid )
bencode_strdup_str ( & ngbuf - > buffer , & sp - > media_id , sdp_mid ) ;
// check m= line index
if ( sdp_m_line > = 0 )
sp - > index = sdp_m_line + 1 ;
// ufrag can be given in-line or separately
sp - > ice_ufrag = cand - > ufrag ;
if ( ! sp - > ice_ufrag . len & & ufrag )
bencode_strdup_str ( & ngbuf - > buffer , & sp - > ice_ufrag , ufrag ) ;
// finally do the update
ice_update_media_streams ( ml , & streams ) ;
trickle_ice_update( ngbuf , call , & flags , & streams ) ;
return NULL ;
}