liveMedia/include/RTCP.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-2012 Live Networks, Inc.  All rights reserved.
00018 // RTCP
00019 // C++ header
00020 
00021 #ifndef _RTCP_HH
00022 #define _RTCP_HH
00023 
00024 #ifndef _RTP_SINK_HH
00025 #include "RTPSink.hh"
00026 #endif
00027 #ifndef _RTP_SOURCE_HH
00028 #include "RTPSource.hh"
00029 #endif
00030 
00031 class SDESItem {
00032 public:
00033   SDESItem(unsigned char tag, unsigned char const* value);
00034 
00035   unsigned char const* data() const {return fData;}
00036   unsigned totalSize() const;
00037 
00038 private:
00039   unsigned char fData[2 + 0xFF]; // first 2 bytes are tag and length
00040 };
00041 
00042 class RTCPMemberDatabase; // forward
00043 
00044 class RTCPInstance: public Medium {
00045 public:
00046   static RTCPInstance* createNew(UsageEnvironment& env, Groupsock* RTCPgs,
00047                                  unsigned totSessionBW, /* in kbps */
00048                                  unsigned char const* cname,
00049                                  RTPSink* sink,
00050                                  RTPSource const* source,
00051                                  Boolean isSSMSource = False);
00052 
00053   static Boolean lookupByName(UsageEnvironment& env, char const* instanceName,
00054                               RTCPInstance*& resultInstance);
00055 
00056   unsigned numMembers() const;
00057   unsigned totSessionBW() const { return fTotSessionBW; }
00058 
00059   void setByeHandler(TaskFunc* handlerTask, void* clientData,
00060                      Boolean handleActiveParticipantsOnly = True);
00061       // Assigns a handler routine to be called if a "BYE" arrives.
00062       // The handler is called once only; for subsequent "BYE"s,
00063       // "setByeHandler()" would need to be called again.
00064       // If "handleActiveParticipantsOnly" is True, then the handler is called
00065       // only if the SSRC is for a known sender (if we have a "RTPSource"),
00066       // or if the SSRC is for a known receiver (if we have a "RTPSink").
00067       // This prevents (for example) the handler for a multicast receiver being
00068       // called if some other multicast receiver happens to exit.
00069       // If "handleActiveParticipantsOnly" is False, then the handler is called
00070       // for any incoming RTCP "BYE".
00071   void setSRHandler(TaskFunc* handlerTask, void* clientData);
00072   void setRRHandler(TaskFunc* handlerTask, void* clientData);
00073       // Assigns a handler routine to be called if a "SR" or "RR"
00074       // (respectively) arrives.  Unlike "setByeHandler()", the handler will
00075       // be called once for each incoming "SR" or "RR".  (To turn off handling,
00076       // call the function again with "handlerTask" (and "clientData") as NULL.
00077   void setSpecificRRHandler(netAddressBits fromAddress, Port fromPort,
00078                             TaskFunc* handlerTask, void* clientData);
00079       // Like "setRRHandler()", but applies only to "RR" packets that come from
00080       // a specific source address and port.  (Note that if both a specific
00081       // and a general "RR" handler function is set, then both will be called.)
00082   void unsetSpecificRRHandler(netAddressBits fromAddress, Port fromPort); // equivalent to setSpecificRRHandler(..., NULL, NULL);
00083 
00084   Groupsock* RTCPgs() const { return fRTCPInterface.gs(); }
00085 
00086   void setStreamSocket(int sockNum, unsigned char streamChannelId);
00087   void addStreamSocket(int sockNum, unsigned char streamChannelId);
00088   void removeStreamSocket(int sockNum, unsigned char streamChannelId) {
00089     fRTCPInterface.removeStreamSocket(sockNum, streamChannelId);
00090   }
00091     // hacks to allow sending RTP over TCP (RFC 2236, section 10.12)
00092 
00093   void setAuxilliaryReadHandler(AuxHandlerFunc* handlerFunc,
00094                                 void* handlerClientData) {
00095     fRTCPInterface.setAuxilliaryReadHandler(handlerFunc,
00096                                             handlerClientData);
00097   }
00098 
00099 protected:
00100   RTCPInstance(UsageEnvironment& env, Groupsock* RTPgs, unsigned totSessionBW,
00101                unsigned char const* cname,
00102                RTPSink* sink, RTPSource const* source,
00103                Boolean isSSMSource);
00104       // called only by createNew()
00105   virtual ~RTCPInstance();
00106 
00107 private:
00108   // redefined virtual functions:
00109   virtual Boolean isRTCPInstance() const;
00110 
00111 private:
00112   void addReport();
00113     void addSR();
00114     void addRR();
00115       void enqueueCommonReportPrefix(unsigned char packetType, u_int32_t SSRC,
00116                                      unsigned numExtraWords = 0);
00117       void enqueueCommonReportSuffix();
00118         void enqueueReportBlock(RTPReceptionStats* receptionStats);
00119   void addSDES();
00120   void addBYE();
00121 
00122   void sendBuiltPacket();
00123 
00124   static void onExpire(RTCPInstance* instance);
00125   void onExpire1();
00126 
00127   static void incomingReportHandler(RTCPInstance* instance, int /*mask*/);
00128   void incomingReportHandler1();
00129   void onReceive(int typeOfPacket, int totPacketSize, u_int32_t ssrc);
00130 
00131 private:
00132   unsigned char* fInBuf;
00133   unsigned fNumBytesAlreadyRead;
00134   OutPacketBuffer* fOutBuf;
00135   RTPInterface fRTCPInterface;
00136   unsigned fTotSessionBW;
00137   RTPSink* fSink;
00138   RTPSource const* fSource;
00139   Boolean fIsSSMSource;
00140 
00141   SDESItem fCNAME;
00142   RTCPMemberDatabase* fKnownMembers;
00143   unsigned fOutgoingReportCount; // used for SSRC member aging
00144 
00145   double fAveRTCPSize;
00146   int fIsInitial;
00147   double fPrevReportTime;
00148   double fNextReportTime;
00149   int fPrevNumMembers;
00150 
00151   int fLastSentSize;
00152   int fLastReceivedSize;
00153   u_int32_t fLastReceivedSSRC;
00154   int fTypeOfEvent;
00155   int fTypeOfPacket;
00156   Boolean fHaveJustSentPacket;
00157   unsigned fLastPacketSentSize;
00158 
00159   TaskFunc* fByeHandlerTask;
00160   void* fByeHandlerClientData;
00161   Boolean fByeHandleActiveParticipantsOnly;
00162   TaskFunc* fSRHandlerTask;
00163   void* fSRHandlerClientData;
00164   TaskFunc* fRRHandlerTask;
00165   void* fRRHandlerClientData;
00166   AddressPortLookupTable* fSpecificRRHandlerTable;
00167 
00168 public: // because this stuff is used by an external "C" function
00169   void schedule(double nextTime);
00170   void reschedule(double nextTime);
00171   void sendReport();
00172   void sendBYE();
00173   int typeOfEvent() {return fTypeOfEvent;}
00174   int sentPacketSize() {return fLastSentSize;}
00175   int packetType() {return fTypeOfPacket;}
00176   int receivedPacketSize() {return fLastReceivedSize;}
00177   int checkNewSSRC();
00178   void removeLastReceivedSSRC();
00179   void removeSSRC(u_int32_t ssrc, Boolean alsoRemoveStats);
00180 };
00181 
00182 // RTCP packet types:
00183 const unsigned char RTCP_PT_SR = 200;
00184 const unsigned char RTCP_PT_RR = 201;
00185 const unsigned char RTCP_PT_SDES = 202;
00186 const unsigned char RTCP_PT_BYE = 203;
00187 const unsigned char RTCP_PT_APP = 204;
00188 
00189 // SDES tags:
00190 const unsigned char RTCP_SDES_END = 0;
00191 const unsigned char RTCP_SDES_CNAME = 1;
00192 const unsigned char RTCP_SDES_NAME = 2;
00193 const unsigned char RTCP_SDES_EMAIL = 3;
00194 const unsigned char RTCP_SDES_PHONE = 4;
00195 const unsigned char RTCP_SDES_LOC = 5;
00196 const unsigned char RTCP_SDES_TOOL = 6;
00197 const unsigned char RTCP_SDES_NOTE = 7;
00198 const unsigned char RTCP_SDES_PRIV = 8;
00199 
00200 #endif

Generated on Thu May 17 07:11:46 2012 for live by  doxygen 1.5.2