mediastream.h 19 KB
Newer Older
aymeric's avatar
aymeric committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/*
mediastreamer2 library - modular sound and video processing and streaming
Copyright (C) 2006  Simon MORLAT (simon.morlat@linphone.org)

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/


#ifndef MEDIASTREAM_H
#define MEDIASTREAM_H

Simon Morlat's avatar
Simon Morlat committed
24 25 26 27 28
#include <mediastreamer2/msfilter.h>
#include <mediastreamer2/msticker.h>
#include <mediastreamer2/mssndcard.h>
#include <mediastreamer2/mswebcam.h>
#include <mediastreamer2/msvideo.h>
29 30
#include <mediastreamer2/bitratecontrol.h>
#include <mediastreamer2/qualityindicator.h>
31
#include <mediastreamer2/ice.h>
Simon Morlat's avatar
Simon Morlat committed
32 33
#include <ortp/ortp.h>
#include <ortp/event.h>
Guillaume Beraudo's avatar
Guillaume Beraudo committed
34
#include <ortp/zrtp.h>
35
#include <ortp/ortp_srtp.h>
36

37
#include <ortp/zrtp.h>
aymeric's avatar
aymeric committed
38

Ghislain MARY's avatar
Ghislain MARY committed
39

Simon Morlat's avatar
Simon Morlat committed
40 41 42
#define PAYLOAD_TYPE_FLAG_CAN_RECV	PAYLOAD_TYPE_USER_FLAG_1
#define PAYLOAD_TYPE_FLAG_CAN_SEND	PAYLOAD_TYPE_USER_FLAG_2

Ghislain MARY's avatar
Ghislain MARY committed
43 44 45 46 47

#ifdef __cplusplus
extern "C" {
#endif

48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
/**
 * @addtogroup ring_api
 * @{
**/

struct _RingStream
{
	MSTicker *ticker;
	MSFilter *source;
	MSFilter *gendtmf;
	MSFilter *write_resampler;
	MSFilter *sndwrite;
};

typedef struct _RingStream RingStream;

MS2_PUBLIC RingStream *ring_start (const char * file, int interval, MSSndCard *sndcard);
MS2_PUBLIC RingStream *ring_start_with_cb(const char * file, int interval, MSSndCard *sndcard, MSFilterNotifyFunc func, void * user_data);
MS2_PUBLIC void ring_stop (RingStream * stream);

/**
 * @}
**/


Ghislain MARY's avatar
Ghislain MARY committed
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
typedef enum StreamType {
	AudioStreamType,
	VideoStreamType
} StreamType;

struct _MediaStream {
	StreamType type;
	MSTicker *ticker;
	RtpSession *session;
	OrtpEvQueue *evq;
	MSFilter *rtprecv;
	MSFilter *rtpsend;
	MSFilter *encoder;
	MSFilter *decoder;
	MSFilter *voidsink;
	MSBitrateController *rc;
	IceCheckList *ice_check_list;
	OrtpZrtpContext *zrtp_context;
	srtp_t srtp_session;
	bool_t use_rc;
};

typedef struct _MediaStream MediaStream;

97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
MS2_PUBLIC void media_stream_set_rtcp_information(MediaStream *stream, const char *cname, const char *tool);

MS2_PUBLIC void media_stream_get_local_rtp_stats(MediaStream *stream, rtp_stats_t *stats);

MS2_PUBLIC int media_stream_set_dscp(MediaStream *stream, int dscp);

MS2_PUBLIC void media_stream_enable_adaptive_bitrate_control(MediaStream *stream, bool_t enabled);

MS2_PUBLIC void media_stream_enable_adaptive_jittcomp(MediaStream *stream, bool_t enabled);

MS2_PUBLIC bool_t media_stream_enable_srtp(MediaStream* stream, enum ortp_srtp_crypto_suite_t suite, const char* snd_key, const char* rcv_key);


/**
 * @addtogroup audio_stream_api
 * @{
**/

115 116 117
typedef enum EchoLimiterType{
	ELInactive,
	ELControlMic,
118
	ELControlFull
119 120
} EchoLimiterType;

