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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: transbuf.cpp,v 1.14.2.2 2004/07/09 02:04:41 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include "debug.h"
  50. #include "hxcom.h"
  51. #include "hxtypes.h"
  52. #include "hxstring.h"
  53. #include "hxslist.h"
  54. #include "hxdeque.h"
  55. #include "hxbitset.h"
  56. #include "hxmap.h"
  57. #include "hxengin.h"
  58. #include "ihxpckts.h"
  59. #include "basepkt.h"
  60. #include "mimehead.h"
  61. #include "rtspmsg.h"
  62. #include "servrsnd.h"
  63. #include "transbuf.h"
  64. #include "rtspif.h"
  65. #include "rtsptran.h"
  66. #include "hxtick.h"
  67. #include "hxheap.h"
  68. #ifdef _DEBUG
  69. #undef HX_THIS_FILE             
  70. static const char HX_THIS_FILE[] = __FILE__;
  71. #endif
  72. //These defines control when we stop waiting for an out of order
  73. //packet and just send a NAK for it. The two conditions are a timeout
  74. //and the number of packets, with higher sequence numbers, that come
  75. //after it.  For the timeout we have choosen 500ms for now. This
  76. //number should be based off of the RTT but we currently do not have
  77. //that information.
  78. #define NAK_TIMEOUT 500
  79. #define REORDER_TOLERANCE 3
  80. //This is how often to check to see if we have exceeded our NAK_TIMEOUT
  81. //for the packets in our pending queue.
  82. #define NAK_CHECK_INTERVAL 100
  83. // Pending Packet Methods
  84. PendingPacket::PendingPacket(UINT32 ulSeqNo, UINT32 arrivalTime)
  85.     : m_ulSequenceNumber(ulSeqNo),
  86.       m_ulNumPktsBehind(0),
  87.       m_ulArrivalTime(arrivalTime)
  88. {
  89. }
  90. PendingPacket::~PendingPacket()
  91. {};
  92. /*
  93.  * Keep the deque under 16k
  94.  */
  95. const UINT16 MAX_BITSET_SIZE = 384;
  96. const UINT16 MIN_NETWORK_JITTER_MSECS = 2000;
  97. const UINT16 MAX_QUEUED_PACKETS = 500;
  98. RTSPTransportBuffer::RTSPTransportBuffer(
  99.     RTSPTransport* owner,
  100.     UINT16 streamNumber,
  101.     UINT32 bufferDuration,
  102.     UINT32 maxBufferDuration,
  103.     UINT32 growthRate,
  104.     UINT32 wrapSequenceNumber
  105. ) : m_pOwner(owner),
  106.     m_uStreamNumber(streamNumber),
  107.     m_bufferDuration(bufferDuration),
  108.     m_maxBufferDuration(maxBufferDuration),
  109.     m_growthRate(growthRate),
  110.     m_wrapSequenceNumber(wrapSequenceNumber),
  111.     m_status(TRANSBUF_INITIALIZING),
  112.     m_bIsInitialized(FALSE),
  113.     m_bWaitingForSeekFlush(FALSE),
  114.     m_bWaitingForLiveSeekFlush(FALSE),
  115.     m_bFlushHolding(FALSE),
  116.     m_bIsEnded(FALSE),
  117.     m_bQueueIsEmpty(TRUE),
  118.     m_bCacheIsEmpty(TRUE),
  119.     m_bStreamBegin(FALSE),
  120.     m_bStreamDone(FALSE),
  121.     m_bStreamDoneSent(FALSE),
  122.     m_bSourceStopped(FALSE),
  123.     m_bExpectedTSRangeSet(FALSE),
  124.     m_uStartTimestamp(0),
  125.     m_uEndTimestamp(0),
  126.     m_ulEndDelayTolerance(0),
  127.     m_bACKDone(FALSE),
  128.     m_bPaused(FALSE),
  129.     m_bPausedHack(FALSE),
  130.     m_uReliableSeqNo(0),
  131.     m_uEndReliableSeqNo(0),
  132.     m_uFirstSequenceNumber(0),
  133.     m_uLastSequenceNumber(0),
  134.     m_uEndSequenceNumber(0),
  135.     m_uSeekSequenceNumber(0),
  136.     m_uSeekCount(0),
  137.     m_uNormal(0),
  138.     m_ulDuplicate(0),
  139.     m_ulOutOfOrder(0),
  140.     m_uLost(0),
  141.     m_uLate(0),
  142.     m_uResendRequested(0),
  143.     m_uResendReceived(0),
  144.     m_uByteCount(0),
  145.     m_uLastByteCount(0),
  146.     m_uAvgBandwidth(0),
  147.     m_uCurBandwidth(0),
  148.     m_ulLastLost30(0),
  149.     m_ulLastTotal30(0),
  150.     m_ulTSRollOver(0),
  151.     m_bPacketsStarted(FALSE),
  152.     m_ulIndex30(0),
  153.     m_uLastTimestamp(0),
  154.     m_ulCurrentQueueByteCount(0),
  155.     m_ulCurrentCacheByteCount(0),
  156.     m_bAtLeastOnePacketReceived(FALSE),
  157.     m_bAtLeastOneResetHandled(FALSE),
  158.     m_ulFirstTimestampReceived(0),
  159.     m_ulLastTimestampReceived(0),
  160.     m_ulBufferingStartTime(0),
  161.     m_ulLastGrowTime(HX_GET_TICKCOUNT()),
  162.     m_bMulticast(FALSE),
  163.     m_bMulticastReset(TRUE),
  164.     m_bIsLive(FALSE),
  165.     m_bSparseStream(FALSE),
  166.     m_pScheduler(NULL),
  167.     m_bMulticastReliableSeqNoSet(FALSE),
  168.     m_bPrefetch(FALSE),
  169.     m_bFastStart(FALSE),
  170.     m_pFIFOCache(NULL),
  171.     m_ulFrontTimeStampCached(0),
  172.     m_ulRearTimeStampCached(0),
  173.     m_ulByteLimit(0)
  174.     ,m_CallbackHandle(0)
  175.     ,m_pCallBack(NULL)
  176. {
  177.     InitTimer();
  178.     int j = 0;
  179.     for (j = 0; j < 30; j++)
  180.     {
  181.         m_ulTotal30[j] = 0;
  182.         m_ulLost30[j] = 0;
  183.     }
  184.     m_pPacketDeque = new HX_deque(INITIAL_DEQUE_SIZE);
  185.     m_pCallBack = new RTSPTransportBufferCallback(this);
  186.     m_pCallBack->AddRef();
  187. #ifdef THREADS_SUPPORTED
  188.     HXMutex::MakeMutex(m_pPendingLock);
  189. #else
  190.     HXMutex::MakeStubMutex(m_pPendingLock);
  191. #endif
  192. }
  193. RTSPTransportBuffer::~RTSPTransportBuffer()
  194. {
  195.     CHXSimpleList::Iterator i;
  196.     ClientPacket* pPacket;
  197.     //Clean up our pending packet que.
  198.     m_pPendingLock->Lock();
  199.     while( !m_PendingPackets.IsEmpty() )
  200.     {
  201.         PendingPacket* pPend = (PendingPacket*)m_PendingPackets.RemoveHead();
  202.         HX_DELETE(pPend);
  203.     }
  204.     //Get rid of any scheduler events...
  205.     if (m_pScheduler && m_CallbackHandle)
  206.     {
  207.         m_pScheduler->Remove(m_CallbackHandle);
  208.     }
  209.     m_CallbackHandle = 0;
  210.     if( m_pCallBack )
  211.         m_pCallBack->Clear();
  212.     
  213.     HX_RELEASE( m_pCallBack );
  214.     m_pPendingLock->Unlock();
  215.     for (i = m_pHoldList.Begin(); i != m_pHoldList.End(); ++i)
  216.     {
  217.         pPacket = (ClientPacket*)(*i);
  218.         HX_RELEASE(pPacket);
  219.     }
  220.     m_pHoldList.RemoveAll();
  221.     while(!m_pPacketDeque->empty())
  222.     {
  223.         pPacket = (ClientPacket*)m_pPacketDeque->pop_front();
  224.         HX_RELEASE(pPacket);
  225.     }
  226.     HX_RELEASE(m_pScheduler);
  227.     HX_DELETE(m_pPendingLock);
  228.     HX_DELETE(m_pPacketDeque);
  229. #if defined(HELIX_FEATURE_FIFOCACHE)    
  230.     HX_RELEASE(m_pFIFOCache);
  231. #endif
  232. }
  233. void
  234. RTSPTransportBuffer::Reset()
  235. {
  236.     m_status = TRANSBUF_INITIALIZING;
  237.     if (m_bAtLeastOneResetHandled)
  238.     {
  239.         m_uSeekCount++;
  240.         m_bIsEnded = FALSE;
  241.         m_bStreamDone = FALSE;
  242.         m_bStreamDoneSent = FALSE;
  243.         m_bSourceStopped = FALSE;
  244.     }
  245.     else
  246.     {
  247.         m_bAtLeastOneResetHandled   = TRUE;
  248.         m_ulBufferingStartTime      = HX_GET_TICKCOUNT();
  249.     }
  250.     m_ulTSRollOver = 0;
  251.     m_bAtLeastOnePacketReceived = FALSE;
  252.     m_uLastTimestamp         = 0;
  253.     m_bExpectedTSRangeSet = FALSE;
  254.     m_uStartTimestamp = 0;
  255.     m_uEndTimestamp = 0;
  256.     m_ulEndDelayTolerance = 0;
  257. }
  258. void
  259. RTSPTransportBuffer::Grow()
  260. {
  261.     UINT32 ulCurrentTime = HX_GET_TICKCOUNT();
  262.     /* Check to not grow fast in case we get multiple late
  263.      * packets at around the same time.
  264.     */
  265.     if (CALCULATE_ELAPSED_TICKS(m_ulLastGrowTime, ulCurrentTime) >= 
  266.         m_growthRate)
  267.     {
  268.         m_ulLastGrowTime = HX_GET_TICKCOUNT();
  269.         if (m_bufferDuration + m_growthRate <= m_maxBufferDuration)
  270.         {
  271.             m_bufferDuration += m_growthRate;
  272.         }
  273.     }
  274. }
  275. HX_RESULT
  276. RTSPTransportBuffer::Init(UINT16 uSeqNo)
  277. {
  278.     /*
  279.      * The server side of an encoding session will initialize the scheduler
  280.      * here
  281.      */
  282.     if (!m_pScheduler)
  283.     {
  284.         InitTimer();
  285.     }
  286.     HX_ASSERT(m_pScheduler != NULL);
  287.     if (!m_bIsInitialized)
  288.     {
  289.         m_bIsInitialized = TRUE;
  290.         m_uACKSequenceNumber   =
  291.         m_uFirstSequenceNumber =
  292.         m_uLastSequenceNumber  = uSeqNo;
  293.         if (m_uSeekCount > 0)
  294.         {
  295.             return HXR_OK;
  296.         }
  297.     }
  298.     else if (m_uSeekCount)
  299.     {
  300.         m_uSeekCount--;
  301.         if (m_uSeekCount > 0)
  302.         {
  303.             return HXR_OK;
  304.         }
  305.         m_uSeekSequenceNumber = uSeqNo;
  306.         m_bWaitingForSeekFlush = TRUE;
  307.     }
  308.     m_status = TRANSBUF_READY;
  309.     /*
  310.      * Now add any packets that arrived before initialization
  311.      */
  312.     m_bStreamBegin = TRUE;
  313.     CHXSimpleList::Iterator i;
  314.     for (i = m_pHoldList.Begin(); i != m_pHoldList.End(); ++i)
  315.     {
  316.         ClientPacket* pPacket = (ClientPacket*)(*i);
  317.         Add(pPacket);
  318.     }
  319.     m_pHoldList.RemoveAll();
  320.     m_bStreamBegin = FALSE;
  321.     return HXR_OK;
  322. }
  323. HX_RESULT
  324. RTSPTransportBuffer::Add(ClientPacket* pPacket)
  325. {
  326.     if (!m_pPacketDeque)
  327.     {
  328.         HX_RELEASE(pPacket);
  329.         return HXR_FAIL;
  330.     }
  331.     else if (m_pPacketDeque->size() >= MAX_DEQUE_SIZE)
  332.     {
  333.         m_pOwner->HandleBufferError();
  334.         
  335.         HX_RELEASE(pPacket);
  336.         return HXR_FAIL;
  337.     }
  338.     else if (m_bStreamDone)
  339.     {
  340.         /*
  341.          * If we have already returned the last packet, then don't bother
  342.          * trying to add anymore
  343.          */
  344.         HX_RELEASE(pPacket);
  345.         return HXR_OK;
  346.     }
  347.     else if (!m_bIsInitialized || m_uSeekCount)
  348.     {
  349.         /*
  350.          * Until the first sequence number is set, just hold the packets
  351.          * as they arrive
  352.          */
  353. #if defined(HELIX_FEATURE_TRANSPORT_MULTICAST)
  354.         if (m_bMulticast && m_bMulticastReset)
  355.         {
  356.             //We are going to destroy all our place holders so clean up the
  357.             //pending queue as well.
  358.             m_pPendingLock->Lock();
  359.             while( !m_PendingPackets.IsEmpty() )
  360.             {
  361.                 PendingPacket* pPend = (PendingPacket*)m_PendingPackets.RemoveHead();
  362.                 HX_DELETE(pPend);
  363.             }
  364.             //Get rid of any scheduler events...
  365.             if (m_pScheduler && m_CallbackHandle)
  366.             {
  367.                 m_pScheduler->Remove(m_CallbackHandle);
  368.             }
  369.             m_CallbackHandle = 0;
  370.             if( m_pCallBack )
  371.                 m_pCallBack->Clear();
  372.             HX_RELEASE( m_pCallBack );
  373.             m_pPendingLock->Unlock();
  374.             /* Destruct and recreate the packet queue */
  375.             /* XXXSMP ...but it works */
  376.             ClientPacket *pTmpPacket = NULL;
  377.             while(!m_pPacketDeque->empty())
  378.             {
  379.                 pTmpPacket = (ClientPacket*)m_pPacketDeque->pop_front();
  380.                 HX_RELEASE(pTmpPacket);
  381.             }
  382.             HX_DELETE(m_pPacketDeque);
  383.             m_pPacketDeque = new HX_deque(INITIAL_DEQUE_SIZE);
  384.             m_bMulticastReset = FALSE;
  385.             m_bIsInitialized = FALSE;
  386.             m_bWaitingForSeekFlush = FALSE;
  387.             m_bWaitingForLiveSeekFlush = FALSE;
  388.             m_bFlushHolding = FALSE;
  389.             m_bIsEnded = FALSE;
  390.             m_bQueueIsEmpty = TRUE;
  391.             m_bCacheIsEmpty = TRUE;
  392.             m_bStreamBegin = FALSE;
  393.             m_bStreamDone = FALSE;
  394.             m_bStreamDoneSent = FALSE;
  395.             m_bSourceStopped = FALSE;
  396.             m_bExpectedTSRangeSet = FALSE;
  397.             m_uStartTimestamp = 0;
  398.             m_uEndTimestamp = 0;
  399.             m_ulEndDelayTolerance = 0;
  400.             m_bACKDone = FALSE;
  401.             m_bPaused = FALSE;
  402.             m_bPausedHack = FALSE;
  403.             m_uReliableSeqNo = 0;
  404.             m_uEndReliableSeqNo = 0;
  405.             m_uFirstSequenceNumber = 0;
  406.             m_uLastSequenceNumber = 0;
  407.             m_uEndSequenceNumber = 0;
  408.             m_uSeekSequenceNumber = 0;
  409.             m_uSeekCount = 0;
  410.             m_bAtLeastOnePacketReceived = FALSE;
  411.             m_bAtLeastOneResetHandled = FALSE;
  412.             Init(pPacket->GetSequenceNumber());
  413.             
  414.             Add(pPacket);
  415.             return HXR_OK;
  416.         }
  417. #endif /* HELIX_FEATURE_TRANSPORT_MULTICAST */
  418.         m_pHoldList.AddTail(pPacket);
  419.         return HXR_OK;
  420.     }
  421.     // initialize the reliableSeqNo on the first 
  422.     // reliable multicast packet
  423.     // SeqNo of reliable packets starts at 1
  424.     if (m_bMulticast                    && 
  425.         !m_bMulticastReliableSeqNoSet   &&
  426.         pPacket                         &&
  427.         pPacket->IsReliable())
  428.     {
  429.         m_uReliableSeqNo = pPacket->GetReliableSeqNo() - 1;
  430.         m_bMulticastReliableSeqNoSet = TRUE;
  431.     }
  432.     /*
  433.      * Save away the sequence number because Insert() may delete the
  434.      * ClientPacket
  435.      */
  436.     UINT16 uSequenceNumber = pPacket->GetSequenceNumber();
  437.     HX_RESULT result = HXR_OK;
  438.     /* We insert it AFTER flushing the packets in live flush case */
  439.     if (!m_bWaitingForLiveSeekFlush)
  440.     {
  441.         result = Insert(pPacket);
  442.     }
  443.     if (HXR_OK != result)
  444.     {
  445.         return result;
  446.     }
  447.     if (m_bWaitingForSeekFlush)
  448.     {
  449.         UINT32 uPacketSeekIndex = GetSeekIndex(uSequenceNumber);
  450.         /*
  451.          * If we have already tried to flush or this packet belongs
  452.          * after the seek, then Flush()
  453.          */
  454.         if (m_bFlushHolding || uPacketSeekIndex < MAX_DEQUE_SIZE)
  455.         {
  456.             /*
  457.              * This routine will clear out the old packets and will reset
  458.              * the packet queue with the information provided by the seek
  459.              */
  460.             if (HXR_OK == Flush())
  461.             {
  462.                 if (m_bFlushHolding)
  463.                 {
  464.                     m_bFlushHolding = FALSE;
  465.                 }
  466.                 m_bWaitingForSeekFlush = FALSE;
  467.                 // Queue should not be empty at this point, since seek index
  468.                 // was contained within the queue prior to flush
  469.                 HX_ASSERT(!m_bQueueIsEmpty);
  470.             }
  471.             else
  472.             {
  473.                 m_bFlushHolding = TRUE;
  474.             }
  475.         }
  476.     }
  477.     if (m_bWaitingForLiveSeekFlush)
  478.     {
  479.         HX_ASSERT(!m_bWaitingForSeekFlush);
  480.         m_bWaitingForLiveSeekFlush = FALSE;
  481.         m_uACKSequenceNumber   =
  482.         m_uFirstSequenceNumber =
  483.         m_uLastSequenceNumber  = uSequenceNumber;
  484.         result = Insert(pPacket);
  485.     }   
  486.     return HXR_OK;
  487. }
  488. HX_RESULT
  489. RTSPTransportBuffer::Insert(ClientPacket* pPacket)
  490. {
  491.     ClientPacket* tempPacket = NULL;
  492.     if (m_bQueueIsEmpty)
  493.     {
  494.         SanitizePacketQueue();
  495.         m_bQueueIsEmpty = FALSE;
  496.     }
  497.     UINT32 uTailIndex = GetPacketIndex(m_uLastSequenceNumber);
  498.     if (uTailIndex >= MAX_DEQUE_SIZE)
  499.     {
  500.         /*
  501.          * Somebody had better be getting packets from this buffer
  502.          */
  503.         HX_RELEASE(pPacket);
  504.         return HXR_FAIL;
  505.     }
  506.     UINT32 uTimestamp = pPacket->GetTime();
  507.     m_uByteCount                += pPacket->GetByteCount();
  508.     m_ulCurrentQueueByteCount   += pPacket->GetByteCount();;
  509.     UINT16 uSequenceNumber = pPacket->GetSequenceNumber();
  510.     UINT32 uPacketIndex = GetPacketIndex(uSequenceNumber);
  511.     // Send NAK iff at least REORDER_TOLERANCE packets with higher
  512.     // seqno's than the lost packet arrive.  increases robustness if
  513.     // reordering occurs. There is a trade off between loss detection
  514.     // accuracy and the time of the retransmission window being made
  515.     // here. Loss detection becomes inaccurate when we count reordered
  516.     // packets as lost. But we can't determine if packets are
  517.     // reordered without waiting for subsequent pkts to arrive.
  518.     // Something to consider is determining whether to NAK early or
  519.     // not based on the avg. Time for the current index to be
  520.     // retrieved by the higher level transpor object (avg time in
  521.     // queue) and the estimated RTT.
  522.     m_pPendingLock->Lock();
  523.     LISTPOSITION pos    = m_PendingPackets.GetHeadPosition();
  524.     int          nCount = m_PendingPackets.GetCount();
  525.     for( int nTmp=0 ; pos && nTmp<nCount ; nTmp++  )
  526.     {
  527.         BOOL bDeleted=FALSE;
  528.         PendingPacket* pPend = (PendingPacket*)m_PendingPackets.GetAt(pos);
  529.         if(uSequenceNumber > pPend->m_ulSequenceNumber)
  530.         {
  531.             pPend->m_ulNumPktsBehind++;
  532.             if( pPend->m_ulNumPktsBehind>REORDER_TOLERANCE )
  533.             {
  534.                 UINT32 tempIndex = GetPacketIndex((UINT16)pPend->m_ulSequenceNumber);
  535.                 
  536.                 //Send a NAK and increment resend requested count.
  537.                 m_pOwner->sendNAKPacket( m_uStreamNumber,
  538.                                          (UINT16)pPend->m_ulSequenceNumber,
  539.                                          (UINT16)pPend->m_ulSequenceNumber);
  540.                 if( tempIndex<m_pPacketDeque->size())
  541.                     ((ClientPacket*)(*m_pPacketDeque)[tempIndex])->SetResendRequested();
  542.                 m_uResendRequested++;
  543.                 //Remove this packet from our pending list
  544.                 pos = m_PendingPackets.RemoveAt(pos);
  545.                 HX_DELETE(pPend);
  546.                 bDeleted=TRUE;
  547.             }
  548.         }
  549.         else if( uSequenceNumber==pPend->m_ulSequenceNumber )
  550.         {
  551.             //This packet arrived, remove it from the pending list.
  552.             pos = m_PendingPackets.RemoveAt(pos);
  553.             HX_DELETE(pPend);
  554.             bDeleted=TRUE;
  555.             m_ulOutOfOrder++;
  556.         }
  557.         
  558.         //If we deleted,  RemoveAt() updated the pos.
  559.         if(!bDeleted)
  560.         {
  561.             m_PendingPackets.GetNext(pos);
  562.         }
  563.     }
  564.     m_pPendingLock->Unlock();
  565.     if (uPacketIndex == uTailIndex + 1)
  566.     {
  567.         /*
  568.          * If the only packet in the queue is the sanitize packet, then we
  569.          * have lost a packet
  570.          */
  571.         tempPacket = (ClientPacket*)(*m_pPacketDeque)[uTailIndex];
  572.         if (tempPacket->IsSanitizePacket())
  573.         {
  574. //{FILE* f1 = ::fopen("c:\loss.txt", "a+"); ::fprintf(f1, "this: %p Lost the sanitized packet uPacketIndex == uTailIndex + 1n", this);::fclose(f1);}  
  575.             goto HandleLostPacket;
  576.         }
  577.         /*
  578.          * Packet has arrived in order so put it in the queue
  579.          */
  580.         if (OverByteLimit())
  581.         {
  582.             ConvertToDroppedPkt(pPacket);
  583.         }
  584.         m_pPacketDeque->push_back(pPacket);
  585.         m_uLastSequenceNumber++;
  586.         if (m_uLastSequenceNumber == m_wrapSequenceNumber)
  587.         {
  588.             m_uLastSequenceNumber = 0;
  589.         }
  590.         m_uNormal++;
  591.     }
  592.     else if (uPacketIndex <= uTailIndex)
  593.     {
  594.         /*
  595.          * Check to see that the packet queue is in a sane state
  596.          */
  597.         if (uPacketIndex >= m_pPacketDeque->size())
  598.         {
  599.             ASSERT(0);
  600.             
  601.             HX_RELEASE(pPacket);
  602.             return HXR_UNEXPECTED;
  603.         }
  604.             
  605.         /*
  606.          * This is a valid out of order packet that belongs somewhere
  607.          * in the queue
  608.          */
  609.         tempPacket = (ClientPacket*)(*m_pPacketDeque)[uPacketIndex];
  610.         if (tempPacket->IsLostPacket())
  611.         {
  612.             if (tempPacket->IsResendRequested())
  613.             {
  614.                 m_uResendReceived++;
  615.             }
  616.             else
  617.             {
  618.                 m_uNormal++;
  619.             }
  620.             /*
  621.              * This was a place holder packet, so replace it with the
  622.              * valid packet
  623.              */
  624.             if (OverByteLimit())
  625.             {
  626.                 ConvertToDroppedPkt(pPacket);
  627.             }
  628.             (*m_pPacketDeque)[uPacketIndex] = pPacket;
  629.             HX_RELEASE(tempPacket);
  630.         }
  631.         else
  632.         {
  633.             // could be actually duplicate (rare) OR 
  634.             // because of resends for out-of-order packets (more likely)
  635.             m_ulDuplicate++; 
  636.             /*
  637.              * We've received a duplicate packet so get rid of it
  638.              */
  639.             HX_RELEASE(pPacket);
  640.         }
  641.     }
  642.     else if (uPacketIndex > MAX_DEQUE_SIZE)
  643.     {
  644.         //XXXGH...don't count late packets because they've already been
  645.         //        been accounted for as lost packets
  646.         // m_uLate++;
  647.         /*
  648.          * If the stream is not being reset and this packet is either
  649.          * too early or too late to be placed in the queue, then Grow().
  650.          * If the stream just starting or ending then don't bother growing
  651.          * because packet funkiness may occur
  652.          */
  653.         if (!m_bStreamBegin && !m_bIsEnded)
  654.         {
  655.             Grow();
  656.         }
  657.         HX_RELEASE(pPacket);
  658.     }
  659.     else
  660.     {
  661.         /*
  662.          * Check to see that the packet queue is in a sane state
  663.          */
  664.         if (uTailIndex >= m_pPacketDeque->size())
  665.         {
  666.             ASSERT(0);
  667.             
  668.             HX_RELEASE(pPacket);
  669.             return HXR_UNEXPECTED;
  670.         }
  671.             
  672.         /*
  673.          * This is a valid out of order packet that belongs somewhere
  674.          * after the last packet in the queue, so fill in any missing
  675.          * packets
  676.          */
  677.         tempPacket = (ClientPacket*)(*m_pPacketDeque)[uTailIndex];
  678. HandleLostPacket:
  679.         /*
  680.          * Use the reliable count from the incoming packet to keep track
  681.          * of lost reliable packets and use the the timestamp from the
  682.          * incoming packet to give the transport a little longer to recover
  683.          * missing packets
  684.          */
  685.         UINT16 uReliableSeqNo = pPacket->GetReliableSeqNo();
  686.         /*
  687.          * If the last packet in the queue is the sanitize packet, then
  688.          * it must get replaced with a proper lost packet
  689.          */
  690.         UINT16 uSeqNo;
  691.         UINT32 uFillIndex;
  692.         if (tempPacket->IsSanitizePacket())
  693.         {
  694.             uSeqNo = tempPacket->GetSequenceNumber();
  695.             uFillIndex = uTailIndex;
  696.             tempPacket = (ClientPacket*)m_pPacketDeque->pop_front();
  697.             HX_RELEASE(tempPacket);
  698.         }
  699.         else
  700.         {
  701.             uSeqNo = tempPacket->GetSequenceNumber() + 1;
  702.             uFillIndex = uTailIndex + 1;
  703.         }
  704.         if (uSeqNo == m_wrapSequenceNumber)
  705.         {
  706.             uSeqNo = 0;
  707.         }
  708.         /*
  709.          * Fill in lost packets from the end of the queue to this packet
  710.          */
  711.         UINT32 i;
  712.         //For each missing packet sequence number, make a dummy packet
  713.         //and stick it in the queue as a place holder. If we are
  714.         //looking at a 'large' gap in sequence numbers here then there
  715.         //is a good chance we are looking at real loss and not
  716.         //out-of-order packets.  In that case, lets forget about the
  717.         //out-of-order work and send an immediate NAK here instead of
  718.         //waiting for the out of order limit and sending indivudual
  719.         //NAKs for each packet. This will lessen the server and
  720.         //network load as well (no NAK spam).
  721.         BOOL   bUseOOPQueue       = TRUE;
  722.         INT32  nNumToFill         = uPacketIndex-uFillIndex;
  723.         UINT16 uStartNAKSeqNumber = uSeqNo;
  724.         //If we are missing more then REORDER_TOLERANCE packets then
  725.         //this has to be real loss and not out of order packets. In
  726.         //this case we just want to add these packets to the Packets
  727.         //queue, mark them as resend-requested and then send a single
  728.         //NAK for the bunch.
  729.         if( nNumToFill >= REORDER_TOLERANCE )
  730.             bUseOOPQueue = FALSE; 
  731.         
  732.         for( i=uFillIndex; i<uPacketIndex; i++ )
  733.         {
  734.             //Add a new filler packet..
  735.             tempPacket = new ClientPacket(uSeqNo++,
  736.                                          uReliableSeqNo,
  737.                                          uTimestamp,
  738.                                          0,
  739.                                          0,
  740.                                          0,
  741.                                          GetTime(),
  742.                                          FALSE);
  743.            
  744.             tempPacket->AddRef();
  745.             m_pPacketDeque->push_back(tempPacket);
  746.             //Don't add to OOP queue if we think this is real loss.
  747.             if( bUseOOPQueue )
  748.             {
  749.                 //Track this place holder packet by inserting it into our
  750.                 //pending packet list.
  751.                 m_pPendingLock->Lock();
  752.                 PendingPacket* pPend = new PendingPacket(uSeqNo-1, HX_GET_TICKCOUNT());
  753.                 if( pPend )
  754.                     m_PendingPackets.AddTail( pPend );
  755.                 //If this is the first packet found out of order start our callback.
  756.                 if(m_pScheduler)
  757.                 {
  758.                     if( !m_pCallBack)
  759.                     {
  760.                         m_pCallBack = new RTSPTransportBufferCallback(this);
  761.                         m_pCallBack->AddRef();
  762.                     }
  763.                     m_CallbackHandle = m_pScheduler->RelativeEnter(m_pCallBack, NAK_CHECK_INTERVAL);
  764.                 }
  765.                 m_pPendingLock->Unlock();
  766.             }
  767.             else
  768.             {
  769.                 //Mark it, we will NAK for all packets outside of loop.
  770.                 tempPacket->SetResendRequested();
  771.                 m_uResendRequested++;
  772.             }
  773.             
  774.         }
  775.         if( !bUseOOPQueue )
  776.         {
  777.             //send out the NAK right now...
  778.             m_pOwner->sendNAKPacket( m_uStreamNumber,
  779.                                      uStartNAKSeqNumber,
  780.                                      uSeqNo-1);
  781.         }
  782.         
  783.         if (OverByteLimit())
  784.         {
  785.             ConvertToDroppedPkt(pPacket);
  786.         }
  787.         m_pPacketDeque->push_back(pPacket);
  788.         /*
  789.          * Carefully bump m_uLastSequenceNumber
  790.          */
  791.         UINT16 uTestSequenceNumber = (UINT16)(m_uLastSequenceNumber +
  792.                                               (uPacketIndex - uTailIndex));
  793.         if (uTestSequenceNumber < m_uLastSequenceNumber ||
  794.             uTestSequenceNumber >= m_wrapSequenceNumber)
  795.         {
  796.             for (i = 0; i < uPacketIndex - uTailIndex; i++)
  797.             {
  798.                 m_uLastSequenceNumber++;
  799.                 if (m_uLastSequenceNumber == m_wrapSequenceNumber)
  800.                 {
  801.                     m_uLastSequenceNumber = 0;
  802.                 }
  803.             }
  804.         }
  805.         else
  806.         {
  807.             m_uLastSequenceNumber = uTestSequenceNumber;
  808.         }
  809.         /*
  810.          * We did receive a valid packet
  811.          */
  812.         m_uNormal++;
  813.     }
  814.     if (m_uSeekCount == 0 && pPacket && !pPacket->IsLostPacket())
  815.     {
  816.         if (!m_bAtLeastOnePacketReceived)
  817.         {
  818.             m_bAtLeastOnePacketReceived = TRUE;
  819.             m_ulFirstTimestampReceived  = uTimestamp;
  820.             m_ulLastTimestampReceived   = m_ulFirstTimestampReceived;
  821.         }
  822.         else
  823.         {
  824.             m_ulLastTimestampReceived   = uTimestamp;
  825.         }
  826.         if (m_ulLastTimestampReceived > uTimestamp &&
  827.             ((m_ulLastTimestampReceived - uTimestamp) > MAX_TIMESTAMP_GAP))
  828.         {
  829.             m_ulTSRollOver++;
  830.         }
  831.     }
  832.     // prefetch if we have received enough data(0x200)
  833.     // NOTE: we only cache half of the packets(0x100) in order to
  834.     //       give enough time to recover lost packets
  835.     if (m_bPrefetch)
  836.     {
  837.         DoPrefetch();
  838.     }
  839.     CheckForSourceDone();
  840.     return HXR_OK;
  841. }
  842. HX_RESULT
  843. RTSPTransportBuffer::GetPacket(ClientPacket*& pPacket)
  844. {
  845.     HX_RESULT   rc = HXR_OK;
  846.     pPacket = NULL;
  847.     if (m_bStreamDone)
  848.     {
  849.         if (!m_bStreamDoneSent)
  850.         {
  851.             m_bStreamDoneSent = TRUE;
  852.             m_pOwner->streamDone(m_uStreamNumber);
  853.         }
  854.         return HXR_AT_END;
  855.     }
  856.     else if (!m_bIsInitialized || m_uSeekCount || m_bWaitingForSeekFlush ||
  857.              (m_bPaused && !m_bIsEnded))
  858.     {
  859.         return HXR_NO_DATA;
  860.     }
  861.     if (!m_bCacheIsEmpty)
  862.     {
  863.         GetPacketFromCache(pPacket);
  864.     }
  865.     if (!pPacket)
  866.     {
  867.         rc = GetPacketFromQueue(pPacket);
  868.     }
  869.     if (m_bQueueIsEmpty && m_bCacheIsEmpty)
  870.     {
  871.         if (m_bIsEnded)
  872.         {
  873.             m_bStreamDone = TRUE;
  874.         }
  875.         else 
  876.         {
  877.             // Check if projected packet time-stamp is past expected 
  878.             // end-time stamp, if yes we no longer expect packets.
  879.             // If m_uLastTimestamp is 0, we haven't read any packets
  880.             // and should not try considering source completion.
  881.             if (m_bExpectedTSRangeSet && (m_uLastTimestamp != 0))
  882.             {
  883.                 ULONG32 ulCurrentDuration = m_uLastTimestamp - 
  884.                                             m_uStartTimestamp;
  885.                 ULONG32 ulExpectedDuration = m_uEndTimestamp - 
  886.                                              m_uStartTimestamp;
  887.                 // For content longer than 24 days, do not use time-range based
  888.                 // stream stoppage logic as it becomes more difficult to distinguish 
  889.                 // between post-end and pre-start timestamps
  890.                 if (((LONG32) ulExpectedDuration) > 0)
  891.                 {
  892.                     UpdateTime(&m_PacketTime);
  893.                     ULONG32 ulLastPacketTime = 
  894.                         m_LastPacketTime.m_LastTime.tv_sec * 1000 + 
  895.                         m_LastPacketTime.m_LastTime.tv_usec / 1000;
  896.                     ULONG32 ulCurrentTime = 
  897.                         m_PacketTime.m_LastTime.tv_sec * 1000 + 
  898.                         m_PacketTime.m_LastTime.tv_usec / 1000;
  899.                     ULONG32 ulTransportWaitTime = ulCurrentTime - 
  900.                                                   ulLastPacketTime;
  901.                     if ((((LONG32) ulCurrentDuration) >= 0) &&
  902.                         ((ulCurrentDuration + ulTransportWaitTime) >= 
  903.                          (ulExpectedDuration + m_ulEndDelayTolerance)) &&
  904.                         (ulTransportWaitTime >= m_ulEndDelayTolerance))
  905.                     {
  906.                         m_bSourceStopped = TRUE;
  907.                     }
  908.                 }
  909.             }
  910.             if (m_bSourceStopped)
  911.             {
  912.                 m_bIsEnded = TRUE;
  913.                 m_bStreamDone = TRUE;
  914.                 m_bStreamDoneSent = TRUE;
  915.                 m_pOwner->streamDone(m_uStreamNumber);
  916.             }
  917.         }
  918.     }
  919.     return rc;
  920. }
  921. HX_RESULT
  922. RTSPTransportBuffer::StartPackets()
  923. {
  924.     ASSERT(!m_bPacketsStarted);
  925.     m_bPacketsStarted = TRUE;
  926.     return HXR_OK;
  927. }
  928. HX_RESULT
  929. RTSPTransportBuffer::StopPackets()
  930. {
  931.     ASSERT(m_bPacketsStarted);
  932.     m_bPacketsStarted = FALSE;
  933.     return HXR_OK;
  934. }
  935. HX_RESULT
  936. RTSPTransportBuffer::GetStatus
  937. (
  938.     UINT16& uStatusCode, 
  939.     UINT16& ulPercentDone
  940. )
  941. {
  942. #if 0
  943.     uStatusCode     = HX_STATUS_READY;
  944.     ulPercentDone   = 100;
  945.     if (m_bIsEnded)
  946.     {
  947.         return HXR_OK;
  948.     }
  949.     
  950.     /* ignore multicasted sparsed streams(i.e. events)
  951.      * it is OK to not be initialized if we are dealing with
  952.      * sparse streams over multicast. This is because
  953.      * in multicast, the transport gets initialialized on 
  954.      * receiving the first packet. We do not want to hold
  955.      * the entire presenation if we never receive a packet
  956.      * for this sparse stream.
  957.      */
  958.     else if ((!m_bIsInitialized || m_uSeekCount) &&
  959.              (!m_bMulticast || !m_bSparseStream))
  960.     {
  961.         uStatusCode     = HX_STATUS_BUFFERING;
  962.         ulPercentDone   = 0;
  963.         return HXR_OK;
  964.     }
  965.     UINT32 ulCurrentBuffering   = 0;
  966.     INT64 llActualLastTimestampReceived = 0;
  967.     if (m_bAtLeastOnePacketReceived)
  968.     {
  969.         llActualLastTimestampReceived = CAST_TO_INT64 m_ulTSRollOver * CAST_TO_INT64 MAX_UINT32 + 
  970.                                         CAST_TO_INT64 m_ulLastTimestampReceived;
  971.         // FileFormats may send packets with out of order timestamps
  972.         // if the stream has been continuesly playing for 49 days
  973.         // we will set llCurrentBufferingInMs to MAX_UINT32
  974.         if (llActualLastTimestampReceived > CAST_TO_INT64 m_ulFirstTimestampReceived)
  975.         {
  976.             if (llActualLastTimestampReceived - CAST_TO_INT64 m_ulFirstTimestampReceived > MAX_UINT32)
  977.             {
  978.                 ulCurrentBuffering = MAX_UINT32;
  979.             }
  980.             else
  981.             {
  982.                 ulCurrentBuffering = INT64_TO_UINT32(llActualLastTimestampReceived - 
  983.                                                      m_ulFirstTimestampReceived);
  984.             }
  985.         }
  986.     }
  987.     UINT32 ulElapsedBufferingTime = 
  988.         CALCULATE_ELAPSED_TICKS(m_ulBufferingStartTime,
  989.                                 HX_GET_TICKCOUNT());
  990.     UINT32 ulPauseTime = m_PacketTime.m_PauseTime.tv_sec*1000 + 
  991.                          m_PacketTime.m_PauseTime.tv_usec/1000;
  992.     if (ulPauseTime > 0 && ulElapsedBufferingTime > ulPauseTime)
  993.     {
  994.         ulElapsedBufferingTime -= ulPauseTime;
  995.     }
  996.     /*
  997.      * If the buffer duration = 0, then there is no network jitter to worry
  998.      * about
  999.      */
  1000.     UINT32 ulMinimumToBuffer =
  1001.          m_bufferDuration + (m_bufferDuration ? MIN_NETWORK_JITTER_MSECS : 0);
  1002.     if (m_status == TRANSBUF_FILLING || 
  1003.         (ulElapsedBufferingTime < ulMinimumToBuffer &&
  1004.          ulCurrentBuffering     < ulMinimumToBuffer))
  1005.     {
  1006.         uStatusCode = HX_STATUS_BUFFERING;
  1007.         UINT32 ulHighVal = ulCurrentBuffering > ulElapsedBufferingTime ? 
  1008.                           ulCurrentBuffering : ulElapsedBufferingTime;
  1009.         if (ulHighVal < ulMinimumToBuffer)
  1010.         {
  1011.             ulPercentDone = HX_SAFEUINT16(ulHighVal*100/ulMinimumToBuffer);
  1012.         }
  1013.         else // Waiting for a reliable packet
  1014.         {
  1015.             ulPercentDone = 99;
  1016.         }
  1017.     }
  1018.     return HXR_OK;
  1019. #else
  1020.     return HXR_NOTIMPL;
  1021. #endif
  1022. }
  1023. HX_RESULT
  1024. RTSPTransportBuffer::SetupForACKPacket
  1025. (
  1026.     UINT16& uSeqNo,
  1027.     CHXBitset& pBitset,
  1028.     UINT16& uBitCount,
  1029.     BOOL& didACK,
  1030.     BOOL& bLostHigh,
  1031.     BOOL& bNeedAnotherACK
  1032. )
  1033. {
  1034.     if (m_bACKDone || !m_bIsInitialized)
  1035.     {
  1036.         return HXR_NO_DATA;
  1037.     }
  1038.     UINT16 uLastSequenceNumber = m_uLastSequenceNumber;
  1039.     BOOL bAllACK = FALSE;
  1040.     /*
  1041.      * The start and end indexes must be INT32 or the loop will not
  1042.      * terminate properly
  1043.      */
  1044.     ClientPacket* pPacket = 0;
  1045.     INT32 iPacketIndex = GetPacketIndex(uLastSequenceNumber);
  1046.     INT32 iStartIndex = GetACKIndex(uLastSequenceNumber);
  1047.     INT32 iEndIndex = 0;
  1048.     /*
  1049.      * 1) If the start index > MAX_DEQUE_SIZE then we have ACKed all the
  1050.      *    current packets
  1051.      * 2) If iPacketIndex = 0 AND
  1052.      *     A) the queue is empty, then we have never entered a packet into
  1053.      *        the queue
  1054.      *     B) the only packet is a sanitization packet, then we sanitized
  1055.      *        for a late packet
  1056.      */
  1057.     if (iStartIndex > MAX_DEQUE_SIZE)
  1058.     {
  1059.         return HXR_NO_DATA;
  1060.     }
  1061.     else if (iPacketIndex == 0)
  1062.     {
  1063.         if (!m_bQueueIsEmpty)
  1064.         {
  1065.             pPacket = (ClientPacket*)(*m_pPacketDeque)[0];
  1066.             if (!pPacket->IsSanitizePacket())
  1067.             {
  1068.                 goto SanitizeContinue;
  1069.             }
  1070.         }
  1071.         return HXR_NO_DATA;
  1072.     }
  1073. SanitizeContinue:
  1074.     INT32 i;
  1075.     /*
  1076.      * If we can't fit all the ACK/NAKs in one ACK packet, then start
  1077.      * ACK/NAKing from the beginning of the transport buffer
  1078.      */
  1079.     if (iStartIndex > MAX_BITSET_SIZE)
  1080.     {
  1081.         /*
  1082.          * Carefully set uLastSequenceNumber
  1083.          */
  1084.         uLastSequenceNumber = m_uACKSequenceNumber;
  1085.         for (i = 0; i < MAX_BITSET_SIZE; i++)
  1086.         {
  1087.             uLastSequenceNumber++;
  1088.             if (uLastSequenceNumber == m_wrapSequenceNumber)
  1089.             {
  1090.                 uLastSequenceNumber = 0;
  1091.             }
  1092.         }
  1093.         /*
  1094.          * Reset the indexes with the last packet we will ACK/NAK
  1095.          */
  1096.         iPacketIndex = GetPacketIndex(uLastSequenceNumber);
  1097.         iStartIndex = MAX_BITSET_SIZE;
  1098.         /*
  1099.          * Since the number of packets > the amount we can ACK, we may need
  1100.          * another ACK packet to fully clean up the ACK wait list. However,
  1101.          * if we run into a NAK, abort the back-to-back ACK because we
  1102.          * would just repeat the information going out in this ACK packet
  1103.          */
  1104.         bNeedAnotherACK = TRUE;
  1105.     }
  1106.     /*
  1107.      * We may have released more packets than can fit in an ACK packet or
  1108.      * the queue may be empty
  1109.      */
  1110.     if (iPacketIndex > MAX_DEQUE_SIZE)
  1111.     {
  1112.         bAllACK = TRUE;
  1113.         iPacketIndex = 0;
  1114.     }
  1115.     ASSERT(m_bQueueIsEmpty ? bAllACK : TRUE);
  1116.     UINT32 uLastNAKSequenceNumber = 0;
  1117.     BOOL bNAKFound = FALSE;
  1118.     uBitCount = HX_SAFEUINT16(iStartIndex);
  1119.     bLostHigh = FALSE;
  1120.     /*
  1121.      * We loop iStartIndex+1 times because we also need to set uSeqNo
  1122.      */
  1123.     for (i = iStartIndex; i >= iEndIndex; i--)
  1124.     {
  1125.         /*
  1126.          * We may have released this packet already
  1127.          */
  1128.         if (iPacketIndex < 0)
  1129.         {
  1130.             HX_ASSERT(i < iStartIndex);
  1131.             pBitset.set((iStartIndex - 1) - i);
  1132.             continue;
  1133.         }
  1134.         else if (iPacketIndex == 0)
  1135.         {
  1136.             /*
  1137.              * We may have released all the packets before ACKing them
  1138.              */
  1139.             if (bAllACK)
  1140.             {
  1141.                 iPacketIndex--;
  1142.                 uSeqNo = uLastSequenceNumber;
  1143.                 didACK = TRUE;
  1144.                 continue;
  1145.             }
  1146.         }
  1147.         pPacket = (ClientPacket*)(*m_pPacketDeque)[iPacketIndex--];
  1148.         /*
  1149.          * If the last packet is not valid, flag it for a NAK
  1150.          */
  1151.         if (i == iStartIndex)
  1152.         {
  1153.             if (pPacket->IsLostPacket())
  1154.             {
  1155.                 bLostHigh = TRUE;
  1156.                 bNeedAnotherACK = FALSE;
  1157.                 if (!pPacket->IsResendRequested())
  1158.                 {
  1159.                     pPacket->SetResendRequested();
  1160.                     m_uResendRequested++;
  1161.                 }
  1162.             }
  1163.             uSeqNo = pPacket->GetSequenceNumber();
  1164.             didACK = TRUE;
  1165.             continue;
  1166.         }
  1167.         else if (pPacket->IsLostPacket())
  1168.         {
  1169.             bNAKFound = TRUE;
  1170.             bNeedAnotherACK = FALSE;
  1171.             uLastNAKSequenceNumber = pPacket->GetSequenceNumber();
  1172.             pBitset.set((iStartIndex - 1) - i);
  1173.             pBitset.clear((iStartIndex - 1) - i);
  1174.             if (!pPacket->IsResendRequested())
  1175.             {
  1176.                 pPacket->SetResendRequested();
  1177.                 m_uResendRequested++;
  1178.             }
  1179.         }
  1180.         else
  1181.         {
  1182.             pBitset.set((iStartIndex - 1) - i);
  1183.         }
  1184.     }
  1185.     /*
  1186.      * Bump the ACK counter
  1187.      */
  1188.     INT32 iACKCount;
  1189.     if (bNAKFound)
  1190.     {
  1191.         iACKCount = GetACKIndex((UINT16) uLastNAKSequenceNumber);
  1192.     }
  1193.     else
  1194.     {
  1195.         iACKCount = GetACKIndex((UINT16) uLastSequenceNumber) + 1;
  1196.     }
  1197.     /*
  1198.      * Carefully bump m_uACKSequenceNumber
  1199.      */
  1200.     UINT16 uTestSequenceNumber = (UINT16)(m_uACKSequenceNumber + iACKCount);
  1201.     if (m_bIsEnded                                 ||
  1202.         uTestSequenceNumber < m_uACKSequenceNumber ||
  1203.         uTestSequenceNumber >= m_wrapSequenceNumber)
  1204.     {
  1205.         for (i = 0; i < iACKCount; i++)
  1206.         {
  1207.             if (m_bIsEnded && m_uACKSequenceNumber == m_uEndSequenceNumber)
  1208.             {
  1209.                 m_bACKDone = TRUE;
  1210.                 break;
  1211.             }
  1212.             m_uACKSequenceNumber++;
  1213.             if (m_uACKSequenceNumber == m_wrapSequenceNumber)
  1214.             {
  1215.                 m_uACKSequenceNumber = 0;
  1216.             }
  1217.         }
  1218.     }
  1219.     else
  1220.     {
  1221.         m_uACKSequenceNumber = uTestSequenceNumber;
  1222.     }
  1223.     return HXR_OK;
  1224. }
  1225. UINT32
  1226. RTSPTransportBuffer::GetIndex(UINT32 uBaseSequenceNumber, UINT16 uSeqNo)
  1227. {
  1228.     INT32 index = uSeqNo - uBaseSequenceNumber;
  1229.     if(index < 0)
  1230.     {
  1231.         index = m_wrapSequenceNumber - uBaseSequenceNumber + uSeqNo;
  1232.     }
  1233.     return (UINT32)index;
  1234. }
  1235. void
  1236. RTSPTransportBuffer::SetEndPacket
  1237. (
  1238.     UINT16 uSeqNo,
  1239.     UINT16 uReliableSeqNo,
  1240.     BOOL   bPacketSent,
  1241.     UINT32 uTimestamp
  1242. )
  1243. {
  1244.     if (m_bIsEnded)
  1245.     {
  1246.         return;
  1247.     }
  1248.     //We have just received the last packet. Since we are getting no
  1249.     //more packets, make sure we go through the pending packets list
  1250.     //and send NAKs for each packet we have not recieved or got out
  1251.     //of order.
  1252.     m_pPendingLock->Lock();
  1253.     while(!m_PendingPackets.IsEmpty())
  1254.     {
  1255.         PendingPacket* pPend = (PendingPacket*)m_PendingPackets.RemoveHead();
  1256.         UINT32 tempIndex = GetPacketIndex((UINT16)pPend->m_ulSequenceNumber);
  1257.                 
  1258.         //Send a NAK and increment resend requested count.
  1259.         m_pOwner->sendNAKPacket(m_uStreamNumber,
  1260.                                 (UINT16)pPend->m_ulSequenceNumber,
  1261.                                 (UINT16)pPend->m_ulSequenceNumber);
  1262.         if( tempIndex<m_pPacketDeque->size())
  1263.             ((ClientPacket*)(*m_pPacketDeque)[tempIndex])->SetResendRequested();
  1264.         m_uResendRequested++;
  1265.         //Clean up.
  1266.         HX_DELETE(pPend);
  1267.     }
  1268.     //We also don't need to call func anymore for this object.
  1269.     if (m_pScheduler && m_CallbackHandle)
  1270.     {
  1271.         m_pScheduler->Remove(m_CallbackHandle);
  1272.     }
  1273.     m_CallbackHandle = 0;
  1274.     if( m_pCallBack )
  1275.         m_pCallBack->Clear();
  1276.     
  1277.     HX_RELEASE( m_pCallBack );
  1278.     m_pPendingLock->Unlock();
  1279.     m_bIsEnded = TRUE;
  1280.     m_uEndSequenceNumber = uSeqNo;
  1281.     UINT32 uEndIndex = GetPacketIndex(m_uEndSequenceNumber);
  1282.     // XXX HP we have too many empty queue determination
  1283.     // i.e. m_bQueueIsEmpty
  1284.     //      uEndIndex > MAX_DEQUEUE_SIZE
  1285.     //      m_pPacketDeque->empty() == TRUE
  1286.     //      m_pPacketDeque->size() == 0
  1287.     if (!bPacketSent || (uEndIndex > MAX_DEQUE_SIZE && m_bCacheIsEmpty))
  1288.     {
  1289.         /*
  1290.          * Either no packets were sent or the end packet has come
  1291.          * after the last packet has been released, so just send
  1292.          * stream done notification
  1293.          */
  1294.         m_bStreamDone = TRUE;
  1295.         m_bStreamDoneSent = TRUE;
  1296.         m_pOwner->streamDone(m_uStreamNumber);
  1297.         return;
  1298.     }
  1299.     /*
  1300.      * Since the buffer duration restriction is now lifted, the player
  1301.      * can get all the packets in the buffer. That means all the packets
  1302.      * must exist, so fill in the end of the queue with temporary "lost"
  1303.      * packets
  1304.      */
  1305.     ClientPacket* pPacket = new ClientPacket(uSeqNo,
  1306.                                              uReliableSeqNo,
  1307.                                              uTimestamp,
  1308.                                              0,
  1309.                                              0,
  1310.                                              0,
  1311.                                              GetTime(),
  1312.                                              FALSE);
  1313.     pPacket->AddRef();
  1314.     Add(pPacket);
  1315.     m_uEndReliableSeqNo = uReliableSeqNo;
  1316.     CheckForSourceDone();
  1317. }
  1318. void
  1319. RTSPTransportBuffer::InformSourceStopped
  1320. (
  1321.     void
  1322. )
  1323. {
  1324.     m_bSourceStopped = TRUE;
  1325. }
  1326. void
  1327. RTSPTransportBuffer::InformTimestampRange
  1328. (
  1329.     UINT32 ulStartTimestamp,
  1330.     UINT32 ulEndTimestamp,
  1331.     UINT32 ulEndDelayTolerance
  1332. )
  1333. {
  1334.     m_uStartTimestamp = ulStartTimestamp;
  1335.     m_uEndTimestamp = ulEndTimestamp;
  1336.     m_ulEndDelayTolerance = ulEndDelayTolerance;
  1337.     m_bExpectedTSRangeSet = TRUE;
  1338. }
  1339.             
  1340. HX_RESULT
  1341. RTSPTransportBuffer::UpdateStatistics
  1342. (
  1343.     ULONG32& ulNormal,
  1344.     ULONG32& ulLost,
  1345.     ULONG32& ulLate,
  1346.     ULONG32& ulResendRequested,
  1347.     ULONG32& ulResendReceived,
  1348.     ULONG32& ulAvgBandwidth,
  1349.     ULONG32& ulCurBandwidth,
  1350.     ULONG32& ulTotal30,
  1351.     ULONG32& ulLost30,
  1352.     ULONG32& ulDuplicate,
  1353.     ULONG32& ulOutOfOrder
  1354. )
  1355. {
  1356.     if (!m_bIsInitialized)
  1357.     {
  1358.         return HXR_NO_DATA;
  1359.     }
  1360.     ulNormal            = m_uNormal;
  1361.     ulLost              = m_uLost;
  1362.     ulLate              = m_uLate;
  1363.     ulResendRequested   = m_uResendRequested;
  1364.     ulResendReceived    = m_uResendReceived;
  1365.     ulLost30            = m_ulLastLost30;
  1366.     ulTotal30           = m_ulLastTotal30;
  1367.     ulAvgBandwidth      = m_uAvgBandwidth;
  1368.     ulCurBandwidth      = m_uCurBandwidth;
  1369.     ulDuplicate         = m_ulDuplicate;
  1370.     ulOutOfOrder        = m_ulOutOfOrder;
  1371.     if (m_bIsEnded)
  1372.     {
  1373.         ulAvgBandwidth  = m_uAvgBandwidth = 0;
  1374.         ulCurBandwidth  = m_uCurBandwidth = 0;
  1375.         return HXR_OK;
  1376.     }
  1377.     if (m_bPaused || m_bPausedHack)
  1378.     {
  1379.         /*
  1380.          * This hack is needed because the server may send out an
  1381.          * extra packet when the stream is paused, and this unsettles
  1382.          * the bandwidth statistics when the stream is resumed
  1383.          */
  1384.         if (!m_bPaused && m_bPausedHack)
  1385.         {
  1386.             m_bPausedHack = FALSE;
  1387.         }
  1388.         return HXR_OK;
  1389.     }
  1390.     // caculate the lost/total packets during the last 30 seconds   
  1391.     m_ulLost30[m_ulIndex30 % 30] = m_uLost;
  1392.     m_ulTotal30[m_ulIndex30 % 30] = m_uNormal + m_uLost + m_uLate + m_uResendReceived;
  1393.     ulLost30 = m_ulLost30[m_ulIndex30 % 30] - 
  1394.                m_ulLost30[(m_ulIndex30 + 1) % 30];
  1395.     ulTotal30 = m_ulTotal30[m_ulIndex30 % 30] -
  1396.                 m_ulTotal30[(m_ulIndex30 + 1) % 30];
  1397.     m_ulLastLost30  = ulLost30;
  1398.     m_ulLastTotal30 = ulTotal30;
  1399.     m_ulIndex30++;
  1400.     HXTimeval lTime = m_pScheduler->GetCurrentSchedulerTime();
  1401.     Timeval now((INT32)lTime.tv_sec, (INT32)lTime.tv_usec);
  1402.     /*
  1403.      * Must adjust m_StartTime and m_LastTime for the amount of time the
  1404.      * client has been paused
  1405.      */
  1406.     Timeval TotalTime = now - AdjustedStartTime(&m_StatisticsTime);
  1407.     Timeval TimeSlice = now - AdjustedLastTime(&m_StatisticsTime);
  1408.     UpdateTime(&m_StatisticsTime);
  1409.     if (TotalTime <= 0.0 || TimeSlice <= 0.0)
  1410.     {
  1411.         /*
  1412.          * This should not happen
  1413.          */
  1414.         return HXR_UNEXPECTED;
  1415.     }
  1416.     double uTotalSeconds = TotalTime.tv_sec + (TotalTime.tv_usec / 1000000.0);
  1417.     double uRecentSeconds = TimeSlice.tv_sec + (TimeSlice.tv_usec / 1000000.0);
  1418.     INT64 uBitCount = m_uByteCount * 8;
  1419.     INT64 uRecentBitCount = (m_uByteCount - m_uLastByteCount) * 8;
  1420.     m_uAvgBandwidth = INT64_TO_UINT32(uBitCount / uTotalSeconds);
  1421.     m_uCurBandwidth = INT64_TO_UINT32(uRecentBitCount / uRecentSeconds);
  1422.     ulAvgBandwidth = m_uAvgBandwidth;
  1423.     ulCurBandwidth = m_uCurBandwidth;
  1424.     m_uLastByteCount = m_uByteCount;
  1425.     return HXR_OK;
  1426. }
  1427. void
  1428. RTSPTransportBuffer::InitializeTime(BufferTimer* Timer)
  1429. {
  1430.     HXTimeval lTime = m_pScheduler->GetCurrentSchedulerTime();
  1431.     Timer->m_StartTime = Timeval((INT32)lTime.tv_sec, (INT32)lTime.tv_usec);
  1432.     Timer->m_PreviousTime = Timeval((INT32)lTime.tv_sec, (INT32)lTime.tv_usec);
  1433.     Timer->m_LastTime = Timeval((INT32)lTime.tv_sec, (INT32)lTime.tv_usec);    
  1434.     Timer->m_PauseTime = Timeval(0.0);
  1435. }
  1436. void
  1437. RTSPTransportBuffer::UpdateTime(BufferTimer* Timer)
  1438. {
  1439.     HXTimeval lTime = m_pScheduler->GetCurrentSchedulerTime();
  1440.     Timeval now((INT32)lTime.tv_sec, (INT32)lTime.tv_usec);
  1441.     Timer->m_LastTime += now - Timer->m_PreviousTime;
  1442.     Timer->m_PreviousTime = now;
  1443. }
  1444. Timeval
  1445. RTSPTransportBuffer::GetTime(BufferTimer* Timer)
  1446. {
  1447.     return Timer->m_LastTime;
  1448. }
  1449. Timeval
  1450. RTSPTransportBuffer::GetTime()
  1451. {
  1452.     /*
  1453.      * Use m_PacketTime for GetTime() references
  1454.      */
  1455.     UpdateTime(&m_PacketTime);
  1456.     return GetTime(&m_PacketTime);
  1457. }
  1458. Timeval
  1459. RTSPTransportBuffer::AdjustedStartTime(BufferTimer* Timer)
  1460. {
  1461.     return Timer->m_StartTime + Timer->m_PauseTime;
  1462. }
  1463. Timeval
  1464. RTSPTransportBuffer::AdjustedLastTime(BufferTimer* Timer)
  1465. {
  1466.     return Timer->m_LastTime + Timer->m_PauseTime;
  1467. }
  1468. void
  1469. RTSPTransportBuffer::SetMulticast() 
  1470.     m_bMulticast = TRUE; 
  1471.     m_bSparseStream = m_pOwner->isSparseStream(m_uStreamNumber);
  1472. }
  1473. void
  1474. RTSPTransportBuffer::Pause()
  1475. {    
  1476.     HXTimeval lTime = m_pScheduler->GetCurrentSchedulerTime();
  1477.     Timeval now((INT32)lTime.tv_sec, (INT32)lTime.tv_usec);
  1478.     m_bPaused = TRUE;
  1479.     m_StatisticsTime.m_LastTime += now - m_StatisticsTime.m_PreviousTime;
  1480.     m_StatisticsTime.m_PreviousTime = now;
  1481.     m_PacketTime.m_LastTime += now - m_PacketTime.m_PreviousTime;
  1482.     m_PacketTime.m_PreviousTime = now;
  1483. }
  1484. void
  1485. RTSPTransportBuffer::Resume()
  1486. {
  1487.     if (m_bPaused)
  1488.     {
  1489.         HXTimeval lTime = m_pScheduler->GetCurrentSchedulerTime();
  1490.         Timeval now((INT32)lTime.tv_sec, (INT32)lTime.tv_usec);
  1491.         m_bPaused = FALSE;
  1492.         m_bPausedHack = TRUE;
  1493.         m_StatisticsTime.m_PauseTime += now - m_StatisticsTime.m_PreviousTime;
  1494.         m_StatisticsTime.m_PreviousTime = now;
  1495.         m_PacketTime.m_PauseTime += now - m_PacketTime.m_PreviousTime;
  1496.         m_PacketTime.m_PreviousTime = now;
  1497.         m_ulBufferingStartTime  = HX_GET_TICKCOUNT();
  1498.         m_uLastByteCount                = m_uByteCount;
  1499.     }
  1500. }
  1501. void
  1502. RTSPTransportBuffer::SanitizePacketQueue()
  1503. {
  1504.     m_uLastSequenceNumber = m_uFirstSequenceNumber;
  1505.     /*
  1506.      * Put a temporary "lost" packet at the head of the queue to make
  1507.      * it sane. The timestamp must be set to that of the last packet
  1508.      * removed from the buffer. This prevents the early releasing of a
  1509.      * true lost packet
  1510.      */
  1511.     ClientPacket* pPacket = new ClientPacket(m_uFirstSequenceNumber,
  1512.                                              m_uReliableSeqNo,
  1513.                                              m_uLastTimestamp,
  1514.                                              0,
  1515.                                              0,
  1516.                                              0,
  1517.                                              GetTime(),
  1518.                                              TRUE);
  1519.     pPacket->AddRef();
  1520.     m_pPacketDeque->push_back(pPacket);
  1521. }
  1522. HX_RESULT
  1523. RTSPTransportBuffer::Flush()
  1524. {
  1525.     ClientPacket* pPacket;
  1526.     //We are flushing all the packets. Empty out pending list.
  1527.     m_pPendingLock->Lock();
  1528.     while( !m_PendingPackets.IsEmpty() )
  1529.     {
  1530.         PendingPacket* pPend = (PendingPacket*)m_PendingPackets.RemoveHead();
  1531.         HX_DELETE(pPend);
  1532.     }
  1533.     //Get rid of any scheduler events...
  1534.     if (m_pScheduler && m_CallbackHandle)
  1535.     {
  1536.         m_pScheduler->Remove(m_CallbackHandle);
  1537.     }
  1538.     m_CallbackHandle = 0;
  1539.     if( m_pCallBack )
  1540.         m_pCallBack->Clear();
  1541.     HX_RELEASE( m_pCallBack );
  1542.     m_pPendingLock->Unlock();
  1543.     while(!m_pPacketDeque->empty())
  1544.     {
  1545.         pPacket = (ClientPacket*)m_pPacketDeque->front();
  1546.         if (pPacket)
  1547.         {
  1548.             /*
  1549.              * Check to see that we are not waiting for a missing pre-seek
  1550.              * reliable packet
  1551.              */
  1552.             if (m_uReliableSeqNo !=
  1553.                 pPacket->GetReliableSeqNo() - pPacket->IsReliable())
  1554.             {
  1555.                 return HXR_INCOMPLETE;
  1556.             }
  1557.             UINT32 uSeekIndex = GetSeekIndex(pPacket->GetSequenceNumber());
  1558.             if (uSeekIndex == 0)
  1559.             {
  1560.                 m_uLastTimestamp = pPacket->GetTime();
  1561.                 return HXR_OK;
  1562.             }
  1563.             pPacket = (ClientPacket*)m_pPacketDeque->pop_front();
  1564.             IHXPacket* pIHXPacket = pPacket->GetPacket();
  1565.             m_pOwner->packetReady(HXR_OK,
  1566.                                   m_uStreamNumber,
  1567.                                   pIHXPacket);
  1568.             if (pIHXPacket)
  1569.             {
  1570.                 pIHXPacket->Release();      
  1571.             }
  1572.             UpdateStatsFromPacket(pPacket);
  1573.             HX_RELEASE(pPacket);
  1574.         }
  1575.     }
  1576. /*
  1577.  * XXXGH...Do I really need to do this?
  1578.  *  InitializeTime(&m_PacketTime);
  1579.  */
  1580.     m_bQueueIsEmpty             = TRUE;
  1581.     m_ulCurrentQueueByteCount   = 0;
  1582.     /*
  1583.      * It's possible that there are missing pre-seek packets that haven't
  1584.      * been marked as lost yet...they will be marked as lost after the
  1585.      * Insert(), so wait for the next incoming data packet before flushing
  1586.      * the queue
  1587.      */
  1588.     if (m_uFirstSequenceNumber != m_uSeekSequenceNumber)
  1589.     {
  1590.         return HXR_INCOMPLETE;
  1591.     }
  1592.     return HXR_OK;
  1593. }
  1594. HX_RESULT
  1595. RTSPTransportBuffer::GetCurrentBuffering(INT64&  llLowestTimestamp, 
  1596.                                          INT64&  llHighestTimestamp,
  1597.                                          UINT32& ulNumBytes,
  1598.                                          BOOL&   bDone)
  1599. {
  1600.     UINT32  ulFrontTimeStamp = 0;
  1601.     UINT32  ulRearTimeStamp = 0;
  1602.     llLowestTimestamp = 0;
  1603.     llHighestTimestamp = 0;
  1604.     ulNumBytes = 0;
  1605.     bDone = m_bIsEnded;
  1606.     if (m_pPacketDeque && m_uSeekCount == 0 && !m_bWaitingForSeekFlush)
  1607.     {
  1608.         if (!m_bCacheIsEmpty && m_bQueueIsEmpty)    
  1609.         {
  1610.             ulFrontTimeStamp = m_ulFrontTimeStampCached;
  1611.             ulRearTimeStamp = m_ulRearTimeStampCached;
  1612.         }
  1613.         else if (m_bCacheIsEmpty && !m_bQueueIsEmpty)
  1614.         {
  1615.             ClientPacket* frontPacket   = (ClientPacket*)m_pPacketDeque->front();
  1616.             ClientPacket* rearPacket    = (ClientPacket*)m_pPacketDeque->back();
  1617.             ulFrontTimeStamp = frontPacket->GetTime();      
  1618.             ulRearTimeStamp = rearPacket->GetTime();
  1619.         }
  1620.         else if (!m_bCacheIsEmpty && !m_bQueueIsEmpty)
  1621.         {
  1622.             ClientPacket* rearPacket    = (ClientPacket*)m_pPacketDeque->back();
  1623.             ulFrontTimeStamp = m_ulFrontTimeStampCached;            
  1624.             ulRearTimeStamp = rearPacket->GetTime();
  1625.         }
  1626.         else
  1627.         {
  1628.             goto cleanup;
  1629.         }
  1630.         llLowestTimestamp = CAST_TO_INT64 ulFrontTimeStamp;
  1631.         if (ulFrontTimeStamp > ulRearTimeStamp &&
  1632.             ((ulFrontTimeStamp - ulRearTimeStamp) > MAX_TIMESTAMP_GAP))
  1633.         {
  1634.             llHighestTimestamp = CAST_TO_INT64 MAX_UINT32 + CAST_TO_INT64 ulRearTimeStamp;
  1635.         }
  1636.         else
  1637.         {
  1638.             llHighestTimestamp = CAST_TO_INT64 ulRearTimeStamp;
  1639.         }
  1640.         ulNumBytes = m_ulCurrentQueueByteCount + m_ulCurrentCacheByteCount;
  1641.     }
  1642. cleanup:
  1643.     return HXR_OK;
  1644. }
  1645. void
  1646. RTSPTransportBuffer::CheckForSourceDone()
  1647. {
  1648.     if (m_bIsEnded              &&
  1649.         m_bIsInitialized        &&
  1650.         m_uSeekCount == 0       &&
  1651.         !m_bWaitingForSeekFlush &&
  1652.         m_uEndReliableSeqNo == m_uReliableSeqNo)
  1653.     {
  1654.         m_pOwner->CheckForSourceDone(m_uStreamNumber);
  1655.     }
  1656. }
  1657. void
  1658. RTSPTransportBuffer::UpdateStatsFromPacket(ClientPacket* pPacket)
  1659. {
  1660.     m_uFirstSequenceNumber++;
  1661.     if (m_uFirstSequenceNumber == m_wrapSequenceNumber)
  1662.     {
  1663.         m_uFirstSequenceNumber = 0;
  1664.     }
  1665.     if (pPacket->IsReliable())
  1666.     {
  1667.         m_uReliableSeqNo++;
  1668.     }
  1669.     if (pPacket->IsLostPacket())
  1670.     {
  1671.         m_uLost++;
  1672.     }
  1673.     m_uLastTimestamp = pPacket->GetTime();
  1674.     
  1675.     m_ulCurrentQueueByteCount = m_ulCurrentQueueByteCount > pPacket->GetByteCount() ? 
  1676.                                 m_ulCurrentQueueByteCount - pPacket->GetByteCount() :0;
  1677. }
  1678. void
  1679. RTSPTransportBuffer::SeekFlush()
  1680. {
  1681.     if (m_bMulticast)
  1682.     {
  1683.         m_bMulticastReset = TRUE;
  1684.         m_bMulticastReliableSeqNoSet = FALSE;
  1685.         m_uSeekCount = 1;
  1686.         Reset();
  1687.         return;
  1688.     }
  1689.     /* We use this to re-initialize the first sequence number 
  1690.      * since we do not get this information in live pause case.
  1691.      */
  1692.     m_bWaitingForLiveSeekFlush = TRUE;
  1693.     /*
  1694.      * If we're empty, there's nothing to flush
  1695.      */
  1696.     if (m_bQueueIsEmpty)
  1697.     {
  1698.         return;
  1699.     }
  1700.     /*
  1701.      * In the seek flush case there will be no initialization packet,
  1702.      * so use the sequence number of the last packet in the buffer + 1
  1703.      * as the beginning sequence number of the post-seek packets
  1704.      */
  1705.     UINT32 uTailIndex = GetPacketIndex(m_uLastSequenceNumber);
  1706.     ClientPacket* tempPacket = (ClientPacket*)(*m_pPacketDeque)[uTailIndex];
  1707.     m_uSeekSequenceNumber = tempPacket->GetSequenceNumber() + 1;
  1708.     if (m_uSeekSequenceNumber == m_wrapSequenceNumber)
  1709.     {
  1710.         m_uSeekSequenceNumber = 0;
  1711.     }
  1712.     
  1713.     m_bWaitingForSeekFlush = TRUE;
  1714. }
  1715. void
  1716. RTSPTransportBuffer::ReleasePackets()
  1717. {
  1718.     /*
  1719.      * If this is a live session try to send packets up to client
  1720.      */
  1721.     if (m_bIsLive)
  1722.     {
  1723.         HX_RESULT hresult;
  1724.         do
  1725.         {
  1726.             ClientPacket* pPacket = 0;
  1727.             hresult = GetPacket(pPacket);
  1728.             if (hresult == HXR_AT_END  ||
  1729.                 hresult == HXR_NO_DATA ||
  1730.                 hresult == HXR_BUFFERING)
  1731.             {
  1732.                 break;
  1733.             }
  1734.             IHXPacket* pIHXPacket = pPacket->GetPacket();
  1735.             if (m_bPacketsStarted)
  1736.             {
  1737.                 m_pOwner->packetReady(hresult,
  1738.                                       m_uStreamNumber,
  1739.                                       pIHXPacket);
  1740.             }
  1741.             HX_RELEASE(pIHXPacket);
  1742.             HX_RELEASE(pPacket);
  1743.         } while (hresult == HXR_OK);
  1744.     }
  1745. }
  1746. void
  1747. RTSPTransportBuffer::SetBufferDepth(UINT32 uMilliseconds)
  1748. {
  1749.     m_bufferDuration = uMilliseconds;
  1750.     if (m_maxBufferDuration < uMilliseconds)
  1751.     {
  1752.         m_maxBufferDuration = uMilliseconds;
  1753.     }
  1754. }
  1755. void
  1756. RTSPTransportBuffer::EnterPrefetch(void)
  1757. {
  1758. #if defined(HELIX_FEATURE_FIFOCACHE) && defined(HELIX_FEATURE_PREFETCH)
  1759.     m_bPrefetch = TRUE;
  1760.     if (m_bPrefetch)
  1761.     {
  1762.         IUnknown* pContext = NULL;
  1763.         IHXCommonClassFactory* pClassFactory = NULL;
  1764.         m_pOwner->GetContext(pContext);
  1765.         if (pContext && 
  1766.             HXR_OK == pContext->QueryInterface(IID_IHXCommonClassFactory,
  1767.                                                (void**)&pClassFactory))
  1768.         {
  1769.             HX_RELEASE(m_pFIFOCache);
  1770.             pClassFactory->CreateInstance(CLSID_IHXFIFOCache, 
  1771.                                           (void**)&m_pFIFOCache);
  1772.         }
  1773.         HX_RELEASE(pClassFactory);
  1774.         HX_RELEASE(pContext);
  1775.     }
  1776. #endif /* HELIX_FEATURE_FIFOCACHE && HELIX_FEATURE_PREFETCH */
  1777.     return;
  1778. }
  1779. void
  1780. RTSPTransportBuffer::LeavePrefetch(void)
  1781. {
  1782.     m_bPrefetch = FALSE;
  1783.     return;
  1784. }
  1785. void            
  1786. RTSPTransportBuffer::DoPrefetch(void)
  1787. {
  1788. #if defined(HELIX_FEATURE_FIFOCACHE) && defined(HELIX_FEATURE_PREFETCH)
  1789.     UINT32          i = 0;
  1790.     ClientPacket*   pClientPacket = NULL;
  1791.     if (m_pFIFOCache)
  1792.     {
  1793.         while (HXR_OK == GetPacketFromQueue(pClientPacket) && pClientPacket)
  1794.         {
  1795.             if (m_bCacheIsEmpty)
  1796.             {
  1797.                 m_bCacheIsEmpty = FALSE;
  1798.                 m_ulFrontTimeStampCached = m_ulRearTimeStampCached = pClientPacket->GetTime();
  1799.             }
  1800.             else
  1801.             {
  1802.                 m_ulRearTimeStampCached = pClientPacket->GetTime();
  1803.             }
  1804.             m_pFIFOCache->Cache((IUnknown*)pClientPacket);
  1805.             m_ulCurrentCacheByteCount += pClientPacket->GetByteCount();
  1806.             HX_RELEASE(pClientPacket);
  1807.         }
  1808.     }
  1809. #endif /* HELIX_FEATURE_FIFOCACHE && HELIX_FEATURE_PREFETCH */
  1810.     return;
  1811. }
  1812. HX_RESULT
  1813. RTSPTransportBuffer::GetPacketFromCache(ClientPacket*& pPacket)
  1814. {
  1815.     pPacket = NULL;
  1816. #if defined(HELIX_FEATURE_FIFOCACHE) && defined(HELIX_FEATURE_PREFETCH)
  1817.     if (m_pFIFOCache)
  1818.     {
  1819.         m_pFIFOCache->Retrieve((IUnknown*&)pPacket);
  1820.         
  1821.         // no more cached packets left
  1822.         if (pPacket)
  1823.         {
  1824.             m_ulCurrentCacheByteCount = m_ulCurrentCacheByteCount > pPacket->GetByteCount() ? 
  1825.                                         m_ulCurrentCacheByteCount - pPacket->GetByteCount() :0;
  1826.         }
  1827.         else
  1828.         {
  1829.             HX_ASSERT(m_ulCurrentCacheByteCount == 0);
  1830.             m_bCacheIsEmpty = TRUE;
  1831.         }
  1832.     }
  1833. #endif /* HELIX_FEATURE_FIFOCACHE && HELIX_FEATURE_PREFETCH */
  1834.     return HXR_OK;
  1835. }
  1836. HX_RESULT
  1837. RTSPTransportBuffer::GetPacketFromQueue(ClientPacket*& pPacket)
  1838. {
  1839.     UINT32          ulTimeInQueue = 0;
  1840.     ClientPacket*   frontPacket = NULL;
  1841.     ClientPacket*   rearPacket = NULL;
  1842.     pPacket = NULL;
  1843.     if (m_bQueueIsEmpty)
  1844.     {
  1845.         return HXR_NO_DATA;
  1846.     }
  1847.     frontPacket = (ClientPacket*)m_pPacketDeque->front();
  1848.     rearPacket = (ClientPacket*)m_pPacketDeque->back();
  1849.     /*
  1850.      * The transport buffer should NEVER send a sanitization packet to the
  1851.      * core
  1852.      */
  1853.     if (frontPacket->IsSanitizePacket())
  1854.     {
  1855.         return HXR_NO_DATA;
  1856.     }
  1857.     UINT32 ulFrontTimeStamp = frontPacket->GetTime();
  1858.     UINT32 ulRearTimeStamp = rearPacket->GetTime();
  1859.     if (ulFrontTimeStamp > ulRearTimeStamp &&
  1860.         ((ulFrontTimeStamp - ulRearTimeStamp) > MAX_TIMESTAMP_GAP))
  1861.     {
  1862.         ulTimeInQueue = INT64_TO_UINT32(CAST_TO_INT64 ulRearTimeStamp + MAX_UINT32 - CAST_TO_INT64 ulFrontTimeStamp);
  1863.     }
  1864.     else
  1865.     {
  1866.         ulTimeInQueue = ulRearTimeStamp - ulFrontTimeStamp;
  1867.     }
  1868.     Timeval TimeInBuffer;
  1869.     UpdateTime(&m_PacketTime);
  1870.     TimeInBuffer = m_PacketTime.m_LastTime - frontPacket->GetStartTime();
  1871.     /*
  1872.      * If...
  1873.      *
  1874.      * 1) the server is still sending packets    AND
  1875.      *    the first packet is lost               AND
  1876.      *    there are less than MAX_QUEUED_PACKETS AND
  1877.      *    there is not enough data in the buffer AND
  1878.      *    the first packet has not been in the buffer too long
  1879.      * 2) there was a reliable packet lost before this one
  1880.      *
  1881.      * then return HXR_BUFFERING
  1882.      */
  1883.     
  1884.     /*
  1885.      * If we are still in a buffering state AND the resend depth 
  1886.      * is not set to zero (to minimize latency), do not deplete the
  1887.      * network jitter buffer. 
  1888.      */
  1889.     UINT32 ulMinimumToBuffer = m_bufferDuration;
  1890.     BOOL bPlaying = FALSE;
  1891.     if (m_pOwner && m_pOwner->m_pPlayerState)
  1892.     {
  1893.         bPlaying = m_pOwner->m_pPlayerState->IsPlaying();
  1894.         if (!bPlaying && ulMinimumToBuffer != 0 )
  1895.             ulMinimumToBuffer += MIN_NETWORK_JITTER_MSECS;
  1896.     }
  1897.     // We only want to get packets as soon as possible for FastStart when 
  1898.     // before starting playback. If already playing getting lost packets 
  1899.     // faster then usual prevents resent packets from being processed.
  1900.     if ((!m_bFastStart || bPlaying)                         &&
  1901.         (!m_bIsEnded                                        &&
  1902.          m_pPacketDeque->size() < MAX_QUEUED_PACKETS        &&
  1903.          frontPacket->IsLostPacket()                        &&
  1904.          ulTimeInQueue < ulMinimumToBuffer                  &&
  1905.          TimeInBuffer < Timeval((float)ulMinimumToBuffer / 1000.0)) ||
  1906.         (frontPacket->GetReliableSeqNo() != 
  1907.             (UINT16)(m_uReliableSeqNo + frontPacket->IsReliable())))
  1908.     {
  1909.         pPacket = 0;
  1910.         m_status = TRANSBUF_FILLING;
  1911.         return HXR_BUFFERING;
  1912.     }
  1913.     if (m_status != TRANSBUF_READY)
  1914.     {
  1915.         m_status = TRANSBUF_READY;
  1916.     }
  1917.     pPacket = (ClientPacket*)m_pPacketDeque->pop_front();
  1918.     //Remove this packet if it is in our pending packet list
  1919.     m_pPendingLock->Lock();
  1920.     LISTPOSITION pos      = m_PendingPackets.GetHeadPosition();
  1921.     UINT32       ulSeqNum = pPacket->GetSequenceNumber();
  1922.     while(pos)
  1923.     {
  1924.         PendingPacket* pPend = (PendingPacket*)m_PendingPackets.GetAt(pos);
  1925.         if( pPend->m_ulSequenceNumber == ulSeqNum )
  1926.         {
  1927.             m_PendingPackets.RemoveAt(pos);
  1928.             HX_DELETE( pPend );
  1929.             break;
  1930.         }
  1931.         m_PendingPackets.GetNext(pos);
  1932.     }
  1933.     m_pPendingLock->Unlock();
  1934.     /*
  1935.      * The player has all the packets for the stream when first == end
  1936.      * sequence number
  1937.      */
  1938.     if (m_uFirstSequenceNumber == m_uLastSequenceNumber)
  1939.     {
  1940.         m_bQueueIsEmpty = TRUE;
  1941.     }
  1942.     UpdateStatsFromPacket(pPacket);
  1943.     m_LastPacketTime = m_PacketTime;
  1944.     return HXR_OK;
  1945. }
  1946. void
  1947. RTSPTransportBuffer::InitTimer()
  1948. {
  1949.     m_pScheduler = m_pOwner->GetScheduler();
  1950.     if (m_pScheduler)
  1951.     {
  1952.         m_pScheduler->AddRef();
  1953.         InitializeTime(&m_StatisticsTime);
  1954.         InitializeTime(&m_PacketTime);
  1955.         m_LastPacketTime = m_PacketTime;
  1956.     }
  1957. }
  1958. HX_RESULT
  1959. RTSPTransportBuffer::GetTransportBufferInfo(UINT32& ulLowestTimestamp,
  1960.                                             UINT32& ulHighestTimestamp,
  1961.                                             UINT32& ulBytesBuffered)
  1962. {
  1963.     INT64 llLowTS;
  1964.     INT64 llHighTS;
  1965.     BOOL bDone;
  1966.     HX_RESULT res = GetCurrentBuffering(llLowTS, llHighTS, 
  1967.                                         ulBytesBuffered, bDone);
  1968.     if (HXR_OK == res)
  1969.     {
  1970.         if (ulBytesBuffered)
  1971.         {
  1972.             ulLowestTimestamp = INT64_TO_UINT32(llLowTS);
  1973.             ulHighestTimestamp= INT64_TO_UINT32(llHighTS);
  1974.         }
  1975.         else
  1976.         {
  1977.             // There isn't any data in the buffer. Set
  1978.             // the timestamps to the last timestamp received.
  1979.             // This allows the server to keep track of what
  1980.             // has been received when no data is in the buffer.
  1981.             ulLowestTimestamp = m_ulLastTimestampReceived;
  1982.             ulHighestTimestamp = m_ulLastTimestampReceived;
  1983.         }
  1984.     }
  1985.     return res;
  1986. }
  1987. void RTSPTransportBuffer::Func(void)
  1988. {
  1989.     UINT32 now = HX_GET_TICKCOUNT();
  1990.     //See if we should even be here.
  1991.     if( NULL==m_pCallBack || 0==m_CallbackHandle)
  1992.         return;
  1993.     m_pPendingLock->Lock();
  1994.     m_CallbackHandle = 0;
  1995.     
  1996.     //If this Func fired we have run out of time to wait for
  1997.     //more packets. We have to go through our pending packet
  1998.     //list and send NAKs for each one.
  1999.     LISTPOSITION pos = m_PendingPackets.GetHeadPosition();
  2000.     int nCount = m_PendingPackets.GetCount();
  2001.     while(pos && nCount)
  2002.     {
  2003.         PendingPacket* pPend = (PendingPacket*)m_PendingPackets.GetAt(pos);
  2004.         //Check and see how long this packet has been on the pending queue.
  2005.         if( now-(pPend->m_ulArrivalTime) > NAK_TIMEOUT )
  2006.         {
  2007.             //Send a NAK and increment resend requested count.
  2008.             UINT32 tempIndex = GetPacketIndex((UINT16)pPend->m_ulSequenceNumber);
  2009.             m_pOwner->sendNAKPacket(m_uStreamNumber,
  2010.                                     (UINT16)pPend->m_ulSequenceNumber,
  2011.                                     (UINT16)pPend->m_ulSequenceNumber);
  2012.             if( tempIndex<m_pPacketDeque->size())
  2013.                 ((ClientPacket*)(*m_pPacketDeque)[tempIndex])->SetResendRequested();
  2014.             m_uResendRequested++;
  2015.             pos = m_PendingPackets.RemoveAt(pos);
  2016.             HX_DELETE(pPend);
  2017.         }
  2018.         else
  2019.             m_PendingPackets.GetNext(pos);
  2020.         
  2021.         nCount--;
  2022.     }
  2023.     //Schedule our next callback
  2024.     if( m_pScheduler && m_pCallBack )
  2025.         m_CallbackHandle = m_pScheduler->RelativeEnter(m_pCallBack, NAK_CHECK_INTERVAL);
  2026.     
  2027.     m_pPendingLock->Unlock();
  2028. }
  2029. ////////////////////////////////////////////////
  2030. //
  2031. //    basesite callback
  2032. //
  2033. ////////////////////////////////////////////////
  2034. RTSPTransportBuffer::RTSPTransportBufferCallback::RTSPTransportBufferCallback(RTSPTransportBuffer* pTransBuff) :
  2035.     m_lRefCount (0),
  2036.     m_pTransBuff(pTransBuff)
  2037. {
  2038. }
  2039. RTSPTransportBuffer::RTSPTransportBufferCallback::~RTSPTransportBufferCallback()
  2040. {
  2041.     m_pTransBuff = NULL;
  2042. }
  2043. STDMETHODIMP RTSPTransportBuffer::RTSPTransportBufferCallback::QueryInterface(REFIID riid, void** ppvObj)
  2044. {
  2045.     if (IsEqualIID(riid, IID_IHXCallback))
  2046.     {
  2047.         AddRef();
  2048.         *ppvObj = (IHXCallback*)this;
  2049.         return HXR_OK;
  2050.     }
  2051.     else if (IsEqualIID(riid, IID_IUnknown))
  2052.     {
  2053.         AddRef();
  2054.         *ppvObj = this;
  2055.         return HXR_OK;
  2056.     }
  2057.    
  2058.     *ppvObj = NULL;
  2059.     return HXR_NOINTERFACE;
  2060. }
  2061. ULONG32 RTSPTransportBuffer::RTSPTransportBufferCallback::AddRef()
  2062. {
  2063.     return InterlockedIncrement(&m_lRefCount);
  2064. }
  2065. ULONG32 RTSPTransportBuffer::RTSPTransportBufferCallback::Release()
  2066. {
  2067.     if (InterlockedDecrement(&m_lRefCount) > 0)
  2068.     {
  2069.         return m_lRefCount;
  2070.     }
  2071.     
  2072.     delete this;
  2073.     return 0;
  2074. }
  2075. HX_RESULT RTSPTransportBuffer::RTSPTransportBufferCallback::Func(void)
  2076. {
  2077.     if(m_pTransBuff)
  2078.     {
  2079.         m_pTransBuff->Func();
  2080.     }
  2081.     return HXR_OK;
  2082. }
  2083. void RTSPTransportBuffer::RTSPTransportBufferCallback::Clear(void)
  2084. {
  2085.     m_pTransBuff=NULL;
  2086. BOOL                
  2087. RTSPTransportBuffer::OverByteLimit() const
  2088. {
  2089.     BOOL bRet = FALSE;
  2090.     if (m_ulByteLimit && (m_ulCurrentQueueByteCount > m_ulByteLimit))
  2091.     {
  2092.         bRet = TRUE;
  2093.     }
  2094.     return bRet;
  2095. }
  2096. void 
  2097. RTSPTransportBuffer::ConvertToDroppedPkt(ClientPacket*& pPacket)
  2098. {
  2099.     ClientPacket* pLostPkt = new ClientPacket(pPacket->GetSequenceNumber(),
  2100.                                               pPacket->GetReliableSeqNo(),
  2101.                                               pPacket->GetTime(),
  2102.                                               0,
  2103.                                               0,
  2104.                                               0,
  2105.                                               pPacket->GetStartTime(),
  2106.                                               FALSE,
  2107.                                               TRUE);
  2108.     if (pLostPkt)
  2109.     {
  2110.         // Update queue byte count since this packet won't be counted
  2111.         // anymore
  2112.         m_ulCurrentQueueByteCount -= pPacket->GetByteCount();
  2113.         
  2114.         // Destroy the original packet
  2115.         HX_RELEASE(pPacket);
  2116.         
  2117.         pPacket = pLostPkt;
  2118.         pLostPkt->AddRef();
  2119.     }
  2120. }