⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtcp.hh

📁 流媒体传输协议的实现代码,非常有用.可以支持rtsp mms等流媒体传输协议
💻 HH
字号:
/**********This library is free software; you can redistribute it and/or modify it underthe terms of the GNU Lesser General Public License as published by theFree Software Foundation; either version 2.1 of the License, or (at youroption) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)This library is distributed in the hope that it will be useful, but WITHOUTANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESSFOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License formore details.You should have received a copy of the GNU Lesser General Public Licensealong with this library; if not, write to the Free Software Foundation, Inc.,59 Temple Place, Suite 330, Boston, MA  02111-1307  USA**********/// "liveMedia"// Copyright (c) 1996-2004 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"#endifclass 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};class RTCPMemberDatabase; // forwardclass RTCPInstance: public Medium {public:  static RTCPInstance* createNew(UsageEnvironment& env, Groupsock* RTCPgs,				 unsigned totSessionBW, /* in kbps */				 unsigned char const* cname,				 RTPSink* sink,				 RTPSource const* source,				 Boolean isSSMSource = False);  static Boolean lookupByName(UsageEnvironment& env, char const* instanceName,                              RTCPInstance*& resultInstance);  unsigned numMembers() const;  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".   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);  }protected:  RTCPInstance(UsageEnvironment& env, Groupsock* RTPgs, unsigned totSessionBW,	       unsigned char const* cname,	       RTPSink* sink, RTPSource const* source,	       Boolean isSSMSource);      // called only by createNew()  virtual ~RTCPInstance();private:  // redefined virtual functions:  virtual Boolean isRTCPInstance() const;private:  void addReport();    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 incomingReportHandler1();  void onReceive(int typeOfPacket, int totPacketSize, u_int32_t ssrc);private:  unsigned char* fInBuf;  OutPacketBuffer* fOutBuf;  RTPInterface fRTCPInterface;  unsigned fTotSessionBW;  RTPSink* fSink;  RTPSource const* 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;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);};// 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;// 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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -