mediastream.h 26.8 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

24
25
26
#include <ortp/ortp.h>
#include <ortp/event.h>
#include <ortp/zrtp.h>
jehan's avatar
jehan committed
27
28
/* defined in srtp.h*/
typedef struct srtp_ctx_t *MSSrtpCtx;
29

Simon Morlat's avatar
Simon Morlat committed
30
31
32
33
34
#include <mediastreamer2/msfilter.h>
#include <mediastreamer2/msticker.h>
#include <mediastreamer2/mssndcard.h>
#include <mediastreamer2/mswebcam.h>
#include <mediastreamer2/msvideo.h>
35
36
#include <mediastreamer2/bitratecontrol.h>
#include <mediastreamer2/qualityindicator.h>
37
#include <mediastreamer2/ice.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
/**
 * @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);

/**
 * @}
**/
jehan's avatar
jehan committed
71
72
73
74
75
76
77
78
79
80
/*
 * Crypto suite used configure encrypted stream*/
typedef enum _MSCryptoSuite{
	MS_AES_128_SHA1_80 = 1,
	MS_AES_128_SHA1_32,
	MS_AES_128_NO_AUTH,
	MS_NO_CIPHER_SHA1_80,
	MS_AES_256_SHA1_80,
	MS_AES_256_SHA1_32
} MSCryptoSuite;
81

Ghislain MARY's avatar
Ghislain MARY committed
82
83
84
85
86
typedef enum StreamType {
	AudioStreamType,
	VideoStreamType
} StreamType;

jehan's avatar
jehan committed
87
88
89
90
91
92
93
typedef struct _MediaStream MediaStream;

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

94
95
struct _MSMediaStreamSessions{
	RtpSession *rtp_session;
jehan's avatar
jehan committed
96
	MSSrtpCtx srtp_session;
97
98
	OrtpZrtpContext *zrtp_context;
	MSTicker *ticker;
jehan's avatar
jehan committed
99
	bool_t is_secured;
100
101
102
};

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

104
105
106
107
108
109
110
111
112
113
114
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
115
116
struct _MediaStream {
	StreamType type;
117
118
	MSStreamState state;
	MSMediaStreamSessions sessions;
Ghislain MARY's avatar
Ghislain MARY committed
119
120
121
122
123
124
125
	OrtpEvQueue *evq;
	MSFilter *rtprecv;
	MSFilter *rtpsend;
	MSFilter *encoder;
	MSFilter *decoder;
	MSFilter *voidsink;
	MSBitrateController *rc;
126
	MSQualityIndicator *qi;
Ghislain MARY's avatar
Ghislain MARY committed
127
	IceCheckList *ice_check_list;
128
129
	time_t start_time;
	time_t last_iterate_time;
Ghislain MARY's avatar
Ghislain MARY committed
130
	bool_t use_rc;
131
	bool_t is_beginning;
132
	bool_t owns_sessions;
133
	bool_t pad;
jehan's avatar
jehan committed
134
	/**
135
	 * defines encoder target network bit rate, uses #media_stream_set_target_network_bitrate() setter.
jehan's avatar
jehan committed
136
137
138
	 * */
	int target_bitrate;
	media_stream_process_rtcp process_rtcp;
Ghislain MARY's avatar
Ghislain MARY committed
139
140
};

jehan's avatar
jehan committed
141
142
143
144
145

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

147
148
MS2_PUBLIC bool_t media_stream_srtp_supported(void);

149
150
151
152
153
154
155
156
157
158
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);

159
160
161
/*
 * deprecated, use media_stream_set_srtp_recv_key and media_stream_set_srtp_send_key.
**/
jehan's avatar
jehan committed
162
163
164
MS2_PUBLIC bool_t media_stream_enable_srtp(MediaStream* stream, MSCryptoSuite suite, const char* snd_key, const char* rcv_key);

MS2_PUBLIC int media_stream_set_srtp_recv_key(MediaStream *stream, MSCryptoSuite suite, const char* key);
165

jehan's avatar
jehan committed
166
167
MS2_PUBLIC int media_stream_set_srtp_send_key(MediaStream *stream, MSCryptoSuite suite, const char* key);
/**
168
 * @param[in] stream MediaStream object
jehan's avatar
jehan committed
169
170
171
 * @return true if stream is encrypted
 * */
MS2_PUBLIC bool_t media_stream_is_secured(const MediaStream *stream);
172
173


