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

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.  *  Defines
  37.  */
  38. #define MPEG4_AUDIO_RENDERER_NAME "MPEG-4 Audio"
  39. #define MPEG4_AUDIO_CODEC_4CC "MP4A"
  40. #define LOSSLESS_RENDERER_NAME          "RealAudio"
  41. /****************************************************************************
  42.  *  Includes
  43.  */
  44. #include "hlxclib/stdio.h"
  45. #include "hlxclib/string.h"
  46. #include "hxtypes.h"
  47. #include "hxwintyp.h"
  48. #include "hxresult.h"
  49. #include "hxcom.h"
  50. #include "hxcomm.h"
  51. #include "ihxpckts.h"
  52. #include "hxcore.h"
  53. #include "hxrendr.h"
  54. #include "hxplugn.h"
  55. #include "hxasm.h"
  56. #include "hxupgrd.h"
  57. #include "hxengin.h"
  58. #include "hxprefs.h"
  59. #include "hxerror.h"
  60. #include "hxwin.h"
  61. #include "hxthread.h"
  62. #include "hxmon.h"
  63. #include "hxformt.h"
  64. #include "hxacodec.h"
  65. #include "mp4arend.ver"
  66. #include "mp4audio.h"
  67. #include "mp4afmt.h"
  68. #include "dllpath.h"
  69. #include "hxheap.h"
  70. /************************************************************************
  71.  *  CMP4AudioRenderer class
  72.  */
  73. /************************************************************************
  74.  *  Constants
  75.  */
  76. const char* const CMP4AudioRenderer::zm_pDescription    = "RealNetworks MPEG-4 Audio Renderer Plugin";
  77. const char* const CMP4AudioRenderer::zm_pStreamMimeTypes[] =
  78. {
  79. #if defined(HELIX_FEATURE_AUDIO_RALF)
  80.     "audio/x-ralf-mpeg4-generic",
  81. #endif /* #if defined(HELIX_FEATURE_AUDIO_RALF) */
  82. #if defined(HELIX_FEATURE_AUDIO_CODEC_AAC) || defined(HELIX_FEATURE_AUDIO_CODEC_RAAC)
  83.     "audio/X-RN-MP4-RAWAU",
  84.     "audio/MP4A-LATM",
  85.     "audio/mpeg4-simple-A2",
  86.     "audio/mpeg4-generic",
  87.     "audio/X-HX-AAC-GENERIC",
  88. #endif /* #if defined(HELIX_FEATURE_AUDIO_CODEC_AAC) || defined(HELIX_FEATURE_AUDIO_CODEC_RAAC) */
  89. #if defined(HELIX_FEATURE_AUDIO_CODEC_AMRNB)
  90.     "audio/X-RN-3GPP-AMR",
  91.     "audio/AMR",
  92. #endif /* #if defined(HELIX_FEATURE_AUDIO_CODEC_AMRNB) */
  93. #if defined(HELIX_FEATURE_AUDIO_CODEC_AMRWB)
  94.     "audio/X-RN-3GPP-AMR-WB",
  95.     "audio/AMR-WB",
  96. #endif /* #if defined(HELIX_FEATURE_AUDIO_CODEC_AMRWB) */
  97. #if defined(HELIX_FEATURE_AUDIO_CODEC_MP3)
  98.     "audio/X-MP3-draft-00",
  99.     "audio/X-MP3-draft-00-RN",
  100.     "audio/MPEG-ELEMENTARY",
  101. #endif /* #if defined(HELIX_FEATURE_AUDIO_CODEC_MP3) */
  102.     NULL
  103. };
  104. /************************************************************************
  105.  *  Constructor/Destructor
  106.  */
  107. CMP4AudioRenderer::CMP4AudioRenderer(void)
  108. {
  109. }
  110. CMP4AudioRenderer::~CMP4AudioRenderer()
  111. {    
  112.     ;
  113. }
  114. /************************************************************************
  115.  *  Method:
  116.  *    IHXPlugin::GetPluginInfo
  117.  *  Purpose:
  118.  *    Returns the basic information about this plugin. Including:
  119.  *
  120.  *    bLoadMultiple whether or not this plugin DLL can be loaded
  121.  * multiple times. All File Formats must set
  122.  * this value to TRUE.
  123.  *    pDescription which is used in about UIs (can be NULL)
  124.  *    pCopyright which is used in about UIs (can be NULL)
  125.  *    pMoreInfoURL which is used in about UIs (can be NULL)
  126.  */
  127. STDMETHODIMP CMP4AudioRenderer::GetPluginInfo
  128. (
  129.    REF(BOOL)        /*OUT*/ bLoadMultiple,
  130.    REF(const char*) /*OUT*/ pDescription,
  131.    REF(const char*) /*OUT*/ pCopyright,
  132.    REF(const char*) /*OUT*/ pMoreInfoURL,
  133.    REF(ULONG32)     /*OUT*/ ulVersionNumber
  134. )
  135. {
  136.     HX_RESULT retVal;
  137.     retVal = CAudioRenderer::GetPluginInfo(bLoadMultiple,
  138.    pDescription,
  139.    pCopyright,
  140.    pMoreInfoURL,
  141.    ulVersionNumber);
  142.     if (SUCCEEDED(retVal))
  143.     {
  144. pDescription    = (const char*) zm_pDescription;
  145. ulVersionNumber = TARVER_ULONG32_VERSION;
  146.     }
  147.     
  148.     return retVal;
  149. }
  150. /************************************************************************
  151.  *  Method:
  152.  *    IHXRenderer::GetRendererInfo
  153.  *  Purpose:
  154.  *    If this object is a file format object this method returns
  155.  *    information vital to the instantiation of file format plugins.
  156.  *    If this object is not a file format object, it should return
  157.  *    HXR_UNEXPECTED.
  158.  */
  159. STDMETHODIMP CMP4AudioRenderer::GetRendererInfo
  160. (
  161.     REF(const char**) /*OUT*/ pStreamMimeTypes,
  162.     REF(UINT32)       /*OUT*/ unInitialGranularity
  163. )
  164. {
  165.     HX_RESULT retVal;
  166.     retVal = CAudioRenderer::GetRendererInfo(pStreamMimeTypes,
  167.      unInitialGranularity);
  168.     if (SUCCEEDED(retVal))
  169.     {
  170. pStreamMimeTypes = (const char**) zm_pStreamMimeTypes;
  171.     }
  172.     
  173.     return retVal;
  174. }
  175. /****************************************************************************
  176.  *  CreateFormatObject
  177.  */
  178. CAudioFormat* CMP4AudioRenderer::CreateFormatObject(IHXValues* pHeader)
  179. {
  180. #if defined(HELIX_FEATURE_STATS) && defined(HELIX_FEATURE_AUDIO_RALF)
  181.     if (pHeader)
  182.     {
  183.         IHXBuffer* pMimeTypeStr = NULL;
  184.         pHeader->GetPropertyCString("MimeType", pMimeTypeStr);
  185.         if (pMimeTypeStr)
  186.         {
  187.             const char* pszMimeType = (const char*) pMimeTypeStr->GetBuffer();
  188.             if (pszMimeType &&
  189.                 !strcmp(pszMimeType, "audio/x-ralf-mpeg4-generic"))
  190.             {
  191.                 // We need to update the stats
  192.                 if (m_pAudioStats)
  193.                 {
  194.                     m_pAudioStats->ReportStat(AS_REND_NAME, LOSSLESS_RENDERER_NAME);
  195.                 }
  196.             }
  197.         }
  198.         HX_RELEASE(pMimeTypeStr);
  199.     }
  200. #endif /* #if defined(HELIX_FEATURE_STATS) */
  201.     return new CMP4AudioFormat(m_pCommonClassFactory, this);
  202. }
  203. /****************************************************************************
  204.  *  GetRendererName
  205.  */
  206. const char* CMP4AudioRenderer::GetRendererName(void)
  207. {
  208.     return MPEG4_AUDIO_RENDERER_NAME;
  209. }
  210. /****************************************************************************
  211.  *  GetCodecFourCC
  212.  */
  213. const char* CMP4AudioRenderer::GetCodecFourCC(void)
  214. {
  215.     return MPEG4_AUDIO_CODEC_4CC;
  216. }
  217. /****************************************************************************
  218.  *  GetCodecName
  219.  */
  220. const char* CMP4AudioRenderer::GetCodecName(void)
  221. {
  222.     return MPEG4_AUDIO_RENDERER_NAME;
  223. }
  224. HX_RESULT STDAPICALLTYPE CMP4AudioRenderer::HXCreateInstance(IUnknown** ppIUnknown)
  225. {
  226.     HX_RESULT retVal = HXR_FAIL;
  227.     if (ppIUnknown)
  228.     {
  229.         // Set default
  230.         *ppIUnknown = NULL;
  231.         // Create the object
  232.         CMP4AudioRenderer *pObj = new CMP4AudioRenderer();
  233.         if (pObj)
  234.         {
  235.             // QI for IUnknown
  236.             retVal = pObj->QueryInterface(IID_IUnknown, (void**) ppIUnknown);
  237.         }
  238.         if (FAILED(retVal))
  239.         {
  240.             HX_DELETE(pObj);
  241.         }
  242.     }
  243.     return retVal;
  244. }
  245. HX_RESULT STDAPICALLTYPE CMP4AudioRenderer::CanUnload2()
  246. {
  247.     return (CHXBaseCountingObject::ObjectsActive() > 0 ? HXR_FAIL : HXR_OK);
  248. }