//==========================================================================; // // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY // KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR // PURPOSE. // // Copyright (c) 1992 - 1998 Microsoft Corporation. All Rights Reserved. // //--------------------------------------------------------------------------; const signed char MaxContrastLevel = 127; const signed char MinContrastLevel = -127; class CContrast : public CTransformFilter, public IContrast, public ISpecifyPropertyPages { public: static CUnknown * WINAPI CreateInstance(LPUNKNOWN punk, HRESULT *phr); // Reveals IContrast & ISpecifyPropertyPages STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void ** ppv); DECLARE_IUNKNOWN; HRESULT Transform(IMediaSample *pIn, IMediaSample *pOut); HRESULT CheckInputType(const CMediaType *mtIn); HRESULT CheckTransform(const CMediaType *mtIn,const CMediaType *mtOut); HRESULT GetMediaType(int iPosition, CMediaType *pMediaType); HRESULT DecideBufferSize(IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *pProperties); // IContrast methods STDMETHODIMP get_ContrastLevel(signed char *ContrastLevel); STDMETHODIMP put_ContrastLevel(signed char ContrastLevel, unsigned long ChangeTime); STDMETHODIMP put_DefaultContrastLevel(void); // ISpecifyPropertyPages method STDMETHODIMP GetPages(CAUUID *pPages); private: // Constructor CContrast(TCHAR *tszName, LPUNKNOWN punk, HRESULT *phr); // Look after the transformation of media samples BOOL CanChangeContrastLevel(const CMediaType *pMediaType) const; HRESULT Copy(IMediaSample *pSource, IMediaSample *pDest) const; HRESULT Transform(IMediaSample *pMediaSample); HRESULT Transform(AM_MEDIA_TYPE *pType, const signed char ContrastLevel) const; // Handle increasing and decreasing contrast void IncreaseContrast(RGBQUAD *pElem, const int Low, const int High, const float Grad) const; void IncreaseContrast(BYTE *pByte, const int Low, const int High, const float Grad) const; void DecreaseContrast(RGBQUAD *pElem, const int Level, const float Grad) const; void DecreaseContrast(BYTE *pByte, const int Level, const float Grad) const; // The default (no-change) level const signed char m_DefaultContrastLevel; // The current level to set the palette to signed char m_ContrastLevel; // The level the last frame's palette was set at signed char m_PrevLevel; // The number of buffers to request on the output allocator const long m_lBufferRequest; // Non interface locking critical section CCritSec m_ContrastLock; }; // CContrast