aymeric's avatar
aymeric committed
121 122
struct _AudioStream
{
Ghislain MARY's avatar
Ghislain MARY committed
123
	MediaStream ms;
aymeric's avatar
aymeric committed
124 125 126
	MSFilter *soundread;
	MSFilter *soundwrite;
	MSFilter *dtmfgen;
127
	MSFilter *dtmfgen_rtp;
Yann Diorcet's avatar
Yann Diorcet committed
128
	MSFilter *plc;
aymeric's avatar
aymeric committed
129
	MSFilter *ec;/*echo canceler*/
130
	MSFilter *volsend,*volrecv; /*MSVolumes*/
131 132
	MSFilter *read_resampler;
	MSFilter *write_resampler;
smorlat's avatar
smorlat committed
133
	MSFilter *equalizer;
Simon Morlat's avatar
Simon Morlat committed
134
	MSFilter *dummy;
135 136 137 138 139
	MSFilter *send_tee;
	MSFilter *recv_tee;
	MSFilter *recorder_mixer;
	MSFilter *recorder;
	char *recorder_file;
aymeric's avatar
aymeric committed
140
	uint64_t last_packet_count;
aymeric's avatar
aymeric committed
141
	time_t last_packet_time;
142
	EchoLimiterType el_type; /*use echo limiter: two MSVolume, measured input level controlling local output level*/
143
	MSQualityIndicator *qi;
144
	time_t start_time;
145
	time_t last_iterate_time;
Ghislain MARY's avatar
Ghislain MARY committed
146
	uint32_t features;
smorlat's avatar
smorlat committed
147
	bool_t play_dtmfs;
smorlat's avatar
smorlat committed
148
	bool_t use_gc;
149
	bool_t use_agc;
smorlat's avatar
smorlat committed
150
	bool_t eq_active;
151
	bool_t use_ng;/*noise gate*/
152
	bool_t is_beginning;
153
	bool_t is_ec_delay_set;
aymeric's avatar
aymeric committed
154 155
};

156 157 158
/**
 * The AudioStream holds all resources to create and run typical VoIP audiostream.
**/
aymeric's avatar
aymeric committed
159 160 161 162
typedef struct _AudioStream AudioStream;


/* start a thread that does sampling->encoding->rtp_sending|rtp_receiving->decoding->playing */
Simon Morlat's avatar
Simon Morlat committed
163
MS2_PUBLIC AudioStream *audio_stream_start (RtpProfile * prof, int locport, const char *remip,
aymeric's avatar
aymeric committed
164 165
				 int remport, int payload_type, int jitt_comp, bool_t echo_cancel);

Simon Morlat's avatar
Simon Morlat committed
166
MS2_PUBLIC AudioStream *audio_stream_start_with_sndcards(RtpProfile * prof, int locport, const char *remip4, int remport, int payload_type, int jitt_comp, MSSndCard *playcard, MSSndCard *captcard, bool_t echocancel);
aymeric's avatar
aymeric committed
167

168

Simon Morlat's avatar
Simon Morlat committed
169
MS2_PUBLIC int audio_stream_start_with_files (AudioStream * stream, RtpProfile * prof,
aymeric's avatar
aymeric committed
170 171 172 173
					    const char *remip, int remport, int rem_rtcp_port,
					    int pt, int jitt_comp,
					    const char * infile,  const char * outfile);

174 175 176 177 178 179 180 181 182
/**
 * Starts an audio stream from/to local wav files or soundcards.
 * 
 * This method starts the processing of the audio stream, that is playing from wav file or soundcard, voice processing, encoding,
 * sending through RTP, receiving from RTP, decoding, voice processing and wav file recording or soundcard playback.
 * 
 * 
 * @param stream an AudioStream previously created with audio_stream_new().
 * @param prof a RtpProfile containing all PayloadType possible during the audio session.
183 184 185
 * @param rem_rtp_ip remote IP address where to send the encoded audio.
 * @param rem_rtp_port remote IP port where to send the encoded audio.
 * @param rem_rtcp_ip remote IP address for RTCP.
186 187 188 189 190 191 192 193 194 195
 * @param rem_rtcp_port remote port for RTCP.
 * @param payload_type payload type index to use for the sending stream. This index must point to a valid PayloadType in the RtpProfile.
 * @param jitt_comp Nominal jitter buffer size in milliseconds.
 * @param infile path to wav file to play out (can be NULL)
 * @param outfile path to wav file to record into (can be NULL)
 * @param playcard The soundcard to be used for playback (can be NULL)
 * @param captcard The soundcard to be used for catpure. (can be NULL)
 * @param echo_cancel whether echo cancellation is to be performed.
 * @returns 0 if sucessful, -1 otherwise.
**/
196 197
MS2_PUBLIC int audio_stream_start_full(AudioStream *stream, RtpProfile *profile, const char *rem_rtp_ip,int rem_rtp_port,
	const char *rem_rtcp_ip, int rem_rtcp_port, int payload,int jitt_comp, const char *infile, const char *outfile,
198 199
	MSSndCard *playcard, MSSndCard *captcard, bool_t use_ec);

