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