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

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 _RTSPTRAN_H_
  36. #define _RTSPTRAN_H_
  37. //#define RDT_MESSAGE_DEBUG
  38. #include "hxengin.h"
  39. #include "hxmon.h"
  40. #include "transbuf.h"
  41. #include "statinfo.h"
  42. #include "hxsmbw.h"
  43. // GCC won't let me forward declare CHXMapLongToObj::Iterator, 
  44. // so I have to include this. -JR
  45. #include "hxmap.h"
  46. #include "packfilt.h"
  47. struct IHXScheduler;
  48. struct IHXUDPSocket;
  49. struct IHXPacket;
  50. struct IHXBuffer;
  51. struct IHXCommonClassFactory;
  52. struct IHXInternalReset;
  53. struct IHXPlayerState;
  54. struct IHXAccurateClock;
  55. struct IHXSourceBufferingStats2;
  56. class  RTSPResendBuffer;
  57. class  CHXBitset;
  58. class  HX_deque;
  59. class  Timeval;
  60. class  CHXTimestampConverter;
  61. class  TNGLatencyReportPacket;
  62. struct IHXSessionStats;
  63. class TNGDataPacket;
  64. class TNGReportPacket;
  65. class TNGACKPacket;
  66. class TNGRTTRequestPacket;
  67. class TNGRTTResponsePacket;
  68. class TNGCongestionPacket;
  69. class TNGStreamEndPacket;
  70. class RTCPBaseTransport;
  71. class RTCPUDPTransport;
  72. class RTCPTCPTransport;
  73. class RTCPPacket;
  74. class ReportHandler;
  75. const UINT32 TRANSPORT_BUF_DURATION           = 2000; // 2 seconds
  76. const UINT32 TRANSPORT_BUF_DURATION_UNDEF     = 0xffffffff;
  77. const UINT32 MAX_TRANSPORT_BUF_DURATION       = 15000;
  78. /* Note: Both port numbers MUST be even */
  79. const UINT16 MIN_UDP_PORT = 6970;
  80. const UINT16 MAX_UDP_PORT = 32000;
  81. const UINT32 MAX_UDP_PACKET = 4096; // XXXBAB - check this
  82. const UINT32 MAX_PACKET_SIZE = 1000; // XXXBAB - check this
  83. const UINT32 DEFAULT_WRAP_SEQ_NO = 0x10000;
  84. const UINT32 TNG_WRAP_SEQ_NO = 0xff00;
  85. const UINT32 TNG_MAX_SEQ_GAP = 0x00C8;
  86. const UINT16 MAX_DEQUE_SIZE = 0x8000;
  87. const UINT16 INITIAL_DEQUE_SIZE = 0x400;
  88. const UINT16 PREFETCH_START_SIZE = 0x200;
  89. const UINT16 PREFETCH_CHUNK_SIZE = 0x100;
  90. static const UINT32 RESEND_BUF_DURATION     = 15000;   // 15 seconds
  91. static const UINT32 MAX_RESEND_BUF_DURATION = 90000;
  92. static const UINT32 RESEND_BUF_GROWTH_RATE  = 2000;
  93. //XXXGLENN...needs to be a range of ports for firewalls
  94. //const UINT16 SPLITTER_RESEND_PORT = 10002;
  95. class RTSPStreamData
  96. {
  97. public:
  98.     RTSPStreamData(BOOL needReliable);
  99.     virtual ~RTSPStreamData();
  100.     UINT16   m_seqNo;
  101.     UINT16 m_reliableSeqNo;
  102.     UINT16 m_lastSeqNo;
  103.     BOOL m_bNeedReliable;
  104.     BOOL m_packetSent;
  105.     UINT16 m_streamNumber;
  106.     UINT32 m_lastTimestamp;
  107.     RTSPTransportBuffer* m_pTransportBuffer;
  108.     RTSPResendBuffer* m_pResendBuffer;
  109.     STREAM_STATS* m_pStreamStats;
  110.     BOOL m_bReceivedAllPackets;
  111.     BOOL m_bNeedToACK;
  112.     BOOL m_bFirstPacket;
  113.     BOOL m_bUsesRTPPackets;
  114.     RTSPMediaType m_eMediaType;
  115.     CHXTimestampConverter*      m_pTSConverter;
  116.     /* The core must receive packet ordered in RMA time stamp.
  117.      * This structure is initialized and used when the stream is
  118.      * is instructed to do so.  In such case RMA time stamps
  119.      * are forced to be ordered (out-of-order time stamp is forced
  120.      * to the value of the last in-order time stamp).
  121.      * The use of this structue must be accompanied with the use
  122.      * of RTP packets which preserve the original packet time stamp
  123.      * in RTPTime packet field.
  124.      */
  125.     struct TSOrderHackInfo
  126.     {
  127. TSOrderHackInfo()
  128.     : m_ulLastSentTS(0)
  129.     , m_ulLastRecvTS(0)
  130. {
  131.     ;
  132. }     
  133. UINT32 m_ulLastSentTS;
  134. UINT32  m_ulLastRecvTS;
  135.     };
  136.     TSOrderHackInfo* m_pTSOrderHack;
  137. };
  138. class RTSPStreamHandler
  139. {
  140. public:
  141.     RTSPStreamHandler(RTSPTransport* pOwner);
  142.     ~RTSPStreamHandler();
  143.     HX_RESULT        initStreamData(UINT16 streamNumber,
  144.                                      BOOL needReliable,
  145.                                      BOOL bIsSource,
  146.      INT16 rtpPayloadType,
  147.      BOOL bPushData,
  148.      UINT32 wrapSequenceNumber,
  149.      UINT32 ulBufferDepth,
  150.      BOOL bHasOutOfOrderTS = FALSE,
  151.      CHXTimestampConverter* pTSConverter = NULL,
  152.      RTSPMediaType eMediaType = RTSPMEDIA_TYPE_UNKNOWN);
  153.     RTSPStreamData*   getStreamData(UINT16 streamNumber);
  154.     HX_RESULT         createResendBuffer(UINT16 streamNumber,
  155.  UINT32 wrapSequenceNumber);
  156.     RTSPResendBuffer* getResendBuffer(UINT16 streamNumber);
  157.     RTSPStreamData*   firstStreamData();
  158.     RTSPStreamData*   nextStreamData();
  159.     BOOL              endStreamData();
  160.     UINT16            streamCount() { return (m_pStreamDataMap) ? (UINT16)m_pStreamDataMap->GetCount() : 0;};
  161.     void       AddRef()  {   m_lRefCount++; }
  162.     void       Release() {
  163.     m_lRefCount--;
  164.     if (m_lRefCount == 0)
  165. delete this;
  166. }
  167. private:
  168.     INT32 m_lRefCount;
  169.     RTSPTransport* m_pOwner;
  170.     CHXMapLongToObj* m_pStreamDataMap;
  171.     CHXMapLongToObj::Iterator streamIterator;
  172. };
  173. class RTSPTransport : public RawPacketFilter
  174. {
  175. public:
  176.     RTSPTransport (BOOL bIsSource);
  177.     virtual ~RTSPTransport  ();
  178.     STDMETHOD(QueryInterface)           (THIS_
  179.                                         REFIID riid,
  180.                                         void** ppvObj) PURE;
  181.     STDMETHOD_(ULONG32,AddRef)       (THIS) PURE;
  182.     STDMETHOD_(ULONG32,Release)      (THIS) PURE;
  183.     virtual void Done () = 0;
  184.     virtual void Reset () = 0;
  185.     virtual void Restart () = 0;
  186.     virtual RTSPTransportTypeEnum tag () = 0;
  187.     virtual void addStreamInfo (RTSPStreamInfo* pStreamInfo,
  188.  UINT32 ulBufferDepth = TRANSPORT_BUF_DURATION_UNDEF);
  189.     virtual void setSessionID (const char* pSessionID);
  190.     virtual HX_RESULT sendPacket (BasePacket* pPacket) = 0;
  191.     virtual HX_RESULT sendToResendBuffer(BasePacket* pPacket) { return HXR_OK; }
  192.     virtual HX_RESULT handlePacket (IHXBuffer* pBuffer) = 0;
  193.     virtual HX_RESULT handleMasterSync (ULONG32 ulHXTime, LONG32 lHXOffsetToMaster)
  194. { return HXR_OK; }
  195.     virtual HX_RESULT anchorSync (ULONG32 ulHXTime, ULONG32 ulNTPTime)
  196. { return HXR_OK; }
  197.     virtual HX_RESULT releasePackets () { return HXR_OK; }
  198.     virtual HX_RESULT streamDone (UINT16 streamNumber) = 0;
  199.     virtual IHXUDPSocket* getUDPSocket ();
  200.     virtual IHXUDPSocket* getMulticastSocket ();
  201.     virtual HX_RESULT sendNAKPacket (UINT16 uStreamNumber,
  202.  UINT16 uBeingSeqNo,
  203.  UINT16 uEndSeqNo)
  204. { return HXR_OK; }
  205.     virtual BOOL isNullSetup() { return FALSE; }
  206.     virtual BOOL isRTP() { return FALSE; }
  207.     virtual BOOL isReflector() { return FALSE; }
  208.     // BCM
  209.     virtual RTSPStreamHandler* GetStreamHandler(void) { HX_ASSERT(FALSE); return NULL;}
  210.     virtual void SetStreamHandler (RTSPStreamHandler* pHandler) {;}
  211. //    virtual void MulticastSetup (RTSPTransport* pTrans) {}
  212.     virtual void MulticastSetup (RTSPStreamHandler* pHandler) {}
  213.     virtual void JoinMulticast (UINT32 ulAddress, UINT32 ulPort,
  214.  IHXUDPSocket* pUDP) {};
  215.     virtual BOOL isBCM(void) { return FALSE; }
  216.     // end BCM
  217.     
  218.     UINT16  getSeqNum (UINT16 streamNumber);
  219.     UINT32  getTimestamp (UINT16 streamNumber);
  220. //    HX_RESULT setMarkerRule (UINT16 ruleNumber);
  221.     virtual HX_RESULT setFirstSeqNum (UINT16 streamNumber,
  222.  UINT16 seqNum);
  223.       
  224.     virtual void      setFirstTimeStamp (UINT16 uStreamNumber, UINT32 ulTS, 
  225.                                          BOOL bIsRaw = FALSE);
  226. // only in RTPTransport...
  227. virtual void      notifyEmptyRTPInfo(void) {;}
  228.     virtual void      setPlayRange (UINT32 ulFrom, UINT32 ulTo);
  229.     virtual HX_RESULT      setFirstPlayTime  (Timeval* pTv) {return HXR_OK;};
  230.  
  231.     HX_RESULT resetFlags (UINT16 streamNumber);
  232.     HX_RESULT getPacket (UINT16 uStreamNumber,
  233.  IHXPacket*& pPacket);
  234.     virtual HX_RESULT startPackets (UINT16 uStreamNumber);
  235.     virtual HX_RESULT stopPackets (UINT16 uStreamNumber);
  236.     HX_RESULT storePacket (IHXPacket* pPacket,
  237.                                          UINT16 uStreamNumber,
  238.  UINT16 uSeqNo,
  239.  UINT16 uReliableSeqNo,
  240.  BOOL isReliable);
  241.     HX_RESULT packetReady (HX_RESULT status,
  242.  RTSPStreamData* pStreamData,
  243.  IHXPacket* pPacket);
  244.     HX_RESULT packetReady (HX_RESULT status,
  245.  UINT16 uStreamNumber,
  246.  IHXPacket* pPacket);
  247.     RTSPTransportBuffer* getTransportBuffer(UINT16 uStreamNumber);
  248.     RTSPResendBuffer* getResendBuffer(UINT16 streamNumber);
  249.     HX_RESULT getStatus (UINT16& uStatusCode, 
  250.  IHXBuffer*& pStatusDesc, 
  251.  UINT16& ulPercentDone);
  252.     HX_RESULT GetCurrentBuffering(UINT16  uStreamNumber,
  253.     INT64&  llLowestTimestamp, 
  254.     INT64&  llHighestTimestamp,
  255.     UINT32& ulNumBytes,
  256.     BOOL&   bDone);
  257.     HX_RESULT SeekFlush (UINT16 uStreamNumber);
  258.     BOOL IsDataReceived() {return m_bIsReceivedData;};
  259.     BOOL IsSourceDone(void);
  260.     HX_RESULT initializeStatistics (UINT32 ulRegistryID);
  261.     HX_RESULT SetStatistics (UINT16 uStreamNumber, STREAM_STATS* pStats);
  262.     HX_RESULT updateStatistics (BOOL bUseRegistry = TRUE);
  263.     HX_RESULT UpdateRegistry (UINT32 ulStreamNumber,
  264.  UINT32 ulRegistryID);
  265.     INT64  getBytesSent                 () {return m_lBytesSent;}
  266.     UINT32 getPacketsSent               () {return m_ulPacketsSent;}
  267.     HX_RESULT playReset ();
  268.     virtual HX_RESULT pauseBuffers ();
  269.     virtual HX_RESULT resumeBuffers ();
  270.     HX_RESULT Init (IUnknown* pContext);
  271.     HX_RESULT SetResendBufferDepth (UINT32 uMilliseconds);
  272.  
  273.     BOOL IsInitialized ();
  274.     BOOL IsUpdated ();
  275.     UINT32 wrapSequenceNumber ();
  276.     void CheckForSourceDone (UINT16 uStreamNumber);
  277.     void HandleBufferError ();
  278.     IHXScheduler*  GetScheduler(void) {return m_pScheduler;};
  279.     virtual BOOL SupportsPacketAggregation() { return FALSE; }
  280.     virtual HX_RESULT sendPackets (BasePacket** pPacket) { return HXR_NOTIMPL; }
  281.      /*XXXMC
  282.       *Special-case handling for PV clients
  283.       */
  284.      virtual HX_RESULT sendPVHandshakeResponse(UINT8* pPktPayload)
  285.                                               { return HXR_NOTIMPL; }
  286.     //XXXGH...Fix this stuff left over from Ogre
  287.     BOOL m_bHackedRecordFlag;
  288.     IHXPlayerState* m_pPlayerState;
  289.     
  290.     void FilterPacket(IHXPacket* pPacket);
  291.     void SetFilterResponse(RawPacketFilter*);
  292.     BOOL isSparseStream(UINT16 uStreamNumber);
  293.     void GetContext(IUnknown*& pContext);
  294.     void EnterPrefetch(void) { m_bPrefetch = TRUE; };
  295.     void LeavePrefetch(void);
  296.     void EnterFastStart(void);
  297.     void LeaveFastStart(void);
  298.     inline BOOL HasPlayRequestBeenSent() { return m_bPlayRequestSent; }
  299.         
  300.     inline void SetPlayRequestSent(BOOL bValue) { m_bPlayRequestSent = bValue; }
  301.     UINT32 GetPacketsSent() { return m_ulPacketsSent; }
  302.     INT64 GetBytesSent() { return m_lBytesSent; }
  303.     UINT32 GetTotalSuccessfulResends() { return m_ulTotalSuccessfulResends; }
  304.     UINT32 GetTotalFailedResends() { return m_ulTotalFailedResends; }
  305.     UINT32 GetSendingTime() { return m_ulSendingTime; }
  306.         
  307. protected:
  308.     IUnknown* m_pContext;
  309.     IHXCommonClassFactory*      m_pCommonClassFactory;
  310.     IHXScheduler*               m_pScheduler;
  311.     IHXRTSPTransportResponse*   m_pResp;
  312.     IHXRegistry* m_pRegistry;
  313.     IHXInternalReset* m_pInternalReset;
  314.     IHXSourceBufferingStats2*           m_pSrcBufferStats;
  315.     CHXString m_sessionID;
  316.     RTSPStreamHandler* m_pStreamHandler;
  317.     BOOL                 m_bIsSource;
  318.     UINT32 m_ulRegistryID;
  319.     UINT32 m_ulPacketsSent;
  320.     INT64 m_lBytesSent;
  321.     UINT32 m_ulStartTime;
  322.     UINT32 m_ulPlayRangeFrom;
  323.     UINT32 m_ulPlayRangeTo;
  324.     BOOL m_bIsInitialized;
  325.     BOOL m_bIsUpdated;
  326.     BOOL m_bPrefetch;
  327.     BOOL m_bFastStart;
  328.     BOOL m_bIsReceivedData;
  329.     BOOL m_bSourceDone;
  330.     UINT32 m_wrapSequenceNumber;
  331.     // actual multicast sender
  332.     BOOL m_bMulticast;    
  333.     
  334.     RawPacketFilter* m_pPacketFilter;
  335.     CHXSimpleList*  m_pClientPacketList;
  336.     BOOL                                m_bPlayRequestSent;
  337.     UINT32                              m_ulTotalSuccessfulResends; 
  338.     UINT32                              m_ulTotalFailedResends;
  339.     UINT32                              m_ulSendingTime;
  340.     BOOL m_drop_packets;
  341.     UINT32 m_packets_since_last_drop;    
  342.     BOOL                                m_bSkipTimeAdjustment;
  343. #ifdef RDT_MESSAGE_DEBUG
  344.     BOOL      m_bRDTMessageDebug;
  345.     CHXString m_RDTmessageDebugFileName;
  346.     void RDTmessageFormatDebugFileOut(const char* fmt, ...);
  347. #endif // RDT_MESSAGE_DEBUG
  348. };
  349. inline IHXUDPSocket*
  350. RTSPTransport::getUDPSocket()
  351. {
  352.     return 0;
  353. }
  354. inline IHXUDPSocket*
  355. RTSPTransport::getMulticastSocket()
  356. {
  357.     return 0;
  358. }
  359. inline BOOL
  360. RTSPTransport::IsInitialized()
  361. {
  362.     return m_bIsInitialized;
  363. }
  364. inline BOOL
  365. RTSPTransport::IsUpdated()
  366. {
  367.     return m_bIsUpdated;
  368. }
  369. inline UINT32
  370. RTSPTransport::wrapSequenceNumber()
  371. {
  372.     return m_wrapSequenceNumber;
  373. }
  374. #endif /* ndef _RTSPTRAN_H_ */