/usr/include/liveMedia/RTPSource.hh is in liblivemedia-dev 2011.12.23-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 | /**********
This library is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2.1 of the License, or (at your
option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)
This library is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
more details.
You should have received a copy of the GNU Lesser General Public License
along with this library; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
**********/
// "liveMedia"
// Copyright (c) 1996-2012 Live Networks, Inc. All rights reserved.
// RTP Sources
// C++ header
#ifndef _RTP_SOURCE_HH
#define _RTP_SOURCE_HH
#ifndef _FRAMED_SOURCE_HH
#include "FramedSource.hh"
#endif
#ifndef _RTP_INTERFACE_HH
#include "RTPInterface.hh"
#endif
class RTPReceptionStatsDB; // forward
class RTPSource: public FramedSource {
public:
static Boolean lookupByName(UsageEnvironment& env, char const* sourceName,
RTPSource*& resultSource);
Boolean curPacketMarkerBit() const { return fCurPacketMarkerBit; }
unsigned char rtpPayloadFormat() const { return fRTPPayloadFormat; }
virtual Boolean hasBeenSynchronizedUsingRTCP();
Groupsock* RTPgs() const { return fRTPInterface.gs(); }
virtual void setPacketReorderingThresholdTime(unsigned uSeconds) = 0;
// used by RTCP:
u_int32_t SSRC() const { return fSSRC; }
// Note: This is *our* SSRC, not the SSRC in incoming RTP packets.
// later need a means of changing the SSRC if there's a collision #####
unsigned timestampFrequency() const {return fTimestampFrequency;}
RTPReceptionStatsDB& receptionStatsDB() const {
return *fReceptionStatsDB;
}
u_int32_t lastReceivedSSRC() const { return fLastReceivedSSRC; }
// Note: This is the SSRC in the most recently received RTP packet; not *our* SSRC
void setStreamSocket(int sockNum, unsigned char streamChannelId) {
// hack to allow sending RTP over TCP (RFC 2236, section 10.12)
fRTPInterface.setStreamSocket(sockNum, streamChannelId);
}
void setServerRequestAlternativeByteHandler(int socketNum, ServerRequestAlternativeByteHandler* handler, void* clientData) {
fRTPInterface.setServerRequestAlternativeByteHandler(socketNum, handler, clientData);
}
void setAuxilliaryReadHandler(AuxHandlerFunc* handlerFunc,
void* handlerClientData) {
fRTPInterface.setAuxilliaryReadHandler(handlerFunc,
handlerClientData);
}
// Note that RTP receivers will usually not need to call either of the following two functions, because
// RTP sequence numbers and timestamps are usually not useful to receivers.
// (Our implementation of RTP reception already does all needed handling of RTP sequence numbers and timestamps.)
u_int16_t curPacketRTPSeqNum() const { return fCurPacketRTPSeqNum; }
u_int32_t curPacketRTPTimestamp() const { return fCurPacketRTPTimestamp; }
protected:
RTPSource(UsageEnvironment& env, Groupsock* RTPgs,
unsigned char rtpPayloadFormat, u_int32_t rtpTimestampFrequency);
// abstract base class
virtual ~RTPSource();
protected:
RTPInterface fRTPInterface;
u_int16_t fCurPacketRTPSeqNum;
u_int32_t fCurPacketRTPTimestamp;
Boolean fCurPacketMarkerBit;
Boolean fCurPacketHasBeenSynchronizedUsingRTCP;
u_int32_t fLastReceivedSSRC;
private:
// redefined virtual functions:
virtual Boolean isRTPSource() const;
virtual void getAttributes() const;
private:
unsigned char fRTPPayloadFormat;
unsigned fTimestampFrequency;
u_int32_t fSSRC;
RTPReceptionStatsDB* fReceptionStatsDB;
};
class RTPReceptionStats; // forward
class RTPReceptionStatsDB {
public:
unsigned totNumPacketsReceived() const { return fTotNumPacketsReceived; }
unsigned numActiveSourcesSinceLastReset() const {
return fNumActiveSourcesSinceLastReset;
}
void reset();
// resets periodic stats (called each time they're used to
// generate a reception report)
class Iterator {
public:
Iterator(RTPReceptionStatsDB& receptionStatsDB);
virtual ~Iterator();
RTPReceptionStats* next(Boolean includeInactiveSources = False);
// NULL if none
private:
HashTable::Iterator* fIter;
};
// The following is called whenever a RTP packet is received:
void noteIncomingPacket(u_int32_t SSRC, u_int16_t seqNum,
u_int32_t rtpTimestamp,
unsigned timestampFrequency,
Boolean useForJitterCalculation,
struct timeval& resultPresentationTime,
Boolean& resultHasBeenSyncedUsingRTCP,
unsigned packetSize /* payload only */);
// The following is called whenever a RTCP SR packet is received:
void noteIncomingSR(u_int32_t SSRC,
u_int32_t ntpTimestampMSW, u_int32_t ntpTimestampLSW,
u_int32_t rtpTimestamp);
// The following is called when a RTCP BYE packet is received:
void removeRecord(u_int32_t SSRC);
RTPReceptionStats* lookup(u_int32_t SSRC) const;
protected: // constructor and destructor, called only by RTPSource:
friend class RTPSource;
RTPReceptionStatsDB();
virtual ~RTPReceptionStatsDB();
protected:
void add(u_int32_t SSRC, RTPReceptionStats* stats);
protected:
friend class Iterator;
unsigned fNumActiveSourcesSinceLastReset;
private:
HashTable* fTable;
unsigned fTotNumPacketsReceived; // for all SSRCs
};
class RTPReceptionStats {
public:
u_int32_t SSRC() const { return fSSRC; }
unsigned numPacketsReceivedSinceLastReset() const {
return fNumPacketsReceivedSinceLastReset;
}
unsigned totNumPacketsReceived() const { return fTotNumPacketsReceived; }
double totNumKBytesReceived() const;
unsigned totNumPacketsExpected() const {
return (fHighestExtSeqNumReceived - fBaseExtSeqNumReceived) + 1;
}
unsigned baseExtSeqNumReceived() const { return fBaseExtSeqNumReceived; }
unsigned lastResetExtSeqNumReceived() const {
return fLastResetExtSeqNumReceived;
}
unsigned highestExtSeqNumReceived() const {
return fHighestExtSeqNumReceived;
}
unsigned jitter() const;
unsigned lastReceivedSR_NTPmsw() const { return fLastReceivedSR_NTPmsw; }
unsigned lastReceivedSR_NTPlsw() const { return fLastReceivedSR_NTPlsw; }
struct timeval const& lastReceivedSR_time() const {
return fLastReceivedSR_time;
}
unsigned minInterPacketGapUS() const { return fMinInterPacketGapUS; }
unsigned maxInterPacketGapUS() const { return fMaxInterPacketGapUS; }
struct timeval const& totalInterPacketGaps() const {
return fTotalInterPacketGaps;
}
protected:
// called only by RTPReceptionStatsDB:
friend class RTPReceptionStatsDB;
RTPReceptionStats(u_int32_t SSRC, u_int16_t initialSeqNum);
RTPReceptionStats(u_int32_t SSRC);
virtual ~RTPReceptionStats();
private:
void noteIncomingPacket(u_int16_t seqNum, u_int32_t rtpTimestamp,
unsigned timestampFrequency,
Boolean useForJitterCalculation,
struct timeval& resultPresentationTime,
Boolean& resultHasBeenSyncedUsingRTCP,
unsigned packetSize /* payload only */);
void noteIncomingSR(u_int32_t ntpTimestampMSW, u_int32_t ntpTimestampLSW,
u_int32_t rtpTimestamp);
void init(u_int32_t SSRC);
void initSeqNum(u_int16_t initialSeqNum);
void reset();
// resets periodic stats (called each time they're used to
// generate a reception report)
protected:
u_int32_t fSSRC;
unsigned fNumPacketsReceivedSinceLastReset;
unsigned fTotNumPacketsReceived;
u_int32_t fTotBytesReceived_hi, fTotBytesReceived_lo;
Boolean fHaveSeenInitialSequenceNumber;
unsigned fBaseExtSeqNumReceived;
unsigned fLastResetExtSeqNumReceived;
unsigned fHighestExtSeqNumReceived;
int fLastTransit; // used in the jitter calculation
u_int32_t fPreviousPacketRTPTimestamp;
double fJitter;
// The following are recorded whenever we receive a RTCP SR for this SSRC:
unsigned fLastReceivedSR_NTPmsw; // NTP timestamp (from SR), most-signif
unsigned fLastReceivedSR_NTPlsw; // NTP timestamp (from SR), least-signif
struct timeval fLastReceivedSR_time;
struct timeval fLastPacketReceptionTime;
unsigned fMinInterPacketGapUS, fMaxInterPacketGapUS;
struct timeval fTotalInterPacketGaps;
private:
// Used to convert from RTP timestamp to 'wall clock' time:
Boolean fHasBeenSynchronized;
u_int32_t fSyncTimestamp;
struct timeval fSyncTime;
};
Boolean seqNumLT(u_int16_t s1, u_int16_t s2);
// a 'less-than' on 16-bit sequence numbers
#endif
|