@ -782,39 +782,24 @@ static const char *janus_videoroom_configure(struct websocket_message *wm, struc
room_id = handle - > room ;
if ( ! room_id )
return " JSON object does not contain 'message.room' key " ;
int has_audio = - 1 ; / / tri - state - 1 / 0 / 1
if ( json_reader_read_member ( reader , " audio " ) )
has_audio = ! ! json_reader_get_boolean_value ( reader ) ; / / 0 / 1
json_reader_end_member ( reader ) ;
/ / bool is_audio = true ;
/ / if ( json_reader_read_member ( reader , " audio " ) )
/ / is_audio = json_reader_get_boolean_value ( reader ) ;
/ / json_reader_end_member ( reader ) ;
int has_video = - 1 ; / / tri - state - 1 / 0 / 1
if ( json_reader_read_member ( reader , " vide o" ) )
has_video = ! ! json_reader_get_boolean_value ( reader ) ; / / 0 / 1
json_reader_end_member ( reader ) ;
/ / bool is_video = true ;
/ / if ( json_reader_read_member ( reader , " video " ) )
/ / is_video = json_reader_get_boolean_value ( reader ) ;
/ / json_reader_end_member ( reader ) ;
/ / exit " body "
json_reader_end_member ( reader ) ;
* retcode = 512 ;
if ( handle - > room ! = room_id )
return " Not in the room " ;
if ( ! jsep_type | | ! jsep_sdp )
return " No SDP " ;
if ( strcmp ( jsep_type , " offer " ) )
return " Not an offer " ;
AUTO_CLEANUP ( str sdp_in , str_free_dup ) = STR_NULL ;
str_init_dup ( & sdp_in , jsep_sdp ) ;
AUTO_CLEANUP ( struct sdp_ng_flags flags , call_ng_free_flags ) ;
AUTO_CLEANUP ( GQueue parsed , sdp_free ) = G_QUEUE_INIT ;
AUTO_CLEANUP ( GQueue streams , sdp_streams_free ) = G_QUEUE_INIT ;
call_ng_flags_init ( & flags , OP_PUBLISH ) ;
* retcode = 512 ;
if ( sdp_parse ( & sdp_in , & parsed , & flags ) )
return " Failed to parse SDP " ;
if ( sdp_streams ( & parsed , & streams , & flags ) )
return " Incomplete SDP specification " ;
AUTO_CLEANUP_NULL ( struct call * call , call_unlock_release ) ;
@ -830,30 +815,56 @@ static const char *janus_videoroom_configure(struct websocket_message *wm, struc
if ( ! g_hash_table_lookup ( room - > publishers , & handle - > id ) )
return " Not a publisher " ;
struct call_monologue * ml = janus_get_monologue ( handle - > id , call , call_get_or_create_monologue ) ;
struct call_monologue * ml = NULL ;
/ / accept unsupported codecs if necessary
flags . accept_any = 1 ;
if ( jsep_type & & jsep_sdp ) {
if ( strcmp ( jsep_type , " offer " ) )
return " Not an offer " ;
int ret = monologue_publish ( ml , & streams , & flags ) ;
if ( ret )
return " Publish error " ;
AUTO_CLEANUP ( str sdp_in , str_free_dup ) = STR_NULL ;
str_init_dup ( & sdp_in , jsep_sdp ) ;
/ / XXX check there ' s only one audio and one video stream ?
AUTO_CLEANUP ( struct sdp_ng_flags flags , call_ng_free_flags ) ;
AUTO_CLEANUP ( GQueue parsed , sdp_free ) = G_QUEUE_INIT ;
AUTO_CLEANUP ( GQueue streams , sdp_streams_free ) = G_QUEUE_INIT ;
call_ng_flags_init ( & flags , OP_PUBLISH ) ;
* retcode = 512 ;
if ( sdp_parse ( & sdp_in , & parsed , & flags ) )
return " Failed to parse SDP " ;
if ( sdp_streams ( & parsed , & streams , & flags ) )
return " Incomplete SDP specification " ;
AUTO_CLEANUP ( str sdp_out , str_free_dup ) = STR_NULL ;
ret = sdp_create ( & sdp_out , ml , & flags ) ;
if ( ret )
return " Publish error " ;
ml = janus_get_monologue ( handle - > id , call , call_get_or_create_monologue ) ;
/ / accept unsupported codecs if necessary
flags . accept_any = 1 ;
int ret = monologue_publish ( ml , & streams , & flags ) ;
if ( ret )
return " Publish error " ;
if ( ! ml - > janus_session )
ml - > janus_session = obj_get ( session ) ;
/ / XXX check there ' s only one audio and one video stream ?
save_last_sdp ( ml , & sdp_in , & parsed , & streams ) ;
* jsep_sdp_out = sdp_out ;
sdp_out = STR_NULL ; / / ownership passed to output
AUTO_CLEANUP ( str sdp_out , str_free_dup ) = STR_NULL ;
ret = sdp_create ( & sdp_out , ml , & flags ) ;
if ( ret )
return " Publish error " ;
if ( ! ml - > janus_session )
ml - > janus_session = obj_get ( session ) ;
* jsep_type_out = " answer " ;
save_last_sdp ( ml , & sdp_in , & parsed , & streams ) ;
* jsep_sdp_out = sdp_out ;
sdp_out = STR_NULL ; / / ownership passed to output
* jsep_type_out = " answer " ;
}
else {
/ / reconfigure existing publisher
ml = janus_get_monologue ( handle - > id , call , call_get_monologue ) ;
if ( ! ml )
return " Not an existing publisher " ;
}
* successp = " event " ;
json_builder_set_member_name ( builder , " videoroom " ) ;
@ -863,6 +874,24 @@ static const char *janus_videoroom_configure(struct websocket_message *wm, struc
json_builder_set_member_name ( builder , " configured " ) ;
json_builder_add_string_value ( builder , " ok " ) ;
/ / apply audio / video bool flags
for ( GList * l = ml - > medias . head ; l ; l = l - > next ) {
struct call_media * media = l - > data ;
if ( media - > type_id = = MT_AUDIO ) {
if ( has_audio = = 0 )
MEDIA_CLEAR ( media , RECV ) ;
else if ( has_audio = = 1 )
MEDIA_SET ( media , RECV ) ;
}
else if ( media - > type_id = = MT_VIDEO ) {
if ( has_video = = 0 )
MEDIA_CLEAR ( media , RECV ) ;
else if ( has_video = = 1 )
MEDIA_SET ( media , RECV ) ;
}
}
janus_add_publisher_details ( builder , ml ) ;
janus_notify_publishers ( room_id , handle - > id , call , 0 , janus_notify_publishers_joined ) ;