raformat.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:10k
源码类别:

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. #ifndef _RAFORMAT_H_
  36. #define _RAFORMAT_H_
  37. /****************************************************************************
  38.  *  Includes
  39.  */
  40. #include "netbyte.h"
  41. #include "hxtypes.h"
  42. #include "hxresult.h"
  43. #include "hxcom.h"
  44. #include "hxtick.h"
  45. #include "hxbuffer.h"
  46. #include "hxstring.h"
  47. #include "hxcodec.h"
  48. #include "hxcomm.h"
  49. #include "hxausvc.h"
  50. #include "ihxpckts.h"
  51. #include "hxmon.h"
  52. #include "hxerror.h"
  53. #include "hxengin.h"
  54. #include "raparser.h"
  55. #include "cinterl.h"
  56. #include "codec.h"
  57. #include "hxcore.h"
  58. #include "hxupgrd.h"
  59. #include "hxslist.h"
  60. #include "raformat.h"
  61. #include "rmfftype.h"
  62. #include "hxassert.h"
  63. #include "hxheap.h"
  64. #include "errdbg.h"
  65. /****************************************************************************
  66.  *  Defines
  67.  */
  68. #define RA_FORMAT_ID RA_FILE_MAGIC_NUMBER  // = { '.', 'r', 'a', 'xFD' };
  69. #define RA_SWITCH_FORMAT_ID 0x2E5241FDL // = { '.', 'R', 'A', 'xFD' }
  70. #define RA_TIME_FUDGE 5
  71. #ifdef _RAFLOW_LOG
  72. #define RA_FLOW_FILE     "C:\raflow.txt"
  73. #else // _RAFLOW_LOG
  74. #define RA_FLOW_FILE     NULL
  75. #endif // _RAFLOW_LOG
  76. #define MAX_TS_DBG_RANGE    10000
  77. enum AUDIO_STATE
  78. {
  79.     AUDIO_NORMAL,
  80.     AUDIO_CROSSFADE,
  81.     AUDIO_DRYNOTIFICATION,
  82.     AUDIO_END_OF_PACKETS
  83. };
  84. class CRealAudioPacketFeeder;
  85. class CInterleave;
  86. class CCodec;
  87. struct IHXCommonClassFactory;
  88. struct  IHXPlayer;
  89. #include "raibufs.h"
  90. /////////////////////////////////////////////////////////////////////////////
  91. // 
  92. //  Class:
  93. //
  94. // CRaFormat
  95. //
  96. //  Purpose:
  97. //
  98. // Implementation of a RealAudio File Format reader.
  99. //
  100. _INTERFACE IHXRealAudioSync;
  101. _INTERFACE IHXErrorMessages;
  102. #define INCREMENT_FLOAT_TS(x, y)    {
  103. (x) += (y);
  104. if ((x) > 4294967295.0)
  105. {
  106.     (x) -= 4294967296.0;
  107.     if ((x) < 0.0)
  108.     {
  109. (x) = 0.0;
  110.     }
  111. }
  112.     }
  113. class CRaFormat
  114. {
  115. public:
  116.     // former SUBSTREAM_PROPS structure members
  117.     UINT32 m_ulLastPacketTime;
  118.     UINT32 m_ulBytesWrite;
  119.     IHXRealAudioSync* m_pAudioSync;
  120.     BOOL m_bRegistered;
  121.     CRaFormat(IUnknown* m_pContext,
  122.       IHXCommonClassFactory* pCommonClassFactory,
  123.       IHXErrorMessages* pErrorMessages,
  124.       UINT16* pRuleToFlagMap,
  125.       UINT16 uStreamNumber);
  126.     virtual ~CRaFormat();
  127.     HX_RESULT NewReadRAHeader (Byte*     buffer, 
  128.  UINT32     ulLength, 
  129.  BOOL     bForceStartTrackTime,
  130.  BOOL     bForceEndTrackTime,
  131.  UINT32     ulTrackStartTime,
  132.  UINT32     ulTrackEndTime,
  133.  UINT32*    pBytesRead, 
  134.  char*      pAllCodecs,
  135.                                  UINT32     ulAllCodecsBufLen);  
  136.     HX_RESULT   OnPacket(IHXPacket* pPacket, LONG32 lTimeOffset, UINT16* rule_to_flag_map);
  137.     HX_RESULT OnSeek(UINT32 ulOldTime, UINT32 ulNewTime);
  138.     HX_RESULT GetAudioData(HXAudioData& audioData,     // out
  139.      UINT32& ulActualTimestamp,     // out
  140.      AUDIO_STATE audioState,     // in
  141.      UINT32 ulSpliceToActualTime,   // in
  142.      UINT32 ulSpliceToStreamTime);  // in
  143.     HX_RESULT GenerateLostAudioData (UINT32 ulForceEndTime, 
  144.        HXAudioData& audioData,     
  145.        UINT32& ulActualTimestamp,
  146.        UINT32 ulSpliceToActualTime,
  147.        UINT32 ulSpliceToStreamTime);
  148. #if defined(HELIX_FEATURE_STATS)
  149.     HX_RESULT UpdateStatistics(IHXRegistry* pRegistry, UINT32 ulRegistryID,
  150.     UINT32& ulCodecRegID, UINT32& ulCodecTextRegID, UINT32& ulCodec4CCRegID,
  151.     UINT32& ulRateRegID, UINT32& ulChannelsRegID, UINT32& ulSurroundRegID);
  152. #endif // HELIX_FEATURE_STATS
  153.     HX_RESULT   UpdatePacketTimeOffset(INT32 lTimeOffset);
  154.     HX_RESULT UpdatePlayTimes(IHXValues* pProps);
  155.     BOOL IsStreamDone(void);
  156.     BOOL IsActive();
  157.     void     SetupForNextTimeRange();
  158.     
  159.     void GetAudioFormat(HXAudioFormat& audioFmt);
  160. #if defined(HELIX_FEATURE_SETSRCPROPS)
  161.     BOOL        IsInterleaved() { return (m_StreamParam.IsInterleaved ? TRUE : FALSE); }
  162.     UINT32      GetBitRate() { return m_StreamParam.ulBytesPerMin * 8 / 60; }
  163.     UINT32      GetSamplesPerSecond() { return m_StreamParam.ulSampleRate; }
  164.     UINT32      GetBitsPerSample() { return (UINT32) m_StreamParam.uSampleSize; }
  165.     UINT32      GetNumChannels() { return (UINT32) m_StreamParam.uChannels; }
  166. #endif /* #if defined(HELIX_FEATURE_SETSRCPROPS) */
  167.     char*       GetCodecName() { return m_StreamParam.codecID; }
  168.     char*       GetInterleaverName() { return m_StreamParam.interleaverID; }
  169.     void OnEndofPackets(void);
  170.     void LossOccured(void);
  171.     double ConvertBytesToMs(UINT32 ulBytes);
  172.     BOOL ClipAudioBuffer(HXAudioData* pAudioData, 
  173. UINT32& ulActualTime, 
  174. UINT32 ulAudioTime, 
  175. BOOL bFromStart);
  176.     void OverrideFactory(IHXCommonClassFactory* pCommonClassFactory);
  177.     void SetCrossFadeEndTime(UINT32 ulTimestamp);
  178.     void DiscardTillEndOfCrossFade(UINT32 ulTimestamp);
  179.     HX_RESULT GetNextAudioDataTime(UINT32& ulStart, UINT32& ulEnd);
  180.     UINT32 GetCurrentTimeRangeEnd();
  181.     void    ThrowUpgrade(const char* pszStr);
  182.     
  183.     inline UINT16 GetInterleaveFactor() 
  184. { return m_StreamParam.uInterleaveFactor;}
  185.     inline UINT32 GetSuperBlockTime() 
  186. { return m_IBufs.GetSuperBlockTime();}
  187.     inline double GetMSPerBlock() 
  188. {return m_IBufs.GetMSPerBlock();}
  189.     inline void ForceInterleaved(BOOL bIsInterleaved)
  190. {
  191.     m_bForceInterleaved = TRUE;
  192.     m_StreamParam.IsInterleaved = bIsInterleaved;
  193. };
  194.     inline void SetProtocolInfo(BOOL bIsPNM, INT32 lProtocolVersion)
  195. {
  196.     if (bIsPNM && lProtocolVersion < 10)
  197.     {
  198. m_IBufs.SetTimeStampsInTenths(TRUE);
  199.     }
  200. }
  201. protected:
  202.     // packet loss treatment
  203.     virtual CRealAudioPacketFeeder* CreatePacketFeeder(void);
  204.     // decoding
  205.     HX_RESULT     InitDecoder(CStreamParam& param, CCodec** pCodec);
  206.     HX_RESULT     DecodeAudioData(HXAudioData& audioData, 
  207.     UINT32& ulActualTimestamp,
  208.     ULONG32 ulSpliceToActualTime, 
  209.     ULONG32 ulSpliceToStreamTime,
  210.     BOOL bFlushCodec = FALSE);
  211.     virtual CCodec* CreateDecoder(char* pCodecID);
  212.     virtual HX_RESULT DecodeAudioBlock(Byte* pData, 
  213.        UINT32 ulInSize, 
  214.        Byte* pAudioBuf, 
  215.        UINT32* pOutSize, 
  216.        UINT32 ulDataFlags);
  217.     // adjust offset
  218.     UINT32  ConvertMsToBytes(UINT32 ulMs);
  219.     BOOL    GetDropBlock(UINT32 ulAudioTime);
  220.     void    SpliceAudioData(HXAudioData &pAudioData, 
  221.     UINT32 &ulActualTimestamp, 
  222.     UINT32 ulSpliceToActualTime, 
  223.     UINT32 ulSpliceToStreamTime);
  224.     BOOL    AdjustAudioData(HXAudioData &audioData, 
  225.     UINT32& ulActualTimestamp,
  226.     UINT32 ulTrackEndTime = NO_TIME_SET);
  227.     BOOL    ClipAudioData(HXAudioData &audioData,
  228.   UINT32 &ulActualTimestamp,
  229.   UINT32 ulDurationToClip,
  230.   BOOL bFromFront);
  231.     
  232.     HX_RESULT LoadDecoderAndInitDeInterleaver();
  233.     BOOL      ClipAndAdjust(INT32        lExtraInMs,
  234.                             HXAudioData& audioData,
  235.                             UINT32&      ulActualTimestamp,
  236.                             BOOL         bFromFront,
  237.                             UINT32&      ulDuration,
  238.                             UINT32&      ulSize);
  239.     IHXCommonClassFactory* m_pCommonClassFactory;
  240.     IHXCommonClassFactory* m_pCachingClassFactory;
  241.     IHXUpgradeCollection* m_pUpgradeCollection;    
  242.     IHXErrorMessages* m_pErrorMessages;
  243.     IUnknown* m_pContext;
  244.     UINT16*     m_pRuleToFlagMap;
  245.     CRealAudioPacketFeeder* m_pPacketFeeder;
  246.     CCodec*     m_pCodec;
  247.     UINT32     m_ulAudioBufSize;     //
  248.     UINT32     m_ulNextAudioTime;
  249.     UINT32     m_ulNextActualAudioTime;
  250.     INT32     m_lTimeOffset;
  251.     UINT32     m_ulTrackStartTime;
  252.     UINT32     m_ulTrackEndTime;
  253.     UINT32     m_ulForceDiscardUntilTime;
  254.     UINT32     m_ulMaxBlockGap;
  255.     UINT32     m_ulMinExpectedDecodedBlockSize;
  256.     UINT32     m_ulCodecDelay;
  257.     double     m_fCodecDelay;
  258.     BOOL     m_bPCMStreamStart;
  259.     UINT32     m_ulCrossFadeEndTime;
  260.     CStreamParam    m_StreamParam;
  261.     CInterleaveBufs m_IBufs;
  262.     HX_BITFIELD     m_bForceInterleaved:1;
  263.     HX_BITFIELD     m_bFirstPacket:1;
  264.     HX_BITFIELD     m_bDeterminedAdjustment:1;
  265.     HX_BITFIELD     m_bForceStartTrackTime:1;
  266.     HX_BITFIELD     m_bForceEndTrackTime:1;
  267.     HX_BITFIELD     m_bAdjustTimestamps:1;
  268.     HX_BITFIELD     m_bEndOfPackets:1;
  269.     BOOL     m_bSecure;
  270.     
  271.     UINT16     m_uStreamNumber;
  272.     BOOL     m_bIsVBR;
  273. };
  274. #endif // ndef _RAFORMAT_H_