JRTPLIB  3.11.2 (development version)
rtcpscheduler.h
Go to the documentation of this file.
1 /*
2 
3  This file is a part of JRTPLIB
4  Copyright (c) 1999-2017 Jori Liesenborgs
5 
6  Contact: jori.liesenborgs@gmail.com
7 
8  This library was developed at the Expertise Centre for Digital Media
9  (http://www.edm.uhasselt.be), a research center of the Hasselt University
10  (http://www.uhasselt.be). The library is based upon work done for
11  my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
12 
13  Permission is hereby granted, free of charge, to any person obtaining a
14  copy of this software and associated documentation files (the "Software"),
15  to deal in the Software without restriction, including without limitation
16  the rights to use, copy, modify, merge, publish, distribute, sublicense,
17  and/or sell copies of the Software, and to permit persons to whom the
18  Software is furnished to do so, subject to the following conditions:
19 
20  The above copyright notice and this permission notice shall be included
21  in all copies or substantial portions of the Software.
22 
23  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
29  IN THE SOFTWARE.
30 
31 */
32 
37 #ifndef RTCPSCHEDULER_H
38 
39 #define RTCPSCHEDULER_H
40 
41 #include "rtpconfig.h"
42 #include "rtptimeutilities.h"
43 #include "rtprandom.h"
44 
45 namespace jrtplib
46 {
47 
48 class RTCPCompoundPacket;
49 class RTPPacket;
50 class RTPSources;
51 
53 class JRTPLIB_IMPORTEXPORT RTCPSchedulerParams
54 {
55 public:
58 
60  int SetRTCPBandwidth(double bw);
61 
63  double GetRTCPBandwidth() const { return bandwidth; }
64 
66  int SetSenderBandwidthFraction(double fraction);
67 
69  double GetSenderBandwidthFraction() const { return senderfraction; }
70 
73 
75  RTPTime GetMinimumTransmissionInterval() const { return mininterval; }
76 
78  void SetUseHalfAtStartup(bool usehalf) { usehalfatstartup = usehalf; }
79 
83  bool GetUseHalfAtStartup() const { return usehalfatstartup; }
84 
86  void SetRequestImmediateBYE(bool v) { immediatebye = v; }
87 
91  bool GetRequestImmediateBYE() const { return immediatebye; }
92 private:
93  double bandwidth;
94  double senderfraction;
95  RTPTime mininterval;
96  bool usehalfatstartup;
97  bool immediatebye;
98 };
99 
101 class JRTPLIB_IMPORTEXPORT RTCPScheduler
102 {
103 public:
111  RTCPScheduler(RTPSources &sources, RTPRandom &rtprand);
112  ~RTCPScheduler();
113 
115  void Reset();
116 
118  void SetParameters(const RTCPSchedulerParams &params) { schedparams = params; }
119 
121  RTCPSchedulerParams GetParameters() const { return schedparams; }
122 
124  void SetHeaderOverhead(size_t numbytes) { headeroverhead = numbytes; }
125 
127  size_t GetHeaderOverhead() const { return headeroverhead; }
128 
130  void AnalyseIncoming(RTCPCompoundPacket &rtcpcomppack);
131 
133  void AnalyseOutgoing(RTCPCompoundPacket &rtcpcomppack);
134 
137 
141  void ScheduleBYEPacket(size_t packetsize);
142 
148 
154  bool IsTime();
155 
161 private:
162  void CalculateNextRTCPTime();
163  void PerformReverseReconsideration();
164  RTPTime CalculateBYETransmissionInterval();
165  RTPTime CalculateTransmissionInterval(bool sender);
166 
167  RTPSources &sources;
168  RTCPSchedulerParams schedparams;
169  size_t headeroverhead;
170  size_t avgrtcppacksize;
171  bool hassentrtcp;
172  bool firstcall;
173  RTPTime nextrtcptime;
174  RTPTime prevrtcptime;
175  int pmembers;
176 
177  // for BYE packet scheduling
178  bool byescheduled;
179  int byemembers,pbyemembers;
180  size_t avgbyepacketsize;
181  bool sendbyenow;
182 
183  RTPRandom &rtprand;
184 };
185 
186 } // end namespace
187 
188 #endif // RTCPSCHEDULER_H
189 
Represents an RTCP compound packet.
Definition: rtcpcompoundpacket.h:54
Describes parameters used by the RTCPScheduler class.
Definition: rtcpscheduler.h:54
bool GetRequestImmediateBYE() const
Returns if the scheduler will schedule a BYE packet to be sent immediately if allowed (default is tru...
Definition: rtcpscheduler.h:91
void SetUseHalfAtStartup(bool usehalf)
If usehalf is true, only use half the minimum interval before sending the first RTCP compound packet.
Definition: rtcpscheduler.h:78
bool GetUseHalfAtStartup() const
Returns true if only half the minimum interval should be used before sending the first RTCP compound ...
Definition: rtcpscheduler.h:83
int SetMinimumTransmissionInterval(const RTPTime &t)
Sets the minimum (deterministic) interval between RTCP compound packets to t.
double GetRTCPBandwidth() const
Returns the used RTCP bandwidth in bytes per second (default is 1000).
Definition: rtcpscheduler.h:63
double GetSenderBandwidthFraction() const
Returns the fraction of the RTCP bandwidth reserved for senders (default is 25%).
Definition: rtcpscheduler.h:69
int SetRTCPBandwidth(double bw)
Sets the RTCP bandwidth to be used to bw (in bytes per second).
void SetRequestImmediateBYE(bool v)
If v is true, the scheduler will schedule a BYE packet to be sent immediately if allowed.
Definition: rtcpscheduler.h:86
RTPTime GetMinimumTransmissionInterval() const
Returns the minimum RTCP transmission interval (default is 5 seconds).
Definition: rtcpscheduler.h:75
int SetSenderBandwidthFraction(double fraction)
Sets the fraction of the RTCP bandwidth reserved for senders to fraction.
This class determines when RTCP compound packets should be sent.
Definition: rtcpscheduler.h:102
void AnalyseOutgoing(RTCPCompoundPacket &rtcpcomppack)
For each outgoing RTCP compound packet, this function has to be called for the scheduler to work corr...
RTPTime GetTransmissionDelay()
Returns the delay after which an RTCP compound will possibly have to be sent.
void Reset()
Resets the scheduler.
RTCPScheduler(RTPSources &sources, RTPRandom &rtprand)
Creates an instance which will use the source table RTPSources to determine when RTCP compound packet...
RTPTime CalculateDeterministicInterval(bool sender=false)
Calculates the deterministic interval at this time.
size_t GetHeaderOverhead() const
Returns the currently used header overhead.
Definition: rtcpscheduler.h:127
void SetParameters(const RTCPSchedulerParams &params)
Sets the scheduler parameters to be used to params.
Definition: rtcpscheduler.h:118
RTCPSchedulerParams GetParameters() const
Returns the currently used scheduler parameters.
Definition: rtcpscheduler.h:121
void ActiveMemberDecrease()
This function has to be called each time a member times out or sends a BYE packet.
bool IsTime()
This function returns true if it's time to send an RTCP compound packet and false otherwise.
void ScheduleBYEPacket(size_t packetsize)
Asks the scheduler to schedule an RTCP compound packet containing a BYE packetl; the compound packet ...
void SetHeaderOverhead(size_t numbytes)
Sets the header overhead from underlying protocols (for example UDP and IP) to numbytes.
Definition: rtcpscheduler.h:124
void AnalyseIncoming(RTCPCompoundPacket &rtcpcomppack)
For each incoming RTCP compound packet, this function has to be called for the scheduler to work corr...
Interface for generating random numbers.
Definition: rtprandom.h:52
Represents a table in which information about the participating sources is kept.
Definition: rtpsources.h:75
This class is used to specify wallclock time, delay intervals etc.
Definition: rtptimeutilities.h:86