From 2e2a51283dfebaa23b3d580743d4556dc7c30a91 Mon Sep 17 00:00:00 2001
From: xuxiuxi <xuxiuxi@454eff88-639b-444f-9e54-f578c98de674>
Date: 星期三, 03 五月 2017 12:21:46 +0800
Subject: [PATCH]
---
VisitFace/RtspNativeCodec/app/libs/live555/include/liveMedia/RTCP.hh | 233 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 233 insertions(+), 0 deletions(-)
diff --git a/VisitFace/RtspNativeCodec/app/libs/live555/include/liveMedia/RTCP.hh b/VisitFace/RtspNativeCodec/app/libs/live555/include/liveMedia/RTCP.hh
new file mode 100644
index 0000000..6a52bd6
--- /dev/null
+++ b/VisitFace/RtspNativeCodec/app/libs/live555/include/liveMedia/RTCP.hh
@@ -0,0 +1,233 @@
+/**********
+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.
+// RTCP
+// C++ header
+
+#ifndef _RTCP_HH
+#define _RTCP_HH
+
+#ifndef _RTP_SINK_HH
+#include "RTPSink.hh"
+#endif
+#ifndef _RTP_SOURCE_HH
+#include "RTPSource.hh"
+#endif
+
+class SDESItem {
+public:
+ SDESItem(unsigned char tag, unsigned char const* value);
+
+ unsigned char const* data() const {return fData;}
+ unsigned totalSize() const;
+
+private:
+ unsigned char fData[2 + 0xFF]; // first 2 bytes are tag and length
+};
+
+typedef void RTCPAppHandlerFunc(void* clientData,
+ u_int8_t subtype, u_int32_t nameBytes/*big-endian order*/,
+ u_int8_t* appDependentData, unsigned appDependentDataSize);
+
+class RTCPMemberDatabase; // forward
+
+class RTCPInstance: public Medium {
+public:
+ static RTCPInstance* createNew(UsageEnvironment& env, Groupsock* RTCPgs,
+ unsigned totSessionBW, /* in kbps */
+ unsigned char const* cname,
+ RTPSink* sink,
+ RTPSource* source,
+ Boolean isSSMSource = False);
+
+ static Boolean lookupByName(UsageEnvironment& env, char const* instanceName,
+ RTCPInstance*& resultInstance);
+
+ unsigned numMembers() const;
+ unsigned totSessionBW() const { return fTotSessionBW; }
+
+ void setByeHandler(TaskFunc* handlerTask, void* clientData,
+ Boolean handleActiveParticipantsOnly = True);
+ // Assigns a handler routine to be called if a "BYE" arrives.
+ // The handler is called once only; for subsequent "BYE"s,
+ // "setByeHandler()" would need to be called again.
+ // If "handleActiveParticipantsOnly" is True, then the handler is called
+ // only if the SSRC is for a known sender (if we have a "RTPSource"),
+ // or if the SSRC is for a known receiver (if we have a "RTPSink").
+ // This prevents (for example) the handler for a multicast receiver being
+ // called if some other multicast receiver happens to exit.
+ // If "handleActiveParticipantsOnly" is False, then the handler is called
+ // for any incoming RTCP "BYE".
+ // (To remove an existing "BYE" handler, call "setByeHandler()" again, with a "handlerTask" of NULL.)
+ void setSRHandler(TaskFunc* handlerTask, void* clientData);
+ void setRRHandler(TaskFunc* handlerTask, void* clientData);
+ // Assigns a handler routine to be called if a "SR" or "RR" packet
+ // (respectively) arrives. Unlike "setByeHandler()", the handler will
+ // be called once for each incoming "SR" or "RR". (To turn off handling,
+ // call the function again with "handlerTask" (and "clientData") as NULL.)
+ void setSpecificRRHandler(netAddressBits fromAddress, Port fromPort,
+ TaskFunc* handlerTask, void* clientData);
+ // Like "setRRHandler()", but applies only to "RR" packets that come from
+ // a specific source address and port. (Note that if both a specific
+ // and a general "RR" handler function is set, then both will be called.)
+ void unsetSpecificRRHandler(netAddressBits fromAddress, Port fromPort); // equivalent to setSpecificRRHandler(..., NULL, NULL);
+ void setAppHandler(RTCPAppHandlerFunc* handlerTask, void* clientData);
+ // Assigns a handler routine to be called whenever an "APP" packet arrives. (To turn off
+ // handling, call the function again with "handlerTask" (and "clientData") as NULL.)
+ void sendAppPacket(u_int8_t subtype, char const* name,
+ u_int8_t* appDependentData, unsigned appDependentDataSize);
+ // Sends a custom RTCP "APP" packet to the peer(s). The parameters correspond to their
+ // respective fields as described in the RTP/RTCP definition (RFC 3550).
+ // Note that only the low-order 5 bits of "subtype" are used, and only the first 4 bytes
+ // of "name" are used. (If "name" has fewer than 4 bytes, or is NULL,
+ // then the remaining bytes are '\0'.)
+
+ Groupsock* RTCPgs() const { return fRTCPInterface.gs(); }
+
+ void setStreamSocket(int sockNum, unsigned char streamChannelId);
+ void addStreamSocket(int sockNum, unsigned char streamChannelId);
+ void removeStreamSocket(int sockNum, unsigned char streamChannelId) {
+ fRTCPInterface.removeStreamSocket(sockNum, streamChannelId);
+ }
+ // hacks to allow sending RTP over TCP (RFC 2236, section 10.12)
+
+ void setAuxilliaryReadHandler(AuxHandlerFunc* handlerFunc,
+ void* handlerClientData) {
+ fRTCPInterface.setAuxilliaryReadHandler(handlerFunc,
+ handlerClientData);
+ }
+
+ void injectReport(u_int8_t const* packet, unsigned packetSize, struct sockaddr_in const& fromAddress);
+ // Allows an outside party to inject an RTCP report (from other than the network interface)
+
+protected:
+ RTCPInstance(UsageEnvironment& env, Groupsock* RTPgs, unsigned totSessionBW,
+ unsigned char const* cname,
+ RTPSink* sink, RTPSource* source,
+ Boolean isSSMSource);
+ // called only by createNew()
+ virtual ~RTCPInstance();
+
+ virtual void noteArrivingRR(struct sockaddr_in const& fromAddressAndPort,
+ int tcpSocketNum, unsigned char tcpStreamChannelId);
+
+ void incomingReportHandler1();
+
+private:
+ // redefined virtual functions:
+ virtual Boolean isRTCPInstance() const;
+
+private:
+ Boolean addReport(Boolean alwaysAdd = False);
+ void addSR();
+ void addRR();
+ void enqueueCommonReportPrefix(unsigned char packetType, u_int32_t SSRC,
+ unsigned numExtraWords = 0);
+ void enqueueCommonReportSuffix();
+ void enqueueReportBlock(RTPReceptionStats* receptionStats);
+ void addSDES();
+ void addBYE();
+
+ void sendBuiltPacket();
+
+ static void onExpire(RTCPInstance* instance);
+ void onExpire1();
+
+ static void incomingReportHandler(RTCPInstance* instance, int /*mask*/);
+ void processIncomingReport(unsigned packetSize, struct sockaddr_in const& fromAddressAndPort,
+ int tcpSocketNum, unsigned char tcpStreamChannelId);
+ void onReceive(int typeOfPacket, int totPacketSize, u_int32_t ssrc);
+
+private:
+ u_int8_t* fInBuf;
+ unsigned fNumBytesAlreadyRead;
+ OutPacketBuffer* fOutBuf;
+ RTPInterface fRTCPInterface;
+ unsigned fTotSessionBW;
+ RTPSink* fSink;
+ RTPSource* fSource;
+ Boolean fIsSSMSource;
+
+ SDESItem fCNAME;
+ RTCPMemberDatabase* fKnownMembers;
+ unsigned fOutgoingReportCount; // used for SSRC member aging
+
+ double fAveRTCPSize;
+ int fIsInitial;
+ double fPrevReportTime;
+ double fNextReportTime;
+ int fPrevNumMembers;
+
+ int fLastSentSize;
+ int fLastReceivedSize;
+ u_int32_t fLastReceivedSSRC;
+ int fTypeOfEvent;
+ int fTypeOfPacket;
+ Boolean fHaveJustSentPacket;
+ unsigned fLastPacketSentSize;
+
+ TaskFunc* fByeHandlerTask;
+ void* fByeHandlerClientData;
+ Boolean fByeHandleActiveParticipantsOnly;
+ TaskFunc* fSRHandlerTask;
+ void* fSRHandlerClientData;
+ TaskFunc* fRRHandlerTask;
+ void* fRRHandlerClientData;
+ AddressPortLookupTable* fSpecificRRHandlerTable;
+ RTCPAppHandlerFunc* fAppHandlerTask;
+ void* fAppHandlerClientData;
+
+public: // because this stuff is used by an external "C" function
+ void schedule(double nextTime);
+ void reschedule(double nextTime);
+ void sendReport();
+ void sendBYE();
+ int typeOfEvent() {return fTypeOfEvent;}
+ int sentPacketSize() {return fLastSentSize;}
+ int packetType() {return fTypeOfPacket;}
+ int receivedPacketSize() {return fLastReceivedSize;}
+ int checkNewSSRC();
+ void removeLastReceivedSSRC();
+ void removeSSRC(u_int32_t ssrc, Boolean alsoRemoveStats);
+};
+
+// RTCP packet types:
+const unsigned char RTCP_PT_SR = 200;
+const unsigned char RTCP_PT_RR = 201;
+const unsigned char RTCP_PT_SDES = 202;
+const unsigned char RTCP_PT_BYE = 203;
+const unsigned char RTCP_PT_APP = 204;
+const unsigned char RTCP_PT_RTPFB = 205; // Generic RTP Feedback [RFC4585]
+const unsigned char RTCP_PT_PSFB = 206; // Payload-specific [RFC4585]
+const unsigned char RTCP_PT_XR = 207; // extended report [RFC3611]
+const unsigned char RTCP_PT_AVB = 208; // AVB RTCP packet ["Standard for Layer 3 Transport Protocol for Time Sensitive Applications in Local Area Networks." Work in progress.]
+const unsigned char RTCP_PT_RSI = 209; // Receiver Summary Information [RFC5760]
+const unsigned char RTCP_PT_TOKEN = 210; // Port Mapping [RFC6284]
+const unsigned char RTCP_PT_IDMS = 211; // IDMS Settings [RFC7272]
+
+// SDES tags:
+const unsigned char RTCP_SDES_END = 0;
+const unsigned char RTCP_SDES_CNAME = 1;
+const unsigned char RTCP_SDES_NAME = 2;
+const unsigned char RTCP_SDES_EMAIL = 3;
+const unsigned char RTCP_SDES_PHONE = 4;
+const unsigned char RTCP_SDES_LOC = 5;
+const unsigned char RTCP_SDES_TOOL = 6;
+const unsigned char RTCP_SDES_NOTE = 7;
+const unsigned char RTCP_SDES_PRIV = 8;
+
+#endif
--
Gitblit v1.8.0