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

Symbian

开发平台:

Visual C++

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