174
MS2_PUBLIC const MSQualityIndicator *media_stream_get_quality_indicator(MediaStream *stream);
jehan's avatar
jehan committed
175
176
177
/* *
 * returns a realtime indicator of the stream quality between 0 and 5
 * */
178
MS2_PUBLIC float media_stream_get_quality_rating(MediaStream *stream);
179

180
181
MS2_PUBLIC float media_stream_get_average_quality_rating(MediaStream *stream);

182
183
184
185
MS2_PUBLIC float media_stream_get_lq_quality_rating(MediaStream *stream);

MS2_PUBLIC float media_stream_get_average_lq_quality_rating(MediaStream *stream);

186
/**
jehan's avatar
jehan committed
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
 * <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);

217
218
219
220
221
222
/**
 * 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
223
224
225

void media_stream_iterate(MediaStream * stream);

jehan's avatar
jehan committed
226
227
228
229
/**
 * @returns curret streams tate
 * */
MS2_PUBLIC MSStreamState media_stream_get_state(const MediaStream *stream);
230

231
232
233
typedef enum EchoLimiterType{
	ELInactive,
	ELControlMic,
234
	ELControlFull
235
236
} EchoLimiterType;

aymeric's avatar
aymeric committed
237
238
struct _AudioStream
{
Ghislain MARY's avatar
Ghislain MARY committed
239
	MediaStream ms;
aymeric's avatar
aymeric committed
240
241
242
	MSFilter *soundread;
	MSFilter *soundwrite;
	MSFilter *dtmfgen;
243
	MSFilter *dtmfgen_rtp;
Yann Diorcet's avatar
Yann Diorcet committed
244
	MSFilter *plc;
aymeric's avatar
aymeric committed
245
	MSFilter *ec;/*echo canceler*/
246
	MSFilter *volsend,*volrecv; /*MSVolumes*/
247
248
249
	MSFilter *local_mixer;
	MSFilter *local_player;
	MSFilter *local_player_resampler;
250
251
	MSFilter *read_resampler;
	MSFilter *write_resampler;
smorlat's avatar
smorlat committed
252
	MSFilter *equalizer;
Simon Morlat's avatar
Simon Morlat committed
253
	MSFilter *dummy;
254
255
256
257
258
	MSFilter *send_tee;
	MSFilter *recv_tee;
	MSFilter *recorder_mixer;
	MSFilter *recorder;
	char *recorder_file;
aymeric's avatar
aymeric committed
259
	uint64_t last_packet_count;
aymeric's avatar
aymeric committed
260
	time_t last_packet_time;
261
	EchoLimiterType el_type; /*use echo limiter: two MSVolume, measured input level controlling local output level*/
Ghislain MARY's avatar
Ghislain MARY committed
262
	uint32_t features;
smorlat's avatar
smorlat committed
263
	bool_t play_dtmfs;
smorlat's avatar
smorlat committed
264
	bool_t use_gc;
265
	bool_t use_agc;
smorlat's avatar
smorlat committed
266
	bool_t eq_active;
267
	bool_t use_ng;/*noise gate*/
268
	bool_t is_ec_delay_set;
aymeric's avatar
aymeric committed
269
270
};

271
272
273
/**
 * The AudioStream holds all resources to create and run typical VoIP audiostream.
**/
aymeric's avatar
aymeric committed
274
275
276
277
typedef struct _AudioStream AudioStream;


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

Simon Morlat's avatar
Simon Morlat committed
281
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
282

283

Simon Morlat's avatar
Simon Morlat committed
284
MS2_PUBLIC int audio_stream_start_with_files (AudioStream * stream, RtpProfile * prof,
aymeric's avatar
aymeric committed
285
286
287
288
					    const char *remip, int remport, int rem_rtcp_port,
					    int pt, int jitt_comp,
					    const char * infile,  const char * outfile);

289
290
/**
 * Starts an audio stream from/to local wav files or soundcards.
291
 *
292
293
 * 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.
294
295
 *
 *
296
297
 * @param stream an AudioStream previously created with audio_stream_new().
 * @param prof a RtpProfile containing all PayloadType possible during the audio session.
298
299
300
 * @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.
301
302
303
304
305
306
307
308
309
310
 * @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.
**/
311
312
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,
313
314
	MSSndCard *playcard, MSSndCard *captcard, bool_t use_ec);

315

Simon Morlat's avatar
Simon Morlat committed
316
317
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
318

319
static inline void audio_stream_set_rtcp_information(AudioStream *st, const char *cname, const char *tool) {
Ghislain MARY's avatar
Ghislain MARY committed
320
321
	media_stream_set_rtcp_information(&st->ms, cname, tool);
}
aymeric's avatar
aymeric committed
322

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

