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

Symbian

开发平台:

Visual 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 "hxtypes.h"
  36. #include "hxcom.h"
  37. #include "hlxclib/memory.h"
  38. #include "ihxpckts.h"
  39. #include "hxformt.h"
  40. #include "mp4apyif.h"
  41. #include "mdpkt.h"
  42. #include "netbyte.h"
  43. #include "mp3draft.h"
  44. CMP3DraftPayloadFormat::CMP3DraftPayloadFormat()
  45. {
  46.     m_lRefCount    = 0;
  47.     m_pCurPacket   = NULL;
  48.     m_ulHeaderSize = 0;
  49.     m_pHeader      = NULL;
  50.     m_ulSampleRate = 0;
  51.     m_bClearMainDataBegin = FALSE;
  52. }
  53. CMP3DraftPayloadFormat::~CMP3DraftPayloadFormat()
  54. {
  55.     HX_RELEASE(m_pCurPacket);
  56.     HX_VECTOR_DELETE(m_pHeader);
  57. }
  58. HX_RESULT CMP3DraftPayloadFormat::Build(REF(IMP4APayloadFormat*) pFmt)
  59. {
  60.     HX_RESULT retVal = HXR_FAIL;
  61.     pFmt = new CMP3DraftPayloadFormat();
  62.     if (pFmt)
  63.     {
  64.         pFmt->AddRef();
  65.         retVal = HXR_OK;
  66.     }
  67.     return retVal;
  68. }
  69. STDMETHODIMP CMP3DraftPayloadFormat::QueryInterface(THIS_ REFIID riid, void** ppvObj)
  70. {
  71.     HX_RESULT retVal = HXR_NOINTERFACE;
  72.     QInterfaceList qiList[] =
  73.     {
  74. { GET_IIDHANDLE(IID_IUnknown), this },
  75. { GET_IIDHANDLE(IID_IHXPayloadFormatObject), (IHXPayloadFormatObject*) this },
  76.     };
  77.     if (ppvObj)
  78.     {
  79.         *ppvObj = NULL;
  80.         return ::QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
  81.     }
  82.     return retVal;
  83. }
  84. STDMETHODIMP_(ULONG32) CMP3DraftPayloadFormat::AddRef()
  85. {
  86.     return InterlockedIncrement(&m_lRefCount);
  87. }
  88. STDMETHODIMP_(ULONG32) CMP3DraftPayloadFormat::Release()
  89. {
  90.     if (InterlockedDecrement(&m_lRefCount) > 0)
  91.     {
  92.         return m_lRefCount;
  93.     }
  94.     delete this;
  95.     return 0;
  96. }
  97. STDMETHODIMP CMP3DraftPayloadFormat::Init(IUnknown* pContext, BOOL bPacketize)
  98. {
  99.     HX_RESULT retVal = HXR_FAIL;
  100.     if (!bPacketize)
  101.     {
  102.         retVal = HXR_OK;
  103.     }
  104.     return retVal;
  105. }
  106. STDMETHODIMP CMP3DraftPayloadFormat::Close()
  107. {
  108.     HX_RELEASE(m_pCurPacket);
  109.     return HXR_OK;
  110. }
  111. STDMETHODIMP CMP3DraftPayloadFormat::Reset()
  112. {
  113.     HX_RELEASE(m_pCurPacket);
  114.     return HXR_OK;
  115. }
  116. STDMETHODIMP CMP3DraftPayloadFormat::SetStreamHeader(IHXValues* pHeader)
  117. {
  118.     HX_RESULT retVal = HXR_FAIL;
  119.     if (pHeader)
  120.     {
  121.         IHXBuffer* pBuffer = NULL;
  122.         retVal = pHeader->GetPropertyCString("MimeType", pBuffer);
  123.         if (SUCCEEDED(retVal))
  124.         {
  125.             const char* pszMimeType = (const char*) pBuffer->GetBuffer();
  126.             if (pszMimeType)
  127.     {
  128.                 if (!strcmp(pszMimeType, "audio/X-MP3-draft-00") ||
  129.     !strcmp(pszMimeType, "audio/X-MP3-draft-00-RN"))
  130. {
  131.     m_bClearMainDataBegin = TRUE;
  132.     retVal = HXR_OK;
  133. }
  134. else if (!strcmp(pszMimeType, "audio/MPEG-ELEMENTARY"))
  135. {
  136.     retVal = HXR_OK;
  137. }
  138.     }
  139.         }
  140.         HX_RELEASE(pBuffer);
  141.         if (SUCCEEDED(retVal))
  142.         {
  143.             // Get the number of channels if specified in the stream header
  144.             // Check both "NumChannels" and "Channels" in that order
  145.             UINT32 ulTmp         = 0;
  146.             UINT32 ulNumChannels = 0;
  147.             if (SUCCEEDED(pHeader->GetPropertyULONG32("NumChannels", ulTmp)))
  148.             {
  149.                 ulNumChannels = ulTmp;
  150.             }
  151.             else if (SUCCEEDED(pHeader->GetPropertyULONG32("Channels", ulTmp)))
  152.             {
  153.                 ulNumChannels = ulTmp;
  154.             }
  155.             // Get the sample rate if specified in stream header
  156.             // Check both "SampleRate" and "SamplesPerSecond" in that order
  157.             if (SUCCEEDED(pHeader->GetPropertyULONG32("SampleRate", ulTmp)))
  158.             {
  159.                 m_ulSampleRate = ulTmp;
  160.             }
  161.             else if (SUCCEEDED(pHeader->GetPropertyULONG32("SamplesPerSecond", ulTmp)))
  162.             {
  163.                 m_ulSampleRate = ulTmp;
  164.             }
  165.             // Get the delay if specified in the stream header
  166.             UINT32 ulDelay = 0;
  167.             if (SUCCEEDED(pHeader->GetPropertyULONG32("Delay", ulTmp)))
  168.             {
  169.                 ulDelay = ulTmp;
  170.             }
  171.             // Set the version of this bitstream header
  172.             UINT32 ulVersion = 0;
  173.             // Create our bitstream header
  174.             m_pHeader = new BYTE [20];
  175.             if (m_pHeader)
  176.             {
  177.                 // Set the size
  178.                 m_ulHeaderSize = 20;
  179.                 // Pack the information into the bitstream header
  180.                 *((UINT32*) &m_pHeader[0])  = ulVersion;
  181.                 *((UINT32*) &m_pHeader[4])  = ulNumChannels;
  182.                 *((UINT32*) &m_pHeader[8])  = m_ulSampleRate;
  183.                 *((UINT32*) &m_pHeader[12]) = ulDelay;
  184. *((UINT32*) &m_pHeader[16]) = m_bClearMainDataBegin;
  185.                 // Byteswap if we are little-endian
  186.                 if (!TestBigEndian())
  187.                 {
  188.                     SwapDWordBytes((HostDWord*) &m_pHeader[0], 5);
  189.                 }
  190.             }
  191.         }
  192.     }
  193.     return retVal;
  194. }
  195. STDMETHODIMP CMP3DraftPayloadFormat::GetStreamHeader(REF(IHXValues*) pHeader)
  196. {
  197.     return HXR_NOTIMPL;
  198. }
  199. STDMETHODIMP CMP3DraftPayloadFormat::SetPacket(IHXPacket* pPacket)
  200. {
  201.     HX_RESULT retVal = HXR_FAIL;
  202.     if (pPacket)
  203.     {
  204.         HX_RELEASE(m_pCurPacket);
  205.         m_pCurPacket = pPacket;
  206.         m_pCurPacket->AddRef();
  207.         retVal = HXR_OK;
  208.     }
  209.     return retVal;
  210. }
  211. STDMETHODIMP CMP3DraftPayloadFormat::GetPacket(REF(IHXPacket*) pOutPacket)
  212. {
  213.     return HXR_NOTIMPL;
  214. }
  215. STDMETHODIMP CMP3DraftPayloadFormat::Flush()
  216. {
  217.     return HXR_OK;
  218. }
  219. ULONG32 CMP3DraftPayloadFormat::GetBitstreamHeaderSize(void)
  220. {
  221.     return m_ulHeaderSize;
  222. }
  223. const UINT8* CMP3DraftPayloadFormat::GetBitstreamHeader(void)
  224. {
  225.     return (const UINT8*) m_pHeader;
  226. }
  227. HX_RESULT CMP3DraftPayloadFormat::CreateMediaPacket(CMediaPacket*& pOutMediaPacket)
  228. {
  229.     HX_RESULT retVal = HXR_FAIL;
  230.     if (m_pCurPacket)
  231.     {
  232.         IHXBuffer* pBuffer = m_pCurPacket->GetBuffer();
  233.         if (pBuffer)
  234.         {
  235.     /* Clear packet main data begin */
  236.     if (m_bClearMainDataBegin && pBuffer->GetSize() > 7)
  237.     {
  238. unsigned char* data = pBuffer->GetBuffer();
  239. int nOffset = 4;
  240. // Check protection bit
  241. if ((data[1] & 1) == 0)
  242.     nOffset += 2;
  243.     
  244. // MPEG1 main_data_begin is 9 bits in MPEG2 it is 8
  245. data[nOffset] = 0;
  246. if(m_ulSampleRate >= 32000)
  247. {
  248.     // This is MPEG1
  249.     data[nOffset + 1] &= 0x7F;
  250. }
  251.     }
  252.             UINT32 ulTime          = m_pCurPacket->GetTime();
  253.             UINT32 ulFlags         = MDPCKT_USES_IHXBUFFER_FLAG;
  254.             pOutMediaPacket = new CMediaPacket(pBuffer,
  255.                                                (UINT8*) pBuffer->GetBuffer(),
  256.                                                pBuffer->GetSize(),
  257.                                                pBuffer->GetSize(),
  258.                                                ulTime,
  259.                                                ulFlags,
  260.                                                NULL);
  261.             if (pOutMediaPacket)
  262.             {
  263.                 HX_RELEASE(m_pCurPacket);
  264.                 retVal = HXR_OK;
  265.             }
  266.         }
  267.         HX_RELEASE(pBuffer);
  268.     }
  269.     return retVal;
  270. }
  271. HX_RESULT CMP3DraftPayloadFormat::SetSamplingRate(ULONG32 ulSamplesPerSecond)
  272. {
  273.     m_ulSampleRate = ulSamplesPerSecond;
  274.     return HXR_OK;
  275. }
  276. ULONG32 CMP3DraftPayloadFormat::GetTimeBase(void)
  277. {
  278.     ULONG32 ulTimeBase = 1000;
  279.     return ulTimeBase;
  280. }
  281. HX_RESULT CMP3DraftPayloadFormat::SetAUDuration(ULONG32 ulAUDuration)
  282. {
  283.     return HXR_OK;
  284. }
  285. HX_RESULT CMP3DraftPayloadFormat::SetTimeAnchor(ULONG32 ulTimeMs)
  286. {
  287.     return HXR_OK;
  288. }