200

Simon Morlat's avatar
Simon Morlat committed
201 202
MS2_PUBLIC void audio_stream_play(AudioStream *st, const char *name);
MS2_PUBLIC void audio_stream_record(AudioStream *st, const char *name);
aymeric's avatar
aymeric committed
203

204
static inline void audio_stream_set_rtcp_information(AudioStream *st, const char *cname, const char *tool) {
Ghislain MARY's avatar
Ghislain MARY committed
205 206
	media_stream_set_rtcp_information(&st->ms, cname, tool);
}
aymeric's avatar
aymeric committed
207

Simon Morlat's avatar
Simon Morlat committed
208
MS2_PUBLIC void audio_stream_play_received_dtmfs(AudioStream *st, bool_t yesno);
smorlat's avatar
smorlat committed
209

210 211
/**
 * Creates an AudioStream object listening on a RTP port.
212 213
 * @param loc_rtp_port the local UDP port to listen for RTP packets.
 * @param loc_rtcp_port the local UDP port to listen for RTCP packets
214 215 216
 * @param ipv6 TRUE if ipv6 must be used.
 * @returns a new AudioStream.
**/
217
MS2_PUBLIC AudioStream *audio_stream_new(int loc_rtp_port, int loc_rtcp_port, bool_t ipv6);
Simon Morlat's avatar
Simon Morlat committed
218

219 220 221 222 223 224 225 226 227
#define AUDIO_STREAM_FEATURE_PLC 		(1 << 0)
#define AUDIO_STREAM_FEATURE_EC 		(1 << 1)
#define AUDIO_STREAM_FEATURE_EQUALIZER		(1 << 2)
#define AUDIO_STREAM_FEATURE_VOL_SND 		(1 << 3)
#define AUDIO_STREAM_FEATURE_VOL_RCV 		(1 << 4)
#define AUDIO_STREAM_FEATURE_DTMF		(1 << 5)
#define AUDIO_STREAM_FEATURE_DTMF_ECHO		(1 << 6)
#define AUDIO_STREAM_FEATURE_MIXED_RECORDING	(1 << 7)

Yann Diorcet's avatar
Yann Diorcet committed
228 229 230 231 232 233 234
#define AUDIO_STREAM_FEATURE_ALL	(\
					AUDIO_STREAM_FEATURE_PLC | \
					AUDIO_STREAM_FEATURE_EC | \
					AUDIO_STREAM_FEATURE_EQUALIZER | \
					AUDIO_STREAM_FEATURE_VOL_SND | \
					AUDIO_STREAM_FEATURE_VOL_RCV | \
					AUDIO_STREAM_FEATURE_DTMF | \
235 236
					AUDIO_STREAM_FEATURE_DTMF_ECHO |\
					AUDIO_STREAM_FEATURE_MIXED_RECORDING \
Yann Diorcet's avatar
Yann Diorcet committed
237 238
					)

239

Yann Diorcet's avatar
Yann Diorcet committed
240 241
MS2_PUBLIC uint32_t audio_stream_get_features(AudioStream *st);
MS2_PUBLIC void audio_stream_set_features(AudioStream *st, uint32_t features);
Simon Morlat's avatar
Simon Morlat committed
242 243 244 245
	
