liveMedia/include/RTPSource.hh

Go to the documentation of this file.
00001 /**********
00002 This library is free software; you can redistribute it and/or modify it under
00003 the terms of the GNU Lesser General Public License as published by the
00004 Free Software Foundation; either version 2.1 of the License, or (at your
00005 option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)
00006 
00007 This library is distributed in the hope that it will be useful, but WITHOUT
00008 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00009 FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
00010 more details.
00011 
00012 You should have received a copy of the GNU Lesser General Public License
00013 along with this library; if not, write to the Free Software Foundation, Inc.,
00014 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
00015 **********/
00016 // "liveMedia"
00017 // Copyright (c) 1996-2008 Live Networks, Inc.  All rights reserved.
00018 // RTP Sources
00019 // C++ header
00020 
00021 #ifndef _RTP_SOURCE_HH
00022 #define _RTP_SOURCE_HH
00023 
00024 #ifndef _FRAMED_SOURCE_HH
00025 #include "FramedSource.hh"
00026 #endif
00027 #ifndef _RTP_INTERFACE_HH
00028 #include "RTPInterface.hh"
00029 #endif
00030 
00031 class RTPReceptionStatsDB; // forward
00032 
00033 class RTPSource: public FramedSource {
00034 public:
00035   static Boolean lookupByName(UsageEnvironment& env, char const* sourceName,
00036                               RTPSource*& resultSource);
00037 
00038   Boolean curPacketMarkerBit() const { return fCurPacketMarkerBit; }
00039 
00040   unsigned char rtpPayloadFormat() const { return fRTPPayloadFormat; }
00041 
00042   virtual Boolean hasBeenSynchronizedUsingRTCP();
00043 
00044   Groupsock* RTPgs() const { return fRTPInterface.gs(); }
00045 
00046   virtual void setPacketReorderingThresholdTime(unsigned uSeconds) = 0;
00047 
00048   // used by RTCP:
00049   u_int32_t SSRC() const { return fSSRC; }
00050       // Note: This is *our* SSRC, not the SSRC in incoming RTP packets.
00051      // later need a means of changing the SSRC if there's a collision #####
00052 
00053   unsigned timestampFrequency() const {return fTimestampFrequency;}
00054 
00055   RTPReceptionStatsDB& receptionStatsDB() const {
00056     return *fReceptionStatsDB;
00057   }
00058 
00059   u_int32_t lastReceivedSSRC() const { return fLastReceivedSSRC; }
00060   // Note: This is the SSRC in the most recently received RTP packet; not *our* SSRC
00061 
00062   void setStreamSocket(int sockNum, unsigned char streamChannelId) {
00063     // hack to allow sending RTP over TCP (RFC 2236, section 10.12)
00064     fRTPInterface.setStreamSocket(sockNum, streamChannelId);
00065   }
00066 
00067   void setAuxilliaryReadHandler(AuxHandlerFunc* handlerFunc,
00068                                 void* handlerClientData) {
00069     fRTPInterface.setAuxilliaryReadHandler(handlerFunc,
00070                                            handlerClientData);
00071   }
00072 
00073   // Note that RTP receivers will usually not need to call either of the following two functions, because
00074   // RTP sequence numbers and timestamps are usually not useful to receivers.
00075   // (Our implementation of RTP reception already does all needed handling of RTP sequence numbers and timestamps.)
00076   u_int16_t curPacketRTPSeqNum() const { return fCurPacketRTPSeqNum; }
00077   u_int32_t curPacketRTPTimestamp() const { return fCurPacketRTPTimestamp; }
00078 
00079 protected:
00080   RTPSource(UsageEnvironment& env, Groupsock* RTPgs,
00081             unsigned char rtpPayloadFormat, u_int32_t rtpTimestampFrequency);
00082       // abstract base class
00083   virtual ~RTPSource();
00084 
00085 protected:
00086   RTPInterface fRTPInterface;
00087   u_int16_t fCurPacketRTPSeqNum;
00088   u_int32_t fCurPacketRTPTimestamp;
00089   Boolean fCurPacketMarkerBit;
00090   Boolean fCurPacketHasBeenSynchronizedUsingRTCP;
00091   u_int32_t fLastReceivedSSRC;
00092 
00093 private:
00094   // redefined virtual functions:
00095   virtual Boolean isRTPSource() const;
00096   virtual void getAttributes() const;
00097 
00098 private:
00099   unsigned char fRTPPayloadFormat;
00100   unsigned fTimestampFrequency;
00101   u_int32_t fSSRC;
00102 
00103   RTPReceptionStatsDB* fReceptionStatsDB;
00104 };
00105 
00106 
00107 class RTPReceptionStats; // forward
00108 
00109 class RTPReceptionStatsDB {
00110 public:
00111   unsigned totNumPacketsReceived() const { return fTotNumPacketsReceived; }
00112   unsigned numActiveSourcesSinceLastReset() const {
00113     return fNumActiveSourcesSinceLastReset;
00114  }
00115 
00116   void reset();
00117       // resets periodic stats (called each time they're used to
00118       // generate a reception report)
00119 
00120   class Iterator {
00121   public:
00122     Iterator(RTPReceptionStatsDB& receptionStatsDB);
00123     virtual ~Iterator();
00124 
00125     RTPReceptionStats* next(Boolean includeInactiveSources = False);
00126         // NULL if none
00127 
00128   private:
00129     HashTable::Iterator* fIter;
00130   };
00131 
00132   // The following is called whenever a RTP packet is received:
00133   void noteIncomingPacket(u_int32_t SSRC, u_int16_t seqNum,
00134                           u_int32_t rtpTimestamp,
00135                           unsigned timestampFrequency,
00136                           Boolean useForJitterCalculation,
00137                           struct timeval& resultPresentationTime,
00138                           Boolean& resultHasBeenSyncedUsingRTCP,
00139                           unsigned packetSize /* payload only */);
00140 
00141   // The following is called whenever a RTCP SR packet is received:
00142   void noteIncomingSR(u_int32_t SSRC,
00143                       u_int32_t ntpTimestampMSW, u_int32_t ntpTimestampLSW,
00144                       u_int32_t rtpTimestamp);
00145 
00146   // The following is called when a RTCP BYE packet is received:
00147   void removeRecord(u_int32_t SSRC);
00148 
00149   RTPReceptionStats* lookup(u_int32_t SSRC) const;
00150 
00151 protected: // constructor and destructor, called only by RTPSource:
00152   friend class RTPSource;
00153   RTPReceptionStatsDB(RTPSource& rtpSource);
00154   virtual ~RTPReceptionStatsDB();
00155 
00156 protected:
00157   void add(u_int32_t SSRC, RTPReceptionStats* stats);
00158 
00159 protected:
00160   friend class Iterator;
00161   RTPSource& fOurRTPSource;
00162   unsigned fNumActiveSourcesSinceLastReset;
00163 
00164 private:
00165   HashTable* fTable;
00166   unsigned fTotNumPacketsReceived; // for all SSRCs
00167 };
00168 
00169 class RTPReceptionStats {
00170 public:
00171   u_int32_t SSRC() const { return fSSRC; }
00172   unsigned numPacketsReceivedSinceLastReset() const {
00173     return fNumPacketsReceivedSinceLastReset;
00174   }
00175   unsigned totNumPacketsReceived() const { return fTotNumPacketsReceived; }
00176   double totNumKBytesReceived() const;
00177 
00178   unsigned totNumPacketsExpected() const {
00179     return fHighestExtSeqNumReceived - fBaseExtSeqNumReceived;
00180   }
00181 
00182   unsigned baseExtSeqNumReceived() const { return fBaseExtSeqNumReceived; }
00183   unsigned lastResetExtSeqNumReceived() const {
00184     return fLastResetExtSeqNumReceived;
00185   }
00186   unsigned highestExtSeqNumReceived() const {
00187     return fHighestExtSeqNumReceived;
00188   }
00189 
00190   unsigned jitter() const;
00191 
00192   unsigned lastReceivedSR_NTPmsw() const { return fLastReceivedSR_NTPmsw; }
00193   unsigned lastReceivedSR_NTPlsw() const { return fLastReceivedSR_NTPlsw; }
00194   struct timeval const& lastReceivedSR_time() const {
00195     return fLastReceivedSR_time;
00196   }
00197 
00198   unsigned minInterPacketGapUS() const { return fMinInterPacketGapUS; }
00199   unsigned maxInterPacketGapUS() const { return fMaxInterPacketGapUS; }
00200   struct timeval const& totalInterPacketGaps() const {
00201     return fTotalInterPacketGaps;
00202   }
00203 
00204 protected:
00205   // called only by RTPReceptionStatsDB:
00206   friend class RTPReceptionStatsDB;
00207   RTPReceptionStats(RTPSource& rtpSource, u_int32_t SSRC,
00208                     u_int16_t initialSeqNum);
00209   RTPReceptionStats(RTPSource& rtpSource, u_int32_t SSRC);
00210   virtual ~RTPReceptionStats();
00211 
00212 private:
00213   void noteIncomingPacket(u_int16_t seqNum, u_int32_t rtpTimestamp,
00214                           unsigned timestampFrequency,
00215                           Boolean useForJitterCalculation,
00216                           struct timeval& resultPresentationTime,
00217                           Boolean& resultHasBeenSyncedUsingRTCP,
00218                           unsigned packetSize /* payload only */);
00219   void noteIncomingSR(u_int32_t ntpTimestampMSW, u_int32_t ntpTimestampLSW,
00220                       u_int32_t rtpTimestamp);
00221   void init(u_int32_t SSRC);
00222   void initSeqNum(u_int16_t initialSeqNum);
00223   void reset();
00224       // resets periodic stats (called each time they're used to
00225       // generate a reception report)
00226 
00227 protected:
00228   RTPSource& fOurRTPSource;
00229   u_int32_t fSSRC;
00230   unsigned fNumPacketsReceivedSinceLastReset;
00231   unsigned fTotNumPacketsReceived;
00232   u_int32_t fTotBytesReceived_hi, fTotBytesReceived_lo;
00233   Boolean fHaveSeenInitialSequenceNumber;
00234   unsigned fBaseExtSeqNumReceived;
00235   unsigned fLastResetExtSeqNumReceived;
00236   unsigned fHighestExtSeqNumReceived;
00237   int fLastTransit; // used in the jitter calculation
00238   u_int32_t fPreviousPacketRTPTimestamp;
00239   double fJitter;
00240   // The following are recorded whenever we receive a RTCP SR for this SSRC:
00241   unsigned fLastReceivedSR_NTPmsw; // NTP timestamp (from SR), most-signif
00242   unsigned fLastReceivedSR_NTPlsw; // NTP timestamp (from SR), least-signif
00243   struct timeval fLastReceivedSR_time;
00244   struct timeval fLastPacketReceptionTime;
00245   unsigned fMinInterPacketGapUS, fMaxInterPacketGapUS;
00246   struct timeval fTotalInterPacketGaps;
00247 
00248 private:
00249   // Used to convert from RTP timestamp to 'wall clock' time:
00250   Boolean fHasBeenSynchronized;
00251   u_int32_t fSyncTimestamp;
00252   struct timeval fSyncTime;
00253 };
00254 
00255 
00256 Boolean seqNumLT(u_int16_t s1, u_int16_t s2);
00257   // a 'less-than' on 16-bit sequence numbers
00258 
00259 #endif

Generated on Tue Oct 7 15:38:09 2008 for live by  doxygen 1.5.2