blob: 8b0b8a59c1c91abad6c1316fb1352df7066bf66e [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_COMMON_TYPES_H
12#define WEBRTC_COMMON_TYPES_H
13
14#include "typedefs.h"
15
16#ifdef WEBRTC_EXPORT
17 #define WEBRTC_DLLEXPORT _declspec(dllexport)
18#elif WEBRTC_DLL
19 #define WEBRTC_DLLEXPORT _declspec(dllimport)
20#else
21 #define WEBRTC_DLLEXPORT
22#endif
23
24#ifndef NULL
25 #define NULL 0
26#endif
27
28namespace webrtc {
29
30class InStream
31{
32public:
33 virtual int Read(void *buf,int len) = 0;
34 virtual int Rewind() {return -1;}
35 virtual ~InStream() {}
36protected:
37 InStream() {}
38};
39
40class OutStream
41{
42public:
43 virtual bool Write(const void *buf,int len) = 0;
44 virtual int Rewind() {return -1;}
45 virtual ~OutStream() {}
46protected:
47 OutStream() {}
48};
49
50enum TraceModule
51{
52 // not a module, triggered from the engine code
53 kTraceVoice = 0x0001,
54 // not a module, triggered from the engine code
55 kTraceVideo = 0x0002,
56 // not a module, triggered from the utility code
57 kTraceUtility = 0x0003,
58 kTraceRtpRtcp = 0x0004,
59 kTraceTransport = 0x0005,
60 kTraceSrtp = 0x0006,
61 kTraceAudioCoding = 0x0007,
62 kTraceAudioMixerServer = 0x0008,
63 kTraceAudioMixerClient = 0x0009,
64 kTraceFile = 0x000a,
65 kTraceAudioProcessing = 0x000b,
66 kTraceVideoCoding = 0x0010,
67 kTraceVideoMixer = 0x0011,
68 kTraceAudioDevice = 0x0012,
69 kTraceVideoRenderer = 0x0014,
70 kTraceVideoCapture = 0x0015,
71 kTraceVideoPreocessing = 0x0016
72};
73
74enum TraceLevel
75{
76 kTraceNone = 0x0000, // no trace
77 kTraceStateInfo = 0x0001,
78 kTraceWarning = 0x0002,
79 kTraceError = 0x0004,
80 kTraceCritical = 0x0008,
81 kTraceApiCall = 0x0010,
82 kTraceDefault = 0x00ff,
83
84 kTraceModuleCall = 0x0020,
85 kTraceMemory = 0x0100, // memory info
86 kTraceTimer = 0x0200, // timing info
87 kTraceStream = 0x0400, // "continuous" stream of data
88
89 // used for debug purposes
90 kTraceDebug = 0x0800, // debug
91 kTraceInfo = 0x1000, // debug info
92
93 kTraceAll = 0xffff
94};
95
96// External Trace API
97class TraceCallback
98{
99public:
100 virtual void Print(const TraceLevel level,
101 const char *traceString,
102 const int length) = 0;
103protected:
104 virtual ~TraceCallback() {}
105 TraceCallback() {}
106};
107
108
109enum FileFormats
110{
111 kFileFormatWavFile = 1,
112 kFileFormatCompressedFile = 2,
113 kFileFormatAviFile = 3,
114 kFileFormatPreencodedFile = 4,
115 kFileFormatPcm16kHzFile = 7,
116 kFileFormatPcm8kHzFile = 8,
117 kFileFormatPcm32kHzFile = 9
118};
119
120
121enum ProcessingTypes
122{
123 kPlaybackPerChannel = 0,
124 kPlaybackAllChannelsMixed,
125 kRecordingPerChannel,
126 kRecordingAllChannelsMixed
127};
128
129// Encryption enums
130enum CipherTypes
131{
132 kCipherNull = 0,
133 kCipherAes128CounterMode = 1
134};
135
136enum AuthenticationTypes
137{
138 kAuthNull = 0,
139 kAuthHmacSha1 = 3
140};
141
142enum SecurityLevels
143{
144 kNoProtection = 0,
145 kEncryption = 1,
146 kAuthentication = 2,
147 kEncryptionAndAuthentication = 3
148};
149
150class Encryption
151{
152public:
153 virtual void encrypt(
154 int channel_no,
155 unsigned char* in_data,
156 unsigned char* out_data,
157 int bytes_in,
158 int* bytes_out) = 0;
159
160 virtual void decrypt(
161 int channel_no,
162 unsigned char* in_data,
163 unsigned char* out_data,
164 int bytes_in,
165 int* bytes_out) = 0;
166
167 virtual void encrypt_rtcp(
168 int channel_no,
169 unsigned char* in_data,
170 unsigned char* out_data,
171 int bytes_in,
172 int* bytes_out) = 0;
173
174 virtual void decrypt_rtcp(
175 int channel_no,
176 unsigned char* in_data,
177 unsigned char* out_data,
178 int bytes_in,
179 int* bytes_out) = 0;
180
181protected:
182 virtual ~Encryption() {}
183 Encryption() {}
184};
185
186// External transport callback interface
187class Transport
188{
189public:
190 virtual int SendPacket(int channel, const void *data, int len) = 0;
191 virtual int SendRTCPPacket(int channel, const void *data, int len) = 0;
192
193protected:
194 virtual ~Transport() {}
195 Transport() {}
196};
197
198// ==================================================================
199// Voice specific types
200// ==================================================================
201
202// Each codec supported can be described by this structure.
203struct CodecInst
204{
205 int pltype;
206 char plname[32];
207 int plfreq;
208 int pacsize;
209 int channels;
210 int rate;
211};
212
213enum FrameType
214{
215 kFrameEmpty = 0,
216 kAudioFrameSpeech = 1,
217 kAudioFrameCN = 2,
218 kVideoFrameKey = 3, // independent frame
219 kVideoFrameDelta = 4, // depends on the previus frame
220 kVideoFrameGolden = 5, // depends on a old known previus frame
221 kVideoFrameAltRef = 6
222};
223
224// RTP
225enum {kRtpCsrcSize = 15}; // RFC 3550 page 13
226
227enum RTPDirections
228{
229 kRtpIncoming = 0,
230 kRtpOutgoing
231};
232
233enum PayloadFrequencies
234{
235 kFreq8000Hz = 8000,
236 kFreq16000Hz = 16000,
237 kFreq32000Hz = 32000
238};
239
240enum VadModes // degree of bandwidth reduction
241{
242 kVadConventional = 0, // lowest reduction
243 kVadAggressiveLow,
244 kVadAggressiveMid,
245 kVadAggressiveHigh // highest reduction
246};
247
248struct NetworkStatistics // NETEQ statistics
249{
250 // current jitter buffer size in ms
251 WebRtc_UWord16 currentBufferSize;
252 // preferred (optimal) buffer size in ms
253 WebRtc_UWord16 preferredBufferSize;
254 // loss rate (network + late) in percent (in Q14)
255 WebRtc_UWord16 currentPacketLossRate;
256 // late loss rate in percent (in Q14)
257 WebRtc_UWord16 currentDiscardRate;
258 // fraction (of original stream) of synthesized speech inserted through
259 // expansion (in Q14)
260 WebRtc_UWord16 currentExpandRate;
261 // fraction of synthesized speech inserted through pre-emptive expansion
262 // (in Q14)
263 WebRtc_UWord16 currentPreemptiveRate;
264 // fraction of data removed through acceleration (in Q14)
265 WebRtc_UWord16 currentAccelerateRate;
266};
267
268struct JitterStatistics
269{
270 // smallest Jitter Buffer size during call in ms
271 WebRtc_UWord32 jbMinSize;
272 // largest Jitter Buffer size during call in ms
273 WebRtc_UWord32 jbMaxSize;
274 // the average JB size, measured over time - ms
275 WebRtc_UWord32 jbAvgSize;
276 // number of times the Jitter Buffer changed (using Accelerate or
277 // Pre-emptive Expand)
278 WebRtc_UWord32 jbChangeCount;
279 // amount (in ms) of audio data received late
280 WebRtc_UWord32 lateLossMs;
281 // milliseconds removed to reduce jitter buffer size
282 WebRtc_UWord32 accelerateMs;
283 // milliseconds discarded through buffer flushing
284 WebRtc_UWord32 flushedMs;
285 // milliseconds of generated silence
286 WebRtc_UWord32 generatedSilentMs;
287 // milliseconds of synthetic audio data (non-background noise)
288 WebRtc_UWord32 interpolatedVoiceMs;
289 // milliseconds of synthetic audio data (background noise level)
290 WebRtc_UWord32 interpolatedSilentMs;
291 // count of tiny expansions in output audio
292 WebRtc_UWord32 countExpandMoreThan120ms;
293 // count of small expansions in output audio
294 WebRtc_UWord32 countExpandMoreThan250ms;
295 // count of medium expansions in output audio
296 WebRtc_UWord32 countExpandMoreThan500ms;
297 // count of long expansions in output audio
298 WebRtc_UWord32 countExpandMoreThan2000ms;
299 // duration of longest audio drop-out
300 WebRtc_UWord32 longestExpandDurationMs;
301 // count of times we got small network outage (inter-arrival time in
302 // [500, 1000) ms)
303 WebRtc_UWord32 countIAT500ms;
304 // count of times we got medium network outage (inter-arrival time in
305 // [1000, 2000) ms)
306 WebRtc_UWord32 countIAT1000ms;
307 // count of times we got large network outage (inter-arrival time >=
308 // 2000 ms)
309 WebRtc_UWord32 countIAT2000ms;
310 // longest packet inter-arrival time in ms
311 WebRtc_UWord32 longestIATms;
312 // min time incoming Packet "waited" to be played
313 WebRtc_UWord32 minPacketDelayMs;
314 // max time incoming Packet "waited" to be played
315 WebRtc_UWord32 maxPacketDelayMs;
316 // avg time incoming Packet "waited" to be played
317 WebRtc_UWord32 avgPacketDelayMs;
318};
319
320typedef struct
321{
322 int min; // minumum
323 int max; // maximum
324 int average; // average
325} StatVal;
326
327typedef struct // All levels are reported in dBm0
328{
329 StatVal speech_rx; // long-term speech levels on receiving side
330 StatVal speech_tx; // long-term speech levels on transmitting side
331 StatVal noise_rx; // long-term noise/silence levels on receiving side
332 StatVal noise_tx; // long-term noise/silence levels on transmitting side
333} LevelStatistics;
334
335typedef struct // All levels are reported in dB
336{
337 StatVal erl; // Echo Return Loss
338 StatVal erle; // Echo Return Loss Enhancement
339 StatVal rerl; // RERL = ERL + ERLE
340 // Echo suppression inside EC at the point just before its NLP
341 StatVal a_nlp;
342} EchoStatistics;
343
344enum TelephoneEventDetectionMethods
345{
346 kInBand = 0,
347 kOutOfBand = 1,
348 kInAndOutOfBand = 2
349};
350
351enum NsModes // type of Noise Suppression
352{
353 kNsUnchanged = 0, // previously set mode
354 kNsDefault, // platform default
355 kNsConference, // conferencing default
356 kNsLowSuppression, // lowest suppression
357 kNsModerateSuppression,
358 kNsHighSuppression,
359 kNsVeryHighSuppression, // highest suppression
360};
361
362enum AgcModes // type of Automatic Gain Control
363{
364 kAgcUnchanged = 0, // previously set mode
365 kAgcDefault, // platform default
366 // adaptive mode for use when analog volume control exists (e.g. for
367 // PC softphone)
368 kAgcAdaptiveAnalog,
369 // scaling takes place in the digital domain (e.g. for conference servers
370 // and embedded devices)
371 kAgcAdaptiveDigital,
372 // can be used on embedded devices where the the capture signal is level
373 // is predictable
374 kAgcFixedDigital
375};
376
377// EC modes
378enum EcModes // type of Echo Control
379{
380 kEcUnchanged = 0, // previously set mode
381 kEcDefault, // platform default
382 kEcConference, // conferencing default (aggressive AEC)
383 kEcAec, // Acoustic Echo Cancellation
384 kEcAecm, // AEC mobile
385};
386
387// AECM modes
388enum AecmModes // mode of AECM
389{
390 kAecmQuietEarpieceOrHeadset = 0,
391 // Quiet earpiece or headset use
392 kAecmEarpiece, // most earpiece use
393 kAecmLoudEarpiece, // Loud earpiece or quiet speakerphone use
394 kAecmSpeakerphone, // most speakerphone use (default)
395 kAecmLoudSpeakerphone // Loud speakerphone
396};
397
398// AGC configuration
399typedef struct
400{
401 unsigned short targetLeveldBOv;
402 unsigned short digitalCompressionGaindB;
403 bool limiterEnable;
404} AgcConfig; // AGC configuration parameters
405
406enum StereoChannel
407{
408 kStereoLeft = 0,
409 kStereoRight,
410 kStereoBoth
411};
412
413// Audio device layers
414enum AudioLayers
415{
416 kAudioPlatformDefault = 0,
417 kAudioWindowsWave = 1,
418 kAudioWindowsCore = 2,
419 kAudioLinuxAlsa = 3,
420 kAudioLinuxPulse = 4
421};
422
423enum NetEqModes // NetEQ playout configurations
424{
425 // Optimized trade-off between low delay and jitter robustness for two-way
426 // communication.
427 kNetEqDefault = 0,
428 // Improved jitter robustness at the cost of increased delay. Can be
429 // used in one-way communication.
430 kNetEqStreaming = 1,
431 // Optimzed for decodability of fax signals rather than for perceived audio
432 // quality.
433 kNetEqFax = 2,
434};
435
436enum NetEqBgnModes // NetEQ Background Noise (BGN) configurations
437{
438 // BGN is always on and will be generated when the incoming RTP stream
439 // stops (default).
440 kBgnOn = 0,
441 // The BGN is faded to zero (complete silence) after a few seconds.
442 kBgnFade = 1,
443 // BGN is not used at all. Silence is produced after speech extrapolation
444 // has faded.
445 kBgnOff = 2,
446};
447
448enum OnHoldModes // On Hold direction
449{
450 kHoldSendAndPlay = 0, // Put both sending and playing in on-hold state.
451 kHoldSendOnly, // Put only sending in on-hold state.
452 kHoldPlayOnly // Put only playing in on-hold state.
453};
454
455enum AmrMode
456{
457 kRfc3267BwEfficient = 0,
458 kRfc3267OctetAligned = 1,
459 kRfc3267FileStorage = 2,
460};
461
462// ==================================================================
463// Video specific types
464// ==================================================================
465
466// Raw video types
467enum RawVideoType
468{
469 kVideoI420 = 0,
470 kVideoYV12 = 1,
471 kVideoYUY2 = 2,
472 kVideoUYVY = 3,
473 kVideoIYUV = 4,
474 kVideoARGB = 5,
475 kVideoRGB24 = 6,
476 kVideoRGB565 = 7,
477 kVideoARGB4444 = 8,
478 kVideoARGB1555 = 9,
479 kVideoMJPEG = 10,
480 kVideoNV12 = 11,
481 kVideoNV21 = 12,
482 kVideoUnknown = 99
483};
484
485// Video codec
486enum { kConfigParameterSize = 128};
487enum { kPayloadNameSize = 32};
488
489// H.263 specific
490struct VideoCodecH263
491{
492 char quality;
493};
494
495// H.264 specific
496enum H264Packetization
497{
498 kH264SingleMode = 0,
499 kH264NonInterleavedMode = 1
500};
501
502enum VideoCodecComplexity
503{
504 kComplexityNormal = 0,
505 kComplexityHigh = 1,
506 kComplexityHigher = 2,
507 kComplexityMax = 3
508};
509
510enum VideoCodecProfile
511{
512 kProfileBase = 0x00,
513 kProfileMain = 0x01
514};
515
516struct VideoCodecH264
517{
518 H264Packetization packetization;
519 VideoCodecComplexity complexity;
520 VideoCodecProfile profile;
521 char level;
522 char quality;
523
524 bool useFMO;
525
526 unsigned char configParameters[kConfigParameterSize];
527 unsigned char configParametersSize;
528};
529
530// VP8 specific
531struct VideoCodecVP8
532{
533 bool pictureLossIndicationOn;
534 bool feedbackModeOn;
535 VideoCodecComplexity complexity;
536};
537
538// MPEG-4 specific
539struct VideoCodecMPEG4
540{
541 unsigned char configParameters[kConfigParameterSize];
542 unsigned char configParametersSize;
543 char level;
544};
545
546// Unknown specific
547struct VideoCodecGeneric
548{
549};
550
551// Video codec types
552enum VideoCodecType
553{
554 kVideoCodecH263,
555 kVideoCodecH264,
556 kVideoCodecVP8,
557 kVideoCodecMPEG4,
558 kVideoCodecI420,
559 kVideoCodecRED,
560 kVideoCodecULPFEC,
561 kVideoCodecUnknown
562};
563
564union VideoCodecUnion
565{
566 VideoCodecH263 H263;
567 VideoCodecH264 H264;
568 VideoCodecVP8 VP8;
569 VideoCodecMPEG4 MPEG4;
570 VideoCodecGeneric Generic;
571};
572
573// Common video codec properties
574struct VideoCodec
575{
576 VideoCodecType codecType;
577 char plName[kPayloadNameSize];
578 unsigned char plType;
579
580 unsigned short width;
581 unsigned short height;
582
583 unsigned int startBitrate;
584 unsigned int maxBitrate;
585 unsigned int minBitrate;
586 unsigned char maxFramerate;
587
588 VideoCodecUnion codecSpecific;
589
590 unsigned int qpMax;
591};
592
593} // namespace webrtc
594
595#endif // WEBRTC_COMMON_TYPES_H