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

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. // 
  37. //  SDP Stream Description plugin
  38. //
  39. #include "sdpplin.ver"
  40. #include "hlxclib/stdlib.h"
  41. #define INITGUID 1
  42. #include "hxtypes.h"
  43. #include "hxcom.h"
  44. #include "hxstring.h"
  45. #include "hxslist.h"
  46. #include "chxpckts.h"
  47. #include "hxplugn.h"
  48. #include "hxengin.h"
  49. #include "hxsdesc.h"
  50. #include "hxcomm.h"
  51. #include "hxmon.h"
  52. #include "hxstrutl.h"        // strcasecmp
  53. #include "hxcore.h"        // IHXPlayer
  54. #include "hxupgrd.h"        // IHXUpgradeCollection
  55. #include "rtsputil.h"
  56. #include "rtspprop.h"
  57. #include "sdpprop.h"
  58. #include "sdpplin.h"
  59. #include "sdptypes.h"
  60. #include "sdpmdparse.h"
  61. #include "sdpmdgen.h"
  62. #include "sdppyldinfo.h"
  63. #undef INITGUID
  64. #include "hxver.h"
  65. #include "hxheap.h"
  66. #ifdef _DEBUG
  67. #undef HX_THIS_FILE                
  68. static const char HX_THIS_FILE[] = __FILE__;
  69. #endif
  70. #ifdef _AIX
  71. #include "hxtbuf.h"
  72. #include "dllpath.h"
  73. ENABLE_MULTILOAD_DLLACCESS_PATHS(Sdpplin);
  74. #endif
  75. #if defined(HELIX_FEATURE_SERVER)
  76. #define SDP_MAJOR   6L
  77. #define SDP_MINOR   0L
  78. #define SDP_RELEASE 7L
  79. #define SDP_BUILD   4248L
  80. #define SDP_MEDIA_DESC_GENERATOR_VERSION HX_ENCODE_PROD_VERSION(SDP_MAJOR,SDP_MINOR,SDP_RELEASE,SDP_BUILD)
  81. #endif
  82. #if defined(HELIX_CONFIG_NOSTATICS)
  83. #include "globals/hxglobalint.h"
  84. #define DLLRefType const INT32
  85. #else
  86. #define DLLRefType INT32
  87. #endif
  88. static DLLRefType g_nRefCount_sdpp = 0 ;
  89. INT32& RefCountSDPP()
  90. {
  91. #if defined(HELIX_CONFIG_NOSTATICS)
  92.     return HXGlobalInt32::Get((GlobalID)&g_nRefCount_sdpp);
  93. #else
  94.     return g_nRefCount_sdpp;
  95. #endif
  96. }
  97. /****************************************************************************
  98.  * 
  99.  *  Function:
  100.  * 
  101.  *        HXCreateInstance()
  102.  * 
  103.  *  Purpose:
  104.  * 
  105.  *        Function implemented by all plugin DLL's to create an instance of 
  106.  *        any of the objects supported by the DLL. This method is similar to 
  107.  *        Window's CoCreateInstance() in its purpose, except that it only 
  108.  *        creates objects from this plugin DLL.
  109.  *
  110.  *        NOTE: Aggregation is never used. Therefore and outer unknown is
  111.  *        not passed to this function, and you do not need to code for this
  112.  *        situation.
  113.  * 
  114.  */
  115. STDAPI ENTRYPOINT(HXCREATEINSTANCE)
  116. (
  117.     IUnknown**  /*OUT*/        ppIUnknown
  118. )
  119. {
  120.     *ppIUnknown = (IUnknown*)(IHXPlugin*)new CSDPStreamDescription;
  121.     if (*ppIUnknown)
  122.     {
  123.         (*ppIUnknown)->AddRef();
  124.         return HXR_OK;
  125.     }
  126.     return HXR_OUTOFMEMORY;
  127. }
  128. /****************************************************************************
  129.  * 
  130.  *  Function:
  131.  * 
  132.  *        CanUnload()
  133.  * 
  134.  *  Purpose:
  135.  * 
  136.  *        Function implemented by all plugin DLL's if it returns HXR_OK 
  137.  *        then the pluginhandler can unload the DLL
  138.  *
  139.  */
  140. STDAPI ENTRYPOINT(CanUnload2)(void)
  141. {
  142.     return (RefCountSDPP() ? HXR_FAIL : HXR_OK);
  143. }
  144. STDAPI ENTRYPOINT(CanUnload)(void)
  145. {
  146.     return ENTRYPOINT(CanUnload2)();
  147. }
  148. const char* const CSDPStreamDescription::zm_pDescription    = "RealNetworks SDP Stream Description Plugin";
  149. const char* const CSDPStreamDescription::zm_pCopyright      = HXVER_COPYRIGHT;
  150. const char* const CSDPStreamDescription::zm_pMoreInfoURL    = HXVER_MOREINFO;
  151. const char* const CSDPStreamDescription::zm_pStreamDescriptionMimeType  = 
  152.     "application/sdp";
  153. /************************************************************************
  154.  *  Method:
  155.  *    IHXPlugin::InitPlugin
  156.  *  Purpose:
  157.  *    Initializes the plugin for use. This interface must always be
  158.  *    called before any other method is called. This is primarily needed 
  159.  *    so that the plugin can have access to the context for creation of
  160.  *    IHXBuffers and IMalloc.
  161.  */
  162. STDMETHODIMP CSDPStreamDescription::InitPlugin(IUnknown* /*IN*/ pContext)
  163. {
  164.     HX_RESULT res = HXR_FAILED;
  165.     m_pContext = pContext;
  166.     m_pContext->AddRef();
  167.     m_pContext->QueryInterface(IID_IHXCommonClassFactory, (void**)&m_pCCF);
  168.     if (m_pCCF != NULL)
  169.     {
  170.         res = HXR_OK;
  171.     }
  172.     if (SUCCEEDED(res) && m_pDescParser)
  173.     {
  174.         res = m_pDescParser->Init(pContext);
  175.     }
  176.     if (SUCCEEDED(res) && m_pDescGenerator)
  177.     {
  178.         res = m_pDescGenerator->Init(pContext);
  179.     }
  180.     return res;
  181. }
  182. /************************************************************************
  183.  *  Method:
  184.  *    IHXPlugin::GetPluginInfo
  185.  *  Purpose:
  186.  *    Returns the basic information about this plugin. Including:
  187.  *
  188.  *    bLoadMultiple        whether or not this plugin DLL can be loaded
  189.  *                        multiple times. All File Formats must set
  190.  *                        this value to TRUE.
  191.  *    pDescription        which is used in about UIs (can be NULL)
  192.  *    pCopyright        which is used in about UIs (can be NULL)
  193.  *    pMoreInfoURL        which is used in about UIs (can be NULL)
  194.  */
  195. STDMETHODIMP CSDPStreamDescription::GetPluginInfo
  196. (
  197.     REF(BOOL)        /*OUT*/ bLoadMultiple,
  198.     REF(const char*) /*OUT*/ pDescription,
  199.     REF(const char*) /*OUT*/ pCopyright,
  200.     REF(const char*) /*OUT*/ pMoreInfoURL,
  201.     REF(ULONG32)     /*OUT*/ ulVersionNumber
  202. )
  203. {
  204.     bLoadMultiple = TRUE;   // Must be true for file formats.
  205.     pDescription    = zm_pDescription;
  206.     pCopyright      = zm_pCopyright;
  207.     pMoreInfoURL    = zm_pMoreInfoURL;
  208.     ulVersionNumber = TARVER_ULONG32_VERSION;
  209.     return HXR_OK;
  210. }
  211. /************************************************************************
  212.  *  Method:
  213.  *    IHXPlugin::GetStreamDescriptionInfo
  214.  *  Purpose:
  215.  *    If this object is a stream description object this method returns
  216.  *    information vital to the instantiation of stream description plugins.
  217.  *    If this object is not a stream description object, it should return
  218.  *    HXR_UNEXPECTED.
  219.  */
  220. STDMETHODIMP CSDPStreamDescription::GetStreamDescriptionInfo
  221. (
  222.     REF(const char*) /*OUT*/ pStreamDescriptionMimeType
  223. )
  224. {
  225.     pStreamDescriptionMimeType  = zm_pStreamDescriptionMimeType;
  226.     return HXR_OK;
  227. }
  228. // *** IUnknown methods ***
  229. /////////////////////////////////////////////////////////////////////////
  230. //  Method:
  231. //        IUnknown::QueryInterface
  232. //  Purpose:
  233. //        Implement this to export the interfaces supported by your 
  234. //        object.
  235. //
  236. STDMETHODIMP CSDPStreamDescription::QueryInterface(REFIID riid, void** ppvObj)
  237. {
  238.     if (IsEqualIID(riid, IID_IUnknown))
  239.     {
  240.         AddRef();
  241.         *ppvObj = this;
  242.         return HXR_OK;
  243.     }
  244.     else if (IsEqualIID(riid, IID_IHXPlugin))
  245.     {
  246.         AddRef();
  247.         *ppvObj = (IHXPlugin*)this;
  248.         return HXR_OK;
  249.     }
  250.     else if (IsEqualIID(riid, IID_IHXStreamDescription))
  251.     {
  252.         AddRef();
  253.         *ppvObj = (IHXStreamDescription*)this;
  254.         return HXR_OK;
  255.     }
  256.     else if (IsEqualIID(riid, IID_IHXStreamDescriptionSettings))
  257.     {
  258.         AddRef();
  259.         *ppvObj = (IHXStreamDescriptionSettings*)this;
  260.         return HXR_OK;
  261.     }
  262.     else if (IsEqualIID(riid, IID_IHXRTPPayloadInfo))
  263.     {
  264.         AddRef();
  265.         *ppvObj = (IHXRTPPayloadInfo*)this;
  266.         return HXR_OK;
  267.     }
  268.     *ppvObj = NULL;
  269.     return HXR_NOINTERFACE;
  270. }
  271. /////////////////////////////////////////////////////////////////////////
  272. //  Method:
  273. //        IUnknown::AddRef
  274. //  Purpose:
  275. //        Everyone usually implements this the same... feel free to use
  276. //        this implementation.
  277. //
  278. STDMETHODIMP_(ULONG32) CSDPStreamDescription::AddRef()
  279. {
  280.     return InterlockedIncrement(&m_lRefCount);
  281. }
  282. /////////////////////////////////////////////////////////////////////////
  283. //  Method:
  284. //        IUnknown::Release
  285. //  Purpose:
  286. //        Everyone usually implements this the same... feel free to use
  287. //        this implementation.
  288. //
  289. STDMETHODIMP_(ULONG32) CSDPStreamDescription::Release()
  290. {
  291.     if (InterlockedDecrement(&m_lRefCount) > 0)
  292.     {
  293.         return m_lRefCount;
  294.     }
  295.     delete this;
  296.     return 0;
  297. }
  298. // *** IHXStreamDescription methods ***
  299. CSDPStreamDescription::CSDPStreamDescription()
  300.                 : m_lRefCount(0)
  301.                 , m_pDescParser(0)
  302.                 , m_pDescGenerator(0)
  303.                 , m_pContext(0)
  304.                 , m_pCCF(0)
  305. {
  306.     RefCountSDPP()++;
  307.     m_pDescParser = new SDPMediaDescParser(TARVER_ULONG32_VERSION);
  308. #if defined(HELIX_FEATURE_SERVER)
  309.     m_pDescGenerator = new SDPMediaDescGenerator(SDP_MEDIA_DESC_GENERATOR_VERSION);
  310. #endif /* defined(HELIX_FEATURE_SERVER) */
  311. }
  312. CSDPStreamDescription::~CSDPStreamDescription()
  313. {
  314.     RefCountSDPP()--;
  315.     delete m_pDescParser;
  316.     HX_DELETE(m_pDescGenerator);
  317.     HX_RELEASE(m_pCCF);
  318.     HX_RELEASE(m_pContext);
  319. }
  320. HX_RESULT
  321. CSDPStreamDescription::Update()
  322. {
  323.     IHXPlayer* pPlayer = NULL;
  324.     if (HXR_OK == m_pContext->QueryInterface(IID_IHXPlayer, (void**)&pPlayer))
  325.     {            
  326.         IHXUpgradeCollection* pUpgradeCollection = NULL;
  327.         if (HXR_OK == pPlayer->QueryInterface(IID_IHXUpgradeCollection, 
  328.                 (void**)&pUpgradeCollection))
  329.         {
  330.             IHXBuffer* pBuf = NULL;
  331.             m_pCCF->CreateInstance(CLSID_IHXBuffer, (void**)&pBuf);
  332.             if (!pBuf)
  333.             {
  334.                 HX_RELEASE(pUpgradeCollection);
  335.                 HX_RELEASE(pPlayer);                
  336.                 return HXR_OUTOFMEMORY;
  337.             }
  338.             pBuf->Set((const BYTE*)zm_pStreamDescriptionMimeType, 
  339.                     strlen(zm_pStreamDescriptionMimeType) + 1);
  340.             pUpgradeCollection->Add(eUT_Required, pBuf, 0, 0);
  341.             HX_RELEASE(pBuf);
  342.         }
  343.         HX_RELEASE(pUpgradeCollection);    
  344.     }
  345.     HX_RELEASE(pPlayer);                
  346.     return HXR_OK;
  347. }
  348. STDMETHODIMP
  349. CSDPStreamDescription::GetValues(IHXBuffer* pDescription,
  350.     REF(UINT16) nValues, REF(IHXValues**) pValueArray)
  351. {
  352.     HX_RESULT res = HXR_UNEXPECTED;
  353.     if (m_pDescParser)
  354.         res = m_pDescParser->Parse(pDescription, nValues, pValueArray);
  355.     if (HXR_REQUEST_UPGRADE == res)
  356.     {
  357.         res = Update();
  358.         if (HXR_OK == res)
  359.             res = HXR_REQUEST_UPGRADE;
  360.     }
  361.     return res;
  362. }
  363. STDMETHODIMP
  364. CSDPStreamDescription::GetDescription(UINT16 nValues, IHXValues** pValueArray,
  365.     REF(IHXBuffer*) pDescription)
  366. {
  367.     HX_RESULT res = HXR_UNEXPECTED;
  368.     if (m_pDescGenerator)
  369.         res = m_pDescGenerator->Generate(nValues, pValueArray, pDescription);
  370.     return res;
  371. }
  372. // *** IHXStreamDescriptionSettings methods ***
  373. STDMETHODIMP
  374. CSDPStreamDescription::SetOption(const char* pKey, IHXBuffer* pVal)
  375. {
  376.     if (pKey == NULL || pVal == NULL)
  377.     {
  378.         return HXR_POINTER;
  379.     }
  380.     const char* pszVal = (const char*)pVal->GetBuffer();
  381.     if (pszVal == NULL || *(pszVal+pVal->GetSize()-1) != '')
  382.     {
  383.         return HXR_UNEXPECTED;
  384.     }
  385.     HX_RESULT pnr = HXR_FAIL;
  386.     if ((strcasecmp(pKey, "UseOldEOL") == 0) && m_pDescGenerator)
  387.     {
  388.         if (strcasecmp(pszVal, "true") == 0)
  389.         {
  390.             m_pDescGenerator->SetUseOldEOL(TRUE);
  391.             pnr = HXR_OK;
  392.         }
  393.         else if (strcasecmp(pszVal, "false") == 0)
  394.         {
  395.             m_pDescGenerator->SetUseOldEOL(FALSE);
  396.             pnr = HXR_OK;
  397.         }
  398.     }
  399.     else if (strcasecmp(pKey, "AbsoluteBaseURL") == 0)
  400.     {
  401.         if (*pszVal == '0')
  402.         {
  403.                 m_pDescGenerator->SetUseAbsoluteURL(FALSE);
  404.             pnr = HXR_OK;
  405.         }
  406.         else if  (*pszVal == '1')
  407.         {
  408.                 m_pDescGenerator->SetUseAbsoluteURL(TRUE);
  409.             pnr = HXR_OK;
  410.         }
  411.     }
  412.     else if (strcasecmp(pKey, "SessionGUID") == 0)
  413.     {
  414.         if (*pszVal == '0')
  415.         {
  416.                 m_pDescGenerator->SetUseSessionGUID(FALSE);
  417.             pnr = HXR_OK;
  418.         }
  419.         else if  (*pszVal == '1')
  420.         {
  421.                 m_pDescGenerator->SetUseSessionGUID(TRUE);
  422.         }
  423.     }
  424.     // add new options here
  425.     return pnr;
  426. }
  427. STDMETHODIMP
  428. CSDPStreamDescription::GetOption(const char* pKey, REF(IHXBuffer*) pVal)
  429. {
  430.     if (pKey == NULL)
  431.     {
  432.         return HXR_POINTER;
  433.     }
  434.     if (m_pCCF == NULL)
  435.     {
  436.         return HXR_UNEXPECTED;
  437.     }
  438.     m_pCCF->CreateInstance(CLSID_IHXBuffer, (void**)&pVal);
  439.     if (pVal == NULL)
  440.     {
  441.         return HXR_OUTOFMEMORY;
  442.     }
  443.     HX_RESULT pnr = HXR_FAIL;
  444.     char* pszVal;
  445.     if ((strcasecmp(pKey, "UseOldEOL") == 0) && m_pDescGenerator)
  446.     {
  447.         pVal->SetSize(5+1);
  448.         pszVal = (char*)pVal->GetBuffer();
  449.         strcpy(pszVal, (m_pDescGenerator->GetUseOldEOL()?"true":"false")); /* Flawfinder: ignore */
  450.         pnr = HXR_OK;
  451.     }
  452.     else
  453.     {
  454.         BOOL bIsOptionSet = FALSE;
  455.         if (strcasecmp(pKey, "AbsoluteBaseURL") == 0)
  456.         {
  457.             bIsOptionSet = m_pDescGenerator->GetUseAbsoluteURL();
  458.             pnr = HXR_OK;
  459.         }
  460.         else if (strcasecmp(pKey, "SessionGUID") == 0)
  461.         {
  462.             bIsOptionSet = m_pDescGenerator->GetUseSessionGUID();
  463.             pnr = HXR_OK;
  464.         }
  465.         if (HXR_OK == pnr)
  466.         {
  467.             pVal->SetSize(5+1);
  468.             pszVal = (char*)pVal->GetBuffer();
  469.             strcpy(pszVal, (bIsOptionSet ? "true":"false")); /* Flawfinder: ignore */
  470.         }
  471.     }
  472.     if (pnr != HXR_OK)
  473.     {
  474.         HX_RELEASE(pVal);
  475.     }
  476.     return pnr;
  477. }
  478. // *** IHXRTPPayloadInfo methods ***
  479. /************************************************************************
  480.  *        Method:
  481.  *            IHXRTPPayloadInfo::PayloadSupported
  482.  *        Purpose:
  483.  *            Returns TRUE if this payload type is handled by this interface
  484.  */
  485.  
  486. BOOL
  487. CSDPStreamDescription::IsPayloadSupported(UINT32 ulRTPPayloadType)
  488. {
  489.     // make sure it's not one of reserved/unassigned ones
  490.     if (SDPIsStaticPayload(ulRTPPayloadType) &&
  491.         SDPMapPayloadToEncodingName(ulRTPPayloadType))
  492.     {
  493.         return TRUE;        
  494.     }
  495.     return FALSE;
  496. }
  497. /************************************************************************
  498.  *        Method:
  499.  *            IHXRTPPayloadInfo::GetTimestampConversionFactors
  500.  *        Purpose:
  501.  *            Retrieves the RTP and RMA factors for RTP to RMA timestamp ratio.
  502.  *      RTP->RMA is RTPTimestamp * RTPFactor / HXFactor
  503.  *      RMA->RTP is HXTimestamp * HXFactor / RTPFactor
  504.  *        
  505.  *        Note: does not check if the payload type is supported
  506.  */
  507.  
  508. STDMETHODIMP
  509. CSDPStreamDescription::GetTimestampConversionFactors
  510. (                                
  511.     UINT32 ulRTPPayloadType,
  512.     REF(UINT32) /*OUT*/ ulRTPFactor,
  513.     REF(UINT32) /*OUT*/ ulHXFactor
  514. )
  515. {
  516.     HX_ASSERT(IsPayloadSupported(ulRTPPayloadType));
  517.     ulRTPFactor = SDPMapPayloadToRTPFactor(ulRTPPayloadType);
  518.     ulHXFactor = SDPMapPayloadToRMAFactor(ulRTPPayloadType);
  519.     return HXR_OK;
  520. }
  521. /************************************************************************
  522.  *        Method:
  523.  *            IHXRTPPayloadInfo::IsTimestampDeliverable
  524.  *        Purpose:
  525.  *            Returns TRUE if this payload type is timestamp deliverable
  526.  */
  527.  
  528. BOOL
  529. CSDPStreamDescription::IsTimestampDeliverable(UINT32 ulRTPPayloadType)
  530. {
  531.     HX_ASSERT(IsPayloadSupported(ulRTPPayloadType));
  532.     return SDPIsTimestampDeliverable(ulRTPPayloadType);    
  533. }