MS2_PUBLIC void audio_stream_prepare_sound(AudioStream *st, MSSndCard *playcard, MSSndCard *captcard);
MS2_PUBLIC void audio_stream_unprepare_sound(AudioStream *st);
MS2_PUBLIC bool_t audio_stream_started(AudioStream *stream);
246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262
/**
 * Starts an audio stream from local soundcards.
 * 
 * This method starts the processing of the audio stream, that is capture from soundcard, voice processing, encoding,
 * sending through RTP, receiving from RTP, decoding, voice processing and soundcard playback.
 * 
 * @param stream an AudioStream previously created with audio_stream_new().
 * @param prof a RtpProfile containing all PayloadType possible during the audio session.
 * @param remip remote IP address where to send the encoded audio.
 * @param remport remote IP port where to send the encoded audio
 * @param rem_rtcp_port remote port for RTCP.
 * @param payload_type payload type index to use for the sending stream. This index must point to a valid PayloadType in the RtpProfile.
 * @param jitt_comp Nominal jitter buffer size in milliseconds.
 * @param playcard The soundcard to be used for playback
 * @param captcard The soundcard to be used for catpure.
 * @param echo_cancel whether echo cancellation is to be performed.
**/
Simon Morlat's avatar
Simon Morlat committed
263 264
MS2_PUBLIC int audio_stream_start_now(AudioStream * stream, RtpProfile * prof,  const char *remip, int remport, int rem_rtcp_port, int payload_type, int jitt_comp,MSSndCard *playcard, MSSndCard *captcard, bool_t echo_cancel);
MS2_PUBLIC void audio_stream_set_relay_session_id(AudioStream *stream, const char *relay_session_id);
aymeric's avatar
aymeric committed
265
/*returns true if we are still receiving some data from remote end in the last timeout seconds*/
Simon Morlat's avatar
Simon Morlat committed
266
MS2_PUBLIC bool_t audio_stream_alive(AudioStream * stream, int timeout);
aymeric's avatar
aymeric committed
267

268 269 270 271
/**
 * Executes background low priority tasks related to audio processing (RTP statistics analysis).
 * It should be called periodically, for example with an interval of 100 ms or so.
 */
272 273
MS2_PUBLIC void audio_stream_iterate(AudioStream *stream);

smorlat's avatar
smorlat committed
274
/*enable echo-limiter dispositve: one MSVolume in input branch controls a MSVolume in the output branch*/
Simon Morlat's avatar
Simon Morlat committed
275
MS2_PUBLIC void audio_stream_enable_echo_limiter(AudioStream *stream, EchoLimiterType type);
276

smorlat's avatar
smorlat committed
277
/*enable gain control, to be done before start() */
Simon Morlat's avatar
Simon Morlat committed
278
MS2_PUBLIC void audio_stream_enable_gain_control(AudioStream *stream, bool_t val);
smorlat's avatar
smorlat committed
279

280
/*enable automatic gain control, to be done before start() */
Simon Morlat's avatar
Simon Morlat committed
281
MS2_PUBLIC void audio_stream_enable_automatic_gain_control(AudioStream *stream, bool_t val);
282

283
/*to be done before start */
Simon Morlat's avatar
Simon Morlat committed
284
MS2_PUBLIC void audio_stream_set_echo_canceller_params(AudioStream *st, int tail_len_ms, int delay_ms, int framesize);
285

286
/*enable adaptive rate control */
287
static inline void audio_stream_enable_adaptive_bitrate_control(AudioStream *stream, bool_t enabled) {
Ghislain MARY's avatar
Ghislain MARY committed
288 289
	media_stream_enable_adaptive_bitrate_control(&stream->ms, enabled);
}
290

291
/* Enable adaptive jitter compensation */
292
static inline void audio_stream_enable_adaptive_jittcomp(AudioStream *stream, bool_t enabled) {
Ghislain MARY's avatar
Ghislain MARY committed
293 294
	media_stream_enable_adaptive_jittcomp(&stream->ms, enabled);
}
295

Simon Morlat's avatar
Simon Morlat committed
296
MS2_PUBLIC void audio_stream_set_mic_gain(AudioStream *stream, float gain);
smorlat's avatar
smorlat committed
297

298
/* enable/disable rtp stream */
Simon Morlat's avatar
Simon Morlat committed
299
MS2_PUBLIC void audio_stream_mute_rtp(AudioStream *stream, bool_t val);
Simon Morlat's avatar
Simon Morlat committed
300

301
/*enable noise gate, must be done before start()*/
Simon Morlat's avatar
Simon Morlat committed
302
MS2_PUBLIC void audio_stream_enable_noise_gate(AudioStream *stream, bool_t val);
303

smorlat's avatar
smorlat committed
304
/*enable parametric equalizer in the stream that goes to the speaker*/
Simon Morlat's avatar
Simon Morlat committed
305
MS2_PUBLIC void audio_stream_enable_equalizer(AudioStream *stream, bool_t enabled);
smorlat's avatar
smorlat committed
306

