rtptran.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:20k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #ifndef _RTPTRAN_H_
  36. #define _RTPTRAN_H_
  37. // #define RTP_MESSAGE_DEBUG
  38. #include "hxengin.h"
  39. #include "hxmon.h"
  40. #include "transbuf.h"
  41. #include "statinfo.h"
  42. #include "hxsmbw.h"
  43. #include "ntptime.h"
  44. #include "tconverter.h"
  45. #include "chxkeepalive.h"
  46. // GCC won't let me forward declare CHXMapLongToObj::Iterator, 
  47. // so I have to include this. -JR
  48. #include "hxmap.h"
  49. #include "hxslist.h"
  50. #include "hxqossig.h"
  51. #include "hxqos.h"
  52. #include "packfilt.h"
  53. struct IHXQoSTransportAdaptationInfo;
  54. struct IHXScheduler;
  55. struct IHXUDPSocket;
  56. struct IHXPacket;
  57. struct IHXBuffer;
  58. struct IHXCommonClassFactory;
  59. struct IHXInternalReset;
  60. struct IHXPlayerState;
  61. struct IHXAccurateClock;
  62. class  RTSPResendBuffer;
  63. class  CHXBitset;
  64. class  HX_deque;
  65. class  Timeval;
  66. class  CHXTimestampConverter;
  67. class RTCPBaseTransport;
  68. class RTCPUDPTransport;
  69. class RTCPTCPTransport;
  70. class RTCPPacket;
  71. class ReportHandler;
  72. _INTERFACE IHXQoSSignal;
  73. _INTERFACE IHXQoSSignalBus;
  74. _INTERFACE IHXQoSSignalSourceResponse;
  75. HX_RESULT
  76. FixRTPHeader(IHXCommonClassFactory* pCCF, 
  77.      IHXBuffer* pOrigBuf, 
  78.      REF(IHXBuffer*) pNewBuf, 
  79.      UINT16 unSeqNoOffset, 
  80.      UINT32 ulRTPTSOffset);
  81.      
  82. HX_RESULT
  83. FixRTCPSR(IHXCommonClassFactory* pCCF, 
  84.   IHXBuffer* pOrigBuf, 
  85.   REF(IHXBuffer*) pNewBuf, 
  86.   UINT32 ulRTPTSOffset);
  87. /* The largest number of SR records we will keep */
  88. #define LSR_HIST_SZ 64
  89. struct LSRRecord
  90. {
  91.     UINT32          m_ulSourceLSR;
  92.     UINT32          m_ulServerLSR;
  93. };
  94. /******************************************************************************
  95. *   RTP RTP RTP RTP RTP 
  96. ******************************************************************************/
  97. class RTPBaseTransport: public RTSPTransport, public IHXSourceBandwidthInfo
  98. {
  99. public:
  100.     RTPBaseTransport (BOOL bIsSource);
  101.     ~RTPBaseTransport ();
  102.     STDMETHOD(QueryInterface)           (THIS_
  103.                                         REFIID riid,
  104.                                         void** ppvObj);
  105.     STDMETHOD_(ULONG32,AddRef)       (THIS);
  106.     STDMETHOD_(ULONG32,Release)      (THIS);
  107.     /*
  108.      * IHXSourceBandwidthInfo methods
  109.      */
  110.     STDMETHOD(InitBw) (THIS_
  111. IHXBandwidthManagerInput* pBwMgr);
  112.     STDMETHOD(SetTransmitRate) (THIS_
  113. UINT32 ulBitRate);
  114.     void Done ();
  115.     RTSPTransportTypeEnum tag ()
  116.     {
  117. HX_ASSERT(!"don't call this");
  118. return RTSP_TR_NONE;
  119.     };
  120.     HX_RESULT sendPacket (BasePacket* pPacket)
  121.     {
  122. HX_ASSERT(!"don't call this");
  123. return HXR_UNEXPECTED;
  124.     }
  125.     HX_RESULT init ();
  126.     
  127.     HX_RESULT reflectPacket (BasePacket* pBasePacket, REF(IHXBuffer*)pSendBuf);
  128.     HX_RESULT makePacket (BasePacket* pPacket, REF(IHXBuffer*) pPacketBuf);
  129.     void updateQoSInfo                  (UINT32 ulBytesSent);
  130.     HX_RESULT handlePacket (IHXBuffer* pBuffer);
  131.     HX_RESULT handleMasterSync (ULONG32 ulHXTime, LONG32 lHXOffsetToMaster);
  132.     HX_RESULT anchorSync (ULONG32 ulHXTime, ULONG32 ulNTPTime);
  133.     virtual HX_RESULT handleRTCPSync (NTPTime ntpTime, ULONG32 ulRTPTime);
  134.     
  135.     HX_RESULT streamDone (UINT16 streamNumber);
  136. //    IHXUDPSocket* getUDPSocket ();
  137.     void addStreamInfo (RTSPStreamInfo* pStreamInfo,
  138.       UINT32 ulBufferDepth = TRANSPORT_BUF_DURATION_UNDEF);
  139.     /* RTP-Info */
  140.     HX_RESULT setFirstSeqNum (UINT16 streamNumber, UINT16 seqNum);
  141.     void notifyEmptyRTPInfo (void);
  142.     void setFirstTimeStamp (UINT16 uStreamNumber, UINT32 ulTS,
  143.                                          BOOL bIsRaw = FALSE);
  144.     void setPlayRange (UINT32 ulFrom, UINT32 ulTo);    
  145.     HX_RESULT setFirstPlayTime (Timeval* pTv);
  146.       
  147.     void setRTCPTransport (RTCPBaseTransport* pRTCPTran);
  148.     void Reset(){}
  149.     void Restart(){}
  150.     BOOL isRTP() { return TRUE; }
  151.     BOOL isReflector() { return (m_ulPayloadWirePacket==1); }
  152.     void SyncTimestamp (IHXPacket* pPacket);
  153.     inline BOOL isRTCPRule (UINT16 unRuleNo) 
  154.     { 
  155. return (m_bHasRTCPRule && (unRuleNo == m_RTCPRuleNumber));
  156.     }
  157.     /* XXXMC
  158.      * Special-case handling for PV clients
  159.      */
  160.     void setPVEmulationMode     (BOOL bEmulatePVSession);
  161. protected:
  162. #ifdef RTP_MESSAGE_DEBUG
  163.     void messageFormatDebugFileOut(const char* fmt, ...);
  164. #endif // RTP_MESSAGE_DEBUG
  165.     void resetStartInfoWaitQueue (void);
  166.     /*
  167.      * Marker Bit Handling Routine
  168.      */
  169.     typedef void (RTPBaseTransport::*HandleMBitFunc)(REF(UINT8),IHXPacket*,UINT16); 
  170.     inline void MBitRTPPktInfo (REF(UINT8)bMBit, IHXPacket* pPkt, UINT16 unRuleNo);
  171.     inline void MBitASMRuleNo  (REF(UINT8)bMBit, IHXPacket* pPkt, UINT16 unRuleNo);
  172.     IHXBandwidthManagerInput* m_pBwMgrInput;
  173.     IHXTransportSyncServer* m_pSyncServer;
  174.     UINT16 m_streamNumber;
  175.     INT32 m_lRefCount;
  176.     UINT8 m_rtpPayloadType;
  177.     BOOL m_bHasMarkerRule;
  178.     UINT16 m_markerRuleNumber;
  179.     BOOL m_bIsSyncMaster;
  180. #ifdef RTP_MESSAGE_DEBUG
  181.     BOOL m_bMessageDebug;
  182.     CHXString m_messageDebugFileName;
  183. #endif // RTP_MESSAGE_DEBUG
  184.        
  185.      /*
  186.       * Reflection support
  187.       */
  188.      BOOL m_bHasRTCPRule;
  189.      UINT32 m_ulPayloadWirePacket;
  190.      UINT16 m_RTCPRuleNumber;
  191.     UINT16 m_uFirstSeqNum;
  192.     UINT32 m_ulFirstRTPTS;
  193.     BOOL m_bFirstSet;
  194.     BOOL m_bWeakStartSync;
  195.     INT32 m_lTimeOffsetHX;
  196.     INT32 m_lTimeOffsetRTP;
  197.     INT32 m_lOffsetToMasterHX;
  198.     INT32 m_lOffsetToMasterRTP;
  199.     INT32 m_lSyncOffsetHX;
  200.     INT32 m_lSyncOffsetRTP;
  201.     INT32 m_lNTPtoHXOffset;
  202.     BOOL m_bNTPtoHXOffsetSet;
  203.     ULONG32 m_ulLastRTPTS;
  204.     ULONG32 m_ulLastHXTS;
  205.     ULONG32 m_ulLastRawRTPTS;
  206.     BOOL m_bLastTSSet;
  207.     CHXSimpleList m_StartInfoWaitQueue;
  208.     BOOL m_bWaitForStartInfo;
  209.     BOOL m_bAbortWaitForStartInfo;
  210.     ULONG32 m_ulStartInfoWaitStartTime;
  211.     BOOL                                m_bSSRCDetermined;
  212.     UINT32                              m_ulSSRCDetermined;
  213.     /*
  214.      * RTP-Info:  According to RFC2326, it is possible not to have one of them,
  215.      * so if it is missing, take care of it right here in transport 
  216.      */
  217.     BOOL m_bSeqNoSet;
  218.     /* m_bRTPTimeSet is used differently on the server and the client */
  219.     BOOL     m_bRTPTimeSet;
  220.     // Since client is expecting RTP timestap starting at 0, we need to offset
  221.     // it in here.  btw, this is a security risk...
  222.     UINT32 m_ulBaseTS;
  223.     Timeval* m_pFirstPlayTime;
  224.     
  225.     /* this class does everything for RTCP */
  226.     ReportHandler* m_pReportHandler;
  227.     RTCPBaseTransport* m_pRTCPTran;
  228.     BOOL m_bIsLive;
  229.     UINT32 m_ulExtensionSupport;
  230.     /*
  231.      * This stream may not have been SETUPed. 
  232.      */
  233.     BOOL m_bActive;
  234.     /* XXXMC
  235.      * Support for PV Emulation
  236.      */
  237.     BOOL                m_bEmulatePVSession;
  238.     /*
  239.      * Markerbit Handling
  240.      */
  241.     HandleMBitFunc m_pMBitHandler;
  242.     /*
  243.      * Reflector RTP-Info 
  244.      */
  245.     struct ReflectorInfo
  246.     {
  247. ReflectorInfo()
  248.     : m_unSeqNoOffset(0)
  249.     , m_ulRTPTSOffset(0)
  250. {}     
  251. UINT16 m_unSeqNoOffset;
  252. UINT32 m_ulRTPTSOffset;
  253.     } m_reflectorInfo;
  254.     UINT8           m_cLSRRead;
  255.     UINT8           m_cLSRWrite;
  256.     LSRRecord       m_LSRHistory [LSR_HIST_SZ];
  257.     UINT32          MapLSR(UINT32 ulSourceLSR);
  258.     IHXQoSTransportAdaptationInfo*      m_pQoSInfo;
  259.     friend class RTCPBaseTransport;
  260.     friend class RTCPUDPTransport;
  261.     friend class RTCPTCPTransport;
  262. private:
  263.     HX_RESULT _handlePacket(IHXBuffer* pBuffer, BOOL bIsRealTime);
  264. };
  265. /*
  266. *   NOTE:
  267. *   Each RTP transport represents a RTP session because transport is bounded to a pair
  268. *   of addr and ports.
  269. *   As it is currently implemented, RTP transport can NOT have more than one stream.
  270. *   Currently, we do NOT support RTSP/RTP multicast.  so we don't need to do a number
  271. *   of things that should be done if we were to support multicast.
  272. *   1. Maintain a table of members (instread we have just one member)
  273. *   2. Don't really need to calculate RTCP intervals (instead every 5 sec)
  274. *   There are two assumptions due to the nature of 1 to 1 or 1 to many session
  275. *   1. A server (server) never receives RTP.
  276. *   2. There is only one sender (server) in a session.
  277. */
  278. class RTPUDPTransport: public RTPBaseTransport
  279. {
  280. public:
  281.     RTPUDPTransport (BOOL bIsSource);
  282.     ~RTPUDPTransport ();
  283.     void Done ();
  284.     RTSPTransportTypeEnum tag ();
  285.     HX_RESULT init (IUnknown* pContext,
  286. IHXUDPSocket* pSocket,
  287. IHXRTSPTransportResponse* pResp);
  288.     void setForeignAddress (UINT32 foreignAddr,
  289.      UINT16 foreignPort);
  290.     HX_RESULT sendPacket (BasePacket* pPacket);
  291.     IHXUDPSocket* getUDPSocket ();
  292. //    void setRTCPTransport (RTCPUDPTransport* pRTCPTran);
  293.     /* XXXMC
  294.      * Special-case handling for PV clients
  295.      */
  296.     HX_RESULT sendPVHandshakeResponse(UINT8* pPktPayload);
  297.     HX_RESULT handlePacket(IHXBuffer* pBuffer);
  298.     void            JoinMulticast(UINT32 ulAddress, UINT32 ulPort, IHXUDPSocket* pUDP);
  299.     IHXUDPSocket*   getMulticastSocket(void);
  300. protected:
  301.     class KeepAliveCB : public IHXCallback
  302.     {
  303.     public:
  304. KeepAliveCB(RTPUDPTransport* pTransport);
  305.         /*
  306.          *      IUnknown methods
  307.          */
  308.         STDMETHOD(QueryInterface)       (THIS_
  309.                                         REFIID riid,
  310.                                         void** ppvObj);
  311.         STDMETHOD_(ULONG32,AddRef)      (THIS);
  312.         STDMETHOD_(ULONG32,Release)     (THIS);
  313.         /*
  314.          *      IHXCallback methods
  315.          */
  316.         STDMETHOD(Func)                 (THIS);
  317.     private:
  318. RTPUDPTransport* m_pTransport;
  319.         LONG32               m_lRefCount;
  320.         ~KeepAliveCB();
  321.         PRIVATE_DESTRUCTORS_ARE_NOT_A_CRIME
  322.     };
  323.     friend class KeepAliveCB;
  324.     HX_RESULT onNATKeepAlive();
  325. private:
  326.     HX_RESULT writePacket (IHXBuffer* pSendBuffer);
  327.     IHXUDPSocket*               m_pUDPSocket;
  328.     UINT32                       m_foreignAddr;
  329.     UINT16                       m_foreignPort;
  330. //    RTCPUDPTransport* m_pRTCPTran;       
  331.     CHXKeepAlive m_keepAlive;
  332.     UINT16       m_keepAliveSeq;  // Sequence # for keepalive packets
  333.     UINT32     m_ulCurrentMulticastAddress;
  334.     UINT32     m_ulCurrentMulticastPort;
  335.     IHXUDPSocket*   m_pMCastUDPSocket;
  336.     friend class RTCPBaseTransport;
  337.     friend class RTCPUDPTransport;
  338. };
  339. inline IHXUDPSocket*
  340. RTPUDPTransport::getUDPSocket()
  341. {
  342.     return m_pUDPSocket;
  343. }
  344. inline IHXUDPSocket*
  345. RTPUDPTransport::getMulticastSocket()
  346. {
  347.     return m_pMCastUDPSocket;
  348. }
  349. class RTPTCPTransport: public RTPBaseTransport
  350. {
  351. public:
  352.     RTPTCPTransport (BOOL bIsSource);
  353.     ~RTPTCPTransport     ();
  354.     void Done ();
  355.     
  356.     RTSPTransportTypeEnum tag ();
  357.     HX_RESULT init (IUnknown* pContext,
  358.   IHXTCPSocket* pSocket,
  359.   IHXRTSPTransportResponse* pResp);
  360.     void setInterleaveChannel (INT8 tcpInterleave)
  361.     {
  362. m_tcpInterleave = tcpInterleave;
  363.     }
  364.     HX_RESULT sendPacket (BasePacket* pPacket);
  365. //    HX_RESULT streamDone (UINT16 streamNumber);    
  366. //    void setRTCPTransport (RTCPTCPTransport* pRTCPTran);
  367.  protected:
  368.     IHXTCPSocket*  m_pTCPSocket;
  369.     
  370. private:
  371.     HX_RESULT writePacket          (IHXBuffer* pBuf);
  372.     INT8 m_tcpInterleave;
  373.     friend class RTCPBaseTransport;
  374.     friend class RTCPTCPTransport;
  375. };
  376. /******************************************************************************
  377. *   RTCP RTCP RTCP RTCP RTCP
  378. ******************************************************************************/
  379. class RTCPBaseTransport: public RTSPTransport,
  380.  public IHXQoSSignalSourceResponse
  381. {
  382. public:
  383.     RTCPBaseTransport (BOOL bIsSender);
  384.     ~RTCPBaseTransport ();
  385.     STDMETHOD(QueryInterface)           (THIS_
  386.                                         REFIID riid,
  387.                                         void** ppvObj);
  388.     STDMETHOD_(ULONG32,AddRef) (THIS);
  389.     STDMETHOD_(ULONG32,Release) (THIS);
  390.     void Done ();
  391.     RTSPTransportTypeEnum tag ()
  392.     {
  393. HX_ASSERT(!"don't call this");
  394. return RTSP_TR_NONE;
  395.     }
  396.     HX_RESULT sendPacket (BasePacket* pPacket)
  397.     {
  398. HX_ASSERT(!"don't call this");
  399. return HXR_UNEXPECTED;
  400.     }
  401.     HX_RESULT handlePacket (IHXBuffer* pBuffer);
  402.     HX_RESULT streamDone (UINT16 streamNumber)
  403.     {
  404. HX_ASSERT(!"don't call this");
  405. return HXR_UNEXPECTED;
  406.     }
  407.     void addStreamInfo(RTSPStreamInfo* pStreamInfo,
  408.        UINT32 ulBufferDepth = TRANSPORT_BUF_DURATION_UNDEF);
  409.     void setSSRC(UINT32 ulSSRC);
  410.     HX_RESULT init ();
  411.     void setSessionID         (const char* pSessionID);
  412.     void Reset(){}
  413.     void Restart(){}
  414.     HX_RESULT SetTSConverter(CHXTimestampConverter::ConversionFactors conversionFactors);
  415.     CHXTimestampConverter* GetTSConverter(void)    { return m_pTSConverter; }
  416.     class ReportCallback : public IHXCallback
  417.     {
  418.     public:
  419. ReportCallback (RTCPBaseTransport* pTransport);
  420.         /*
  421.          *      IUnknown methods
  422.          */
  423.         STDMETHOD(QueryInterface)       (THIS_
  424.                                         REFIID riid,
  425.                                         void** ppvObj);
  426.         STDMETHOD_(ULONG32,AddRef)      (THIS);
  427.         STDMETHOD_(ULONG32,Release)     (THIS);
  428.         /*
  429.          *      IHXCallback methods
  430.          */
  431.         STDMETHOD(Func)                 (THIS);
  432.     private:
  433. RTCPBaseTransport* m_pTransport;
  434.         LONG32               m_lReportRefCount;
  435.         ~ReportCallback ();
  436.         PRIVATE_DESTRUCTORS_ARE_NOT_A_CRIME
  437.     };
  438.     friend class ReportCallback;
  439.     virtual HX_RESULT reflectRTCP (IHXBuffer* pSendBuf) = 0;
  440.     virtual HX_RESULT sendSenderReport () = 0;
  441.     virtual HX_RESULT sendReceiverReport () = 0;
  442.     virtual HX_RESULT sendBye () = 0;
  443.     // IHXQoSSignalSourceResponse
  444.     STDMETHOD (SignalBusReady)(THIS_ HX_RESULT hResult, IHXQoSSignalBus* pBus, 
  445.        IHXBuffer* pSessionId);
  446. protected:
  447.     /* caller is responsible for freeing pSendBuf */
  448.     HX_RESULT makeSenderReport (REF(IHXBuffer*) pSendBuf);
  449.     HX_RESULT makeReceiverReport (REF(IHXBuffer*) pSendBuf);
  450.     HX_RESULT makeBye (REF(IHXBuffer*) pSendBuf);
  451.     HX_RESULT startScheduler ();
  452.     HX_RESULT stopScheduler ();
  453.     BOOL      isShedulerStarted (void) { return m_bSchedulerStarted; }
  454.     void      scheduleNextReport ();
  455.     
  456.     RTPBaseTransport* m_pDataTransport;
  457.     // XXXGo
  458.     // make sure stream number that RTCP is using is the same as the one
  459.     // in RTP
  460.     UINT16 m_streamNumber;
  461.     INT32 m_lRefCount;
  462.     BOOL m_bSendBye;
  463.     BOOL m_bSendReport;
  464.     ReportCallback* m_pReportCallback;
  465.     BOOL m_bCallbackPending;
  466.     CallbackHandle m_reportTimeoutID;
  467.     BOOL m_bSchedulerStarted;
  468.     BOOL                                m_bSendRTCP;
  469.     BOOL                                m_bSSRCDetermined;
  470.     UINT32                              m_ulSSRCDetermined;
  471.     // a random number for CNAME...
  472.     BYTE* m_pcCNAME;
  473.     /* this class does everything for RTCP */
  474.     /* and pointing to the same instance that RTPBaseTransport has */
  475.     ReportHandler* m_pReportHandler;
  476.     CHXTimestampConverter* m_pTSConverter;
  477.     /* For placing recevier reports on QoS Signal Bus */
  478.     IHXQoSSignalBus*                    m_pSignalBus;
  479.     IHXQoSSignal*                       m_pQoSSignal_RR;
  480.     IHXQoSSignal*                       m_pQoSSignal_APP;
  481.     IHXBuffer*                          m_pSessionId;
  482.     friend class RTPBaseTransport;
  483.     friend class RTPUDPTransport;
  484.     friend class RTPTCPTransport;
  485. };
  486. class RTCPUDPTransport: public RTCPBaseTransport
  487. {
  488. public:
  489.     RTCPUDPTransport (BOOL bIsSender);
  490.     ~RTCPUDPTransport ();
  491.     void Done ();
  492.     HX_RESULT init (IUnknown* pContext,
  493.      IHXUDPSocket* pSocket,
  494. RTPUDPTransport* pDataTransport,
  495. IHXRTSPTransportResponse* pResp,
  496. UINT16 streamNumber);
  497.     RTSPTransportTypeEnum tag ();
  498.     HX_RESULT streamDone (UINT16 streamNumber);
  499.     void setForeignAddress (UINT32 foreignAddr,
  500.      UINT16 foreignPort);
  501.     IHXUDPSocket* getUDPSocket ();
  502.     HX_RESULT handlePacket(IHXBuffer* pBuffer);
  503.     void            JoinMulticast(UINT32 ulAddress, UINT32 ulPort, IHXUDPSocket* pUDP);
  504.     IHXUDPSocket*   getMulticastSocket(void);
  505. protected:
  506.     class KeepAliveCB : public IHXCallback
  507.     {
  508.     public:
  509. KeepAliveCB(RTCPUDPTransport* pTransport);
  510.         /*
  511.          *      IUnknown methods
  512.          */
  513.         STDMETHOD(QueryInterface)       (THIS_
  514.                                         REFIID riid,
  515.                                         void** ppvObj);
  516.         STDMETHOD_(ULONG32,AddRef)      (THIS);
  517.         STDMETHOD_(ULONG32,Release)     (THIS);
  518.         /*
  519.          *      IHXCallback methods
  520.          */
  521.         STDMETHOD(Func)                 (THIS);
  522.     private:
  523. RTCPUDPTransport* m_pTransport;
  524.         LONG32               m_lRefCount;
  525.         ~KeepAliveCB();
  526.         PRIVATE_DESTRUCTORS_ARE_NOT_A_CRIME
  527.     };
  528.     friend class KeepAliveCB;
  529.     HX_RESULT onNATKeepAlive();
  530. private:
  531.     HX_RESULT reflectRTCP (IHXBuffer* pSendBuf);
  532.     HX_RESULT sendSenderReport ();
  533.     HX_RESULT sendReceiverReport ();
  534.     HX_RESULT sendBye ();
  535.     
  536.     IHXUDPSocket*   m_pUDPSocket;
  537.     UINT32          m_foreignAddr;
  538.     UINT16          m_foreignPort;
  539.     CHXKeepAlive    m_keepAlive;
  540.     UINT32     m_ulCurrentMulticastAddress;
  541.     UINT32     m_ulCurrentMulticastPort;
  542.     IHXUDPSocket*   m_pMCastUDPSocket;
  543.     friend class RTPBaseTransport;
  544.     friend class RTPUDPTransport;
  545. };
  546. inline IHXUDPSocket*
  547. RTCPUDPTransport::getUDPSocket()
  548. {
  549.     return m_pUDPSocket;
  550. }
  551. inline IHXUDPSocket*
  552. RTCPUDPTransport::getMulticastSocket()
  553. {
  554.     return m_pMCastUDPSocket;
  555. }
  556. class RTCPTCPTransport: public RTCPBaseTransport
  557. {
  558. public:
  559.     RTCPTCPTransport (BOOL bIsSender);
  560.     ~RTCPTCPTransport ();
  561.     void Done ();
  562.     HX_RESULT init (IUnknown* pContext,
  563.      IHXTCPSocket* pSocket,
  564. RTPTCPTransport* pDataTransport,
  565. IHXRTSPTransportResponse* pResp,
  566. UINT16 streamNumber);
  567.     void setInterleaveChannel (INT8 tcpInterleave)
  568.     {
  569. m_tcpInterleave = tcpInterleave;
  570.     }
  571.     RTSPTransportTypeEnum tag ();
  572.     HX_RESULT streamDone (UINT16 streamNumber);
  573. private:
  574.     HX_RESULT reflectRTCP (IHXBuffer* pSendBuf);
  575.     HX_RESULT sendSenderReport ();
  576.     HX_RESULT sendReceiverReport ();
  577.     HX_RESULT sendBye ();
  578.     HX_RESULT writePacket (IHXBuffer* pBuf);
  579.     
  580.     IHXTCPSocket* m_pTCPSocket;
  581.     INT8 m_tcpInterleave;
  582. //    friend class RTPBaseTransport;
  583. //    friend class RTPTCPTransport;
  584. };
  585. #endif /* ndef _RTPTRAN_H_ */