Home | History | Annotate | Download | only in webrtc
      1 /*
      2  *  Copyright (c) 2012 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 <stddef.h>
     15 #include <string.h>
     16 
     17 #include <string>
     18 #include <vector>
     19 
     20 #include "webrtc/typedefs.h"
     21 
     22 #if defined(_MSC_VER)
     23 // Disable "new behavior: elements of array will be default initialized"
     24 // warning. Affects OverUseDetectorOptions.
     25 #pragma warning(disable:4351)
     26 #endif
     27 
     28 #ifdef WEBRTC_EXPORT
     29 #define WEBRTC_DLLEXPORT _declspec(dllexport)
     30 #elif WEBRTC_DLL
     31 #define WEBRTC_DLLEXPORT _declspec(dllimport)
     32 #else
     33 #define WEBRTC_DLLEXPORT
     34 #endif
     35 
     36 #ifndef NULL
     37 #define NULL 0
     38 #endif
     39 
     40 #define RTP_PAYLOAD_NAME_SIZE 32
     41 
     42 #if defined(WEBRTC_WIN) || defined(WIN32)
     43 // Compares two strings without regard to case.
     44 #define STR_CASE_CMP(s1, s2) ::_stricmp(s1, s2)
     45 // Compares characters of two strings without regard to case.
     46 #define STR_NCASE_CMP(s1, s2, n) ::_strnicmp(s1, s2, n)
     47 #else
     48 #define STR_CASE_CMP(s1, s2) ::strcasecmp(s1, s2)
     49 #define STR_NCASE_CMP(s1, s2, n) ::strncasecmp(s1, s2, n)
     50 #endif
     51 
     52 namespace webrtc {
     53 
     54 class Config;
     55 
     56 class InStream
     57 {
     58 public:
     59     virtual int Read(void *buf,int len) = 0;
     60     virtual int Rewind() {return -1;}
     61     virtual ~InStream() {}
     62 protected:
     63     InStream() {}
     64 };
     65 
     66 class OutStream
     67 {
     68 public:
     69     virtual bool Write(const void *buf,int len) = 0;
     70     virtual int Rewind() {return -1;}
     71     virtual ~OutStream() {}
     72 protected:
     73     OutStream() {}
     74 };
     75 
     76 enum TraceModule
     77 {
     78     kTraceUndefined              = 0,
     79     // not a module, triggered from the engine code
     80     kTraceVoice                  = 0x0001,
     81     // not a module, triggered from the engine code
     82     kTraceVideo                  = 0x0002,
     83     // not a module, triggered from the utility code
     84     kTraceUtility                = 0x0003,
     85     kTraceRtpRtcp                = 0x0004,
     86     kTraceTransport              = 0x0005,
     87     kTraceSrtp                   = 0x0006,
     88     kTraceAudioCoding            = 0x0007,
     89     kTraceAudioMixerServer       = 0x0008,
     90     kTraceAudioMixerClient       = 0x0009,
     91     kTraceFile                   = 0x000a,
     92     kTraceAudioProcessing        = 0x000b,
     93     kTraceVideoCoding            = 0x0010,
     94     kTraceVideoMixer             = 0x0011,
     95     kTraceAudioDevice            = 0x0012,
     96     kTraceVideoRenderer          = 0x0014,
     97     kTraceVideoCapture           = 0x0015,
     98     kTraceRemoteBitrateEstimator = 0x0017,
     99 };
    100 
    101 enum TraceLevel
    102 {
    103     kTraceNone               = 0x0000,    // no trace
    104     kTraceStateInfo          = 0x0001,
    105     kTraceWarning            = 0x0002,
    106     kTraceError              = 0x0004,
    107     kTraceCritical           = 0x0008,
    108     kTraceApiCall            = 0x0010,
    109     kTraceDefault            = 0x00ff,
    110 
    111     kTraceModuleCall         = 0x0020,
    112     kTraceMemory             = 0x0100,   // memory info
    113     kTraceTimer              = 0x0200,   // timing info
    114     kTraceStream             = 0x0400,   // "continuous" stream of data
    115 
    116     // used for debug purposes
    117     kTraceDebug              = 0x0800,  // debug
    118     kTraceInfo               = 0x1000,  // debug info
    119 
    120     // Non-verbose level used by LS_INFO of logging.h. Do not use directly.
    121     kTraceTerseInfo          = 0x2000,
    122 
    123     kTraceAll                = 0xffff
    124 };
    125 
    126 // External Trace API
    127 class TraceCallback {
    128  public:
    129   virtual void Print(TraceLevel level, const char* message, int length) = 0;
    130 
    131  protected:
    132   virtual ~TraceCallback() {}
    133   TraceCallback() {}
    134 };
    135 
    136 enum FileFormats
    137 {
    138     kFileFormatWavFile        = 1,
    139     kFileFormatCompressedFile = 2,
    140     kFileFormatAviFile        = 3,
    141     kFileFormatPreencodedFile = 4,
    142     kFileFormatPcm16kHzFile   = 7,
    143     kFileFormatPcm8kHzFile    = 8,
    144     kFileFormatPcm32kHzFile   = 9
    145 };
    146 
    147 enum ProcessingTypes
    148 {
    149     kPlaybackPerChannel = 0,
    150     kPlaybackAllChannelsMixed,
    151     kRecordingPerChannel,
    152     kRecordingAllChannelsMixed,
    153     kRecordingPreprocessing
    154 };
    155 
    156 enum FrameType
    157 {
    158     kFrameEmpty            = 0,
    159     kAudioFrameSpeech      = 1,
    160     kAudioFrameCN          = 2,
    161     kVideoFrameKey         = 3,    // independent frame
    162     kVideoFrameDelta       = 4,    // depends on the previus frame
    163 };
    164 
    165 // External transport callback interface
    166 class Transport
    167 {
    168 public:
    169     virtual int SendPacket(int channel, const void *data, int len) = 0;
    170     virtual int SendRTCPPacket(int channel, const void *data, int len) = 0;
    171 
    172 protected:
    173     virtual ~Transport() {}
    174     Transport() {}
    175 };
    176 
    177 // Statistics for an RTCP channel
    178 struct RtcpStatistics {
    179   RtcpStatistics()
    180     : fraction_lost(0),
    181       cumulative_lost(0),
    182       extended_max_sequence_number(0),
    183       jitter(0) {}
    184 
    185   uint8_t fraction_lost;
    186   uint32_t cumulative_lost;
    187   uint32_t extended_max_sequence_number;
    188   uint32_t jitter;
    189 };
    190 
    191 // Callback, called whenever a new rtcp report block is transmitted.
    192 class RtcpStatisticsCallback {
    193  public:
    194   virtual ~RtcpStatisticsCallback() {}
    195 
    196   virtual void StatisticsUpdated(const RtcpStatistics& statistics,
    197                                  uint32_t ssrc) = 0;
    198 };
    199 
    200 // Statistics for RTCP packet types.
    201 struct RtcpPacketTypeCounter {
    202   RtcpPacketTypeCounter()
    203     : nack_packets(0),
    204       fir_packets(0),
    205       pli_packets(0) {}
    206 
    207   void Add(const RtcpPacketTypeCounter& other) {
    208     nack_packets += other.nack_packets;
    209     fir_packets += other.fir_packets;
    210     pli_packets += other.pli_packets;
    211   }
    212 
    213   uint32_t nack_packets;
    214   uint32_t fir_packets;
    215   uint32_t pli_packets;
    216 };
    217 
    218 // Data usage statistics for a (rtp) stream
    219 struct StreamDataCounters {
    220   StreamDataCounters()
    221    : bytes(0),
    222      header_bytes(0),
    223      padding_bytes(0),
    224      packets(0),
    225      retransmitted_packets(0),
    226      fec_packets(0) {}
    227 
    228   // TODO(pbos): Rename bytes -> media_bytes.
    229   uint32_t bytes;  // Payload bytes, excluding RTP headers and padding.
    230   uint32_t header_bytes;  // Number of bytes used by RTP headers.
    231   uint32_t padding_bytes;  // Number of padding bytes.
    232   uint32_t packets;  // Number of packets.
    233   uint32_t retransmitted_packets;  // Number of retransmitted packets.
    234   uint32_t fec_packets;  // Number of redundancy packets.
    235 };
    236 
    237 // Callback, called whenever byte/packet counts have been updated.
    238 class StreamDataCountersCallback {
    239  public:
    240   virtual ~StreamDataCountersCallback() {}
    241 
    242   virtual void DataCountersUpdated(const StreamDataCounters& counters,
    243                                    uint32_t ssrc) = 0;
    244 };
    245 
    246 // Rate statistics for a stream
    247 struct BitrateStatistics {
    248   BitrateStatistics() : bitrate_bps(0), packet_rate(0), timestamp_ms(0) {}
    249 
    250   uint32_t bitrate_bps;   // Bitrate in bits per second.
    251   uint32_t packet_rate;   // Packet rate in packets per second.
    252   uint64_t timestamp_ms;  // Ntp timestamp in ms at time of rate estimation.
    253 };
    254 
    255 // Callback, used to notify an observer whenever new rates have been estimated.
    256 class BitrateStatisticsObserver {
    257  public:
    258   virtual ~BitrateStatisticsObserver() {}
    259 
    260   virtual void Notify(const BitrateStatistics& stats, uint32_t ssrc) = 0;
    261 };
    262 
    263 // Callback, used to notify an observer whenever frame counts have been updated
    264 class FrameCountObserver {
    265  public:
    266   virtual ~FrameCountObserver() {}
    267   virtual void FrameCountUpdated(FrameType frame_type,
    268                                  uint32_t frame_count,
    269                                  const unsigned int ssrc) = 0;
    270 };
    271 
    272 // Callback, used to notify an observer whenever the send-side delay is updated.
    273 class SendSideDelayObserver {
    274  public:
    275   virtual ~SendSideDelayObserver() {}
    276   virtual void SendSideDelayUpdated(int avg_delay_ms,
    277                                     int max_delay_ms,
    278                                     uint32_t ssrc) = 0;
    279 };
    280 
    281 // ==================================================================
    282 // Voice specific types
    283 // ==================================================================
    284 
    285 // Each codec supported can be described by this structure.
    286 struct CodecInst {
    287   int pltype;
    288   char plname[RTP_PAYLOAD_NAME_SIZE];
    289   int plfreq;
    290   int pacsize;
    291   int channels;
    292   int rate;  // bits/sec unlike {start,min,max}Bitrate elsewhere in this file!
    293 
    294   bool operator==(const CodecInst& other) const {
    295     return pltype == other.pltype &&
    296            (STR_CASE_CMP(plname, other.plname) == 0) &&
    297            plfreq == other.plfreq &&
    298            pacsize == other.pacsize &&
    299            channels == other.channels &&
    300            rate == other.rate;
    301   }
    302 
    303   bool operator!=(const CodecInst& other) const {
    304     return !(*this == other);
    305   }
    306 };
    307 
    308 // RTP
    309 enum {kRtpCsrcSize = 15}; // RFC 3550 page 13
    310 
    311 enum RTPDirections
    312 {
    313     kRtpIncoming = 0,
    314     kRtpOutgoing
    315 };
    316 
    317 enum PayloadFrequencies
    318 {
    319     kFreq8000Hz = 8000,
    320     kFreq16000Hz = 16000,
    321     kFreq32000Hz = 32000
    322 };
    323 
    324 enum VadModes                 // degree of bandwidth reduction
    325 {
    326     kVadConventional = 0,      // lowest reduction
    327     kVadAggressiveLow,
    328     kVadAggressiveMid,
    329     kVadAggressiveHigh         // highest reduction
    330 };
    331 
    332 struct NetworkStatistics           // NETEQ statistics
    333 {
    334     // current jitter buffer size in ms
    335     uint16_t currentBufferSize;
    336     // preferred (optimal) buffer size in ms
    337     uint16_t preferredBufferSize;
    338     // adding extra delay due to "peaky jitter"
    339     bool jitterPeaksFound;
    340     // loss rate (network + late) in percent (in Q14)
    341     uint16_t currentPacketLossRate;
    342     // late loss rate in percent (in Q14)
    343     uint16_t currentDiscardRate;
    344     // fraction (of original stream) of synthesized speech inserted through
    345     // expansion (in Q14)
    346     uint16_t currentExpandRate;
    347     // fraction of synthesized speech inserted through pre-emptive expansion
    348     // (in Q14)
    349     uint16_t currentPreemptiveRate;
    350     // fraction of data removed through acceleration (in Q14)
    351     uint16_t currentAccelerateRate;
    352     // clock-drift in parts-per-million (negative or positive)
    353     int32_t clockDriftPPM;
    354     // average packet waiting time in the jitter buffer (ms)
    355     int meanWaitingTimeMs;
    356     // median packet waiting time in the jitter buffer (ms)
    357     int medianWaitingTimeMs;
    358     // min packet waiting time in the jitter buffer (ms)
    359     int minWaitingTimeMs;
    360     // max packet waiting time in the jitter buffer (ms)
    361     int maxWaitingTimeMs;
    362     // added samples in off mode due to packet loss
    363     int addedSamples;
    364 };
    365 
    366 // Statistics for calls to AudioCodingModule::PlayoutData10Ms().
    367 struct AudioDecodingCallStats {
    368   AudioDecodingCallStats()
    369       : calls_to_silence_generator(0),
    370         calls_to_neteq(0),
    371         decoded_normal(0),
    372         decoded_plc(0),
    373         decoded_cng(0),
    374         decoded_plc_cng(0) {}
    375 
    376   int calls_to_silence_generator;  // Number of calls where silence generated,
    377                                    // and NetEq was disengaged from decoding.
    378   int calls_to_neteq;  // Number of calls to NetEq.
    379   int decoded_normal;  // Number of calls where audio RTP packet decoded.
    380   int decoded_plc;  // Number of calls resulted in PLC.
    381   int decoded_cng;  // Number of calls where comfort noise generated due to DTX.
    382   int decoded_plc_cng;  // Number of calls resulted where PLC faded to CNG.
    383 };
    384 
    385 typedef struct
    386 {
    387     int min;              // minumum
    388     int max;              // maximum
    389     int average;          // average
    390 } StatVal;
    391 
    392 typedef struct           // All levels are reported in dBm0
    393 {
    394     StatVal speech_rx;   // long-term speech levels on receiving side
    395     StatVal speech_tx;   // long-term speech levels on transmitting side
    396     StatVal noise_rx;    // long-term noise/silence levels on receiving side
    397     StatVal noise_tx;    // long-term noise/silence levels on transmitting side
    398 } LevelStatistics;
    399 
    400 typedef struct        // All levels are reported in dB
    401 {
    402     StatVal erl;      // Echo Return Loss
    403     StatVal erle;     // Echo Return Loss Enhancement
    404     StatVal rerl;     // RERL = ERL + ERLE
    405     // Echo suppression inside EC at the point just before its NLP
    406     StatVal a_nlp;
    407 } EchoStatistics;
    408 
    409 enum NsModes    // type of Noise Suppression
    410 {
    411     kNsUnchanged = 0,   // previously set mode
    412     kNsDefault,         // platform default
    413     kNsConference,      // conferencing default
    414     kNsLowSuppression,  // lowest suppression
    415     kNsModerateSuppression,
    416     kNsHighSuppression,
    417     kNsVeryHighSuppression,     // highest suppression
    418 };
    419 
    420 enum AgcModes                  // type of Automatic Gain Control
    421 {
    422     kAgcUnchanged = 0,        // previously set mode
    423     kAgcDefault,              // platform default
    424     // adaptive mode for use when analog volume control exists (e.g. for
    425     // PC softphone)
    426     kAgcAdaptiveAnalog,
    427     // scaling takes place in the digital domain (e.g. for conference servers
    428     // and embedded devices)
    429     kAgcAdaptiveDigital,
    430     // can be used on embedded devices where the capture signal level
    431     // is predictable
    432     kAgcFixedDigital
    433 };
    434 
    435 // EC modes
    436 enum EcModes                   // type of Echo Control
    437 {
    438     kEcUnchanged = 0,          // previously set mode
    439     kEcDefault,                // platform default
    440     kEcConference,             // conferencing default (aggressive AEC)
    441     kEcAec,                    // Acoustic Echo Cancellation
    442     kEcAecm,                   // AEC mobile
    443 };
    444 
    445 // AECM modes
    446 enum AecmModes                 // mode of AECM
    447 {
    448     kAecmQuietEarpieceOrHeadset = 0,
    449                                // Quiet earpiece or headset use
    450     kAecmEarpiece,             // most earpiece use
    451     kAecmLoudEarpiece,         // Loud earpiece or quiet speakerphone use
    452     kAecmSpeakerphone,         // most speakerphone use (default)
    453     kAecmLoudSpeakerphone      // Loud speakerphone
    454 };
    455 
    456 // AGC configuration
    457 typedef struct
    458 {
    459     unsigned short targetLeveldBOv;
    460     unsigned short digitalCompressionGaindB;
    461     bool           limiterEnable;
    462 } AgcConfig;                  // AGC configuration parameters
    463 
    464 enum StereoChannel
    465 {
    466     kStereoLeft = 0,
    467     kStereoRight,
    468     kStereoBoth
    469 };
    470 
    471 // Audio device layers
    472 enum AudioLayers
    473 {
    474     kAudioPlatformDefault = 0,
    475     kAudioWindowsWave = 1,
    476     kAudioWindowsCore = 2,
    477     kAudioLinuxAlsa = 3,
    478     kAudioLinuxPulse = 4
    479 };
    480 
    481 // TODO(henrika): to be removed.
    482 enum NetEqModes             // NetEQ playout configurations
    483 {
    484     // Optimized trade-off between low delay and jitter robustness for two-way
    485     // communication.
    486     kNetEqDefault = 0,
    487     // Improved jitter robustness at the cost of increased delay. Can be
    488     // used in one-way communication.
    489     kNetEqStreaming = 1,
    490     // Optimzed for decodability of fax signals rather than for perceived audio
    491     // quality.
    492     kNetEqFax = 2,
    493     // Minimal buffer management. Inserts zeros for lost packets and during
    494     // buffer increases.
    495     kNetEqOff = 3,
    496 };
    497 
    498 // TODO(henrika): to be removed.
    499 enum OnHoldModes            // On Hold direction
    500 {
    501     kHoldSendAndPlay = 0,    // Put both sending and playing in on-hold state.
    502     kHoldSendOnly,           // Put only sending in on-hold state.
    503     kHoldPlayOnly            // Put only playing in on-hold state.
    504 };
    505 
    506 // TODO(henrika): to be removed.
    507 enum AmrMode
    508 {
    509     kRfc3267BwEfficient = 0,
    510     kRfc3267OctetAligned = 1,
    511     kRfc3267FileStorage = 2,
    512 };
    513 
    514 // ==================================================================
    515 // Video specific types
    516 // ==================================================================
    517 
    518 // Raw video types
    519 enum RawVideoType
    520 {
    521     kVideoI420     = 0,
    522     kVideoYV12     = 1,
    523     kVideoYUY2     = 2,
    524     kVideoUYVY     = 3,
    525     kVideoIYUV     = 4,
    526     kVideoARGB     = 5,
    527     kVideoRGB24    = 6,
    528     kVideoRGB565   = 7,
    529     kVideoARGB4444 = 8,
    530     kVideoARGB1555 = 9,
    531     kVideoMJPEG    = 10,
    532     kVideoNV12     = 11,
    533     kVideoNV21     = 12,
    534     kVideoBGRA     = 13,
    535     kVideoUnknown  = 99
    536 };
    537 
    538 // Video codec
    539 enum { kConfigParameterSize = 128};
    540 enum { kPayloadNameSize = 32};
    541 enum { kMaxSimulcastStreams = 4};
    542 enum { kMaxTemporalStreams = 4};
    543 
    544 enum VideoCodecComplexity
    545 {
    546     kComplexityNormal = 0,
    547     kComplexityHigh    = 1,
    548     kComplexityHigher  = 2,
    549     kComplexityMax     = 3
    550 };
    551 
    552 enum VideoCodecProfile
    553 {
    554     kProfileBase = 0x00,
    555     kProfileMain = 0x01
    556 };
    557 
    558 enum VP8ResilienceMode {
    559   kResilienceOff,    // The stream produced by the encoder requires a
    560                      // recovery frame (typically a key frame) to be
    561                      // decodable after a packet loss.
    562   kResilientStream,  // A stream produced by the encoder is resilient to
    563                      // packet losses, but packets within a frame subsequent
    564                      // to a loss can't be decoded.
    565   kResilientFrames   // Same as kResilientStream but with added resilience
    566                      // within a frame.
    567 };
    568 
    569 // VP8 specific
    570 struct VideoCodecVP8 {
    571   bool                 pictureLossIndicationOn;
    572   bool                 feedbackModeOn;
    573   VideoCodecComplexity complexity;
    574   VP8ResilienceMode    resilience;
    575   unsigned char        numberOfTemporalLayers;
    576   bool                 denoisingOn;
    577   bool                 errorConcealmentOn;
    578   bool                 automaticResizeOn;
    579   bool                 frameDroppingOn;
    580   int                  keyFrameInterval;
    581 
    582   bool operator==(const VideoCodecVP8& other) const {
    583     return pictureLossIndicationOn == other.pictureLossIndicationOn &&
    584            feedbackModeOn == other.feedbackModeOn &&
    585            complexity == other.complexity &&
    586            resilience == other.resilience &&
    587            numberOfTemporalLayers == other.numberOfTemporalLayers &&
    588            denoisingOn == other.denoisingOn &&
    589            errorConcealmentOn == other.errorConcealmentOn &&
    590            automaticResizeOn == other.automaticResizeOn &&
    591            frameDroppingOn == other.frameDroppingOn &&
    592            keyFrameInterval == other.keyFrameInterval;
    593   }
    594 
    595   bool operator!=(const VideoCodecVP8& other) const {
    596     return !(*this == other);
    597   }
    598 };
    599 
    600 // H264 specific.
    601 struct VideoCodecH264
    602 {
    603     VideoCodecProfile profile;
    604     bool           frameDroppingOn;
    605     int            keyFrameInterval;
    606     // These are NULL/0 if not externally negotiated.
    607     const uint8_t* spsData;
    608     size_t         spsLen;
    609     const uint8_t* ppsData;
    610     size_t         ppsLen;
    611 };
    612 
    613 // Video codec types
    614 enum VideoCodecType
    615 {
    616     kVideoCodecVP8,
    617     kVideoCodecH264,
    618     kVideoCodecI420,
    619     kVideoCodecRED,
    620     kVideoCodecULPFEC,
    621     kVideoCodecGeneric,
    622     kVideoCodecUnknown
    623 };
    624 
    625 union VideoCodecUnion
    626 {
    627     VideoCodecVP8       VP8;
    628     VideoCodecH264      H264;
    629 };
    630 
    631 
    632 // Simulcast is when the same stream is encoded multiple times with different
    633 // settings such as resolution.
    634 struct SimulcastStream {
    635   unsigned short      width;
    636   unsigned short      height;
    637   unsigned char       numberOfTemporalLayers;
    638   unsigned int        maxBitrate;  // kilobits/sec.
    639   unsigned int        targetBitrate;  // kilobits/sec.
    640   unsigned int        minBitrate;  // kilobits/sec.
    641   unsigned int        qpMax; // minimum quality
    642 
    643   bool operator==(const SimulcastStream& other) const {
    644     return width == other.width &&
    645            height == other.height &&
    646            numberOfTemporalLayers == other.numberOfTemporalLayers &&
    647            maxBitrate == other.maxBitrate &&
    648            targetBitrate == other.targetBitrate &&
    649            minBitrate == other.minBitrate &&
    650            qpMax == other.qpMax;
    651   }
    652 
    653   bool operator!=(const SimulcastStream& other) const {
    654     return !(*this == other);
    655   }
    656 };
    657 
    658 enum VideoCodecMode {
    659   kRealtimeVideo,
    660   kScreensharing
    661 };
    662 
    663 // Common video codec properties
    664 struct VideoCodec {
    665   VideoCodecType      codecType;
    666   char                plName[kPayloadNameSize];
    667   unsigned char       plType;
    668 
    669   unsigned short      width;
    670   unsigned short      height;
    671 
    672   unsigned int        startBitrate;  // kilobits/sec.
    673   unsigned int        maxBitrate;  // kilobits/sec.
    674   unsigned int        minBitrate;  // kilobits/sec.
    675   unsigned int        targetBitrate;  // kilobits/sec.
    676 
    677   unsigned char       maxFramerate;
    678 
    679   VideoCodecUnion     codecSpecific;
    680 
    681   unsigned int        qpMax;
    682   unsigned char       numberOfSimulcastStreams;
    683   SimulcastStream     simulcastStream[kMaxSimulcastStreams];
    684 
    685   VideoCodecMode      mode;
    686 
    687   // When using an external encoder/decoder this allows to pass
    688   // extra options without requiring webrtc to be aware of them.
    689   Config*  extra_options;
    690 
    691   bool operator==(const VideoCodec& other) const {
    692     bool ret = codecType == other.codecType &&
    693                (STR_CASE_CMP(plName, other.plName) == 0) &&
    694                plType == other.plType &&
    695                width == other.width &&
    696                height == other.height &&
    697                startBitrate == other.startBitrate &&
    698                maxBitrate == other.maxBitrate &&
    699                minBitrate == other.minBitrate &&
    700                targetBitrate == other.targetBitrate &&
    701                maxFramerate == other.maxFramerate &&
    702                qpMax == other.qpMax &&
    703                numberOfSimulcastStreams == other.numberOfSimulcastStreams &&
    704                mode == other.mode;
    705     if (ret && codecType == kVideoCodecVP8) {
    706       ret &= (codecSpecific.VP8 == other.codecSpecific.VP8);
    707     }
    708 
    709     for (unsigned char i = 0; i < other.numberOfSimulcastStreams && ret; ++i) {
    710       ret &= (simulcastStream[i] == other.simulcastStream[i]);
    711     }
    712     return ret;
    713   }
    714 
    715   bool operator!=(const VideoCodec& other) const {
    716     return !(*this == other);
    717   }
    718 };
    719 
    720 // Bandwidth over-use detector options.  These are used to drive
    721 // experimentation with bandwidth estimation parameters.
    722 // See modules/remote_bitrate_estimator/overuse_detector.h
    723 struct OverUseDetectorOptions {
    724   OverUseDetectorOptions()
    725       : initial_slope(8.0/512.0),
    726         initial_offset(0),
    727         initial_e(),
    728         initial_process_noise(),
    729         initial_avg_noise(0.0),
    730         initial_var_noise(50),
    731         initial_threshold(25.0) {
    732     initial_e[0][0] = 100;
    733     initial_e[1][1] = 1e-1;
    734     initial_e[0][1] = initial_e[1][0] = 0;
    735     initial_process_noise[0] = 1e-10;
    736     initial_process_noise[1] = 1e-2;
    737   }
    738   double initial_slope;
    739   double initial_offset;
    740   double initial_e[2][2];
    741   double initial_process_noise[2];
    742   double initial_avg_noise;
    743   double initial_var_noise;
    744   double initial_threshold;
    745 };
    746 
    747 // This structure will have the information about when packet is actually
    748 // received by socket.
    749 struct PacketTime {
    750   PacketTime() : timestamp(-1), not_before(-1) {}
    751   PacketTime(int64_t timestamp, int64_t not_before)
    752       : timestamp(timestamp), not_before(not_before) {
    753   }
    754 
    755   int64_t timestamp;   // Receive time after socket delivers the data.
    756   int64_t not_before;  // Earliest possible time the data could have arrived,
    757                        // indicating the potential error in the |timestamp|
    758                        // value,in case the system is busy.
    759                        // For example, the time of the last select() call.
    760                        // If unknown, this value will be set to zero.
    761 };
    762 
    763 struct RTPHeaderExtension {
    764   RTPHeaderExtension()
    765       : hasTransmissionTimeOffset(false),
    766         transmissionTimeOffset(0),
    767         hasAbsoluteSendTime(false),
    768         absoluteSendTime(0),
    769         hasAudioLevel(false),
    770         audioLevel(0) {}
    771 
    772   bool hasTransmissionTimeOffset;
    773   int32_t transmissionTimeOffset;
    774   bool hasAbsoluteSendTime;
    775   uint32_t absoluteSendTime;
    776 
    777   // Audio Level includes both level in dBov and voiced/unvoiced bit. See:
    778   // https://datatracker.ietf.org/doc/draft-lennox-avt-rtp-audio-level-exthdr/
    779   bool hasAudioLevel;
    780   uint8_t audioLevel;
    781 };
    782 
    783 struct RTPHeader {
    784   RTPHeader()
    785       : markerBit(false),
    786         payloadType(0),
    787         sequenceNumber(0),
    788         timestamp(0),
    789         ssrc(0),
    790         numCSRCs(0),
    791         paddingLength(0),
    792         headerLength(0),
    793         payload_type_frequency(0),
    794         extension() {
    795     memset(&arrOfCSRCs, 0, sizeof(arrOfCSRCs));
    796   }
    797 
    798   bool markerBit;
    799   uint8_t payloadType;
    800   uint16_t sequenceNumber;
    801   uint32_t timestamp;
    802   uint32_t ssrc;
    803   uint8_t numCSRCs;
    804   uint32_t arrOfCSRCs[kRtpCsrcSize];
    805   uint8_t paddingLength;
    806   uint16_t headerLength;
    807   int payload_type_frequency;
    808   RTPHeaderExtension extension;
    809 };
    810 
    811 }  // namespace webrtc
    812 
    813 #endif  // WEBRTC_COMMON_TYPES_H_
    814