static apt_bool_t mpf_rtp_stream_local_media_update(mpf_rtp_stream_t *rtp_stream, mpf_rtp_media_descriptor_t *media, mpf_stream_capabilities_t *capabilities) { apt_bool_t status = TRUE; if(apt_string_compare(&rtp_stream->local_media->ip,&media->ip) == FALSE || rtp_stream->local_media->port != media->port) { mpf_rtp_socket_pair_close(rtp_stream); if(mpf_rtp_socket_pair_create(rtp_stream,media,TRUE) == FALSE) { media->state = MPF_MEDIA_DISABLED; status = FALSE; } } if(mpf_codec_list_is_empty(&media->codec_list) == TRUE) { mpf_codec_manager_codec_list_get( rtp_stream->base->termination->codec_manager, &media->codec_list, rtp_stream->pool); } if(capabilities) { if(mpf_codec_list_match(&media->codec_list,&capabilities->codecs) == FALSE) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Match Codec List %s:%hu", media->ip.buf, media->port); media->state = MPF_MEDIA_DISABLED; status = FALSE; } } rtp_stream->local_media = media; return status; }
static apt_bool_t mpf_rtp_stream_local_media_update(mpf_rtp_stream_t *rtp_stream, mpf_rtp_media_descriptor_t *media, mpf_stream_capabilities_t *capabilities) { apt_bool_t status = TRUE; if(apt_string_compare(&rtp_stream->local_media->ip,&media->ip) == FALSE || rtp_stream->local_media->port != media->port) { if(mpf_rtp_socket_pair_create(rtp_stream,media) == FALSE) { media->state = MPF_MEDIA_DISABLED; status = FALSE; } } if(mpf_codec_list_is_empty(&media->codec_list) == TRUE) { mpf_codec_manager_codec_list_get( rtp_stream->base->termination->codec_manager, &media->codec_list, rtp_stream->pool); if(capabilities) { mpf_codec_list_modify(&media->codec_list,&capabilities->codecs); } } rtp_stream->local_media = media; return status; }
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 = mpf_rtp_media_descriptor_alloc(rtp_stream->pool); 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) { if(mpf_rtp_socket_pair_create(rtp_stream,local_media,FALSE) == TRUE) { /* 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_bind(rtp_stream,local_media) == TRUE) { is_port_ok = TRUE; break; } } while(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); mpf_rtp_socket_pair_close(rtp_stream); status = FALSE; } } else { status = FALSE; } } else if(mpf_rtp_socket_pair_create(rtp_stream,local_media,TRUE) == FALSE) { status = FALSE; } if(status == FALSE) { local_media->state = MPF_MEDIA_DISABLED; } 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) { if(mpf_codec_list_match(&local_media->codec_list,&capabilities->codecs) == FALSE) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Match Codec List %s:%hu", local_media->ip.buf, local_media->port); local_media->state = MPF_MEDIA_DISABLED; status = FALSE; } } rtp_stream->local_media = local_media; return status; }
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) { mpf_timer_set(rtp_stream->rtcp_tx_timer,rtp_stream->config->rtcp_tx_interval); } if(rtp_stream->rtcp_rx_timer) { mpf_timer_set(rtp_stream->rtcp_rx_timer,rtp_stream->config->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) { mpf_timer_kill(rtp_stream->rtcp_tx_timer); } if(rtp_stream->rtcp_rx_timer) { mpf_timer_kill(rtp_stream->rtcp_rx_timer); } if(rtp_stream->config->rtcp == TRUE && rtp_stream->config->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->config->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; }