From 15d0c49e85159b9e27870aff5280c0cd95b103c4 Mon Sep 17 00:00:00 2001
From: xuxiuxi <xuxiuxi@454eff88-639b-444f-9e54-f578c98de674>
Date: 星期四, 04 五月 2017 17:16:56 +0800
Subject: [PATCH] 

---
 VisitFace/RtspNativeCodec/app/libs/live555/include/liveMedia/RTPSource.hh |  266 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 266 insertions(+), 0 deletions(-)

diff --git a/VisitFace/RtspNativeCodec/app/libs/live555/include/liveMedia/RTPSource.hh b/VisitFace/RtspNativeCodec/app/libs/live555/include/liveMedia/RTPSource.hh
new file mode 100644
index 0000000..54fd4f7
--- /dev/null
+++ b/VisitFace/RtspNativeCodec/app/libs/live555/include/liveMedia/RTPSource.hh
@@ -0,0 +1,266 @@
+/**********
+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 3 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-2017 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 #####
+  void registerForMultiplexedRTCPPackets(class RTCPInstance* rtcpInstance) {
+    fRTCPInstanceForMultiplexedRTCPPackets = rtcpInstance;
+  }
+  void deregisterForMultiplexedRTCPPackets() { registerForMultiplexedRTCPPackets(NULL); }
+
+  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
+
+  Boolean& enableRTCPReports() { return fEnableRTCPReports; }
+  Boolean const& enableRTCPReports() const { return fEnableRTCPReports; }
+
+  void setStreamSocket(int sockNum, unsigned char streamChannelId) {
+    // hack to allow sending RTP over TCP (RFC 2236, section 10.12)
+    fRTPInterface.setStreamSocket(sockNum, streamChannelId);
+  }
+
+  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; }
+private: friend class MediaSubsession; // "MediaSubsession" is the only outside class that ever needs to see RTP timestamps!
+  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;
+  class RTCPInstance* fRTCPInstanceForMultiplexedRTCPPackets;
+
+private:
+  // redefined virtual functions:
+  virtual Boolean isRTPSource() const;
+  virtual void getAttributes() const;
+
+private:
+  unsigned char fRTPPayloadFormat;
+  unsigned fTimestampFrequency;
+  u_int32_t fSSRC;
+  Boolean fEnableRTCPReports; // whether RTCP "RR" reports should be sent for this source (default: True)
+
+  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

--
Gitblit v1.8.0