rtsptran.h
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:15k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: rtsptran.h,v 1.16.2.1 2004/07/09 02:04:37 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #ifndef _RTSPTRAN_H_
  50. #define _RTSPTRAN_H_
  51. //#define RDT_MESSAGE_DEBUG
  52. #include "hxengin.h"
  53. #include "hxmon.h"
  54. #include "transbuf.h"
  55. #include "statinfo.h"
  56. #include "hxsmbw.h"
  57. // GCC won't let me forward declare CHXMapLongToObj::Iterator, 
  58. // so I have to include this. -JR
  59. #include "hxmap.h"
  60. #include "packfilt.h"
  61. struct IHXScheduler;
  62. struct IHXUDPSocket;
  63. struct IHXPacket;
  64. struct IHXBuffer;
  65. struct IHXCommonClassFactory;
  66. struct IHXInternalReset;
  67. struct IHXPlayerState;
  68. struct IHXAccurateClock;
  69. struct IHXSourceBufferingStats2;
  70. class  RTSPResendBuffer;
  71. class  CHXBitset;
  72. class  HX_deque;
  73. class  Timeval;
  74. class  CHXTimestampConverter;
  75. class  TNGLatencyReportPacket;
  76. struct IHXSessionStats;
  77. class TNGDataPacket;
  78. class TNGReportPacket;
  79. class TNGACKPacket;
  80. class TNGRTTRequestPacket;
  81. class TNGRTTResponsePacket;
  82. class TNGCongestionPacket;
  83. class TNGStreamEndPacket;
  84. class RTCPBaseTransport;
  85. class RTCPUDPTransport;
  86. class RTCPTCPTransport;
  87. class RTCPPacket;
  88. class ReportHandler;
  89. const UINT32 TRANSPORT_BUF_DURATION           = 2000; // 2 seconds
  90. const UINT32 TRANSPORT_BUF_DURATION_UNDEF     = 0xffffffff;
  91. const UINT32 MAX_TRANSPORT_BUF_DURATION       = 15000;
  92. /* Note: Both port numbers MUST be even */
  93. const UINT16 MIN_UDP_PORT = 6970;
  94. const UINT16 MAX_UDP_PORT = 32000;
  95. const UINT32 MAX_UDP_PACKET = 4096; // XXXBAB - check this
  96. const UINT32 MAX_PACKET_SIZE = 1000; // XXXBAB - check this
  97. const UINT32 DEFAULT_WRAP_SEQ_NO = 0x10000;
  98. const UINT32 TNG_WRAP_SEQ_NO = 0xff00;
  99. const UINT32 TNG_MAX_SEQ_GAP = 0x00C8;
  100. const UINT16 MAX_DEQUE_SIZE = 0x8000;
  101. const UINT16 INITIAL_DEQUE_SIZE = 0x400;
  102. const UINT16 PREFETCH_START_SIZE = 0x200;
  103. const UINT16 PREFETCH_CHUNK_SIZE = 0x100;
  104. static const UINT32 RESEND_BUF_DURATION     = 15000;   // 15 seconds
  105. static const UINT32 MAX_RESEND_BUF_DURATION = 90000;
  106. static const UINT32 RESEND_BUF_GROWTH_RATE  = 2000;
  107. //XXXGLENN...needs to be a range of ports for firewalls
  108. //const UINT16 SPLITTER_RESEND_PORT = 10002;
  109. class RTSPStreamData
  110. {
  111. public:
  112.     RTSPStreamData(BOOL needReliable);
  113.     virtual ~RTSPStreamData();
  114.     UINT16   m_seqNo;
  115.     UINT16 m_reliableSeqNo;
  116.     UINT16 m_lastSeqNo;
  117.     BOOL m_bNeedReliable;
  118.     BOOL m_packetSent;
  119.     UINT16 m_streamNumber;
  120.     UINT32 m_lastTimestamp;
  121.     RTSPTransportBuffer* m_pTransportBuffer;
  122.     RTSPResendBuffer* m_pResendBuffer;
  123.     STREAM_STATS* m_pStreamStats;
  124.     BOOL m_bReceivedAllPackets;
  125.     BOOL m_bNeedToACK;
  126.     BOOL m_bFirstPacket;
  127.     BOOL m_bUsesRTPPackets;
  128.     RTSPMediaType m_eMediaType;
  129.     CHXTimestampConverter*      m_pTSConverter;
  130.     /* The core must receive packet ordered in RMA time stamp.
  131.      * This structure is initialized and used when the stream is
  132.      * is instructed to do so.  In such case RMA time stamps
  133.      * are forced to be ordered (out-of-order time stamp is forced
  134.      * to the value of the last in-order time stamp).
  135.      * The use of this structue must be accompanied with the use
  136.      * of RTP packets which preserve the original packet time stamp
  137.      * in RTPTime packet field.
  138.      */
  139.     struct TSOrderHackInfo
  140.     {
  141. TSOrderHackInfo()
  142.     : m_ulLastSentTS(0)
  143.     , m_ulLastRecvTS(0)
  144. {
  145.     ;
  146. }     
  147. UINT32 m_ulLastSentTS;
  148. UINT32  m_ulLastRecvTS;
  149.     };
  150.     TSOrderHackInfo* m_pTSOrderHack;
  151. };
  152. class RTSPStreamHandler
  153. {
  154. public:
  155.     RTSPStreamHandler(RTSPTransport* pOwner);
  156.     ~RTSPStreamHandler();
  157.     HX_RESULT        initStreamData(UINT16 streamNumber,
  158.                                      BOOL needReliable,
  159.                                      BOOL bIsSource,
  160.      INT16 rtpPayloadType,
  161.      BOOL bPushData,
  162.      UINT32 wrapSequenceNumber,
  163.      UINT32 ulBufferDepth,
  164.      BOOL bHasOutOfOrderTS = FALSE,
  165.      CHXTimestampConverter* pTSConverter = NULL,
  166.      RTSPMediaType eMediaType = RTSPMEDIA_TYPE_UNKNOWN);
  167.     RTSPStreamData*   getStreamData(UINT16 streamNumber);
  168.     HX_RESULT         createResendBuffer(UINT16 streamNumber,
  169.  UINT32 wrapSequenceNumber);
  170.     RTSPResendBuffer* getResendBuffer(UINT16 streamNumber);
  171.     RTSPStreamData*   firstStreamData();
  172.     RTSPStreamData*   nextStreamData();
  173.     BOOL              endStreamData();
  174.     UINT16            streamCount() { return (m_pStreamDataMap) ? (UINT16)m_pStreamDataMap->GetCount() : 0;};
  175.     void       AddRef()  {   m_lRefCount++; }
  176.     void       Release() {
  177.     m_lRefCount--;
  178.     if (m_lRefCount == 0)
  179. delete this;
  180. }
  181. private:
  182.     INT32 m_lRefCount;
  183.     RTSPTransport* m_pOwner;
  184.     CHXMapLongToObj* m_pStreamDataMap;
  185.     CHXMapLongToObj::Iterator streamIterator;
  186. };
  187. class RTSPTransport : public RawPacketFilter
  188. {
  189. public:
  190.     RTSPTransport (BOOL bIsSource);
  191.     virtual ~RTSPTransport  ();
  192.     STDMETHOD(QueryInterface)           (THIS_
  193.                                         REFIID riid,
  194.                                         void** ppvObj) PURE;
  195.     STDMETHOD_(ULONG32,AddRef)       (THIS) PURE;
  196.     STDMETHOD_(ULONG32,Release)      (THIS) PURE;
  197.     virtual void Done () = 0;
  198.     virtual void Reset () = 0;
  199.     virtual void Restart () = 0;
  200.     virtual RTSPTransportTypeEnum tag () = 0;
  201.     virtual void addStreamInfo (RTSPStreamInfo* pStreamInfo,
  202.  UINT32 ulBufferDepth = TRANSPORT_BUF_DURATION_UNDEF);
  203.     virtual void setSessionID (const char* pSessionID);
  204.     virtual HX_RESULT sendPacket (BasePacket* pPacket) = 0;
  205.     virtual HX_RESULT sendToResendBuffer(BasePacket* pPacket) { return HXR_OK; }
  206.     virtual HX_RESULT handlePacket (IHXBuffer* pBuffer) = 0;
  207.     virtual HX_RESULT handleMasterSync (ULONG32 ulHXTime, LONG32 lHXOffsetToMaster)
  208. { return HXR_OK; }
  209.     virtual HX_RESULT anchorSync (ULONG32 ulHXTime, ULONG32 ulNTPTime)
  210. { return HXR_OK; }
  211.     virtual HX_RESULT releasePackets () { return HXR_OK; }
  212.     virtual HX_RESULT streamDone (UINT16 streamNumber) = 0;
  213.     virtual IHXUDPSocket* getUDPSocket ();
  214.     virtual IHXUDPSocket* getMulticastSocket ();
  215.     virtual HX_RESULT sendNAKPacket (UINT16 uStreamNumber,
  216.  UINT16 uBeingSeqNo,
  217.  UINT16 uEndSeqNo)
  218. { return HXR_OK; }
  219.     virtual BOOL isNullSetup() { return FALSE; }
  220.     virtual BOOL isRTP() { return FALSE; }
  221.     virtual BOOL isReflector() { return FALSE; }
  222.     // BCM
  223.     virtual RTSPStreamHandler* GetStreamHandler(void) { HX_ASSERT(FALSE); return NULL;}
  224.     virtual void SetStreamHandler (RTSPStreamHandler* pHandler) {;}
  225. //    virtual void MulticastSetup (RTSPTransport* pTrans) {}
  226.     virtual void MulticastSetup (RTSPStreamHandler* pHandler) {}
  227.     virtual void JoinMulticast (UINT32 ulAddress, UINT32 ulPort,
  228.  IHXUDPSocket* pUDP) {};
  229.     virtual BOOL isBCM(void) { return FALSE; }
  230.     // end BCM
  231.     
  232.     UINT16  getSeqNum (UINT16 streamNumber);
  233.     UINT32  getTimestamp (UINT16 streamNumber);
  234. //    HX_RESULT setMarkerRule (UINT16 ruleNumber);
  235.     virtual HX_RESULT setFirstSeqNum (UINT16 streamNumber,
  236.  UINT16 seqNum);
  237.       
  238.     virtual void      setFirstTimeStamp (UINT16 uStreamNumber, UINT32 ulTS, 
  239.                                          BOOL bIsRaw = FALSE);
  240. // only in RTPTransport...
  241. virtual void      notifyEmptyRTPInfo(void) {;}
  242.     virtual void      setPlayRange (UINT32 ulFrom, UINT32 ulTo);
  243.     virtual HX_RESULT      setFirstPlayTime  (Timeval* pTv) {return HXR_OK;};
  244.  
  245.     HX_RESULT resetFlags (UINT16 streamNumber);
  246.     HX_RESULT getPacket (UINT16 uStreamNumber,
  247.  IHXPacket*& pPacket);
  248.     virtual HX_RESULT startPackets (UINT16 uStreamNumber);
  249.     virtual HX_RESULT stopPackets (UINT16 uStreamNumber);
  250.     HX_RESULT storePacket (IHXPacket* pPacket,
  251.                                          UINT16 uStreamNumber,
  252.  UINT16 uSeqNo,
  253.  UINT16 uReliableSeqNo,
  254.  BOOL isReliable);
  255.     HX_RESULT packetReady (HX_RESULT status,
  256.  RTSPStreamData* pStreamData,
  257.  IHXPacket* pPacket);
  258.     HX_RESULT packetReady (HX_RESULT status,
  259.  UINT16 uStreamNumber,
  260.  IHXPacket* pPacket);
  261.     RTSPTransportBuffer* getTransportBuffer(UINT16 uStreamNumber);
  262.     RTSPResendBuffer* getResendBuffer(UINT16 streamNumber);
  263.     HX_RESULT getStatus (UINT16& uStatusCode, 
  264.  IHXBuffer*& pStatusDesc, 
  265.  UINT16& ulPercentDone);
  266.     HX_RESULT GetCurrentBuffering(UINT16  uStreamNumber,
  267.     INT64&  llLowestTimestamp, 
  268.     INT64&  llHighestTimestamp,
  269.     UINT32& ulNumBytes,
  270.     BOOL&   bDone);
  271.     HX_RESULT SeekFlush (UINT16 uStreamNumber);
  272.     BOOL IsDataReceived() {return m_bIsReceivedData;};
  273.     BOOL IsSourceDone(void);
  274.     HX_RESULT initializeStatistics (UINT32 ulRegistryID);
  275.     HX_RESULT SetStatistics (UINT16 uStreamNumber, STREAM_STATS* pStats);
  276.     HX_RESULT updateStatistics (BOOL bUseRegistry = TRUE);
  277.     HX_RESULT UpdateRegistry (UINT32 ulStreamNumber,
  278.  UINT32 ulRegistryID);
  279.     INT64  getBytesSent                 () {return m_lBytesSent;}
  280.     UINT32 getPacketsSent               () {return m_ulPacketsSent;}
  281.     HX_RESULT playReset ();
  282.     virtual HX_RESULT pauseBuffers ();
  283.     virtual HX_RESULT resumeBuffers ();
  284.     HX_RESULT Init (IUnknown* pContext);
  285.     HX_RESULT SetResendBufferDepth (UINT32 uMilliseconds);
  286.  
  287.     BOOL IsInitialized ();
  288.     BOOL IsUpdated ();
  289.     UINT32 wrapSequenceNumber ();
  290.     void CheckForSourceDone (UINT16 uStreamNumber);
  291.     void HandleBufferError ();
  292.     IHXScheduler*  GetScheduler(void) {return m_pScheduler;};
  293.     virtual BOOL SupportsPacketAggregation() { return FALSE; }
  294.     virtual HX_RESULT sendPackets (BasePacket** pPacket) { return HXR_NOTIMPL; }
  295.      /*XXXMC
  296.       *Special-case handling for PV clients
  297.       */
  298.      virtual HX_RESULT sendPVHandshakeResponse(UINT8* pPktPayload)
  299.                                               { return HXR_NOTIMPL; }
  300.     //XXXGH...Fix this stuff left over from Ogre
  301.     BOOL m_bHackedRecordFlag;
  302.     IHXPlayerState* m_pPlayerState;
  303.     
  304.     void FilterPacket(IHXPacket* pPacket);
  305.     void SetFilterResponse(RawPacketFilter*);
  306.     BOOL isSparseStream(UINT16 uStreamNumber);
  307.     void GetContext(IUnknown*& pContext);
  308.     void EnterPrefetch(void) { m_bPrefetch = TRUE; };
  309.     void LeavePrefetch(void);
  310.     void EnterFastStart(void);
  311.     void LeaveFastStart(void);
  312.     inline BOOL HasPlayRequestBeenSent() { return m_bPlayRequestSent; }
  313.         
  314.     inline void SetPlayRequestSent(BOOL bValue) { m_bPlayRequestSent = bValue; }
  315.     UINT32 GetPacketsSent() { return m_ulPacketsSent; }
  316.     INT64 GetBytesSent() { return m_lBytesSent; }
  317.     UINT32 GetTotalSuccessfulResends() { return m_ulTotalSuccessfulResends; }
  318.     UINT32 GetTotalFailedResends() { return m_ulTotalFailedResends; }
  319.     UINT32 GetSendingTime() { return m_ulSendingTime; }
  320.         
  321. protected:
  322.     IUnknown* m_pContext;
  323.     IHXCommonClassFactory*      m_pCommonClassFactory;
  324.     IHXScheduler*               m_pScheduler;
  325.     IHXRTSPTransportResponse*   m_pResp;
  326.     IHXRegistry* m_pRegistry;
  327.     IHXInternalReset* m_pInternalReset;
  328.     IHXSourceBufferingStats2*           m_pSrcBufferStats;
  329.     CHXString m_sessionID;
  330.     RTSPStreamHandler* m_pStreamHandler;
  331.     BOOL                 m_bIsSource;
  332.     UINT32 m_ulRegistryID;
  333.     UINT32 m_ulPacketsSent;
  334.     INT64 m_lBytesSent;
  335.     UINT32 m_ulStartTime;
  336.     UINT32 m_ulPlayRangeFrom;
  337.     UINT32 m_ulPlayRangeTo;
  338.     BOOL m_bIsInitialized;
  339.     BOOL m_bIsUpdated;
  340.     BOOL m_bPrefetch;
  341.     BOOL m_bFastStart;
  342.     BOOL m_bIsReceivedData;
  343.     BOOL m_bSourceDone;
  344.     UINT32 m_wrapSequenceNumber;
  345.     // actual multicast sender
  346.     BOOL m_bMulticast;    
  347.     
  348.     RawPacketFilter* m_pPacketFilter;
  349.     CHXSimpleList*  m_pClientPacketList;
  350.     BOOL                                m_bPlayRequestSent;
  351.     UINT32                              m_ulTotalSuccessfulResends; 
  352.     UINT32                              m_ulTotalFailedResends;
  353.     UINT32                              m_ulSendingTime;
  354.     BOOL m_drop_packets;
  355.     UINT32 m_packets_since_last_drop;    
  356.     BOOL                                m_bSkipTimeAdjustment;
  357. #ifdef RDT_MESSAGE_DEBUG
  358.     BOOL      m_bRDTMessageDebug;
  359.     CHXString m_RDTmessageDebugFileName;
  360.     void RDTmessageFormatDebugFileOut(const char* fmt, ...);
  361. #endif // RDT_MESSAGE_DEBUG
  362. };
  363. inline IHXUDPSocket*
  364. RTSPTransport::getUDPSocket()
  365. {
  366.     return 0;
  367. }
  368. inline IHXUDPSocket*
  369. RTSPTransport::getMulticastSocket()
  370. {
  371.     return 0;
  372. }
  373. inline BOOL
  374. RTSPTransport::IsInitialized()
  375. {
  376.     return m_bIsInitialized;
  377. }
  378. inline BOOL
  379. RTSPTransport::IsUpdated()
  380. {
  381.     return m_bIsUpdated;
  382. }
  383. inline UINT32
  384. RTSPTransport::wrapSequenceNumber()
  385. {
  386.     return m_wrapSequenceNumber;
  387. }
  388. #endif /* ndef _RTSPTRAN_H_ */