mediastream.h 24.3 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
typedef enum StreamType {
	AudioStreamType,
	VideoStreamType
} StreamType;

jehan's avatar
jehan committed
78
79
80
81
82
83
84
typedef struct _MediaStream MediaStream;

/*
 * internal cb to process rtcp stream
 * */
typedef  void (*media_stream_process_rtcp)(MediaStream *stream, mblk_t *m);

85
86
87
88
89
90
91
92
struct _MSMediaStreamSessions{
	RtpSession *rtp_session;
	srtp_t srtp_session;
	OrtpZrtpContext *zrtp_context;
	MSTicker *ticker;
};

typedef struct _MSMediaStreamSessions MSMediaStreamSessions;
jehan's avatar
jehan committed
93

94
95
96
97
98
99
100
101
102
103
104
MS2_PUBLIC void ms_media_stream_sessions_uninit(MSMediaStreamSessions *sessions);

typedef enum _MSStreamState{
	MSStreamInitialized,
	MSStreamPreparing,
	MSStreamStarted
}MSStreamState;

/**
 * Base struct for both AudioStream and VideoStream structure.
**/
Ghislain MARY's avatar
Ghislain MARY committed
105
106
struct _MediaStream {
	StreamType type;
107
108
	MSStreamState state;
	MSMediaStreamSessions sessions;
Ghislain MARY's avatar
Ghislain MARY committed
109
110
111
112
113
114
115
	OrtpEvQueue *evq;
	MSFilter *rtprecv;
	MSFilter *rtpsend;
	MSFilter *encoder;
	MSFilter *decoder;
	MSFilter *voidsink;
	MSBitrateController *rc;
116
	MSQualityIndicator *qi;
Ghislain MARY's avatar
Ghislain MARY committed
117
	IceCheckList *ice_check_list;
118
119
	time_t start_time;
	time_t last_iterate_time;
Ghislain MARY's avatar
Ghislain MARY committed
120
	bool_t use_rc;
121
	bool_t is_beginning;
122
123
	bool_t owns_sessions;
	bool_t pad[1];
jehan's avatar
jehan committed
124
125
126
127
128
129
130
131
	/**
	 * defines encoder target network bit rate, uses #media_stream_set_network_bitrate() setter.
	 * */
	int target_bitrate;
	media_stream_process_rtcp process_rtcp;
	float up_bw; /*computed upload bw*/
	float down_bw; /*computed upload bw*/
	time_t last_bw_sampling_time;
Ghislain MARY's avatar
Ghislain MARY committed
132
133
};

jehan's avatar
jehan committed
134
135
136
137
138

/**
 * @addtogroup audio_stream_api
 * @{
**/
Ghislain MARY's avatar
Ghislain MARY committed
139

140
141
MS2_PUBLIC bool_t media_stream_srtp_supported(void);

142
143
144
145
146
147
148
149
150
151
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);

152
153
154
/*
 * deprecated, use media_stream_set_srtp_recv_key and media_stream_set_srtp_send_key.
**/
155
156
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);

157
158
159
160
MS2_PUBLIC int media_stream_set_srtp_recv_key(MediaStream *stream, enum ortp_srtp_crypto_suite_t suite, const char* key);

MS2_PUBLIC int media_stream_set_srtp_send_key(MediaStream *stream, enum ortp_srtp_crypto_suite_t suite, const char* key);

161
MS2_PUBLIC const MSQualityIndicator *media_stream_get_quality_indicator(MediaStream *stream);
jehan's avatar
jehan committed
162
163
164
/* *
 * returns a realtime indicator of the stream quality between 0 and 5
 * */
165
MS2_PUBLIC float media_stream_get_quality_rating(MediaStream *stream);
166

167
168
MS2_PUBLIC float media_stream_get_average_quality_rating(MediaStream *stream);

169
170
171
172
MS2_PUBLIC float media_stream_get_lq_quality_rating(MediaStream *stream);

MS2_PUBLIC float media_stream_get_average_lq_quality_rating(MediaStream *stream);

