Home | History | Annotate | Download | only in src
      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;
     34     virtual int Rewind() {return -1;}
     35     virtual ~InStream() {}
     36 protected:
     37     InStream() {}
     38 };
     39 
     40 class OutStream
     41 {
     42 public:
     43     virtual bool Write(const void *buf,int len) = 0;
     44     virtual int Rewind() {return -1;}
     45     virtual ~OutStream() {}
     46 protected:
     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:
    104     virtual ~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:
    182     virtual ~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:
    194     virtual ~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     // 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 
    268 struct 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 
    320 typedef struct
    321 {
    322     int min;              // minumum
    323     int max;              // maximum
    324     int average;          // average
    325 } StatVal;
    326 
    327 typedef 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 
    335 typedef 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 
    344 enum TelephoneEventDetectionMethods
    345 {
    346     kInBand = 0,
    347     kOutOfBand = 1,
    348     kInAndOutOfBand = 2
    349 };
    350 
    351 enum 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 
    362 enum 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
    378 enum 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
    388 enum 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
    399 typedef struct
    400 {
    401     unsigned short targetLeveldBOv;
    402     unsigned short digitalCompressionGaindB;
    403     bool           limiterEnable;
    404 } AgcConfig;                  // AGC configuration parameters
    405 
    406 enum StereoChannel
    407 {
    408     kStereoLeft = 0,
    409     kStereoRight,
    410     kStereoBoth
    411 };
    412 
    413 // Audio device layers
    414 enum AudioLayers
    415 {
    416     kAudioPlatformDefault = 0,
    417     kAudioWindowsWave = 1,
    418     kAudioWindowsCore = 2,
    419     kAudioLinuxAlsa = 3,
    420     kAudioLinuxPulse = 4
    421 };
    422 
    423 enum 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 
    436 enum 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 
    448 enum 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 
    455 enum AmrMode
    456 {
    457     kRfc3267BwEfficient = 0,
    458     kRfc3267OctetAligned = 1,
    459     kRfc3267FileStorage = 2,
    460 };
    461 
    462 // ==================================================================
    463 // Video specific types
    464 // ==================================================================
    465 
    466 // Raw video types
    467 enum 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
    486 enum { kConfigParameterSize = 128};
    487 enum { kPayloadNameSize = 32};
    488 
    489 // H.263 specific
    490 struct VideoCodecH263
    491 {
    492     char quality;
    493 };
    494 
    495 // H.264 specific
    496 enum H264Packetization
    497 {
    498     kH264SingleMode         = 0,
    499     kH264NonInterleavedMode = 1
    500 };
    501 
    502 enum VideoCodecComplexity
    503 {
    504     kComplexityNormal = 0,
    505     kComplexityHigh    = 1,
    506     kComplexityHigher  = 2,
    507     kComplexityMax     = 3
    508 };
    509 
    510 enum VideoCodecProfile
    511 {
    512     kProfileBase = 0x00,
    513     kProfileMain = 0x01
    514 };
    515 
    516 struct 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
    531 struct VideoCodecVP8
    532 {
    533     bool                       pictureLossIndicationOn;
    534     bool                       feedbackModeOn;
    535     VideoCodecComplexity       complexity;
    536 };
    537 
    538 // MPEG-4 specific
    539 struct VideoCodecMPEG4
    540 {
    541     unsigned char   configParameters[kConfigParameterSize];
    542     unsigned char   configParametersSize;
    543     char            level;
    544 };
    545 
    546 // Unknown specific
    547 struct VideoCodecGeneric
    548 {
    549 };
    550 
    551 // Video codec types
    552 enum VideoCodecType
    553 {
    554     kVideoCodecH263,
    555     kVideoCodecH264,
    556     kVideoCodecVP8,
    557     kVideoCodecMPEG4,
    558     kVideoCodecI420,
    559     kVideoCodecRED,
    560     kVideoCodecULPFEC,
    561     kVideoCodecUnknown
    562 };
    563 
    564 union VideoCodecUnion
    565 {
    566     VideoCodecH263      H263;
    567     VideoCodecH264      H264;
    568     VideoCodecVP8       VP8;
    569     VideoCodecMPEG4     MPEG4;
    570     VideoCodecGeneric   Generic;
    571 };
    572 
    573 // Common video codec properties
    574 struct 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
    596