Simon Morlat's avatar
Simon Morlat committed
307
MS2_PUBLIC void audio_stream_equalizer_set_gain(AudioStream *stream, int frequency, float gain, int freq_width);
smorlat's avatar
smorlat committed
308

smorlat's avatar
smorlat committed
309
/* stop the audio streaming thread and free everything*/
Simon Morlat's avatar
Simon Morlat committed
310
MS2_PUBLIC void audio_stream_stop (AudioStream * stream);
aymeric's avatar
aymeric committed
311 312

/* send a dtmf */
Simon Morlat's avatar
Simon Morlat committed
313
MS2_PUBLIC int audio_stream_send_dtmf (AudioStream * stream, char dtmf);
aymeric's avatar
aymeric committed
314

315 316 317 318 319 320
MS2_PUBLIC int audio_stream_mixed_record_open(AudioStream *st, const char*filename);

MS2_PUBLIC int audio_stream_mixed_record_start(AudioStream *st);

MS2_PUBLIC int audio_stream_mixed_record_stop(AudioStream *st);

Simon Morlat's avatar
Simon Morlat committed
321
MS2_PUBLIC void audio_stream_set_default_card(int cardindex);
aymeric's avatar
aymeric committed
322

Simon Morlat's avatar
Simon Morlat committed
323
/* retrieve RTP statistics*/
324
static inline void audio_stream_get_local_rtp_stats(AudioStream *stream, rtp_stats_t *stats) {
Ghislain MARY's avatar
Ghislain MARY committed
325 326
	media_stream_get_local_rtp_stats(&stream->ms, stats);
}
Simon Morlat's avatar
Simon Morlat committed
327

328
/* returns a realtime indicator of the stream quality between 0 and 5 */
329 330
MS2_PUBLIC float audio_stream_get_quality_rating(AudioStream *stream);

331 332
/* returns the quality rating as an average since the start of the streaming session.*/
MS2_PUBLIC float audio_stream_get_average_quality_rating(AudioStream *stream);
aymeric's avatar
aymeric committed
333

Guillaume Beraudo's avatar
Guillaume Beraudo committed
334 335 336
/* enable ZRTP on the audio stream */
MS2_PUBLIC void audio_stream_enable_zrtp(AudioStream *stream, OrtpZrtpParams *params);

337
/* enable SRTP on the audio stream */
338
static inline bool_t audio_stream_enable_srtp(AudioStream* stream, enum ortp_srtp_crypto_suite_t suite, const char* snd_key, const char* rcv_key) {
Ghislain MARY's avatar
Ghislain MARY committed
339 340
	return media_stream_enable_srtp(&stream->ms, suite, snd_key, rcv_key);
}
Guillaume Beraudo's avatar
Guillaume Beraudo committed
341

342
static inline int audio_stream_set_dscp(AudioStream *stream, int dscp) {
Ghislain MARY's avatar
Ghislain MARY committed
343 344
	return media_stream_set_dscp(&stream->ms, dscp);
}
Simon Morlat's avatar
Simon Morlat committed
345

346 347 348 349 350 351 352 353 354
/**
 * @}
**/


/**
 * @addtogroup video_stream_api
 * @{
**/
aymeric's avatar
aymeric committed
355

356
typedef void (*VideoStreamRenderCallback)(void *user_pointer, const MSPicture *local_view, const MSPicture *remote_view);
357 358 359
typedef void (*VideoStreamEventCallback)(void *user_pointer, const MSFilter *f, const unsigned int event_id, const void *args);


360 361 362 363 364 365
typedef enum _VideoStreamDir{
	VideoStreamSendRecv,
	VideoStreamSendOnly,
	VideoStreamRecvOnly
}VideoStreamDir;

