blob: 99c4064a3cf660d1326ad590e4f68fa34443ed0a [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:251/*
phoglund@webrtc.org8bfee842012-02-17 09:32:482 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:253 *
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
Mirko Bonadei92ea95e2017-09-15 04:47:3111#ifndef COMMON_TYPES_H_
12#define COMMON_TYPES_H_
niklase@google.com470e71d2011-07-07 08:21:2513
pbos@webrtc.orgf577ae92014-03-19 08:43:5714#include <stddef.h>
mallinath@webrtc.org0209e562014-03-21 00:41:2815#include <string.h>
pbos@webrtc.org1e92b0a2014-05-15 09:35:0616#include <string>
pbos@webrtc.orgf577ae92014-03-19 08:43:5717#include <vector>
18
Mirko Bonadei92ea95e2017-09-15 04:47:3119#include "api/array_view.h"
Erik Språng566124a2018-04-23 10:32:2220// TODO(sprang): Remove this include when all usage includes it directly.
21#include "api/video/video_bitrate_allocation.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3122#include "rtc_base/checks.h"
23#include "rtc_base/deprecation.h"
niklase@google.com470e71d2011-07-07 08:21:2524
andrew@webrtc.org88b8b0d2012-08-14 00:05:5625#if defined(_MSC_VER)
26// Disable "new behavior: elements of array will be default initialized"
27// warning. Affects OverUseDetectorOptions.
solenberg634b86e2016-09-01 14:54:5328#pragma warning(disable : 4351)
andrew@webrtc.org88b8b0d2012-08-14 00:05:5629#endif
30
Peter Boström8b79b072016-02-26 15:31:3731#define RTP_PAYLOAD_NAME_SIZE 32u
henrika@webrtc.orgf75901f2012-01-16 08:45:4232
mallinath@webrtc.org0209e562014-03-21 00:41:2833#if defined(WEBRTC_WIN) || defined(WIN32)
andrew@webrtc.orgeda189b2013-09-09 17:50:1034// Compares two strings without regard to case.
35#define STR_CASE_CMP(s1, s2) ::_stricmp(s1, s2)
36// Compares characters of two strings without regard to case.
37#define STR_NCASE_CMP(s1, s2, n) ::_strnicmp(s1, s2, n)
38#else
39#define STR_CASE_CMP(s1, s2) ::strcasecmp(s1, s2)
40#define STR_NCASE_CMP(s1, s2, n) ::strncasecmp(s1, s2, n)
41#endif
42
niklase@google.com470e71d2011-07-07 08:21:2543namespace webrtc {
44
pbos22993e12015-10-19 09:39:0645enum FrameType {
46 kEmptyFrame = 0,
47 kAudioFrameSpeech = 1,
48 kAudioFrameCN = 2,
49 kVideoFrameKey = 3,
50 kVideoFrameDelta = 4,
sprang@webrtc.org71f055f2013-12-04 15:09:2751};
52
sprang@webrtc.orgdc50aae2013-11-20 16:47:0753// Statistics for an RTCP channel
sprang@webrtc.orgfe5d36b2013-10-28 09:21:0754struct RtcpStatistics {
sprang@webrtc.orgfe5d36b2013-10-28 09:21:0755 RtcpStatistics()
solenberg634b86e2016-09-01 14:54:5356 : fraction_lost(0),
srte186d9c32017-08-04 12:03:5357 packets_lost(0),
58 extended_highest_sequence_number(0),
solenberg634b86e2016-09-01 14:54:5359 jitter(0) {}
sprang@webrtc.orgfe5d36b2013-10-28 09:21:0760
61 uint8_t fraction_lost;
Danil Chapovalov3daabad2018-08-15 15:12:1262 int32_t packets_lost; // Defined as a 24 bit signed integer in RTCP
63 uint32_t extended_highest_sequence_number;
sprang@webrtc.orgfe5d36b2013-10-28 09:21:0764 uint32_t jitter;
sprang@webrtc.orgfe5d36b2013-10-28 09:21:0765};
66
sprang@webrtc.orgdc50aae2013-11-20 16:47:0767class RtcpStatisticsCallback {
68 public:
69 virtual ~RtcpStatisticsCallback() {}
70
71 virtual void StatisticsUpdated(const RtcpStatistics& statistics,
72 uint32_t ssrc) = 0;
pbos@webrtc.orgce4e9a32014-12-18 13:50:1673 virtual void CNameChanged(const char* cname, uint32_t ssrc) = 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:0774};
75
asapersson@webrtc.org8098e072014-02-19 11:59:0276// Statistics for RTCP packet types.
77struct RtcpPacketTypeCounter {
78 RtcpPacketTypeCounter()
solenberg634b86e2016-09-01 14:54:5379 : first_packet_time_ms(-1),
80 nack_packets(0),
81 fir_packets(0),
82 pli_packets(0),
83 nack_requests(0),
84 unique_nack_requests(0) {}
asapersson@webrtc.org8098e072014-02-19 11:59:0285
86 void Add(const RtcpPacketTypeCounter& other) {
87 nack_packets += other.nack_packets;
88 fir_packets += other.fir_packets;
89 pli_packets += other.pli_packets;
asapersson@webrtc.org2dd31342014-10-29 12:42:3090 nack_requests += other.nack_requests;
91 unique_nack_requests += other.unique_nack_requests;
asapersson@webrtc.orgd08d3892014-12-16 12:03:1192 if (other.first_packet_time_ms != -1 &&
solenberg634b86e2016-09-01 14:54:5393 (other.first_packet_time_ms < first_packet_time_ms ||
94 first_packet_time_ms == -1)) {
asapersson@webrtc.orgd08d3892014-12-16 12:03:1195 // Use oldest time.
96 first_packet_time_ms = other.first_packet_time_ms;
97 }
98 }
99
sprang07fb9be2016-02-24 15:55:00100 void Subtract(const RtcpPacketTypeCounter& other) {
101 nack_packets -= other.nack_packets;
102 fir_packets -= other.fir_packets;
103 pli_packets -= other.pli_packets;
104 nack_requests -= other.nack_requests;
105 unique_nack_requests -= other.unique_nack_requests;
106 if (other.first_packet_time_ms != -1 &&
107 (other.first_packet_time_ms > first_packet_time_ms ||
108 first_packet_time_ms == -1)) {
109 // Use youngest time.
110 first_packet_time_ms = other.first_packet_time_ms;
111 }
112 }
113
asapersson@webrtc.orgd08d3892014-12-16 12:03:11114 int64_t TimeSinceFirstPacketInMs(int64_t now_ms) const {
115 return (first_packet_time_ms == -1) ? -1 : (now_ms - first_packet_time_ms);
asapersson@webrtc.org8098e072014-02-19 11:59:02116 }
117
asapersson@webrtc.org2dd31342014-10-29 12:42:30118 int UniqueNackRequestsInPercent() const {
119 if (nack_requests == 0) {
120 return 0;
121 }
solenberg634b86e2016-09-01 14:54:53122 return static_cast<int>((unique_nack_requests * 100.0f / nack_requests) +
123 0.5f);
asapersson@webrtc.org2dd31342014-10-29 12:42:30124 }
125
solenberg634b86e2016-09-01 14:54:53126 int64_t first_packet_time_ms; // Time when first packet is sent/received.
127 uint32_t nack_packets; // Number of RTCP NACK packets.
128 uint32_t fir_packets; // Number of RTCP FIR packets.
129 uint32_t pli_packets; // Number of RTCP PLI packets.
130 uint32_t nack_requests; // Number of NACKed RTP packets.
asapersson@webrtc.org2dd31342014-10-29 12:42:30131 uint32_t unique_nack_requests; // Number of unique NACKed RTP packets.
asapersson@webrtc.org8098e072014-02-19 11:59:02132};
133
pbos@webrtc.org1d0fa5d2015-02-19 12:47:00134class RtcpPacketTypeCounterObserver {
135 public:
136 virtual ~RtcpPacketTypeCounterObserver() {}
137 virtual void RtcpPacketTypesCounterUpdated(
138 uint32_t ssrc,
139 const RtcpPacketTypeCounter& packet_counter) = 0;
140};
141
sprang@webrtc.orgdc50aae2013-11-20 16:47:07142// Callback, used to notify an observer whenever new rates have been estimated.
143class BitrateStatisticsObserver {
144 public:
145 virtual ~BitrateStatisticsObserver() {}
146
sprangcd349d92016-07-13 16:11:28147 virtual void Notify(uint32_t total_bitrate_bps,
148 uint32_t retransmit_bitrate_bps,
stefan@webrtc.org0bae1fa2014-11-05 14:05:29149 uint32_t ssrc) = 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07150};
151
pbos@webrtc.orgce4e9a32014-12-18 13:50:16152struct FrameCounts {
153 FrameCounts() : key_frames(0), delta_frames(0) {}
154 int key_frames;
155 int delta_frames;
156};
157
asapersson@webrtc.orgd08d3892014-12-16 12:03:11158// Callback, used to notify an observer whenever frame counts have been updated.
sprang@webrtc.orgdc50aae2013-11-20 16:47:07159class FrameCountObserver {
160 public:
sprang@webrtc.org72964bd2013-11-21 09:09:54161 virtual ~FrameCountObserver() {}
pbos@webrtc.orgce4e9a32014-12-18 13:50:16162 virtual void FrameCountUpdated(const FrameCounts& frame_counts,
163 uint32_t ssrc) = 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07164};
165
stefan@webrtc.org168f23f2014-07-11 13:44:02166// Callback, used to notify an observer whenever the send-side delay is updated.
167class SendSideDelayObserver {
168 public:
169 virtual ~SendSideDelayObserver() {}
170 virtual void SendSideDelayUpdated(int avg_delay_ms,
171 int max_delay_ms,
172 uint32_t ssrc) = 0;
173};
174
asapersson35151f32016-05-03 06:44:01175// Callback, used to notify an observer whenever a packet is sent to the
176// transport.
177// TODO(asapersson): This class will remove the need for SendSideDelayObserver.
178// Remove SendSideDelayObserver once possible.
179class SendPacketObserver {
180 public:
181 virtual ~SendPacketObserver() {}
182 virtual void OnSendPacket(uint16_t packet_id,
183 int64_t capture_time_ms,
184 uint32_t ssrc) = 0;
185};
186
michaelt4da30442016-11-17 09:38:43187// Callback, used to notify an observer when the overhead per packet
188// has changed.
189class OverheadObserver {
190 public:
191 virtual ~OverheadObserver() = default;
192 virtual void OnOverheadChanged(size_t overhead_bytes_per_packet) = 0;
193};
194
niklase@google.com470e71d2011-07-07 08:21:25195// ==================================================================
196// Voice specific types
197// ==================================================================
198
199// Each codec supported can be described by this structure.
mallinath@webrtc.org0209e562014-03-21 00:41:28200struct CodecInst {
201 int pltype;
202 char plname[RTP_PAYLOAD_NAME_SIZE];
203 int plfreq;
204 int pacsize;
Peter Kasting69558702016-01-13 00:26:35205 size_t channels;
mallinath@webrtc.org0209e562014-03-21 00:41:28206 int rate; // bits/sec unlike {start,min,max}Bitrate elsewhere in this file!
207
208 bool operator==(const CodecInst& other) const {
209 return pltype == other.pltype &&
210 (STR_CASE_CMP(plname, other.plname) == 0) &&
solenberg634b86e2016-09-01 14:54:53211 plfreq == other.plfreq && pacsize == other.pacsize &&
212 channels == other.channels && rate == other.rate;
mallinath@webrtc.org0209e562014-03-21 00:41:28213 }
214
solenberg634b86e2016-09-01 14:54:53215 bool operator!=(const CodecInst& other) const { return !(*this == other); }
niklase@google.com470e71d2011-07-07 08:21:25216};
217
niklase@google.com470e71d2011-07-07 08:21:25218// RTP
solenberg634b86e2016-09-01 14:54:53219enum { kRtpCsrcSize = 15 }; // RFC 3550 page 13
niklase@google.com470e71d2011-07-07 08:21:25220
solenberg634b86e2016-09-01 14:54:53221// NETEQ statistics.
222struct NetworkStatistics {
223 // current jitter buffer size in ms
224 uint16_t currentBufferSize;
225 // preferred (optimal) buffer size in ms
226 uint16_t preferredBufferSize;
227 // adding extra delay due to "peaky jitter"
228 bool jitterPeaksFound;
Gustaf Ullbergb0a02072017-10-02 10:00:34229 // Stats below correspond to similarly-named fields in the WebRTC stats spec.
230 // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats
Steve Anton2dbc69f2017-08-25 00:15:13231 uint64_t totalSamplesReceived;
Steve Anton2dbc69f2017-08-25 00:15:13232 uint64_t concealedSamples;
Gustaf Ullberg9a2e9062017-09-18 07:28:20233 uint64_t concealmentEvents;
Gustaf Ullbergb0a02072017-10-02 10:00:34234 uint64_t jitterBufferDelayMs;
235 // Stats below DO NOT correspond directly to anything in the WebRTC stats
solenberg634b86e2016-09-01 14:54:53236 // Loss rate (network + late); fraction between 0 and 1, scaled to Q14.
237 uint16_t currentPacketLossRate;
238 // Late loss rate; fraction between 0 and 1, scaled to Q14.
minyue-webrtc0c3ca752017-08-23 13:59:38239 union {
240 RTC_DEPRECATED uint16_t currentDiscardRate;
241 };
solenberg634b86e2016-09-01 14:54:53242 // fraction (of original stream) of synthesized audio inserted through
243 // expansion (in Q14)
244 uint16_t currentExpandRate;
245 // fraction (of original stream) of synthesized speech inserted through
246 // expansion (in Q14)
247 uint16_t currentSpeechExpandRate;
248 // fraction of synthesized speech inserted through pre-emptive expansion
249 // (in Q14)
250 uint16_t currentPreemptiveRate;
251 // fraction of data removed through acceleration (in Q14)
252 uint16_t currentAccelerateRate;
253 // fraction of data coming from secondary decoding (in Q14)
254 uint16_t currentSecondaryDecodedRate;
minyue-webrtc0e320ec2017-08-28 11:51:27255 // Fraction of secondary data, including FEC and RED, that is discarded (in
256 // Q14). Discarding of secondary data can be caused by the reception of the
257 // primary data, obsoleting the secondary data. It can also be caused by early
258 // or late arrival of secondary data.
minyue-webrtc0c3ca752017-08-23 13:59:38259 uint16_t currentSecondaryDiscardedRate;
solenberg634b86e2016-09-01 14:54:53260 // clock-drift in parts-per-million (negative or positive)
261 int32_t clockDriftPPM;
262 // average packet waiting time in the jitter buffer (ms)
263 int meanWaitingTimeMs;
264 // median packet waiting time in the jitter buffer (ms)
265 int medianWaitingTimeMs;
266 // min packet waiting time in the jitter buffer (ms)
267 int minWaitingTimeMs;
268 // max packet waiting time in the jitter buffer (ms)
269 int maxWaitingTimeMs;
270 // added samples in off mode due to packet loss
271 size_t addedSamples;
niklase@google.com470e71d2011-07-07 08:21:25272};
273
wu@webrtc.org24301a62013-12-13 19:17:43274// Statistics for calls to AudioCodingModule::PlayoutData10Ms().
275struct AudioDecodingCallStats {
276 AudioDecodingCallStats()
277 : calls_to_silence_generator(0),
278 calls_to_neteq(0),
279 decoded_normal(0),
280 decoded_plc(0),
281 decoded_cng(0),
henrik.lundin63489782016-09-20 08:47:12282 decoded_plc_cng(0),
283 decoded_muted_output(0) {}
wu@webrtc.org24301a62013-12-13 19:17:43284
285 int calls_to_silence_generator; // Number of calls where silence generated,
286 // and NetEq was disengaged from decoding.
solenberg634b86e2016-09-01 14:54:53287 int calls_to_neteq; // Number of calls to NetEq.
wu@webrtc.org24301a62013-12-13 19:17:43288 int decoded_normal; // Number of calls where audio RTP packet decoded.
solenberg634b86e2016-09-01 14:54:53289 int decoded_plc; // Number of calls resulted in PLC.
wu@webrtc.org24301a62013-12-13 19:17:43290 int decoded_cng; // Number of calls where comfort noise generated due to DTX.
Yves Gerey665174f2018-06-19 13:03:05291 int decoded_plc_cng; // Number of calls resulted where PLC faded to CNG.
henrik.lundin63489782016-09-20 08:47:12292 int decoded_muted_output; // Number of calls returning a muted state output.
wu@webrtc.org24301a62013-12-13 19:17:43293};
294
niklase@google.com470e71d2011-07-07 08:21:25295// ==================================================================
296// Video specific types
297// ==================================================================
298
nisseeb44b392017-04-28 14:18:05299// TODO(nisse): Delete, and switch to fourcc values everywhere?
300// Supported video types.
301enum class VideoType {
302 kUnknown,
303 kI420,
304 kIYUV,
305 kRGB24,
306 kABGR,
307 kARGB,
308 kARGB4444,
309 kRGB565,
310 kARGB1555,
311 kYUY2,
312 kYV12,
313 kUYVY,
314 kMJPEG,
315 kNV21,
316 kNV12,
317 kBGRA,
niklase@google.com470e71d2011-07-07 08:21:25318};
319
magjede69a1a92016-11-25 18:06:31320// TODO(magjed): Move this and other H264 related classes out to their own file.
321namespace H264 {
322
323enum Profile {
324 kProfileConstrainedBaseline,
325 kProfileBaseline,
326 kProfileMain,
327 kProfileConstrainedHigh,
328 kProfileHigh,
329};
330
331} // namespace H264
332
niklase@google.com470e71d2011-07-07 08:21:25333// Video codec types
marpan@webrtc.org5b883172014-11-01 06:10:48334enum VideoCodecType {
Niels Möller520ca4e2018-06-04 09:14:38335 // There are various memset(..., 0, ...) calls in the code that rely on
Kári Tristan Helgason84ccb2d2018-08-16 12:35:26336 // kVideoCodecGeneric being zero.
337 kVideoCodecGeneric = 0,
marpan@webrtc.org5b883172014-11-01 06:10:48338 kVideoCodecVP8,
339 kVideoCodecVP9,
340 kVideoCodecH264,
341 kVideoCodecI420,
Emircan Uysalerd7ae3c32018-01-25 21:01:09342 kVideoCodecMultiplex,
niklase@google.com470e71d2011-07-07 08:21:25343};
344
Sergey Silkin13e74342018-03-02 11:28:00345struct SpatialLayer {
Niels Möllerdef1ef52018-03-19 12:48:44346 bool operator==(const SpatialLayer& other) const;
347 bool operator!=(const SpatialLayer& other) const { return !(*this == other); }
348
solenberg634b86e2016-09-01 14:54:53349 unsigned short width;
350 unsigned short height;
Sergey Silkin1946a3f2018-08-22 09:42:16351 float maxFramerate; // fps.
solenberg634b86e2016-09-01 14:54:53352 unsigned char numberOfTemporalLayers;
353 unsigned int maxBitrate; // kilobits/sec.
354 unsigned int targetBitrate; // kilobits/sec.
355 unsigned int minBitrate; // kilobits/sec.
356 unsigned int qpMax; // minimum quality
Seth Hampsonf6464c92018-01-17 21:55:14357 bool active; // encoded and sent.
pwestin@webrtc.org1da1ce02011-10-13 15:19:55358};
359
Sergey Silkin13e74342018-03-02 11:28:00360// Simulcast is when the same stream is encoded multiple times with different
361// settings such as resolution.
362typedef SpatialLayer SimulcastStream;
sprangce4aef12015-11-02 15:23:20363
Erik Språng566124a2018-04-23 10:32:22364// TODO(sprang): Remove this when downstream projects have been updated.
365using BitrateAllocation = VideoBitrateAllocation;
Erik Språng08127a92016-11-16 15:41:30366
stefan64c0a0a2015-11-27 09:02:31367// Bandwidth over-use detector options. These are used to drive
368// experimentation with bandwidth estimation parameters.
369// See modules/remote_bitrate_estimator/overuse_detector.h
terelius84f83f82016-12-27 18:43:01370// TODO(terelius): This is only used in overuse_estimator.cc, and only in the
371// default constructed state. Can we move the relevant variables into that
372// class and delete this? See also disabled warning at line 27
stefan64c0a0a2015-11-27 09:02:31373struct OverUseDetectorOptions {
374 OverUseDetectorOptions()
solenberg634b86e2016-09-01 14:54:53375 : initial_slope(8.0 / 512.0),
stefan64c0a0a2015-11-27 09:02:31376 initial_offset(0),
377 initial_e(),
378 initial_process_noise(),
379 initial_avg_noise(0.0),
380 initial_var_noise(50) {
381 initial_e[0][0] = 100;
382 initial_e[1][1] = 1e-1;
383 initial_e[0][1] = initial_e[1][0] = 0;
384 initial_process_noise[0] = 1e-13;
stefan1069cac2016-03-10 13:13:21385 initial_process_noise[1] = 1e-3;
stefan64c0a0a2015-11-27 09:02:31386 }
387 double initial_slope;
388 double initial_offset;
389 double initial_e[2][2];
390 double initial_process_noise[2];
391 double initial_avg_noise;
392 double initial_var_noise;
393};
394
isheriff6b4b5f32016-06-08 07:24:21395// Minimum and maximum playout delay values from capture to render.
396// These are best effort values.
397//
398// A value < 0 indicates no change from previous valid value.
399//
400// min = max = 0 indicates that the receiver should try and render
401// frame as soon as possible.
402//
403// min = x, max = y indicates that the receiver is free to adapt
404// in the range (x, y) based on network jitter.
405//
406// Note: Given that this gets embedded in a union, it is up-to the owner to
407// initialize these values.
408struct PlayoutDelay {
409 int min_ms;
410 int max_ms;
411};
412
niklase@google.com470e71d2011-07-07 08:21:25413} // namespace webrtc
andrew@webrtc.orgeda189b2013-09-09 17:50:10414
Mirko Bonadei92ea95e2017-09-15 04:47:31415#endif // COMMON_TYPES_H_