ASYNCRDR.H
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:7k
源码类别:

多媒体编程

开发平台:

Visual C++

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