blob: 4a760509634c710cdeaf8b2fca21bbe362238e5a [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
phoglund@webrtc.org8bfee842012-02-17 09:32:48 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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 06:47:31 +020011#ifndef COMMON_TYPES_H_
12#define COMMON_TYPES_H_
niklase@google.com470e71d2011-07-07 08:21:25 +000013
pbos@webrtc.orgf577ae92014-03-19 08:43:57 +000014#include <stddef.h>
mallinath@webrtc.org0209e562014-03-21 00:41:28 +000015#include <string.h>
pbos@webrtc.org1e92b0a2014-05-15 09:35:06 +000016#include <string>
pbos@webrtc.orgf577ae92014-03-19 08:43:57 +000017#include <vector>
18
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "api/array_view.h"
20#include "api/optional.h"
Erik Språng566124a2018-04-23 12:32:22 +020021// TODO(sprang): Remove this include when all usage includes it directly.
22#include "api/video/video_bitrate_allocation.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020023#include "rtc_base/checks.h"
24#include "rtc_base/deprecation.h"
Mirko Bonadei71207422017-09-15 13:58:09 +020025#include "typedefs.h" // NOLINT(build/include)
niklase@google.com470e71d2011-07-07 08:21:25 +000026
andrew@webrtc.org88b8b0d2012-08-14 00:05:56 +000027#if defined(_MSC_VER)
28// Disable "new behavior: elements of array will be default initialized"
29// warning. Affects OverUseDetectorOptions.
solenberg634b86e2016-09-01 07:54:53 -070030#pragma warning(disable : 4351)
andrew@webrtc.org88b8b0d2012-08-14 00:05:56 +000031#endif
32
Peter Boström8b79b072016-02-26 16:31:37 +010033#define RTP_PAYLOAD_NAME_SIZE 32u
henrika@webrtc.orgf75901f2012-01-16 08:45:42 +000034
mallinath@webrtc.org0209e562014-03-21 00:41:28 +000035#if defined(WEBRTC_WIN) || defined(WIN32)
andrew@webrtc.orgeda189b2013-09-09 17:50:10 +000036// Compares two strings without regard to case.
37#define STR_CASE_CMP(s1, s2) ::_stricmp(s1, s2)
38// Compares characters of two strings without regard to case.
39#define STR_NCASE_CMP(s1, s2, n) ::_strnicmp(s1, s2, n)
40#else
41#define STR_CASE_CMP(s1, s2) ::strcasecmp(s1, s2)
42#define STR_NCASE_CMP(s1, s2, n) ::strncasecmp(s1, s2, n)
43#endif
44
niklase@google.com470e71d2011-07-07 08:21:25 +000045namespace webrtc {
46
pbos22993e12015-10-19 02:39:06 -070047enum FrameType {
48 kEmptyFrame = 0,
49 kAudioFrameSpeech = 1,
50 kAudioFrameCN = 2,
51 kVideoFrameKey = 3,
52 kVideoFrameDelta = 4,
sprang@webrtc.org71f055f2013-12-04 15:09:27 +000053};
54
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +000055// Statistics for an RTCP channel
sprang@webrtc.orgfe5d36b2013-10-28 09:21:07 +000056struct RtcpStatistics {
sprang@webrtc.orgfe5d36b2013-10-28 09:21:07 +000057 RtcpStatistics()
solenberg634b86e2016-09-01 07:54:53 -070058 : fraction_lost(0),
srte186d9c32017-08-04 05:03:53 -070059 packets_lost(0),
60 extended_highest_sequence_number(0),
solenberg634b86e2016-09-01 07:54:53 -070061 jitter(0) {}
sprang@webrtc.orgfe5d36b2013-10-28 09:21:07 +000062
63 uint8_t fraction_lost;
srte186d9c32017-08-04 05:03:53 -070064 union {
Harald Alvestrandc7c41912017-12-08 09:59:34 +010065 int32_t packets_lost; // Defined as a 24 bit signed integer in RTCP
srte186d9c32017-08-04 05:03:53 -070066 RTC_DEPRECATED uint32_t cumulative_lost;
67 };
68 union {
69 uint32_t extended_highest_sequence_number;
70 RTC_DEPRECATED uint32_t extended_max_sequence_number;
71 };
sprang@webrtc.orgfe5d36b2013-10-28 09:21:07 +000072 uint32_t jitter;
sprang@webrtc.orgfe5d36b2013-10-28 09:21:07 +000073};
74
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +000075class RtcpStatisticsCallback {
76 public:
77 virtual ~RtcpStatisticsCallback() {}
78
79 virtual void StatisticsUpdated(const RtcpStatistics& statistics,
80 uint32_t ssrc) = 0;
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +000081 virtual void CNameChanged(const char* cname, uint32_t ssrc) = 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +000082};
83
asapersson@webrtc.org8098e072014-02-19 11:59:02 +000084// Statistics for RTCP packet types.
85struct RtcpPacketTypeCounter {
86 RtcpPacketTypeCounter()
solenberg634b86e2016-09-01 07:54:53 -070087 : first_packet_time_ms(-1),
88 nack_packets(0),
89 fir_packets(0),
90 pli_packets(0),
91 nack_requests(0),
92 unique_nack_requests(0) {}
asapersson@webrtc.org8098e072014-02-19 11:59:02 +000093
94 void Add(const RtcpPacketTypeCounter& other) {
95 nack_packets += other.nack_packets;
96 fir_packets += other.fir_packets;
97 pli_packets += other.pli_packets;
asapersson@webrtc.org2dd31342014-10-29 12:42:30 +000098 nack_requests += other.nack_requests;
99 unique_nack_requests += other.unique_nack_requests;
asapersson@webrtc.orgd08d3892014-12-16 12:03:11 +0000100 if (other.first_packet_time_ms != -1 &&
solenberg634b86e2016-09-01 07:54:53 -0700101 (other.first_packet_time_ms < first_packet_time_ms ||
102 first_packet_time_ms == -1)) {
asapersson@webrtc.orgd08d3892014-12-16 12:03:11 +0000103 // Use oldest time.
104 first_packet_time_ms = other.first_packet_time_ms;
105 }
106 }
107
sprang07fb9be2016-02-24 07:55:00 -0800108 void Subtract(const RtcpPacketTypeCounter& other) {
109 nack_packets -= other.nack_packets;
110 fir_packets -= other.fir_packets;
111 pli_packets -= other.pli_packets;
112 nack_requests -= other.nack_requests;
113 unique_nack_requests -= other.unique_nack_requests;
114 if (other.first_packet_time_ms != -1 &&
115 (other.first_packet_time_ms > first_packet_time_ms ||
116 first_packet_time_ms == -1)) {
117 // Use youngest time.
118 first_packet_time_ms = other.first_packet_time_ms;
119 }
120 }
121
asapersson@webrtc.orgd08d3892014-12-16 12:03:11 +0000122 int64_t TimeSinceFirstPacketInMs(int64_t now_ms) const {
123 return (first_packet_time_ms == -1) ? -1 : (now_ms - first_packet_time_ms);
asapersson@webrtc.org8098e072014-02-19 11:59:02 +0000124 }
125
asapersson@webrtc.org2dd31342014-10-29 12:42:30 +0000126 int UniqueNackRequestsInPercent() const {
127 if (nack_requests == 0) {
128 return 0;
129 }
solenberg634b86e2016-09-01 07:54:53 -0700130 return static_cast<int>((unique_nack_requests * 100.0f / nack_requests) +
131 0.5f);
asapersson@webrtc.org2dd31342014-10-29 12:42:30 +0000132 }
133
solenberg634b86e2016-09-01 07:54:53 -0700134 int64_t first_packet_time_ms; // Time when first packet is sent/received.
135 uint32_t nack_packets; // Number of RTCP NACK packets.
136 uint32_t fir_packets; // Number of RTCP FIR packets.
137 uint32_t pli_packets; // Number of RTCP PLI packets.
138 uint32_t nack_requests; // Number of NACKed RTP packets.
asapersson@webrtc.org2dd31342014-10-29 12:42:30 +0000139 uint32_t unique_nack_requests; // Number of unique NACKed RTP packets.
asapersson@webrtc.org8098e072014-02-19 11:59:02 +0000140};
141
pbos@webrtc.org1d0fa5d2015-02-19 12:47:00 +0000142class RtcpPacketTypeCounterObserver {
143 public:
144 virtual ~RtcpPacketTypeCounterObserver() {}
145 virtual void RtcpPacketTypesCounterUpdated(
146 uint32_t ssrc,
147 const RtcpPacketTypeCounter& packet_counter) = 0;
148};
149
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000150// Callback, used to notify an observer whenever new rates have been estimated.
151class BitrateStatisticsObserver {
152 public:
153 virtual ~BitrateStatisticsObserver() {}
154
sprangcd349d92016-07-13 09:11:28 -0700155 virtual void Notify(uint32_t total_bitrate_bps,
156 uint32_t retransmit_bitrate_bps,
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +0000157 uint32_t ssrc) = 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000158};
159
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +0000160struct FrameCounts {
161 FrameCounts() : key_frames(0), delta_frames(0) {}
162 int key_frames;
163 int delta_frames;
164};
165
asapersson@webrtc.orgd08d3892014-12-16 12:03:11 +0000166// Callback, used to notify an observer whenever frame counts have been updated.
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000167class FrameCountObserver {
168 public:
sprang@webrtc.org72964bd2013-11-21 09:09:54 +0000169 virtual ~FrameCountObserver() {}
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +0000170 virtual void FrameCountUpdated(const FrameCounts& frame_counts,
171 uint32_t ssrc) = 0;
sprang@webrtc.orgdc50aae2013-11-20 16:47:07 +0000172};
173
stefan@webrtc.org168f23f2014-07-11 13:44:02 +0000174// Callback, used to notify an observer whenever the send-side delay is updated.
175class SendSideDelayObserver {
176 public:
177 virtual ~SendSideDelayObserver() {}
178 virtual void SendSideDelayUpdated(int avg_delay_ms,
179 int max_delay_ms,
180 uint32_t ssrc) = 0;
181};
182
asapersson35151f32016-05-02 23:44:01 -0700183// Callback, used to notify an observer whenever a packet is sent to the
184// transport.
185// TODO(asapersson): This class will remove the need for SendSideDelayObserver.
186// Remove SendSideDelayObserver once possible.
187class SendPacketObserver {
188 public:
189 virtual ~SendPacketObserver() {}
190 virtual void OnSendPacket(uint16_t packet_id,
191 int64_t capture_time_ms,
192 uint32_t ssrc) = 0;
193};
194
michaelt4da30442016-11-17 01:38:43 -0800195// Callback, used to notify an observer when the overhead per packet
196// has changed.
197class OverheadObserver {
198 public:
199 virtual ~OverheadObserver() = default;
200 virtual void OnOverheadChanged(size_t overhead_bytes_per_packet) = 0;
201};
202
niklase@google.com470e71d2011-07-07 08:21:25 +0000203// ==================================================================
204// Voice specific types
205// ==================================================================
206
207// Each codec supported can be described by this structure.
mallinath@webrtc.org0209e562014-03-21 00:41:28 +0000208struct CodecInst {
209 int pltype;
210 char plname[RTP_PAYLOAD_NAME_SIZE];
211 int plfreq;
212 int pacsize;
Peter Kasting69558702016-01-12 16:26:35 -0800213 size_t channels;
mallinath@webrtc.org0209e562014-03-21 00:41:28 +0000214 int rate; // bits/sec unlike {start,min,max}Bitrate elsewhere in this file!
215
216 bool operator==(const CodecInst& other) const {
217 return pltype == other.pltype &&
218 (STR_CASE_CMP(plname, other.plname) == 0) &&
solenberg634b86e2016-09-01 07:54:53 -0700219 plfreq == other.plfreq && pacsize == other.pacsize &&
220 channels == other.channels && rate == other.rate;
mallinath@webrtc.org0209e562014-03-21 00:41:28 +0000221 }
222
solenberg634b86e2016-09-01 07:54:53 -0700223 bool operator!=(const CodecInst& other) const { return !(*this == other); }
niklase@google.com470e71d2011-07-07 08:21:25 +0000224};
225
niklase@google.com470e71d2011-07-07 08:21:25 +0000226// RTP
solenberg634b86e2016-09-01 07:54:53 -0700227enum { kRtpCsrcSize = 15 }; // RFC 3550 page 13
niklase@google.com470e71d2011-07-07 08:21:25 +0000228
solenberg634b86e2016-09-01 07:54:53 -0700229// NETEQ statistics.
230struct NetworkStatistics {
231 // current jitter buffer size in ms
232 uint16_t currentBufferSize;
233 // preferred (optimal) buffer size in ms
234 uint16_t preferredBufferSize;
235 // adding extra delay due to "peaky jitter"
236 bool jitterPeaksFound;
Gustaf Ullbergb0a02072017-10-02 12:00:34 +0200237 // Stats below correspond to similarly-named fields in the WebRTC stats spec.
238 // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats
Steve Anton2dbc69f2017-08-24 17:15:13 -0700239 uint64_t totalSamplesReceived;
Steve Anton2dbc69f2017-08-24 17:15:13 -0700240 uint64_t concealedSamples;
Gustaf Ullberg9a2e9062017-09-18 09:28:20 +0200241 uint64_t concealmentEvents;
Gustaf Ullbergb0a02072017-10-02 12:00:34 +0200242 uint64_t jitterBufferDelayMs;
243 // Stats below DO NOT correspond directly to anything in the WebRTC stats
solenberg634b86e2016-09-01 07:54:53 -0700244 // Loss rate (network + late); fraction between 0 and 1, scaled to Q14.
245 uint16_t currentPacketLossRate;
246 // Late loss rate; fraction between 0 and 1, scaled to Q14.
minyue-webrtc0c3ca752017-08-23 15:59:38 +0200247 union {
248 RTC_DEPRECATED uint16_t currentDiscardRate;
249 };
solenberg634b86e2016-09-01 07:54:53 -0700250 // fraction (of original stream) of synthesized audio inserted through
251 // expansion (in Q14)
252 uint16_t currentExpandRate;
253 // fraction (of original stream) of synthesized speech inserted through
254 // expansion (in Q14)
255 uint16_t currentSpeechExpandRate;
256 // fraction of synthesized speech inserted through pre-emptive expansion
257 // (in Q14)
258 uint16_t currentPreemptiveRate;
259 // fraction of data removed through acceleration (in Q14)
260 uint16_t currentAccelerateRate;
261 // fraction of data coming from secondary decoding (in Q14)
262 uint16_t currentSecondaryDecodedRate;
minyue-webrtc0e320ec2017-08-28 13:51:27 +0200263 // Fraction of secondary data, including FEC and RED, that is discarded (in
264 // Q14). Discarding of secondary data can be caused by the reception of the
265 // primary data, obsoleting the secondary data. It can also be caused by early
266 // or late arrival of secondary data.
minyue-webrtc0c3ca752017-08-23 15:59:38 +0200267 uint16_t currentSecondaryDiscardedRate;
solenberg634b86e2016-09-01 07:54:53 -0700268 // clock-drift in parts-per-million (negative or positive)
269 int32_t clockDriftPPM;
270 // average packet waiting time in the jitter buffer (ms)
271 int meanWaitingTimeMs;
272 // median packet waiting time in the jitter buffer (ms)
273 int medianWaitingTimeMs;
274 // min packet waiting time in the jitter buffer (ms)
275 int minWaitingTimeMs;
276 // max packet waiting time in the jitter buffer (ms)
277 int maxWaitingTimeMs;
278 // added samples in off mode due to packet loss
279 size_t addedSamples;
niklase@google.com470e71d2011-07-07 08:21:25 +0000280};
281
wu@webrtc.org24301a62013-12-13 19:17:43 +0000282// Statistics for calls to AudioCodingModule::PlayoutData10Ms().
283struct AudioDecodingCallStats {
284 AudioDecodingCallStats()
285 : calls_to_silence_generator(0),
286 calls_to_neteq(0),
287 decoded_normal(0),
288 decoded_plc(0),
289 decoded_cng(0),
henrik.lundin63489782016-09-20 01:47:12 -0700290 decoded_plc_cng(0),
291 decoded_muted_output(0) {}
wu@webrtc.org24301a62013-12-13 19:17:43 +0000292
293 int calls_to_silence_generator; // Number of calls where silence generated,
294 // and NetEq was disengaged from decoding.
solenberg634b86e2016-09-01 07:54:53 -0700295 int calls_to_neteq; // Number of calls to NetEq.
wu@webrtc.org24301a62013-12-13 19:17:43 +0000296 int decoded_normal; // Number of calls where audio RTP packet decoded.
solenberg634b86e2016-09-01 07:54:53 -0700297 int decoded_plc; // Number of calls resulted in PLC.
wu@webrtc.org24301a62013-12-13 19:17:43 +0000298 int decoded_cng; // Number of calls where comfort noise generated due to DTX.
Yves Gerey665174f2018-06-19 15:03:05 +0200299 int decoded_plc_cng; // Number of calls resulted where PLC faded to CNG.
henrik.lundin63489782016-09-20 01:47:12 -0700300 int decoded_muted_output; // Number of calls returning a muted state output.
wu@webrtc.org24301a62013-12-13 19:17:43 +0000301};
302
niklase@google.com470e71d2011-07-07 08:21:25 +0000303// ==================================================================
304// Video specific types
305// ==================================================================
306
nisseeb44b392017-04-28 07:18:05 -0700307// TODO(nisse): Delete, and switch to fourcc values everywhere?
308// Supported video types.
309enum class VideoType {
310 kUnknown,
311 kI420,
312 kIYUV,
313 kRGB24,
314 kABGR,
315 kARGB,
316 kARGB4444,
317 kRGB565,
318 kARGB1555,
319 kYUY2,
320 kYV12,
321 kUYVY,
322 kMJPEG,
323 kNV21,
324 kNV12,
325 kBGRA,
niklase@google.com470e71d2011-07-07 08:21:25 +0000326};
327
magjede69a1a92016-11-25 10:06:31 -0800328// TODO(magjed): Move this and other H264 related classes out to their own file.
329namespace H264 {
330
331enum Profile {
332 kProfileConstrainedBaseline,
333 kProfileBaseline,
334 kProfileMain,
335 kProfileConstrainedHigh,
336 kProfileHigh,
337};
338
339} // namespace H264
340
niklase@google.com470e71d2011-07-07 08:21:25 +0000341// Video codec types
marpan@webrtc.org5b883172014-11-01 06:10:48 +0000342enum VideoCodecType {
Niels Möller520ca4e2018-06-04 11:14:38 +0200343 // There are various memset(..., 0, ...) calls in the code that rely on
344 // kVideoCodecUnknown being zero.
345 kVideoCodecUnknown = 0,
marpan@webrtc.org5b883172014-11-01 06:10:48 +0000346 kVideoCodecVP8,
347 kVideoCodecVP9,
348 kVideoCodecH264,
349 kVideoCodecI420,
marpan@webrtc.org5b883172014-11-01 06:10:48 +0000350 kVideoCodecGeneric,
Emircan Uysalerd7ae3c32018-01-25 13:01:09 -0800351 kVideoCodecMultiplex,
Niels Möller520ca4e2018-06-04 11:14:38 +0200352
353 // TODO(nisse): Deprecated aliases, for code expecting RtpVideoCodecTypes.
354 kRtpVideoNone = kVideoCodecUnknown,
355 kRtpVideoGeneric = kVideoCodecGeneric,
356 kRtpVideoVp8 = kVideoCodecVP8,
357 kRtpVideoVp9 = kVideoCodecVP9,
358 kRtpVideoH264 = kVideoCodecH264,
niklase@google.com470e71d2011-07-07 08:21:25 +0000359};
360
Erik Språng08127a92016-11-16 16:41:30 +0100361// Translates from name of codec to codec type and vice versa.
kthelgason1cdddc92017-08-24 03:52:48 -0700362const char* CodecTypeToPayloadString(VideoCodecType type);
363VideoCodecType PayloadStringToCodecType(const std::string& name);
Erik Språng08127a92016-11-16 16:41:30 +0100364
Sergey Silkin13e74342018-03-02 12:28:00 +0100365struct SpatialLayer {
Niels Möllerdef1ef52018-03-19 13:48:44 +0100366 bool operator==(const SpatialLayer& other) const;
367 bool operator!=(const SpatialLayer& other) const { return !(*this == other); }
368
solenberg634b86e2016-09-01 07:54:53 -0700369 unsigned short width;
370 unsigned short height;
371 unsigned char numberOfTemporalLayers;
372 unsigned int maxBitrate; // kilobits/sec.
373 unsigned int targetBitrate; // kilobits/sec.
374 unsigned int minBitrate; // kilobits/sec.
375 unsigned int qpMax; // minimum quality
Seth Hampsonf6464c92018-01-17 13:55:14 -0800376 bool active; // encoded and sent.
pwestin@webrtc.org1da1ce02011-10-13 15:19:55 +0000377};
378
Sergey Silkin13e74342018-03-02 12:28:00 +0100379// Simulcast is when the same stream is encoded multiple times with different
380// settings such as resolution.
381typedef SpatialLayer SimulcastStream;
sprangce4aef12015-11-02 07:23:20 -0800382
Erik Språng566124a2018-04-23 12:32:22 +0200383// TODO(sprang): Remove this when downstream projects have been updated.
384using BitrateAllocation = VideoBitrateAllocation;
Erik Språng08127a92016-11-16 16:41:30 +0100385
stefan64c0a0a2015-11-27 01:02:31 -0800386// Bandwidth over-use detector options. These are used to drive
387// experimentation with bandwidth estimation parameters.
388// See modules/remote_bitrate_estimator/overuse_detector.h
terelius84f83f82016-12-27 10:43:01 -0800389// TODO(terelius): This is only used in overuse_estimator.cc, and only in the
390// default constructed state. Can we move the relevant variables into that
391// class and delete this? See also disabled warning at line 27
stefan64c0a0a2015-11-27 01:02:31 -0800392struct OverUseDetectorOptions {
393 OverUseDetectorOptions()
solenberg634b86e2016-09-01 07:54:53 -0700394 : initial_slope(8.0 / 512.0),
stefan64c0a0a2015-11-27 01:02:31 -0800395 initial_offset(0),
396 initial_e(),
397 initial_process_noise(),
398 initial_avg_noise(0.0),
399 initial_var_noise(50) {
400 initial_e[0][0] = 100;
401 initial_e[1][1] = 1e-1;
402 initial_e[0][1] = initial_e[1][0] = 0;
403 initial_process_noise[0] = 1e-13;
stefan1069cac2016-03-10 05:13:21 -0800404 initial_process_noise[1] = 1e-3;
stefan64c0a0a2015-11-27 01:02:31 -0800405 }
406 double initial_slope;
407 double initial_offset;
408 double initial_e[2][2];
409 double initial_process_noise[2];
410 double initial_avg_noise;
411 double initial_var_noise;
412};
413
wu@webrtc.orga9890802013-12-13 00:21:03 +0000414// This structure will have the information about when packet is actually
415// received by socket.
416struct PacketTime {
henrike@webrtc.org82d3cb62014-04-29 17:50:47 +0000417 PacketTime() : timestamp(-1), not_before(-1) {}
418 PacketTime(int64_t timestamp, int64_t not_before)
solenberg634b86e2016-09-01 07:54:53 -0700419 : timestamp(timestamp), not_before(not_before) {}
wu@webrtc.orga9890802013-12-13 00:21:03 +0000420
henrike@webrtc.org82d3cb62014-04-29 17:50:47 +0000421 int64_t timestamp; // Receive time after socket delivers the data.
422 int64_t not_before; // Earliest possible time the data could have arrived,
423 // indicating the potential error in the |timestamp|
424 // value,in case the system is busy.
425 // For example, the time of the last select() call.
426 // If unknown, this value will be set to zero.
wu@webrtc.orga9890802013-12-13 00:21:03 +0000427};
428
isheriff6b4b5f32016-06-08 00:24:21 -0700429// Minimum and maximum playout delay values from capture to render.
430// These are best effort values.
431//
432// A value < 0 indicates no change from previous valid value.
433//
434// min = max = 0 indicates that the receiver should try and render
435// frame as soon as possible.
436//
437// min = x, max = y indicates that the receiver is free to adapt
438// in the range (x, y) based on network jitter.
439//
440// Note: Given that this gets embedded in a union, it is up-to the owner to
441// initialize these values.
442struct PlayoutDelay {
443 int min_ms;
444 int max_ms;
445};
446
niklase@google.com470e71d2011-07-07 08:21:25 +0000447} // namespace webrtc
andrew@webrtc.orgeda189b2013-09-09 17:50:10 +0000448
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200449#endif // COMMON_TYPES_H_