173
/**
jehan's avatar
jehan committed
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
 * <br>For multirate codecs like OPUS, encoder output target bitrate must be set.
 * <br>Encoder will compute output codec bitrate from this value.
 * <br> default value is the value corresponding the rtp PayloadType
 * @param stream stream to apply parameter on
 * @param target_bitrate in bit per seconds
 * @return 0 if succeed
 * */
MS2_PUBLIC int media_stream_set_target_network_bitrate(MediaStream *stream,int target_bitrate);

/**
 * get the stream target bitrate.
 * @param stream stream to apply parameter on
 * @param target_bitrate in bit per seconds
 * */
MS2_PUBLIC int media_stream_get_target_network_bitrate(const MediaStream *stream);

/**
 * get current stream  upload bitrate. Value is updated every seconds
 * @param stream
 * @return bitrate in bit per seconds
 * */
MS2_PUBLIC float media_stream_get_up_bw(const MediaStream *stream);

/**
 * get current stream download bitrate. Value is updated every seconds
 * @param stream
 * @return bitrate in bit per seconds
 * */
MS2_PUBLIC float media_stream_get_down_bw(const MediaStream *stream);

204
205
206
207
208
209
/**
 * Returns the sessions that were used in the media stream (RTP, SRTP, ZRTP...) so that they can be re-used.
 * As a result of calling this function, the media stream no longer owns the sessions and thus will not free them.
**/
MS2_PUBLIC void media_stream_reclaim_sessions(MediaStream *stream, MSMediaStreamSessions *sessions);

jehan's avatar
jehan committed
210
211
212

void media_stream_iterate(MediaStream * stream);

213

214
215
216
typedef enum EchoLimiterType{
	ELInactive,
	ELControlMic,
217
	ELControlFull
218
219
} EchoLimiterType;

aymeric's avatar
aymeric committed
220
221
struct _AudioStream
{
Ghislain MARY's avatar
Ghislain MARY committed
222
	MediaStream ms;
aymeric's avatar
aymeric committed
223
224
225
	MSFilter *soundread;
	MSFilter *soundwrite;
	MSFilter *dtmfgen;
226
	MSFilter *dtmfgen_rtp;
Yann Diorcet's avatar
Yann Diorcet committed
227
	MSFilter *plc;
aymeric's avatar
aymeric committed
228
	MSFilter *ec;/*echo canceler*/
229
	MSFilter *volsend,*volrecv; /*MSVolumes*/
230
231
232
	MSFilter *local_mixer;
	MSFilter *local_player;
	MSFilter *local_player_resampler;
233
234
	MSFilter *read_resampler;
	MSFilter *write_resampler;
smorlat's avatar
smorlat committed
235
	MSFilter *equalizer;
Simon Morlat's avatar
Simon Morlat committed
236
	MSFilter *dummy;
237
238
239
240
241
	MSFilter *send_tee;
	MSFilter *recv_tee;
	MSFilter *recorder_mixer;
	MSFilter *recorder;
	char *recorder_file;
aymeric's avatar
aymeric committed
242
	uint64_t last_packet_count;
aymeric's avatar
aymeric committed
243
	time_t last_packet_time;
244
	EchoLimiterType el_type; /*use echo limiter: two MSVolume, measured input level controlling local output level*/
Ghislain MARY's avatar
Ghislain MARY committed
245
	uint32_t features;
smorlat's avatar
smorlat committed
246
	bool_t play_dtmfs;
smorlat's avatar
smorlat committed
247
	bool_t use_gc;
248
	bool_t use_agc;
smorlat's avatar
smorlat committed
249
	bool_t eq_active;
250
	bool_t use_ng;/*noise gate*/
251
	bool_t is_ec_delay_set;
aymeric's avatar
aymeric committed
252
253
};

254
255
256
/**
 * The AudioStream holds all resources to create and run typical VoIP audiostream.
**/
aymeric's avatar
aymeric committed
257
258
259
260
typedef struct _AudioStream AudioStream;


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

Simon Morlat's avatar
Simon Morlat committed
264
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
265

266

