You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
324 lines
12 KiB
324 lines
12 KiB
/*****************************************************************************
|
|
*
|
|
* (C) COPYRIGHT MICROSOFT CORPORATION, 2000
|
|
*
|
|
* TITLE: DShowUtl.h
|
|
*
|
|
* VERSION: 1.0
|
|
*
|
|
* AUTHOR: OrenR
|
|
*
|
|
* DATE: 2000/10/25
|
|
*
|
|
* DESCRIPTION: Provides supporting DShow utility functions used to build
|
|
* preview graph
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#ifndef _DSHOWUTL_H_
|
|
#define _DSHOWUTL_H_
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAccessLock
|
|
//
|
|
// locks a critical section, and unlocks it automatically
|
|
// when the lock goes out of scope
|
|
//
|
|
class CAccessLock
|
|
{
|
|
public:
|
|
CAccessLock(CRITICAL_SECTION *pCritSec)
|
|
{
|
|
m_pLock = pCritSec;
|
|
EnterCriticalSection(m_pLock);
|
|
};
|
|
|
|
~CAccessLock()
|
|
{
|
|
LeaveCriticalSection(m_pLock);
|
|
};
|
|
|
|
static HRESULT Init(CRITICAL_SECTION *pCritSec)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
__try
|
|
{
|
|
if (!InitializeCriticalSectionAndSpinCount(pCritSec, MINLONG))
|
|
{
|
|
hr = HRESULT_FROM_WIN32(::GetLastError());
|
|
CHECK_S_OK2(hr, ("CAccessLock::Init, failed to create Critical "
|
|
"section "));
|
|
}
|
|
}
|
|
__except(EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
static HRESULT Term(CRITICAL_SECTION *pCritSec)
|
|
{
|
|
DeleteCriticalSection(pCritSec);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
protected:
|
|
CRITICAL_SECTION *m_pLock;
|
|
|
|
private:
|
|
|
|
// make copy constructor and assignment operator inaccessible
|
|
|
|
CAccessLock(const CAccessLock &refAutoLock);
|
|
CAccessLock &operator=(const CAccessLock &refAutoLock);
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CWiaVideoProperties
|
|
|
|
class CWiaVideoProperties
|
|
{
|
|
public:
|
|
|
|
#define PREFERRED_SETTING_MASK_MEDIASUBTYPE 0x00000001
|
|
#define PREFERRED_SETTING_MASK_VIDEO_WIDTH_HEIGHT 0x00000002
|
|
#define PREFERRED_SETTING_MASK_VIDEO_FRAMERATE 0x00000004
|
|
|
|
////////////////////////
|
|
// PictureAttribute_t
|
|
//
|
|
// Contains all information
|
|
// that can be obtained
|
|
// via the IAMVideoProcAmp
|
|
// interface
|
|
//
|
|
typedef struct tagPictureAttribute_t
|
|
{
|
|
BOOL bUsed; // TRUE if attribute is implemented, FALSE otherwise
|
|
VideoProcAmpProperty Name;
|
|
LONG lCurrentValue;
|
|
VideoProcAmpFlags CurrentFlag;
|
|
LONG lMinValue;
|
|
LONG lMaxValue;
|
|
LONG lDefaultValue;
|
|
LONG lIncrement;
|
|
VideoProcAmpFlags ValidFlags;
|
|
} PictureAttribute_t;
|
|
|
|
////////////////////////
|
|
// CameraAttribute_t
|
|
//
|
|
// Contains all information
|
|
// that can be obtained
|
|
// via the IAMCameraControl
|
|
// interface
|
|
//
|
|
typedef struct tagCameraAttribute_t
|
|
{
|
|
BOOL bUsed; // TRUE if attribute is implemented, FALSE otherwise
|
|
CameraControlProperty Name;
|
|
LONG lCurrentValue;
|
|
CameraControlFlags CurrentFlag;
|
|
LONG lMinValue;
|
|
LONG lMaxValue;
|
|
LONG lDefaultValue;
|
|
LONG lIncrement;
|
|
CameraControlFlags ValidFlags;
|
|
} CameraAttribute_t;
|
|
|
|
CWiaVideoProperties(const TCHAR *pszOptionalWiaDeviceID) :
|
|
pMediaType(NULL),
|
|
pVideoInfoHeader(NULL),
|
|
dwFrameRate(0),
|
|
bPictureAttributesUsed(FALSE),
|
|
bCameraAttributesUsed(FALSE),
|
|
PreferredWidth(0),
|
|
PreferredHeight(0),
|
|
PreferredFrameRate(0),
|
|
PreferredSettingsMask(0)
|
|
{
|
|
ZeroMemory(&Brightness, sizeof(Brightness));
|
|
ZeroMemory(&Contrast, sizeof(Contrast));
|
|
ZeroMemory(&Hue, sizeof(Hue));
|
|
ZeroMemory(&Saturation, sizeof(Saturation));
|
|
ZeroMemory(&Sharpness, sizeof(Sharpness));
|
|
ZeroMemory(&Gamma, sizeof(Gamma));
|
|
ZeroMemory(&ColorEnable, sizeof(ColorEnable));
|
|
ZeroMemory(&WhiteBalance, sizeof(WhiteBalance));
|
|
ZeroMemory(&BacklightCompensation, sizeof(BacklightCompensation));
|
|
ZeroMemory(&Pan, sizeof(Pan));
|
|
ZeroMemory(&Tilt, sizeof(Tilt));
|
|
ZeroMemory(&Roll, sizeof(Roll));
|
|
ZeroMemory(&Zoom, sizeof(Zoom));
|
|
ZeroMemory(&Exposure, sizeof(Exposure));
|
|
ZeroMemory(&Iris, sizeof(Iris));
|
|
ZeroMemory(&Focus, sizeof(Focus));
|
|
ZeroMemory(szWiaDeviceID, sizeof(szWiaDeviceID));
|
|
ZeroMemory(&PreferredMediaSubType, sizeof(PreferredMediaSubType));
|
|
|
|
if (pszOptionalWiaDeviceID)
|
|
{
|
|
_tcsncpy(szWiaDeviceID,
|
|
pszOptionalWiaDeviceID,
|
|
sizeof(szWiaDeviceID) / sizeof(TCHAR) - 1);
|
|
}
|
|
}
|
|
|
|
virtual ~CWiaVideoProperties()
|
|
{
|
|
if (pMediaType)
|
|
{
|
|
DeleteMediaType(pMediaType);
|
|
pMediaType = NULL;
|
|
pVideoInfoHeader = NULL;
|
|
dwFrameRate = 0;
|
|
bPictureAttributesUsed = FALSE;
|
|
bCameraAttributesUsed = FALSE;
|
|
}
|
|
}
|
|
|
|
TCHAR szWiaDeviceID[MAX_PATH + 1];
|
|
DWORD PreferredSettingsMask;
|
|
GUID PreferredMediaSubType;
|
|
LONG PreferredWidth;
|
|
LONG PreferredHeight;
|
|
LONG PreferredFrameRate;
|
|
|
|
AM_MEDIA_TYPE *pMediaType;
|
|
VIDEOINFOHEADER *pVideoInfoHeader;
|
|
DWORD dwFrameRate;
|
|
|
|
BOOL bPictureAttributesUsed;
|
|
PictureAttribute_t Brightness;
|
|
PictureAttribute_t Contrast;
|
|
PictureAttribute_t Hue;
|
|
PictureAttribute_t Saturation;
|
|
PictureAttribute_t Sharpness;
|
|
PictureAttribute_t Gamma;
|
|
PictureAttribute_t ColorEnable;
|
|
PictureAttribute_t WhiteBalance;
|
|
PictureAttribute_t BacklightCompensation;
|
|
|
|
BOOL bCameraAttributesUsed;
|
|
CameraAttribute_t Pan;
|
|
CameraAttribute_t Tilt;
|
|
CameraAttribute_t Roll;
|
|
CameraAttribute_t Zoom;
|
|
CameraAttribute_t Exposure;
|
|
CameraAttribute_t Iris;
|
|
CameraAttribute_t Focus;
|
|
};
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CDShowUtil
|
|
|
|
class CDShowUtil
|
|
{
|
|
public:
|
|
|
|
static HRESULT SizeVideoToWindow(HWND hwnd,
|
|
IVideoWindow *pVideoWindow,
|
|
BOOL bStretchToFit);
|
|
|
|
static HRESULT ShowVideo(BOOL bShow,
|
|
IVideoWindow *pVideoWindow);
|
|
|
|
static HRESULT SetVideoWindowParent(HWND hwndParent,
|
|
IVideoWindow *pVideoWindow,
|
|
LONG *plOldWindowStyle);
|
|
|
|
static HRESULT FindDeviceByEnumPos(LONG lEnumPos,
|
|
CSimpleString *pstrDShowDeviceID,
|
|
CSimpleString *pstrFriendlyName,
|
|
IMoniker **ppDeviceMoniker);
|
|
|
|
static HRESULT FindDeviceByFriendlyName(const CSimpleString *pstrFriendlyName,
|
|
LONG *plEnumPos,
|
|
CSimpleString *pstrDShowDeviceID,
|
|
IMoniker **ppDeviceMoniker);
|
|
|
|
static HRESULT FindDeviceByWiaID(class CWiaLink *pWiaLink,
|
|
const CSimpleString *pstrWiaDeviceID,
|
|
CSimpleString *pstrFriendlyName,
|
|
LONG *plEnumPos,
|
|
CSimpleString *pstrDShowDeviceID,
|
|
IMoniker **ppDeviceMoniker);
|
|
|
|
static HRESULT CreateGraphBuilder(ICaptureGraphBuilder2 **ppCaptureGraphBuilder,
|
|
IGraphBuilder **ppGraphBuilder);
|
|
|
|
static HRESULT GetMonikerProperty(IMoniker *pMoniker,
|
|
LPCWSTR pwszProperty,
|
|
CSimpleString *pstrProperty);
|
|
|
|
static HRESULT SetPreferredVideoFormat(IPin *pCapturePin,
|
|
const GUID *pPreferredSubType,
|
|
LONG lPreferredWidth,
|
|
LONG lPreferredHeight,
|
|
CWiaVideoProperties *pVideoProperties);
|
|
|
|
static HRESULT SetFrameRate(IPin *pCapturePin,
|
|
LONG lNewFrameRate,
|
|
CWiaVideoProperties *pVideoProperties);
|
|
|
|
static HRESULT GetFrameRate(IPin *pCapturePin,
|
|
LONG *plFrameRate);
|
|
|
|
static HRESULT GetPin(IBaseFilter *pFilter,
|
|
PIN_DIRECTION PinDirection,
|
|
IPin **ppPin);
|
|
|
|
static HRESULT GetVideoProperties(IBaseFilter *pCaptureFilter,
|
|
IPin *pCapturePin,
|
|
CWiaVideoProperties *pVideoProperties);
|
|
|
|
static HRESULT SetPictureAttribute(IBaseFilter *pCaptureFilter,
|
|
CWiaVideoProperties::PictureAttribute_t *pPictureAttribute,
|
|
LONG lNewValue,
|
|
VideoProcAmpFlags lNewFlag);
|
|
|
|
static HRESULT SetCameraAttribute(IBaseFilter *pCaptureFilter,
|
|
CWiaVideoProperties::CameraAttribute_t *pCameraAttribute,
|
|
LONG lNewValue,
|
|
CameraControlFlags lNewFlag);
|
|
|
|
static HRESULT TurnOffGraphClock(IGraphBuilder *pGraphBuilder);
|
|
|
|
static void GUIDToString(const GUID &clsid,
|
|
WCHAR *pwszGUID,
|
|
ULONG ulNumChars);
|
|
|
|
static void DumpCaptureMoniker(IMoniker *pCaptureDeviceMoniker);
|
|
|
|
static void MyDumpVideoProperties(CWiaVideoProperties *pVideoProperties);
|
|
|
|
static void MyDumpGraph(LPCTSTR Description,
|
|
IGraphBuilder *pGraphBuilder);
|
|
|
|
static void MyDumpFilter(IBaseFilter *pFilter);
|
|
|
|
static void MyDumpAllPins(IBaseFilter *const pFilter);
|
|
|
|
static void MyDumpPin(IPin *pPin);
|
|
|
|
private:
|
|
|
|
static HRESULT FindDeviceGeneric(UINT uiFindFlag,
|
|
CSimpleString *pstrDShowDeviceID,
|
|
LONG *plEnumPos,
|
|
CSimpleString *pstrFriendlyName,
|
|
IMoniker **ppDeviceMoniker);
|
|
|
|
static HRESULT GetDeviceProperty(IPropertyBag *pPropertyBag,
|
|
LPCWSTR pwszProperty,
|
|
CSimpleString *pstrProperty);
|
|
};
|
|
|
|
#endif // _DSHOWUTL_H_
|
|
|
|
|