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; }