Simon Morlat's avatar
Simon Morlat committed
267
MS2_PUBLIC int audio_stream_start_with_files (AudioStream * stream, RtpProfile * prof,
aymeric's avatar
aymeric committed
268
269
270
271
					    const char *remip, int remport, int rem_rtcp_port,
					    int pt, int jitt_comp,
					    const char * infile,  const char * outfile);

272
273
274
275
276
277
278
279
280
/**
 * 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.
281
282
283
 * @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.
284
285
286
287
288
289
290
291
292
293
 * @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.
**/
294
295
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,
296
297
	MSSndCard *playcard, MSSndCard *captcard, bool_t use_ec);

298

Simon Morlat's avatar
Simon Morlat committed
299
300
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
301

302
static inline void audio_stream_set_rtcp_information(AudioStream *st, const char *cname, const char *tool) {
Ghislain MARY's avatar
Ghislain MARY committed
303
304
	media_stream_set_rtcp_information(&st->ms, cname, tool);
}
aymeric's avatar
aymeric committed
305

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

308
309
/**
 * Creates an AudioStream object listening on a RTP port.
310
311
 * @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
312
313
314
 * @param ipv6 TRUE if ipv6 must be used.
 * @returns a new AudioStream.
**/
315
MS2_PUBLIC AudioStream *audio_stream_new(int loc_rtp_port, int loc_rtcp_port, bool_t ipv6);
Simon Morlat's avatar
Simon Morlat committed
316

317
318
319
320
321
322
/**Creates an AudioStream object from an initialized RtpSession.
 * @param rtp_session the RtpSession
 * @returns a new AudioStream
**/
MS2_PUBLIC AudioStream *audio_stream_new_with_sessions(const MSMediaStreamSessions *sessions);

323
324
325
326
327
328
329
330
#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)
331
#define AUDIO_STREAM_FEATURE_LOCAL_PLAYING	(1 << 8)
332

Yann Diorcet's avatar
Yann Diorcet committed
333
334
335
336
337
338
339
#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 | \
340
					AUDIO_STREAM_FEATURE_DTMF_ECHO |\
341
342
					AUDIO_STREAM_FEATURE_MIXED_RECORDING |\
					AUDIO_STREAM_FEATURE_LOCAL_PLAYING \
Yann Diorcet's avatar
Yann Diorcet committed
343
344
					)

345

Yann Diorcet's avatar
Yann Diorcet committed
346
347
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
348
349
350
351
	
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);
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
/**
 * 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
369
370
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
371
/*returns true if we are still receiving some data from remote end in the last timeout seconds*/
Simon Morlat's avatar
Simon Morlat committed
372
MS2_PUBLIC bool_t audio_stream_alive(AudioStream * stream, int timeout);
aymeric's avatar
aymeric committed
373

374
375
376
377
/**
 * 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.
 */
378
379
MS2_PUBLIC void audio_stream_iterate(AudioStream *stream);

jehan's avatar
jehan committed
380
381
382
/**
 * enable echo-limiter dispositve: one MSVolume in input branch controls a MSVolume in the output branch
 * */
Simon Morlat's avatar
Simon Morlat committed
383
MS2_PUBLIC void audio_stream_enable_echo_limiter(AudioStream *stream, EchoLimiterType type);
384

jehan's avatar
jehan committed
385
386
387
/**
 * enable gain control, to be done before start()
 * */
Simon Morlat's avatar
Simon Morlat committed
388
MS2_PUBLIC void audio_stream_enable_gain_control(AudioStream *stream, bool_t val);
smorlat's avatar
smorlat committed
389

jehan's avatar
jehan committed
390
391
392
/**
 * enable automatic gain control, to be done before start()
 * */
Simon Morlat's avatar
Simon Morlat committed
393
MS2_PUBLIC void audio_stream_enable_automatic_gain_control(AudioStream *stream, bool_t val);
394

jehan's avatar
jehan committed
395
396
397
/**
 * to be done before start
 *  */
Simon Morlat's avatar
Simon Morlat committed
398
MS2_PUBLIC void audio_stream_set_echo_canceller_params(AudioStream *st, int tail_len_ms, int delay_ms, int framesize);
399

