1 /*
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 
11 #ifndef MODULES_VIDEO_CODING_INTER_FRAME_DELAY_H_
12 #define MODULES_VIDEO_CODING_INTER_FRAME_DELAY_H_
13 
14 #include <stdint.h>
15 
16 namespace webrtc {
17 
18 class VCMInterFrameDelay {
19  public:
20   explicit VCMInterFrameDelay(int64_t currentWallClock);
21 
22   // Resets the estimate. Zeros are given as parameters.
23   void Reset(int64_t currentWallClock);
24 
25   // Calculates the delay of a frame with the given timestamp.
26   // This method is called when the frame is complete.
27   //
28   // Input:
29   //          - timestamp         : RTP timestamp of a received frame.
30   //          - *delay            : Pointer to memory where the result should be
31   //                                stored.
32   //          - currentWallClock  : The current time in milliseconds.
33   //                                Should be -1 for normal operation, only used
34   //                                for testing.
35   // Return value                 : true if OK, false when reordered timestamps.
36   bool CalculateDelay(uint32_t timestamp,
37                       int64_t* delay,
38                       int64_t currentWallClock);
39 
40  private:
41   // Controls if the RTP timestamp counter has had a wrap around between the
42   // current and the previously received frame.
43   //
44   // Input:
45   //          - timestamp         : RTP timestamp of the current frame.
46   void CheckForWrapArounds(uint32_t timestamp);
47 
48   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;
56 };
57 
58 }  // namespace webrtc
59 
60 #endif  // MODULES_VIDEO_CODING_INTER_FRAME_DELAY_H_
61