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

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. /****************************************************************************
  36.  *  Includes
  37.  */
  38. #include "raformat.h"
  39. #include "smppkfdr.h"
  40. /****************************************************************************
  41.  *  Defines
  42.  */
  43. /****************************************************************************
  44.  *  CRealAudioSimplePacketFeeder
  45.  */
  46. /****************************************************************************
  47.  *  Constructor & Destructor
  48.  */
  49. CRealAudioSimplePacketFeeder::CRealAudioSimplePacketFeeder
  50. (
  51.     CStreamParam& refStreamParam,
  52.     CInterleaveBufs& refIBufs,
  53.     UINT16* pRuleToFlagMap,
  54.     UINT16 uStreamNumber
  55. )
  56.     : m_StreamParam(refStreamParam)
  57.     , m_IBufs(refIBufs)
  58.     , m_pRuleToFlagMap(pRuleToFlagMap)
  59.     , m_pPendingPacketQueue(NULL)
  60.     , m_ulContinueDiscardUntilTime(NO_TIME_SET)
  61.     , m_ulSequence(0)
  62.     , m_uStreamNumber(uStreamNumber)
  63.     , m_bEndOfPackets(FALSE)
  64.     , m_ulLastPacketTime(NO_TIME_SET)
  65. {
  66.     m_pPendingPacketQueue = new CHXSimpleList;
  67. }
  68. CRealAudioSimplePacketFeeder::~CRealAudioSimplePacketFeeder(void)
  69. {
  70.     _Reset();
  71.     HX_DELETE(m_pPendingPacketQueue);
  72. }
  73. /****************************************************************************
  74.  *  Interface methods
  75.  */
  76. HX_RESULT CRealAudioSimplePacketFeeder::OnPacket(IHXPacket* pPacket, 
  77.    LONG32 lTimeOffset, 
  78.    UINT16* rule_to_flag_map)
  79. {
  80.     HX_RESULT retVal = HXR_OK;
  81.     if (m_ulContinueDiscardUntilTime != NO_TIME_SET)
  82.     {
  83. // when we find the superblock that contins the discard until time
  84. // we are done and should start putting packets into the queue again
  85. if (pPacket &&
  86.     (!pPacket->IsLost()))
  87. {
  88.     if (IsTimeGreater(pPacket->GetTime() + GetSuperBlockTime(),
  89.       m_ulContinueDiscardUntilTime) &&
  90. ((rule_to_flag_map == NULL) ||
  91.  (rule_to_flag_map[pPacket->GetASMRuleNumber()] & HX_KEYFRAME_FLAG)))
  92.     {
  93. m_ulContinueDiscardUntilTime = NO_TIME_SET;
  94.     }
  95. }
  96. if (m_ulContinueDiscardUntilTime != NO_TIME_SET)
  97. {
  98.     // Discard this packet
  99.     pPacket = NULL;
  100. }
  101.     }
  102.     if (pPacket)
  103.     {
  104. if (!pPacket->IsLost())
  105. {
  106.     m_ulLastPacketTime = pPacket->GetTime();
  107. }
  108. m_pPendingPacketQueue->AddTail(pPacket);
  109. pPacket->AddRef();
  110.     }
  111.     // fill up the interleave buffer from the packet queue
  112.     FillISuperBlock();
  113.     
  114.     return retVal;
  115. }
  116. void CRealAudioSimplePacketFeeder::LossOccured(void)
  117. {
  118.     ;
  119. }
  120. void CRealAudioSimplePacketFeeder::Reset(void)
  121. {
  122.     _Reset();
  123. }
  124. void CRealAudioSimplePacketFeeder::OnEndOfPackets(void)
  125. {
  126.     m_bEndOfPackets = TRUE;
  127. }
  128. BOOL CRealAudioSimplePacketFeeder::IsActive(void)
  129. {
  130.     BOOL bRetVal = (!m_pPendingPacketQueue->IsEmpty());
  131.     return bRetVal;
  132. }
  133. BOOL
  134. CRealAudioSimplePacketFeeder::FillISuperBlock(void)
  135. {    
  136.     BOOL bIsLost;
  137.     UINT16 usFlag;
  138.     UINT32 ulDataSize;
  139.     UINT8* pPacketData;
  140.     IHXBuffer* pPacketBuffer;
  141.     IHXPacket* pPacket;
  142.     HX_RESULT status;
  143.     while ((!m_IBufs.IsISuperBlockDone()) &&
  144.    (!m_pPendingPacketQueue->IsEmpty()))
  145.     {
  146. pPacket = (IHXPacket*) m_pPendingPacketQueue->RemoveHead();
  147. pPacketBuffer = pPacket->GetBuffer();
  148. bIsLost = TRUE;
  149. ulDataSize = 0;
  150. pPacketData = NULL;
  151. usFlag = 0;
  152. if ((!pPacket->IsLost()) && pPacketBuffer)
  153. {
  154.     bIsLost = FALSE;
  155.     ulDataSize = pPacketBuffer->GetSize();
  156.     pPacketData = pPacketBuffer->GetBuffer();
  157.     if (m_pRuleToFlagMap)
  158.     {
  159. usFlag = m_pRuleToFlagMap[pPacket->GetASMRuleNumber()];
  160.     }
  161. }
  162. status = m_IBufs.OnPacket(pPacketData,
  163.   ulDataSize,
  164.   m_ulSequence,
  165.   pPacket->GetTime(),
  166.   bIsLost,
  167.   usFlag);
  168. if (SUCCEEDED(status))
  169. {
  170.     m_ulSequence++;
  171. }
  172. else
  173. {
  174.     if (m_IBufs.IsISuperBlockDone())
  175.     {
  176. m_pPendingPacketQueue->AddHead(pPacket);
  177. pPacket = NULL;
  178. pPacketBuffer = NULL;
  179.     }
  180.     else
  181.     {
  182. // Packet was rejected and did not accomplish completion
  183. // of a super-block.  Throw it away.
  184. m_ulSequence++;
  185.     }
  186. }
  187. HX_RELEASE(pPacketBuffer);
  188. HX_RELEASE(pPacket);
  189.     }
  190.     return m_IBufs.IsISuperBlockFilled();
  191. }
  192. BOOL
  193. CRealAudioSimplePacketFeeder::IsCurrentTimeRangeEnded(void)
  194. {
  195.     BOOL bTimeRangeEnded = m_bEndOfPackets;
  196.     return bTimeRangeEnded;
  197. }
  198. BOOL
  199. CRealAudioSimplePacketFeeder::IsCurrentTimeRangeEmpty(void)
  200. {
  201.     BOOL bTimeRangeEmpty = m_pPendingPacketQueue->IsEmpty();
  202.     return bTimeRangeEmpty;
  203. }
  204. UINT32
  205. CRealAudioSimplePacketFeeder::GetCurrentTimeRangeEnd(void)
  206. {
  207.     UINT32 ulPacketEndTime = m_ulLastPacketTime + ((UINT32) GetMSPerBlock());
  208.     UINT32 ulBufferEndTime = m_IBufs.m_IBlockTimeRange.m_ulEnd;
  209.     UINT32 ulRet = (((ulBufferEndTime != NO_TIME_SET) && 
  210.      IsTimeGreater(ulBufferEndTime, ulPacketEndTime)) ? 
  211.     ulBufferEndTime : ulPacketEndTime);
  212.  
  213.     return ulRet;
  214. }
  215. BOOL
  216. CRealAudioSimplePacketFeeder::SetCrossFadeEndTime(UINT32 ulTimestamp)
  217. {
  218.     // move data forward if we can
  219.     FillISuperBlock();
  220.     return Discard(ulTimestamp, FALSE); // Discard after time
  221. }
  222. BOOL
  223. CRealAudioSimplePacketFeeder::Discard(UINT32 ulTimestamp, BOOL bBefore)
  224. {
  225.     IHXPacket* pPacket;
  226.     BOOL bDone = FALSE;
  227.     BOOL bDiscard = FALSE;
  228.     if (!m_pPendingPacketQueue->IsEmpty())
  229.     {
  230. // Remove from the unregistration queue if in there
  231. LISTPOSITION currentPosition = NULL;
  232. LISTPOSITION nextPosition = m_pPendingPacketQueue->GetHeadPosition();
  233. do
  234. {
  235.     currentPosition = nextPosition;
  236.     pPacket = (IHXPacket*) m_pPendingPacketQueue->GetNext(nextPosition);
  237.     
  238.     if ((!bDiscard && !bBefore) || (bDiscard && bBefore))
  239.     {
  240. if (!pPacket->IsLost())
  241. {
  242.     if (bBefore)
  243.     {
  244. bDiscard = IsTimeLess(pPacket->GetTime(), ulTimestamp);
  245.     }
  246.     else
  247.     {
  248. bDiscard = IsTimeGreaterOrEqual(pPacket->GetTime(), ulTimestamp);
  249.     }
  250.     if (!bDone)
  251.     {
  252. // We are done if packets exist preceeding the discard point
  253. bDone = (!bDiscard);
  254.     }
  255. }
  256.     }
  257.     if (bDiscard)
  258.     {
  259. m_pPendingPacketQueue->RemoveAt(currentPosition);
  260. HX_RELEASE(pPacket);
  261.     }
  262. } while (nextPosition);
  263.     }
  264.     return bDone;
  265. }
  266. BOOL
  267. CRealAudioSimplePacketFeeder::DiscardTillEndOfCrossFade(UINT32 ulTimestamp,
  268. BOOL bHandled)
  269. {
  270.     m_ulContinueDiscardUntilTime = NO_TIME_SET;
  271.     if (!bHandled)
  272.     {
  273. bHandled = Discard(ulTimestamp, TRUE);  // Discard before time
  274.     }
  275.     // if still not done, continue discard until done
  276.     if (!bHandled)
  277.     {
  278. // this means we have to watch packets coming into the format
  279. // and toss out blocks for superblocks that are earlier than
  280. // this time
  281. m_ulContinueDiscardUntilTime = ulTimestamp;
  282.     }
  283.     return bHandled;
  284. }
  285. HX_RESULT 
  286. CRealAudioSimplePacketFeeder::SetupForNextTimeRange(void)
  287. {
  288.     m_ulContinueDiscardUntilTime = NO_TIME_SET;
  289.     return HXR_OK;
  290. }
  291. /****************************************************************************
  292.  *  Protected methods
  293.  */
  294. void
  295. CRealAudioSimplePacketFeeder::_Reset(void)
  296. {
  297.     IHXPacket* pPacket;
  298.     if (m_pPendingPacketQueue != NULL)
  299.     {
  300. while (!m_pPendingPacketQueue->IsEmpty())
  301. {
  302.     pPacket = (IHXPacket*)m_pPendingPacketQueue->RemoveHead();
  303.     HX_RELEASE(pPacket);
  304. }
  305.     }
  306.     m_ulContinueDiscardUntilTime = NO_TIME_SET;
  307.     m_ulLastPacketTime = NO_TIME_SET;
  308.     m_bEndOfPackets = FALSE;
  309. }