jehan's avatar
jehan committed
400
401
402
/**
 * enable adaptive rate control
 * */
403
static inline void audio_stream_enable_adaptive_bitrate_control(AudioStream *stream, bool_t enabled) {
Ghislain MARY's avatar
Ghislain MARY committed
404
405
	media_stream_enable_adaptive_bitrate_control(&stream->ms, enabled);
}
406

jehan's avatar
jehan committed
407
408
409
/**
 *  Enable adaptive jitter compensation
 *  */
410
static inline void audio_stream_enable_adaptive_jittcomp(AudioStream *stream, bool_t enabled) {
Ghislain MARY's avatar
Ghislain MARY committed
411
412
	media_stream_enable_adaptive_jittcomp(&stream->ms, enabled);
}
413

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

jehan's avatar
jehan committed
416
417
418
/**
 *  enable/disable rtp stream
 *  */
Simon Morlat's avatar
Simon Morlat committed
419
MS2_PUBLIC void audio_stream_mute_rtp(AudioStream *stream, bool_t val);
Simon Morlat's avatar
Simon Morlat committed
420

jehan's avatar
jehan committed
421
422
423
/**
 * enable noise gate, must be done before start()
 * */
Simon Morlat's avatar
Simon Morlat committed
424
MS2_PUBLIC void audio_stream_enable_noise_gate(AudioStream *stream, bool_t val);
425

jehan's avatar
jehan committed
426
427
428
/**
 * enable parametric equalizer in the stream that goes to the speaker
 * */
Simon Morlat's avatar
Simon Morlat committed
429
MS2_PUBLIC void audio_stream_enable_equalizer(AudioStream *stream, bool_t enabled);
smorlat's avatar
smorlat committed
430

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

jehan's avatar
jehan committed
433
434
435
/**
 *  stop the audio streaming thread and free everything
 *  */
Simon Morlat's avatar
Simon Morlat committed
436
MS2_PUBLIC void audio_stream_stop (AudioStream * stream);
aymeric's avatar
aymeric committed
437

jehan's avatar
jehan committed
438
439
440
/**
 *  send a dtmf
 *  */
Simon Morlat's avatar
Simon Morlat committed
441
MS2_PUBLIC int audio_stream_send_dtmf (AudioStream * stream, char dtmf);
aymeric's avatar
aymeric committed
442

443
444
MS2_PUBLIC MSFilter *audio_stream_get_local_player(AudioStream *stream);

445
446
447
448
449
450
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
451
MS2_PUBLIC void audio_stream_set_default_card(int cardindex);
aymeric's avatar
aymeric committed
452

Simon Morlat's avatar
Simon Morlat committed
453
/* retrieve RTP statistics*/
454
static inline void audio_stream_get_local_rtp_stats(AudioStream *stream, rtp_stats_t *stats) {
Ghislain MARY's avatar
Ghislain MARY committed
455
456
	media_stream_get_local_rtp_stats(&stream->ms, stats);
}
Simon Morlat's avatar
Simon Morlat committed
457

458
/* returns a realtime indicator of the stream quality between 0 and 5 */
459
460
MS2_PUBLIC float audio_stream_get_quality_rating(AudioStream *stream);

461
462
/* 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
463

464
465
466
467
468
469
/* returns a realtime indicator of the listening quality of the stream between 0 and 5 */
MS2_PUBLIC float audio_stream_get_lq_quality_rating(AudioStream *stream);

/* returns the listening quality rating as an average since the start of the streaming session.*/
MS2_PUBLIC float audio_stream_get_average_lq_quality_rating(AudioStream *stream);

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

473
/* enable SRTP on the audio stream */
474
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
475
476
	return media_stream_enable_srtp(&stream->ms, suite, snd_key, rcv_key);
}
Guillaume Beraudo's avatar
Guillaume Beraudo committed
477

478
static inline int audio_stream_set_dscp(AudioStream *stream, int dscp) {
Ghislain MARY's avatar
Ghislain MARY committed
479
480
	return media_stream_set_dscp(&stream->ms, dscp);
}
Simon Morlat's avatar
Simon Morlat committed
481

