summaryrefslogtreecommitdiffstats
path: root/thirdparties/win32/include/directshow/winutil.h
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparties/win32/include/directshow/winutil.h')
-rw-r--r--thirdparties/win32/include/directshow/winutil.h419
1 files changed, 419 insertions, 0 deletions
diff --git a/thirdparties/win32/include/directshow/winutil.h b/thirdparties/win32/include/directshow/winutil.h
new file mode 100644
index 0000000..641b53a
--- /dev/null
+++ b/thirdparties/win32/include/directshow/winutil.h
@@ -0,0 +1,419 @@
+//------------------------------------------------------------------------------
+// File: WinUtil.h
+//
+// Desc: DirectShow base classes - defines generic handler classes.
+//
+// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
+//------------------------------------------------------------------------------
+
+
+// Make sure that you call PrepareWindow to initialise the window after
+// the object has been constructed. It is a separate method so that
+// derived classes can override useful methods like MessageLoop. Also
+// any derived class must call DoneWithWindow in its destructor. If it
+// doesn't a message may be retrieved and call a derived class member
+// function while a thread is executing the base class destructor code
+
+#ifndef __WINUTIL__
+#define __WINUTIL__
+
+const int DEFWIDTH = 320; // Initial window width
+const int DEFHEIGHT = 240; // Initial window height
+const int CAPTION = 256; // Maximum length of caption
+const int TIMELENGTH = 50; // Maximum length of times
+const int PROFILESTR = 128; // Normal profile string
+const WORD PALVERSION = 0x300; // GDI palette version
+const LONG PALETTE_VERSION = (LONG) 1; // Initial palette version
+const COLORREF VIDEO_COLOUR = 0; // Defaults to black background
+const HANDLE hMEMORY = (HANDLE) (-1); // Says to open as memory file
+
+#define WIDTH(x) ((*(x)).right - (*(x)).left)
+#define HEIGHT(x) ((*(x)).bottom - (*(x)).top)
+#define SHOWSTAGE TEXT("WM_SHOWSTAGE")
+#define SHOWSTAGETOP TEXT("WM_SHOWSTAGETOP")
+#define REALIZEPALETTE TEXT("WM_REALIZEPALETTE")
+
+class AM_NOVTABLE CBaseWindow
+{
+protected:
+
+ HINSTANCE m_hInstance; // Global module instance handle
+ HWND m_hwnd; // Handle for our window
+ HDC m_hdc; // Device context for the window
+ LONG m_Width; // Client window width
+ LONG m_Height; // Client window height
+ BOOL m_bActivated; // Has the window been activated
+ LPTSTR m_pClassName; // Static string holding class name
+ DWORD m_ClassStyles; // Passed in to our constructor
+ DWORD m_WindowStyles; // Likewise the initial window styles
+ DWORD m_WindowStylesEx; // And the extended window styles
+ UINT m_ShowStageMessage; // Have the window shown with focus
+ UINT m_ShowStageTop; // Makes the window WS_EX_TOPMOST
+ UINT m_RealizePalette; // Makes us realize our new palette
+ HDC m_MemoryDC; // Used for fast BitBlt operations
+ HPALETTE m_hPalette; // Handle to any palette we may have
+ BYTE m_bNoRealize; // Don't realize palette now
+ BYTE m_bBackground; // Should we realise in background
+ BYTE m_bRealizing; // already realizing the palette
+ CCritSec m_WindowLock; // Serialise window object access
+ BOOL m_bDoGetDC; // Should this window get a DC
+ bool m_bDoPostToDestroy; // Use PostMessage to destroy
+ CCritSec m_PaletteLock; // This lock protects m_hPalette.
+ // It should be held anytime the
+ // program use the value of m_hPalette.
+
+ // Maps windows message procedure into C++ methods
+ friend LRESULT CALLBACK WndProc(HWND hwnd, // Window handle
+ UINT uMsg, // Message ID
+ WPARAM wParam, // First parameter
+ LPARAM lParam); // Other parameter
+
+ virtual LRESULT OnPaletteChange(HWND hwnd, UINT Message);
+
+public:
+
+ CBaseWindow(BOOL bDoGetDC = TRUE, bool bPostToDestroy = false);
+
+#ifdef DEBUG
+ virtual ~CBaseWindow();
+#endif
+
+ virtual HRESULT DoneWithWindow();
+ virtual HRESULT PrepareWindow();
+ virtual HRESULT InactivateWindow();
+ virtual HRESULT ActivateWindow();
+ virtual BOOL OnSize(LONG Width, LONG Height);
+ virtual BOOL OnClose();
+ virtual RECT GetDefaultRect();
+ virtual HRESULT UninitialiseWindow();
+ virtual HRESULT InitialiseWindow(HWND hwnd);
+
+ HRESULT CompleteConnect();
+ HRESULT DoCreateWindow();
+
+ HRESULT PerformanceAlignWindow();
+ HRESULT DoShowWindow(LONG ShowCmd);
+ void PaintWindow(BOOL bErase);
+ void DoSetWindowForeground(BOOL bFocus);
+ virtual HRESULT SetPalette(HPALETTE hPalette);
+ void SetRealize(BOOL bRealize)
+ {
+ m_bNoRealize = !bRealize;
+ }
+
+ // Jump over to the window thread to set the current palette
+ HRESULT SetPalette();
+ void UnsetPalette(void);
+ virtual HRESULT DoRealisePalette(BOOL bForceBackground = FALSE);
+
+ void LockPaletteLock();
+ void UnlockPaletteLock();
+
+ virtual BOOL PossiblyEatMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
+ { return FALSE; };
+
+ // Access our window information
+
+ bool WindowExists();
+ LONG GetWindowWidth();
+ LONG GetWindowHeight();
+ HWND GetWindowHWND();
+ HDC GetMemoryHDC();
+ HDC GetWindowHDC();
+
+ #ifdef DEBUG
+ HPALETTE GetPalette();
+ #endif // DEBUG
+
+ // This is the window procedure the derived object should override
+
+ virtual LRESULT OnReceiveMessage(HWND hwnd, // Window handle
+ UINT uMsg, // Message ID
+ WPARAM wParam, // First parameter
+ LPARAM lParam); // Other parameter
+
+ // Must be overriden to return class and window styles
+
+ virtual LPTSTR GetClassWindowStyles(
+ __out DWORD *pClassStyles, // Class styles
+ __out DWORD *pWindowStyles, // Window styles
+ __out DWORD *pWindowStylesEx) PURE; // Extended styles
+};
+
+
+// This helper class is entirely subservient to the owning CBaseWindow object
+// All this object does is to split out the actual drawing operation from the
+// main object (because it was becoming too large). We have a number of entry
+// points to set things like the draw device contexts, to implement the actual
+// drawing and to set the destination rectangle in the client window. We have
+// no critical section locking in this class because we are used exclusively
+// by the owning window object which looks after serialising calls into us
+
+// If you want to use this class make sure you call NotifyAllocator once the
+// allocate has been agreed, also call NotifyMediaType with a pointer to a
+// NON stack based CMediaType once that has been set (we keep a pointer to
+// the original rather than taking a copy). When the palette changes call
+// IncrementPaletteVersion (easiest thing to do is to also call this method
+// in the SetMediaType method most filters implement). Finally before you
+// start rendering anything call SetDrawContext so that we can get the HDCs
+// for drawing from the CBaseWindow object we are given during construction
+
+class CDrawImage
+{
+protected:
+
+ CBaseWindow *m_pBaseWindow; // Owning video window object
+ CRefTime m_StartSample; // Start time for the current sample
+ CRefTime m_EndSample; // And likewise it's end sample time
+ HDC m_hdc; // Main window device context
+ HDC m_MemoryDC; // Offscreen draw device context
+ RECT m_TargetRect; // Target destination rectangle
+ RECT m_SourceRect; // Source image rectangle
+ BOOL m_bStretch; // Do we have to stretch the images
+ BOOL m_bUsingImageAllocator; // Are the samples shared DIBSECTIONs
+ CMediaType *m_pMediaType; // Pointer to the current format
+ int m_perfidRenderTime; // Time taken to render an image
+ LONG m_PaletteVersion; // Current palette version cookie
+
+ // Draw the video images in the window
+
+ void SlowRender(IMediaSample *pMediaSample);
+ void FastRender(IMediaSample *pMediaSample);
+ void DisplaySampleTimes(IMediaSample *pSample);
+ void UpdateColourTable(HDC hdc,__in BITMAPINFOHEADER *pbmi);
+ void SetStretchMode();
+
+public:
+
+ // Used to control the image drawing
+
+ CDrawImage(__inout CBaseWindow *pBaseWindow);
+ BOOL DrawImage(IMediaSample *pMediaSample);
+ BOOL DrawVideoImageHere(HDC hdc, IMediaSample *pMediaSample,
+ __in LPRECT lprcSrc, __in LPRECT lprcDst);
+ void SetDrawContext();
+ void SetTargetRect(__in RECT *pTargetRect);
+ void SetSourceRect(__in RECT *pSourceRect);
+ void GetTargetRect(__out RECT *pTargetRect);
+ void GetSourceRect(__out RECT *pSourceRect);
+ virtual RECT ScaleSourceRect(const RECT *pSource);
+
+ // Handle updating palettes as they change
+
+ LONG GetPaletteVersion();
+ void ResetPaletteVersion();
+ void IncrementPaletteVersion();
+
+ // Tell us media types and allocator assignments
+
+ void NotifyAllocator(BOOL bUsingImageAllocator);
+ void NotifyMediaType(__in CMediaType *pMediaType);
+ BOOL UsingImageAllocator();
+
+ // Called when we are about to draw an image
+
+ void NotifyStartDraw() {
+ MSR_START(m_perfidRenderTime);
+ };
+
+ // Called when we complete an image rendering
+
+ void NotifyEndDraw() {
+ MSR_STOP(m_perfidRenderTime);
+ };
+};
+
+
+// This is the structure used to keep information about each GDI DIB. All the
+// samples we create from our allocator will have a DIBSECTION allocated to
+// them. When we receive the sample we know we can BitBlt straight to an HDC
+
+typedef struct tagDIBDATA {
+
+ LONG PaletteVersion; // Current palette version in use
+ DIBSECTION DibSection; // Details of DIB section allocated
+ HBITMAP hBitmap; // Handle to bitmap for drawing
+ HANDLE hMapping; // Handle to shared memory block
+ BYTE *pBase; // Pointer to base memory address
+
+} DIBDATA;
+
+
+// This class inherits from CMediaSample and uses all of it's methods but it
+// overrides the constructor to initialise itself with the DIBDATA structure
+// When we come to render an IMediaSample we will know if we are using our own
+// allocator, and if we are, we can cast the IMediaSample to a pointer to one
+// of these are retrieve the DIB section information and hence the HBITMAP
+
+class CImageSample : public CMediaSample
+{
+protected:
+
+ DIBDATA m_DibData; // Information about the DIBSECTION
+ BOOL m_bInit; // Is the DIB information setup
+
+public:
+
+ // Constructor
+
+ CImageSample(__inout CBaseAllocator *pAllocator,
+ __in_opt LPCTSTR pName,
+ __inout HRESULT *phr,
+ __in_bcount(length) LPBYTE pBuffer,
+ LONG length);
+
+ // Maintain the DIB/DirectDraw state
+
+ void SetDIBData(__in DIBDATA *pDibData);
+ __out DIBDATA *GetDIBData();
+};
+
+
+// This is an allocator based on the abstract CBaseAllocator base class that
+// allocates sample buffers in shared memory. The number and size of these
+// are determined when the output pin calls Prepare on us. The shared memory
+// blocks are used in subsequent calls to GDI CreateDIBSection, once that
+// has been done the output pin can fill the buffers with data which will
+// then be handed to GDI through BitBlt calls and thereby remove one copy
+
+class CImageAllocator : public CBaseAllocator
+{
+protected:
+
+ CBaseFilter *m_pFilter; // Delegate reference counts to
+ CMediaType *m_pMediaType; // Pointer to the current format
+
+ // Used to create and delete samples
+
+ HRESULT Alloc();
+ void Free();
+
+ // Manage the shared DIBSECTION and DCI/DirectDraw buffers
+
+ HRESULT CreateDIB(LONG InSize,DIBDATA &DibData);
+ STDMETHODIMP CheckSizes(__in ALLOCATOR_PROPERTIES *pRequest);
+ virtual CImageSample *CreateImageSample(__in_bcount(Length) LPBYTE pData,LONG Length);
+
+public:
+
+ // Constructor and destructor
+
+ CImageAllocator(__inout CBaseFilter *pFilter,__in_opt LPCTSTR pName,__inout HRESULT *phr);
+#ifdef DEBUG
+ ~CImageAllocator();
+#endif
+
+ STDMETHODIMP_(ULONG) NonDelegatingAddRef();
+ STDMETHODIMP_(ULONG) NonDelegatingRelease();
+ void NotifyMediaType(__in CMediaType *pMediaType);
+
+ // Agree the number of buffers to be used and their size
+
+ STDMETHODIMP SetProperties(
+ __in ALLOCATOR_PROPERTIES *pRequest,
+ __out ALLOCATOR_PROPERTIES *pActual);
+};
+
+
+// This class is a fairly specialised helper class for image renderers that
+// have to create and manage palettes. The CBaseWindow class looks after
+// realising palettes once they have been installed. This class can be used
+// to create the palette handles from a media format (which must contain a
+// VIDEOINFO structure in the format block). We try to make the palette an
+// identity palette to maximise performance and also only change palettes
+// if actually required to (we compare palette colours before updating).
+// All the methods are virtual so that they can be overriden if so required
+
+class CImagePalette
+{
+protected:
+
+ CBaseWindow *m_pBaseWindow; // Window to realise palette in
+ CBaseFilter *m_pFilter; // Media filter to send events
+ CDrawImage *m_pDrawImage; // Object who will be drawing
+ HPALETTE m_hPalette; // The palette handle we own
+
+public:
+
+ CImagePalette(__inout CBaseFilter *pBaseFilter,
+ __inout CBaseWindow *pBaseWindow,
+ __inout CDrawImage *pDrawImage);
+
+#ifdef DEBUG
+ virtual ~CImagePalette();
+#endif
+
+ static HPALETTE MakePalette(const VIDEOINFOHEADER *pVideoInfo, __in LPSTR szDevice);
+ HRESULT RemovePalette();
+ static HRESULT MakeIdentityPalette(__inout_ecount_full(iColours) PALETTEENTRY *pEntry,INT iColours, __in LPSTR szDevice);
+ HRESULT CopyPalette(const CMediaType *pSrc,__out CMediaType *pDest);
+ BOOL ShouldUpdate(const VIDEOINFOHEADER *pNewInfo,const VIDEOINFOHEADER *pOldInfo);
+ HRESULT PreparePalette(const CMediaType *pmtNew,const CMediaType *pmtOld,__in LPSTR szDevice);
+
+ BOOL DrawVideoImageHere(HDC hdc, IMediaSample *pMediaSample, __in LPRECT lprcSrc, __in LPRECT lprcDst)
+ {
+ return m_pDrawImage->DrawVideoImageHere(hdc, pMediaSample, lprcSrc,lprcDst);
+ }
+};
+
+
+// Another helper class really for video based renderers. Most such renderers
+// need to know what the display format is to some degree or another. This
+// class initialises itself with the display format. The format can be asked
+// for through GetDisplayFormat and various other accessor functions. If a
+// filter detects a display format change (perhaps it gets a WM_DEVMODECHANGE
+// message then it can call RefreshDisplayType to reset that format). Also
+// many video renderers will want to check formats as they are proposed by
+// source filters. This class provides methods to check formats and only
+// accept those video formats that can be efficiently drawn using GDI calls
+
+class CImageDisplay : public CCritSec
+{
+protected:
+
+ // This holds the display format; biSize should not be too big, so we can
+ // safely use the VIDEOINFO structure
+ VIDEOINFO m_Display;
+
+ static DWORD CountSetBits(const DWORD Field);
+ static DWORD CountPrefixBits(const DWORD Field);
+ static BOOL CheckBitFields(const VIDEOINFO *pInput);
+
+public:
+
+ // Constructor and destructor
+
+ CImageDisplay();
+
+ // Used to manage BITMAPINFOHEADERs and the display format
+
+ const VIDEOINFO *GetDisplayFormat();
+ HRESULT RefreshDisplayType(__in_opt LPSTR szDeviceName);
+ static BOOL CheckHeaderValidity(const VIDEOINFO *pInput);
+ static BOOL CheckPaletteHeader(const VIDEOINFO *pInput);
+ BOOL IsPalettised();
+ WORD GetDisplayDepth();
+
+ // Provide simple video format type checking
+
+ HRESULT CheckMediaType(const CMediaType *pmtIn);
+ HRESULT CheckVideoType(const VIDEOINFO *pInput);
+ HRESULT UpdateFormat(__inout VIDEOINFO *pVideoInfo);
+ const DWORD *GetBitMasks(const VIDEOINFO *pVideoInfo);
+
+ BOOL GetColourMask(__out DWORD *pMaskRed,
+ __out DWORD *pMaskGreen,
+ __out DWORD *pMaskBlue);
+};
+
+// Convert a FORMAT_VideoInfo to FORMAT_VideoInfo2
+STDAPI ConvertVideoInfoToVideoInfo2(__inout AM_MEDIA_TYPE *pmt);
+
+// Check a media type containing VIDEOINFOHEADER
+STDAPI CheckVideoInfoType(const AM_MEDIA_TYPE *pmt);
+
+// Check a media type containing VIDEOINFOHEADER
+STDAPI CheckVideoInfo2Type(const AM_MEDIA_TYPE *pmt);
+
+#endif // __WINUTIL__
+
OpenPOWER on IntegriCloud