aymeric's avatar
aymeric committed
366 367
struct _VideoStream
{
Ghislain MARY's avatar
Ghislain MARY committed
368
	MediaStream ms;
aymeric's avatar
aymeric committed
369 370
	MSFilter *source;
	MSFilter *pixconv;
371
	MSFilter *sizeconv;
aymeric's avatar
aymeric committed
372 373
	MSFilter *tee;
	MSFilter *output;
374 375
	MSFilter *tee2;
	MSFilter *jpegwriter;
376
	MSFilter *output2;
smorlat's avatar
smorlat committed
377
	MSVideoSize sent_vsize;
smorlat's avatar
smorlat committed
378
	int corner; /*for selfview*/
379 380
	VideoStreamRenderCallback rendercb;
	void *render_pointer;
381 382
	VideoStreamEventCallback eventcb;
	void *event_pointer;
383
	char *display_name;
384 385
	unsigned long window_id;
	unsigned long preview_window_id;
386
	VideoStreamDir dir;
387
	MSWebCam *cam;
388
	int device_orientation; /* warning: meaning of this variable depends on the platform (Android, iOS, ...) */
Ghislain MARY's avatar
Ghislain MARY committed
389 390
	bool_t use_preview_window;
	bool_t display_filter_auto_rotate_enabled;
391
	bool_t prepare_ongoing;
aymeric's avatar
aymeric committed
392 393 394
};

typedef struct _VideoStream VideoStream;
smorlat's avatar
smorlat committed
395

396

397
MS2_PUBLIC VideoStream *video_stream_new(int loc_rtp_port, int loc_rtcp_port, bool_t use_ipv6);
Simon Morlat's avatar
Simon Morlat committed
398
MS2_PUBLIC void video_stream_set_direction(VideoStream *vs, VideoStreamDir dir);
399
static inline void video_stream_enable_adaptive_bitrate_control(VideoStream *stream, bool_t enabled) {
Ghislain MARY's avatar
Ghislain MARY committed
400 401
	media_stream_enable_adaptive_bitrate_control(&stream->ms, enabled);
}
402
static inline void video_stream_enable_adaptive_jittcomp(VideoStream *stream, bool_t enabled) {
Ghislain MARY's avatar
Ghislain MARY committed
403 404
	media_stream_enable_adaptive_jittcomp(&stream->ms, enabled);
}
Simon Morlat's avatar
Simon Morlat committed
405 406 407
MS2_PUBLIC void video_stream_set_render_callback(VideoStream *s, VideoStreamRenderCallback cb, void *user_pointer);
MS2_PUBLIC void video_stream_set_event_callback(VideoStream *s, VideoStreamEventCallback cb, void *user_pointer);
MS2_PUBLIC void video_stream_set_display_filter_name(VideoStream *s, const char *fname);
408
MS2_PUBLIC int video_stream_start(VideoStream * stream, RtpProfile *profile, const char *rem_rtp_ip, int rem_rtp_port, const char *rem_rtcp_ip, int rem_rtcp_port,
aymeric's avatar
aymeric committed
409
		int payload, int jitt_comp, MSWebCam *device);
410 411
MS2_PUBLIC void video_stream_prepare_video(VideoStream *stream);
MS2_PUBLIC void video_stream_unprepare_video(VideoStream *stream);
412 413


Simon Morlat's avatar
Simon Morlat committed
414
MS2_PUBLIC void video_stream_set_relay_session_id(VideoStream *stream, const char *relay_session_id);
415
static inline void video_stream_set_rtcp_information(VideoStream *st, const char *cname, const char *tool) {
Ghislain MARY's avatar
Ghislain MARY committed
416 417
	media_stream_set_rtcp_information(&st->ms, cname, tool);
}
Simon Morlat's avatar
Simon Morlat committed
418
MS2_PUBLIC void video_stream_change_camera(VideoStream *stream, MSWebCam *cam);
419 420
/* Calling video_stream_set_sent_video_size() or changing the bitrate value in the used PayloadType during a stream is running does nothing.
The following function allows to take into account new parameters by redrawing the sending graph*/
Simon Morlat's avatar
Simon Morlat committed
421
MS2_PUBLIC void video_stream_update_video_params(VideoStream *stream);
aymeric's avatar
aymeric committed
422
/*function to call periodically to handle various events */
Simon Morlat's avatar
Simon Morlat committed
423 424 425 426 427 428 429 430 431 432
MS2_PUBLIC void video_stream_iterate(VideoStream *stream);
MS2_PUBLIC void video_stream_send_vfu(VideoStream *stream);
MS2_PUBLIC void video_stream_stop(VideoStream * stream);
MS2_PUBLIC void video_stream_set_sent_video_size(VideoStream *stream, MSVideoSize vsize);
MS2_PUBLIC void video_stream_enable_self_view(VideoStream *stream, bool_t val);
MS2_PUBLIC unsigned long video_stream_get_native_window_id(VideoStream *stream);
MS2_PUBLIC void video_stream_set_native_window_id(VideoStream *stream, unsigned long id);
MS2_PUBLIC void video_stream_set_native_preview_window_id(VideoStream *stream, unsigned long id);
MS2_PUBLIC unsigned long video_stream_get_native_preview_window_id(VideoStream *stream);
MS2_PUBLIC void video_stream_use_preview_video_window(VideoStream *stream, bool_t yesno);
433
MS2_PUBLIC void video_stream_set_device_rotation(VideoStream *stream, int orientation);
434
MS2_PUBLIC void video_stream_show_video(VideoStream *stream, bool_t show);
435

