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

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