325
326
/**
 * Creates an AudioStream object listening on a RTP port.
327
328
 * @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
329
330
331
 * @param ipv6 TRUE if ipv6 must be used.
 * @returns a new AudioStream.
**/
332
MS2_PUBLIC AudioStream *audio_stream_new(int loc_rtp_port, int loc_rtcp_port, bool_t ipv6);
Simon Morlat's avatar
Simon Morlat committed
333

334
335
336
337
338
339
/**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);

340
341
342
343
344
345
346
347
#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)
348
#define AUDIO_STREAM_FEATURE_LOCAL_PLAYING	(1 << 8)
349

Yann Diorcet's avatar
Yann Diorcet committed
350
351
352
353
354
355
356
#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 | \
357
					AUDIO_STREAM_FEATURE_DTMF_ECHO |\
358
359
					AUDIO_STREAM_FEATURE_MIXED_RECORDING |\
					AUDIO_STREAM_FEATURE_LOCAL_PLAYING \
Yann Diorcet's avatar
Yann Diorcet committed
360
361
					)

362

Yann Diorcet's avatar
Yann Diorcet committed
363
364
MS2_PUBLIC uint32_t audio_stream_get_features(AudioStream *st);
MS2_PUBLIC void audio_stream_set_features(AudioStream *st, uint32_t features);
365

Simon Morlat's avatar
Simon Morlat committed
366
367
368
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);
369
370
/**
 * Starts an audio stream from local soundcards.
371
 *
372
373
 * 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.
374
 *
375
376
377
378
379
380
381
382
383
384
385
 * @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
386
387
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
388
/*returns true if we are still receiving some data from remote end in the last timeout seconds*/
Simon Morlat's avatar
Simon Morlat committed
389
MS2_PUBLIC bool_t audio_stream_alive(AudioStream * stream, int timeout);
aymeric's avatar
aymeric committed
390

391
392
393
394
/**
 * 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.
 */
395
396
MS2_PUBLIC void audio_stream_iterate(AudioStream *stream);

jehan's avatar
jehan committed
397
398
399
/**
 * enable echo-limiter dispositve: one MSVolume in input branch controls a MSVolume in the output branch
 * */
Simon Morlat's avatar
Simon Morlat committed
400
MS2_PUBLIC void audio_stream_enable_echo_limiter(AudioStream *stream, EchoLimiterType type);
401

jehan's avatar
jehan committed
402
403
404
/**
 * enable gain control, to be done before start()
 * */
Simon Morlat's avatar
Simon Morlat committed
405
MS2_PUBLIC void audio_stream_enable_gain_control(AudioStream *stream, bool_t val);
smorlat's avatar
smorlat committed
406

jehan's avatar
jehan committed
407
408
409
/**
 * enable automatic gain control, to be done before start()
 * */
Simon Morlat's avatar
Simon Morlat committed
410
MS2_PUBLIC void audio_stream_enable_automatic_gain_control(AudioStream *stream, bool_t val);
411

jehan's avatar
jehan committed
412
413
414
/**
 * to be done before start
 *  */
Simon Morlat's avatar
Simon Morlat committed
415
MS2_PUBLIC void audio_stream_set_echo_canceller_params(AudioStream *st, int tail_len_ms, int delay_ms, int framesize);
416

jehan's avatar
jehan committed
417
418
419
/**
 * enable adaptive rate control
 * */
420
static inline void audio_stream_enable_adaptive_bitrate_control(AudioStream *stream, bool_t enabled) {
Ghislain MARY's avatar
Ghislain MARY committed
421
422
	media_stream_enable_adaptive_bitrate_control(&stream->ms, enabled);
}
423

jehan's avatar
jehan committed
424
425
426
/**
 *  Enable adaptive jitter compensation
 *  */
427
static inline void audio_stream_enable_adaptive_jittcomp(AudioStream *stream, bool_t enabled) {
Ghislain MARY's avatar
Ghislain MARY committed
428
429
	media_stream_enable_adaptive_jittcomp(&stream->ms, enabled);
}
430

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

jehan's avatar
jehan committed
433
434
435
/**
 *  enable/disable rtp stream
 *  */
Simon Morlat's avatar
Simon Morlat committed
436
MS2_PUBLIC void audio_stream_mute_rtp(AudioStream *stream, bool_t val);
Simon Morlat's avatar
Simon Morlat committed
437

