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

多媒体编程

开发平台:

Visual C++

  1. //------------------------------------------------------------------------------
  2. // File: AsyncFlt.h
  3. //
  4. // Desc: DirectShow sample code - header file for async filter.
  5. //
  6. // Copyright (c) Microsoft Corporation.  All rights reserved.
  7. //------------------------------------------------------------------------------
  8. #ifndef __ASYNCFLT_H__
  9. #define __ASYNCFLT_H__
  10. // c553f2c0-1529-11d0-b4d1-00805f6cbbea
  11. DEFINE_GUID(CLSID_AsyncSample,
  12. 0xc553f2c0, 0x1529, 0x11d0, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea);
  13. //  NOTE:  This filter does NOT support AVI format
  14. //
  15. //  Define an internal filter that wraps the base CBaseReader stuff
  16. //
  17. class CMemStream : public CAsyncStream
  18. {
  19. public:
  20.     CMemStream() :
  21.         m_llPosition(0)
  22.     {
  23.     }
  24.     /*  Initialization */
  25.     void Init(LPBYTE pbData, LONGLONG llLength, DWORD dwKBPerSec = INFINITE)
  26.     {
  27.         m_pbData = pbData;
  28.         m_llLength = llLength;
  29.         m_dwKBPerSec = dwKBPerSec;
  30.         m_dwTimeStart = timeGetTime();
  31.     }
  32.     HRESULT SetPointer(LONGLONG llPos)
  33.     {
  34.         if (llPos < 0 || llPos > m_llLength) {
  35.             return S_FALSE;
  36.         } else {
  37.             m_llPosition = llPos;
  38.             return S_OK;
  39.         }
  40.     }
  41.     HRESULT Read(PBYTE pbBuffer,
  42.                  DWORD dwBytesToRead,
  43.                  BOOL bAlign,
  44.                  LPDWORD pdwBytesRead)
  45.     {
  46.         CAutoLock lck(&m_csLock);
  47.         DWORD dwReadLength;
  48.         /*  Wait until the bytes are here! */
  49.         DWORD dwTime = timeGetTime();
  50.         if (m_llPosition + dwBytesToRead > m_llLength) {
  51.             dwReadLength = (DWORD)(m_llLength - m_llPosition);
  52.         } else {
  53.             dwReadLength = dwBytesToRead;
  54.         }
  55.         DWORD dwTimeToArrive =
  56.             ((DWORD)m_llPosition + dwReadLength) / m_dwKBPerSec;
  57.         if (dwTime - m_dwTimeStart < dwTimeToArrive) {
  58.             Sleep(dwTimeToArrive - dwTime + m_dwTimeStart);
  59.         }
  60.         CopyMemory((PVOID)pbBuffer, (PVOID)(m_pbData + m_llPosition),
  61.                    dwReadLength);
  62.         m_llPosition += dwReadLength;
  63.         *pdwBytesRead = dwReadLength;
  64.         return S_OK;
  65.     }
  66.     LONGLONG Size(LONGLONG *pSizeAvailable)
  67.     {
  68.         LONGLONG llCurrentAvailable =
  69.             static_cast <LONGLONG> (UInt32x32To64((timeGetTime() - m_dwTimeStart),m_dwKBPerSec));
  70.  
  71.        *pSizeAvailable =  min(m_llLength, llCurrentAvailable);
  72.         return m_llLength;
  73.     }
  74.     DWORD Alignment()
  75.     {
  76.         return 1;
  77.     }
  78.     void Lock()
  79.     {
  80.         m_csLock.Lock();
  81.     }
  82.     void Unlock()
  83.     {
  84.         m_csLock.Unlock();
  85.     }
  86. private:
  87.     CCritSec       m_csLock;
  88.     PBYTE          m_pbData;
  89.     LONGLONG       m_llLength;
  90.     LONGLONG       m_llPosition;
  91.     DWORD          m_dwKBPerSec;
  92.     DWORD          m_dwTimeStart;
  93. };
  94. class CAsyncFilter : public CAsyncReader, public IFileSourceFilter
  95. {
  96. public:
  97.     CAsyncFilter(LPUNKNOWN pUnk, HRESULT *phr) :
  98.         CAsyncReader(NAME("Mem Reader"), pUnk, &m_Stream, phr),
  99.         m_pFileName(NULL),
  100.         m_pbData(NULL)
  101.     {
  102.     }
  103.     ~CAsyncFilter()
  104.     {
  105.         delete [] m_pbData;
  106.         delete [] m_pFileName;
  107.     }
  108.     static CUnknown * WINAPI CreateInstance(LPUNKNOWN, HRESULT *);
  109.     DECLARE_IUNKNOWN
  110.     STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv)
  111.     {
  112.         if (riid == IID_IFileSourceFilter) {
  113.             return GetInterface((IFileSourceFilter *)this, ppv);
  114.         } else {
  115.             return CAsyncReader::NonDelegatingQueryInterface(riid, ppv);
  116.         }
  117.     }
  118.     /*  IFileSourceFilter methods */
  119.     //  Load a (new) file
  120.     STDMETHODIMP Load(LPCOLESTR lpwszFileName, const AM_MEDIA_TYPE *pmt)
  121.     {
  122.         CheckPointer(lpwszFileName, E_POINTER);
  123.         // lstrlenW is one of the few Unicode functions that works on win95
  124.         int cch = lstrlenW(lpwszFileName) + 1;
  125. #ifndef UNICODE
  126.         TCHAR *lpszFileName=0;
  127.         lpszFileName = new char[cch * 2];
  128.         if (!lpszFileName) {
  129.            return E_OUTOFMEMORY;
  130.         }
  131.         WideCharToMultiByte(GetACP(), 0, lpwszFileName, -1,
  132.      lpszFileName, cch, NULL, NULL);
  133. #else
  134.         TCHAR lpszFileName[MAX_PATH]={0};
  135.         lstrcpy(lpszFileName, lpwszFileName);
  136. #endif
  137.         CAutoLock lck(&m_csFilter);
  138.         /*  Check the file type */
  139.         CMediaType cmt;
  140.         if (NULL == pmt) {
  141.             cmt.SetType(&MEDIATYPE_Stream);
  142.             cmt.SetSubtype(&MEDIASUBTYPE_NULL);
  143.         } else {
  144.             cmt = *pmt;
  145.         }
  146.         if (!ReadTheFile(lpszFileName)) {
  147. #ifndef UNICODE
  148.             delete [] lpszFileName;
  149. #endif
  150.             return E_FAIL;
  151.         }
  152.         m_Stream.Init(m_pbData, m_llSize);
  153.         m_pFileName = new WCHAR[cch];
  154.         if (m_pFileName!=NULL)
  155.          CopyMemory(m_pFileName, lpwszFileName, cch*sizeof(WCHAR));
  156.         // this is not a simple assignment... pointers and format
  157.         // block (if any) are intelligently copied
  158.      m_mt = cmt;
  159.         /*  Work out file type */
  160.         cmt.bTemporalCompression = TRUE;        //???
  161.         cmt.lSampleSize = 1;
  162.         return S_OK;
  163.     }
  164.     // Modeled on IPersistFile::Load
  165.     // Caller needs to CoTaskMemFree or equivalent.
  166.     STDMETHODIMP GetCurFile(LPOLESTR * ppszFileName, AM_MEDIA_TYPE *pmt)
  167.     {
  168.         CheckPointer(ppszFileName, E_POINTER);
  169.         *ppszFileName = NULL;
  170.         if (m_pFileName!=NULL) {
  171.          DWORD n = sizeof(WCHAR)*(1+lstrlenW(m_pFileName));
  172.             *ppszFileName = (LPOLESTR) CoTaskMemAlloc( n );
  173.             if (*ppszFileName!=NULL) {
  174.                   CopyMemory(*ppszFileName, m_pFileName, n);
  175.             }
  176.         }
  177.         if (pmt!=NULL) {
  178.             CopyMediaType(pmt, &m_mt);
  179.         }
  180.         return NOERROR;
  181.     }
  182. private:
  183.     BOOL CAsyncFilter::ReadTheFile(LPCTSTR lpszFileName);
  184. private:
  185.     LPWSTR     m_pFileName;
  186.     LONGLONG   m_llSize;
  187.     PBYTE      m_pbData;
  188.     CMemStream m_Stream;
  189. };
  190. #endif