1 /*
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 
28 namespace webrtc {
29 
30 class InStream
31 {
32 public:
33     virtual int Read(void *buf,int len) = 0;
Rewind()34     virtual int Rewind() {return -1;}
~InStream()35     virtual ~InStream() {}
36 protected:
InStream()37     InStream() {}
38 };
39 
40 class OutStream
41 {
42 public:
43     virtual bool Write(const void *buf,int len) = 0;
Rewind()44     virtual int Rewind() {return -1;}
~OutStream()45     virtual ~OutStream() {}
46 protected:
OutStream()47     OutStream() {}
48 };
49 
50 enum 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 
74 enum 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
97 class TraceCallback
98 {
99 public:
100     virtual void Print(const TraceLevel level,
101                        const char *traceString,
102                        const int length) = 0;
103 protected:
~TraceCallback()104     virtual ~TraceCallback() {}
TraceCallback()105     TraceCallback() {}
106 };
107 
108 
109 enum 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 
121 enum ProcessingTypes
122 {
123     kPlaybackPerChannel = 0,
124     kPlaybackAllChannelsMixed,
125     kRecordingPerChannel,
126     kRecordingAllChannelsMixed
127 };
128 
129 // Encryption enums
130 enum CipherTypes
131 {
132     kCipherNull               = 0,
133     kCipherAes128CounterMode  = 1
134 };
135 
136 enum AuthenticationTypes
137 {
138     kAuthNull       = 0,
139     kAuthHmacSha1   = 3
140 };
141 
142 enum SecurityLevels
143 {
144     kNoProtection                    = 0,
145     kEncryption                      = 1,
146     kAuthentication                  = 2,
147     kEncryptionAndAuthentication     = 3
148 };
149 
150 class Encryption
151 {
152 public:
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 
181 protected:
~Encryption()182     virtual ~Encryption() {}
Encryption()183     Encryption() {}
184 };
185 
186 // External transport callback interface
187 class Transport
188 {
189 public:
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 
193 protected:
~Transport()194     virtual ~Transport() {}
Transport()195     Transport() {}
196 };
197 
198 // ==================================================================
199 // Voice specific types
200 // ==================================================================
201 
202 // Each codec supported can be described by this structure.
203 struct CodecInst
204 {
205     int pltype;
206     char plname[32];
207     int plfreq;
208     int pacsize;
209     int channels;
210     int rate;
211 };
212 
213 enum 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
225 enum {kRtpCsrcSize = 15}; // RFC 3550 page 13
226 
227 enum RTPDirections
228 {
229     kRtpIncoming = 0,
230     kRtpOutgoing
231 };
232 
233 enum PayloadFrequencies
234 {
235     kFreq8000Hz = 8000,
236     kFreq16000Hz = 16000,
237     kFreq32000Hz = 32000
238 };
239 
240 enum VadModes                 // degree of bandwidth reduction
241 {
242     kVadConventional = 0,      // lowest reduction
243     kVadAggressiveLow,
244     kVadAggressiveMid,
245     kVadAggressiveHigh         // highest reduction
246 };
247 
248 struct 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     // adding extra delay due to "peaky jitter"
255     bool jitterPeaksFound;
256     // loss rate (network + late) in percent (in Q14)
257     WebRtc_UWord16 currentPacketLossRate;
258     // late loss rate in percent (in Q14)
259     WebRtc_UWord16 currentDiscardRate;
260     // fraction (of original stream) of synthesized speech inserted through
261     // expansion (in Q14)
262     WebRtc_UWord16 currentExpandRate;
263     // fraction of synthesized speech inserted through pre-emptive expansion
264     // (in Q14)
265     WebRtc_UWord16 currentPreemptiveRate;
266     // fraction of data removed through acceleration (in Q14)
267     WebRtc_UWord16 currentAccelerateRate;
268     // clock-drift in parts-per-million (negative or positive)
269     int32_t clockDriftPPM;
270     // average packet waiting time in the jitter buffer (ms)
271     int meanWaitingTimeMs;
272     // median packet waiting time in the jitter buffer (ms)
273     int medianWaitingTimeMs;
274     // max packet waiting time in the jitter buffer (ms)
275     int maxWaitingTimeMs;
276 };
277 
278 typedef struct
279 {
280     int min;              // minumum
281     int max;              // maximum
282     int average;          // average
283 } StatVal;
284 
285 typedef struct           // All levels are reported in dBm0
286 {
287     StatVal speech_rx;   // long-term speech levels on receiving side
288     StatVal speech_tx;   // long-term speech levels on transmitting side
289     StatVal noise_rx;    // long-term noise/silence levels on receiving side
290     StatVal noise_tx;    // long-term noise/silence levels on transmitting side
291 } LevelStatistics;
292 
293 typedef struct        // All levels are reported in dB
294 {
295     StatVal erl;      // Echo Return Loss
296     StatVal erle;     // Echo Return Loss Enhancement
297     StatVal rerl;     // RERL = ERL + ERLE
298     // Echo suppression inside EC at the point just before its NLP
299     StatVal a_nlp;
300 } EchoStatistics;
301 
302 enum TelephoneEventDetectionMethods
303 {
304     kInBand = 0,
305     kOutOfBand = 1,
306     kInAndOutOfBand = 2
307 };
308 
309 enum NsModes    // type of Noise Suppression
310 {
311     kNsUnchanged = 0,   // previously set mode
312     kNsDefault,         // platform default
313     kNsConference,      // conferencing default
314     kNsLowSuppression,  // lowest suppression
315     kNsModerateSuppression,
316     kNsHighSuppression,
317     kNsVeryHighSuppression,     // highest suppression
318 };
319 
320 enum AgcModes                  // type of Automatic Gain Control
321 {
322     kAgcUnchanged = 0,        // previously set mode
323     kAgcDefault,              // platform default
324     // adaptive mode for use when analog volume control exists (e.g. for
325     // PC softphone)
326     kAgcAdaptiveAnalog,
327     // scaling takes place in the digital domain (e.g. for conference servers
328     // and embedded devices)
329     kAgcAdaptiveDigital,
330     // can be used on embedded devices where the the capture signal is level
331     // is predictable
332     kAgcFixedDigital
333 };
334 
335 // EC modes
336 enum EcModes                   // type of Echo Control
337 {
338     kEcUnchanged = 0,          // previously set mode
339     kEcDefault,                // platform default
340     kEcConference,             // conferencing default (aggressive AEC)
341     kEcAec,                    // Acoustic Echo Cancellation
342     kEcAecm,                   // AEC mobile
343 };
344 
345 // AECM modes
346 enum AecmModes                 // mode of AECM
347 {
348     kAecmQuietEarpieceOrHeadset = 0,
349                                // Quiet earpiece or headset use
350     kAecmEarpiece,             // most earpiece use
351     kAecmLoudEarpiece,         // Loud earpiece or quiet speakerphone use
352     kAecmSpeakerphone,         // most speakerphone use (default)
353     kAecmLoudSpeakerphone      // Loud speakerphone
354 };
355 
356 // AGC configuration
357 typedef struct
358 {
359     unsigned short targetLeveldBOv;
360     unsigned short digitalCompressionGaindB;
361     bool           limiterEnable;
362 } AgcConfig;                  // AGC configuration parameters
363 
364 enum StereoChannel
365 {
366     kStereoLeft = 0,
367     kStereoRight,
368     kStereoBoth
369 };
370 
371 // Audio device layers
372 enum AudioLayers
373 {
374     kAudioPlatformDefault = 0,
375     kAudioWindowsWave = 1,
376     kAudioWindowsCore = 2,
377     kAudioLinuxAlsa = 3,
378     kAudioLinuxPulse = 4
379 };
380 
381 enum NetEqModes             // NetEQ playout configurations
382 {
383     // Optimized trade-off between low delay and jitter robustness for two-way
384     // communication.
385     kNetEqDefault = 0,
386     // Improved jitter robustness at the cost of increased delay. Can be
387     // used in one-way communication.
388     kNetEqStreaming = 1,
389     // Optimzed for decodability of fax signals rather than for perceived audio
390     // quality.
391     kNetEqFax = 2,
392 };
393 
394 enum NetEqBgnModes          // NetEQ Background Noise (BGN) configurations
395 {
396     // BGN is always on and will be generated when the incoming RTP stream
397     // stops (default).
398     kBgnOn = 0,
399     // The BGN is faded to zero (complete silence) after a few seconds.
400     kBgnFade = 1,
401     // BGN is not used at all. Silence is produced after speech extrapolation
402     // has faded.
403     kBgnOff = 2,
404 };
405 
406 enum OnHoldModes            // On Hold direction
407 {
408     kHoldSendAndPlay = 0,    // Put both sending and playing in on-hold state.
409     kHoldSendOnly,           // Put only sending in on-hold state.
410     kHoldPlayOnly            // Put only playing in on-hold state.
411 };
412 
413 enum AmrMode
414 {
415     kRfc3267BwEfficient = 0,
416     kRfc3267OctetAligned = 1,
417     kRfc3267FileStorage = 2,
418 };
419 
420 // ==================================================================
421 // Video specific types
422 // ==================================================================
423 
424 // Raw video types
425 enum RawVideoType
426 {
427     kVideoI420     = 0,
428     kVideoYV12     = 1,
429     kVideoYUY2     = 2,
430     kVideoUYVY     = 3,
431     kVideoIYUV     = 4,
432     kVideoARGB     = 5,
433     kVideoRGB24    = 6,
434     kVideoRGB565   = 7,
435     kVideoARGB4444 = 8,
436     kVideoARGB1555 = 9,
437     kVideoMJPEG    = 10,
438     kVideoNV12     = 11,
439     kVideoNV21     = 12,
440     kVideoBGRA     = 13,
441     kVideoUnknown  = 99
442 };
443 
444 // Video codec
445 enum { kConfigParameterSize = 128};
446 enum { kPayloadNameSize = 32};
447 enum { kMaxSimulcastStreams = 4};
448 enum { kMaxTemporalStreams = 4};
449 
450 // H.263 specific
451 struct VideoCodecH263
452 {
453     char quality;
454 };
455 
456 // H.264 specific
457 enum H264Packetization
458 {
459     kH264SingleMode         = 0,
460     kH264NonInterleavedMode = 1
461 };
462 
463 enum VideoCodecComplexity
464 {
465     kComplexityNormal = 0,
466     kComplexityHigh    = 1,
467     kComplexityHigher  = 2,
468     kComplexityMax     = 3
469 };
470 
471 enum VideoCodecProfile
472 {
473     kProfileBase = 0x00,
474     kProfileMain = 0x01
475 };
476 
477 enum VP8ResilienceMode {
478   kResilienceOff,    // The stream produced by the encoder requires a
479                      // recovery frame (typically a key frame) to be
480                      // decodable after a packet loss.
481   kResilientStream,  // A stream produced by the encoder is resilient to
482                      // packet losses, but packets within a frame subsequent
483                      // to a loss can't be decoded.
484   kResilientFrames   // Same as kResilientStream but with added resilience
485                      // within a frame.
486 };
487 
488 struct VideoCodecH264
489 {
490     H264Packetization          packetization;
491     VideoCodecComplexity       complexity;
492     VideoCodecProfile          profile;
493     char                       level;
494     char                       quality;
495 
496     bool                       useFMO;
497 
498     unsigned char              configParameters[kConfigParameterSize];
499     unsigned char              configParametersSize;
500 };
501 
502 // VP8 specific
503 struct VideoCodecVP8
504 {
505     bool                 pictureLossIndicationOn;
506     bool                 feedbackModeOn;
507     VideoCodecComplexity complexity;
508     VP8ResilienceMode    resilience;
509     unsigned char        numberOfTemporalLayers;
510 };
511 
512 // MPEG-4 specific
513 struct VideoCodecMPEG4
514 {
515     unsigned char   configParameters[kConfigParameterSize];
516     unsigned char   configParametersSize;
517     char            level;
518 };
519 
520 // Unknown specific
521 struct VideoCodecGeneric
522 {
523 };
524 
525 // Video codec types
526 enum VideoCodecType
527 {
528     kVideoCodecH263,
529     kVideoCodecH264,
530     kVideoCodecVP8,
531     kVideoCodecMPEG4,
532     kVideoCodecI420,
533     kVideoCodecRED,
534     kVideoCodecULPFEC,
535     kVideoCodecUnknown
536 };
537 
538 union VideoCodecUnion
539 {
540     VideoCodecH263      H263;
541     VideoCodecH264      H264;
542     VideoCodecVP8       VP8;
543     VideoCodecMPEG4     MPEG4;
544     VideoCodecGeneric   Generic;
545 };
546 
547 /*
548 *  Simulcast is when the same stream is encoded multiple times with different
549 *  settings such as resolution.
550 */
551 struct SimulcastStream
552 {
553     unsigned short      width;
554     unsigned short      height;
555     unsigned char       numberOfTemporalLayers;
556     unsigned int        maxBitrate;
557     unsigned int        qpMax; // minimum quality
558 };
559 
560 // Common video codec properties
561 struct VideoCodec
562 {
563     VideoCodecType      codecType;
564     char                plName[kPayloadNameSize];
565     unsigned char       plType;
566 
567     unsigned short      width;
568     unsigned short      height;
569 
570     unsigned int        startBitrate;
571     unsigned int        maxBitrate;
572     unsigned int        minBitrate;
573     unsigned char       maxFramerate;
574 
575     VideoCodecUnion     codecSpecific;
576 
577     unsigned int        qpMax;
578     unsigned char       numberOfSimulcastStreams;
579     SimulcastStream     simulcastStream[kMaxSimulcastStreams];
580 };
581 }  // namespace webrtc
582 #endif  // WEBRTC_COMMON_TYPES_H
583