alloc.h
上传用户:sunbaby
上传日期:2013-05-31
资源大小:242k
文件大小:3k
源码类别:

mpeg/mp3

开发平台:

Visual C++

  1. //==========================================================================;
  2. //
  3. //  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  4. //  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  5. //  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
  6. //  PURPOSE.
  7. //
  8. //  Copyright (c) 1996 - 1997  Microsoft Corporation.  All Rights Reserved.
  9. //
  10. //--------------------------------------------------------------------------;
  11. /*  Allocator for sequential buffers
  12.     Like CBaseAllocator BUT always allocates the next buffer
  13. */
  14. typedef CMediaSample *LPCMEDIASAMPLE;
  15. class CSequentialAllocator : public CMemAllocator
  16. {
  17. public:
  18.     CSequentialAllocator(
  19.         LPUNKNOWN  pUnk,
  20.         HRESULT   *phr
  21.     );
  22.     ~CSequentialAllocator();
  23.     STDMETHODIMP GetBuffer(
  24.         IMediaSample **ppBuffer,
  25.         REFERENCE_TIME * pStartTime,
  26.         REFERENCE_TIME * pEndTime,
  27.         DWORD dwFlags);
  28.     HRESULT Alloc();
  29.     /*  Get buffer index */
  30.     int BufferIndex(PBYTE pbBuffer);
  31.     /*  Given an address get the IMediaSample pointer -
  32.         NB needs optimizing
  33.     */
  34.     CMediaSample *SampleFromBuffer(PBYTE pBuffer);
  35.     /*  Add a buffer to the valid list */
  36.     void AddBuffer(CMediaSample *pSample);
  37.     /*  Step through valid data */
  38.     HRESULT Advance(LONG lAdvance);
  39.     /*  Get the valid part */
  40.     PBYTE GetValid(LONG *plValid);
  41.     /*  Wrap end to go back to start */
  42.     HRESULT Wrap(void);
  43.     /*  Flush the allocator - just discard all the data in it */
  44.     void Flush();
  45. private:
  46.     PBYTE           m_pbNext;
  47.     LPCMEDIASAMPLE *m_parSamples;
  48.     /*  Simple wrap around buffer stuff */
  49.     LONG            m_lValid;
  50.     PBYTE           m_pbStartValid;
  51.     PBYTE           m_pBuffer;  /* Copy of CMemAllocator's which is private */
  52. };
  53. /*  Allocator for subsamples */
  54. class CSubAllocator : public CBaseAllocator
  55. {
  56. public:
  57.     CSubAllocator(
  58.         LPUNKNOWN  pUnk,
  59.         HRESULT   *phr,
  60.         CSequentialAllocator *pAlloc
  61.     ) : CBaseAllocator(NAME("CSubAllocator"), pUnk, phr),
  62.         m_pAlloc(pAlloc)
  63.     {
  64.     }
  65.     CMediaSample *GetSample(PBYTE pbData, DWORD dwLen)
  66.     {
  67.         HRESULT hr = S_OK;
  68.         CMediaSample *pSample = new CMediaSample(
  69.                                         NAME("CMediaSample"),
  70.                                         this,
  71.                                         &hr,
  72.                                         pbData,
  73.                                         dwLen);
  74.         if (pSample != NULL) {
  75.             /*  We only need to lock the first buffer because
  76.                 the super allocator allocates samples sequentially
  77.                 so it can't allocate subsequent samples until
  78.                 the first one has been freed
  79.             */
  80.             m_pAlloc->SampleFromBuffer(pbData)->AddRef();
  81.             /*  AddRef() ourselves too to conform to the rules */
  82.             pSample->AddRef();
  83.             /*  Make sure WE don't go away too ! */
  84.             AddRef();
  85.         }
  86.         return pSample;
  87.     }
  88.     STDMETHODIMP ReleaseBuffer(IMediaSample * pSample)
  89.     {
  90.         /*  Free the superallocator's buffer */
  91.         CMediaSample *pMediaSample = (CMediaSample *)pSample;
  92.         PBYTE pBuffer;
  93.         pSample->GetPointer(&pBuffer);
  94.         m_pAlloc->SampleFromBuffer(pBuffer)->Release();
  95.         delete pMediaSample;
  96.         Release();
  97.         return NOERROR;
  98.     }
  99.     /*  Must override Free() */
  100.     void Free() {}
  101. private:
  102.     CSequentialAllocator *const m_pAlloc;
  103. };
  104. /*  Track samples in buffer */