asyncrdr.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:6k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #pragma once
  2. //
  3. // AsyncRdr
  4. //
  5. // Defines an IO source filter.
  6. //
  7. // This filter (CAsyncReader) supports IBaseFilter and IFileSourceFilter interfaces from the
  8. // filter object itself. It has a single output pin (CAsyncOutputPin)
  9. // which supports IPin and IAsyncReader.
  10. //
  11. // This filter is essentially a wrapper for the CAsyncFile class that does
  12. // all the work.
  13. //
  14. // the filter class (defined below)
  15. class CAsyncReader;
  16. // the output pin class
  17. class CAsyncOutputPin
  18.   : public IAsyncReader,
  19.     public CBasePin
  20. {
  21. protected:
  22.     CAsyncReader* m_pReader;
  23.     CAsyncIo * m_pIo;
  24.     //  This is set every time we're asked to return an IAsyncReader
  25.     //  interface
  26.     //  This allows us to know if the downstream pin can use
  27.     //  this transport, otherwise we can hook up to thinks like the
  28.     //  dump filter and nothing happens
  29.     BOOL         m_bQueriedForAsyncReader;
  30.     HRESULT InitAllocator(IMemAllocator **ppAlloc);
  31. public:
  32.     // constructor and destructor
  33.     CAsyncOutputPin(
  34.         HRESULT * phr,
  35. CAsyncReader *pReader,
  36. CAsyncIo *pIo,
  37.         CCritSec * pLock);
  38.     ~CAsyncOutputPin();
  39.     // --- CUnknown ---
  40.     // need to expose IAsyncReader
  41.     DECLARE_IUNKNOWN
  42.     STDMETHODIMP NonDelegatingQueryInterface(REFIID, void**);
  43.     // --- IPin methods ---
  44.     STDMETHODIMP Connect(
  45.         IPin * pReceivePin,
  46.         const AM_MEDIA_TYPE *pmt   // optional media type
  47.     );
  48.     // --- CBasePin methods ---
  49.     // return the types we prefer - this will return the known
  50.     // file type
  51.     HRESULT GetMediaType(int iPosition, CMediaType *pMediaType);
  52.     // can we support this type?
  53.     HRESULT CheckMediaType(const CMediaType* pType);
  54.     // Clear the flag so we see if IAsyncReader is queried for
  55.     HRESULT CheckConnect(IPin *pPin)
  56.     {
  57.         m_bQueriedForAsyncReader = FALSE;
  58.         return CBasePin::CheckConnect(pPin);
  59.     }
  60.     // See if it was asked for
  61.     HRESULT CompleteConnect(IPin *pReceivePin)
  62.     {
  63.         if (m_bQueriedForAsyncReader) {
  64.             return CBasePin::CompleteConnect(pReceivePin);
  65.         } else {
  66. #ifdef VFW_E_NO_TRANSPORT
  67.             return VFW_E_NO_TRANSPORT;
  68. #else
  69.             return E_FAIL;
  70. #endif
  71.         }
  72.     }
  73.     //  Remove our connection status
  74.     HRESULT BreakConnect()
  75.     {
  76.         m_bQueriedForAsyncReader = FALSE;
  77.         return CBasePin::BreakConnect();
  78.     }
  79.     // --- IAsyncReader methods ---
  80.     // pass in your preferred allocator and your preferred properties.
  81.     // method returns the actual allocator to be used. Call GetProperties
  82.     // on returned allocator to learn alignment and prefix etc chosen.
  83.     // this allocator will be not be committed and decommitted by
  84.     // the async reader, only by the consumer.
  85.     STDMETHODIMP RequestAllocator(
  86.                       IMemAllocator* pPreferred,
  87.                       ALLOCATOR_PROPERTIES* pProps,
  88.                       IMemAllocator ** ppActual);
  89.     // queue a request for data.
  90.     // media sample start and stop times contain the requested absolute
  91.     // byte position (start inclusive, stop exclusive).
  92.     // may fail if sample not obtained from agreed allocator.
  93.     // may fail if start/stop position does not match agreed alignment.
  94.     // samples allocated from source pin's allocator may fail
  95.     // GetPointer until after returning from WaitForNext.
  96.     STDMETHODIMP Request(
  97.                      IMediaSample* pSample,
  98.                      DWORD dwUser);         // user context
  99.     // block until the next sample is completed or the timeout occurs.
  100.     // timeout (millisecs) may be 0 or INFINITE. Samples may not
  101.     // be delivered in order. If there is a read error of any sort, a
  102.     // notification will already have been sent by the source filter,
  103.     // and STDMETHODIMP will be an error.
  104.     STDMETHODIMP WaitForNext(
  105.                       DWORD dwTimeout,
  106.                       IMediaSample** ppSample,  // completed sample
  107.                       DWORD * pdwUser); // user context
  108.     // sync read of data. Sample passed in must have been acquired from
  109.     // the agreed allocator. Start and stop position must be aligned.
  110.     // equivalent to a Request/WaitForNext pair, but may avoid the
  111.     // need for a thread on the source filter.
  112.     STDMETHODIMP SyncReadAligned(
  113.                       IMediaSample* pSample);
  114.     // sync read. works in stopped state as well as run state.
  115.     // need not be aligned. Will fail if read is beyond actual total
  116.     // length.
  117.     STDMETHODIMP SyncRead(
  118.                       LONGLONG llPosition, // absolute file position
  119.                       LONG lLength, // nr bytes required
  120.                       BYTE* pBuffer); // write data here
  121.     // return total length of stream, and currently available length.
  122.     // reads for beyond the available length but within the total length will
  123.     // normally succeed but may block for a long period.
  124.     STDMETHODIMP Length(
  125.                       LONGLONG* pTotal,
  126.                       LONGLONG* pAvailable);
  127.     // cause all outstanding reads to return, possibly with a failure code
  128.     // (VFW_E_TIMEOUT) indicating they were cancelled.
  129.     // these are defined on IAsyncReader and IPin
  130.     STDMETHODIMP BeginFlush(void);
  131.     STDMETHODIMP EndFlush(void);
  132. };
  133. //
  134. // The filter object itself. Supports IBaseFilter through
  135. // CBaseFilter and also IFileSourceFilter directly in this object
  136. class CAsyncReader : public CBaseFilter, public IAMFilterMiscFlags
  137. {
  138. protected:
  139.     // filter-wide lock
  140.     CCritSec m_csFilter;
  141.     // all i/o done here
  142.     CAsyncIo m_Io;
  143.     // our output pin
  144.     CAsyncOutputPin m_OutputPin;
  145.     // Type we think our data is
  146.     CMediaType            m_mt;
  147. public:
  148.     // construction / destruction
  149.     CAsyncReader(
  150.         TCHAR *pName,
  151.         LPUNKNOWN pUnk,
  152.         CAsyncStream *pStream,
  153.         HRESULT *phr,
  154. const CLSID& clsid);
  155.     ~CAsyncReader();
  156. DECLARE_IUNKNOWN;
  157.     STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
  158. // IAMFilterMiscFlags
  159. STDMETHODIMP_(ULONG) GetMiscFlags();
  160.     // --- CBaseFilter methods ---
  161.     int GetPinCount();
  162.     CBasePin *GetPin(int n);
  163.     // --- Access our media type
  164.     const CMediaType *LoadType() const
  165.     {
  166.         return &m_mt;
  167.     }
  168.     virtual HRESULT Connect(
  169.         IPin * pReceivePin,
  170.         const AM_MEDIA_TYPE *pmt   // optional media type
  171.     )
  172.     {
  173.         return m_OutputPin.CBasePin::Connect(pReceivePin, pmt);
  174.     }
  175. };