jehan's avatar
jehan committed
438
439
440
/**
 * enable noise gate, must be done before start()
 * */
Simon Morlat's avatar
Simon Morlat committed
441
MS2_PUBLIC void audio_stream_enable_noise_gate(AudioStream *stream, bool_t val);
442

jehan's avatar
jehan committed
443
444
445
/**
 * enable parametric equalizer in the stream that goes to the speaker
 * */
Simon Morlat's avatar
Simon Morlat committed
446
MS2_PUBLIC void audio_stream_enable_equalizer(AudioStream *stream, bool_t enabled);
smorlat's avatar
smorlat committed
447

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

jehan's avatar
jehan committed
450
451
452
/**
 *  stop the audio streaming thread and free everything
 *  */
Simon Morlat's avatar
Simon Morlat committed
453
MS2_PUBLIC void audio_stream_stop (AudioStream * stream);
aymeric's avatar
aymeric committed
454

jehan's avatar
jehan committed
455
456
457
/**
 *  send a dtmf
 *  */
Simon Morlat's avatar
Simon Morlat committed
458
MS2_PUBLIC int audio_stream_send_dtmf (AudioStream * stream, char dtmf);
aymeric's avatar
aymeric committed
459

460
461
MS2_PUBLIC MSFilter *audio_stream_get_local_player(AudioStream *stream);

462
463
464
465
466
467
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
468
MS2_PUBLIC void audio_stream_set_default_card(int cardindex);
aymeric's avatar
aymeric committed
469

Simon Morlat's avatar
Simon Morlat committed
470
/* retrieve RTP statistics*/
471
static inline void audio_stream_get_local_rtp_stats(AudioStream *stream, rtp_stats_t *stats) {
Ghislain MARY's avatar
Ghislain MARY committed
472
473
	media_stream_get_local_rtp_stats(&stream->ms, stats);
}
Simon Morlat's avatar
Simon Morlat committed
474

475
/* returns a realtime indicator of the stream quality between 0 and 5 */
476
477
MS2_PUBLIC float audio_stream_get_quality_rating(AudioStream *stream);

478
479
/* 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
480

481
482
483
484
485
486
/* 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
487
488
/* enable ZRTP on the audio stream */
MS2_PUBLIC void audio_stream_enable_zrtp(AudioStream *stream, OrtpZrtpParams *params);
jehan's avatar
jehan committed
489
490
491
492
/**
 * return TRUE if zrtp is enabled, it does not mean that stream is encrypted, but only that zrtp is configured to know encryption status, uses #
 * */
bool_t  audio_stream_zrtp_enabled(const AudioStream *stream);
Guillaume Beraudo's avatar
Guillaume Beraudo committed
493

494
/* enable SRTP on the audio stream */
jehan's avatar
jehan committed
495
static inline bool_t audio_stream_enable_srtp(AudioStream* stream, MSCryptoSuite suite, const char* snd_key, const char* rcv_key) {
Ghislain MARY's avatar
Ghislain MARY committed
496
497
	return media_stream_enable_srtp(&stream->ms, suite, snd_key, rcv_key);
}
Guillaume Beraudo's avatar
Guillaume Beraudo committed
498

499
static inline int audio_stream_set_dscp(AudioStream *stream, int dscp) {
Ghislain MARY's avatar
Ghislain MARY committed
500
501
	return media_stream_set_dscp(&stream->ms, dscp);
}
Simon Morlat's avatar
Simon Morlat committed
502

503
504
505
506
507
508
509
510
511
/**
 * @}
**/


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

513
typedef void (*VideoStreamRenderCallback)(void *user_pointer, const MSPicture *local_view, const MSPicture *remote_view);
514
515
516
typedef void (*VideoStreamEventCallback)(void *user_pointer, const MSFilter *f, const unsigned int event_id, const void *args);


517
518
519
520
521
522
typedef enum _VideoStreamDir{
	VideoStreamSendRecv,
	VideoStreamSendOnly,
	VideoStreamRecvOnly
}VideoStreamDir;

