static apt_bool_t mrcp_server_session_offer_process(mrcp_server_session_t *session, mrcp_session_descriptor_t *descriptor) { if(!session->context) { /* initial offer received, generate session id and add to session's table */ if(!session->base.id.length) { apt_unique_id_generate(&session->base.id,MRCP_SESSION_ID_HEX_STRING_LENGTH,session->base.pool); } mrcp_server_session_add(session); session->context = mpf_engine_context_create(session->profile->media_engine,session,5,session->base.pool); } apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Receive Offer "APT_SID_FMT" [c:%d a:%d v:%d]", MRCP_SESSION_SID(&session->base), descriptor->control_media_arr->nelts, descriptor->audio_media_arr->nelts, descriptor->video_media_arr->nelts); /* store received offer */ session->offer = descriptor; session->answer = mrcp_session_answer_create(descriptor,session->base.pool); mrcp_server_session_state_set(session,SESSION_STATE_GENERATING_ANSWER); /* first, reset/destroy existing associations and topology */ if(mpf_engine_topology_message_add( session->profile->media_engine, MPF_RESET_ASSOCIATIONS,session->context, &session->mpf_task_msg) == TRUE){ mrcp_server_session_subrequest_add(session); } if(mrcp_session_version_get(session) == MRCP_VERSION_1) { if(mrcp_server_resource_offer_process(session,descriptor) == TRUE) { mrcp_server_av_media_offer_process(session,descriptor); } else { session->answer->resource_state = FALSE; } } else { mrcp_server_control_media_offer_process(session,descriptor); mrcp_server_av_media_offer_process(session,descriptor); } /* apply topology based on assigned associations */ if(mpf_engine_topology_message_add( session->profile->media_engine, MPF_APPLY_TOPOLOGY,session->context, &session->mpf_task_msg) == TRUE) { mrcp_server_session_subrequest_add(session); } mpf_engine_message_send(session->profile->media_engine,&session->mpf_task_msg); if(!session->subrequest_count) { /* send answer to client */ mrcp_server_session_answer_send(session); } return TRUE; }
/* Create RTSP session */ static rtsp_server_session_t* rtsp_server_session_create(rtsp_server_t *server) { rtsp_server_session_t *session; apr_pool_t *pool; apr_pool_create(&pool,NULL); session = apr_palloc(pool,sizeof(rtsp_server_session_t)); session->pool = pool; session->obj = NULL; session->active_request = NULL; session->request_queue = apt_list_create(pool); session->terminating = FALSE; apt_string_reset(&session->url); apt_unique_id_generate(&session->id,RTSP_SESSION_ID_HEX_STRING_LENGTH,pool); apt_log(APT_LOG_MARK,APT_PRIO_NOTICE,"Create RTSP Session <%s>",session->id.buf); if(server->vtable->create_session(server,session) != TRUE) { apr_pool_destroy(pool); return NULL; } return session; }
/* Create RTSP session */ static rtsp_server_session_t* rtsp_server_session_create(rtsp_server_t *server) { rtsp_server_session_t *session; apr_pool_t *pool = apt_pool_create(); session = apr_palloc(pool,sizeof(rtsp_server_session_t)); session->pool = pool; session->obj = NULL; session->last_cseq = 0; session->active_request = NULL; session->request_queue = apt_list_create(pool); session->resource_table = apr_hash_make(pool); session->terminating = FALSE; apt_unique_id_generate(&session->id,RTSP_SESSION_ID_HEX_STRING_LENGTH,pool); apt_log(RTSP_LOG_MARK,APT_PRIO_NOTICE,"Create RTSP Session " APT_SID_FMT,session->id.buf); if(server->vtable->create_session(server,session) != TRUE) { apr_pool_destroy(pool); return NULL; } return session; }
static apt_bool_t mrcp_server_session_offer_process(mrcp_server_session_t *session, mrcp_session_descriptor_t *descriptor) { if(!session->context) { /* initial offer received, generate session id and add to session's table */ if(!session->base.id.length) { apt_unique_id_generate(&session->base.id,MRCP_SESSION_ID_HEX_STRING_LENGTH,session->base.pool); } mrcp_server_session_add(session); session->context = mpf_context_create(session,5,session->base.pool); } apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Receive Offer <%s> [c:%d a:%d v:%d]", session->base.id.buf, descriptor->control_media_arr->nelts, descriptor->audio_media_arr->nelts, descriptor->video_media_arr->nelts); /* store received offer */ session->offer = descriptor; session->answer = mrcp_session_answer_create(descriptor,session->base.pool); if(session->base.signaling_agent->mrcp_version == MRCP_VERSION_1) { if(mrcp_server_resource_offer_process(session,descriptor) == TRUE) { mrcp_server_av_media_offer_process(session,descriptor); } else { session->answer->resource_state = FALSE; } } else { mrcp_server_control_media_offer_process(session,descriptor); mrcp_server_av_media_offer_process(session,descriptor); } if(!session->answer_flag_count) { /* send answer to client */ mrcp_server_session_answer_send(session); } return TRUE; }