• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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;
Rewind()60     virtual int Rewind() {return -1;}
~InStream()61     virtual ~InStream() {}
62 protected:
InStream()63     InStream() {}
64 };
65 
66 class OutStream
67 {
68 public:
69     virtual bool Write(const void *buf,int len) = 0;
Rewind()70     virtual int Rewind() {return -1;}
~OutStream()71     virtual ~OutStream() {}
72 protected:
OutStream()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:
~TraceCallback()132   virtual ~TraceCallback() {}
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:
~Transport()173     virtual ~Transport() {}
Transport()174     Transport() {}
175 };
176 
177 // Statistics for an RTCP channel
178 struct RtcpStatistics {
RtcpStatisticsRtcpStatistics179   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:
~RtcpStatisticsCallback()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 {
RtcpPacketTypeCounterRtcpPacketTypeCounter202   RtcpPacketTypeCounter()
203     : nack_packets(0),
204       fir_packets(0),
205       pli_packets(0) {}
206 
AddRtcpPacketTypeCounter207   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 {
StreamDataCountersStreamDataCounters220   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:
~StreamDataCountersCallback()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 {
BitrateStatisticsBitrateStatistics248   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:
~BitrateStatisticsObserver()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:
~FrameCountObserver()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:
~SendSideDelayObserver()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 {
AudioDecodingCallStatsAudioDecodingCallStats368   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 {
OverUseDetectorOptionsOverUseDetectorOptions724   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 {
PacketTimePacketTime750   PacketTime() : timestamp(-1), not_before(-1) {}
PacketTimePacketTime751   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 {
RTPHeaderExtensionRTPHeaderExtension764   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 {
RTPHeaderRTPHeader784   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