aymeric's avatar
aymeric committed
523
524
struct _VideoStream
{
Ghislain MARY's avatar
Ghislain MARY committed
525
	MediaStream ms;
aymeric's avatar
aymeric committed
526
527
	MSFilter *source;
	MSFilter *pixconv;
528
	MSFilter *sizeconv;
aymeric's avatar
aymeric committed
529
530
	MSFilter *tee;
	MSFilter *output;
531
532
	MSFilter *tee2;
	MSFilter *jpegwriter;
533
	MSFilter *output2;
smorlat's avatar
smorlat committed
534
	MSVideoSize sent_vsize;
smorlat's avatar
smorlat committed
535
	int corner; /*for selfview*/
536
537
	VideoStreamRenderCallback rendercb;
	void *render_pointer;
538
539
	VideoStreamEventCallback eventcb;
	void *event_pointer;
540
	char *display_name;
541
542
	unsigned long window_id;
	unsigned long preview_window_id;
543
	VideoStreamDir dir;
544
	MSWebCam *cam;
545
	int device_orientation; /* warning: meaning of this variable depends on the platform (Android, iOS, ...) */
Ghislain MARY's avatar
Ghislain MARY committed
546
547
	bool_t use_preview_window;
	bool_t display_filter_auto_rotate_enabled;
548
549
	bool_t source_performs_encoding;
	bool_t output_performs_decoding;
550
	uint64_t last_reported_decoding_error_time;
aymeric's avatar
aymeric committed
551
552
553
};

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

555

556
MS2_PUBLIC VideoStream *video_stream_new(int loc_rtp_port, int loc_rtcp_port, bool_t use_ipv6);
557
MS2_PUBLIC VideoStream *video_stream_new_with_sessions(const MSMediaStreamSessions *sessions);
Simon Morlat's avatar
Simon Morlat committed
558
MS2_PUBLIC void video_stream_set_direction(VideoStream *vs, VideoStreamDir dir);
559
static inline void video_stream_enable_adaptive_bitrate_control(VideoStream *stream, bool_t enabled) {
Ghislain MARY's avatar
Ghislain MARY committed
560
561
	media_stream_enable_adaptive_bitrate_control(&stream->ms, enabled);
}
562
static inline void video_stream_enable_adaptive_jittcomp(VideoStream *stream, bool_t enabled) {
Ghislain MARY's avatar
Ghislain MARY committed
563
564
	media_stream_enable_adaptive_jittcomp(&stream->ms, enabled);
}
Simon Morlat's avatar
Simon Morlat committed
565
566
567
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);
568
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
569
		int payload, int jitt_comp, MSWebCam *device);
570
571
MS2_PUBLIC void video_stream_prepare_video(VideoStream *stream);
MS2_PUBLIC void video_stream_unprepare_video(VideoStream *stream);
572
573


Simon Morlat's avatar
Simon Morlat committed
574
MS2_PUBLIC void video_stream_set_relay_session_id(VideoStream *stream, const char *relay_session_id);
575
static inline void video_stream_set_rtcp_information(VideoStream *st, const char *cname, const char *tool) {
Ghislain MARY's avatar
Ghislain MARY committed
576
577
	media_stream_set_rtcp_information(&st->ms, cname, tool);
}
Simon Morlat's avatar
Simon Morlat committed
578
MS2_PUBLIC void video_stream_change_camera(VideoStream *stream, MSWebCam *cam);
579
580
/* 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
581
MS2_PUBLIC void video_stream_update_video_params(VideoStream *stream);
aymeric's avatar
aymeric committed
582
/*function to call periodically to handle various events */
Simon Morlat's avatar
Simon Morlat committed
583
MS2_PUBLIC void video_stream_iterate(VideoStream *stream);
584
585
586
587
588
589
590
591
592
593
594
595
596

/**
 * Ask the video stream to send a Full-Intra Request.
 * @param[in] stream The videostream object.
 */
MS2_PUBLIC void video_stream_send_fir(VideoStream *stream);

/**
 * Ask the video stream to send a Picture Loss Indication.
 * @param[in] stream The videostream object.
 */
MS2_PUBLIC void video_stream_send_pli(VideoStream *stream);

Ghislain MARY's avatar
Ghislain MARY committed
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
/**
 * Ask the video stream to send a Slice Loss Indication.
 * @param[in] stream The videostream object.
 * @param[in] first The address of the first lost macroblock.
 * @param[in] number The number of lost macroblocks.
 * @param[in] picture_id The six least significant bits of the picture ID.
 */
MS2_PUBLIC void video_stream_send_sli(VideoStream *stream, uint16_t first, uint16_t number, uint8_t picture_id);

/**
 * Ask the video stream to send a Reference Picture Selection Indication.
 * @param[in] stream The videostream object.
 * @param[in] bit_string A pointer to the variable length native RPSI bit string to include in the RTCP FB message.
 * @param[in] bit_string_len The length of the bit_string in bits.
 */
