MPF_DECLARE(apt_bool_t) mpf_rtp_stream_remove(mpf_audio_stream_t *stream) { mpf_rtp_stream_t *rtp_stream = stream->obj; if(rtp_stream->state == MPF_MEDIA_ENABLED) { /* disable RTP/RTCP session */ rtp_stream->state = MPF_MEDIA_DISABLED; if(rtp_stream->rtp_l_sockaddr) { apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Remove 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); } } mpf_rtp_socket_pair_close(rtp_stream); return TRUE; }
static apt_bool_t mrcp_client_message_handler(mrcp_connection_t *connection, mrcp_message_t *message, apt_message_status_e status) { if(status == APT_MESSAGE_STATUS_COMPLETE) { /* message is completely parsed */ mrcp_control_channel_t *channel; apt_str_t identifier; apt_id_resource_generate(&message->channel_id.session_id,&message->channel_id.resource_name,'@',&identifier,message->pool); channel = mrcp_connection_channel_find(connection,&identifier); if(channel) { mrcp_connection_agent_t *agent = connection->agent; if(message->start_line.message_type == MRCP_MESSAGE_TYPE_RESPONSE) { if(!channel->active_request || channel->active_request->start_line.request_id != message->start_line.request_id) { apt_obj_log(APT_LOG_MARK,APT_PRIO_WARNING,channel->log_obj,"Unexpected MRCP Response "APT_SIDRES_FMT" [%d]", MRCP_MESSAGE_SIDRES(message), message->start_line.request_id); return FALSE; } if(channel->request_timer) { apt_timer_kill(channel->request_timer); } channel->active_request = NULL; } mrcp_connection_message_receive(agent->vtable,channel,message); } else { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Find Channel "APT_SIDRES_FMT" in Connection %s [%d]", MRCP_MESSAGE_SIDRES(message), connection->id, apr_hash_count(connection->channel_table)); } } return TRUE; }
static apt_bool_t rtsp_client_request_pop(rtsp_client_connection_t *rtsp_connection, rtsp_message_t *response, rtsp_message_t **ret_request, rtsp_client_session_t **ret_session) { rtsp_client_session_t *session; apt_list_elem_t *elem = apt_list_first_elem_get(rtsp_connection->inprogress_request_queue); while(elem) { session = apt_list_elem_object_get(elem); if(session->active_request && session->active_request->header.cseq == response->header.cseq) { if(ret_session) { *ret_session = session; } if(ret_request) { *ret_request = session->active_request; } apt_log(RTSP_LOG_MARK,APT_PRIO_INFO,"Pop In-Progress RTSP Request " APT_PTR_FMT " CSeq:%"APR_SIZE_T_FMT, session, response->header.cseq); apt_list_elem_remove(rtsp_connection->inprogress_request_queue,elem); session->active_request = NULL; apt_timer_kill(session->request_timer); return TRUE; } elem = apt_list_next_elem_get(rtsp_connection->inprogress_request_queue,elem); } return FALSE; }
/* RTSP connection disconnected */ static apt_bool_t rtsp_client_on_disconnect(rtsp_client_t *client, rtsp_client_connection_t *rtsp_connection) { rtsp_client_session_t *session; apr_size_t remaining_handles; apt_log(RTSP_LOG_MARK,APT_PRIO_INFO,"RTSP Peer Disconnected %s", rtsp_connection->id); rtsp_client_connection_close(client,rtsp_connection); /* Cancel in-progreess requests */ do { session = apt_list_pop_front(rtsp_connection->inprogress_request_queue); if(session) { if(rtsp_client_request_cancel( client, session, RTSP_STATUS_CODE_INTERNAL_SERVER_ERROR, RTSP_REASON_PHRASE_INTERNAL_SERVER_ERROR) == TRUE) { apt_timer_kill(session->request_timer); } } } while(session); /* Walk through RTSP handles and raise termination event for them */ remaining_handles = apr_hash_count(rtsp_connection->handle_table); if(remaining_handles) { void *val; apr_hash_index_t *it; apt_log(RTSP_LOG_MARK,APT_PRIO_NOTICE,"Terminate Remaining RTSP Handles [%"APR_SIZE_T_FMT"]",remaining_handles); it = apr_hash_first(rtsp_connection->pool,rtsp_connection->session_table); for(; it; it = apr_hash_next(it)) { apr_hash_this(it,NULL,NULL,&val); session = val; if(session) { rtsp_client_session_terminate_raise(client,session); } } } return TRUE; }
static apt_bool_t mrcp_client_agent_disconnect_raise(mrcp_connection_agent_t *agent, mrcp_connection_t *connection) { mrcp_control_channel_t *channel; void *val; apr_hash_index_t *it = apr_hash_first(connection->pool,connection->channel_table); /* walk through the list of channels and raise disconnect event for them */ for(; it; it = apr_hash_next(it)) { apr_hash_this(it,NULL,NULL,&val); channel = val; if(!channel) continue; if(channel->active_request) { mrcp_client_agent_request_cancel(channel->agent,channel,channel->active_request); channel->active_request = NULL; if(channel->request_timer) { apt_timer_kill(channel->request_timer); } } else if(agent->vtable->on_disconnect){ agent->vtable->on_disconnect(channel); } } return TRUE; }
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); if(remote_media->state == MPF_MEDIA_ENABLED) { mpf_codec_list_t *codec_list1 = NULL; mpf_codec_list_t *codec_list2 = NULL; /* intersect local and remote codecs */ if(rtp_stream->settings->own_preferrence == TRUE) { codec_list1 = &local_media->codec_list; codec_list2 = &remote_media->codec_list; } else { codec_list2 = &local_media->codec_list; codec_list1 = &remote_media->codec_list; } if(mpf_codec_lists_intersect(codec_list1,codec_list2) == FALSE) { /* reject RTP/RTCP session */ rtp_stream->state = MPF_MEDIA_DISABLED; local_media->direction = STREAM_DIRECTION_NONE; local_media->state = MPF_MEDIA_DISABLED; if(rtp_stream->rtp_l_sockaddr) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Reject RTP Session %s:%hu no codecs matched", 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); } } } rtp_stream->base->direction = local_media->direction; return TRUE; }
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; }