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

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 _MP4GPYLD_H_
  36. #define _MP4GPYLD_H_
  37. /****************************************************************************
  38.  *  Includes
  39.  */
  40. #include "mp4apyif.h"
  41. #include "tsconvrt.h"
  42. /****************************************************************************
  43.  *  MP4GPayloadFormat
  44.  */
  45. class MP4GPayloadFormat : public IMP4APayloadFormat
  46. {
  47. public:
  48.     MP4GPayloadFormat();
  49.     ~MP4GPayloadFormat();
  50.     static HX_RESULT Build(REF(IMP4APayloadFormat*) pFmt);
  51.     // *** IUnknown methods ***
  52.     STDMETHOD(QueryInterface) (THIS_
  53. REFIID riid,
  54. void** ppvObj);
  55.     STDMETHOD_(ULONG32,AddRef) (THIS);
  56.     STDMETHOD_(ULONG32,Release) (THIS);
  57.     /*
  58.      * IHXPayloadFormatObject methods
  59.      */
  60.     STDMETHOD(Init) (THIS_
  61. IUnknown* pContext,
  62. BOOL bPacketize);
  63.     STDMETHOD(Close) (THIS) { return HXR_NOTIMPL; }
  64.     STDMETHOD(Reset) (THIS);
  65.     STDMETHOD(SetStreamHeader) (THIS_
  66. IHXValues* pHeader);
  67.     STDMETHOD(GetStreamHeader) (THIS_
  68. REF(IHXValues*) pHeader);
  69.     STDMETHOD(SetPacket) (THIS_
  70. IHXPacket* pPacket);
  71.     STDMETHOD(GetPacket) (THIS_
  72. REF(IHXPacket*) pOutPacket);
  73.     STDMETHOD(Flush) (THIS);
  74.     /*
  75.      * IMP4APayloadFormat methods
  76.      */
  77.     virtual ULONG32 GetBitstreamHeaderSize(void) { return m_Config.m_pConfig->GetSize(); }
  78.     virtual const UINT8* GetBitstreamHeader(void) { return m_Config.m_pConfig->GetBuffer(); }
  79.     virtual HX_RESULT CreateMediaPacket(CMediaPacket* &pOutMediaPacket);
  80.     virtual HX_RESULT SetSamplingRate(ULONG32 ulSamplesPerSecond);
  81.     virtual HX_RESULT SetAUDuration(ULONG32 ulAUDuration);
  82.     virtual HX_RESULT SetTimeAnchor(ULONG32 ulTimeMs);
  83.     virtual ULONG32 GetTimeBase(void);
  84. private:
  85.     class CFormatConfig
  86.     {
  87.     public:
  88. typedef enum
  89. {
  90.     MODE_GENERIC,
  91.     MODE_A0,
  92.     MODE_A1,
  93.     MODE_A2
  94. } FormatMode;
  95. CFormatConfig(void)
  96.     : m_ulStreamType(0)
  97.     , m_ulProfileLevelID(0)
  98.     , m_pConfig(NULL)
  99.     , m_Mode(MODE_GENERIC)
  100.     , m_ulConstantSize(0)
  101.     , m_ulConstantDuration(0)
  102.     , m_ulSizeLength(0)
  103.     , m_ulIndexLength(0)
  104.     , m_ulIndexDeltaLength(0)
  105.     , m_ulCTSDeltaLength(0)
  106.     , m_ulDTSDeltaLength(0)
  107.     , m_ulAuxDataSizeLength(0)
  108.     , m_ulProfile(0)
  109. {
  110.     ;
  111. }
  112. ~CFormatConfig()
  113. {
  114.     HX_RELEASE(m_pConfig);
  115. }
  116. HX_RESULT Init(IHXValues* pFMTParams,
  117.        IHXCommonClassFactory* pClassFactory);
  118. // Required Parameters
  119. ULONG32 m_ulStreamType;
  120. ULONG32 m_ulProfileLevelID;
  121. IHXBuffer* m_pConfig;
  122. // Optional Parameters
  123. FormatMode m_Mode;
  124. ULONG32 m_ulConstantSize;
  125. ULONG32 m_ulConstantDuration;
  126. ULONG32 m_ulSizeLength;
  127. ULONG32 m_ulIndexLength;
  128. ULONG32 m_ulIndexDeltaLength;
  129. ULONG32 m_ulCTSDeltaLength;
  130. ULONG32 m_ulDTSDeltaLength;
  131. ULONG32 m_ulAuxDataSizeLength;
  132. ULONG32 m_ulProfile;
  133. // Derived Parameters
  134. BOOL m_bHasAUHeaders;
  135.     };
  136.     class CAUPacket
  137.     {
  138.     public:
  139. CAUPacket(void)
  140. : m_pBuffer(NULL)
  141. , m_ulSize(0)
  142. , m_bMinTime(FALSE)
  143. {
  144.     ;
  145. }
  146. ~CAUPacket()
  147. {
  148.     HX_RELEASE(m_pBuffer);
  149. }
  150. ULONG32 m_ulCTS;
  151. ULONG32 m_ulDTS;
  152. ULONG32 m_ulIdx;
  153. IHXBuffer* m_pBuffer;
  154. UINT8* m_pData;
  155. ULONG32 m_ulSize;
  156. BOOL m_bMinTime;
  157.     };
  158.     inline HX_RESULT SetPacketizerHeader(IHXValues* pHeader);
  159.     inline HX_RESULT SetAssemblerHeader(IHXValues* pHeader);
  160.     HX_RESULT SetPacketizerPacket(IHXPacket* pPacket);
  161.     HX_RESULT SetAssemblerPacket(IHXPacket* pPacket);
  162.     HX_RESULT GetPacketizerPacket(IHXPacket* &pOutPacket);
  163.     HX_RESULT GetAssemblerPacket(IHXPacket* &pOutPacket);
  164.     HX_RESULT SetAssemblerConfig(IHXValues* pHeader);
  165.     // Assembler Functions
  166.     CMediaPacket* StripPacket(void);
  167.     HX_RESULT ProducePackets(void);
  168.     HX_RESULT CollectPacketFragments(IHXPacket** &pPacketFragments,
  169.      ULONG32 &ulNumPacketFragments,
  170.      ULONG32 &ulMaxPacketFragments);
  171.     HX_RESULT ParsePacketFragments(CAUPacket** &pAUFragments,
  172.    ULONG32 &ulNumAUFragments,
  173.    ULONG32 &ulMaxAUFragments,
  174.    IHXPacket** pPacketFragments,
  175.    ULONG32& ulNumPacketFragments);
  176.     inline HX_RESULT ParsePacketFragment(CAUPacket** &pAUFragments,
  177.  ULONG32 &ulNumAUFragments,
  178.  ULONG32 &ulMaxAUFragments,
  179.  IHXPacket* pPacketFragment);
  180.     HX_RESULT AggregateAUFragments(CAUPacket** &pAUPackets,
  181.    ULONG32 &ulNumAUPackets,
  182.    ULONG32 &ulMaxAUPackets,
  183.    CAUPacket** pAUFragments,
  184.    ULONG32 &ulNumAUFragments);
  185.     inline BOOL IsFragmentCollection(CAUPacket** pAUFragments,
  186.      ULONG32 ulNumAUFragments);
  187.     HX_RESULT DeinterleaveAUPackets(CAUPacket** pAUPackets,
  188.     ULONG32 &ulNumAUPackets);
  189.     inline HX_RESULT DeinterleaveAUPacket(CAUPacket* pAUPacket);
  190.     HX_RESULT ReapMediaPacket(ULONG32 ulLastPacketTime);
  191.     inline ULONG32 GetPacketTime(IHXPacket* pPacket);
  192.     void FlushQueues(void);
  193.     void FlushInputQueue(ULONG32 ulCount);
  194.     void FlushDeinterleaveQueue(ULONG32 ulCount);
  195.     void FlushOutputQueue(ULONG32 ulCount);
  196.     inline BOOL FindEarliestKnownDeintTime(ULONG32 &ulEarliestKnownDeintTime);
  197.     void FlushArrays(void);
  198.     inline void FlushAUArray(CAUPacket** pArray, ULONG32 &ulSize);
  199.     inline void FlushPacketArray(IHXPacket** pArray, ULONG32 &ulSize);
  200.     inline ULONG32 SignBitField(ULONG32 ulVal, ULONG32 ulNumBits);
  201.     inline BOOL TestIndexGreater(ULONG32 ulIdx1, ULONG32 ulIdx2);
  202.     inline BOOL TestTimeGreater(ULONG32 ulTime1, ULONG32 ulTime2);
  203.     inline LONG32 IndexDiff(ULONG32 ulIdx1, ULONG32 ulIdx2);
  204.     inline BOOL MayAUPacketPrecede(CAUPacket* pCandidate, 
  205.    CAUPacket* pResident);
  206.     inline ULONG32 ConvertToSomplingTime(ULONG32 ulRTPTime);
  207.     LONG32 m_lRefCount;
  208.     IHXCommonClassFactory* m_pClassFactory;
  209.     IHXValues* m_pStreamHeader;
  210.     CHXSimpleList m_InputQueue;
  211.     CHXSimpleList m_HoldingQueue;
  212.     CHXSimpleList m_DeinterleaveQueue;
  213.     CHXSimpleList m_OutputQueue;
  214.     BOOL m_bFlushed;
  215.     BOOL m_bUsesRTPPackets;
  216.     BOOL m_bRTPPacketTested;
  217.     BOOL m_bPacketize;
  218.     BOOL m_bPriorLoss;
  219.     BOOL m_bStartPacket;
  220.     ULONG32 m_ulLastPacketTime;
  221.     ULONG32 m_ulFrameCount;
  222.     IHXPacket** m_pPacketFragments;
  223.     CAUPacket** m_pAUFragments;
  224.     CAUPacket** m_pAUPackets;
  225.     ULONG32 m_ulNumPacketFragments;
  226.     ULONG32 m_ulNumAUFragments;
  227.     ULONG32 m_ulNumAUPackets;
  228.     ULONG32 m_ulMaxPacketFragments;
  229.     ULONG32 m_ulMaxAUFragments;
  230.     ULONG32 m_ulMaxAUPackets;
  231.     BOOL m_bEarliestDeintTimeKnown;
  232.     ULONG32 m_ulEarliestDeintTimeKnown;
  233.     BOOL m_bLastReapedSet;
  234.     BOOL m_bLastReapedMinTime;
  235.     ULONG32 m_ulLastReapedDTS;
  236.     ULONG32 m_ulLastReapedIdx;
  237.     
  238.     ULONG32 m_ulSamplesPerSecond;
  239.     ULONG32 m_ulRTPSamplesPerSecond;
  240.     ULONG32 m_ulAUDuration;
  241.     CFormatConfig m_Config;
  242.     CTSConverter m_TSConverter;
  243. };
  244. inline void MP4GPayloadFormat::FlushAUArray(CAUPacket** pArray, 
  245.     ULONG32 &ulSize)
  246. {
  247.     if (ulSize > 0)
  248.     {
  249. do
  250. {
  251.     ulSize--;
  252.     HX_DELETE(pArray[ulSize]);
  253. } while (ulSize > 0);
  254.     }
  255. }
  256. inline void MP4GPayloadFormat::FlushPacketArray(IHXPacket** pArray, 
  257. ULONG32 &ulSize)
  258. {
  259.     if (ulSize > 0)
  260.     {
  261. do
  262. {
  263.     ulSize--;
  264.     HX_RELEASE(pArray[ulSize]);
  265. } while (ulSize > 0);
  266.     }
  267. }
  268. inline BOOL MP4GPayloadFormat::MayAUPacketPrecede(CAUPacket* pCandidate, 
  269.   CAUPacket* pResident)
  270. {
  271.     return ((!pResident->m_bMinTime &&
  272.      (TestTimeGreater(pResident->m_ulDTS, pCandidate->m_ulDTS) ||
  273.       ((pResident->m_ulDTS == pCandidate->m_ulDTS) &&
  274.        TestIndexGreater(pResident->m_ulIdx, pCandidate->m_ulIdx))))
  275.     ||
  276.     (pResident->m_bMinTime &&
  277.      TestIndexGreater(pResident->m_ulIdx, pCandidate->m_ulIdx))
  278.    );
  279. }
  280. #endif // _MP4GPYLD_H_