MS2_PUBLIC void video_stream_send_rpsi(VideoStream *stream, uint8_t *bit_string, uint16_t bit_string_len);

614
615
616
617
/**
 * Ask the video stream to generate a Video Fast Update (generally after receiving a Full-Intra Request.
 * @param[in] stream The videostream object.
 */
Simon Morlat's avatar
Simon Morlat committed
618
MS2_PUBLIC void video_stream_send_vfu(VideoStream *stream);
619

Simon Morlat's avatar
Simon Morlat committed
620
621
MS2_PUBLIC void video_stream_stop(VideoStream * stream);
MS2_PUBLIC void video_stream_set_sent_video_size(VideoStream *stream, MSVideoSize vsize);
622
623
624
625
626
627

/**
 * 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
628
MS2_PUBLIC MSVideoSize video_stream_get_sent_video_size(const VideoStream *stream);
629
630
631
632
633
634

/**
 * 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
635
MS2_PUBLIC MSVideoSize video_stream_get_received_video_size(const VideoStream *stream);
636

Simon Morlat's avatar
Simon Morlat committed
637
638
639
640
641
/**
 * 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
642
643
644
645
646
647
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);
648
MS2_PUBLIC void video_stream_set_device_rotation(VideoStream *stream, int orientation);
649
MS2_PUBLIC void video_stream_show_video(VideoStream *stream, bool_t show);
650

651
652
653
654
655
656
657
658
659
660
661
/**
 * @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);

662
/*provided for compatibility, use video_stream_set_direction() instead */
Simon Morlat's avatar
Simon Morlat committed
663
664
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,
665
				RtpProfile *profile, const char *addr, int port, int rtcp_port,
666
				int used_pt, int  jitt_comp, MSWebCam *device);
Simon Morlat's avatar
Simon Morlat committed
667
668
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
669

Guillaume Beraudo's avatar
Guillaume Beraudo committed
670
671
/* 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);
672

673
/* enable SRTP on the video stream */
jehan's avatar
jehan committed
674
static inline bool_t video_stream_enable_strp(VideoStream* stream, MSCryptoSuite suite, const char* snd_key, const char* rcv_key) {
Ghislain MARY's avatar
Ghislain MARY committed
675
676
677
	return media_stream_enable_srtp(&stream->ms, suite, snd_key, rcv_key);
}

678
679
/* 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);
680

681
/* retrieve RTP statistics*/
682
static inline void video_stream_get_local_rtp_stats(VideoStream *stream, rtp_stats_t *stats) {
Ghislain MARY's avatar
Ghislain MARY committed
683
684
	media_stream_get_local_rtp_stats(&stream->ms, stats);
}
685

686
static inline int video_stream_set_dscp(VideoStream *stream, int dscp) {
Ghislain MARY's avatar
Ghislain MARY committed
687
688
	return media_stream_set_dscp(&stream->ms, dscp);
}
Simon Morlat's avatar
Simon Morlat committed
689

690
691
692
693
694
695
696
697
698
699
700
701
702
703
/**
 * Ask the video stream whether a decoding error should be reported (eg. to send a VFU request).
 * @param[in] stream The VideoStream object.
 * @param[in] ms The minimum interval in milliseconds between to decoding error report.
 * @return TRUE if the decoding error should be reported, FALSE otherwise.
 */
MS2_PUBLIC bool_t video_stream_is_decoding_error_to_be_reported(VideoStream *stream, uint32_t ms);

/**
 * Tell the video stream that a decoding error has been reported.
 * @param[in] stream The VideoStream object.
 */
MS2_PUBLIC void video_stream_decoding_error_reported(VideoStream *stream);

704
705
706
707
/**
 * Small API to display a local preview window.
**/

Simon Morlat's avatar
Simon Morlat committed
708
709
typedef VideoStream VideoPreview;

Simon Morlat's avatar
Simon Morlat committed
710
MS2_PUBLIC VideoPreview * video_preview_new();
Simon Morlat's avatar
Simon Morlat committed
711
712
713
714
#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
715
716
MS2_PUBLIC void video_preview_start(VideoPreview *stream, MSWebCam *device);
MS2_PUBLIC void video_preview_stop(VideoPreview *stream);
aymeric's avatar
aymeric committed
717

718
719
720
721
/**
 * @}
**/

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

Guillaume Beraudo's avatar
Guillaume Beraudo committed
724

aymeric's avatar
aymeric committed
725
726
727
728
729
#ifdef __cplusplus
}
#endif

#endif