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   uint32_t bytes;  // Payload bytes, excluding RTP headers and padding.
    229   uint32_t header_bytes;  // Number of bytes used by RTP headers.
    230   uint32_t padding_bytes;  // Number of padding bytes.
    231   uint32_t packets;  // Number of packets.
    232   uint32_t retransmitted_packets;  // Number of retransmitted packets.
    233   uint32_t fec_packets;  // Number of redundancy packets.
    234 };
    235 
    236 // Callback, called whenever byte/packet counts have been updated.
    237 class StreamDataCountersCallback {
    238  public:
    239   virtual ~StreamDataCountersCallback() {}
    240 
    241   virtual void DataCountersUpdated(const StreamDataCounters& counters,
    242                                    uint32_t ssrc) = 0;
    243 };
    244 
    245 // Rate statistics for a stream
    246 struct BitrateStatistics {
    247   BitrateStatistics() : bitrate_bps(0), packet_rate(0), timestamp_ms(0) {}
    248 
    249   uint32_t bitrate_bps;   // Bitrate in bits per second.
    250   uint32_t packet_rate;   // Packet rate in packets per second.
    251   uint64_t timestamp_ms;  // Ntp timestamp in ms at time of rate estimation.
    252 };
    253 
    254 // Callback, used to notify an observer whenever new rates have been estimated.
    255 class BitrateStatisticsObserver {
    256  public:
    257   virtual ~BitrateStatisticsObserver() {}
    258 
    259   virtual void Notify(const BitrateStatistics& stats, uint32_t ssrc) = 0;
    260 };
    261 
    262 // Callback, used to notify an observer whenever frame counts have been updated
    263 class FrameCountObserver {
    264  public:
    265   virtual ~FrameCountObserver() {}
    266   virtual void FrameCountUpdated(FrameType frame_type,
    267                                  uint32_t frame_count,
    268                                  const unsigned int ssrc) = 0;
    269 };
    270 
    271 // ==================================================================
    272 // Voice specific types
    273 // ==================================================================
    274 
    275 // Each codec supported can be described by this structure.
    276 struct CodecInst {
    277   int pltype;
    278   char plname[RTP_PAYLOAD_NAME_SIZE];
    279   int plfreq;
    280   int pacsize;
    281   int channels;
    282   int rate;  // bits/sec unlike {start,min,max}Bitrate elsewhere in this file!
    283 
    284   bool operator==(const CodecInst& other) const {
    285     return pltype == other.pltype &&
    286            (STR_CASE_CMP(plname, other.plname) == 0) &&
    287            plfreq == other.plfreq &&
    288            pacsize == other.pacsize &&
    289            channels == other.channels &&
    290            rate == other.rate;
    291   }
    292 
    293   bool operator!=(const CodecInst& other) const {
    294     return !(*this == other);
    295   }
    296 };
    297 
    298 // RTP
    299 enum {kRtpCsrcSize = 15}; // RFC 3550 page 13
    300 
    301 enum RTPDirections
    302 {
    303     kRtpIncoming = 0,
    304     kRtpOutgoing
    305 };
    306 
    307 enum PayloadFrequencies
    308 {
    309     kFreq8000Hz = 8000,
    310     kFreq16000Hz = 16000,
    311     kFreq32000Hz = 32000
    312 };
    313 
    314 enum VadModes                 // degree of bandwidth reduction
    315 {
    316     kVadConventional = 0,      // lowest reduction
    317     kVadAggressiveLow,
    318     kVadAggressiveMid,
    319     kVadAggressiveHigh         // highest reduction
    320 };
    321 
    322 struct NetworkStatistics           // NETEQ statistics
    323 {
    324     // current jitter buffer size in ms
    325     uint16_t currentBufferSize;
    326     // preferred (optimal) buffer size in ms
    327     uint16_t preferredBufferSize;
    328     // adding extra delay due to "peaky jitter"
    329     bool jitterPeaksFound;
    330     // loss rate (network + late) in percent (in Q14)
    331     uint16_t currentPacketLossRate;
    332     // late loss rate in percent (in Q14)
    333     uint16_t currentDiscardRate;
    334     // fraction (of original stream) of synthesized speech inserted through
    335     // expansion (in Q14)
    336     uint16_t currentExpandRate;
    337     // fraction of synthesized speech inserted through pre-emptive expansion
    338     // (in Q14)
    339     uint16_t currentPreemptiveRate;
    340     // fraction of data removed through acceleration (in Q14)
    341     uint16_t currentAccelerateRate;
    342     // clock-drift in parts-per-million (negative or positive)
    343     int32_t clockDriftPPM;
    344     // average packet waiting time in the jitter buffer (ms)
    345     int meanWaitingTimeMs;
    346     // median packet waiting time in the jitter buffer (ms)
    347     int medianWaitingTimeMs;
    348     // min packet waiting time in the jitter buffer (ms)
    349     int minWaitingTimeMs;
    350     // max packet waiting time in the jitter buffer (ms)
    351     int maxWaitingTimeMs;
    352     // added samples in off mode due to packet loss
    353     int addedSamples;
    354 };
    355 
    356 // Statistics for calls to AudioCodingModule::PlayoutData10Ms().
    357 struct AudioDecodingCallStats {
    358   AudioDecodingCallStats()
    359       : calls_to_silence_generator(0),
    360         calls_to_neteq(0),
    361         decoded_normal(0),
    362         decoded_plc(0),
    363         decoded_cng(0),
    364         decoded_plc_cng(0) {}
    365 
    366   int calls_to_silence_generator;  // Number of calls where silence generated,
    367                                    // and NetEq was disengaged from decoding.
    368   int calls_to_neteq;  // Number of calls to NetEq.
    369   int decoded_normal;  // Number of calls where audio RTP packet decoded.
    370   int decoded_plc;  // Number of calls resulted in PLC.
    371   int decoded_cng;  // Number of calls where comfort noise generated due to DTX.
    372   int decoded_plc_cng;  // Number of calls resulted where PLC faded to CNG.
    373 };
    374 
    375 typedef struct
    376 {
    377     int min;              // minumum
    378     int max;              // maximum
    379     int average;          // average
    380 } StatVal;
    381 
    382 typedef struct           // All levels are reported in dBm0
    383 {
    384     StatVal speech_rx;   // long-term speech levels on receiving side
    385     StatVal speech_tx;   // long-term speech levels on transmitting side
    386     StatVal noise_rx;    // long-term noise/silence levels on receiving side
    387     StatVal noise_tx;    // long-term noise/silence levels on transmitting side
    388 } LevelStatistics;
    389 
    390 typedef struct        // All levels are reported in dB
    391 {
    392     StatVal erl;      // Echo Return Loss
    393     StatVal erle;     // Echo Return Loss Enhancement
    394     StatVal rerl;     // RERL = ERL + ERLE
    395     // Echo suppression inside EC at the point just before its NLP
    396     StatVal a_nlp;
    397 } EchoStatistics;
    398 
    399 enum NsModes    // type of Noise Suppression
    400 {
    401     kNsUnchanged = 0,   // previously set mode
    402     kNsDefault,         // platform default
    403     kNsConference,      // conferencing default
    404     kNsLowSuppression,  // lowest suppression
    405     kNsModerateSuppression,
    406     kNsHighSuppression,
    407     kNsVeryHighSuppression,     // highest suppression
    408 };
    409 
    410 enum AgcModes                  // type of Automatic Gain Control
    411 {
    412     kAgcUnchanged = 0,        // previously set mode
    413     kAgcDefault,              // platform default
    414     // adaptive mode for use when analog volume control exists (e.g. for
    415     // PC softphone)
    416     kAgcAdaptiveAnalog,
    417     // scaling takes place in the digital domain (e.g. for conference servers
    418     // and embedded devices)
    419     kAgcAdaptiveDigital,
    420     // can be used on embedded devices where the capture signal level
    421     // is predictable
    422     kAgcFixedDigital
    423 };
    424 
    425 // EC modes
    426 enum EcModes                   // type of Echo Control
    427 {
    428     kEcUnchanged = 0,          // previously set mode
    429     kEcDefault,                // platform default
    430     kEcConference,             // conferencing default (aggressive AEC)
    431     kEcAec,                    // Acoustic Echo Cancellation
    432     kEcAecm,                   // AEC mobile
    433 };
    434 
    435 // AECM modes
    436 enum AecmModes                 // mode of AECM
    437 {
    438     kAecmQuietEarpieceOrHeadset = 0,
    439                                // Quiet earpiece or headset use
    440     kAecmEarpiece,             // most earpiece use
    441     kAecmLoudEarpiece,         // Loud earpiece or quiet speakerphone use
    442     kAecmSpeakerphone,         // most speakerphone use (default)
    443     kAecmLoudSpeakerphone      // Loud speakerphone
    444 };
    445 
    446 // AGC configuration
    447 typedef struct
    448 {
    449     unsigned short targetLeveldBOv;
    450     unsigned short digitalCompressionGaindB;
    451     bool           limiterEnable;
    452 } AgcConfig;                  // AGC configuration parameters
    453 
    454 enum StereoChannel
    455 {
    456     kStereoLeft = 0,
    457     kStereoRight,
    458     kStereoBoth
    459 };
    460 
    461 // Audio device layers
    462 enum AudioLayers
    463 {
    464     kAudioPlatformDefault = 0,
    465     kAudioWindowsWave = 1,
    466     kAudioWindowsCore = 2,
    467     kAudioLinuxAlsa = 3,
    468     kAudioLinuxPulse = 4
    469 };
    470 
    471 // TODO(henrika): to be removed.
    472 enum NetEqModes             // NetEQ playout configurations
    473 {
    474     // Optimized trade-off between low delay and jitter robustness for two-way
    475     // communication.
    476     kNetEqDefault = 0,
    477     // Improved jitter robustness at the cost of increased delay. Can be
    478     // used in one-way communication.
    479     kNetEqStreaming = 1,
    480     // Optimzed for decodability of fax signals rather than for perceived audio
    481     // quality.
    482     kNetEqFax = 2,
    483     // Minimal buffer management. Inserts zeros for lost packets and during
    484     // buffer increases.
    485     kNetEqOff = 3,
    486 };
    487 
    488 // TODO(henrika): to be removed.
    489 enum OnHoldModes            // On Hold direction
    490 {
    491     kHoldSendAndPlay = 0,    // Put both sending and playing in on-hold state.
    492     kHoldSendOnly,           // Put only sending in on-hold state.
    493     kHoldPlayOnly            // Put only playing in on-hold state.
    494 };
    495 
    496 // TODO(henrika): to be removed.
    497 enum AmrMode
    498 {
    499     kRfc3267BwEfficient = 0,
    500     kRfc3267OctetAligned = 1,
    501     kRfc3267FileStorage = 2,
    502 };
    503 
    504 // ==================================================================
    505 // Video specific types
    506 // ==================================================================
    507 
    508 // Raw video types
    509 enum RawVideoType
    510 {
    511     kVideoI420     = 0,
    512     kVideoYV12     = 1,
    513     kVideoYUY2     = 2,
    514     kVideoUYVY     = 3,
    515     kVideoIYUV     = 4,
    516     kVideoARGB     = 5,
    517     kVideoRGB24    = 6,
    518     kVideoRGB565   = 7,
    519     kVideoARGB4444 = 8,
    520     kVideoARGB1555 = 9,
    521     kVideoMJPEG    = 10,
    522     kVideoNV12     = 11,
    523     kVideoNV21     = 12,
    524     kVideoBGRA     = 13,
    525     kVideoUnknown  = 99
    526 };
    527 
    528 // Video codec
    529 enum { kConfigParameterSize = 128};
    530 enum { kPayloadNameSize = 32};
    531 enum { kMaxSimulcastStreams = 4};
    532 enum { kMaxTemporalStreams = 4};
    533 
    534 enum VideoCodecComplexity
    535 {
    536     kComplexityNormal = 0,
    537     kComplexityHigh    = 1,
    538     kComplexityHigher  = 2,
    539     kComplexityMax     = 3
    540 };
    541 
    542 enum VideoCodecProfile
    543 {
    544     kProfileBase = 0x00,
    545     kProfileMain = 0x01
    546 };
    547 
    548 enum VP8ResilienceMode {
    549   kResilienceOff,    // The stream produced by the encoder requires a
    550                      // recovery frame (typically a key frame) to be
    551                      // decodable after a packet loss.
    552   kResilientStream,  // A stream produced by the encoder is resilient to
    553                      // packet losses, but packets within a frame subsequent
    554                      // to a loss can't be decoded.
    555   kResilientFrames   // Same as kResilientStream but with added resilience
    556                      // within a frame.
    557 };
    558 
    559 // VP8 specific
    560 struct VideoCodecVP8 {
    561   bool                 pictureLossIndicationOn;
    562   bool                 feedbackModeOn;
    563   VideoCodecComplexity complexity;
    564   VP8ResilienceMode    resilience;
    565   unsigned char        numberOfTemporalLayers;
    566   bool                 denoisingOn;
    567   bool                 errorConcealmentOn;
    568   bool                 automaticResizeOn;
    569   bool                 frameDroppingOn;
    570   int                  keyFrameInterval;
    571 
    572   bool operator==(const VideoCodecVP8& other) const {
    573     return pictureLossIndicationOn == other.pictureLossIndicationOn &&
    574            feedbackModeOn == other.feedbackModeOn &&
    575            complexity == other.complexity &&
    576            resilience == other.resilience &&
    577            numberOfTemporalLayers == other.numberOfTemporalLayers &&
    578            denoisingOn == other.denoisingOn &&
    579            errorConcealmentOn == other.errorConcealmentOn &&
    580            automaticResizeOn == other.automaticResizeOn &&
    581            frameDroppingOn == other.frameDroppingOn &&
    582            keyFrameInterval == other.keyFrameInterval;
    583   }
    584 
    585   bool operator!=(const VideoCodecVP8& other) const {
    586     return !(*this == other);
    587   }
    588 };
    589 
    590 // Video codec types
    591 enum VideoCodecType
    592 {
    593     kVideoCodecVP8,
    594     kVideoCodecI420,
    595     kVideoCodecRED,
    596     kVideoCodecULPFEC,
    597     kVideoCodecGeneric,
    598     kVideoCodecUnknown
    599 };
    600 
    601 union VideoCodecUnion
    602 {
    603     VideoCodecVP8       VP8;
    604 };
    605 
    606 
    607 // Simulcast is when the same stream is encoded multiple times with different
    608 // settings such as resolution.
    609 struct SimulcastStream {
    610   unsigned short      width;
    611   unsigned short      height;
    612   unsigned char       numberOfTemporalLayers;
    613   unsigned int        maxBitrate;  // kilobits/sec.
    614   unsigned int        targetBitrate;  // kilobits/sec.
    615   unsigned int        minBitrate;  // kilobits/sec.
    616   unsigned int        qpMax; // minimum quality
    617 
    618   bool operator==(const SimulcastStream& other) const {
    619     return width == other.width &&
    620            height == other.height &&
    621            numberOfTemporalLayers == other.numberOfTemporalLayers &&
    622            maxBitrate == other.maxBitrate &&
    623            targetBitrate == other.targetBitrate &&
    624            minBitrate == other.minBitrate &&
    625            qpMax == other.qpMax;
    626   }
    627 
    628   bool operator!=(const SimulcastStream& other) const {
    629     return !(*this == other);
    630   }
    631 };
    632 
    633 enum VideoCodecMode {
    634   kRealtimeVideo,
    635   kScreensharing
    636 };
    637 
    638 // Common video codec properties
    639 struct VideoCodec {
    640   VideoCodecType      codecType;
    641   char                plName[kPayloadNameSize];
    642   unsigned char       plType;
    643 
    644   unsigned short      width;
    645   unsigned short      height;
    646 
    647   unsigned int        startBitrate;  // kilobits/sec.
    648   unsigned int        maxBitrate;  // kilobits/sec.
    649   unsigned int        minBitrate;  // kilobits/sec.
    650   unsigned int        targetBitrate;  // kilobits/sec.
    651 
    652   unsigned char       maxFramerate;
    653 
    654   VideoCodecUnion     codecSpecific;
    655 
    656   unsigned int        qpMax;
    657   unsigned char       numberOfSimulcastStreams;
    658   SimulcastStream     simulcastStream[kMaxSimulcastStreams];
    659 
    660   VideoCodecMode      mode;
    661 
    662   // When using an external encoder/decoder this allows to pass
    663   // extra options without requiring webrtc to be aware of them.
    664   Config*  extra_options;
    665 
    666   bool operator==(const VideoCodec& other) const {
    667     bool ret = codecType == other.codecType &&
    668                (STR_CASE_CMP(plName, other.plName) == 0) &&
    669                plType == other.plType &&
    670                width == other.width &&
    671                height == other.height &&
    672                startBitrate == other.startBitrate &&
    673                maxBitrate == other.maxBitrate &&
    674                minBitrate == other.minBitrate &&
    675                targetBitrate == other.targetBitrate &&
    676                maxFramerate == other.maxFramerate &&
    677                qpMax == other.qpMax &&
    678                numberOfSimulcastStreams == other.numberOfSimulcastStreams &&
    679                mode == other.mode;
    680     if (ret && codecType == kVideoCodecVP8) {
    681       ret &= (codecSpecific.VP8 == other.codecSpecific.VP8);
    682     }
    683 
    684     for (unsigned char i = 0; i < other.numberOfSimulcastStreams && ret; ++i) {
    685       ret &= (simulcastStream[i] == other.simulcastStream[i]);
    686     }
    687     return ret;
    688   }
    689 
    690   bool operator!=(const VideoCodec& other) const {
    691     return !(*this == other);
    692   }
    693 };
    694 
    695 // Bandwidth over-use detector options.  These are used to drive
    696 // experimentation with bandwidth estimation parameters.
    697 // See modules/remote_bitrate_estimator/overuse_detector.h
    698 struct OverUseDetectorOptions {
    699   OverUseDetectorOptions()
    700       : initial_slope(8.0/512.0),
    701         initial_offset(0),
    702         initial_e(),
    703         initial_process_noise(),
    704         initial_avg_noise(0.0),
    705         initial_var_noise(50),
    706         initial_threshold(25.0) {
    707     initial_e[0][0] = 100;
    708     initial_e[1][1] = 1e-1;
    709     initial_e[0][1] = initial_e[1][0] = 0;
    710     initial_process_noise[0] = 1e-10;
    711     initial_process_noise[1] = 1e-2;
    712   }
    713   double initial_slope;
    714   double initial_offset;
    715   double initial_e[2][2];
    716   double initial_process_noise[2];
    717   double initial_avg_noise;
    718   double initial_var_noise;
    719   double initial_threshold;
    720 };
    721 
    722 // This structure will have the information about when packet is actually
    723 // received by socket.
    724 struct PacketTime {
    725   PacketTime() : timestamp(-1), not_before(-1) {}
    726   PacketTime(int64_t timestamp, int64_t not_before)
    727       : timestamp(timestamp), not_before(not_before) {
    728   }
    729 
    730   int64_t timestamp;   // Receive time after socket delivers the data.
    731   int64_t not_before;  // Earliest possible time the data could have arrived,
    732                        // indicating the potential error in the |timestamp|
    733                        // value,in case the system is busy.
    734                        // For example, the time of the last select() call.
    735                        // If unknown, this value will be set to zero.
    736 };
    737 
    738 struct RTPHeaderExtension {
    739   RTPHeaderExtension()
    740       : hasTransmissionTimeOffset(false),
    741         transmissionTimeOffset(0),
    742         hasAbsoluteSendTime(false),
    743         absoluteSendTime(0),
    744         hasAudioLevel(false),
    745         audioLevel(0) {}
    746 
    747   bool hasTransmissionTimeOffset;
    748   int32_t transmissionTimeOffset;
    749   bool hasAbsoluteSendTime;
    750   uint32_t absoluteSendTime;
    751 
    752   // Audio Level includes both level in dBov and voiced/unvoiced bit. See:
    753   // https://datatracker.ietf.org/doc/draft-lennox-avt-rtp-audio-level-exthdr/
    754   bool hasAudioLevel;
    755   uint8_t audioLevel;
    756 };
    757 
    758 struct RTPHeader {
    759   RTPHeader()
    760       : markerBit(false),
    761         payloadType(0),
    762         sequenceNumber(0),
    763         timestamp(0),
    764         ssrc(0),
    765         numCSRCs(0),
    766         paddingLength(0),
    767         headerLength(0),
    768         payload_type_frequency(0),
    769         extension() {
    770     memset(&arrOfCSRCs, 0, sizeof(arrOfCSRCs));
    771   }
    772 
    773   bool markerBit;
    774   uint8_t payloadType;
    775   uint16_t sequenceNumber;
    776   uint32_t timestamp;
    777   uint32_t ssrc;
    778   uint8_t numCSRCs;
    779   uint32_t arrOfCSRCs[kRtpCsrcSize];
    780   uint8_t paddingLength;
    781   uint16_t headerLength;
    782   int payload_type_frequency;
    783   RTPHeaderExtension extension;
    784 };
    785 
    786 }  // namespace webrtc
    787 
    788 #endif  // WEBRTC_COMMON_TYPES_H_
    789