Пример #1
0
void linphone_call_init_media_streams(LinphoneCall *call){
	LinphoneCore *lc=call->core;
	SalMediaDescription *md=call->localdesc;
	AudioStream *audiostream;
	
	call->audiostream=audiostream=audio_stream_new(md->streams[0].port,linphone_core_ipv6_enabled(lc));
	if (linphone_core_echo_limiter_enabled(lc)){
		const char *type=lp_config_get_string(lc->config,"sound","el_type","mic");
		if (strcasecmp(type,"mic")==0)
			audio_stream_enable_echo_limiter(audiostream,ELControlMic);
		else if (strcasecmp(type,"full")==0)
			audio_stream_enable_echo_limiter(audiostream,ELControlFull);
	}
	audio_stream_enable_gain_control(audiostream,TRUE);
	if (linphone_core_echo_cancellation_enabled(lc)){
		int len,delay,framesize;
		const char *statestr=lp_config_get_string(lc->config,"sound","ec_state",NULL);
		len=lp_config_get_int(lc->config,"sound","ec_tail_len",0);
		delay=lp_config_get_int(lc->config,"sound","ec_delay",0);
		framesize=lp_config_get_int(lc->config,"sound","ec_framesize",0);
		audio_stream_set_echo_canceller_params(audiostream,len,delay,framesize);
		if (statestr && audiostream->ec){
			ms_filter_call_method(audiostream->ec,MS_ECHO_CANCELLER_SET_STATE_STRING,(void*)statestr);
		}
	}
	audio_stream_enable_automatic_gain_control(audiostream,linphone_core_agc_enabled(lc));
	{
		int enabled=lp_config_get_int(lc->config,"sound","noisegate",0);
		audio_stream_enable_noise_gate(audiostream,enabled);
	}
	
	if (lc->a_rtp)
		rtp_session_set_transports(audiostream->session,lc->a_rtp,lc->a_rtcp);

	call->audiostream_app_evq = ortp_ev_queue_new();
	rtp_session_register_event_queue(audiostream->session,call->audiostream_app_evq);

#ifdef VIDEO_ENABLED

	if ((lc->video_conf.display || lc->video_conf.capture) && md->streams[1].port>0){
		call->videostream=video_stream_new(md->streams[1].port,linphone_core_ipv6_enabled(lc));
	if( lc->video_conf.displaytype != NULL)
		video_stream_set_display_filter_name(call->videostream,lc->video_conf.displaytype);
	video_stream_set_event_callback(call->videostream,video_stream_event_cb, call);
	if (lc->v_rtp)
		rtp_session_set_transports(call->videostream->session,lc->v_rtp,lc->v_rtcp);
	call->videostream_app_evq = ortp_ev_queue_new();
	rtp_session_register_event_queue(call->videostream->session,call->videostream_app_evq);
#ifdef TEST_EXT_RENDERER
		video_stream_set_render_callback(call->videostream,rendercb,NULL);
#endif
	}
#else
	call->videostream=NULL;
#endif
}
Пример #2
0
static UDT_transport *UDT_transport_connecting(RtpSession *session)
{
	RtpTransport * rtp_transport = NULL;
	libudt_init_check();

	UDT_transport *udt = UDT_transport_new();
	UDT_transport_set_rtp_session(udt,session);
	if(UDT_transport_connect(udt) < 0)
	{
		UDT_transport_disconnect(udt);
		ms_message("Can't start udt transport !!");
		udt =NULL;
		return NULL;
	}
	else
	{
		rtp_transport = UDT_create_rtp_transport(udt);

		if(rtp_transport){
			rtp_session_set_transports(session,rtp_transport,NULL);
			ms_message("enable mediastreamer2 udt transport !!");

			udt->run = TRUE;
			ms_thread_create(&udt->monitor_thread,NULL,&monitor,udt);
		}
		return udt;
	}
}
Пример #3
0
static OrtpZrtpContext* ortp_zrtp_configure_context(OrtpZrtpContext *userData, RtpSession *s, OrtpZrtpParams *params) {
	ZrtpContext *context=userData->zrtpContext;


	if (s->rtp.tr || s->rtcp.tr)
		ortp_warning("Overwriting rtp or rtcp transport with ZRTP one");

	userData->rtpt.data=context;
	userData->rtpt.t_getsocket=ozrtp_rtp_getsocket;
	userData->rtpt.t_sendto=ozrtp_rtp_sendto;
	userData->rtpt.t_recvfrom=ozrtp_rtp_recvfrom;

	userData->rtcpt.data=context;
	userData->rtcpt.t_getsocket=ozrtp_rtcp_getsocket;
	userData->rtcpt.t_sendto=ozrtp_rtcp_sendto;
	userData->rtcpt.t_recvfrom=ozrtp_rtcp_recvfrom;

	rtp_session_set_transports(s, &userData->rtpt, &userData->rtcpt);

	ortp_message("Starting ZRTP engine");
	zrtp_setEnrollmentMode(context,FALSE);//because it is uninitialized in zrtpcpp.
	
	zrtp_startZrtpEngine(context);

	return userData;
}
Пример #4
0
void ms_media_stream_sessions_uninit(MSMediaStreamSessions *sessions){
	if (sessions->srtp_session) {
		RtpTransport *rtptr=NULL,*rtcptr=NULL;
		ortp_srtp_dealloc(sessions->srtp_session);
		if (sessions->rtp_session){
			rtp_session_get_transports(sessions->rtp_session,&rtptr,&rtcptr);
			rtp_session_set_transports(sessions->rtp_session,NULL,NULL);
			if (rtptr) srtp_transport_destroy(rtptr);
			if (rtcptr) srtp_transport_destroy(rtcptr);
		}
		sessions->srtp_session=NULL;
	}
	if (sessions->rtp_session) {
		rtp_session_destroy(sessions->rtp_session);
		sessions->rtp_session=NULL;
	}
	if (sessions->zrtp_context != NULL) {
		ortp_zrtp_context_destroy(sessions->zrtp_context);
		sessions->zrtp_context = NULL;
	}
	if (sessions->ticker){
		ms_ticker_destroy(sessions->ticker);
		sessions->ticker=NULL;
	}
}
Пример #5
0
bool_t video_stream_enable_strp(VideoStream* stream, enum ortp_srtp_crypto_suite_t suite, const char* snd_key, const char* rcv_key) {
	// assign new srtp transport to stream->session
	// with 2 Master Keys
	RtpTransport *rtp_tpt, *rtcp_tpt;	
	
	if (!ortp_srtp_supported()) {
		ms_error("ortp srtp support not enabled");
		return FALSE;
	}
	
	ms_message("%s: stream=%p key='%s' key='%s'", __FUNCTION__,
		stream, snd_key, rcv_key);
	 
	stream->srtp_session = ortp_srtp_create_configure_session(suite, 
		rtp_session_get_send_ssrc(stream->session), 
		snd_key,
		rcv_key); 
	
	if (!stream->srtp_session) {
		return FALSE;
	}
	
	// TODO: check who will free rtp_tpt ?
	srtp_transport_new(stream->srtp_session, &rtp_tpt, &rtcp_tpt);
	
	rtp_session_set_transports(stream->session, rtp_tpt, rtcp_tpt);
	
	return TRUE;
}
Пример #6
0
static int check_srtp_session_created(MediaStream *stream){
	if (stream->sessions.srtp_session==NULL){
		err_status_t err;
		srtp_t session;
		RtpTransport *rtp=NULL,*rtcp=NULL;

		err = ortp_srtp_create(&session, NULL);
		if (err != 0) {
			ms_error("Failed to create srtp session (%d)", err);
			return -1;
		}
		stream->sessions.srtp_session=session;
		srtp_transport_new(session,&rtp,&rtcp);
		rtp_session_set_transports(stream->sessions.rtp_session,rtp,rtcp);
		stream->sessions.is_secured=TRUE;
	}
	return 0;
}