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->base.name, session,5,session->base.pool); } apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Receive Offer "APT_NAMESID_FMT" [c:%d a:%d v:%d]", MRCP_SESSION_NAMESID(session), 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; }
APT_DECLARE(apt_bool_t) apt_test_framework_suite_add(apt_test_framework_t *framework, apt_test_suite_t *suite) { apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Add Test Suite [%s]",suite->name.buf); return (apt_list_push_back(framework->suites,suite,suite->pool) ? TRUE : FALSE); }
/** Destroy application instance */ MRCP_DECLARE(apt_bool_t) mrcp_application_destroy(mrcp_application_t *application) { apt_log(APT_LOG_MARK,APT_PRIO_NOTICE,"Destroy Application"); return TRUE; }
static apt_bool_t synth_response_define_lexicon(mrcp_synth_state_machine_t *state_machine, mrcp_message_t *message) { apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Process DEFINE-LEXICON Response [%"MRCP_REQUEST_ID_FMT"]", message->start_line.request_id); return synth_response_dispatch(state_machine,message); }
APT_DECLARE(void) apt_test_framework_destroy(apt_test_framework_t *framework) { apt_log(APT_LOG_MARK,APT_PRIO_NOTICE,"Destroy Test Framework"); apt_log_instance_destroy(); apr_pool_destroy(framework->pool); }
static apt_bool_t mpf_rtp_stream_media_negotiate(mpf_rtp_stream_t *rtp_stream) { mpf_rtp_media_descriptor_t *local_media = rtp_stream->local_media; mpf_rtp_media_descriptor_t *remote_media = rtp_stream->remote_media; if(!local_media || !remote_media) { return FALSE; } local_media->id = remote_media->id; local_media->mid = remote_media->mid; local_media->ptime = remote_media->ptime; if(rtp_stream->state == MPF_MEDIA_DISABLED && remote_media->state == MPF_MEDIA_ENABLED) { /* enable RTP/RTCP session */ rtp_stream->state = MPF_MEDIA_ENABLED; if(rtp_stream->rtp_l_sockaddr) { apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Enable RTP Session %s:%hu", rtp_stream->rtp_l_sockaddr->hostname, rtp_stream->rtp_l_sockaddr->port); } if(rtp_stream->rtcp_tx_timer) { apt_timer_set(rtp_stream->rtcp_tx_timer,rtp_stream->settings->rtcp_tx_interval); } if(rtp_stream->rtcp_rx_timer) { apt_timer_set(rtp_stream->rtcp_rx_timer,rtp_stream->settings->rtcp_rx_resolution); } } else if(rtp_stream->state == MPF_MEDIA_ENABLED && remote_media->state == MPF_MEDIA_DISABLED) { /* disable RTP/RTCP session */ rtp_stream->state = MPF_MEDIA_DISABLED; if(rtp_stream->rtp_l_sockaddr) { apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Disable RTP Session %s:%hu", rtp_stream->rtp_l_sockaddr->hostname, rtp_stream->rtp_l_sockaddr->port); } if(rtp_stream->rtcp_tx_timer) { apt_timer_kill(rtp_stream->rtcp_tx_timer); } if(rtp_stream->rtcp_rx_timer) { apt_timer_kill(rtp_stream->rtcp_rx_timer); } if(rtp_stream->settings->rtcp == TRUE && rtp_stream->settings->rtcp_bye_policy != RTCP_BYE_DISABLE) { apt_str_t reason = {RTCP_BYE_SESSION_ENDED, sizeof(RTCP_BYE_SESSION_ENDED)-1}; mpf_rtcp_bye_send(rtp_stream,&reason); } } local_media->state = remote_media->state; local_media->direction = mpf_stream_reverse_direction_get(remote_media->direction); rtp_stream->base->direction = local_media->direction; if(remote_media->state == MPF_MEDIA_ENABLED) { if(mpf_codec_list_is_empty(&remote_media->codec_list) == TRUE) { /* no remote codecs available, initialize them according to the local codecs */ mpf_codec_list_copy(&remote_media->codec_list, &local_media->codec_list, rtp_stream->pool); } /* intersect local and remote codecs */ if(rtp_stream->settings->own_preferrence == TRUE) { mpf_codec_lists_intersect( &local_media->codec_list, &remote_media->codec_list); } else { mpf_codec_lists_intersect( &remote_media->codec_list, &local_media->codec_list); } } return TRUE; }
static apt_bool_t synth_request_get_params(mrcp_synth_state_machine_t *state_machine, mrcp_message_t *message) { apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Process GET-PARAMS Request [%"MRCP_REQUEST_ID_FMT"]", message->start_line.request_id); return synth_request_dispatch(state_machine,message); }
static mrcp_connection_t* mrcp_client_agent_connection_create(mrcp_connection_agent_t *agent, mrcp_control_descriptor_t *descriptor) { char *local_ip = NULL; char *remote_ip = NULL; mrcp_connection_t *connection = mrcp_connection_create(); apr_sockaddr_info_get(&connection->r_sockaddr,descriptor->ip.buf,APR_INET,descriptor->port,0,connection->pool); if(!connection->r_sockaddr) { mrcp_connection_destroy(connection); return NULL; } if(apr_socket_create(&connection->sock,connection->r_sockaddr->family,SOCK_STREAM,APR_PROTO_TCP,connection->pool) != APR_SUCCESS) { mrcp_connection_destroy(connection); return NULL; } apr_socket_opt_set(connection->sock, APR_SO_NONBLOCK, 0); apr_socket_timeout_set(connection->sock, -1); apr_socket_opt_set(connection->sock, APR_SO_REUSEADDR, 1); if(apr_socket_connect(connection->sock, connection->r_sockaddr) != APR_SUCCESS) { apr_socket_close(connection->sock); mrcp_connection_destroy(connection); return NULL; } if(apr_socket_addr_get(&connection->l_sockaddr,APR_LOCAL,connection->sock) != APR_SUCCESS) { apr_socket_close(connection->sock); mrcp_connection_destroy(connection); return NULL; } apr_sockaddr_ip_get(&local_ip,connection->l_sockaddr); apr_sockaddr_ip_get(&remote_ip,connection->r_sockaddr); connection->id = apr_psprintf(connection->pool,"%s:%hu <-> %s:%hu", local_ip,connection->l_sockaddr->port, remote_ip,connection->r_sockaddr->port); memset(&connection->sock_pfd,0,sizeof(apr_pollfd_t)); connection->sock_pfd.desc_type = APR_POLL_SOCKET; connection->sock_pfd.reqevents = APR_POLLIN; connection->sock_pfd.desc.s = connection->sock; connection->sock_pfd.client_data = connection; if(apt_poller_task_descriptor_add(agent->task, &connection->sock_pfd) != TRUE) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Add to Pollset %s",connection->id); apr_socket_close(connection->sock); mrcp_connection_destroy(connection); return NULL; } apt_log(APT_LOG_MARK,APT_PRIO_NOTICE,"Established TCP/MRCPv2 Connection %s",connection->id); connection->agent = agent; APR_RING_INSERT_TAIL(&agent->connection_list,connection,mrcp_connection_t,link); connection->parser = mrcp_parser_create(agent->resource_factory,connection->pool); connection->generator = mrcp_generator_create(agent->resource_factory,connection->pool); connection->tx_buffer_size = agent->tx_buffer_size; connection->tx_buffer = apr_palloc(connection->pool,connection->tx_buffer_size+1); connection->rx_buffer_size = agent->rx_buffer_size; connection->rx_buffer = apr_palloc(connection->pool,connection->rx_buffer_size+1); apt_text_stream_init(&connection->rx_stream,connection->rx_buffer,connection->rx_buffer_size); if(apt_log_masking_get() != APT_LOG_MASKING_NONE) { connection->verbose = FALSE; mrcp_parser_verbose_set(connection->parser,TRUE); mrcp_generator_verbose_set(connection->generator,TRUE); } return connection; }
static apt_bool_t mpf_rtp_stream_local_media_create(mpf_rtp_stream_t *rtp_stream, mpf_rtp_media_descriptor_t *local_media, mpf_rtp_media_descriptor_t *remote_media, mpf_stream_capabilities_t *capabilities) { apt_bool_t status = TRUE; if(!local_media) { /* local media is not specified, create the default one */ local_media = apr_palloc(rtp_stream->pool,sizeof(mpf_rtp_media_descriptor_t)); mpf_rtp_media_descriptor_init(local_media); local_media->state = MPF_MEDIA_ENABLED; local_media->direction = STREAM_DIRECTION_DUPLEX; } if(remote_media) { local_media->id = remote_media->id; } if(local_media->ip.length == 0) { local_media->ip = rtp_stream->config->ip; local_media->ext_ip = rtp_stream->config->ext_ip; } if(local_media->port == 0) { /* RTP port management */ mpf_rtp_config_t *rtp_config = rtp_stream->config; apr_port_t first_port_in_search = rtp_config->rtp_port_cur; apt_bool_t is_port_ok = FALSE; do { local_media->port = rtp_config->rtp_port_cur; rtp_config->rtp_port_cur += 2; if(rtp_config->rtp_port_cur == rtp_config->rtp_port_max) { rtp_config->rtp_port_cur = rtp_config->rtp_port_min; } if(mpf_rtp_socket_pair_create(rtp_stream,local_media) == TRUE) { is_port_ok = TRUE; } } while((is_port_ok == FALSE) && (first_port_in_search != rtp_config->rtp_port_cur)); if(is_port_ok == FALSE) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Find Free RTP Port %s:[%hu,%hu]", rtp_config->ip.buf, rtp_config->rtp_port_min, rtp_config->rtp_port_max); local_media->state = MPF_MEDIA_DISABLED; status = FALSE; } } else if(mpf_rtp_socket_pair_create(rtp_stream,local_media) == FALSE) { local_media->state = MPF_MEDIA_DISABLED; status = FALSE; } if(rtp_stream->settings->ptime) { local_media->ptime = rtp_stream->settings->ptime; } if(mpf_codec_list_is_empty(&local_media->codec_list) == TRUE) { if(mpf_codec_list_is_empty(&rtp_stream->settings->codec_list) == TRUE) { mpf_codec_manager_codec_list_get( rtp_stream->base->termination->codec_manager, &local_media->codec_list, rtp_stream->pool); } else { mpf_codec_list_copy(&local_media->codec_list, &rtp_stream->settings->codec_list, rtp_stream->pool); } if(capabilities) { mpf_codec_list_modify(&local_media->codec_list,&capabilities->codecs); } } rtp_stream->local_media = local_media; return status; }
/** Destroy connection agent. */ MRCP_DECLARE(apt_bool_t) mrcp_client_connection_agent_destroy(mrcp_connection_agent_t *agent) { apt_log(APT_LOG_MARK,APT_PRIO_NOTICE,"Destroy MRCPv2 Agent [%s]", mrcp_client_connection_agent_id_get(agent)); return apt_poller_task_destroy(agent->task); }
/* Accept RTSP connection */ static apt_bool_t rtsp_server_connection_accept(rtsp_server_t *server) { rtsp_server_connection_t *rtsp_connection; char *local_ip = NULL; char *remote_ip = NULL; apr_sockaddr_t *l_sockaddr = NULL; apr_sockaddr_t *r_sockaddr = NULL; apt_pollset_t *pollset = apt_poller_task_pollset_get(server->task); apr_pool_t *pool = apt_pool_create(); if(!pool) { return FALSE; } rtsp_connection = apr_palloc(pool,sizeof(rtsp_server_connection_t)); rtsp_connection->pool = pool; rtsp_connection->sock = NULL; rtsp_connection->client_ip = NULL; if(apr_socket_accept(&rtsp_connection->sock,server->listen_sock,rtsp_connection->pool) != APR_SUCCESS) { apr_pool_destroy(pool); return FALSE; } if(apr_socket_addr_get(&l_sockaddr,APR_LOCAL,rtsp_connection->sock) != APR_SUCCESS || apr_socket_addr_get(&r_sockaddr,APR_REMOTE,rtsp_connection->sock) != APR_SUCCESS) { apr_pool_destroy(pool); return FALSE; } apr_sockaddr_ip_get(&local_ip,l_sockaddr); apr_sockaddr_ip_get(&remote_ip,r_sockaddr); rtsp_connection->client_ip = remote_ip; rtsp_connection->id = apr_psprintf(pool,"%s:%hu <-> %s:%hu", local_ip,l_sockaddr->port, remote_ip,r_sockaddr->port); memset(&rtsp_connection->sock_pfd,0,sizeof(apr_pollfd_t)); rtsp_connection->sock_pfd.desc_type = APR_POLL_SOCKET; rtsp_connection->sock_pfd.reqevents = APR_POLLIN; rtsp_connection->sock_pfd.desc.s = rtsp_connection->sock; rtsp_connection->sock_pfd.client_data = rtsp_connection; if(apt_pollset_add(pollset,&rtsp_connection->sock_pfd) != TRUE) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Add to Pollset %s",rtsp_connection->id); apr_socket_close(rtsp_connection->sock); apr_pool_destroy(pool); return FALSE; } apt_log(APT_LOG_MARK,APT_PRIO_NOTICE,"Accepted TCP Connection %s",rtsp_connection->id); rtsp_connection->session_table = apr_hash_make(rtsp_connection->pool); apt_text_stream_init(&rtsp_connection->rx_stream,rtsp_connection->rx_buffer,sizeof(rtsp_connection->rx_buffer)-1); apt_text_stream_init(&rtsp_connection->tx_stream,rtsp_connection->tx_buffer,sizeof(rtsp_connection->tx_buffer)-1); rtsp_connection->parser = rtsp_parser_create(rtsp_connection->pool); rtsp_connection->generator = rtsp_generator_create(rtsp_connection->pool); if(!server->connection_list) { server->connection_list = apt_list_create(server->sub_pool); } rtsp_connection->server = server; rtsp_connection->it = apt_list_push_back(server->connection_list,rtsp_connection,rtsp_connection->pool); return TRUE; }
/** Destroy RTSP connection */ static void rtsp_server_connection_destroy(rtsp_server_connection_t *rtsp_connection) { apt_log(APT_LOG_MARK,APT_PRIO_NOTICE,"Destroy RTSP Connection %s",rtsp_connection->id); apr_pool_destroy(rtsp_connection->pool); }
/** Destroy RTSP server */ RTSP_DECLARE(apt_bool_t) rtsp_server_destroy(rtsp_server_t *server) { apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Destroy RTSP Server"); return apt_poller_task_destroy(server->task); }
/** Destroy connection agent. */ MRCP_DECLARE(apt_bool_t) mrcp_server_connection_agent_destroy(mrcp_connection_agent_t *agent) { apt_log(APT_LOG_MARK,APT_PRIO_NOTICE,"Destroy MRCPv2 Agent"); return apt_task_destroy(agent->task); }