482
483
484
485
486
487
488
489
490
/**
 * @}
**/


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

492
typedef void (*VideoStreamRenderCallback)(void *user_pointer, const MSPicture *local_view, const MSPicture *remote_view);
493
494
495
typedef void (*VideoStreamEventCallback)(void *user_pointer, const MSFilter *f, const unsigned int event_id, const void *args);


496
497
498
499
500
501
typedef enum _VideoStreamDir{
	VideoStreamSendRecv,
	VideoStreamSendOnly,
	VideoStreamRecvOnly
}VideoStreamDir;

aymeric's avatar
aymeric committed
502
503
struct _VideoStream
{
Ghislain MARY's avatar
Ghislain MARY committed
504
	MediaStream ms;
aymeric's avatar
aymeric committed
505
506
	MSFilter *source;
	MSFilter *pixconv;
507
	MSFilter *sizeconv;
aymeric's avatar
aymeric committed
508
509
	MSFilter *tee;
	MSFilter *output;
510
511
	MSFilter *tee2;
	MSFilter *jpegwriter;
512
	MSFilter *output2;
smorlat's avatar
smorlat committed
513
	MSVideoSize sent_vsize;
smorlat's avatar
smorlat committed
514
	int corner; /*for selfview*/
515
516
	VideoStreamRenderCallback rendercb;
	void *render_pointer;
517
518
	VideoStreamEventCallback eventcb;
	void *event_pointer;
519
	char *display_name;
520
521
	unsigned long window_id;
	unsigned long preview_window_id;
522
	VideoStreamDir dir;
523
	MSWebCam *cam;
524
	int device_orientation; /* warning: meaning of this variable depends on the platform (Android, iOS, ...) */
Ghislain MARY's avatar
Ghislain MARY committed
525
526
	bool_t use_preview_window;
	bool_t display_filter_auto_rotate_enabled;
527
528
	bool_t source_performs_encoding;
	bool_t output_performs_decoding;
aymeric's avatar
aymeric committed
529
530
531
};

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

533

534
MS2_PUBLIC VideoStream *video_stream_new(int loc_rtp_port, int loc_rtcp_port, bool_t use_ipv6);
535
MS2_PUBLIC VideoStream *video_stream_new_with_sessions(const MSMediaStreamSessions *sessions);
Simon Morlat's avatar
Simon Morlat committed
536
MS2_PUBLIC void video_stream_set_direction(VideoStream *vs, VideoStreamDir dir);
537
static inline void video_stream_enable_adaptive_bitrate_control(VideoStream *stream, bool_t enabled) {
Ghislain MARY's avatar
Ghislain MARY committed
538
539
	media_stream_enable_adaptive_bitrate_control(&stream->ms, enabled);
}
540
static inline void video_stream_enable_adaptive_jittcomp(VideoStream *stream, bool_t enabled) {
Ghislain MARY's avatar
Ghislain MARY committed
541
542
	media_stream_enable_adaptive_jittcomp(&stream->ms, enabled);
}
Simon Morlat's avatar
Simon Morlat committed
543
544
545
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);
546
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
547
		int payload, int jitt_comp, MSWebCam *device);
548
549
MS2_PUBLIC void video_stream_prepare_video(VideoStream *stream);
MS2_PUBLIC void video_stream_unprepare_video(VideoStream *stream);
550
551


Simon Morlat's avatar
Simon Morlat committed
552
MS2_PUBLIC void video_stream_set_relay_session_id(VideoStream *stream, const char *relay_session_id);
553
static inline void video_stream_set_rtcp_information(VideoStream *st, const char *cname, const char *tool) {
Ghislain MARY's avatar
Ghislain MARY committed
554
555
	media_stream_set_rtcp_information(&st->ms, cname, tool);
}
Simon Morlat's avatar
Simon Morlat committed
556
MS2_PUBLIC void video_stream_change_camera(VideoStream *stream, MSWebCam *cam);
557
558
/* 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
559
MS2_PUBLIC void video_stream_update_video_params(VideoStream *stream);
aymeric's avatar
aymeric committed
560
/*function to call periodically to handle various events */
Simon Morlat's avatar
Simon Morlat committed
561
562
563
564
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);
565
566
567
568
569
570

