blob: 3f63eb5435471d2fb1dd6b6ebb0ac15a8f95e66e [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>
kwiberg5bf4e082016-12-19 14:04:0416#include <ostream>
pbos@webrtc.org1e92b0a2014-05-15 09:35:0617#include <string>
pbos@webrtc.orgf577ae92014-03-19 08:43:5718#include <vector>
19
Mirko Bonadei92ea95e2017-09-15 04:47:3120#include "api/array_view.h"
21#include "api/optional.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3122#include "rtc_base/checks.h"
23#include "rtc_base/deprecation.h"
Mirko Bonadei71207422017-09-15 11:58:0924#include "typedefs.h" // NOLINT(build/include)
niklase@google.com470e71d2011-07-07 08:21:2525
andrew@webrtc.org88b8b0d2012-08-14 00:05:5626#if defined(_MSC_VER)
27// Disable "new behavior: elements of array will be default initialized"
28// warning. Affects OverUseDetectorOptions.
solenberg634b86e2016-09-01 14:54:5329#pragma warning(disable : 4351)
andrew@webrtc.org88b8b0d2012-08-14 00:05:5630#endif
31
kwiberg77eab702016-09-29 00:42:0132#if defined(WEBRTC_EXPORT)
andrew@webrtc.org88b8b0d2012-08-14 00:05:5633#define WEBRTC_DLLEXPORT _declspec(dllexport)
kwiberg77eab702016-09-29 00:42:0134#elif defined(WEBRTC_DLL)
andrew@webrtc.org88b8b0d2012-08-14 00:05:5635#define WEBRTC_DLLEXPORT _declspec(dllimport)
niklase@google.com470e71d2011-07-07 08:21:2536#else
andrew@webrtc.org88b8b0d2012-08-14 00:05:5637#define WEBRTC_DLLEXPORT
niklase@google.com470e71d2011-07-07 08:21:2538#endif
39
40#ifndef NULL
andrew@webrtc.org88b8b0d2012-08-14 00:05:5641#define NULL 0
niklase@google.com470e71d2011-07-07 08:21:2542#endif
43
Peter Boström8b79b072016-02-26 15:31:3744#define RTP_PAYLOAD_NAME_SIZE 32u
henrika@webrtc.orgf75901f2012-01-16 08:45:4245
mallinath@webrtc.org0209e562014-03-21 00:41:2846#if defined(WEBRTC_WIN) || defined(WIN32)
andrew@webrtc.orgeda189b2013-09-09 17:50:1047// Compares two strings without regard to case.
48#define STR_CASE_CMP(s1, s2) ::_stricmp(s1, s2)
49// Compares characters of two strings without regard to case.
50#define STR_NCASE_CMP(s1, s2, n) ::_strnicmp(s1, s2, n)
51#else
52#define STR_CASE_CMP(s1, s2) ::strcasecmp(s1, s2)
53#define STR_NCASE_CMP(s1, s2, n) ::strncasecmp(s1, s2, n)
54#endif
55
niklase@google.com470e71d2011-07-07 08:21:2556namespace webrtc {
57
tommia6219cc2016-06-15 17:30:1458class RewindableStream {
59 public:
60 virtual ~RewindableStream() {}
61 virtual int Rewind() = 0;
niklase@google.com470e71d2011-07-07 08:21:2562};
63
tommia6219cc2016-06-15 17:30:1464class InStream : public RewindableStream {
65 public:
66 // Reads |len| bytes from file to |buf|. Returns the number of bytes read
67 // or -1 on error.
68 virtual int Read(void* buf, size_t len) = 0;
69};
70
71class OutStream : public RewindableStream {
72 public:
73 // Writes |len| bytes from |buf| to file. The actual writing may happen
74 // some time later. Call Flush() to force a write.
75 virtual bool Write(const void* buf, size_t len) = 0;
niklase@google.com470e71d2011-07-07 08:21:2576};
77
Niels Möller4f6b6c22017-12-01 10:17:3278// For the deprecated MediaFile module.
solenberg634b86e2016-09-01 14:54:5379enum FileFormats {
80 kFileFormatWavFile = 1,
solenberg634b86e2016-09-01 14:54:5381 kFileFormatPcm16kHzFile = 7,
82 kFileFormatPcm8kHzFile = 8,
Minyue Li85a3b6b2017-09-01 12:36:3383 kFileFormatPcm32kHzFile = 9,
niklase@google.com470e71d2011-07-07 08:21:2584};
85
pbos22993e12015-10-19 09:39:0686enum FrameType {
87 kEmptyFrame = 0,
88 kAudioFrameSpeech = 1,
89 kAudioFrameCN = 2,
90 kVideoFrameKey = 3,
91 kVideoFrameDelta = 4,
sprang@webrtc.org71f055f2013-12-04 15:09:2792};
93
sprang@webrtc.orgdc50aae2013-11-20 16:47:0794// Statistics for an RTCP channel
sprang@webrtc.orgfe5d36b2013-10-28 09:21:0795struct RtcpStatistics {
sprang@webrtc.orgfe5d36b2013-10-28 09:21:0796 RtcpStatistics()
solenberg634b86e2016-09-01 14:54:5397 : fraction_lost(0),
srte186d9c32017-08-04 12:03:5398 packets_lost(0),
99 extended_highest_sequence_number(0),
solenberg634b86e2016-09-01 14:54:53100 jitter(0) {}
sprang@webrtc.orgfe5d36b2013-10-28 09:21:07101
102 uint8_t fraction_lost;
srte186d9c32017-08-04 12:03:53103 union {
Harald Alvestrandc7c41912017-12-08 08:59:34104 int32_t packets_lost; // Defined as a 24 bit signed integer in RTCP
srte186d9c32017-08-04 12:03:53105 RTC_DEPRECATED uint32_t cumulative_lost;
106 };
107 union {
108 uint32_t extended_highest_sequence_number;
109 RTC_DEPRECATED uint32_t extended_max_sequence_number;
110 };
sprang@webrtc.orgfe5d36b2013-10-28 09:21:07111 uint32_t jitter;
sprang@webrtc.orgfe5d36b2013-10-28 09:21:07112};
113
sprang@webrtc.orgdc50aae2013-11-20 16:47:07114class RtcpStatisticsCallback {
115 public:
116 virtual ~RtcpStatisticsCallback() {}
117
118 virtual void StatisticsUpdated(const RtcpStatistics& statistics,
119 uint32_t ssrc) = 0;
pbos@webrtc.orgce4e9a32014-12-18 13:50:16120 virtual void CNameChanged(const char* cname, uint32_t ssrc) = 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07121};
122
asapersson@webrtc.org8098e072014-02-19 11:59:02123// Statistics for RTCP packet types.
124struct RtcpPacketTypeCounter {
125 RtcpPacketTypeCounter()
solenberg634b86e2016-09-01 14:54:53126 : first_packet_time_ms(-1),
127 nack_packets(0),
128 fir_packets(0),
129 pli_packets(0),
130 nack_requests(0),
131 unique_nack_requests(0) {}
asapersson@webrtc.org8098e072014-02-19 11:59:02132
133 void Add(const RtcpPacketTypeCounter& other) {
134 nack_packets += other.nack_packets;
135 fir_packets += other.fir_packets;
136 pli_packets += other.pli_packets;
asapersson@webrtc.org2dd31342014-10-29 12:42:30137 nack_requests += other.nack_requests;
138 unique_nack_requests += other.unique_nack_requests;
asapersson@webrtc.orgd08d3892014-12-16 12:03:11139 if (other.first_packet_time_ms != -1 &&
solenberg634b86e2016-09-01 14:54:53140 (other.first_packet_time_ms < first_packet_time_ms ||
141 first_packet_time_ms == -1)) {
asapersson@webrtc.orgd08d3892014-12-16 12:03:11142 // Use oldest time.
143 first_packet_time_ms = other.first_packet_time_ms;
144 }
145 }
146
sprang07fb9be2016-02-24 15:55:00147 void Subtract(const RtcpPacketTypeCounter& other) {
148 nack_packets -= other.nack_packets;
149 fir_packets -= other.fir_packets;
150 pli_packets -= other.pli_packets;
151 nack_requests -= other.nack_requests;
152 unique_nack_requests -= other.unique_nack_requests;
153 if (other.first_packet_time_ms != -1 &&
154 (other.first_packet_time_ms > first_packet_time_ms ||
155 first_packet_time_ms == -1)) {
156 // Use youngest time.
157 first_packet_time_ms = other.first_packet_time_ms;
158 }
159 }
160
asapersson@webrtc.orgd08d3892014-12-16 12:03:11161 int64_t TimeSinceFirstPacketInMs(int64_t now_ms) const {
162 return (first_packet_time_ms == -1) ? -1 : (now_ms - first_packet_time_ms);
asapersson@webrtc.org8098e072014-02-19 11:59:02163 }
164
asapersson@webrtc.org2dd31342014-10-29 12:42:30165 int UniqueNackRequestsInPercent() const {
166 if (nack_requests == 0) {
167 return 0;
168 }
solenberg634b86e2016-09-01 14:54:53169 return static_cast<int>((unique_nack_requests * 100.0f / nack_requests) +
170 0.5f);
asapersson@webrtc.org2dd31342014-10-29 12:42:30171 }
172
solenberg634b86e2016-09-01 14:54:53173 int64_t first_packet_time_ms; // Time when first packet is sent/received.
174 uint32_t nack_packets; // Number of RTCP NACK packets.
175 uint32_t fir_packets; // Number of RTCP FIR packets.
176 uint32_t pli_packets; // Number of RTCP PLI packets.
177 uint32_t nack_requests; // Number of NACKed RTP packets.
asapersson@webrtc.org2dd31342014-10-29 12:42:30178 uint32_t unique_nack_requests; // Number of unique NACKed RTP packets.
asapersson@webrtc.org8098e072014-02-19 11:59:02179};
180
pbos@webrtc.org1d0fa5d2015-02-19 12:47:00181class RtcpPacketTypeCounterObserver {
182 public:
183 virtual ~RtcpPacketTypeCounterObserver() {}
184 virtual void RtcpPacketTypesCounterUpdated(
185 uint32_t ssrc,
186 const RtcpPacketTypeCounter& packet_counter) = 0;
187};
188
asapersson@webrtc.orgd08d3892014-12-16 12:03:11189// Rate statistics for a stream.
sprang@webrtc.orgdc50aae2013-11-20 16:47:07190struct BitrateStatistics {
sprangcd349d92016-07-13 16:11:28191 BitrateStatistics() : bitrate_bps(0), packet_rate(0) {}
sprang@webrtc.orgdc50aae2013-11-20 16:47:07192
solenberg634b86e2016-09-01 14:54:53193 uint32_t bitrate_bps; // Bitrate in bits per second.
194 uint32_t packet_rate; // Packet rate in packets per second.
sprang@webrtc.orgdc50aae2013-11-20 16:47:07195};
196
197// Callback, used to notify an observer whenever new rates have been estimated.
198class BitrateStatisticsObserver {
199 public:
200 virtual ~BitrateStatisticsObserver() {}
201
sprangcd349d92016-07-13 16:11:28202 virtual void Notify(uint32_t total_bitrate_bps,
203 uint32_t retransmit_bitrate_bps,
stefan@webrtc.org0bae1fa2014-11-05 14:05:29204 uint32_t ssrc) = 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07205};
206
pbos@webrtc.orgce4e9a32014-12-18 13:50:16207struct FrameCounts {
208 FrameCounts() : key_frames(0), delta_frames(0) {}
209 int key_frames;
210 int delta_frames;
211};
212
asapersson@webrtc.orgd08d3892014-12-16 12:03:11213// Callback, used to notify an observer whenever frame counts have been updated.
sprang@webrtc.orgdc50aae2013-11-20 16:47:07214class FrameCountObserver {
215 public:
sprang@webrtc.org72964bd2013-11-21 09:09:54216 virtual ~FrameCountObserver() {}
pbos@webrtc.orgce4e9a32014-12-18 13:50:16217 virtual void FrameCountUpdated(const FrameCounts& frame_counts,
218 uint32_t ssrc) = 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07219};
220
stefan@webrtc.org168f23f2014-07-11 13:44:02221// Callback, used to notify an observer whenever the send-side delay is updated.
222class SendSideDelayObserver {
223 public:
224 virtual ~SendSideDelayObserver() {}
225 virtual void SendSideDelayUpdated(int avg_delay_ms,
226 int max_delay_ms,
227 uint32_t ssrc) = 0;
228};
229
asapersson35151f32016-05-03 06:44:01230// Callback, used to notify an observer whenever a packet is sent to the
231// transport.
232// TODO(asapersson): This class will remove the need for SendSideDelayObserver.
233// Remove SendSideDelayObserver once possible.
234class SendPacketObserver {
235 public:
236 virtual ~SendPacketObserver() {}
237 virtual void OnSendPacket(uint16_t packet_id,
238 int64_t capture_time_ms,
239 uint32_t ssrc) = 0;
240};
241
michaelt4da30442016-11-17 09:38:43242// Callback, used to notify an observer when the overhead per packet
243// has changed.
244class OverheadObserver {
245 public:
246 virtual ~OverheadObserver() = default;
247 virtual void OnOverheadChanged(size_t overhead_bytes_per_packet) = 0;
248};
249
niklase@google.com470e71d2011-07-07 08:21:25250// ==================================================================
251// Voice specific types
252// ==================================================================
253
254// Each codec supported can be described by this structure.
mallinath@webrtc.org0209e562014-03-21 00:41:28255struct CodecInst {
256 int pltype;
257 char plname[RTP_PAYLOAD_NAME_SIZE];
258 int plfreq;
259 int pacsize;
Peter Kasting69558702016-01-13 00:26:35260 size_t channels;
mallinath@webrtc.org0209e562014-03-21 00:41:28261 int rate; // bits/sec unlike {start,min,max}Bitrate elsewhere in this file!
262
263 bool operator==(const CodecInst& other) const {
264 return pltype == other.pltype &&
265 (STR_CASE_CMP(plname, other.plname) == 0) &&
solenberg634b86e2016-09-01 14:54:53266 plfreq == other.plfreq && pacsize == other.pacsize &&
267 channels == other.channels && rate == other.rate;
mallinath@webrtc.org0209e562014-03-21 00:41:28268 }
269
solenberg634b86e2016-09-01 14:54:53270 bool operator!=(const CodecInst& other) const { return !(*this == other); }
kwiberg5bf4e082016-12-19 14:04:04271
272 friend std::ostream& operator<<(std::ostream& os, const CodecInst& ci) {
273 os << "{pltype: " << ci.pltype;
274 os << ", plname: " << ci.plname;
275 os << ", plfreq: " << ci.plfreq;
276 os << ", pacsize: " << ci.pacsize;
277 os << ", channels: " << ci.channels;
278 os << ", rate: " << ci.rate << "}";
279 return os;
280 }
niklase@google.com470e71d2011-07-07 08:21:25281};
282
niklase@google.com470e71d2011-07-07 08:21:25283// RTP
solenberg634b86e2016-09-01 14:54:53284enum { kRtpCsrcSize = 15 }; // RFC 3550 page 13
niklase@google.com470e71d2011-07-07 08:21:25285
solenberg634b86e2016-09-01 14:54:53286enum PayloadFrequencies {
287 kFreq8000Hz = 8000,
288 kFreq16000Hz = 16000,
289 kFreq32000Hz = 32000
niklase@google.com470e71d2011-07-07 08:21:25290};
291
solenberg634b86e2016-09-01 14:54:53292// Degree of bandwidth reduction.
293enum VadModes {
294 kVadConventional = 0, // lowest reduction
295 kVadAggressiveLow,
296 kVadAggressiveMid,
297 kVadAggressiveHigh // highest reduction
niklase@google.com470e71d2011-07-07 08:21:25298};
299
solenberg634b86e2016-09-01 14:54:53300// NETEQ statistics.
301struct NetworkStatistics {
302 // current jitter buffer size in ms
303 uint16_t currentBufferSize;
304 // preferred (optimal) buffer size in ms
305 uint16_t preferredBufferSize;
306 // adding extra delay due to "peaky jitter"
307 bool jitterPeaksFound;
Gustaf Ullbergb0a02072017-10-02 10:00:34308 // Stats below correspond to similarly-named fields in the WebRTC stats spec.
309 // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats
Steve Anton2dbc69f2017-08-25 00:15:13310 uint64_t totalSamplesReceived;
Steve Anton2dbc69f2017-08-25 00:15:13311 uint64_t concealedSamples;
Gustaf Ullberg9a2e9062017-09-18 07:28:20312 uint64_t concealmentEvents;
Gustaf Ullbergb0a02072017-10-02 10:00:34313 uint64_t jitterBufferDelayMs;
314 // Stats below DO NOT correspond directly to anything in the WebRTC stats
solenberg634b86e2016-09-01 14:54:53315 // Loss rate (network + late); fraction between 0 and 1, scaled to Q14.
316 uint16_t currentPacketLossRate;
317 // Late loss rate; fraction between 0 and 1, scaled to Q14.
minyue-webrtc0c3ca752017-08-23 13:59:38318 union {
319 RTC_DEPRECATED uint16_t currentDiscardRate;
320 };
solenberg634b86e2016-09-01 14:54:53321 // fraction (of original stream) of synthesized audio inserted through
322 // expansion (in Q14)
323 uint16_t currentExpandRate;
324 // fraction (of original stream) of synthesized speech inserted through
325 // expansion (in Q14)
326 uint16_t currentSpeechExpandRate;
327 // fraction of synthesized speech inserted through pre-emptive expansion
328 // (in Q14)
329 uint16_t currentPreemptiveRate;
330 // fraction of data removed through acceleration (in Q14)
331 uint16_t currentAccelerateRate;
332 // fraction of data coming from secondary decoding (in Q14)
333 uint16_t currentSecondaryDecodedRate;
minyue-webrtc0e320ec2017-08-28 11:51:27334 // Fraction of secondary data, including FEC and RED, that is discarded (in
335 // Q14). Discarding of secondary data can be caused by the reception of the
336 // primary data, obsoleting the secondary data. It can also be caused by early
337 // or late arrival of secondary data.
minyue-webrtc0c3ca752017-08-23 13:59:38338 uint16_t currentSecondaryDiscardedRate;
solenberg634b86e2016-09-01 14:54:53339 // clock-drift in parts-per-million (negative or positive)
340 int32_t clockDriftPPM;
341 // average packet waiting time in the jitter buffer (ms)
342 int meanWaitingTimeMs;
343 // median packet waiting time in the jitter buffer (ms)
344 int medianWaitingTimeMs;
345 // min packet waiting time in the jitter buffer (ms)
346 int minWaitingTimeMs;
347 // max packet waiting time in the jitter buffer (ms)
348 int maxWaitingTimeMs;
349 // added samples in off mode due to packet loss
350 size_t addedSamples;
niklase@google.com470e71d2011-07-07 08:21:25351};
352
wu@webrtc.org24301a62013-12-13 19:17:43353// Statistics for calls to AudioCodingModule::PlayoutData10Ms().
354struct AudioDecodingCallStats {
355 AudioDecodingCallStats()
356 : calls_to_silence_generator(0),
357 calls_to_neteq(0),
358 decoded_normal(0),
359 decoded_plc(0),
360 decoded_cng(0),
henrik.lundin63489782016-09-20 08:47:12361 decoded_plc_cng(0),
362 decoded_muted_output(0) {}
wu@webrtc.org24301a62013-12-13 19:17:43363
364 int calls_to_silence_generator; // Number of calls where silence generated,
365 // and NetEq was disengaged from decoding.
solenberg634b86e2016-09-01 14:54:53366 int calls_to_neteq; // Number of calls to NetEq.
wu@webrtc.org24301a62013-12-13 19:17:43367 int decoded_normal; // Number of calls where audio RTP packet decoded.
solenberg634b86e2016-09-01 14:54:53368 int decoded_plc; // Number of calls resulted in PLC.
wu@webrtc.org24301a62013-12-13 19:17:43369 int decoded_cng; // Number of calls where comfort noise generated due to DTX.
370 int decoded_plc_cng; // Number of calls resulted where PLC faded to CNG.
henrik.lundin63489782016-09-20 08:47:12371 int decoded_muted_output; // Number of calls returning a muted state output.
wu@webrtc.org24301a62013-12-13 19:17:43372};
373
niklase@google.com470e71d2011-07-07 08:21:25374// ==================================================================
375// Video specific types
376// ==================================================================
377
nisseeb44b392017-04-28 14:18:05378// TODO(nisse): Delete, and switch to fourcc values everywhere?
379// Supported video types.
380enum class VideoType {
381 kUnknown,
382 kI420,
383 kIYUV,
384 kRGB24,
385 kABGR,
386 kARGB,
387 kARGB4444,
388 kRGB565,
389 kARGB1555,
390 kYUY2,
391 kYV12,
392 kUYVY,
393 kMJPEG,
394 kNV21,
395 kNV12,
396 kBGRA,
niklase@google.com470e71d2011-07-07 08:21:25397};
398
399// Video codec
solenberg634b86e2016-09-01 14:54:53400enum { kMaxSimulcastStreams = 4 };
sprangce4aef12015-11-02 15:23:20401enum { kMaxSpatialLayers = 5 };
solenberg634b86e2016-09-01 14:54:53402enum { kMaxTemporalStreams = 4 };
niklase@google.com470e71d2011-07-07 08:21:25403
solenberg634b86e2016-09-01 14:54:53404enum VideoCodecComplexity {
405 kComplexityNormal = 0,
406 kComplexityHigh = 1,
407 kComplexityHigher = 2,
408 kComplexityMax = 3
niklase@google.com470e71d2011-07-07 08:21:25409};
410
stefan@webrtc.orgefd0a482011-12-29 10:12:35411enum VP8ResilienceMode {
412 kResilienceOff, // The stream produced by the encoder requires a
413 // recovery frame (typically a key frame) to be
414 // decodable after a packet loss.
415 kResilientStream, // A stream produced by the encoder is resilient to
416 // packet losses, but packets within a frame subsequent
417 // to a loss can't be decoded.
418 kResilientFrames // Same as kResilientStream but with added resilience
419 // within a frame.
420};
421
Peter Boström7b971e72016-01-19 15:26:16422class TemporalLayersFactory;
niklase@google.com470e71d2011-07-07 08:21:25423// VP8 specific
mallinath@webrtc.org0209e562014-03-21 00:41:28424struct VideoCodecVP8 {
Niels Möllerdef1ef52018-03-19 12:48:44425 bool operator==(const VideoCodecVP8& other) const;
426 bool operator!=(const VideoCodecVP8& other) const {
427 return !(*this == other);
428 }
mallinath@webrtc.org0209e562014-03-21 00:41:28429 VideoCodecComplexity complexity;
solenberg634b86e2016-09-01 14:54:53430 VP8ResilienceMode resilience;
431 unsigned char numberOfTemporalLayers;
432 bool denoisingOn;
solenberg634b86e2016-09-01 14:54:53433 bool automaticResizeOn;
434 bool frameDroppingOn;
435 int keyFrameInterval;
Erik Språng08127a92016-11-16 15:41:30436 TemporalLayersFactory* tl_factory;
niklase@google.com470e71d2011-07-07 08:21:25437};
438
asaperssona9455ab2015-07-31 13:10:09439// VP9 specific.
marpan@webrtc.org5b883172014-11-01 06:10:48440struct VideoCodecVP9 {
Niels Möllerdef1ef52018-03-19 12:48:44441 bool operator==(const VideoCodecVP9& other) const;
442 bool operator!=(const VideoCodecVP9& other) const {
443 return !(*this == other);
444 }
marpan@webrtc.org5b883172014-11-01 06:10:48445 VideoCodecComplexity complexity;
asapersson15dcb382017-06-08 09:55:08446 bool resilienceOn;
solenberg634b86e2016-09-01 14:54:53447 unsigned char numberOfTemporalLayers;
448 bool denoisingOn;
449 bool frameDroppingOn;
450 int keyFrameInterval;
451 bool adaptiveQpMode;
452 bool automaticResizeOn;
453 unsigned char numberOfSpatialLayers;
454 bool flexibleMode;
marpan@webrtc.org5b883172014-11-01 06:10:48455};
456
magjede69a1a92016-11-25 18:06:31457// TODO(magjed): Move this and other H264 related classes out to their own file.
458namespace H264 {
459
460enum Profile {
461 kProfileConstrainedBaseline,
462 kProfileBaseline,
463 kProfileMain,
464 kProfileConstrainedHigh,
465 kProfileHigh,
466};
467
468} // namespace H264
469
stefan@webrtc.orgb9f54532014-07-04 12:42:07470// H264 specific.
marpan@webrtc.org5b883172014-11-01 06:10:48471struct VideoCodecH264 {
Niels Möllerdef1ef52018-03-19 12:48:44472 bool operator==(const VideoCodecH264& other) const;
473 bool operator!=(const VideoCodecH264& other) const {
474 return !(*this == other);
475 }
solenberg634b86e2016-09-01 14:54:53476 bool frameDroppingOn;
477 int keyFrameInterval;
marpan@webrtc.org5b883172014-11-01 06:10:48478 // These are NULL/0 if not externally negotiated.
479 const uint8_t* spsData;
solenberg634b86e2016-09-01 14:54:53480 size_t spsLen;
marpan@webrtc.org5b883172014-11-01 06:10:48481 const uint8_t* ppsData;
solenberg634b86e2016-09-01 14:54:53482 size_t ppsLen;
magjede69a1a92016-11-25 18:06:31483 H264::Profile profile;
stefan@webrtc.orgb9f54532014-07-04 12:42:07484};
485
niklase@google.com470e71d2011-07-07 08:21:25486// Video codec types
marpan@webrtc.org5b883172014-11-01 06:10:48487enum VideoCodecType {
488 kVideoCodecVP8,
489 kVideoCodecVP9,
490 kVideoCodecH264,
491 kVideoCodecI420,
492 kVideoCodecRED,
493 kVideoCodecULPFEC,
brandtr87d7d772016-11-07 11:03:41494 kVideoCodecFlexfec,
marpan@webrtc.org5b883172014-11-01 06:10:48495 kVideoCodecGeneric,
Emircan Uysalerd7ae3c32018-01-25 21:01:09496 kVideoCodecMultiplex,
marpan@webrtc.org5b883172014-11-01 06:10:48497 kVideoCodecUnknown
niklase@google.com470e71d2011-07-07 08:21:25498};
499
Erik Språng08127a92016-11-16 15:41:30500// Translates from name of codec to codec type and vice versa.
kthelgason1cdddc92017-08-24 10:52:48501const char* CodecTypeToPayloadString(VideoCodecType type);
502VideoCodecType PayloadStringToCodecType(const std::string& name);
Erik Språng08127a92016-11-16 15:41:30503
marpan@webrtc.org5b883172014-11-01 06:10:48504union VideoCodecUnion {
solenberg634b86e2016-09-01 14:54:53505 VideoCodecVP8 VP8;
506 VideoCodecVP9 VP9;
507 VideoCodecH264 H264;
niklase@google.com470e71d2011-07-07 08:21:25508};
509
Sergey Silkin13e74342018-03-02 11:28:00510struct SpatialLayer {
Niels Möllerdef1ef52018-03-19 12:48:44511 bool operator==(const SpatialLayer& other) const;
512 bool operator!=(const SpatialLayer& other) const { return !(*this == other); }
513
solenberg634b86e2016-09-01 14:54:53514 unsigned short width;
515 unsigned short height;
516 unsigned char numberOfTemporalLayers;
517 unsigned int maxBitrate; // kilobits/sec.
518 unsigned int targetBitrate; // kilobits/sec.
519 unsigned int minBitrate; // kilobits/sec.
520 unsigned int qpMax; // minimum quality
Seth Hampsonf6464c92018-01-17 21:55:14521 bool active; // encoded and sent.
pwestin@webrtc.org1da1ce02011-10-13 15:19:55522};
523
Sergey Silkin13e74342018-03-02 11:28:00524// Simulcast is when the same stream is encoded multiple times with different
525// settings such as resolution.
526typedef SpatialLayer SimulcastStream;
sprangce4aef12015-11-02 15:23:20527
solenberg634b86e2016-09-01 14:54:53528enum VideoCodecMode { kRealtimeVideo, kScreensharing };
stefan@webrtc.orgeb917922013-02-18 14:40:18529
niklase@google.com470e71d2011-07-07 08:21:25530// Common video codec properties
hta257dc392016-10-25 16:05:06531class VideoCodec {
532 public:
533 VideoCodec();
534
535 // Public variables. TODO(hta): Make them private with accessors.
solenberg634b86e2016-09-01 14:54:53536 VideoCodecType codecType;
solenberg634b86e2016-09-01 14:54:53537 unsigned char plType;
niklase@google.com470e71d2011-07-07 08:21:25538
solenberg634b86e2016-09-01 14:54:53539 unsigned short width;
540 unsigned short height;
niklase@google.com470e71d2011-07-07 08:21:25541
solenberg634b86e2016-09-01 14:54:53542 unsigned int startBitrate; // kilobits/sec.
543 unsigned int maxBitrate; // kilobits/sec.
544 unsigned int minBitrate; // kilobits/sec.
545 unsigned int targetBitrate; // kilobits/sec.
pbos@webrtc.org3c412b22014-03-24 12:36:52546
Stefan Holmer144475b2017-03-10 14:08:26547 uint32_t maxFramerate;
niklase@google.com470e71d2011-07-07 08:21:25548
Seth Hampsonf6464c92018-01-17 21:55:14549 // This enables/disables encoding and sending when there aren't multiple
550 // simulcast streams,by allocating 0 bitrate if inactive.
551 bool active;
552
solenberg634b86e2016-09-01 14:54:53553 unsigned int qpMax;
554 unsigned char numberOfSimulcastStreams;
555 SimulcastStream simulcastStream[kMaxSimulcastStreams];
sprangce4aef12015-11-02 15:23:20556 SpatialLayer spatialLayers[kMaxSpatialLayers];
stefan@webrtc.orgeb917922013-02-18 14:40:18557
solenberg634b86e2016-09-01 14:54:53558 VideoCodecMode mode;
559 bool expect_encode_from_texture;
andresp@webrtc.org185bae42013-05-14 08:02:25560
ilnik04f4d122017-06-19 14:18:55561 // Timing frames configuration. There is delay of delay_ms between two
562 // consequent timing frames, excluding outliers. Frame is always made a
563 // timing frame if it's at least outlier_ratio in percent of "ideal" average
564 // frame given bitrate and framerate, i.e. if it's bigger than
565 // |outlier_ratio / 100.0 * bitrate_bps / fps| in bits. This way, timing
566 // frames will not be sent too often usually. Yet large frames will always
567 // have timing information for debug purposes because they are more likely to
568 // cause extra delays.
569 struct TimingFrameTriggerThresholds {
570 int64_t delay_ms;
571 uint16_t outlier_ratio_percent;
572 } timing_frame_thresholds;
573
Peter Boström7b971e72016-01-19 15:26:16574 bool operator==(const VideoCodec& other) const = delete;
575 bool operator!=(const VideoCodec& other) const = delete;
hta257dc392016-10-25 16:05:06576
577 // Accessors for codec specific information.
578 // There is a const version of each that returns a reference,
579 // and a non-const version that returns a pointer, in order
580 // to allow modification of the parameters.
581 VideoCodecVP8* VP8();
582 const VideoCodecVP8& VP8() const;
583 VideoCodecVP9* VP9();
584 const VideoCodecVP9& VP9() const;
585 VideoCodecH264* H264();
586 const VideoCodecH264& H264() const;
587
hta527d3472016-11-17 07:23:04588 private:
hta257dc392016-10-25 16:05:06589 // TODO(hta): Consider replacing the union with a pointer type.
590 // This will allow removing the VideoCodec* types from this file.
hta527d3472016-11-17 07:23:04591 VideoCodecUnion codec_specific_;
niklase@google.com470e71d2011-07-07 08:21:25592};
astor@webrtc.orgbd7aeba2012-06-26 10:47:04593
Erik Språng08127a92016-11-16 15:41:30594class BitrateAllocation {
595 public:
596 static const uint32_t kMaxBitrateBps;
597 BitrateAllocation();
598
599 bool SetBitrate(size_t spatial_index,
600 size_t temporal_index,
601 uint32_t bitrate_bps);
602
erikvarga@webrtc.org01f2ec32017-11-15 13:58:23603 bool HasBitrate(size_t spatial_index, size_t temporal_index) const;
604
Erik Språng08127a92016-11-16 15:41:30605 uint32_t GetBitrate(size_t spatial_index, size_t temporal_index) const;
606
erikvarga@webrtc.org01f2ec32017-11-15 13:58:23607 // Whether the specific spatial layers has the bitrate set in any of its
608 // temporal layers.
609 bool IsSpatialLayerUsed(size_t spatial_index) const;
610
Erik Språng08127a92016-11-16 15:41:30611 // Get the sum of all the temporal layer for a specific spatial layer.
612 uint32_t GetSpatialLayerSum(size_t spatial_index) const;
613
Sergey Silkin86684962018-03-28 17:32:37614 // Sum of bitrates of temporal layers, from layer 0 to |temporal_index|
615 // inclusive, of specified spatial layer |spatial_index|. Bitrates of lower
616 // spatial layers are not included.
617 uint32_t GetTemporalLayerSum(size_t spatial_index,
618 size_t temporal_index) const;
619
Erik Språngbb60a3a2018-03-19 17:25:10620 // Returns a vector of the temporal layer bitrates for the specific spatial
621 // layer. Length of the returned vector is cropped to the highest temporal
622 // layer with a defined bitrate.
623 std::vector<uint32_t> GetTemporalLayerAllocation(size_t spatial_index) const;
624
Erik Språng08127a92016-11-16 15:41:30625 uint32_t get_sum_bps() const { return sum_; } // Sum of all bitrates.
626 uint32_t get_sum_kbps() const { return (sum_ + 500) / 1000; }
627
628 inline bool operator==(const BitrateAllocation& other) const {
629 return memcmp(bitrates_, other.bitrates_, sizeof(bitrates_)) == 0;
630 }
631 inline bool operator!=(const BitrateAllocation& other) const {
632 return !(*this == other);
633 }
634
sprangd0fc37a2017-06-22 12:40:25635 // Expensive, please use only in tests.
636 std::string ToString() const;
sprangd0fc37a2017-06-22 12:40:25637
Erik Språng08127a92016-11-16 15:41:30638 private:
639 uint32_t sum_;
640 uint32_t bitrates_[kMaxSpatialLayers][kMaxTemporalStreams];
erikvarga@webrtc.org01f2ec32017-11-15 13:58:23641 bool has_bitrate_[kMaxSpatialLayers][kMaxTemporalStreams];
Erik Språng08127a92016-11-16 15:41:30642};
643
stefan64c0a0a2015-11-27 09:02:31644// Bandwidth over-use detector options. These are used to drive
645// experimentation with bandwidth estimation parameters.
646// See modules/remote_bitrate_estimator/overuse_detector.h
terelius84f83f82016-12-27 18:43:01647// TODO(terelius): This is only used in overuse_estimator.cc, and only in the
648// default constructed state. Can we move the relevant variables into that
649// class and delete this? See also disabled warning at line 27
stefan64c0a0a2015-11-27 09:02:31650struct OverUseDetectorOptions {
651 OverUseDetectorOptions()
solenberg634b86e2016-09-01 14:54:53652 : initial_slope(8.0 / 512.0),
stefan64c0a0a2015-11-27 09:02:31653 initial_offset(0),
654 initial_e(),
655 initial_process_noise(),
656 initial_avg_noise(0.0),
657 initial_var_noise(50) {
658 initial_e[0][0] = 100;
659 initial_e[1][1] = 1e-1;
660 initial_e[0][1] = initial_e[1][0] = 0;
661 initial_process_noise[0] = 1e-13;
stefan1069cac2016-03-10 13:13:21662 initial_process_noise[1] = 1e-3;
stefan64c0a0a2015-11-27 09:02:31663 }
664 double initial_slope;
665 double initial_offset;
666 double initial_e[2][2];
667 double initial_process_noise[2];
668 double initial_avg_noise;
669 double initial_var_noise;
670};
671
wu@webrtc.orga9890802013-12-13 00:21:03672// This structure will have the information about when packet is actually
673// received by socket.
674struct PacketTime {
henrike@webrtc.org82d3cb62014-04-29 17:50:47675 PacketTime() : timestamp(-1), not_before(-1) {}
676 PacketTime(int64_t timestamp, int64_t not_before)
solenberg634b86e2016-09-01 14:54:53677 : timestamp(timestamp), not_before(not_before) {}
wu@webrtc.orga9890802013-12-13 00:21:03678
henrike@webrtc.org82d3cb62014-04-29 17:50:47679 int64_t timestamp; // Receive time after socket delivers the data.
680 int64_t not_before; // Earliest possible time the data could have arrived,
681 // indicating the potential error in the |timestamp|
682 // value,in case the system is busy.
683 // For example, the time of the last select() call.
684 // If unknown, this value will be set to zero.
wu@webrtc.orga9890802013-12-13 00:21:03685};
686
isheriff6b4b5f32016-06-08 07:24:21687// Minimum and maximum playout delay values from capture to render.
688// These are best effort values.
689//
690// A value < 0 indicates no change from previous valid value.
691//
692// min = max = 0 indicates that the receiver should try and render
693// frame as soon as possible.
694//
695// min = x, max = y indicates that the receiver is free to adapt
696// in the range (x, y) based on network jitter.
697//
698// Note: Given that this gets embedded in a union, it is up-to the owner to
699// initialize these values.
700struct PlayoutDelay {
701 int min_ms;
702 int max_ms;
703};
704
niklase@google.com470e71d2011-07-07 08:21:25705} // namespace webrtc
andrew@webrtc.orgeda189b2013-09-09 17:50:10706
Mirko Bonadei92ea95e2017-09-15 04:47:31707#endif // COMMON_TYPES_H_