436
/*provided for compatibility, use video_stream_set_direction() instead */
Simon Morlat's avatar
Simon Morlat committed
437 438
MS2_PUBLIC int video_stream_recv_only_start(VideoStream *videostream, RtpProfile *profile, const char *addr, int port, int used_pt, int jitt_comp);
MS2_PUBLIC int video_stream_send_only_start(VideoStream *videostream,
439
				RtpProfile *profile, const char *addr, int port, int rtcp_port,
440
				int used_pt, int  jitt_comp, MSWebCam *device);
Simon Morlat's avatar
Simon Morlat committed
441 442
MS2_PUBLIC void video_stream_recv_only_stop(VideoStream *vs);
MS2_PUBLIC void video_stream_send_only_stop(VideoStream *vs);
aymeric's avatar
aymeric committed
443

Guillaume Beraudo's avatar
Guillaume Beraudo committed
444 445
/* enable ZRTP on the video stream using information from the audio stream */
MS2_PUBLIC void video_stream_enable_zrtp(VideoStream *vstream, AudioStream *astream, OrtpZrtpParams *param);
446

447
/* enable SRTP on the video stream */
448
static inline bool_t video_stream_enable_strp(VideoStream* stream, enum ortp_srtp_crypto_suite_t suite, const char* snd_key, const char* rcv_key) {
Ghislain MARY's avatar
Ghislain MARY committed
449 450 451
	return media_stream_enable_srtp(&stream->ms, suite, snd_key, rcv_key);
}

452 453
/* if enabled, the display filter will internaly rotate the video, according to the device orientation */
MS2_PUBLIC void video_stream_enable_display_filter_auto_rotate(VideoStream* stream, bool_t enable);
454

455
/* retrieve RTP statistics*/
456
static inline void video_stream_get_local_rtp_stats(VideoStream *stream, rtp_stats_t *stats) {
Ghislain MARY's avatar
Ghislain MARY committed
457 458
	media_stream_get_local_rtp_stats(&stream->ms, stats);
}
459

460
static inline int video_stream_set_dscp(VideoStream *stream, int dscp) {
Ghislain MARY's avatar
Ghislain MARY committed
461 462
	return media_stream_set_dscp(&stream->ms, dscp);
}
Simon Morlat's avatar
Simon Morlat committed
463

464 465 466 467
/**
 * Small API to display a local preview window.
**/

Simon Morlat's avatar
Simon Morlat committed
468 469
typedef VideoStream VideoPreview;

Simon Morlat's avatar
Simon Morlat committed
470
MS2_PUBLIC VideoPreview * video_preview_new();
Simon Morlat's avatar
Simon Morlat committed
471 472 473 474
#define video_preview_set_size(p,s) 							video_stream_set_sent_video_size(p,s)
#define video_preview_set_display_filter_name(p,dt)	video_stream_set_display_filter_name(p,dt)
#define video_preview_set_native_window_id(p,id)		video_stream_set_native_preview_window_id (p,id)
#define video_preview_get_native_window_id(p)			video_stream_get_native_preview_window_id (p)
Simon Morlat's avatar
Simon Morlat committed
475 476
MS2_PUBLIC void video_preview_start(VideoPreview *stream, MSWebCam *device);
MS2_PUBLIC void video_preview_stop(VideoPreview *stream);
aymeric's avatar
aymeric committed
477

478 479 480 481
/**
 * @}
**/

Simon Morlat's avatar
Simon Morlat committed
482
MS2_PUBLIC bool_t ms_is_ipv6(const char *address);
aymeric's avatar
aymeric committed
483

Guillaume Beraudo's avatar
Guillaume Beraudo committed
484

aymeric's avatar
aymeric committed
485 486 487 488 489
#ifdef __cplusplus
}
#endif

#endif