1 /*
2  *  Copyright (c) 2016 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_RTP_RTCP_SOURCE_PLAYOUT_DELAY_ORACLE_H_
12 #define MODULES_RTP_RTCP_SOURCE_PLAYOUT_DELAY_ORACLE_H_
13 
14 #include <stdint.h>
15 
16 #include "modules/include/module_common_types.h"
17 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
18 #include "rtc_base/criticalsection.h"
19 #include "rtc_base/thread_annotations.h"
20 
21 namespace webrtc {
22 
23 // This class tracks the application requests to limit minimum and maximum
24 // playout delay and makes a decision on whether the current RTP frame
25 // should include the playout out delay extension header.
26 //
27 //  Playout delay can be defined in terms of capture and render time as follows:
28 //
29 // Render time = Capture time in receiver time + playout delay
30 //
31 // The application specifies a minimum and maximum limit for the playout delay
32 // which are both communicated to the receiver and the receiver can adapt
33 // the playout delay within this range based on observed network jitter.
34 class PlayoutDelayOracle {
35  public:
36   PlayoutDelayOracle();
37   ~PlayoutDelayOracle();
38 
39   // Returns true if the current frame should include the playout delay
40   // extension
send_playout_delay()41   bool send_playout_delay() const {
42     rtc::CritScope lock(&crit_sect_);
43     return send_playout_delay_;
44   }
45 
46   // Returns current playout delay.
playout_delay()47   PlayoutDelay playout_delay() const {
48     rtc::CritScope lock(&crit_sect_);
49     return playout_delay_;
50   }
51 
52   // Updates the application requested playout delay, current ssrc
53   // and the current sequence number.
54   void UpdateRequest(uint32_t ssrc,
55                      PlayoutDelay playout_delay,
56                      uint16_t seq_num);
57 
58   void OnReceivedRtcpReportBlocks(const ReportBlockList& report_blocks);
59 
60  private:
61   // The playout delay information is updated from the encoder thread(s).
62   // The sequence number feedback is updated from the worker thread.
63   // Guards access to data across multiple threads.
64   rtc::CriticalSection crit_sect_;
65   // The current highest sequence number on which playout delay has been sent.
66   int64_t high_sequence_number_ RTC_GUARDED_BY(crit_sect_);
67   // Indicates whether the playout delay should go on the next frame.
68   bool send_playout_delay_ RTC_GUARDED_BY(crit_sect_);
69   // Sender ssrc.
70   uint32_t ssrc_ RTC_GUARDED_BY(crit_sect_);
71   // Sequence number unwrapper.
72   SequenceNumberUnwrapper unwrapper_ RTC_GUARDED_BY(crit_sect_);
73   // Playout delay values on the next frame if |send_playout_delay_| is set.
74   PlayoutDelay playout_delay_ RTC_GUARDED_BY(crit_sect_);
75 
76   RTC_DISALLOW_COPY_AND_ASSIGN(PlayoutDelayOracle);
77 };
78 
79 }  // namespace webrtc
80 
81 #endif  // MODULES_RTP_RTCP_SOURCE_PLAYOUT_DELAY_ORACLE_H_
82