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

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 "hlxclib/stdio.h"
  36. #include "hxtypes.h"
  37. #include "hxresult.h"
  38. #include "hxcom.h"
  39. #ifdef _WINDOWS
  40. #include <windows.h>
  41. #endif
  42. #include "ihxpckts.h"
  43. #include "hxfiles.h"
  44. #include "hxengin.h"
  45. #include "hxcore.h"
  46. #include "hxasm.h"
  47. #include "hxgroup.h"
  48. #include "hxplay.h"
  49. #include "hxsmbw.h"
  50. #include "hxprefs.h"
  51. #include "hxslist.h"
  52. #include "hxstring.h"
  53. #include "chxpckts.h"
  54. #include "hxbsrc.h"
  55. #include "hxsrc.h"
  56. #include "hxsmstr.h"
  57. #include "hxstrm.h"
  58. #include "hxstrutl.h"
  59. #include "hxheap.h"
  60. #ifdef _DEBUG
  61. #undef HX_THIS_FILE
  62. static const char HX_THIS_FILE[] = __FILE__;
  63. #endif
  64. HXStream::HXStream() :
  65.      m_lRefCount (0)
  66.     ,m_pSource (NULL)
  67.     ,m_pHeader (NULL)
  68.     ,m_pUnkRenderer(NULL)
  69.     ,m_uStreamNumber(0)
  70.     ,m_ulRegistryID(0)
  71. #if defined(HELIX_FEATURE_ASM)
  72.     ,m_pASMStream(NULL)
  73. #endif /* HELIX_FEATURE_ASM */
  74.     ,m_bPostSeekToBeSent(FALSE)
  75. {
  76. }
  77. HXStream::~HXStream()
  78. {
  79.     if (m_pSource)
  80.     {
  81. m_pSource->Release();
  82.     }
  83.     if (m_pHeader)
  84.     {
  85. m_pHeader->Release();
  86.     }
  87.     if (m_pUnkRenderer)
  88.     {
  89. m_pUnkRenderer->Release();
  90.     }
  91. #if defined(HELIX_FEATURE_ASM)
  92.     HX_RELEASE(m_pASMStream);
  93. #endif /* HELIX_FEATURE_ASM */
  94. }
  95. /////////////////////////////////////////////////////////////////////////
  96. // Method:
  97. // IUnknown::QueryInterface
  98. // Purpose:
  99. // Implement this to export the interfaces supported by your 
  100. // object.
  101. //
  102. STDMETHODIMP HXStream::QueryInterface(REFIID riid, void** ppvObj)
  103. {
  104.     QInterfaceList qiList[] =
  105.         {
  106.             { GET_IIDHANDLE(IID_IHXStream), (IHXStream*)this },
  107.             { GET_IIDHANDLE(IID_IHXRegistryID), (IHXRegistryID*)this },
  108.             { GET_IIDHANDLE(IID_IHXLayoutStream), (IHXLayoutStream*)this },
  109.             { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)(IHXStream*)this },
  110.         };
  111.     
  112.     HX_RESULT res = ::QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
  113.     
  114.     // if it succeeded, return immediately...
  115.     if (SUCCEEDED(res))
  116.     {
  117.         return res;
  118.     }
  119.     // ...otherwise proceed
  120.     
  121. #if defined(HELIX_FEATURE_ASM)
  122.     /* Let HXASMStream respond to ASM interface if it wants to. */
  123.     if (m_pASMStream && (HXR_OK == m_pASMStream->QueryInterface(riid, ppvObj)))
  124.     {
  125. return HXR_OK;
  126.     }
  127. #endif /* HELIX_FEATURE_ASM */
  128.     *ppvObj = NULL;
  129.     return HXR_NOINTERFACE;
  130. }
  131. /////////////////////////////////////////////////////////////////////////
  132. // Method:
  133. // IUnknown::AddRef
  134. // Purpose:
  135. // Everyone usually implements this the same... feel free to use
  136. // this implementation.
  137. //
  138. STDMETHODIMP_(ULONG32) HXStream::AddRef()
  139. {
  140.     return InterlockedIncrement(&m_lRefCount);
  141. }
  142. /////////////////////////////////////////////////////////////////////////
  143. // Method:
  144. // IUnknown::Release
  145. // Purpose:
  146. // Everyone usually implements this the same... feel free to use
  147. // this implementation.
  148. //
  149. STDMETHODIMP_(ULONG32) HXStream::Release()
  150. {
  151.     if (InterlockedDecrement(&m_lRefCount) > 0)
  152.     {
  153. return m_lRefCount;
  154.     }
  155.     delete this;
  156.     return 0;
  157. }
  158. /*
  159.  * IHXStream methods
  160.  */
  161. /************************************************************************
  162.  * Method:
  163.  *     IHXStream::GetSource
  164.  * Purpose:
  165.  *     Get the interface to the source object of which the stream is
  166.  *     a part of.
  167.  *
  168.  */
  169. STDMETHODIMP HXStream::GetSource(IHXStreamSource* &pSource)
  170. {
  171.     pSource = m_pSource;
  172.     if (pSource)
  173.     {
  174. pSource->AddRef();
  175.     }
  176.     return HXR_OK;
  177. }
  178. /************************************************************************
  179.  * Method:
  180.  *     IHXStream::GetStreamNumber
  181.  * Purpose:
  182.  *     Get the stream number for this stream relative to the source 
  183.  *     object of which the stream is a part of.
  184.  *
  185.  */
  186. STDMETHODIMP_(UINT16) HXStream::GetStreamNumber(void)
  187. {
  188.     HX_ASSERT(m_pHeader);
  189.     return (UINT16)m_uStreamNumber;
  190. }
  191. /************************************************************************
  192.  * Method:
  193.  *     IHXStream::GetStreamType
  194.  * Purpose:
  195.  *     Get the MIME type for this stream. NOTE: The returned string is
  196.  *     assumed to be valid for the life of the IHXStream from which it
  197.  *     was returned.
  198.  *
  199.  */
  200. STDMETHODIMP_(const char*) HXStream::GetStreamType(void)
  201. {
  202.     HX_ASSERT(m_pHeader);
  203.     IHXBuffer* pMimeTypeBuffer = 0;
  204.     m_pHeader->GetPropertyCString("MimeType",pMimeTypeBuffer);
  205.     HX_ASSERT(pMimeTypeBuffer);
  206.     const char* pMimeTypeString = (const char* )pMimeTypeBuffer->GetBuffer();
  207.     pMimeTypeBuffer->Release();
  208.     return pMimeTypeString;
  209. }
  210. /************************************************************************
  211.  * Method:
  212.  *     IHXStream::GetHeader
  213.  * Purpose:
  214.  *      Get the header for this stream.
  215.  *
  216.  */
  217. STDMETHODIMP_(IHXValues*) HXStream::GetHeader(void)
  218. {
  219.     HX_ASSERT(m_pHeader);
  220.     m_pHeader->AddRef();
  221.     return m_pHeader;
  222. }
  223. /************************************************************************
  224.  * Method:
  225.  *     IHXStream::ReportQualityOfService
  226.  * Purpose:
  227.  *     Call this method to report to the playback context that the 
  228.  *     quality of service for this stream has changed. The unQuality
  229.  *     should be on a scale of 0 to 100, where 100 is the best possible
  230.  *     quality for this stream. Although the transport engine can 
  231.  *     determine lost packets and report these through the user
  232.  *     interface, only the renderer of this stream can determine the 
  233.  *     "real" perceived damage associated with this loss.
  234.  *
  235.  *     NOTE: The playback context may use this value to indicate loss
  236.  *     in quality to the user interface. When the effects of a lost
  237.  *     packet are eliminated the renderer should call this method with
  238.  *     a unQuality of 100.
  239.  *
  240.  */
  241. STDMETHODIMP HXStream::ReportQualityOfService(UINT8 unQuality)
  242. {
  243.     return HXR_NOTIMPL;
  244. }
  245. /************************************************************************
  246.  * Method:
  247.  *     IHXStream::ReportRebufferStatus
  248.  * Purpose:
  249.  *     Call this method to report to the playback context that the
  250.  *     available data has dropped to a critically low level, and that
  251.  *     rebuffering should occur. The renderer should call back into this
  252.  *     interface as it receives additional data packets to indicate the
  253.  *     status of its rebuffering effort.
  254.  *
  255.  *     NOTE: The values of unNeeded and unAvailable are used to indicate
  256.  *     the general status of the rebuffering effort. For example, if a
  257.  *     renderer has "run dry" and needs 5 data packets to play smoothly
  258.  *     again, it should call ReportRebufferStatus() with 5,0 then as
  259.  *     packet arrive it should call again with 5,1; 5,2... and eventually
  260.  *     5,5.
  261.  *
  262.  */
  263. STDMETHODIMP HXStream::ReportRebufferStatus(UINT8 unNeeded, UINT8 unAvailable)
  264. {
  265.     if (m_pSource && m_pHeader)
  266.     {
  267. return m_pSource->ReportRebufferStatus(GetStreamNumber(), 
  268. unNeeded, unAvailable);
  269.     }
  270.     return HXR_OK;
  271. }
  272. STDMETHODIMP
  273. HXStream::SetGranularity (ULONG32 ulGranularity) 
  274. {
  275.     if (m_pSource && m_pHeader)
  276.     {
  277. return m_pSource->SetGranularity(GetStreamNumber(),ulGranularity);
  278.     }
  279.     return HXR_OK;
  280. }
  281. /************************************************************************
  282.  *  Method:
  283.  *    IHXStream::GetRendererCount
  284.  *  Purpose:
  285.  *    Returns the current number of renderer instances supported by
  286.  *    this stream instance.
  287.  */
  288. STDMETHODIMP_(UINT16) HXStream::GetRendererCount()
  289. {
  290.     // In RMA 1.0 there is only one renderer per stream.
  291.     return 1;
  292. }
  293. /************************************************************************
  294.  *  Method:
  295.  *    IHXStream::GetRenderer
  296.  *  Purpose:
  297.  *    Returns the Nth renderer instance supported by this stream.
  298.  */
  299. STDMETHODIMP HXStream::GetRenderer
  300. (
  301.     UINT16 nIndex,
  302.     REF(IUnknown*) pUnknown
  303. )
  304. {
  305.     if (nIndex >= 1)
  306.     {
  307. return HXR_INVALID_PARAMETER;
  308.     }
  309.     pUnknown = m_pUnkRenderer;
  310.     if (pUnknown)
  311.     {
  312. pUnknown->AddRef();
  313. return HXR_OK;
  314.     }
  315.     else
  316.     {
  317. return HXR_FAIL;
  318.     }
  319. }
  320. HX_RESULT    HXStream::Init(HXPlayer* pPlayer, HXSource* pSource, IHXValues* pHeader, 
  321.      IUnknown* pUnkRenderer)
  322. {
  323.     m_pSource     = pSource;
  324.     m_pHeader     = pHeader;
  325.     if (m_pSource)
  326.     {
  327. m_pSource->AddRef();
  328.     }
  329.     if (m_pHeader)
  330.     {
  331. m_pHeader->AddRef();
  332. ULONG32 uStreamNumber = 0;
  333. m_pHeader->GetPropertyULONG32("StreamNumber",uStreamNumber);
  334. m_uStreamNumber = (UINT16) uStreamNumber;
  335.     }
  336. #if defined(HELIX_FEATURE_STATS) && defined(HELIX_FEATURE_REGISTRY)
  337.     UINT32 ulSourceID;
  338.     char pStreamEntry[MAX_DISPLAY_NAME]; /* Flawfinder: ignore */
  339.     IHXBuffer* pPropName;
  340.     m_pSource->GetID(ulSourceID);
  341.     m_pSource->m_pRegistry->GetPropName(ulSourceID, pPropName);
  342.     SafeSprintf(pStreamEntry, MAX_DISPLAY_NAME, "%s.Stream%d", pPropName->GetBuffer(), m_uStreamNumber);
  343.     m_ulRegistryID = m_pSource->m_pRegistry->GetId(pStreamEntry);
  344.     HX_ASSERT(m_ulRegistryID);
  345.     pPropName->Release();
  346. #endif /* HELIX_FEATURE_STATS && HELIX_FEATURE_REGISTRY */
  347.     if (pUnkRenderer)
  348.     {
  349. m_pUnkRenderer = pUnkRenderer;
  350. m_pUnkRenderer->AddRef();
  351.     }
  352. #if defined(HELIX_FEATURE_ASM)
  353.     m_pASMStream = new HXASMStream(this, m_pSource);
  354.     if(m_pASMStream)
  355.     {
  356.         m_pASMStream->AddRef();
  357.     }
  358.     else
  359.     {
  360.         return HXR_OUTOFMEMORY;
  361.     }
  362. #endif /* HELIX_FEATURE_ASM */
  363.     return HXR_OK;
  364. }
  365. HX_RESULT
  366. HXStream::SetRenderer(IUnknown* pUnkRenderer)
  367. {
  368.     if (pUnkRenderer && m_pUnkRenderer != pUnkRenderer)
  369.     {
  370. HX_RELEASE(m_pUnkRenderer);
  371. m_pUnkRenderer = pUnkRenderer;
  372. m_pUnkRenderer->AddRef();
  373.     }
  374.     return HXR_OK;
  375. }
  376. /************************************************************************
  377.  * Method:
  378.  *     IHXRegistryID::GetID
  379.  * Purpose:
  380.  *     Get registry ID(hash_key) of the objects(player, source and stream)
  381.  *
  382.  */
  383. STDMETHODIMP
  384. HXStream::GetID(REF(UINT32) /*OUT*/ ulRegistryID)
  385. {
  386.     ulRegistryID = m_ulRegistryID;
  387.    
  388.     return HXR_OK;
  389. }
  390. STDMETHODIMP
  391. HXStream::GetProperties(REF(IHXValues*) pProps)
  392. {
  393.     HX_RESULT     rc = HXR_OK;
  394.     STREAM_INFO*    pStreamInfo = NULL;    
  395.     if (!m_pSource || HXR_OK != m_pSource->GetStreamInfo(m_uStreamNumber, pStreamInfo))
  396.     {
  397. rc = HXR_FAILED;
  398. goto cleanup;
  399.     }
  400.     pProps = pStreamInfo->m_pStreamProps;
  401.     HX_ADDREF(pProps);
  402. cleanup:
  403.     return rc;
  404. }
  405. STDMETHODIMP
  406. HXStream::SetProperties(IHXValues* pProps)
  407. {
  408.     HX_RESULT     rc = HXR_OK;
  409.     UINT32     ulDelay = 0;
  410.     UINT32     ulDuration = 0;
  411.     STREAM_INFO*    pStreamInfo = NULL;
  412.     if (!m_pSource || HXR_OK != m_pSource->GetStreamInfo(m_uStreamNumber, pStreamInfo))
  413.     {
  414. rc = HXR_FAILED;
  415. goto cleanup;
  416.     }
  417.     if (HXR_OK == pProps->GetPropertyULONG32("delay", ulDelay))
  418.     {
  419. m_pSource->UpdateDelay(ulDelay);
  420.     }
  421.     if (HXR_OK == pProps->GetPropertyULONG32("duration", ulDuration))
  422.     {
  423. m_pSource->UpdateDuration(ulDuration);
  424.     }
  425.     HX_RELEASE(pStreamInfo->m_pStreamProps);
  426.     pStreamInfo->m_pStreamProps = pProps;
  427.     HX_ADDREF(pStreamInfo->m_pStreamProps);
  428. cleanup:
  429.     return rc;
  430. }
  431. HX_RESULT
  432. HXStream::ResetASMSource(IHXASMSource* pASMSource)
  433. {
  434.     HX_RESULT hr = HXR_OK;
  435. #if defined(HELIX_FEATURE_ASM)
  436.     if (!m_pASMStream)
  437.     {
  438. hr = HXR_FAILED;
  439. goto cleanup;
  440.     }
  441.     hr = m_pASMStream->ResetASMSource(pASMSource);
  442. cleanup:
  443. #endif /* HELIX_FEATURE_ASM */
  444.     return hr;
  445. }
  446. BOOL
  447. HXStream::IsTimeStampDelivery()
  448. {
  449.     BOOL bTimeStampDelivered = FALSE;
  450. #if defined(HELIX_FEATURE_ASM)
  451.     if (m_pASMStream)
  452.     {
  453. bTimeStampDelivered = m_pASMStream->IsTimeStampDelivery();
  454.     }
  455. #endif /* HELIX_FEATURE_ASM */
  456.     return bTimeStampDelivered;
  457. }
  458. void
  459. HXStream::PostEndTimePacket(IHXPacket* pPacket, BOOL& bSentMe, BOOL& bEndMe)
  460. {
  461.     bSentMe = TRUE;
  462.     bEndMe = TRUE;
  463. #if defined(HELIX_FEATURE_ASM)
  464.     if (!pPacket || !m_pASMStream)
  465.     {
  466. goto cleanup;
  467.     }
  468.     m_pASMStream->PostEndTimePacket(pPacket, bSentMe, bEndMe);
  469. cleanup:
  470. #endif /* HELIX_FEATURE_ASM */
  471.     return;
  472. }
  473.     
  474. void
  475. HXStream::ResetASMRuleState(void)
  476. {
  477. #if defined(HELIX_FEATURE_ASM)
  478.     if (m_pASMStream)
  479.     {
  480. m_pASMStream->ResetASMRuleState();
  481.     }
  482. #endif /* HELIX_FEATURE_ASM */
  483.     return;
  484. }
  485. HXSource*
  486. HXStream::GetHXSource(void)
  487. {
  488.     if (m_pSource)
  489.     {
  490. m_pSource->AddRef(); 
  491.     }
  492.     return m_pSource;
  493. }
  494. BOOL
  495. HXStream::IsSureStream(void)
  496. {
  497.     UINT32 ulThresholds = 0;
  498. #if defined(HELIX_FEATURE_ASM)
  499.     if (m_pASMStream)
  500.     {
  501. ulThresholds = m_pASMStream->GetNumThresholds();
  502. if (ulThresholds > 1)
  503. {
  504.     return TRUE;
  505. }
  506.     }
  507. #endif /* HELIX_FEATURE_ASM */
  508.     return FALSE;
  509. }