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 WEBRTC_MODULES_VIDEO_CODING_INTER_FRAME_DELAY_H_
12#define WEBRTC_MODULES_VIDEO_CODING_INTER_FRAME_DELAY_H_
13
14#include "webrtc/typedefs.h"
15
16namespace webrtc
17{
18
19class VCMInterFrameDelay
20{
21public:
22    VCMInterFrameDelay(int64_t currentWallClock);
23
24    // Resets the estimate. Zeros are given as parameters.
25    void Reset(int64_t currentWallClock);
26
27    // Calculates the delay of a frame with the given timestamp.
28    // This method is called when the frame is complete.
29    //
30    // Input:
31    //          - timestamp         : RTP timestamp of a received frame
32    //          - *delay            : Pointer to memory where the result should be stored
33    //          - currentWallClock  : The current time in milliseconds.
34    //                                Should be -1 for normal operation, only used 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    // Returns the current difference between incoming timestamps
41    //
42    // Return value                 : Wrap-around compensated difference between incoming
43    //                                timestamps.
44    uint32_t CurrentTimeStampDiffMs() const;
45
46private:
47    // Controls if the RTP timestamp counter has had a wrap around
48    // between the current and the previously received frame.
49    //
50    // Input:
51    //          - timestmap         : RTP timestamp of the current frame.
52    void CheckForWrapArounds(uint32_t timestamp);
53
54    int64_t         _zeroWallClock; // Local timestamp of the first video packet received
55    int32_t         _wrapArounds;   // Number of wrapArounds detected
56    // The previous timestamp passed to the delay estimate
57    uint32_t        _prevTimestamp;
58    // The previous wall clock timestamp used by the delay estimate
59    int64_t         _prevWallClock;
60    // Wrap-around compensated difference between incoming timestamps
61    int64_t         _dTS;
62};
63
64}  // namespace webrtc
65
66#endif // WEBRTC_MODULES_VIDEO_CODING_INTER_FRAME_DELAY_H_
67