/**
 * Gets the size of the video that is sent.
 * @param[in] stream The videostream for which to get the sent video size.
 * @return The sent video size or MS_VIDEO_SIZE_UNKNOWN if not available.
 */
Ghislain MARY's avatar
Ghislain MARY committed
571
MS2_PUBLIC MSVideoSize video_stream_get_sent_video_size(const VideoStream *stream);
572
573
574
575
576
577

/**
 * Gets the size of the video that is received.
 * @param[in] stream The videostream for which to get the received video size.
 * @return The received video size or MS_VIDEO_SIZE_UNKNOWN if not available.
 */
Ghislain MARY's avatar
Ghislain MARY committed
578
MS2_PUBLIC MSVideoSize video_stream_get_received_video_size(const VideoStream *stream);
579

Simon Morlat's avatar
Simon Morlat committed
580
581
582
583
584
/**
 * Returns the name of the video display filter on the current platform.
**/
const char *video_stream_get_default_video_renderer(void);

Simon Morlat's avatar
Simon Morlat committed
585
586
587
588
589
590
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);
591
MS2_PUBLIC void video_stream_set_device_rotation(VideoStream *stream, int orientation);
592
MS2_PUBLIC void video_stream_show_video(VideoStream *stream, bool_t show);
593

594
595
596
597
598
599
600
601
602
603
604
/**
 * @brief Gets the camera sensor rotation.
 *
 * This is needed on some mobile platforms to get the number of degrees the camera sensor
 * is rotated relative to the screen.
 *
 * @param stream The video stream related to the operation
 * @return The camera sensor rotation in degrees (0 to 360) or -1 if it could not be retrieved
 */
MS2_PUBLIC int video_stream_get_camera_sensor_rotation(VideoStream *stream);

605
/*provided for compatibility, use video_stream_set_direction() instead */
Simon Morlat's avatar
Simon Morlat committed
606
607
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,
608
				RtpProfile *profile, const char *addr, int port, int rtcp_port,
609
				int used_pt, int  jitt_comp, MSWebCam *device);
Simon Morlat's avatar
Simon Morlat committed
610
611
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
612

Guillaume Beraudo's avatar
Guillaume Beraudo committed
613
614
/* 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);
615

616
/* enable SRTP on the video stream */
617
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
618
619
620
	return media_stream_enable_srtp(&stream->ms, suite, snd_key, rcv_key);
}

621
622
/* 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);
623

624
/* retrieve RTP statistics*/
625
static inline void video_stream_get_local_rtp_stats(VideoStream *stream, rtp_stats_t *stats) {
Ghislain MARY's avatar
Ghislain MARY committed
626
627
	media_stream_get_local_rtp_stats(&stream->ms, stats);
}
628

629
static inline int video_stream_set_dscp(VideoStream *stream, int dscp) {
Ghislain MARY's avatar
Ghislain MARY committed
630
631
	return media_stream_set_dscp(&stream->ms, dscp);
}
Simon Morlat's avatar
Simon Morlat committed
632

633
634
635
636
/**
 * Small API to display a local preview window.
**/

Simon Morlat's avatar
Simon Morlat committed
637
638
typedef VideoStream VideoPreview;

Simon Morlat's avatar
Simon Morlat committed
639
MS2_PUBLIC VideoPreview * video_preview_new();
Simon Morlat's avatar
Simon Morlat committed
640
641
642
643
#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
644
645
MS2_PUBLIC void video_preview_start(VideoPreview *stream, MSWebCam *device);
MS2_PUBLIC void video_preview_stop(VideoPreview *stream);
aymeric's avatar
aymeric committed
646

647
648
649
650
/**
 * @}
**/

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

Guillaume Beraudo's avatar
Guillaume Beraudo committed
653

aymeric's avatar
aymeric committed
654
655
656
657
658
#ifdef __cplusplus
}
#endif

#endif