#include #include "ibitmap.h" #ifndef _VIDPOOL_H #define _VIDPOOL_H // {36447655-7089-11d0-BC25-00AA00A13C86} DEFINE_GUID(BFID_PRIVATEDIB, 0x36447655, 0x7089, 0x11d0, 0xbc, 0x25, 0x0, 0xaa, 0x0, 0xa1, 0x3c, 0x86); class CVidPool; class CBitmap : public IBitmapSurface { private: LONG m_cRef; public: LPBYTE m_bits; LONG m_pitch; int m_lockcount; BOOL m_ext; CBitmap* m_next; CVidPool* m_factory; void *m_refdata; CBitmap() {m_cRef = 0; m_bits = NULL; m_pitch = 0; m_lockcount = 0; m_ext = FALSE; m_next = NULL; m_factory = NULL; m_refdata = NULL;} // IUnknown methods virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj); virtual STDMETHODIMP_(ULONG) AddRef(void); virtual STDMETHODIMP_(ULONG) Release(void); // IBitmapSurface methods virtual STDMETHODIMP Clone(IBitmapSurface** ppBitmapSurface); virtual STDMETHODIMP GetFormat(BFID* pBFID); virtual STDMETHODIMP GetFactory(IBitmapSurfaceFactory** ppBitmapSurfaceFactory); virtual STDMETHODIMP GetSize(long* pWidth, long* pHeight); virtual STDMETHODIMP LockBits(RECT* prcBounds, DWORD dwLockFlags, void** ppBits, long* pPitch); virtual STDMETHODIMP UnlockBits(RECT* prcBounds, void* pBits); }; typedef void (NotifyAddingToFreeProc) (CBitmap *pBitmap, DWORD_PTR refdata); class CVidPool : public IBitmapSurfaceFactory { private: LONG m_cRef; BOOL m_growable; LONG m_nbufs; CBitmap* m_free; int m_pitch; BFID* m_format; CRITICAL_SECTION m_cs; LPBITMAPINFOHEADER m_pbmh; public: NotifyAddingToFreeProc *m_pAddingToFree; DWORD_PTR m_refdata; CVidPool(void); // IUnknown methods virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppvObj); virtual STDMETHODIMP_(ULONG) AddRef(void); virtual STDMETHODIMP_(ULONG) Release(void); // IBitmapSurfaceFactory methods virtual STDMETHODIMP CreateBitmapSurface(long width, long height, BFID* pBFID, DWORD dwHintFlags, IBitmapSurface** ppBitmapSurface); virtual STDMETHODIMP GetSupportedFormatsCount(long* pcFormats); virtual STDMETHODIMP GetSupportedFormats(long cFormats, BFID* pBFIDs); // private to implementation of CVidPool STDMETHODIMP InitPool(int nBuffers, LPBITMAPINFOHEADER lpcap); STDMETHODIMP AddExternalBuffer(void* pBits, void* refdata); STDMETHODIMP GetBuffer(CBitmap** ppBitmap, void** prefdata); STDMETHODIMP GetBuffer(IBitmapSurface** ppBitmap, void** prefdata); void AddToFreeList(CBitmap* pBitmap); BOOL Growable(void) { return m_growable; } BFID* GetFormat(void) {return m_format;} long GetWidth(void) { if (m_pbmh) return m_pbmh->biWidth; else return 0; } long GetHeight(void) { if (m_pbmh) return m_pbmh->biHeight; else return 0; } }; #endif // #ifndef _VIDPOOL_H