blob: f121c61498481dbb89e8212eaba67c7d6ce13e79 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
2 * Copyright (c) 2011 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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef MODULES_VIDEO_CODING_INTER_FRAME_DELAY_H_
12#define MODULES_VIDEO_CODING_INTER_FRAME_DELAY_H_
niklase@google.com470e71d2011-07-07 08:21:25 +000013
Niels Möllera12c42a2018-07-25 16:05:48 +020014#include <stdint.h>
niklase@google.com470e71d2011-07-07 08:21:25 +000015
philipel9d3ab612015-12-21 04:12:39 -080016namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000017
philipel9d3ab612015-12-21 04:12:39 -080018class VCMInterFrameDelay {
19 public:
20 explicit VCMInterFrameDelay(int64_t currentWallClock);
niklase@google.com470e71d2011-07-07 08:21:25 +000021
philipel9d3ab612015-12-21 04:12:39 -080022 // Resets the estimate. Zeros are given as parameters.
23 void Reset(int64_t currentWallClock);
niklase@google.com470e71d2011-07-07 08:21:25 +000024
philipel9d3ab612015-12-21 04:12:39 -080025 // Calculates the delay of a frame with the given timestamp.
26 // This method is called when the frame is complete.
27 //
28 // Input:
Åsa Persson288cbe82019-04-01 14:31:46 +020029 // - timestamp : RTP timestamp of a received frame.
philipel9d3ab612015-12-21 04:12:39 -080030 // - *delay : Pointer to memory where the result should be
Åsa Persson288cbe82019-04-01 14:31:46 +020031 // stored.
philipel9d3ab612015-12-21 04:12:39 -080032 // - currentWallClock : The current time in milliseconds.
33 // Should be -1 for normal operation, only used
34 // for testing.
Åsa Persson288cbe82019-04-01 14:31:46 +020035 // Return value : true if OK, false when reordered timestamps.
philipel9d3ab612015-12-21 04:12:39 -080036 bool CalculateDelay(uint32_t timestamp,
37 int64_t* delay,
38 int64_t currentWallClock);
niklase@google.com470e71d2011-07-07 08:21:25 +000039
philipel9d3ab612015-12-21 04:12:39 -080040 private:
Åsa Persson288cbe82019-04-01 14:31:46 +020041 // Controls if the RTP timestamp counter has had a wrap around between the
42 // current and the previously received frame.
philipel9d3ab612015-12-21 04:12:39 -080043 //
44 // Input:
Åsa Persson288cbe82019-04-01 14:31:46 +020045 // - timestamp : RTP timestamp of the current frame.
philipel9d3ab612015-12-21 04:12:39 -080046 void CheckForWrapArounds(uint32_t timestamp);
niklase@google.com470e71d2011-07-07 08:21:25 +000047
philipel9d3ab612015-12-21 04:12:39 -080048 int64_t _zeroWallClock; // Local timestamp of the first video packet received
49 int32_t _wrapArounds; // Number of wrapArounds detected
50 // The previous timestamp passed to the delay estimate
51 uint32_t _prevTimestamp;
52 // The previous wall clock timestamp used by the delay estimate
53 int64_t _prevWallClock;
54 // Wrap-around compensated difference between incoming timestamps
55 int64_t _dTS;
niklase@google.com470e71d2011-07-07 08:21:25 +000056};
57
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +000058} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +000059
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020060#endif // MODULES_VIDEO_CODING_INTER_FRAME_DELAY_H_