From 9e5babf9db52e64bdae60137be7696e56241fca6 Mon Sep 17 00:00:00 2001 From: xingzilong <xingzilong@454eff88-639b-444f-9e54-f578c98de674> Date: 星期五, 18 八月 2017 18:12:17 +0800 Subject: [PATCH] H264 NALU解析 并在RTSPServer判断 --- 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