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

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. /****************************************************************************
  36.  *  Defines
  37.  */
  38. #define ACCEPTABLE_SYNC_NOISE 3
  39. #define STREAM_END_DELAY_RTP_TOLERANCE 500
  40. /****************************************************************************
  41.  *  Includes
  42.  */
  43. #include "hxtypes.h"
  44. #include "hxassert.h"
  45. #include "debug.h"
  46. #include "hxcom.h"
  47. #include "hxmarsh.h"
  48. #include "hxstrutl.h"
  49. #include "netbyte.h"
  50. #include "hxengin.h"
  51. #include "ihxpckts.h"
  52. #include "hxsbuffer.h"
  53. #include "hxcomm.h"
  54. #include "hxmon.h"
  55. #include "netbyte.h"
  56. #include "hxstring.h"
  57. #include "chxpckts.h"
  58. #include "hxslist.h"
  59. #include "hxmap.h"
  60. #include "hxdeque.h"
  61. #include "hxbitset.h"
  62. #include "timebuff.h"
  63. #include "timeval.h"
  64. #include "tconverter.h"
  65. #include "rtptypes.h"
  66. #include "hxqosinfo.h"
  67. #include "hxqossig.h"
  68. #include "hxqos.h"
  69. //#include "hxcorgui.h"
  70. #include "ntptime.h"
  71. #include "rtspif.h"
  72. #include "rtsptran.h"
  73. #include "rtptran.h"
  74. #include "rtpwrap.h" // Wrappers for PMC generated base classes
  75. #include "basepkt.h"
  76. #include "hxtbuf.h"
  77. #include "transbuf.h"
  78. #include "hxtick.h"
  79. #include "random32.h" // random32()
  80. #include "pkthndlr.h" // in rtpmisc for RTCP routine
  81. #include "rtcputil.h" // takes care of RTCP in RTP mode
  82. #include "rtspmsg.h"
  83. #include "hxprefs.h" // IHXPreferences
  84. #include "hxmime.h"
  85. #include "hxcore.h"
  86. #include "hxheap.h"
  87. #ifdef PAULM_IHXTCPSCAR
  88. #include "objdbg.h"
  89. #endif
  90. #ifdef _DEBUG
  91. #undef HX_THIS_FILE
  92. static const char HX_THIS_FILE[] = __FILE__;
  93. #endif
  94. #include "bufnum.h"
  95. #define MAX_STARTINFO_WAIT_TIME 20000 // in milliseconds
  96. #define MIN_NUM_PACKETS_SCANNED_FOR_LIVE_START    5
  97. #define MAX_NUM_PACKETS_GAPPED_FOR_LIVE_START   1
  98. static const UINT32 NORMAL_ACK_INTERVAL = 1000;        // 1/sec
  99. static const UINT32 MINIMUM_ACK_INTERVAL = 200;        // wait 200msecs
  100. static const UINT32 NORMAL_REPORT_INTERVAL = 5000; // 1 per 5secs
  101. static const UINT32 TRANSPORT_BUF_GROWTH_RATE  = 1000;
  102. static const UINT32 LATENCY_REPORT_INTERVAL_MS = 1000;
  103. static const UINT32 RTP_NAT_TIMEOUT = 15000; // Default timeout period
  104. static UINT32 GetNATTimeout(IUnknown* pContext)
  105. {
  106.     UINT32 ret = RTP_NAT_TIMEOUT;
  107.     IHXPreferences* pPrefs = NULL;
  108.     
  109.     if (pContext &&
  110. (HXR_OK == pContext->QueryInterface(IID_IHXPreferences, 
  111.     (void**)&pPrefs)))
  112.     {
  113. IHXBuffer* pPrefBuf = NULL;
  114. if ((HXR_OK == pPrefs->ReadPref("UDPNATTimeout", pPrefBuf)) &&
  115.     pPrefBuf)
  116. {
  117.     int tmp = atoi((const char*)pPrefBuf->GetBuffer());
  118.     if (tmp >= 0)
  119.     {
  120. ret = (UINT32)tmp;
  121.     }
  122.     HX_RELEASE(pPrefBuf);
  123. }
  124.         HX_RELEASE(pPrefs);
  125.     }
  126.     return ret;
  127. }
  128. /******************************************************************************
  129. *   RTP RTP RTP RTP RTP 
  130. ******************************************************************************/
  131. RTPBaseTransport::RTPBaseTransport(BOOL bIsSource)
  132.     : RTSPTransport(bIsSource)
  133.     , m_lRefCount(0)    
  134.     , m_pBwMgrInput(0)    
  135.     , m_pSyncServer(NULL)
  136.     , m_streamNumber(0)
  137.     , m_uFirstSeqNum(0)
  138.     , m_ulFirstRTPTS(0)
  139.     , m_bFirstSet(FALSE)
  140.     , m_bWeakStartSync(FALSE)
  141.     , m_lTimeOffsetHX(0)
  142.     , m_lTimeOffsetRTP(0)
  143.     , m_lOffsetToMasterHX(0)
  144.     , m_lOffsetToMasterRTP(0)
  145.     , m_lSyncOffsetHX(0)
  146.     , m_lSyncOffsetRTP(0)
  147.     , m_lNTPtoHXOffset(0)
  148.     , m_bNTPtoHXOffsetSet(FALSE)
  149.     , m_ulLastRTPTS(0)
  150.     , m_ulLastHXTS(0)
  151.     , m_ulLastRawRTPTS(0)
  152.     , m_bLastTSSet(FALSE)
  153.     , m_pRTCPTran(0)
  154.     , m_pReportHandler(0)
  155.     , m_ulBaseTS(0)
  156.     , m_bHasMarkerRule(FALSE)
  157.     , m_bHasRTCPRule(FALSE)
  158.     , m_ulPayloadWirePacket(0)
  159.     , m_bIsLive(FALSE)
  160.     , m_ulExtensionSupport(0)
  161.     , m_bSeqNoSet(FALSE)
  162.     , m_bRTPTimeSet(FALSE)
  163.     , m_bActive(TRUE)
  164.     , m_pFirstPlayTime(NULL)
  165.     , m_bWaitForStartInfo(TRUE)
  166.     , m_bAbortWaitForStartInfo(FALSE)
  167.     , m_bEmulatePVSession(FALSE)
  168.     , m_pMBitHandler(NULL)
  169.     , m_pQoSInfo(NULL)
  170.     , m_bSSRCDetermined(FALSE)
  171.     , m_ulSSRCDetermined(0)
  172.     , m_cLSRRead(0)
  173.     , m_cLSRWrite(0)
  174. #ifdef RTP_MESSAGE_DEBUG
  175.     , m_bMessageDebug(FALSE)
  176. #endif // RTP_MESSAGE_DEBUG
  177. {
  178.     m_wrapSequenceNumber = DEFAULT_WRAP_SEQ_NO;
  179. }
  180. RTPBaseTransport::~RTPBaseTransport()
  181. {
  182.     resetStartInfoWaitQueue();
  183. }
  184. STDMETHODIMP
  185. RTPBaseTransport::QueryInterface(REFIID riid, void** ppvObj)
  186. {
  187.     if (IsEqualIID(riid, IID_IUnknown))
  188.     {
  189.         AddRef();
  190.         *ppvObj = this;
  191.         return HXR_OK;
  192.     }
  193.     else if (IsEqualIID(riid, IID_IHXSourceBandwidthInfo))
  194.     {
  195.         AddRef();
  196.         *ppvObj = (IHXSourceBandwidthInfo*)this;
  197.         return HXR_OK;
  198.     }
  199.     *ppvObj = NULL;
  200.     return HXR_NOINTERFACE;
  201. }
  202. STDMETHODIMP_(UINT32)
  203. RTPBaseTransport::AddRef()
  204. {
  205.     return InterlockedIncrement(&m_lRefCount);
  206. }
  207. STDMETHODIMP_(UINT32)
  208. RTPBaseTransport::Release()
  209. {
  210.     if(InterlockedDecrement(&m_lRefCount) > 0)
  211.     {
  212. return m_lRefCount;
  213.     }
  214.     delete this;
  215.     return 0;
  216. }
  217. void
  218. RTPBaseTransport::Done()
  219. {
  220.     HX_RELEASE(m_pQoSInfo);
  221.     HX_RELEASE(m_pBwMgrInput);
  222.     HX_RELEASE(m_pRTCPTran);
  223.     HX_RELEASE(m_pPacketFilter);
  224.     HX_RELEASE(m_pSyncServer);
  225.     HX_DELETE(m_pFirstPlayTime);
  226. }
  227. HX_RESULT
  228. RTPBaseTransport::init()
  229. {
  230.     // m_pReportHandler will be freed in RTCPBaseTransport::Done()...
  231.     HX_ASSERT(!m_pReportHandler);
  232.     m_pReportHandler =   
  233. new ReportHandler(m_bIsSource, !m_bIsSource, random32(HX_GET_TICKCOUNT()));    
  234.     HX_ASSERT(m_pReportHandler);
  235.     if(!m_pReportHandler)
  236.     {
  237.         return HXR_OUTOFMEMORY;
  238.     }
  239.     
  240. #ifdef RTP_MESSAGE_DEBUG
  241.     IHXPreferences* pPreferences = NULL;
  242.     if (m_pContext &&
  243. (HXR_OK == m_pContext->QueryInterface(IID_IHXPreferences,
  244.      (void**) &pPreferences)))
  245.     {
  246. IHXBuffer* pBuffer = NULL;
  247. if (HXR_OK == pPreferences->ReadPref("RTPMessageDebug", pBuffer))
  248. {
  249.     m_bMessageDebug = atoi((const char*)pBuffer->GetBuffer()) ? TRUE : FALSE;
  250.     HX_RELEASE(pBuffer);
  251.     if (m_bMessageDebug)
  252.     {
  253. if (HXR_OK == pPreferences->ReadPref("RTPMessageDebugFile", pBuffer))
  254. {
  255.     if (pBuffer->GetSize() <= 0)
  256.     {
  257. // no file name, no log
  258. m_bMessageDebug = FALSE;
  259.     }
  260.     else
  261.     {
  262. m_messageDebugFileName = (const char*) pBuffer->GetBuffer();
  263.     }
  264. }
  265.                 HX_RELEASE(pBuffer);
  266.     }
  267. }
  268.     }
  269.     HX_RELEASE(pPreferences);
  270. #endif // RTP_MESSAGE_DEBUG
  271.     return HXR_OK;
  272. }
  273. void
  274. RTPBaseTransport::addStreamInfo(RTSPStreamInfo* pStreamInfo, UINT32 ulBufferDepth)
  275. {   
  276.     RTSPTransport::addStreamInfo(pStreamInfo, ulBufferDepth);
  277.     // there better be only one stream
  278.     m_streamNumber = pStreamInfo->m_streamNumber;
  279.     // if pStreamInfo->m_rtpPayloadType is -1, it hasn't been set
  280.     // by user, so just assign RTP_PAYLOAD_RTSP
  281.     if (pStreamInfo->m_rtpPayloadType < 0)
  282.     {
  283. m_rtpPayloadType = RTP_PAYLOAD_RTSP;
  284.     }
  285.     else
  286.     {
  287. m_rtpPayloadType = (UINT8)pStreamInfo->m_rtpPayloadType;
  288.     }
  289.     if (pStreamInfo)
  290.     {
  291. if (pStreamInfo->m_bHasMarkerRule)
  292. {
  293.     m_bHasMarkerRule = pStreamInfo->m_bHasMarkerRule;
  294.     m_markerRuleNumber = pStreamInfo->m_markerRule;
  295.     // better be odd.
  296.     HX_ASSERT(m_markerRuleNumber & 0x1);
  297. }
  298.      m_bIsLive = pStreamInfo->m_bIsLive;
  299.      m_ulExtensionSupport = pStreamInfo->m_bExtensionSupport;
  300.      m_bActive = pStreamInfo->m_bActive;
  301. m_bIsSyncMaster = pStreamInfo->m_bIsSyncMaster;
  302. // RTP transport always creates RTP packets on reception
  303. if (!m_bIsSource)
  304. {
  305.     RTSPStreamData* pStreamData = NULL;
  306.     pStreamData = m_pStreamHandler->getStreamData(pStreamInfo->m_streamNumber);
  307.     HX_ASSERT(pStreamData);
  308.     if (pStreamData)
  309.     {
  310. pStreamData->m_bUsesRTPPackets = TRUE;
  311.     }
  312.     if (pStreamData->m_pTSConverter)
  313.     {
  314. m_pRTCPTran->SetTSConverter(
  315.     pStreamData->m_pTSConverter->GetConversionFactors());
  316.     }
  317. }
  318.      /*
  319.       *  Reflection support
  320.       */
  321.      m_bHasRTCPRule = pStreamInfo->m_bHasRTCPRule;
  322.      if (m_bHasRTCPRule)
  323.      {
  324.          m_RTCPRuleNumber = pStreamInfo->m_RTCPRule;
  325.      }
  326. m_ulPayloadWirePacket = pStreamInfo->m_ulPayloadWirePacket;
  327. if (m_pRTCPTran)
  328. {
  329.     m_pRTCPTran->addStreamInfo(pStreamInfo, ulBufferDepth);
  330. }
  331.     }
  332. }
  333. /*
  334. *  We need to set an initial SeqNo & timestamp for RTP
  335. */
  336. HX_RESULT
  337. RTPBaseTransport::setFirstSeqNum(UINT16 uStreamNumber, UINT16 uSeqNum)
  338. {
  339.     HX_RESULT theErr = HXR_UNEXPECTED;
  340.     // On client we allow setting of sequence number only once not to cause
  341.     // havoc in transport buffer
  342.     if (m_bIsSource || (!m_bSeqNoSet))
  343.     {
  344. theErr = RTSPTransport::setFirstSeqNum(uStreamNumber, uSeqNum);
  345. #ifdef RTP_MESSAGE_DEBUG
  346. messageFormatDebugFileOut("INIT: StartSeqNum=%u", 
  347.   uSeqNum);
  348. #endif // RTP_MESSAGE_DEBUG
  349. if (SUCCEEDED(theErr))
  350. {
  351.     m_bSeqNoSet = TRUE;
  352. }
  353.     }
  354.     
  355.     return theErr;
  356. }
  357. void
  358. RTPBaseTransport::setFirstTimeStamp(UINT16 uStreamNumber, UINT32 ulTS, 
  359.                                     BOOL bIsRaw)
  360. {
  361.     RTSPStreamData* pStreamData = 
  362. m_pStreamHandler->getStreamData(uStreamNumber);
  363.     if (pStreamData)
  364.     {
  365. if (m_bIsSource)
  366. {     
  367.     /* ulFrom is what we want to put in RTP-Info: rtptimestamp */
  368.     if (pStreamData->m_pTSConverter && !bIsRaw)
  369.     {
  370. pStreamData->m_lastTimestamp = pStreamData->m_pTSConverter->hxa2rtp(ulTS);
  371.     }
  372.     else
  373.     {
  374. pStreamData->m_lastTimestamp = ulTS;
  375.     }
  376. }
  377. else if (!m_bRTPTimeSet)
  378. {
  379.     // ulTS is what's reported in rtptime of RTP-Info PLAY response 
  380.     // header in RTP time.  Unit is RTP.
  381.     /*
  382.      * HXTimeval = PktTime*Factor - (ulTS*Factor - m_ulPlayRangeFrom)
  383.      *  RTPTimeval = PktTime - (ulTS - m_ulPlayRangeFrom / Factor)
  384.      */     
  385.             if (m_ulPlayRangeFrom != RTSP_PLAY_RANGE_BLANK)
  386.             {
  387.         if (pStreamData->m_pTSConverter)
  388.         {
  389.     m_lTimeOffsetRTP = ulTS -
  390.        pStreamData->
  391.     m_pTSConverter->hxa2rtp_raw(m_ulPlayRangeFrom);
  392.     pStreamData->m_pTSConverter->setAnchor(m_ulPlayRangeFrom, ulTS);
  393.     m_lTimeOffsetHX = 0;
  394.         }
  395.         else
  396.         {
  397.     m_lTimeOffsetHX = m_lTimeOffsetRTP = ulTS - m_ulPlayRangeFrom;
  398.         }
  399.             }
  400.     if ((m_ulPlayRangeFrom != RTSP_PLAY_RANGE_BLANK) &&
  401. (m_ulPlayRangeTo != RTSP_PLAY_RANGE_BLANK))
  402.     {
  403. pStreamData->m_pTransportBuffer->InformTimestampRange(
  404.     m_ulPlayRangeFrom,
  405.     m_ulPlayRangeTo,
  406.     STREAM_END_DELAY_RTP_TOLERANCE);
  407.     }
  408. #ifdef RTP_MESSAGE_DEBUG
  409.     messageFormatDebugFileOut("INIT: RTPOffset=%u HXOffset=%u", 
  410.       m_lTimeOffsetRTP, 
  411.       m_lTimeOffsetHX);
  412. #endif // RTP_MESSAGE_DEBUG
  413.     // Reset the time stamp ordering
  414.     HX_DELETE(pStreamData->m_pTSOrderHack);
  415. }
  416. m_bRTPTimeSet = TRUE;
  417.     }
  418. }
  419. void
  420. RTPBaseTransport::notifyEmptyRTPInfo(void)
  421. {
  422.     // If RTP-Info is empty there is no point in waiting for out-of-band
  423.     // start info (start seq number and time stamp) since this is the
  424.     // only out-of-band method of communicating start info. in RTP.
  425.     m_bAbortWaitForStartInfo = TRUE;
  426. }
  427. void 
  428. RTPBaseTransport::setPlayRange(UINT32 ulFrom, UINT32 ulTo)
  429. {
  430.     // this is the Range values in PLAY request in RMA time (ms) called on PLAY 
  431.     // request
  432.     RTSPTransport::setPlayRange(ulFrom, ulTo);
  433.     
  434.     m_bSeqNoSet = FALSE;
  435.     m_bRTPTimeSet = FALSE;
  436.     m_bWaitForStartInfo = TRUE;
  437.     m_bAbortWaitForStartInfo = FALSE;
  438.     m_uFirstSeqNum = 0;
  439.     m_ulFirstRTPTS = 0;
  440.     m_bFirstSet = FALSE;
  441.     m_bWeakStartSync = FALSE;
  442.     m_lTimeOffsetHX = 0;
  443.     m_lTimeOffsetRTP = 0;
  444.     m_lOffsetToMasterHX = 0;
  445.     m_lOffsetToMasterRTP = 0;
  446.     m_lSyncOffsetHX = 0;
  447.     m_lSyncOffsetRTP = 0;
  448.     m_ulLastRTPTS = 0;
  449.     m_ulLastHXTS = 0;
  450.     m_ulLastRawRTPTS = 0;
  451.     m_bLastTSSet = FALSE;
  452.     m_lNTPtoHXOffset = 0;
  453.     m_bNTPtoHXOffsetSet = FALSE;
  454.     resetStartInfoWaitQueue();
  455. #ifdef RTP_MESSAGE_DEBUG
  456.     messageFormatDebugFileOut("INIT: PlayRange=%u-%u", 
  457.        ulFrom, ulTo);
  458. #endif // RTP_MESSAGE_DEBUG
  459. }
  460. HX_RESULT
  461. RTPBaseTransport::setFirstPlayTime(Timeval* pTv)
  462. {
  463.     if (!m_pFirstPlayTime)
  464.     {
  465. m_pFirstPlayTime = new Timeval();
  466.         if(!m_pFirstPlayTime)
  467.         {
  468.             return HXR_OUTOFMEMORY;
  469.         }
  470.     }
  471.     
  472.     m_pFirstPlayTime->tv_sec = pTv->tv_sec;
  473.     m_pFirstPlayTime->tv_usec = pTv->tv_usec;
  474.     return HXR_OK;
  475. }
  476. HX_RESULT
  477. RTPBaseTransport::reflectPacket(BasePacket* pBasePacket, REF(IHXBuffer*)pSendBuf)
  478. {
  479.     HX_ASSERT(pBasePacket);
  480.     HX_ASSERT(m_bHasRTCPRule);
  481.     HX_ASSERT(m_ulPayloadWirePacket==1);
  482.     
  483.     HX_RESULT theErr = HXR_OK;
  484.     
  485.     IHXPacket* pPacket = pBasePacket->GetPacket();
  486.     IHXBuffer* pBuffer = NULL;
  487.     UINT32 ulLen = 0;
  488.     
  489.     /*
  490.      * Sanity check 
  491.      */
  492.     if (!pPacket)
  493.     {
  494. return HXR_UNEXPECTED;
  495.     }
  496.     else if (pPacket->IsLost())
  497.     {
  498. pPacket->Release();
  499. return HXR_IGNORE;
  500.     }
  501.     else
  502.     {
  503. pBuffer = pPacket->GetBuffer();
  504. if (!pBuffer)
  505. {
  506.     pPacket->Release();
  507.     return HXR_UNEXPECTED;
  508. }    
  509.     }
  510.     ulLen = pBuffer->GetSize();
  511.     HX_ASSERT(pPacket->GetStreamNumber() == m_streamNumber);
  512.     HX_ASSERT(pPacket->GetASMFlags());
  513.     /*
  514.      * RTP packet
  515.      */    
  516.     UINT16 streamNumber = pPacket->GetStreamNumber();    
  517.     RTSPStreamData* pStreamData = 
  518. m_pStreamHandler->getStreamData(streamNumber);
  519.     if (isRTCPRule(pPacket->GetASMRuleNumber()))
  520.     {
  521. /*
  522.  *  RTCP packet
  523.  */
  524. if (!pStreamData->m_bFirstPacket)
  525. {
  526.     if (m_reflectorInfo.m_unSeqNoOffset  && m_reflectorInfo.m_ulRTPTSOffset)
  527.     {
  528. theErr = FixRTCPSR(m_pCommonClassFactory,
  529.    pBuffer, 
  530.            pSendBuf,
  531.            m_reflectorInfo.m_ulRTPTSOffset);
  532.     }
  533.     else
  534.     {
  535. theErr = HXR_OK;
  536. pSendBuf = pBuffer;
  537. pSendBuf->AddRef();
  538.     }
  539. }
  540. else
  541. {
  542.     theErr = HXR_IGNORE;
  543. }
  544. BYTE* pReport = pBuffer->GetBuffer();
  545. if ((pReport) && ((*(++pReport)) == 200))
  546. {
  547.     pReport += 7;
  548.     UINT32 ulSourceSec = GetDwordFromBufAndInc(pReport);
  549.     UINT32 ulSourceFract = GetDwordFromBufAndInc(pReport);
  550.     
  551.     HXTimeval rmatv = m_pScheduler->GetCurrentSchedulerTime();
  552.     Timeval tvNow((INT32) rmatv.tv_sec, (INT32)rmatv.tv_usec);
  553.     NTPTime ntpNow(tvNow);
  554.     
  555.     m_LSRHistory [m_cLSRWrite].m_ulSourceLSR = ulSourceSec  << 16;
  556.     m_LSRHistory [m_cLSRWrite].m_ulSourceLSR |= (ulSourceFract >> 16); 
  557.     m_LSRHistory [m_cLSRWrite].m_ulServerLSR = ntpNow.m_ulSecond  << 16;
  558.     m_LSRHistory [m_cLSRWrite].m_ulServerLSR |= (ntpNow.m_ulFraction >> 16); 
  559.     (++m_cLSRWrite) %= LSR_HIST_SZ;
  560. }
  561. if (HXR_OK == theErr)
  562. {
  563.     theErr = m_pRTCPTran->reflectRTCP(pSendBuf);
  564.     HX_RELEASE(pSendBuf);
  565. }
  566. pPacket->Release();
  567. pBuffer->Release();
  568. if (HXR_OK == theErr)
  569. {
  570.     return HXR_IGNORE;
  571. }
  572. else
  573. {
  574.     return theErr;
  575. }     
  576.     }
  577.     if (!pStreamData->m_packetSent)
  578.     {
  579. pStreamData->m_packetSent = TRUE;
  580.     }
  581.     
  582.     if (pStreamData->m_bFirstPacket)
  583.     {
  584. pStreamData->m_bFirstPacket = FALSE;
  585. BYTE* pcOrig = pBuffer->GetBuffer();
  586. UINT16 unFirstSeqNo = 0;
  587. UINT32 ulFirstRTPTS = 0;
  588. pcOrig += 2;
  589. unFirstSeqNo = *pcOrig++<<8; 
  590. unFirstSeqNo |= *pcOrig++;
  591.         ulFirstRTPTS = GetDwordFromBufAndInc(pcOrig);
  592. if (m_pReportHandler)
  593. {
  594.     m_pReportHandler->SetSSRC(GetDwordFromBufAndInc(pcOrig));
  595. }
  596.         // get an offset for reflector
  597. UINT16 nA = m_reflectorInfo.m_unSeqNoOffset ;
  598. UINT16 nB = unFirstSeqNo;
  599. UINT32 lA = m_reflectorInfo.m_ulRTPTSOffset;
  600. UINT32 lB = ulFirstRTPTS;
  601. m_reflectorInfo.m_unSeqNoOffset = 0 - unFirstSeqNo;
  602. m_reflectorInfo.m_ulRTPTSOffset = 0 - ulFirstRTPTS;
  603.     }
  604.     if (m_reflectorInfo.m_unSeqNoOffset  && m_reflectorInfo.m_ulRTPTSOffset)
  605.     {
  606.      theErr = FixRTPHeader(m_pCommonClassFactory,
  607.       pBuffer, 
  608.             pSendBuf,
  609.             m_reflectorInfo.m_unSeqNoOffset ,
  610.                  m_reflectorInfo.m_ulRTPTSOffset);
  611.     }
  612.     else
  613.     {
  614. theErr = HXR_OK;
  615. pSendBuf = pBuffer;
  616. pSendBuf->AddRef();
  617.     }
  618.     // forever increasing
  619.     pStreamData->m_seqNo = pBasePacket->m_uSequenceNumber;
  620.     pStreamData->m_lastTimestamp = pPacket->GetTime();
  621.     HX_ASSERT(pBuffer);
  622.     BYTE* pRawPkt = (BYTE*)pBuffer->GetBuffer();
  623.     UINT32 ulPayloadLen = ulLen;
  624.     UINT32 ulRTPHeaderSize = 0;
  625.     UINT8 uiCSRCCount = (UINT32)(pRawPkt[0] & 0x0F);
  626. // We only want to count the payload, not the RTP headers.
  627.     ulRTPHeaderSize += (4 * 3); // RTP fixed header size, not including CSRCs.
  628.     ulRTPHeaderSize += 4 * uiCSRCCount; // CSRCs. 
  629. // Extension header present.
  630.     if (pRawPkt[0] & 0x20)
  631.     {
  632.         HX_ASSERT(ulPayloadLen - ulRTPHeaderSize > 0);
  633.         ulRTPHeaderSize += 2; // 16-bit profile-defined field
  634.     // Overrun prevention.
  635.         if (pBuffer->GetSize() > ulRTPHeaderSize + 1)
  636.         {
  637.             // Extension length is last 16 bits of first word.
  638.             UINT32 ulExtensionLength = (pRawPkt[ulRTPHeaderSize] << 8) + pRawPkt[ulRTPHeaderSize + 1];
  639.             ulRTPHeaderSize += 2; // 16-bit length field.
  640.             ulRTPHeaderSize += (ulExtensionLength * 4); // Rest of extension header.
  641.         }
  642.     }
  643.     
  644.     ulPayloadLen -= ulRTPHeaderSize;
  645.     updateQoSInfo(ulPayloadLen);
  646.     /*
  647.      * clean up
  648.      */
  649.     pPacket->Release();
  650.     pBuffer->Release();
  651.     return theErr;
  652. }
  653. void
  654. RTPBaseTransport::updateQoSInfo(UINT32 ulBytesSent)
  655. {
  656.     m_ulPacketsSent++;    
  657.     m_lBytesSent += ulBytesSent;
  658.     if (!m_pQoSInfo)
  659.     {
  660.         return;
  661.     }
  662.     UINT64 ulSessionBytesSent = m_pQoSInfo->GetBytesSent();
  663.     ulSessionBytesSent += ulBytesSent;
  664.     m_pQoSInfo->SetBytesSent(ulSessionBytesSent);
  665.     UINT32 ulSessionPacketsSent = m_pQoSInfo->GetPacketsSent();
  666.     ulSessionPacketsSent++;
  667.     m_pQoSInfo->SetPacketsSent(ulSessionPacketsSent);
  668. }
  669. UINT32
  670. RTPBaseTransport::MapLSR(UINT32 ulSourceLSR)
  671. {
  672.     if (m_ulPayloadWirePacket == 0)
  673.     {
  674. return ulSourceLSR;
  675.     }
  676.     UINT8  cSearchCursor = m_cLSRRead;
  677.     while (cSearchCursor != m_cLSRWrite)
  678.     {
  679. if (m_LSRHistory [cSearchCursor].m_ulSourceLSR == ulSourceLSR)
  680. {
  681.     m_cLSRRead = cSearchCursor;
  682.     return m_LSRHistory [cSearchCursor].m_ulServerLSR;
  683. }
  684. (++cSearchCursor) %= LSR_HIST_SZ;
  685.     }
  686.     return 0;
  687. }
  688. HX_RESULT
  689. FixRTPHeader(IHXCommonClassFactory* pCCF, 
  690.      IHXBuffer* pOrigBuf, 
  691.      REF(IHXBuffer*) pNewBuf, 
  692.      UINT16 unSeqNoOffset, 
  693.      UINT32 ulRTPTSOffset)
  694. {      
  695.     if (pOrigBuf->GetSize() < 8)
  696.     {
  697. return HXR_INVALID_PARAMETER;
  698.     }
  699.     
  700.     HX_RESULT theErr = pCCF->CreateInstance(IID_IHXBuffer, (void**) &pNewBuf);
  701.     if (HXR_OK == theErr)
  702.     {
  703. theErr = pNewBuf->Set(pOrigBuf->GetBuffer(), pOrigBuf->GetSize());
  704.     }
  705.     if (HXR_OK == theErr)
  706.     {
  707. BYTE* pcOrig = pOrigBuf->GetBuffer();
  708. UINT16 unSeqNo = 0;
  709. UINT32 ulRTPTS = 0;
  710. pcOrig += 2;
  711. unSeqNo = *pcOrig++<<8; 
  712. unSeqNo |= *pcOrig++;
  713. ulRTPTS = GetDwordFromBufAndInc(pcOrig);
  714.         
  715.         UINT16 nA = unSeqNo;
  716. UINT32 lA = ulRTPTS;
  717. // update
  718. unSeqNo += unSeqNoOffset;
  719. ulRTPTS += ulRTPTSOffset;
  720. BYTE* pc = pNewBuf->GetBuffer();
  721. pc += 2;
  722. *pc++ = (UINT8)(unSeqNo>>8); 
  723. *pc++ = (UINT8)(unSeqNo);
  724. *pc++ = (UINT8)(ulRTPTS>>24); 
  725. *pc++ = (UINT8)(ulRTPTS>>16); 
  726. *pc++ = (UINT8)(ulRTPTS>>8); 
  727. *pc++ = (UINT8)(ulRTPTS);
  728.     }
  729.     return theErr;
  730. }
  731. HX_RESULT
  732. FixRTCPSR(IHXCommonClassFactory* pCCF, 
  733.   IHXBuffer* pOrigBuf, 
  734.   REF(IHXBuffer*) pNewBuf, 
  735.   UINT32 ulRTPTSOffset)
  736. {
  737.     BYTE* pcOrig = pOrigBuf->GetBuffer();
  738.     if (pOrigBuf->GetSize() < 20)
  739.     {
  740. return HXR_INVALID_PARAMETER;
  741.     } 
  742.     else
  743.     {
  744. // make sure it's SR
  745. if (RTCP_SR != *(pcOrig+1))
  746. {
  747.     return HXR_IGNORE;
  748. }
  749.     }
  750.     
  751.     HX_RESULT theErr = pCCF->CreateInstance(IID_IHXBuffer, (void**) &pNewBuf);
  752.     if (HXR_OK == theErr)
  753.     {
  754. theErr = pNewBuf->Set(pOrigBuf->GetBuffer(), pOrigBuf->GetSize());
  755.     }
  756.     if (HXR_OK == theErr)
  757.     {
  758. UINT32 ulRTPTS = 0;
  759. pcOrig += 16;     
  760.         ulRTPTS = GetDwordFromBufAndInc(pcOrig);
  761.         UINT32 lA = ulRTPTS;
  762. // update
  763. ulRTPTS += ulRTPTSOffset;
  764.  
  765. BYTE* pc = pNewBuf->GetBuffer();
  766. pc += 16;
  767. //RTP Timestamp
  768. *pc++ = (UINT8)(ulRTPTS>>24); 
  769. *pc++ = (UINT8)(ulRTPTS>>16); 
  770. *pc++ = (UINT8)(ulRTPTS>>8); 
  771. *pc++ = (UINT8)(ulRTPTS);
  772.     }
  773.     return theErr;    
  774. }
  775. void
  776. RTPBaseTransport::SyncTimestamp(IHXPacket* pPacket)
  777. {
  778.     IHXTimeStampSync* pTSSync = NULL;
  779.     if (FAILED(
  780. m_pResp->QueryInterface(IID_IHXTimeStampSync, (void**)&pTSSync)))
  781.     {
  782. // this shouldn't happen...
  783. HX_ASSERT(!"IHXTimeStampSync not implemented");
  784. return;
  785.     }
  786.     UINT32 ulInitialRefTime = 0;
  787.     UINT32 ulInitialThisTime = pPacket->GetTime();
  788.     if (pTSSync->NeedInitialTS(m_sessionID))
  789.     {
  790. pTSSync->SetInitialTS(m_sessionID, pPacket->GetTime());
  791. ulInitialRefTime = ulInitialThisTime;
  792.     }
  793.     else
  794.     {
  795. ulInitialRefTime = pTSSync->GetInitialTS(m_sessionID);
  796.     }
  797.     HX_RELEASE(pTSSync);
  798.     
  799.     RTSPStreamData* pStreamData = 
  800. m_pStreamHandler->getStreamData(pPacket->GetStreamNumber());
  801.     HX_ASSERT(pStreamData != NULL);
  802.     if (pStreamData)
  803.     {
  804. // calc the difference b/n reference stream
  805. if (ulInitialThisTime >= ulInitialRefTime)
  806. {
  807.     // we want RTP time
  808.     if (pStreamData->m_pTSConverter)
  809.     {
  810. m_lTimeOffsetRTP = 
  811.     pStreamData->m_pTSConverter->hxa2rtp(ulInitialThisTime - ulInitialRefTime);
  812.     }
  813.     else
  814.     {
  815. m_lTimeOffsetRTP = ulInitialThisTime - ulInitialRefTime;
  816.     }     
  817. }
  818. else
  819. {
  820.     // we want RTP time
  821.     if (pStreamData->m_pTSConverter)
  822.     {
  823. m_lTimeOffsetRTP = 
  824.     pStreamData->m_pTSConverter->hxa2rtp(ulInitialRefTime - ulInitialThisTime);
  825.     }
  826.     else
  827.     {
  828. m_lTimeOffsetRTP = ulInitialRefTime - ulInitialThisTime;
  829.     }     
  830.     
  831.     m_lTimeOffsetRTP *= -1;
  832. }
  833.     }
  834. }
  835. // The pPacketBuf is returned with an AddRef(), as it must.
  836. HX_RESULT
  837. RTPBaseTransport::makePacket(BasePacket* pBasePacket, 
  838.     REF(IHXBuffer*) pPacketBuf)
  839. {
  840.     if(!m_bIsSource)
  841.     {
  842. HX_ASSERT(!"Player shouldn't be making pkt");
  843. return HXR_UNEXPECTED;
  844.     }
  845.     IHXPacket* pPacket = pBasePacket->GetPacket();
  846.     if (!pPacket)
  847.     {
  848. return HXR_UNEXPECTED;
  849.     }
  850.     else if (pPacket->IsLost())
  851.     {
  852. pPacket->Release();
  853. return HXR_OK;
  854.     }
  855.  
  856.     IHXBuffer* pBuffer = pPacket->GetBuffer();
  857.     UINT32 bufLen = pBuffer->GetSize();
  858.     UINT16 streamNumber = pPacket->GetStreamNumber();
  859.     UINT16 ruleNumber = pPacket->GetASMRuleNumber();
  860.     UINT8  ruleFlags = pPacket->GetASMFlags();
  861.     // it better be the same
  862.     HX_ASSERT(m_streamNumber == streamNumber);
  863.     RTSPStreamData* pStreamData = 
  864. m_pStreamHandler->getStreamData(streamNumber);
  865.     //XXXBAB
  866.     if (!pStreamData->m_packetSent)
  867.     {
  868. pStreamData->m_packetSent = TRUE;
  869.     }
  870.     
  871.     pStreamData->m_seqNo = pBasePacket->m_uSequenceNumber;
  872.     /*
  873.      * Make RTP Packet
  874.      */
  875.     RTPPacket pkt;
  876.     HX_RESULT hresult = HXR_OK;
  877.     BOOL bCompressed = FALSE; //XXXBAB don't compress anything yet...
  878.     UINT32 packetLen = 0;
  879.     pkt.version_flag = 2;
  880.     pkt.padding_flag = 0;
  881.     pkt.csrc_len = 0;
  882.     /*
  883.      * Basics
  884.      */
  885.     pkt.seq_no = pStreamData->m_seqNo;
  886.     pkt.data.data = (INT8*)pBuffer->GetBuffer();
  887.     pkt.data.len = HX_SAFEINT(pBuffer->GetSize());
  888.     pkt.ssrc = m_pReportHandler->GetSSRC();
  889.     pkt.extension_flag = 0;
  890.     pkt.payload = m_rtpPayloadType;
  891.     /*
  892.      * IHXRTPPacket support
  893.      */
  894.     if (pStreamData->m_bFirstPacket)
  895.     {
  896. // figure out pkt type
  897. IHXRTPPacket* pRTPPacket = NULL;
  898. pStreamData->m_bUsesRTPPackets = (pPacket->QueryInterface(
  899.     IID_IHXRTPPacket, 
  900.     (void**) &pRTPPacket)
  901.   == HXR_OK);
  902. if (pStreamData->m_bUsesRTPPackets)
  903. {
  904.     HX_ASSERT(pRTPPacket == pPacket);
  905.     if (pRTPPacket != pPacket)
  906.     {
  907. return HXR_INVALID_PARAMETER;
  908.     }
  909. }
  910. HX_RELEASE(pRTPPacket);
  911. // figure out marker bit handling routine
  912. if (NULL == m_pMBitHandler)
  913. {
  914.     IHXRTPPacketInfo* pRTPPacketInfo = NULL;
  915.     if (pPacket->QueryInterface(IID_IHXRTPPacketInfo, (void**) &pRTPPacketInfo) == HXR_OK)
  916.     {
  917.      m_pMBitHandler = &RTPBaseTransport::MBitRTPPktInfo;
  918.      pRTPPacketInfo->Release();
  919.     }
  920.     else
  921.     {
  922.      m_pMBitHandler = &RTPBaseTransport::MBitASMRuleNo;
  923.     }
  924.      }
  925.     }
  926.     /* 
  927.      * Marker Bit
  928.      */
  929.     (this->*m_pMBitHandler)(pkt.marker_flag, pPacket, ruleNumber);
  930.     if (m_bRTPTimeSet)
  931.     {
  932. SyncTimestamp(pPacket);
  933.     }     
  934.     /*
  935.      * Timestamp
  936.      */
  937.     if (pStreamData->m_bUsesRTPPackets)
  938.     {
  939. pkt.timestamp = ((IHXRTPPacket*) pPacket)->GetRTPTime();
  940.     }
  941.     else if (pStreamData->m_pTSConverter)
  942.     {
  943. pkt.timestamp = 
  944.     pStreamData->m_pTSConverter->hxa2rtp(pPacket->GetTime());
  945.     }
  946.     else
  947.     {
  948. pkt.timestamp = pPacket->GetTime();
  949.     }
  950.     /*
  951.      * Extension and asm rule
  952.      */
  953.     if (RTP_OP_ASMRULES == m_ulExtensionSupport)
  954.     {
  955. // this is the only one right now.
  956. pkt.extension_flag = 1;
  957. pkt.op_code = RTP_OP_ASMRULES;
  958. pkt.op_code_data_length = 1;
  959. pkt.asm_flags = ruleFlags;
  960. pkt.asm_rule = ruleNumber;
  961.     }
  962.     else
  963.     {
  964. pkt.extension_flag = 0;
  965.     }
  966.     if (pStreamData->m_bFirstPacket)
  967.     {
  968. m_pRTCPTran->startScheduler();
  969. m_pRTCPTran->m_bSendBye = TRUE;
  970. pStreamData->m_bFirstPacket = FALSE;
  971. // init report handler with starting NTP time and
  972. // 0 RTP time as the reference point.
  973. m_pReportHandler->Init(*m_pFirstPlayTime, 
  974.        0, 
  975.        pStreamData->m_pTSConverter);
  976. // at this point, it should have the same stream number
  977. HX_ASSERT(m_streamNumber == m_pRTCPTran->m_streamNumber);
  978. HX_ASSERT(m_bRTPTimeSet);
  979.     }
  980.     // externally, we need to offset the timestamp...
  981.     // 
  982.     // XXXGo 
  983.     // In RTSP PLAY Response msg, there is a RTP-Info header in which there 
  984.     // is a rtp timestap that corresponds to NTP time spesified in PLAY Request.  
  985.     // Since PLAY Response goes out before we ever receive the first pkt, it 
  986.     // always returns RTP time equivalent of NTP time in a Range header as a timestamp. 
  987.     // So, we need to offset the timestamp here.  
  988.     // In future, we might want to change the calling sequence so we don't have to do this...    
  989.     if (m_bRTPTimeSet)
  990.     {
  991.         INT64 nNewRTPOffset = 0;
  992.         UINT32 ulRawRTPTime = 0;
  993.         HXTimeval hxNow = m_pScheduler->GetCurrentSchedulerTime();
  994.         Timeval tvNow;
  995. NTPTime ntpNow;
  996. // Convert scheduler time to something we can use.
  997.         tvNow.tv_sec = hxNow.tv_sec;
  998.         tvNow.tv_usec = hxNow.tv_usec;
  999.         ntpNow = NTPTime(tvNow);
  1000.         if (pStreamData->m_pTSConverter)
  1001.         {
  1002.             ulRawRTPTime = pStreamData->m_pTSConverter->hxa2rtp((UINT32)(ntpNow - m_pReportHandler->GetNTPBase()));
  1003.         }
  1004.         else
  1005.         {
  1006.             ulRawRTPTime = (UINT32)(ntpNow - m_pReportHandler->GetNTPBase());
  1007.         }
  1008. nNewRTPOffset = CAST_TO_INT64 pkt.timestamp - CAST_TO_INT64 ulRawRTPTime;
  1009.         m_pReportHandler->SetRTPBase(nNewRTPOffset);
  1010. // if this is true, there was a Range header in a PLAY request
  1011. m_bRTPTimeSet = FALSE;
  1012. if (m_bIsLive)
  1013. {
  1014.     m_ulBaseTS = pkt.timestamp - m_lTimeOffsetRTP;
  1015. }
  1016.     }
  1017.     if (m_bIsLive)
  1018.     {
  1019.      pkt.timestamp -= m_ulBaseTS;
  1020.     }
  1021.     pStreamData->m_lastTimestamp = pkt.timestamp;
  1022.     /*
  1023.      * Create enough space to account for the op code and
  1024.      * op code data if the extension bit is set
  1025.      */
  1026.     packetLen = pkt.static_size() + pBuffer->GetSize() + 
  1027. (pkt.extension_flag 
  1028. ? sizeof(UINT16) + (pkt.op_code_data_length * sizeof(UINT32))
  1029. : 0);
  1030.     IHXBuffer* pPacketOut = NULL;
  1031.     m_pCommonClassFactory->CreateInstance(IID_IHXBuffer, 
  1032.                                           (void**)&pPacketOut);
  1033.     if(pPacketOut)
  1034.     {
  1035.         pPacketOut->SetSize(packetLen);
  1036.         pkt.pack(pPacketOut->GetBuffer(), packetLen);
  1037.         pPacketOut->SetSize(packetLen);  //update with actual packed length
  1038. #ifdef DEBUG
  1039.         if (m_drop_packets && ++m_packets_since_last_drop % 10 == 0)
  1040.         {
  1041.     goto RTPsendContinue;
  1042.         }
  1043. #endif /* DEBUG */
  1044.         updateQoSInfo(bufLen);
  1045.         // out params...
  1046.         pPacketBuf = pPacketOut;
  1047.         /* update */
  1048.         m_pReportHandler->OnRTPSend(pkt.seq_no, 1, pBasePacket->GetSize(), pkt.timestamp);    
  1049.     }
  1050.     else
  1051.     {
  1052.         hresult = HXR_OUTOFMEMORY;
  1053.     }
  1054. #ifdef DEBUG
  1055. RTPsendContinue:
  1056. #endif    
  1057.     pBuffer->Release();
  1058.     pPacket->Release();
  1059.     return hresult;
  1060. }
  1061. HX_RESULT
  1062. RTPBaseTransport::handlePacket(IHXBuffer* pBuffer)
  1063. {
  1064.     if (!m_ulPacketsSent && m_bEmulatePVSession)
  1065.     {
  1066.         /* XXXMC 
  1067.          * Special-case handling for PV clients
  1068.          */
  1069.         UINT8* pUDPPktPayload = pBuffer->GetBuffer();
  1070.         UINT8 ucRTPVersion  = (*pUDPPktPayload & 0xc0)>>6;
  1071.         if(ucRTPVersion != 2)
  1072.         {
  1073.             DPRINTF(D_INFO, ("RTP: PV CLIENT PKT RECVDn"));
  1074.             this->sendPVHandshakeResponse(pUDPPktPayload);
  1075.             return HXR_OK;
  1076.         }
  1077.     }
  1078.     return _handlePacket(pBuffer, TRUE);
  1079. }
  1080. HX_RESULT
  1081. RTPBaseTransport::_handlePacket(IHXBuffer* pBuffer, BOOL bIsRealTime)
  1082. {
  1083.     RTPPacket pkt;
  1084.     UINT32 timeStampHX = 0;
  1085.     UINT32 timeStampRTP = 0;
  1086.     HX_RESULT hresult = HXR_OK;
  1087.     BOOL bHasASMRules = FALSE;
  1088.     if (m_bIsSource)
  1089.     {
  1090. return HXR_OK;
  1091.     }
  1092.     if(pkt.unpack(pBuffer->GetBuffer(), pBuffer->GetSize()) == 0)
  1093.     {
  1094. return HXR_UNEXPECTED;
  1095.     }
  1096.     
  1097.     if(pkt.version_flag != 2)
  1098.     {
  1099. return HXR_INVALID_VERSION;
  1100.     }
  1101.     // ignore the packets not matching the payload type
  1102.     if (pkt.payload != m_rtpPayloadType)
  1103.     {
  1104.         return HXR_OK;
  1105.     }
  1106.     // stick with the 1st ssrc with the same payload type
  1107.     if (!m_bSSRCDetermined)
  1108.     {
  1109.         m_bSSRCDetermined = TRUE;
  1110.         m_ulSSRCDetermined = pkt.ssrc;
  1111.         m_pRTCPTran->setSSRC(m_ulSSRCDetermined);
  1112.     }
  1113.     // ignore the packets with different ssrc but with the same payload time
  1114.     else if (m_ulSSRCDetermined != pkt.ssrc)
  1115.     {
  1116.         return HXR_OK;
  1117.     }
  1118.     RTSPStreamData* pStreamData = m_pStreamHandler->getStreamData(m_streamNumber);
  1119.     HX_ASSERT(pStreamData != NULL);
  1120.     // If this function is called in Real-Time, handle RTCP response as needed
  1121.     if (bIsRealTime)
  1122.     {
  1123. HXTimeval rmatv = m_pScheduler->GetCurrentSchedulerTime();
  1124. ULONG32 ulPktRcvTime = rmatv.tv_sec*1000 + rmatv.tv_usec/1000;
  1125. // Convert reception time to the packet time stamp units
  1126. if (m_pRTCPTran->GetTSConverter())
  1127. {
  1128.     ulPktRcvTime = m_pRTCPTran->GetTSConverter()->hxa2rtp(ulPktRcvTime);
  1129. }
  1130. // Gather data for RTCP RR
  1131. if (pStreamData->m_bFirstPacket)
  1132. {
  1133.     if (!m_pRTCPTran->isShedulerStarted())
  1134.     {
  1135. m_pRTCPTran->startScheduler();
  1136.     }
  1137. }
  1138. /* update */
  1139. m_pReportHandler->OnRTPReceive(pkt.ssrc, 
  1140.        pkt.seq_no,
  1141.        pkt.timestamp, 
  1142.        ulPktRcvTime);
  1143. /* send RR if necessary */
  1144. if (m_pRTCPTran->m_bSendReport && m_pRTCPTran->m_bSendRTCP)
  1145. {
  1146.     m_pRTCPTran->sendReceiverReport();
  1147.     m_pRTCPTran->m_bSendReport = FALSE;
  1148.     m_pRTCPTran->scheduleNextReport();
  1149. }
  1150.     }
  1151.     // If we are waiting for the start info, we cannot place the
  1152.     // packets into the transport buffer yet since we need the
  1153.     // start info to proper scale and offset the packet time
  1154.     // stamps
  1155.     if (m_bWaitForStartInfo)
  1156.     {
  1157. if (m_StartInfoWaitQueue.GetCount() == 0)
  1158. {
  1159.     // First packet received
  1160.     m_ulStartInfoWaitStartTime = HX_GET_TICKCOUNT();
  1161.     m_uFirstSeqNum = pkt.seq_no;
  1162.     m_ulFirstRTPTS = pkt.timestamp;
  1163.     // For Live stream, postpone identification of first packet until we get
  1164.     // a contiguous sequence (some servers have discontinuity on start 
  1165.     // of live streams)
  1166.     if (!m_bIsLive)
  1167.     {
  1168. m_bFirstSet = TRUE;
  1169.     }
  1170. }
  1171. else
  1172. {
  1173.     LONG32 lSeqNumDelta = ((LONG32) (((UINT16) pkt.seq_no) - m_uFirstSeqNum));
  1174.     // First SeqNum and First TS need not belong to the same packet
  1175.     // We are really looking for the lowest seq. num and lowest time
  1176.     // stamp so that we do not throw away any packets and so that the
  1177.     // time is not wrapped before 0
  1178.     if (lSeqNumDelta < 0)
  1179.     {
  1180. m_uFirstSeqNum = pkt.seq_no;
  1181.     }
  1182.     else if (!m_bFirstSet)
  1183.     {
  1184. // If we have not encountered continuty yet, look for it
  1185. if (lSeqNumDelta > MAX_NUM_PACKETS_GAPPED_FOR_LIVE_START)
  1186. {
  1187.     resetStartInfoWaitQueue();
  1188.     m_uFirstSeqNum = pkt.seq_no;
  1189.     m_ulFirstRTPTS = pkt.timestamp;
  1190. }
  1191. else
  1192. {
  1193.     // Continuity found - we have the start
  1194.     m_bFirstSet = TRUE;
  1195. }
  1196.     }
  1197.     if (((LONG32) (m_ulFirstRTPTS - pkt.timestamp)) > 0)
  1198.     {
  1199. m_ulFirstRTPTS = pkt.timestamp;
  1200.     }
  1201. }
  1202. pBuffer->AddRef();
  1203. m_StartInfoWaitQueue.AddTail(pBuffer);
  1204. /* If start Info has been at least partially set or the wait has been
  1205.    aborted for some reason (usually when we know it will not be set 
  1206.    through out-of band methods <-> RTP Info did not contain start Info
  1207.    we need) or we time-out, stop waiting and hand off acumulated 
  1208.            packets to the transport buffer.
  1209.    Also if starting seq. number is not explicitly communicated,
  1210.    scan through few starting packets until we have a good starting 
  1211.    sequence number (contiguous) since some servers send lossy streams 
  1212.    in the beginning. */
  1213.   if (m_bSeqNoSet || 
  1214.     ((m_bRTPTimeSet || m_bAbortWaitForStartInfo) && 
  1215.      ((!m_bIsLive) || (m_StartInfoWaitQueue.GetCount() >= MIN_NUM_PACKETS_SCANNED_FOR_LIVE_START))) ||
  1216.       ((HX_GET_TICKCOUNT() - m_ulStartInfoWaitStartTime) > 
  1217.        MAX_STARTINFO_WAIT_TIME))
  1218. {
  1219.     IHXBuffer* pStoredBuffer;
  1220.     m_bWaitForStartInfo = FALSE;
  1221.     m_bAbortWaitForStartInfo = FALSE;
  1222.     m_bFirstSet = TRUE;
  1223.     while (!m_StartInfoWaitQueue.IsEmpty())
  1224.     {
  1225. pStoredBuffer = (IHXBuffer*) m_StartInfoWaitQueue.RemoveHead();
  1226. if (pStoredBuffer)
  1227. {
  1228.     _handlePacket(pStoredBuffer, FALSE);
  1229.     pStoredBuffer->Release();
  1230. }
  1231.     }
  1232. }
  1233. return HXR_OK;
  1234.     }
  1235.     /*
  1236.      * Extension and asm rule
  1237.      */
  1238.     if (pkt.extension_flag == 1)
  1239.     {
  1240. HX_ASSERT(RTP_OP_PACKETFLAGS != pkt.op_code);
  1241. if (RTP_OP_ASMRULES == pkt.op_code)
  1242. {
  1243.     bHasASMRules = TRUE;
  1244. }
  1245.     }
  1246.     /*
  1247.      * RTP-Info:  if either one of them were not in RTP-Info, we need to set 
  1248.      * it right here.
  1249.      */
  1250.     if (!m_bSeqNoSet)
  1251.     {
  1252. if (!m_bFirstSet)
  1253. {
  1254.     m_uFirstSeqNum = pkt.seq_no;
  1255. }
  1256. #ifdef RTP_MESSAGE_DEBUG
  1257. messageFormatDebugFileOut("INIT: StartSeqNum not in RTP-Info");
  1258. #endif // RTP_MESSAGE_DEBUG
  1259. setFirstSeqNum(m_streamNumber, m_uFirstSeqNum);
  1260.     }     
  1261.     if (!m_bRTPTimeSet)
  1262.     {
  1263. if (!m_bFirstSet)
  1264. {
  1265.     m_ulFirstRTPTS = pkt.timestamp;
  1266. }
  1267. #ifdef RTP_MESSAGE_DEBUG
  1268. messageFormatDebugFileOut("INIT: RTPOffset not in RTP-Info");
  1269. #endif // RTP_MESSAGE_DEBUG
  1270. setFirstTimeStamp(m_streamNumber, m_ulFirstRTPTS);
  1271. m_bWeakStartSync = TRUE;
  1272.     }
  1273.     
  1274.     /*
  1275.      * TimeStamp
  1276.      */    
  1277.     // for RealMedia in scalable multicast, we don't want to adjust
  1278.     // the timestamp since the packets' time is in ms already and 
  1279.     // A/V is always in sync
  1280.     if (m_bSkipTimeAdjustment)
  1281.     {
  1282.         timeStampRTP = timeStampHX = pkt.timestamp;
  1283.     }
  1284.     else if (m_bLastTSSet && (m_ulLastRawRTPTS == (ULONG32)pkt.timestamp))
  1285.     {
  1286. // We want to preserve same time stamped packet sequences
  1287. // since some payloads may depend on it for proper coded frame
  1288. // assembly
  1289. timeStampRTP = m_ulLastRTPTS;
  1290. timeStampHX = m_ulLastHXTS;
  1291.     }
  1292.     else
  1293.     {
  1294. if (pStreamData->m_pTSConverter)
  1295. {
  1296.     timeStampHX = pStreamData->m_pTSConverter->rtp2hxa(pkt.timestamp);
  1297. }
  1298. else
  1299. {
  1300.     timeStampHX = pkt.timestamp;
  1301. }
  1302. timeStampHX += (m_lSyncOffsetHX + 
  1303.  m_lOffsetToMasterHX - 
  1304.  m_lTimeOffsetHX);  
  1305. timeStampRTP = (pkt.timestamp +
  1306. m_lSyncOffsetRTP +
  1307. m_lOffsetToMasterRTP - 
  1308. m_lTimeOffsetRTP);
  1309. m_ulLastHXTS = timeStampHX;
  1310. m_ulLastRTPTS = timeStampRTP;
  1311. m_ulLastRawRTPTS = pkt.timestamp;
  1312. m_bLastTSSet = TRUE;
  1313.     }
  1314. #ifdef RTP_MESSAGE_DEBUG
  1315.     if (m_bMessageDebug)
  1316.     {
  1317. messageFormatDebugFileOut("PKT: (Seq=%6u,RTPTime=%10u) -> (HXTimeval=%10u,RTPTimeval=%10u)",
  1318.   ((UINT16) pkt.seq_no), pkt.timestamp,
  1319.   timeStampHX, timeStampRTP);   
  1320.     }
  1321. #endif // RTP_MESSAGE_DEBUG
  1322.     
  1323.     pStreamData->m_bFirstPacket = FALSE;
  1324.     
  1325.     CHXPacket* pPacket = new CHXRTPPacket;
  1326.     if(pPacket)
  1327.     {
  1328.         pPacket->AddRef();
  1329.     }
  1330.     else
  1331.     {
  1332.         hresult = HXR_OUTOFMEMORY;
  1333.     }
  1334.     UINT32 dataOffset=
  1335.         (UINT32)((PTR_INT)pkt.data.data - (PTR_INT)pBuffer->GetBuffer());
  1336.     IHXBuffer* pPktBuffer = 
  1337.         new CHXStaticBuffer(pBuffer, dataOffset, pkt.data.len);
  1338.     if(pPktBuffer)
  1339.     {
  1340.         pPktBuffer->AddRef();
  1341.     }
  1342.     else
  1343.     {
  1344.         hresult = HXR_OUTOFMEMORY;
  1345.     }
  1346.     if( hresult == HXR_OUTOFMEMORY )
  1347.     {
  1348.         HX_RELEASE(pPacket);
  1349.         return hresult;
  1350.     } 
  1351.     
  1352.     if (bHasASMRules)
  1353.     {
  1354. pPacket->SetRTP(pPktBuffer, timeStampHX, timeStampRTP, m_streamNumber,
  1355. (UINT8) pkt.asm_flags, pkt.asm_rule);
  1356.     }
  1357.     else if(pkt.marker_flag == 1 && m_bHasMarkerRule)
  1358.     {
  1359. pPacket->SetRTP(pPktBuffer, timeStampHX, timeStampRTP, m_streamNumber,
  1360. HX_ASM_SWITCH_ON | HX_ASM_SWITCH_OFF, m_markerRuleNumber);
  1361.     }
  1362.     else
  1363.     {
  1364. pPacket->SetRTP(pPktBuffer, timeStampHX, timeStampRTP, m_streamNumber,
  1365.     HX_ASM_SWITCH_ON | HX_ASM_SWITCH_OFF, pkt.marker_flag ? 1 : 0);
  1366.     }
  1367.     
  1368.     if (m_bIsSource)
  1369.     {
  1370. hresult = m_pResp->PacketReady(HXR_OK, 
  1371.        m_sessionID, 
  1372.        pPacket);
  1373.     }
  1374.     else
  1375.     {
  1376. hresult = storePacket(pPacket,
  1377.                       m_streamNumber,
  1378.                       pkt.seq_no,
  1379.                       0,
  1380.                       0);
  1381.     }
  1382.     pPktBuffer->Release();
  1383.     pPacket->Release();
  1384.     return hresult;
  1385. }
  1386. HX_RESULT 
  1387. RTPBaseTransport::handleRTCPSync(NTPTime ntpTime, ULONG32 ulRTPTime)
  1388. {
  1389.     HX_RESULT retVal = HXR_IGNORE;
  1390.     // We use RTCP synchronization on live streams only.
  1391.     // Static streams have no reason not to be synchronzied in RTP time.
  1392.     // Making use of RTCP for static streams may result in unwanted sync.
  1393.     // noise/error for servers who do not generate proper RTCP ntp-rtp
  1394.     // mapping.  RealServers prior to RealServer9 had error in RTCP reported
  1395.     // ntp-rtp mapping (max. error 1s, avg 500ms).
  1396.     if ((m_bIsLive || m_bWeakStartSync) && !m_bSkipTimeAdjustment)
  1397.     {
  1398. ULONG32 ulNtpHX = ntpTime.toMSec();
  1399. RTSPStreamData* pStreamData = 
  1400.     m_pStreamHandler->getStreamData(m_streamNumber);
  1401. #ifdef RTP_MESSAGE_DEBUG
  1402. messageFormatDebugFileOut("RTCP-SYNC: Received NTPTime=%u RTPTime=%u", 
  1403.   ulNtpHX, ulRTPTime);
  1404. #endif // RTP_MESSAGE_DEBUG
  1405. // We ignore the RTCP sync until we can compute npt (m_bRTPTimeSet) or
  1406. // if the RTCP packet contains no synchronization information 
  1407. // (ulNtpHX == 0)
  1408. if (pStreamData && (ulNtpHX != 0) && m_bRTPTimeSet)
  1409. {
  1410.     // Npt time can be computed (ulHXTime)
  1411.     ULONG32 ulHXTime = pStreamData->m_pTSConverter->rtp2hxa(ulRTPTime);
  1412.     
  1413.     retVal = HXR_OK;
  1414.     
  1415.     if ((!m_pSyncServer) && m_pResp)
  1416.     {
  1417. m_pResp->QueryInterface(IID_IHXTransportSyncServer, 
  1418. (void**) &m_pSyncServer);
  1419.     }
  1420.     
  1421.     if (m_bNTPtoHXOffsetSet)
  1422.     {
  1423. // We can sync - NTP to NPT offset is known
  1424. ULONG32 ulExpectedHXTime = ulNtpHX + m_lNTPtoHXOffset;
  1425. LONG32 lSyncOffsetHX = ulExpectedHXTime - ulHXTime;
  1426. LONG32 lSyncOffsetChange = lSyncOffsetHX - m_lSyncOffsetHX;
  1427. if ((lSyncOffsetChange > ACCEPTABLE_SYNC_NOISE) ||
  1428.     (lSyncOffsetChange < (-ACCEPTABLE_SYNC_NOISE)))
  1429. {
  1430.     if (m_bIsSyncMaster && m_pSyncServer)
  1431.     {
  1432. #ifdef RTP_MESSAGE_DEBUG
  1433. messageFormatDebugFileOut("RTCP-SYNC: Distribute Master Sync NPTTime=%u SyncOffset=%d", 
  1434.           ulHXTime, -lSyncOffsetHX);
  1435. #endif // RTP_MESSAGE_DEBUG
  1436. m_pSyncServer->DistributeSync(ulHXTime, -lSyncOffsetHX);
  1437.     }
  1438.     else
  1439.     {
  1440. m_lSyncOffsetHX = lSyncOffsetHX;
  1441. if (lSyncOffsetHX >= 0)
  1442. {
  1443.     m_lSyncOffsetRTP = (LONG32) 
  1444. (pStreamData->m_pTSConverter->hxa2rtp_raw((ULONG32) lSyncOffsetHX));
  1445. }
  1446. else
  1447. {
  1448.     m_lSyncOffsetRTP = (LONG32) 
  1449. (-pStreamData->m_pTSConverter->hxa2rtp_raw((ULONG32) (-lSyncOffsetHX)));
  1450. }
  1451. #ifdef RTP_MESSAGE_DEBUG
  1452. messageFormatDebugFileOut("RTCP-SYNC: Self-Sync SyncOffset=%d SyncOffsetRTP=%d", 
  1453.           m_lSyncOffsetHX, m_lSyncOffsetRTP);
  1454. #endif // RTP_MESSAGE_DEBUG
  1455.     }
  1456. }
  1457.     }
  1458.     else
  1459.     {
  1460. // This the first RTCP sync accross all streams, anchor sync
  1461. if (m_pSyncServer)
  1462. {
  1463. #ifdef RTP_MESSAGE_DEBUG
  1464.     messageFormatDebugFileOut("RTCP-SYNC: Distribute NTP-NPT Mapping NTPTime=%u NPTTime=%u", 
  1465.       ulNtpHX, ulHXTime);
  1466. #endif // RTP_MESSAGE_DEBUG
  1467.     m_pSyncServer->DistributeSyncAnchor(ulHXTime, ulNtpHX);
  1468. }
  1469.     }
  1470. }
  1471.     }
  1472.     return retVal;
  1473. }
  1474. HX_RESULT
  1475. RTPBaseTransport::anchorSync(ULONG32 ulHXTime, ULONG32 ulNTPTime)
  1476. {
  1477.     HX_RESULT retVal = HXR_OK;
  1478.     m_lNTPtoHXOffset = ulHXTime - ulNTPTime;
  1479.     m_bNTPtoHXOffsetSet = TRUE;
  1480. #ifdef RTP_MESSAGE_DEBUG
  1481.     messageFormatDebugFileOut("RTCP-SYNC: Received NTP-NPT Mapping NTPTime=%u NPTTime=%u NTPtoNPTOffset=%d", 
  1482.       ulNTPTime, ulHXTime, m_lNTPtoHXOffset);
  1483. #endif // RTP_MESSAGE_DEBUG
  1484.     return retVal;
  1485. }
  1486. HX_RESULT 
  1487. RTPBaseTransport::handleMasterSync(ULONG32 ulHXTime, LONG32 lHXOffsetToMaster)
  1488. {
  1489.     HX_RESULT retVal = HXR_IGNORE;
  1490.     RTSPStreamData* pStreamData = 
  1491.     m_pStreamHandler->getStreamData(m_streamNumber);
  1492.     if (pStreamData && (!m_bIsSyncMaster))
  1493.     {
  1494. retVal = HXR_OK;
  1495. m_lOffsetToMasterHX = lHXOffsetToMaster;
  1496. if (lHXOffsetToMaster >= 0)
  1497. {
  1498.     m_lOffsetToMasterRTP = (LONG32) 
  1499. (pStreamData->m_pTSConverter->hxa2rtp_raw((ULONG32) lHXOffsetToMaster));
  1500. }
  1501. else
  1502. {
  1503.     m_lOffsetToMasterRTP = (LONG32) 
  1504. (-pStreamData->m_pTSConverter->hxa2rtp_raw((ULONG32) (-lHXOffsetToMaster)));
  1505. }
  1506. #ifdef RTP_MESSAGE_DEBUG
  1507. messageFormatDebugFileOut("RTCP-SYNC: Master-Sync NPTTime=%u MasterSyncOffset=%d MasterSyncOffsetRTP=%d", 
  1508.   ulHXTime, m_lOffsetToMasterHX, m_lOffsetToMasterRTP);
  1509. #endif // RTP_MESSAGE_DEBUG
  1510.     }
  1511.     return retVal;
  1512. }
  1513. void
  1514. RTPBaseTransport::resetStartInfoWaitQueue(void)
  1515. {
  1516.     IHXBuffer* pStoredBuffer;
  1517.     while (!m_StartInfoWaitQueue.IsEmpty())
  1518.     {
  1519. pStoredBuffer = (IHXBuffer*) m_StartInfoWaitQueue.RemoveHead();
  1520. HX_RELEASE(pStoredBuffer);
  1521.     }
  1522. }
  1523. HX_RESULT
  1524. RTPBaseTransport::streamDone(UINT16 streamNumber)
  1525. {
  1526.     HX_ASSERT(m_streamNumber == streamNumber);
  1527.     HX_ASSERT(m_streamNumber == m_pRTCPTran->m_streamNumber);
  1528.     HX_RESULT hresult = HXR_OK;
  1529.     HX_ASSERT(m_pRTCPTran);
  1530.     if (!m_bActive)
  1531.     {
  1532. // this stream is not active, don't do anything.
  1533.     }
  1534.     else if (m_bIsSource)
  1535.     {
  1536. hresult= m_pRTCPTran->streamDone(streamNumber);
  1537.     }
  1538.     else
  1539.     {
  1540.      // send BYE pkt
  1541.      m_pRTCPTran->streamDone(streamNumber);
  1542. hresult = m_pResp->OnStreamDone(HXR_OK, streamNumber);
  1543.     }
  1544.     return hresult;
  1545. }
  1546. STDMETHODIMP
  1547. RTPBaseTransport::InitBw(IHXBandwidthManagerInput* pBwMgr)
  1548. {
  1549.     HX_RELEASE(m_pBwMgrInput);
  1550.     m_pBwMgrInput = pBwMgr;
  1551.     pBwMgr->AddRef();
  1552.     return HXR_OK;
  1553. }
  1554. STDMETHODIMP
  1555. RTPBaseTransport::SetTransmitRate(UINT32 ulBitRate)
  1556. {
  1557.     return HXR_OK;
  1558. }
  1559. /*
  1560.  * XXXMC
  1561.  * Special-case handling for PV clients
  1562.  */
  1563. void
  1564. RTPBaseTransport::setPVEmulationMode(BOOL bPVSessionFlag)
  1565. {
  1566.     m_bEmulatePVSession = bPVSessionFlag;
  1567. }
  1568. void
  1569. RTPBaseTransport::setRTCPTransport(RTCPBaseTransport* pRTCPTran)
  1570. {
  1571.     HX_ASSERT(pRTCPTran);
  1572.     HX_ASSERT(!m_pRTCPTran);
  1573.     m_pRTCPTran = pRTCPTran;
  1574.     m_pRTCPTran->AddRef();
  1575.     // pointing to the same instatnce
  1576.     HX_ASSERT(m_pReportHandler);
  1577.     m_pRTCPTran->m_pReportHandler = m_pReportHandler;
  1578. }
  1579. void 
  1580. RTPBaseTransport::MBitRTPPktInfo(REF(UINT8)bMBit, IHXPacket* pPkt, UINT16 unRuleNo)
  1581. {
  1582.     BOOL b = FALSE;
  1583.     IHXRTPPacketInfo* pRTPPacketInfo = NULL;
  1584.     if (pPkt->QueryInterface(IID_IHXRTPPacketInfo, (void**) &pRTPPacketInfo) == HXR_OK)
  1585.     {
  1586. if (pRTPPacketInfo->GetMarkerBit(b) == HXR_OK && b)
  1587. {
  1588.     bMBit = TRUE;
  1589. }
  1590. else
  1591. {
  1592.     bMBit = FALSE;
  1593. }
  1594. pRTPPacketInfo->Release();
  1595.     }
  1596.     else
  1597.     {
  1598. bMBit = FALSE;
  1599.     }
  1600. }
  1601. void 
  1602. RTPBaseTransport::MBitASMRuleNo(REF(UINT8)bMBit, IHXPacket* pPkt, UINT16 unRuleNo)
  1603. {
  1604.     bMBit = m_bHasMarkerRule && ((unRuleNo & 0x1) == m_markerRuleNumber);
  1605. }
  1606. #ifdef RTP_MESSAGE_DEBUG
  1607. void
  1608. RTPBaseTransport::messageFormatDebugFileOut(const char* fmt, ...)
  1609. {
  1610.     if(m_bMessageDebug)
  1611.     {
  1612. va_list args;
  1613. char buf[4096]; /* Flawfinder: ignore */
  1614. SafeSprintf(buf, 4096, "%s.%d", (const char*) m_messageDebugFileName, 
  1615.       m_streamNumber);
  1616. va_start(args, fmt);
  1617. FILE* fp = fopen(buf, "a");
  1618. if (fp)
  1619. {
  1620.     vsprintf(buf, fmt, args);
  1621.     fprintf(fp, "%sn", buf);
  1622.     fclose(fp);
  1623. }
  1624. va_end(args);
  1625.     }
  1626. }
  1627. #endif // RTP_MESSAGE_DEBUG
  1628. /*
  1629.  *   RTP UDP
  1630.  */
  1631. RTPUDPTransport::RTPUDPTransport(BOOL bIsSource)
  1632.     : RTPBaseTransport(bIsSource)
  1633.     , m_pUDPSocket(NULL)
  1634.     , m_foreignAddr(0)
  1635.     , m_foreignPort(0)
  1636.     , m_keepAliveSeq((UINT16)(random32(0) & 0xffff))
  1637.     , m_ulCurrentMulticastAddress(0)
  1638.     , m_ulCurrentMulticastPort(0)
  1639.     , m_pMCastUDPSocket(NULL)
  1640. {
  1641. }
  1642. RTPUDPTransport::~RTPUDPTransport()
  1643. {
  1644.     Done();
  1645. }
  1646. RTSPTransportTypeEnum
  1647. RTPUDPTransport::tag()
  1648. {
  1649.     return RTSP_TR_RTP_UDP;
  1650. }
  1651. void
  1652. RTPUDPTransport::Done()
  1653. {
  1654.     m_keepAlive.reset();
  1655.     if (m_pMCastUDPSocket)
  1656.     {
  1657.         m_pMCastUDPSocket->LeaveMulticastGroup(m_ulCurrentMulticastAddress, HXR_INADDR_ANY);
  1658.     }
  1659.     HX_RELEASE(m_pMCastUDPSocket);
  1660.     HX_RELEASE(m_pUDPSocket);
  1661.     RTPBaseTransport::Done();
  1662. }
  1663. HX_RESULT
  1664. RTPUDPTransport::init(IUnknown* pContext,
  1665.        IHXUDPSocket* pSocket,
  1666.        IHXRTSPTransportResponse* pResp)
  1667. {
  1668.     m_pResp = pResp;
  1669.     m_pResp->AddRef();
  1670.     
  1671.     m_pUDPSocket = pSocket;
  1672.     m_pUDPSocket->AddRef();
  1673.     /* Set DiffServ Code Point */
  1674.     IHXSetSocketOption* pOpt = NULL;
  1675.     if (SUCCEEDED(m_pUDPSocket->QueryInterface(IID_IHXSetSocketOption, (void**)&pOpt)))
  1676.     {
  1677. IHXQoSDiffServConfigurator* pCfg = NULL;
  1678. if (SUCCEEDED(pContext->QueryInterface(IID_IHXQoSDiffServConfigurator, (void**)&pCfg)))
  1679. {
  1680.     pCfg->ConfigureSocket(pOpt, HX_QOS_DIFFSERV_CLASS_MEDIA);
  1681.     pCfg->Release();
  1682.     pCfg = NULL;
  1683. }
  1684. pOpt->Release();
  1685. pOpt = NULL;
  1686.     }
  1687.     HX_RESULT hresult = Init(pContext);
  1688.     if(HXR_OK != hresult)
  1689.     {
  1690. return hresult;
  1691.     }
  1692. #ifdef DEBUG
  1693.     if (debug_func_level() & DF_DROP_PACKETS)
  1694.     {
  1695. m_drop_packets = TRUE;
  1696.     }
  1697. #endif /* DEBUG */
  1698.     RTPBaseTransport::init();
  1699.     return HXR_OK;
  1700. }
  1701. void
  1702. RTPUDPTransport::setForeignAddress(UINT32 foreignAddr, UINT16 foreignPort)
  1703. {
  1704.     m_foreignAddr = foreignAddr;
  1705.     m_foreignPort = foreignPort;
  1706.     UINT32 natTimeout = GetNATTimeout(m_pContext);
  1707.     if (!m_bIsSource && natTimeout)
  1708.     {
  1709. // Initialize keepalive object
  1710. m_keepAlive.Init(m_pScheduler, natTimeout, new KeepAliveCB(this));
  1711.     
  1712. // Do initial "poke" through the NAT
  1713. onNATKeepAlive();
  1714.     }
  1715. }
  1716. HX_RESULT RTPUDPTransport::handlePacket(IHXBuffer* pBuffer)
  1717. {
  1718.     m_keepAlive.OnActivity();
  1719.     return RTPBaseTransport::handlePacket(pBuffer);
  1720. }
  1721. void 
  1722. RTPUDPTransport::JoinMulticast(UINT32 ulAddress, UINT32 ulPort, IHXUDPSocket* pUDP)
  1723. {
  1724.     if (m_ulCurrentMulticastAddress)
  1725.     {
  1726. m_pMCastUDPSocket->LeaveMulticastGroup(m_ulCurrentMulticastAddress, HXR_INADDR_ANY);
  1727.     }
  1728.     else
  1729.     {
  1730. m_pMCastUDPSocket = pUDP;
  1731.         m_pMCastUDPSocket->AddRef();
  1732.     }
  1733.     m_pMCastUDPSocket->JoinMulticastGroup(ulAddress, HXR_INADDR_ANY);
  1734.     m_bMulticast = TRUE;
  1735.     m_ulCurrentMulticastAddress = ulAddress;
  1736.     m_ulCurrentMulticastPort = ulPort;
  1737.     if (m_pStreamHandler)
  1738.     {
  1739. RTSPStreamData* pStreamData = m_pStreamHandler->firstStreamData();
  1740. ASSERT(pStreamData);
  1741. while(pStreamData)
  1742. {
  1743.     pStreamData->m_pTransportBuffer->SetMulticast();
  1744.     pStreamData = m_pStreamHandler->nextStreamData();
  1745. }
  1746.     }
  1747.     return;
  1748. }
  1749. HX_RESULT RTPUDPTransport::onNATKeepAlive()
  1750. {
  1751.     DPRINTF(D_INFO, ("RTP : onNATKeepAlive()n"));
  1752.     // Send an RTP packet with PT=0 and no payload
  1753.     IHXBuffer* pPktBuf = NULL;
  1754.     if (m_pCommonClassFactory &&
  1755. (HXR_OK == m_pCommonClassFactory->CreateInstance(IID_IHXBuffer, (void**)&pPktBuf)))
  1756.     {
  1757. RTPPacket pkt;
  1758. pkt.version_flag = 2;
  1759. pkt.padding_flag = 0;
  1760. pkt.csrc_len = 0;
  1761. pkt.marker_flag = 0;
  1762. pkt.extension_flag = 0;
  1763. pkt.data.data = 0;
  1764. pkt.data.len = 0;
  1765. pkt.ssrc = m_pReportHandler->GetSSRC();
  1766. pkt.payload = 0;
  1767. pkt.seq_no = m_keepAliveSeq++;
  1768. pkt.timestamp =  HX_GET_TICKCOUNT() * 8; // Timestamp in 1/8000 sec
  1769. UINT32 packetLen = pkt.static_size() + pkt.data.len;
  1770. if (HXR_OK == pPktBuf->SetSize(packetLen))
  1771. {
  1772.     // Pack the data into the buffer
  1773.     pkt.pack(pPktBuf->GetBuffer(), packetLen);
  1774.     
  1775.     pPktBuf->SetSize(packetLen); // Update the packet size
  1776.     
  1777.     writePacket(pPktBuf);
  1778. }
  1779.     }
  1780.     HX_RELEASE(pPktBuf);
  1781.     return HXR_OK;
  1782. }
  1783. HX_RESULT
  1784. RTPUDPTransport::writePacket(IHXBuffer* pSendBuffer)
  1785. {    
  1786.     if (!m_pUDPSocket)
  1787.         return HXR_FAIL;
  1788.     m_keepAlive.OnActivity();
  1789.     return m_pUDPSocket->WriteTo(m_foreignAddr, m_foreignPort, pSendBuffer);
  1790. }
  1791. /*
  1792.  * XXXMC
  1793.  * Special-case handling for PV clients
  1794.  */
  1795. HX_RESULT
  1796. RTPUDPTransport::sendPVHandshakeResponse(UINT8* pPktPayload)
  1797. {
  1798.     IHXBuffer* pPktPayloadBuff = NULL;
  1799.     m_pCommonClassFactory->CreateInstance(IID_IHXBuffer, (void**) &pPktPayloadBuff);
  1800.     if (pPktPayloadBuff)
  1801.     {
  1802.         DPRINTF(D_INFO, ("RTP: Sending POKE PKT RESPONSEn")); 
  1803.         pPktPayloadBuff->Set((UCHAR*)pPktPayload, 8);
  1804.         writePacket(pPktPayloadBuff);
  1805.         pPktPayloadBuff->Release();
  1806.     }
  1807.     return HXR_OK;
  1808. }
  1809. HX_RESULT
  1810. RTPUDPTransport::sendPacket(BasePacket* pPacket)
  1811. {
  1812.     HX_ASSERT(m_bActive);
  1813.     
  1814.     HX_RESULT theErr;
  1815.     if (m_ulPayloadWirePacket!=0)
  1816.     {
  1817. IHXBuffer* pSendBuf = NULL;
  1818. theErr = reflectPacket(pPacket, pSendBuf);
  1819. if (HXR_OK == theErr)
  1820. {
  1821.     theErr = writePacket(pSendBuf);
  1822.     pSendBuf->Release();
  1823. }
  1824. else if (HXR_IGNORE == theErr)
  1825. {
  1826.     return HXR_OK;
  1827. }
  1828. return theErr;
  1829.     }
  1830.     
  1831.     IHXBuffer* pPacketBuf = NULL;
  1832.     
  1833.     theErr = makePacket(pPacket, pPacketBuf);
  1834.     if (HXR_OK == theErr)
  1835.     {
  1836. theErr = writePacket(pPacketBuf);
  1837. /* send SR if necessary */
  1838.      if (HXR_OK == theErr && m_pRTCPTran->m_bSendReport &&
  1839.     m_pRTCPTran->m_bSendRTCP)
  1840.      {
  1841.     m_pRTCPTran->sendSenderReport();
  1842.     m_pRTCPTran->m_bSendReport = FALSE;
  1843.     m_pRTCPTran->scheduleNextReport();
  1844.      }
  1845.     }
  1846.     HX_RELEASE(pPacketBuf);
  1847.     return theErr;
  1848. }
  1849. RTPUDPTransport::KeepAliveCB::KeepAliveCB(RTPUDPTransport* pTransport):
  1850.     m_pTransport(pTransport),
  1851.     m_lRefCount(0)
  1852. {
  1853.     if(m_pTransport)
  1854.     {
  1855. m_pTransport->AddRef();
  1856.     }
  1857. }
  1858. RTPUDPTransport::KeepAliveCB::~KeepAliveCB()
  1859. {
  1860.     HX_RELEASE(m_pTransport);
  1861. }
  1862. STDMETHODIMP
  1863. RTPUDPTransport::KeepAliveCB::QueryInterface(REFIID riid, void** ppvObj)
  1864. {
  1865.     if (IsEqualIID(riid, IID_IUnknown))
  1866.     {
  1867.         AddRef();
  1868.         *ppvObj = this;
  1869.         return HXR_OK;
  1870.     }
  1871.     else if (IsEqualIID(riid, IID_IHXCallback))
  1872.     {
  1873.         AddRef();
  1874.         *ppvObj = (IHXCallback*)this;
  1875.         return HXR_OK;
  1876.     }
  1877.     *ppvObj = NULL;
  1878.     return HXR_NOINTERFACE;
  1879. }
  1880. STDMETHODIMP_(UINT32)
  1881. RTPUDPTransport::KeepAliveCB::AddRef()
  1882. {
  1883.     return InterlockedIncrement(&m_lRefCount);
  1884. }
  1885. STDMETHODIMP_(UINT32)
  1886. RTPUDPTransport::KeepAliveCB::Release()
  1887. {
  1888.     if(InterlockedDecrement(&m_lRefCount) > 0)
  1889.     {
  1890. return m_lRefCount;
  1891.     }
  1892.     delete this;
  1893.     return 0;
  1894. }
  1895. STDMETHODIMP
  1896. RTPUDPTransport::KeepAliveCB::Func()
  1897. {
  1898.     if (m_pTransport)
  1899.     {
  1900. m_pTransport->onNATKeepAlive();
  1901.     }
  1902.     return HXR_OK;
  1903. }
  1904. /*
  1905.  * RTP TCP
  1906.  */
  1907. RTPTCPTransport::RTPTCPTransport(BOOL bIsSource)
  1908.     : RTPBaseTransport(bIsSource)
  1909.     , m_pTCPSocket(0)
  1910.     , m_tcpInterleave(0)
  1911.     m_wrapSequenceNumber = DEFAULT_WRAP_SEQ_NO;
  1912. }
  1913. RTPTCPTransport::~RTPTCPTransport()
  1914. {
  1915.     HX_RELEASE(m_pTCPSocket);
  1916. }
  1917. void
  1918. RTPTCPTransport::Done()
  1919. {
  1920.     RTPBaseTransport::Done();
  1921. }
  1922. RTSPTransportTypeEnum
  1923. RTPTCPTransport::tag()
  1924. {
  1925.     return RTSP_TR_RTP_TCP;
  1926. }
  1927. HX_RESULT
  1928. RTPTCPTransport::init(IUnknown* pContext, 
  1929.       IHXTCPSocket* pSocket,
  1930.       IHXRTSPTransportResponse* pResp)
  1931. {
  1932.     m_pTCPSocket = pSocket;
  1933.     m_pTCPSocket->AddRef();
  1934.     m_pResp = pResp;
  1935.     m_pResp->AddRef();
  1936.     /* Set DiffServ Code Point */
  1937.     IHXSetSocketOption* pOpt = NULL;
  1938.     if (SUCCEEDED(m_pTCPSocket->QueryInterface(IID_IHXSetSocketOption, (void**)&pOpt)))
  1939.     {
  1940. IHXQoSDiffServConfigurator* pCfg = NULL;
  1941. if (SUCCEEDED(pContext->QueryInterface(IID_IHXQoSDiffServConfigurator, (void**)&pCfg)))
  1942. {
  1943.     pCfg->ConfigureSocket(pOpt, HX_QOS_DIFFSERV_CLASS_MEDIA);
  1944.     pCfg->Release();
  1945.     pCfg = NULL;
  1946. }
  1947. pOpt->Release();
  1948. pOpt = NULL;
  1949.     }
  1950.     HX_RESULT hresult = Init(pContext);
  1951.     if (HXR_OK != hresult)
  1952.     {
  1953. return hresult;
  1954.     }
  1955.     RTPBaseTransport::init();
  1956.     return HXR_OK;
  1957. }
  1958. HX_RESULT
  1959. RTPTCPTransport::sendPacket(BasePacket* pPacket)
  1960. {
  1961.     HX_ASSERT(m_bActive);
  1962.     HX_RESULT theErr;
  1963.     if (m_ulPayloadWirePacket!=0)
  1964.     {
  1965. IHXBuffer* pSendBuf = NULL;
  1966. theErr = reflectPacket(pPacket, pSendBuf);
  1967. if (HXR_OK == theErr)
  1968. {
  1969.     theErr = writePacket(pSendBuf);
  1970.     pSendBuf->Release();
  1971. }
  1972. else if (HXR_IGNORE == theErr)
  1973. {
  1974.     return HXR_OK;
  1975. }
  1976. return theErr;
  1977.     }
  1978.     IHXBuffer* pPacketBuf = NULL;
  1979.     
  1980.     theErr = makePacket(pPacket, pPacketBuf);
  1981.     if (HXR_OK == theErr)
  1982.     {
  1983. theErr = writePacket(pPacketBuf);
  1984. /* send SR if necessary */
  1985.      if (HXR_OK == theErr && m_pRTCPTran->m_bSendReport && 
  1986.     m_pRTCPTran->m_bSendRTCP)
  1987.      {
  1988.     m_pRTCPTran->sendSenderReport();
  1989.     m_pRTCPTran->m_bSendReport = FALSE;
  1990.     m_pRTCPTran->scheduleNextReport();
  1991.      }
  1992.     }
  1993.     HX_RELEASE(pPacketBuf);
  1994.     return theErr;
  1995. }
  1996. HX_RESULT
  1997. RTPTCPTransport::writePacket(IHXBuffer* pBuf)
  1998. {
  1999.     if (!m_pTCPSocket)
  2000.         return HXR_FAIL;
  2001.     // need to put $00[datalen] in front of packet data
  2002.     UINT32 dataLen = pBuf->GetSize();
  2003.     if(dataLen > 0xffff)
  2004.     {
  2005. return HXR_FAIL;
  2006.     }
  2007.     //XXXTDM: always true, m_tcpInteleave is signed (why?)
  2008.     //HX_ASSERT(0xFF != m_tcpInterleave);
  2009.     IHXBuffer* pHeader = NULL;
  2010.     m_pCommonClassFactory->CreateInstance(IID_IHXBuffer, 
  2011.                                           (void**)&pHeader);
  2012.     BYTE* pHeaderData;
  2013.     if(!pHeader)
  2014.     {
  2015.         return HXR_OUTOFMEMORY;
  2016.     }
  2017.     pHeader->SetSize(4);
  2018.     pHeaderData = pHeader->GetBuffer();
  2019.     pHeaderData[0] = '$';
  2020.     pHeaderData[1] = m_tcpInterleave;
  2021.     putshort(&pHeaderData[2], (UINT16)dataLen);
  2022.     HX_RESULT rc;
  2023.     rc = m_pTCPSocket->Write(pHeader);
  2024.     if (SUCCEEDED(rc))
  2025.     {
  2026.         rc = m_pTCPSocket->Write(pBuf);
  2027.     }
  2028.     if(rc)
  2029.     {
  2030.         m_pResp->OnProtocolError(HXR_NET_SOCKET_INVALID);
  2031.     }
  2032.     pHeader->Release();
  2033.     return rc;
  2034. }
  2035. /******************************************************************************
  2036. *   RTCP RTCP RTCP RTCP RTCP
  2037. ******************************************************************************/
  2038. RTCPBaseTransport::RTCPBaseTransport(BOOL bIsSource):
  2039.     RTSPTransport(bIsSource),
  2040.     m_lRefCount(0),
  2041.     m_bCallbackPending(FALSE),
  2042.     m_pReportCallback(0),
  2043.     m_reportTimeoutID(0),
  2044.     m_bSchedulerStarted(FALSE),
  2045.     m_bSendRTCP(TRUE),
  2046.     m_bSendBye(FALSE),
  2047.     m_bSendReport(FALSE),
  2048.     m_pcCNAME(NULL),
  2049.     m_pReportHandler(NULL),
  2050.     m_pDataTransport(NULL),
  2051.     m_pTSConverter(NULL),
  2052.     m_streamNumber(0xffff),
  2053.     m_pSignalBus(NULL),
  2054.     m_pQoSSignal_RR(NULL),
  2055.     m_pQoSSignal_APP(NULL),
  2056.     m_pSessionId(NULL),
  2057.     m_bSSRCDetermined(FALSE),
  2058.     m_ulSSRCDetermined(0)
  2059. {
  2060. }
  2061. RTCPBaseTransport::~RTCPBaseTransport()
  2062. {
  2063.     HX_DELETE(m_pTSConverter);
  2064. }
  2065. STDMETHODIMP
  2066. RTCPBaseTransport::QueryInterface(REFIID riid, void** ppvObj)
  2067. {
  2068.     if (IsEqualIID(riid, IID_IUnknown))
  2069.     {
  2070.         AddRef();
  2071.         *ppvObj = this;
  2072.         return HXR_OK;
  2073.     }
  2074.     else if (IsEqualIID(riid, IID_IHXQoSSignalSourceResponse))
  2075.     {
  2076.         AddRef();
  2077.         *ppvObj = (IHXQoSSignalSourceResponse*)this;
  2078.         return HXR_OK;
  2079.     }
  2080.     *ppvObj = NULL;
  2081.     return HXR_NOINTERFACE;
  2082. }
  2083. STDMETHODIMP_(UINT32)
  2084. RTCPBaseTransport::AddRef()
  2085. {
  2086.     return InterlockedIncrement(&m_lRefCount);
  2087. }
  2088. STDMETHODIMP_(UINT32)
  2089. RTCPBaseTransport::Release()
  2090. {
  2091.     if(InterlockedDecrement(&m_lRefCount) > 0)
  2092.     {
  2093. return m_lRefCount;
  2094.     }
  2095.     delete this;
  2096.     return 0;
  2097. }
  2098. void
  2099. RTCPBaseTransport::Done()
  2100. {
  2101.     stopScheduler();
  2102.     HX_RELEASE(m_pPacketFilter);
  2103.     HX_VECTOR_DELETE(m_pcCNAME);
  2104.     HX_DELETE(m_pReportHandler);
  2105.     HX_RELEASE(m_pQoSSignal_RR);
  2106.     HX_RELEASE(m_pQoSSignal_APP);
  2107.     HX_RELEASE(m_pSignalBus);
  2108.     HX_RELEASE(m_pSessionId);
  2109. }
  2110. HX_RESULT
  2111. RTCPBaseTransport::init()
  2112. {
  2113.     HX_ASSERT(!m_pReportCallback);
  2114.     HX_ASSERT(!m_pcCNAME);
  2115.     
  2116.     m_pReportCallback = new ReportCallback(this);
  2117.     if(!m_pReportCallback)
  2118.     {
  2119.         return HXR_OUTOFMEMORY;
  2120.     }
  2121.     m_pReportCallback->AddRef();
  2122.     char cname[16] = {0}; /* Flawfinder: ignore */
  2123.     itoa(random32(HX_GET_TICKCOUNT()), cname, 10);    
  2124.     m_pcCNAME = (BYTE*)new_string(cname);
  2125.     HX_ASSERT(m_pcCNAME);
  2126.     return HXR_OK;
  2127. }
  2128. void 
  2129. RTCPBaseTransport::addStreamInfo (RTSPStreamInfo* pStreamInfo,
  2130.   UINT32 ulBufferDepth)
  2131. {
  2132.     UINT32 ulInvalidRate = (UINT32)-1;
  2133.     UINT32 ulAvgBitRate = pStreamInfo->m_ulAvgBitRate;
  2134.     UINT32 ulRRBitRate = pStreamInfo->m_ulRtpRRBitRate;
  2135.     UINT32 ulRSBitRate = pStreamInfo->m_ulRtpRSBitRate;
  2136.     BOOL   bUseRFC1889MinTime = FALSE;
  2137.     if (!ulAvgBitRate)
  2138.     {
  2139. // We don't know the average bitrate.
  2140. // Make something up
  2141. ulAvgBitRate = 20000;
  2142.     }
  2143.     else
  2144.     {
  2145. UINT32 ulRTCPBw = ulAvgBitRate / 20; // 5% of AvgBitRate
  2146. if ((ulRRBitRate == ulInvalidRate) &&
  2147.     (ulRSBitRate != ulInvalidRate) &&
  2148.     (ulRTCPBw > ulRSBitRate))
  2149. {
  2150.     ulRRBitRate = ulRTCPBw - ulRSBitRate;
  2151. }
  2152. else if ((ulRRBitRate != ulInvalidRate) &&
  2153.  (ulRSBitRate == ulInvalidRate) &&
  2154.  (ulRTCPBw > ulRRBitRate))
  2155. {
  2156.     ulRSBitRate = ulRTCPBw - ulRRBitRate;
  2157. }
  2158.     }
  2159.     if ((ulRRBitRate == ulInvalidRate) ||
  2160. (ulRSBitRate == ulInvalidRate))
  2161.     {
  2162. // If one of the bitrates is still
  2163. // invalid at this point we just
  2164. // default to the RFC 1889 behavior.
  2165. // RS = 1.25% of the average bitrate
  2166. // RR = 3.75% of the average bitrate
  2167. bUseRFC1889MinTime = TRUE;
  2168. m_bSendRTCP = TRUE;
  2169. ulRSBitRate = ulAvgBitRate / 80; // 1.25%
  2170. ulRRBitRate = ((ulAvgBitRate / 80) * 3 +
  2171.        ((ulAvgBitRate % 80) * 3) / 80); // 3.75%
  2172.     }
  2173.     else if (ulRRBitRate == 0)
  2174.     {
  2175. // We have been told not
  2176. // to send RTCP reports
  2177. m_bSendRTCP = FALSE;
  2178.     }
  2179.     if (m_pReportHandler)
  2180.     {
  2181. // Get the minimum RTCP report interval
  2182. UINT32 ulMinIntervalMs = (bUseRFC1889MinTime) ? 5000 : 1;
  2183. // Pass the report interval parameters to 
  2184. // the report handler
  2185. m_pReportHandler->SetRTCPIntervalParams(ulRSBitRate, ulRRBitRate,
  2186. ulMinIntervalMs);
  2187.     }
  2188. }
  2189. void
  2190. RTCPBaseTransport::setSSRC(UINT32 ulSSRC)
  2191. {
  2192.     m_bSSRCDetermined = TRUE;
  2193.     m_ulSSRCDetermined = ulSSRC;
  2194. }
  2195. void
  2196. RTCPBaseTransport::setSessionID(const char* pSessionID)
  2197. {
  2198.     /* cache the session id for use in retrieving signal bus*/
  2199.     if(pSessionID && (SUCCEEDED(m_pCommonClassFactory->CreateInstance(CLSID_IHXBuffer,
  2200.       (void**)&m_pSessionId))))
  2201.     {
  2202. m_pSessionId->Set((UCHAR*)pSessionID, 
  2203.   strlen(pSessionID)+1);
  2204. IHXQoSSignalSource* pSignalSrc = NULL;
  2205. if (m_pSessionId && SUCCEEDED(m_pContext->QueryInterface(IID_IHXQoSSignalSource,
  2206.  (void**) &pSignalSrc)))
  2207. {
  2208.     pSignalSrc->GetSignalBus(m_pSessionId, (IHXQoSSignalSourceResponse*)this);
  2209.     HX_RELEASE(pSignalSrc);
  2210. }
  2211. else
  2212. {
  2213.     m_pSignalBus = NULL;
  2214. }
  2215.     }
  2216. }
  2217. STDMETHODIMP
  2218. RTCPBaseTransport::SignalBusReady (HX_RESULT hResult, IHXQoSSignalBus* pBus, 
  2219.    IHXBuffer* pSessionId)
  2220. {
  2221.     if (FAILED(hResult))
  2222.     {
  2223. HX_ASSERT(0);
  2224. return HXR_OK;
  2225.     }
  2226.     m_pSignalBus = pBus;
  2227.     m_pSignalBus->AddRef();
  2228.     if (m_pDataTransport)
  2229.     {
  2230.         if (FAILED(m_pSignalBus->QueryInterface(IID_IHXQoSTransportAdaptationInfo,
  2231.                                                 (void**)&m_pDataTransport->m_pQoSInfo)))
  2232.         {
  2233.             m_pDataTransport->m_pQoSInfo = NULL;
  2234.         }
  2235.     }
  2236.     else
  2237.     {
  2238.         HX_ASSERT(0);
  2239.     }
  2240.     if (SUCCEEDED(m_pCommonClassFactory->CreateInstance(CLSID_IHXQoSSignal,
  2241. (void**)&m_pQoSSignal_RR)))
  2242.     {
  2243. m_pQoSSignal_RR->SetId(MAKE_HX_QOS_SIGNAL_ID(HX_QOS_SIGNAL_LAYER_FRAMING_TRANSPORT,
  2244.   HX_QOS_SIGNAL_RELEVANCE_METRIC,
  2245.   HX_QOS_SIGNAL_RTCP_RR));
  2246.     }
  2247.     else
  2248.     {
  2249. HX_ASSERT(0);
  2250. m_pQoSSignal_RR = NULL;
  2251.     }
  2252.     if (SUCCEEDED(m_pCommonClassFactory->CreateInstance(CLSID_IHXQoSSignal,
  2253. (void**)&m_pQoSSignal_APP)))
  2254.     {
  2255.         m_pQoSSignal_APP->SetId(MAKE_HX_QOS_SIGNAL_ID(HX_QOS_SIGNAL_LAYER_FRAMING_TRANSPORT,
  2256.    HX_QOS_SIGNAL_RELEVANCE_METRIC,
  2257.    HX_QOS_SIGNAL_COMMON_BUFSTATE));
  2258.     }
  2259.     else
  2260.     {
  2261. HX_ASSERT(0);
  2262. m_pQoSSignal_APP = NULL;
  2263.     }
  2264.     return HXR_OK;
  2265. }
  2266. HX_RESULT 
  2267. RTCPBaseTransport::SetTSConverter(CHXTimestampConverter::ConversionFactors conversionFactors)
  2268. {
  2269.     HX_DELETE(m_pTSConverter);
  2270.     m_pTSConverter = new CHXTimestampConverter(conversionFactors);
  2271.     return m_pTSConverter ? HXR_OK : HXR_OUTOFMEMORY;
  2272. }
  2273. HX_RESULT
  2274. RTCPBaseTransport::startScheduler()
  2275. {
  2276.     if(!m_bSchedulerStarted && m_bSendRTCP)
  2277.     {
  2278. HX_ASSERT(!m_bCallbackPending);
  2279. m_bSchedulerStarted = TRUE;
  2280. if (!m_bMulticast)
  2281. {
  2282.     // we wanna send the report right away!
  2283.     m_bSendReport = TRUE;
  2284. }
  2285. else
  2286. {    
  2287.     if (!m_bCallbackPending)
  2288.     {
  2289. scheduleNextReport();
  2290.     }
  2291. }
  2292.     }
  2293.     return HXR_OK;
  2294. }
  2295. HX_RESULT
  2296. RTCPBaseTransport::stopScheduler()
  2297. {
  2298.     if(m_bCallbackPending)
  2299.     {
  2300. HX_ASSERT(m_pScheduler);
  2301. m_pScheduler->Remove(m_reportTimeoutID);
  2302. m_bCallbackPending = FALSE;
  2303.     }
  2304.     HX_RELEASE(m_pReportCallback);
  2305.     return HXR_OK;
  2306. }
  2307. void
  2308. RTCPBaseTransport::scheduleNextReport()
  2309. {
  2310.     if (m_bSendRTCP)
  2311.     {
  2312. HX_ASSERT(!m_bSendReport);
  2313. HX_ASSERT(!m_bCallbackPending);
  2314. HX_ASSERT(m_pReportCallback);
  2315. HXTimeval rmatv = m_pScheduler->GetCurrentSchedulerTime();
  2316. Timeval tvNow((INT32)rmatv.tv_sec, (INT32)rmatv.tv_usec);
  2317. tvNow += Timeval(m_pReportHandler->GetRTCPInterval());
  2318. rmatv.tv_sec = tvNow.tv_sec;
  2319. rmatv.tv_usec = tvNow.tv_usec;
  2320. m_reportTimeoutID = 
  2321.     m_pScheduler->AbsoluteEnter(m_pReportCallback, rmatv);
  2322. m_bCallbackPending = TRUE;
  2323.     }
  2324. }
  2325. /*
  2326. *   we don't have a table of sender or receivers because we don't yet 
  2327. *   support multicast.  i.e. only one sender, one receiver
  2328. */
  2329. HX_RESULT
  2330. RTCPBaseTransport::handlePacket(IHXBuffer* pBuffer)
  2331. {
  2332.     // we need to deal with a compund packet
  2333.     RTCPUnPacker unpacker;
  2334. //{FILE* f1 = ::fopen("c:\temp\all.txt", "a+"); ::fprintf(f1, "this: %p RTCPTransport::handlePacket(): ", this);::fclose(f1);}      
  2335.     if (HXR_OK != unpacker.UnPack(pBuffer))
  2336.     {
  2337. // failed...don't do anything more...still ok to return HXR_OK;
  2338. return HXR_OK;
  2339.     }
  2340.     /* update */
  2341.     m_pReportHandler->UpdateAvgRTCPSize(pBuffer->GetSize());
  2342.     HX_RESULT theErr = HXR_OK;
  2343.     RTCPPacket* pPkt = NULL;
  2344.     HXTimeval rmatv = m_pScheduler->GetCurrentSchedulerTime();
  2345.     UINT32 ulNow = rmatv.tv_sec * 1000 + rmatv.tv_usec / 1000;
  2346.     // for EOS support
  2347.     BOOL bBye = FALSE;
  2348.     APPItem* pAppPkt = NULL;
  2349.     while (HXR_OK == unpacker.Get(pPkt))
  2350.     {
  2351. //{FILE* f1 = ::fopen("c:\temp\all.txt", "a+"); ::fprintf(f1, "%un", pPkt->packet_type);::fclose(f1);}  
  2352.         if (m_bIsSource || (m_bSSRCDetermined && m_ulSSRCDetermined == pPkt->sr_ssrc))
  2353.         {    
  2354.     // deal with it!
  2355.          switch(pPkt->packet_type)
  2356.          {
  2357.         case RTCP_SR:
  2358.         {
  2359.          DPRINTF(D_INFO, ("RTCP: SenderReport receivedn"));
  2360.     m_pReportHandler->OnRTCPReceive(pPkt, ulNow);
  2361.     m_pDataTransport->handleRTCPSync(NTPTime(pPkt->ntp_sec, 
  2362.      pPkt->ntp_frac),
  2363.      pPkt->rtp_ts);
  2364.         }
  2365.         break;
  2366.     
  2367.         case RTCP_RR:
  2368.         {
  2369.          DPRINTF(D_INFO, ("RTCP: ReceiverReport receivedn"));
  2370.     m_pReportHandler->OnRTCPReceive(pPkt, ulNow);
  2371.     
  2372.     IHXBuffer* pTmp = NULL;
  2373.     if((m_pSignalBus) && SUCCEEDED(m_pCommonClassFactory->
  2374.            CreateInstance(CLSID_IHXBuffer,
  2375.           (void**)&pTmp)))
  2376.     {
  2377.         for (UINT32 i = 0; i < pPkt->count; i++)
  2378.         {
  2379.     if (pPkt->rr_data[i].ssrc == m_pReportHandler->GetSSRC())
  2380.     {
  2381.         pTmp->SetSize(sizeof(ReceptionReport));
  2382.         ReceptionReport* pRR = (ReceptionReport*)pTmp->GetBuffer();
  2383.         HX_ASSERT(pRR);
  2384.         //replace the ssrc with the server specific stream number
  2385.         pRR->ssrc     = m_streamNumber;
  2386.         //copy in the remaining receiver report data
  2387.         pRR->fraction = pPkt->rr_data[i].fraction;
  2388.         pRR->lost     = pPkt->rr_data[i].lost;
  2389.         pRR->last_seq = pPkt->rr_data[i].last_seq;
  2390.         pRR->lsr      = (m_pDataTransport) ? 
  2391.     m_pDataTransport->MapLSR(pPkt->rr_data[i].lsr) : 0;
  2392.         pRR->dlsr     = pPkt->rr_data[i].dlsr;
  2393. if (m_pDataTransport && m_pDataTransport->m_pQoSInfo)
  2394. {
  2395.     m_pDataTransport->m_pQoSInfo->SetPacketLoss(pRR->lost);
  2396. }
  2397.         m_pQoSSignal_RR->SetValue(pTmp);
  2398.         m_pSignalBus->Send(m_pQoSSignal_RR);
  2399.       }
  2400.         }
  2401.     }
  2402.     HX_RELEASE(pTmp);
  2403.         }
  2404.         break;
  2405.     
  2406.         case RTCP_SDES:
  2407.         {
  2408.          DPRINTF(D_INFO, ("RTCP: SDESReport receivedn"));
  2409.          m_pReportHandler->OnRTCPReceive(pPkt, ulNow);
  2410.         }
  2411.         break;
  2412.     
  2413.         case RTCP_BYE:
  2414.         {
  2415.          DPRINTF(D_INFO, ("RTCP: BYE receivedn"));
  2416.     m_pReportHandler->OnRTCPReceive(pPkt, ulNow);
  2417.     bBye = TRUE;
  2418.         }
  2419.         break;
  2420.     
  2421.         case RTCP_APP:
  2422.         {
  2423.          DPRINTF(D_INFO, ("RTCP: APP receivedn"));
  2424.     // make sure this APP is from RS.
  2425.     // Hmmm...This is a security risk...Anyone can send APP pkt 
  2426.     // with "RNWK"...
  2427.     if ((0 != strncmp((const char*)pPkt->app_name, "RNWK", 4)) &&
  2428.         (0 != strncmp((const char*)pPkt->app_name, "HELX", 4)))
  2429.     {
  2430.         // unknown APP, ignore it.
  2431.         break;
  2432.     }
  2433.     if (!(pPkt->m_pAPPItems))
  2434.     {
  2435.         break;
  2436.     }
  2437.          HX_ASSERT(1 == pPkt->count);
  2438.          pAppPkt = new APPItem();
  2439.                     if(!pAppPkt)
  2440.                     {
  2441.                         theErr = HXR_OUTOFMEMORY;
  2442.                         break;
  2443.                     }
  2444.     if ((pPkt->m_pAPPItems[0]).app_type == APP_BUFINFO)
  2445.     {
  2446.         IHXBuffer* pTmp = NULL;
  2447.         if((m_pSignalBus) && SUCCEEDED(m_pCommonClassFactory->
  2448.        CreateInstance(CLSID_IHXBuffer,
  2449.       (void**)&pTmp)))
  2450.         {
  2451.     // pTmp->Set((UCHAR*)(&pPkt->m_pAPPItems[0]), sizeof(APPItem));
  2452.                             pTmp->SetSize(sizeof(BufferMetricsSignal));
  2453.               BufferMetricsSignal* pbufSig = 
  2454.           (BufferMetricsSignal*)pTmp->GetBuffer();
  2455.     // The correct mapping from SSRC to stream number relies on the port multiplexing
  2456.     // used by the current implementation. If we use SSRC-based multiplexing, we will
  2457.     // need to take a look again at this mapping.                        
  2458.                             pbufSig->m_ulStreamNumber = m_streamNumber;
  2459.                             pbufSig->m_ulLowTimestamp = pPkt->m_pAPPItems[0].lowest_timestamp;
  2460.               pbufSig->m_ulHighTimestamp = pPkt->m_pAPPItems[0].highest_timestamp;
  2461.               pbufSig->m_ulBytes = pPkt->m_pAPPItems[0].bytes_buffered;
  2462.                             m_pQoSSignal_APP->SetValue(pTmp);
  2463.               m_pSignalBus->Send(m_pQoSSignal_APP);
  2464.              HX_RELEASE(pTmp);
  2465.         }
  2466.     }
  2467.     else
  2468.     {
  2469.         memcpy(pAppPkt, &pPkt->m_pAPPItems[0], sizeof(APPItem)); /* Flawfinder: ignore */
  2470.     }
  2471.         }
  2472.         break;
  2473.     
  2474.         default:
  2475.         {
  2476.          DPRINTF(D_INFO, ("RTCP: Don't know this pkt typen"));     
  2477.         }
  2478.          }
  2479.         }
  2480.      // Im responsible of freeing the pkt
  2481.      HX_DELETE(pPkt);
  2482.     }
  2483.     if ((bBye) && (!m_bIsSource))
  2484.     {
  2485. HX_ASSERT(m_streamNumber == m_pDataTransport->m_streamNumber);
  2486. RTSPTransportBuffer* pTransportBuffer = 
  2487.     m_pDataTransport->getTransportBuffer(m_pDataTransport->m_streamNumber);
  2488. if (pTransportBuffer)
  2489. {
  2490.     if (pAppPkt && (APP_EOS == pAppPkt->app_type))
  2491.     {
  2492. pTransportBuffer->SetEndPacket(pAppPkt->seq_no,
  2493.        0,
  2494.        pAppPkt->packet_sent,
  2495.        pAppPkt->timestamp);
  2496.     }
  2497.     else
  2498.     {
  2499. pTransportBuffer->InformSourceStopped();
  2500.     }
  2501. }
  2502. else
  2503. {
  2504.     HX_ASSERT(!"can't find the transport buffer");
  2505.     theErr = HXR_FAIL;
  2506. }
  2507.     }
  2508.     HX_DELETE(pAppPkt);
  2509.     return theErr;
  2510. }
  2511. /*
  2512. *   
  2513. *
  2514. */
  2515. HX_RESULT
  2516. RTCPBaseTransport::makeBye(REF(IHXBuffer*) pSendBuf)
  2517. {
  2518.     HX_ASSERT(m_pDataTransport->m_streamNumber == m_streamNumber);    
  2519.     HX_ASSERT(m_bSendBye);
  2520.     // consider it sent...
  2521.     m_bSendBye = FALSE;
  2522.     
  2523.     HX_RESULT theErr = HXR_FAIL;
  2524. //    IHXBuffer* pSendBuf = NULL;
  2525.     RTCPPacket* pPktSDES = NULL;
  2526.     RTCPPacket* pPktBYE  = NULL;
  2527.     RTCPPacket* pPktAPP  = NULL;
  2528.     HXTimeval rmatv = m_pScheduler->GetCurrentSchedulerTime();
  2529.     UINT32 ulNow = rmatv.tv_sec*1000 + rmatv.tv_usec/1000;
  2530.     Timeval tvNow((INT32) rmatv.tv_sec, (INT32)rmatv.tv_usec);
  2531.     
  2532.     RTCPPacker packer;
  2533.     
  2534.     RTCPPacket* pPktR = new RTCPPacket();
  2535.     if(!pPktR)
  2536.     {
  2537.         theErr = HXR_OUTOFMEMORY;
  2538. goto bail;
  2539.     }
  2540.     if (m_bIsSource)
  2541.     {
  2542. theErr = m_pReportHandler->MakeSR(pPktR, tvNow);
  2543.     }
  2544.     else
  2545.     {
  2546. theErr = m_pReportHandler->MakeRR(pPktR, ulNow);
  2547.     }
  2548.     if (HXR_OK != theErr)
  2549.     {
  2550. // no SR/RR, no RTCP
  2551. goto bail;
  2552.     }
  2553.     pPktSDES = new RTCPPacket();
  2554.     if(!pPktSDES)
  2555.     {
  2556.         theErr = HXR_OUTOFMEMORY;
  2557. goto bail;
  2558.     }
  2559.     theErr = m_pReportHandler->MakeSDES(pPktSDES, m_pcCNAME);
  2560.     if (HXR_OK != theErr)
  2561.     {
  2562. goto bail;
  2563.     }
  2564.     pPktBYE = new RTCPPacket();
  2565.     if(!pPktBYE)
  2566.     {
  2567.         theErr = HXR_OUTOFMEMORY;
  2568. goto bail;
  2569.     }
  2570.     theErr = m_pReportHandler->MakeBye(pPktBYE);
  2571.     if (HXR_OK != theErr)
  2572.     {
  2573. goto bail;
  2574.     }
  2575.     // if it is source, we need to make EOS pkt
  2576.     if (m_bIsSource)
  2577.     {
  2578.      pPktAPP = new RTCPPacket();
  2579.         if(!pPktAPP)
  2580.         {
  2581.             theErr = HXR_OUTOFMEMORY;
  2582.     goto bail;
  2583.         }
  2584.      theErr = m_pReportHandler->MakeEOSApp(pPktAPP);
  2585.      if (HXR_OK != theErr)
  2586.      {
  2587.     goto bail;
  2588.      }   
  2589.     }
  2590.     // pack them up!
  2591.     theErr = m_pCommonClassFactory->CreateInstance(IID_IHXBuffer, 
  2592.    (void**)&pSendBuf);
  2593.     if (HXR_OK != theErr)
  2594.     {
  2595. HX_ASSERT(!pSendBuf);
  2596. goto bail;
  2597.     }
  2598.     packer.Set(pPktR);
  2599.     packer.Set(pPktSDES);
  2600.     packer.Set(pPktBYE);
  2601.     if (m_bIsSource)
  2602.     {
  2603. HX_ASSERT(pPktAPP);
  2604. packer.Set(pPktAPP);
  2605.     }
  2606.     theErr = packer.Pack(pSendBuf);
  2607.            
  2608.     if (HXR_OK != theErr)
  2609.     {
  2610. HX_ASSERT(FALSE && "failed to create Report/BYE RTCP pkt");
  2611. goto bail;
  2612.     }
  2613. bail:
  2614.     HX_DELETE(pPktR);
  2615.     HX_DELETE(pPktSDES);
  2616.     HX_DELETE(pPktBYE);
  2617.     HX_DELETE(pPktAPP);
  2618. //    HX_RELEASE(pSendBuf);
  2619.     return theErr;
  2620. }
  2621. HX_RESULT
  2622. RTCPBaseTransport::makeSenderReport(REF(IHXBuffer*) pSendBuf)
  2623. {
  2624.     // create SR
  2625.     // create SDES
  2626.     // create compound RTCP
  2627.     // send
  2628.     // no reception report on the server
  2629.     // if no pkt has been sent, wait!
  2630.     HX_ASSERT(m_pDataTransport->m_streamNumber == m_streamNumber);    
  2631.     RTSPStreamData* pStreamData = 
  2632.     m_pDataTransport->m_pStreamHandler->getStreamData(m_pDataTransport->m_streamNumber);
  2633.     
  2634.     if(!pStreamData || !pStreamData->m_packetSent)
  2635.     {
  2636. return HXR_FAIL;
  2637.     }
  2638.     HX_ASSERT(pStreamData->m_streamNumber == m_streamNumber);
  2639.     HX_RESULT theErr = HXR_FAIL;
  2640. //    IHXBuffer* pSendBuf = NULL;
  2641.     RTCPPacket* pPktSDES = NULL;
  2642.     HXTimeval rmatv = m_pScheduler->GetCurrentSchedulerTime();
  2643.     UINT32 ulNow = rmatv.tv_sec*1000 + rmatv.tv_usec/1000;
  2644.     Timeval tvNow((INT32) rmatv.tv_sec, (INT32)rmatv.tv_usec);
  2645.     RTCPPacker packer;
  2646.     RTCPPacket* pPktSR = new RTCPPacket();
  2647.     if(!pPktSR)
  2648.     {
  2649.         theErr = HXR_OUTOFMEMORY;
  2650. goto bail;
  2651.     }
  2652.     theErr = m_pReportHandler->MakeSR(pPktSR, tvNow);
  2653.     if (HXR_OK != theErr)
  2654.     {
  2655. goto bail;
  2656.     }
  2657.     
  2658.     pPktSDES = new RTCPPacket();
  2659.     if(!pPktSDES)
  2660.     {
  2661.         theErr = HXR_OUTOFMEMORY;
  2662. goto bail;
  2663.     }
  2664.     theErr = m_pReportHandler->MakeSDES(pPktSDES, m_pcCNAME);
  2665.     if (HXR_OK != theErr)
  2666.     {
  2667. goto bail;
  2668.     }
  2669.     
  2670.     // pack them up!
  2671.     theErr = m_pCommonClassFactory->CreateInstance(IID_IHXBuffer, 
  2672.    (void**)&pSendBuf);
  2673.     if (HXR_OK != theErr)
  2674.     {
  2675. HX_ASSERT(!pSendBuf);
  2676. goto bail;
  2677.     }
  2678.            
  2679.     packer.Set(pPktSR);
  2680.     packer.Set(pPktSDES);
  2681.     theErr = packer.Pack(pSendBuf);
  2682.     if (HXR_OK != theErr)
  2683.     {
  2684. HX_ASSERT(FALSE && "failed to create SR/SDES RTCP pkt");
  2685. goto bail;
  2686.     }
  2687. //    theErr = m_pUDPSocket->WriteTo(m_foreignAddr, m_foreignPort, pSendBuf);
  2688.     m_pReportHandler->UpdateAvgRTCPSize(pSendBuf->GetSize());
  2689.     m_bSendBye = TRUE;
  2690. bail:
  2691.     HX_DELETE(pPktSR);
  2692.     HX_DELETE(pPktSDES);
  2693. //    HX_RELEASE(pSendBuf);
  2694.     return theErr;
  2695. }
  2696. HX_RESULT
  2697. RTCPBaseTransport::makeReceiverReport(REF(IHXBuffer*) pSendBuf)
  2698. {
  2699.     // create RR
  2700.     // create SDES
  2701.     // create BufferInfo
  2702.     // create compund RTCP
  2703.     // send
  2704.     HX_ASSERT(m_pDataTransport->m_streamNumber == m_streamNumber);    
  2705.     HX_RESULT theErr = HXR_FAIL;
  2706. //    IHXBuffer* pSendBuf = NULL;
  2707.     RTCPPacket* pPktSDES = NULL;
  2708.     RTCPPacket* pPktBufInfo = NULL;
  2709.     HXTimeval rmatv = m_pScheduler->GetCurrentSchedulerTime();
  2710.     UINT32 ulNow = rmatv.tv_sec*1000 + rmatv.tv_usec/1000;
  2711.     INT64 llLowTS = 0;
  2712.     INT64 llHighTS = 0;
  2713.     UINT32 ulBytesBuffered = 0;
  2714.     BOOL bDone = FALSE;
  2715.     RTCPPacker packer;
  2716.     RTCPPacket* pPktRR = new RTCPPacket();
  2717.     if(!pPktRR)
  2718.     {
  2719. theErr = HXR_OUTOFMEMORY;
  2720. goto bail;
  2721.     }
  2722.     theErr = m_pReportHandler->MakeRR(pPktRR, ulNow);
  2723.     if (HXR_OK != theErr)
  2724.     {
  2725. goto bail;
  2726.     }
  2727.     
  2728.     pPktSDES = new RTCPPacket();
  2729.     if(!pPktSDES)
  2730.     {
  2731. theErr = HXR_OUTOFMEMORY;
  2732. goto bail;
  2733.     }
  2734.     theErr = m_pReportHandler->MakeSDES(pPktSDES, m_pcCNAME);
  2735.     if (HXR_OK != theErr)
  2736.     {
  2737. goto bail;
  2738.     }
  2739.     pPktBufInfo = new RTCPPacket();
  2740.     
  2741.     // Get buffer info from m_pSrcBufferStats
  2742.     if (!m_pSrcBufferStats || !m_pReportHandler ||
  2743. HXR_OK != m_pSrcBufferStats->GetTotalBuffering(m_streamNumber, 
  2744.        llLowTS, llHighTS,
  2745.        ulBytesBuffered,
  2746.        bDone) ||
  2747. HXR_OK != m_pReportHandler->MakeBufInfoApp(pPktBufInfo, 
  2748.    INT64_TO_UINT32(llLowTS), 
  2749.    INT64_TO_UINT32(llHighTS),
  2750.    ulBytesBuffered))
  2751.     {
  2752. // If we failed for some reason,
  2753. // just delete the packet so that
  2754. // it doesn't get included in the
  2755. // compound packet. Failing to
  2756. // report buffer info is not a 
  2757. // critical error
  2758. HX_DELETE(pPktBufInfo);
  2759.     }
  2760.     // pack them up!
  2761.     theErr = m_pCommonClassFactory->CreateInstance(IID_IHXBuffer, 
  2762.    (void**)&pSendBuf);
  2763.     if (HXR_OK != theErr)
  2764.     {
  2765. HX_ASSERT(!pSendBuf);
  2766. goto bail;
  2767.     }
  2768.     packer.Set(pPktRR);
  2769.     packer.Set(pPktSDES);
  2770.     if (pPktBufInfo)
  2771.     {
  2772. packer.Set(pPktBufInfo);
  2773.     }
  2774.     theErr = packer.Pack(pSendBuf);
  2775.     
  2776.     if (HXR_OK != theErr)
  2777.     {
  2778. HX_ASSERT(FALSE && "failed to create SR/SDES RTCP pkt");
  2779. goto bail;
  2780.     }
  2781. //    theErr = m_pUDPSocket->WriteTo(m_foreignAddr, m_foreignPort, pSendBuf);
  2782.     m_pReportHandler->UpdateAvgRTCPSize(pSendBuf->GetSize());
  2783.     m_bSendBye = TRUE;
  2784. bail:
  2785.     HX_DELETE(pPktRR);
  2786.     HX_DELETE(pPktSDES);
  2787.     HX_DELETE(pPktBufInfo);
  2788. //    HX_RELEASE(pSendBuf);
  2789.     return theErr;
  2790. }
  2791. RTCPBaseTransport::ReportCallback::ReportCallback(RTCPBaseTransport* pTransport):
  2792.     m_pTransport(pTransport),
  2793.     m_lReportRefCount(0)
  2794. {
  2795.     if(m_pTransport)
  2796.     {
  2797. m_pTransport->AddRef();
  2798.     }
  2799. }
  2800. RTCPBaseTransport::ReportCallback::~ReportCallback()
  2801. {
  2802.     HX_RELEASE(m_pTransport);
  2803. }
  2804. STDMETHODIMP
  2805. RTCPBaseTransport::ReportCallback::QueryInterface(REFIID riid, void** ppvObj)
  2806. {
  2807.     if (IsEqualIID(riid, IID_IUnknown))
  2808.     {
  2809.         AddRef();
  2810.         *ppvObj = this;
  2811.         return HXR_OK;
  2812.     }
  2813.     else if (IsEqualIID(riid, IID_IHXCallback))
  2814.     {
  2815.         AddRef();
  2816.         *ppvObj = (IHXCallback*)this;
  2817.         return HXR_OK;
  2818.     }
  2819.     *ppvObj = NULL;
  2820.     return HXR_NOINTERFACE;
  2821. }
  2822. STDMETHODIMP_(UINT32)
  2823. RTCPBaseTransport::ReportCallback::AddRef()
  2824. {
  2825.     return InterlockedIncrement(&m_lReportRefCount);
  2826. }
  2827. STDMETHODIMP_(UINT32)
  2828. RTCPBaseTransport::ReportCallback::Release()
  2829. {
  2830.     if(InterlockedDecrement(&m_lReportRefCount) > 0)
  2831.     {
  2832. return m_lReportRefCount;
  2833.     }
  2834.     delete this;
  2835.     return 0;
  2836. }
  2837. STDMETHODIMP
  2838. RTCPBaseTransport::ReportCallback::Func()
  2839. {
  2840.     HX_ASSERT(!m_pTransport->m_bSendReport);
  2841.     HX_ASSERT(m_pTransport->m_bCallbackPending);
  2842.     m_pTransport->m_bCallbackPending = FALSE;
  2843.     if (m_pTransport->m_bSendRTCP)
  2844.     {
  2845. m_pTransport->m_bSendReport = TRUE;
  2846.     }
  2847.     return HXR_OK;
  2848. }
  2849. /*
  2850.  *  RTCP UDP
  2851.  */
  2852. RTCPUDPTransport::RTCPUDPTransport(BOOL bIsSource)
  2853.     : RTCPBaseTransport(bIsSource)
  2854.     , m_pUDPSocket(NULL)
  2855.     , m_foreignAddr(0)
  2856.     , m_foreignPort(0)
  2857.     , m_ulCurrentMulticastAddress(0)
  2858.     , m_ulCurrentMulticastPort(0)
  2859.     , m_pMCastUDPSocket(NULL)
  2860. {
  2861. }
  2862. RTCPUDPTransport::~RTCPUDPTransport()
  2863. {
  2864.     Done();
  2865. }
  2866. void
  2867. RTCPUDPTransport::Done()
  2868. {    
  2869.     if (m_bSendBye)
  2870.     {
  2871. sendBye();
  2872.     }
  2873.     m_keepAlive.reset();
  2874.     if (m_pMCastUDPSocket)
  2875.     {
  2876.         m_pMCastUDPSocket->LeaveMulticastGroup(m_ulCurrentMulticastAddress, HXR_INADDR_ANY);
  2877.     }
  2878.     HX_RELEASE(m_pMCastUDPSocket);
  2879.     HX_RELEASE(m_pUDPSocket);
  2880.     HX_RELEASE(m_pDataTransport);
  2881.     RTCPBaseTransport::Done();
  2882. }
  2883. RTSPTransportTypeEnum
  2884. RTCPUDPTransport::tag()
  2885. {
  2886.     return RTSP_TR_RTCP;
  2887. }
  2888. HX_RESULT
  2889. RTCPUDPTransport::init(IUnknown* pContext,
  2890.     IHXUDPSocket* pSocket,
  2891.     RTPUDPTransport* pDataTransport,
  2892.     IHXRTSPTransportResponse* pResp,
  2893.     UINT16 streamNumber)     
  2894. {
  2895.     m_pUDPSocket = pSocket;
  2896.     m_pUDPSocket->AddRef();
  2897.     m_pDataTransport = pDataTransport;
  2898.     m_pDataTransport->AddRef();
  2899.     m_pResp = pResp;
  2900.     pResp->AddRef();
  2901.     m_streamNumber = streamNumber;
  2902.     /* Set DiffServ Code Point */
  2903.     IHXSetSocketOption* pOpt = NULL;
  2904.     if (SUCCEEDED(m_pUDPSocket->QueryInterface(IID_IHXSetSocketOption, (void**)&pOpt)))
  2905.     {
  2906. IHXQoSDiffServConfigurator* pCfg = NULL;
  2907. if (SUCCEEDED(pContext->QueryInterface(IID_IHXQoSDiffServConfigurator, (void**)&pCfg)))
  2908. {
  2909.     pCfg->ConfigureSocket(pOpt, HX_QOS_DIFFSERV_CLASS_CONTROL);
  2910.     pCfg->Release();
  2911.     pCfg = NULL;
  2912. }
  2913. pOpt->Release();
  2914. pOpt = NULL;
  2915.     }
  2916.     
  2917.     HX_RESULT hresult = Init(pContext);
  2918.     if(HXR_OK != hresult)
  2919.     {
  2920. return hresult;
  2921.     }
  2922.     RTCPBaseTransport::init();
  2923.     
  2924.     return HXR_OK;
  2925. }
  2926. void
  2927. RTCPUDPTransport::setForeignAddress(UINT32 foreignAddr, UINT16 foreignPort)
  2928. {
  2929.     m_foreignAddr = foreignAddr;
  2930.     m_foreignPort = foreignPort;
  2931.     UINT32 natTimeout = GetNATTimeout(m_pContext);
  2932.     if (!m_bIsSource && natTimeout)
  2933.     {
  2934. // Initialize keepalive object
  2935. m_keepAlive.Init(m_pScheduler, natTimeout, new KeepAliveCB(this));
  2936.     
  2937. // Do initial "poke" through the NAT
  2938. onNATKeepAlive();
  2939.     }
  2940. }
  2941. HX_RESULT RTCPUDPTransport::handlePacket(IHXBuffer* pBuffer)
  2942. {
  2943.     m_keepAlive.OnActivity();
  2944.     return RTCPBaseTransport::handlePacket(pBuffer);
  2945. }
  2946. void 
  2947. RTCPUDPTransport::JoinMulticast(UINT32 ulAddress, UINT32 ulPort, IHXUDPSocket* pUDP)
  2948. {
  2949.     if (m_ulCurrentMulticastAddress)
  2950.     {
  2951. m_pMCastUDPSocket->LeaveMulticastGroup(m_ulCurrentMulticastAddress, HXR_INADDR_ANY);
  2952.     }
  2953.     else
  2954.     {
  2955. m_pMCastUDPSocket = pUDP;
  2956.         m_pMCastUDPSocket->AddRef();
  2957.     }
  2958.     m_pMCastUDPSocket->JoinMulticastGroup(ulAddress, HXR_INADDR_ANY);
  2959.     m_bMulticast = TRUE;
  2960.     m_ulCurrentMulticastAddress = ulAddress;
  2961.     m_ulCurrentMulticastPort = ulPort;
  2962.     if (m_pStreamHandler)
  2963.     {
  2964. RTSPStreamData* pStreamData = m_pStreamHandler->firstStreamData();
  2965. ASSERT(pStreamData);
  2966. while(pStreamData)
  2967. {
  2968.     pStreamData->m_pTransportBuffer->SetMulticast();
  2969.     pStreamData = m_pStreamHandler->nextStreamData();
  2970. }
  2971.     }
  2972.     return;
  2973. }
  2974. HX_RESULT RTCPUDPTransport::onNATKeepAlive()
  2975. {
  2976.     DPRINTF(D_INFO, ("RTCP: onNATKeepAlive()n"));
  2977.     if (m_bSendRTCP)
  2978.     {
  2979. // Send an early receiver report to keep
  2980. // the NAT port open
  2981. sendReceiverReport();
  2982.     }
  2983.     return HXR_OK;
  2984. }
  2985. HX_RESULT
  2986. RTCPUDPTransport::streamDone(UINT16 streamNumber)
  2987. {
  2988.     HX_ASSERT(streamNumber == m_streamNumber);
  2989.     HX_ASSERT(streamNumber == m_pDataTransport->m_streamNumber);
  2990.     // this will be called from RTPUDPTransport::streamDone();
  2991.     if (m_bSendBye)
  2992.     {
  2993. sendBye();
  2994.     }
  2995.     return HXR_OK;
  2996. }
  2997. /*
  2998.  *  We don't really konw what this RTCP pkt is...Simply reflect.
  2999.  */
  3000. HX_RESULT
  3001. RTCPUDPTransport::reflectRTCP(IHXBuffer* pSendBuf)
  3002. {
  3003.     HX_ASSERT(pSendBuf);
  3004.     return m_pUDPSocket->WriteTo(m_foreignAddr, m_foreignPort, pSendBuf);    
  3005. }
  3006. HX_RESULT
  3007. RTCPUDPTransport::sendSenderReport()
  3008. {
  3009.     HX_ASSERT(m_bIsSource);
  3010.     HX_RESULT theErr;
  3011.     IHXBuffer* pSendBuf = NULL;
  3012.     theErr = makeSenderReport(pSendBuf);
  3013.     if (HXR_OK == theErr)
  3014.     {
  3015. HX_ASSERT(pSendBuf);
  3016. theErr = m_pUDPSocket->WriteTo(m_foreignAddr, m_foreignPort, pSendBuf);
  3017.     }
  3018.     HX_RELEASE(pSendBuf);
  3019.     return theErr;
  3020. }
  3021. HX_RESULT
  3022. RTCPUDPTransport::sendReceiverReport()
  3023. {
  3024.     HX_ASSERT(!m_bIsSource);
  3025.     HX_RESULT theErr;
  3026.     IHXBuffer* pSendBuf = NULL;
  3027.     theErr = makeReceiverReport(pSendBuf);
  3028.     if (HXR_OK == theErr)
  3029.     {
  3030. HX_ASSERT(pSendBuf);
  3031. theErr = m_pUDPSocket->WriteTo(m_foreignAddr, m_foreignPort, pSendBuf);
  3032.     }
  3033.     HX_RELEASE(pSendBuf);
  3034.     return theErr;
  3035. }
  3036. HX_RESULT
  3037. RTCPUDPTransport::sendBye()
  3038. {
  3039.     HX_RESULT theErr;
  3040.     IHXBuffer* pSendBuf = NULL;
  3041.     theErr = makeBye(pSendBuf);
  3042.     if (HXR_OK == theErr)
  3043.     {
  3044. HX_ASSERT(pSendBuf);
  3045.      if (m_bIsSource)
  3046.      {
  3047.     // we don't want this to get lost since a client will request for 
  3048.     // TEARDOWN upon a reception of this report.
  3049.     for (UINT32 i = 0; i < 5 && HXR_OK == theErr; i++)
  3050.     {
  3051.      theErr = m_pUDPSocket->WriteTo(m_foreignAddr, m_foreignPort, pSendBuf);
  3052.     }     
  3053.      }
  3054.      else
  3055.      {
  3056.     theErr = m_pUDPSocket->WriteTo(m_foreignAddr, m_foreignPort, pSendBuf);
  3057.      }
  3058.     }
  3059.     HX_RELEASE(pSendBuf);
  3060.     return theErr;
  3061. }
  3062. RTCPUDPTransport::KeepAliveCB::KeepAliveCB(RTCPUDPTransport* pTransport):
  3063.     m_pTransport(pTransport),
  3064.     m_lRefCount(0)
  3065. {
  3066.     if(m_pTransport)
  3067.     {
  3068. m_pTransport->AddRef();
  3069.     }
  3070. }
  3071. RTCPUDPTransport::KeepAliveCB::~KeepAliveCB()
  3072. {
  3073.     HX_RELEASE(m_pTransport);
  3074. }
  3075. STDMETHODIMP
  3076. RTCPUDPTransport::KeepAliveCB::QueryInterface(REFIID riid, void** ppvObj)
  3077. {
  3078.     if (IsEqualIID(riid, IID_IUnknown))
  3079.     {
  3080.         AddRef();
  3081.         *ppvObj = this;
  3082.         return HXR_OK;
  3083.     }
  3084.     else if (IsEqualIID(riid, IID_IHXCallback))
  3085.     {
  3086.         AddRef();
  3087.         *ppvObj = (IHXCallback*)this;
  3088.         return HXR_OK;
  3089.     }
  3090.     *ppvObj = NULL;
  3091.     return HXR_NOINTERFACE;
  3092. }
  3093. STDMETHODIMP_(UINT32)
  3094. RTCPUDPTransport::KeepAliveCB::AddRef()
  3095. {
  3096.     return InterlockedIncrement(&m_lRefCount);
  3097. }
  3098. STDMETHODIMP_(UINT32)
  3099. RTCPUDPTransport::KeepAliveCB::Release()
  3100. {
  3101.     if(InterlockedDecrement(&m_lRefCount) > 0)
  3102.     {
  3103. return m_lRefCount;
  3104.     }
  3105.     delete this;
  3106.     return 0;
  3107. }
  3108. STDMETHODIMP
  3109. RTCPUDPTransport::KeepAliveCB::Func()
  3110. {
  3111.     if (m_pTransport)
  3112.     {
  3113. m_pTransport->onNATKeepAlive();
  3114.     }
  3115.     return HXR_OK;
  3116. }
  3117. /*
  3118.  *  RTCP TCP
  3119.  */
  3120. RTCPTCPTransport::RTCPTCPTransport(BOOL bIsSource)
  3121.     : RTCPBaseTransport(bIsSource)
  3122.     , m_pTCPSocket(NULL)
  3123.     , m_tcpInterleave((INT8)0xFF)
  3124. {
  3125. }
  3126. RTCPTCPTransport::~RTCPTCPTransport()
  3127. {
  3128.     Done();
  3129. }
  3130. void
  3131. RTCPTCPTransport::Done()
  3132. {    
  3133.     if (m_bSendBye)
  3134.     {
  3135. sendBye();
  3136.     }
  3137.     HX_RELEASE(m_pTCPSocket);
  3138.     HX_RELEASE(m_pDataTransport);
  3139.     RTCPBaseTransport::Done();
  3140. }
  3141. RTSPTransportTypeEnum
  3142. RTCPTCPTransport::tag()
  3143. {
  3144.     return RTSP_TR_RTCP;
  3145. }
  3146. HX_RESULT
  3147. RTCPTCPTransport::init(IUnknown* pContext,
  3148.     IHXTCPSocket* pSocket,
  3149.     RTPTCPTransport* pDataTransport,
  3150.     IHXRTSPTransportResponse* pResp,
  3151.     UINT16 streamNumber)     
  3152. {
  3153.     m_pTCPSocket = pSocket;
  3154.     m_pTCPSocket->AddRef();
  3155.     m_pDataTransport = pDataTransport;
  3156.     m_pDataTransport->AddRef();
  3157.     
  3158.     m_pResp = pResp;
  3159.     m_pResp->AddRef();
  3160.     m_streamNumber = streamNumber;
  3161.     /* Set DiffServ Code Point */
  3162.     IHXSetSocketOption* pOpt = NULL;
  3163.     if (SUCCEEDED(m_pTCPSocket->QueryInterface(IID_IHXSetSocketOption, (void**)&pOpt)))
  3164.     {
  3165. IHXQoSDiffServConfigurator* pCfg = NULL;
  3166. if (SUCCEEDED(pContext->QueryInterface(IID_IHXQoSDiffServConfigurator, (void**)&pCfg)))
  3167. {
  3168.     pCfg->ConfigureSocket(pOpt, HX_QOS_DIFFSERV_CLASS_CONTROL);
  3169.     pCfg->Release();
  3170.     pCfg = NULL;
  3171. }
  3172. pOpt->Release();
  3173. pOpt = NULL;
  3174.     }
  3175.     
  3176.     HX_RESULT hresult = Init(pContext);
  3177.     if(HXR_OK != hresult)
  3178.     {
  3179. return hresult;
  3180.     }
  3181.     RTCPBaseTransport::init();
  3182.     
  3183.     return HXR_OK;
  3184. }
  3185. HX_RESULT
  3186. RTCPTCPTransport::streamDone(UINT16 streamNumber)
  3187. {
  3188.     HX_ASSERT(streamNumber == m_streamNumber);
  3189.     HX_ASSERT(streamNumber == m_pDataTransport->m_streamNumber);
  3190.     // this will be called from RTPUDPTransport::streamDone();
  3191.     if (m_bSendBye)
  3192.     {
  3193. sendBye();
  3194.     }
  3195.     return HXR_OK;
  3196. }
  3197. HX_RESULT
  3198. RTCPTCPTransport::reflectRTCP(IHXBuffer* pSendBuf)
  3199. {
  3200.     HX_ASSERT(pSendBuf);
  3201.     HX_RESULT theErr = writePacket(pSendBuf);    
  3202.     if (theErr)
  3203.     {
  3204. m_pResp->OnProtocolError(HXR_NET_SOCKET_INVALID);
  3205.     }
  3206.     return theErr;
  3207. }
  3208. HX_RESULT
  3209. RTCPTCPTransport::sendSenderReport()
  3210. {
  3211.     HX_RESULT theErr;
  3212.     IHXBuffer* pSendBuf = NULL;
  3213.     theErr = makeSenderReport(pSendBuf);
  3214.     if (HXR_OK == theErr)
  3215.     {
  3216. HX_ASSERT(pSendBuf);
  3217. theErr = writePacket(pSendBuf);
  3218.      if(theErr)
  3219.      {
  3220.     m_pResp->OnProtocolError(HXR_NET_SOCKET_INVALID);
  3221.      }
  3222.     }
  3223.     HX_RELEASE(pSendBuf);
  3224.     return theErr;
  3225. }
  3226. HX_RESULT
  3227. RTCPTCPTransport::sendReceiverReport()
  3228. {
  3229.     HX_RESULT theErr;
  3230.     IHXBuffer* pSendBuf = NULL;
  3231.     theErr = makeReceiverReport(pSendBuf);
  3232.     if (HXR_OK == theErr)
  3233.     {
  3234. HX_ASSERT(pSendBuf);
  3235. theErr = writePacket(pSendBuf);
  3236.      if(theErr)
  3237.      {
  3238.     m_pResp->OnProtocolError(HXR_NET_SOCKET_INVALID);
  3239.      }
  3240.     }
  3241.     HX_RELEASE(pSendBuf);
  3242.     return theErr;
  3243. }
  3244. HX_RESULT
  3245. RTCPTCPTransport::sendBye()
  3246. {
  3247.     HX_RESULT theErr;
  3248.     IHXBuffer* pSendBuf = NULL;
  3249.     theErr = makeBye(pSendBuf);
  3250.     if (HXR_OK == theErr)
  3251.     {
  3252. HX_ASSERT(pSendBuf);
  3253. theErr = writePacket(pSendBuf);
  3254. /*
  3255.  * this write will fail if a client initiated a teardown before the end 
  3256.  * of a clip because by the time we send BYE, a sock is gone!  So, don't
  3257.  * worry about return code here.
  3258.  */
  3259.     }
  3260.     HX_RELEASE(pSendBuf);
  3261.     return theErr;
  3262. }
  3263. HX_RESULT
  3264. RTCPTCPTransport::writePacket(IHXBuffer* pBuf)
  3265. {
  3266.     if (!m_pTCPSocket)
  3267.         return HXR_FAIL;
  3268.     // need to put $00[datalen] in front of packet data    
  3269.     HX_ASSERT(pBuf);
  3270.     UINT32 dataLen = pBuf->GetSize();
  3271.     if(dataLen > 0xffff)
  3272.     {
  3273. return HXR_FAIL;
  3274.     }
  3275.     //XXXTDM: always true, m_tcpInteleave is signed (why?)
  3276.     //HX_ASSERT(0xFF != m_tcpInterleave);
  3277.     IHXBuffer* pHeader = NULL;
  3278.     m_pCommonClassFactory->CreateInstance(IID_IHXBuffer, 
  3279.                                           (void**)&pHeader);
  3280.     BYTE* pHeaderData;
  3281.     if(!pHeader)
  3282.     {
  3283.         return HXR_OUTOFMEMORY;
  3284.     }
  3285.     pHeader->SetSize(4);
  3286.     pHeaderData = pHeader->GetBuffer();
  3287.     pHeaderData[0] = '$';
  3288.     pHeaderData[1] = m_tcpInterleave;
  3289.     putshort(&pHeaderData[2], (UINT16)dataLen);
  3290.     HX_RESULT rc;
  3291.     rc = m_pTCPSocket->Write(pHeader);
  3292.     if (SUCCEEDED(rc))
  3293.     {
  3294.         rc = m_pTCPSocket->Write(pBuf);
  3295.     }
  3296.     pHeader->Release();
  3297.     return rc;
  3298. }