windows-nt/Source/XPSP1/NT/net/tapi/skywalker/ipconf/msp/confvidt.cpp
2020-09-26 16:20:57 +08:00

294 lines
6.4 KiB
C++

/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
IPConfvidt.cpp
Abstract:
IPConf MSP implementation of vido capture terminal.
Author:
Zoltan Szilagyi (zoltans) September 6,1998
Mu Han (muhan) June 6, 1999
--*/
#include "stdafx.h"
CIPConfVideoCaptureTerminal::CIPConfVideoCaptureTerminal()
{
LOG((MSP_TRACE, "CIPConfVideoCaptureTerminal::CIPConfVideoCaptureTerminal"));
m_TerminalClassID = CLSID_VideoInputTerminal;
m_TerminalDirection = TD_CAPTURE;
m_TerminalType = TT_STATIC;
m_TerminalState = TS_NOTINUSE;
m_dwMediaType = TAPIMEDIATYPE_VIDEO;
}
CIPConfVideoCaptureTerminal::~CIPConfVideoCaptureTerminal()
{
LOG((MSP_TRACE, "CIPConfVideoCaptureTerminal::~CIPConfVideoCaptureTerminal"));
}
HRESULT CIPConfVideoCaptureTerminal::CreateTerminal(
IN char * strDeviceName,
IN UINT VideoCaptureID,
IN MSP_HANDLE htAddress,
OUT ITTerminal **ppTerm
)
/*++
Routine Description:
This method creates a terminal object base to identify a video capture
device.
Arguments:
strDeviceName - the name of the device.
VideoCaptureID - the index of the device.
htAddress - the handle to the address object.
ppTerm - memory to store the returned terminal pointer.
Return Value:
S_OK
--*/
{
ENTER_FUNCTION("CIPConfVideoCaptureTerminal::CreateTerminal");
LOG((MSP_TRACE, "%s, htAddress:%x", __fxName, htAddress));
_ASSERT(!IsBadWritePtr(ppTerm, sizeof(ITTerminal *)));
HRESULT hr;
// Create the filter.
CMSPComObject<CIPConfVideoCaptureTerminal> *pTerminal = NULL;
hr = ::CreateCComObjectInstance(&pTerminal);
if (FAILED(hr))
{
LOG((MSP_ERROR,
"%s can't create the terminal object hr = %8x", __fxName, hr));
return hr;
}
// query for the ITTerminal interface
ITTerminal *pITTerminal;
hr = pTerminal->_InternalQueryInterface(
__uuidof(ITTerminal), (void**)&pITTerminal
);
if (FAILED(hr))
{
LOG((MSP_ERROR,
"%s, query terminal interface failed, %x", __fxName, hr));
delete pTerminal;
return hr;
}
// initialize the terminal
hr = pTerminal->Initialize(
strDeviceName,
VideoCaptureID,
htAddress
);
if ( FAILED(hr) )
{
LOG((MSP_ERROR,
"%s, Initialize failed; returning 0x%08x", __fxName, hr));
pITTerminal->Release();
return hr;
}
LOG((MSP_TRACE, "%s, %s created", __fxName, strDeviceName));
*ppTerm = pITTerminal;
return S_OK;
}
HRESULT CIPConfVideoCaptureTerminal::Initialize(
IN char * strName,
IN UINT VideoCaptureID,
IN MSP_HANDLE htAddress
)
/*++
Routine Description:
This function sets the video capture device ID and then calls the
Initialize method of the base class.
Arguments:
strName - The name of the terminal.
VideoCaptureID - The ID of the video capture device. Later it will be used
in creating the video capture filer.
htAddress - The handle that identifies the address object that this
terminal belongs to.
Return Value:
S_OK
--*/
{
m_VideoCaptureID = VideoCaptureID;
return CIPConfBaseTerminal::Initialize(strName, htAddress);
}
HRESULT CIPConfVideoCaptureTerminal::CreateFilter(void)
/*++
Routine Description:
This method creates the filter in this terminal. It creates the tapi video
capture filter and configures the device it uses.
Arguments:
nothing.
Return Value:
S_OK
--*/
{
ENTER_FUNCTION("CIPConfVideoCaptureTerminal::CreateFilters");
LOG((MSP_TRACE, "%s, entered", __fxName));
// This should only be called atmost once in the lifetime of this instance
if (m_pFilter != NULL)
{
return S_OK;
}
IBaseFilter *pICaptureFilter;
// Create the filter.
HRESULT hr = CoCreateInstance(
__uuidof(TAPIVideoCapture),
NULL,
CLSCTX_INPROC_SERVER | CLSCTX_NO_CODE_DOWNLOAD,
__uuidof(IBaseFilter),
(void **)&pICaptureFilter
);
if (FAILED(hr))
{
LOG((MSP_ERROR,
"%s, CoCreate filter failed, %x", __fxName, hr));
return hr;
}
// get the config interface.
IVideoDeviceControl *pIVideoDeviceControl;
hr = pICaptureFilter->QueryInterface(
__uuidof(IVideoDeviceControl),
(void **)&pIVideoDeviceControl
);
if (FAILED(hr))
{
pICaptureFilter->Release();
LOG((MSP_ERROR,
"%s, can't get the IVideoDeviceControl interface, %x",
__fxName, hr));
return hr;
}
// tell the filter the device IDs.
hr = pIVideoDeviceControl->SetCurrentDevice(m_VideoCaptureID);
pIVideoDeviceControl->Release();
if (FAILED(hr))
{
pICaptureFilter->Release();
LOG((MSP_ERROR,
"%s, set device ID failed, %x", __fxName, hr));
return hr;
}
// remember the filter, keep the refcount as well.
m_pFilter = pICaptureFilter;
LOG((MSP_TRACE, "%s succeeded", __fxName));
return S_OK;
}
HRESULT CIPConfVideoCaptureTerminal::GetExposedPins(
IN IPin ** ppPins,
IN DWORD dwNumPins
)
/*++
Routine Description:
This method returns the output pins of the video capture filter.
Arguments:
ppPins - memory buffer to store the returned pins.
dwNumPins - the number pins asked.
Return Value:
S_OK
--*/
{
ENTER_FUNCTION("CIPConfVideoRenderTerminal::GetExposedPins");
LOG((MSP_TRACE, "%s entered, dwNumPins:%d", __fxName, dwNumPins));
_ASSERT(m_pFilter != NULL);
_ASSERT(dwNumPins != 0);
_ASSERT(!IsBadWritePtr(ppPins, sizeof (IPin*) * dwNumPins));
// Get the enumerator of pins on the filter.
IEnumPins * pIEnumPins;
HRESULT hr = m_pFilter->EnumPins(&pIEnumPins);
if (FAILED(hr))
{
LOG((MSP_ERROR,
"%s enumerate pins on the filter failed. hr=%x", __fxName, hr));
return hr;
}
// TODO: get only the outptu pins.
// get the pins.
DWORD dwFetched;
hr = pIEnumPins->Next(dwNumPins, ppPins, &dwFetched);
pIEnumPins->Release();
if (FAILED(hr))
{
LOG((MSP_ERROR,
"%s IEnumPins->Next failed. hr=%x", __fxName, hr));
return hr;
}
_ASSERT(dwFetched == dwNumPins);
return S_OK;
}