#define CINTERFACE
#define COBJMACROS
#include "ocidl.h"
+#include "objidl.h"
#include "errors.h" /* for VFW_E_XXXX */
#include "mmsystem.h" /* for MAKEFOURCC macro */
#include "maru_camera_win32.h"
long m_cRef;
MaruCamState *m_pState;
CallbackFn m_pCallback;
- STDMETHODIMP (*SetCallback)(IGrabCallback *iface, CallbackFn pCallbackFn);
- STDMETHODIMP (*SetState)(IGrabCallback *iface, MaruCamState *pState);
} HWCGrabCallback;
static inline HWCGrabCallback *impl_from_IGrabCallback(IGrabCallback *iface)
return E_FAIL;
}
-static STDMETHODIMP HWCGrabCallback_SetCallback(IGrabCallback *iface,
- CallbackFn pCallbackFn)
-{
- HWCGrabCallback *This = impl_from_IGrabCallback(iface);
-
- This->m_pCallback = pCallbackFn;
- return S_OK;
-}
-
-static STDMETHODIMP HWCGrabCallback_SetState(IGrabCallback *iface,
- MaruCamState *pState)
-{
- HWCGrabCallback *This = impl_from_IGrabCallback(iface);
-
- This->m_pState = pState;
- return S_OK;
-}
-
static IGrabCallbackVtbl HWCGrabCallback_Vtbl = {
HWCGrabCallback_QueryInterface,
HWCGrabCallback_AddRef,
This->IGrabCallback_iface.lpVtbl = &HWCGrabCallback_Vtbl;
This->m_cRef = 1;
This->m_pCallback = NULL;
- This->SetCallback = HWCGrabCallback_SetCallback;
- This->SetState = HWCGrabCallback_SetState;
+ This->m_pState = NULL;
*ppv = &This->IGrabCallback_iface;
return S_OK;
}
+static STDMETHODIMP HWCGrabCallback_SetCallback(IGrabCallback *iface,
+ CallbackFn pCallbackFn)
+{
+ HWCGrabCallback *This = impl_from_IGrabCallback(iface);
+
+ This->m_pCallback = pCallbackFn;
+ return S_OK;
+}
+
+static STDMETHODIMP HWCGrabCallback_SetState(IGrabCallback *iface,
+ MaruCamState *pState)
+{
+ HWCGrabCallback *This = impl_from_IGrabCallback(iface);
+
+ This->m_pState = pState;
+ return S_OK;
+}
+
/*
* HWCPin
*/
IMemAllocator *m_pAllocator;
BOOL m_bReadOnly;
long m_cRef;
- STDMETHODIMP (*SetGrabCb)(IPin *iface, IGrabCallback *pCaptureCB);
} HWCInPin;
static inline HWCInPin *impl_from_IPin(IPin *iface)
This->m_pCallback = NULL;
This->m_pAllocator = NULL;
This->m_cRef = 1;
- This->SetGrabCb = HWCPin_SetCallback;
*ppv = &This->IPin_iface;
return S_OK;
/*
* Callback function for grab frames
*/
-static STDMETHODIMP marucam_device_callbackfn(MaruCamState *state,
+static STDMETHODIMP GrabFrameCallback(MaruCamState *state,
ULONG dwSize, BYTE *pBuffer)
{
void *tmp_buf;
- uint32_t width, height, fmt, imgsize;
+ uint32_t imgsize;
MCBackendWin *backend = (MCBackendWin *)(state->backend);
- width = backend->dst_width;
- height = backend->dst_height;
- fmt = backend->dst_fmt;
- imgsize = get_sizeimage(fmt, width, height);
+ imgsize = get_sizeimage(backend->dst_fmt,
+ backend->dst_width,
+ backend->dst_height);
if (imgsize > (uint32_t)dwSize) {
ERR("Image size is mismatched\n");
return E_FAIL;
}
- if (convert_frame(backend->src_fmt, backend->dst_fmt, width, height,
+ if (convert_frame(backend->src_fmt, backend->dst_fmt,
+ backend->dst_width, backend->dst_height,
(size_t)dwSize, pBuffer, backend->buf) > 0) {
return E_FAIL;
}
static STDMETHODIMP_(void) CloseInterfaces(MCBackendWin *backend)
{
if (backend->pMC) {
- backend->pMC->lpVtbl->Stop(backend->pMC);
+ IMediaControl_Stop(backend->pMC);
}
if (backend->pOutPin) {
- backend->pOutPin->lpVtbl->Disconnect(backend->pOutPin);
+ IPin_Disconnect(backend->pOutPin);
}
SAFE_RELEASE(backend->pGB);
return E_POINTER;
}
- hr = pFilter->lpVtbl->EnumPins(pFilter, &pEnum);
+ hr = IBaseFilter_EnumPins(pFilter, &pEnum);
if (FAILED(hr)) {
return hr;
}
- while (pEnum->lpVtbl->Next(pEnum, 1, &pPin, 0) == S_OK) {
+ while (IEnumPins_Next(pEnum, 1, &pPin, 0) == S_OK) {
PIN_DIRECTION PinDirThis;
- hr = pPin->lpVtbl->QueryDirection(pPin, &PinDirThis);
+ hr = IPin_QueryDirection(pPin, &PinDirThis);
if (FAILED(hr)) {
SAFE_RELEASE(pPin);
SAFE_RELEASE(pEnum);
return hr;
}
- hr = backend->pCGB->lpVtbl->SetFiltergraph(backend->pCGB, backend->pGB);
+ hr = ICaptureGraphBuilder2_SetFiltergraph(backend->pCGB, backend->pGB);
if (FAILED(hr)) {
ERR("Failed to SetFiltergraph, 0x%x\n", hr);
return hr;
}
- hr = backend->pGB->lpVtbl->QueryInterface(backend->pGB, &IID_IMediaControl,
- (void **)&backend->pMC);
+ hr = IGraphBuilder_QueryInterface(backend->pGB, &IID_IMediaControl,
+ (void **)&backend->pMC);
if (FAILED(hr)) {
ERR("Failed to QueryInterface for IMediaControl, 0x%x\n", hr);
return hr;
hr = HWCGrabCallback_Construct(&backend->pCallback);
if (backend->pCallback == NULL) {
hr = E_OUTOFMEMORY;
+ return hr;
}
- hr = ((HWCGrabCallback *)(backend->pCallback))->SetCallback(
- backend->pCallback, (CallbackFn)marucam_device_callbackfn);
- hr = ((HWCGrabCallback *)(backend->pCallback))->SetState(
- backend->pCallback, backend->base.state);
+ hr = HWCGrabCallback_SetCallback(backend->pCallback, GrabFrameCallback);
+ hr = HWCGrabCallback_SetState(backend->pCallback, backend->base.state);
return hr;
}
HRESULT hr;
ICreateDevEnum *pCreateDevEnum = NULL;
IEnumMoniker *pEnumMK = NULL;
- IMoniker *pMoniKer;
+ IMoniker *pMoniker;
hr = CoCreateInstance(&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
&IID_ICreateDevEnum,
return hr;
}
- hr = pCreateDevEnum->lpVtbl->CreateClassEnumerator(pCreateDevEnum,
- &CLSID_VideoInputDeviceCategory,
- &pEnumMK, 0);
+ hr = ICreateDevEnum_CreateClassEnumerator(pCreateDevEnum,
+ &CLSID_VideoInputDeviceCategory,
+ &pEnumMK, 0);
if (FAILED(hr)) {
ERR("Failed to get VideoInputDeviceCategory, 0x%x\n", hr);
SAFE_RELEASE(pCreateDevEnum);
SAFE_RELEASE(pCreateDevEnum);
return E_FAIL;
}
- pEnumMK->lpVtbl->Reset(pEnumMK);
+ IEnumMoniker_Reset(pEnumMK);
- hr = pEnumMK->lpVtbl->Next(pEnumMK, 1, &pMoniKer, NULL);
+ hr = IEnumMoniker_Next(pEnumMK, 1, &pMoniker, NULL);
if (hr == S_FALSE) {
hr = E_FAIL;
}
if (SUCCEEDED(hr)) {
IPropertyBag *pBag = NULL;
- hr = pMoniKer->lpVtbl->BindToStorage(pMoniKer, 0, 0,
- &IID_IPropertyBag,
- (void **)&pBag);
+ hr = IMoniker_BindToStorage(pMoniker, 0, 0,
+ &IID_IPropertyBag,
+ (void **)&pBag);
if (SUCCEEDED(hr)) {
VARIANT var;
var.vt = VT_BSTR;
- hr = pBag->lpVtbl->Read(pBag, L"FriendlyName", &var, NULL);
+ hr = IPropertyBag_Read(pBag, L"FriendlyName", &var, NULL);
if (hr == NOERROR) {
- hr = pMoniKer->lpVtbl->BindToObject(pMoniKer, NULL, NULL,
- &IID_IBaseFilter,
- (void **)&backend->pSrcFilter);
+ hr = IMoniker_BindToObject(pMoniker, NULL, NULL,
+ &IID_IBaseFilter,
+ (void **)&backend->pSrcFilter);
if (FAILED(hr)) {
ERR("Counldn't bind moniker to filter object!!\n");
} else {
- backend->pSrcFilter->lpVtbl->AddRef(backend->pSrcFilter);
+ IBaseFilter_AddRef(backend->pSrcFilter);
}
SysFreeString(var.bstrVal);
}
SAFE_RELEASE(pBag);
}
- SAFE_RELEASE(pMoniKer);
+ SAFE_RELEASE(pMoniker);
}
if (SUCCEEDED(hr)) {
- hr = backend->pGB->lpVtbl->AddFilter(backend->pGB,
- backend->pSrcFilter,
- L"Video Capture");
+ hr = IGraphBuilder_AddFilter(backend->pGB,
+ backend->pSrcFilter,
+ L"Video Capture");
if (hr != S_OK && hr != S_FALSE) {
ERR("Counldn't add Video Capture filter to our graph!\n");
SAFE_RELEASE(backend->pSrcFilter);
hr = HWCFilter_Construct(&backend->pDstFilter);
if (SUCCEEDED(hr) && backend->pDstFilter) {
- hr = backend->pGB->lpVtbl->AddFilter(backend->pGB,
- backend->pDstFilter,
- L"HWCFilter");
+ hr = IGraphBuilder_AddFilter(backend->pGB,
+ backend->pDstFilter,
+ L"HWCFilter");
if (FAILED(hr)) {
ERR("Counldn't add HWCFilterr to our graph!\n");
SAFE_RELEASE(backend->pDstFilter);
return hr;
}
- hr = pGB->lpVtbl->Connect(pGB, pOut, pIn);
+ hr = IGraphBuilder_Connect(pGB, pOut, pIn);
if (FAILED(hr)) {
ERR("Failed to connect pins. 0x%x\n", hr);
}
IPin *pIn = backend->pInPin;
HRESULT hr;
- hr = pGB->lpVtbl->Disconnect(pGB, pOut);
+ hr = IGraphBuilder_Disconnect(pGB, pOut);
if (FAILED(hr)) {
ERR("Failed to disconnect output pin. 0x%x\n", hr);
return hr;
}
- hr = pGB->lpVtbl->Disconnect(pGB, pIn);
+ hr = IGraphBuilder_Disconnect(pGB, pIn);
if (FAILED(hr)) {
ERR("Failed to disconnect input pin. 0x%x\n", hr);
}
IBaseFilter *pDst = backend->pDstFilter;
HRESULT hr;
- hr = pGB->lpVtbl->RemoveFilter(pGB, pSrc);
+ hr = IGraphBuilder_RemoveFilter(pGB, pSrc);
if (FAILED(hr)) {
ERR("Failed to remove source filer. 0x%x\n", hr);
return hr;
}
- hr = pGB->lpVtbl->RemoveFilter(pGB, pDst);
+ hr = IGraphBuilder_RemoveFilter(pGB, pDst);
if (FAILED(hr)) {
ERR("Failed to remove destination filer. 0x%x\n", hr);
}
DWORD dwYUY2 = MAKEFOURCC('Y', 'U', 'Y', '2');
DWORD dwI420 = MAKEFOURCC('I', '4', '2', '0');
- hr = backend->pCGB->lpVtbl->FindInterface(backend->pCGB,
- &PIN_CATEGORY_CAPTURE, 0,
- backend->pSrcFilter,
- &IID_IAMStreamConfig,
- (void **)&pSConfig);
+ hr = ICaptureGraphBuilder2_FindInterface(backend->pCGB,
+ &PIN_CATEGORY_CAPTURE, 0,
+ backend->pSrcFilter,
+ &IID_IAMStreamConfig,
+ (void **)&pSConfig);
if (FAILED(hr)) {
ERR("failed to FindInterface method\n");
return hr;
}
- hr = pSConfig->lpVtbl->GetNumberOfCapabilities(pSConfig, &iCount, &iSize);
+ hr = IAMStreamConfig_GetNumberOfCapabilities(pSConfig, &iCount, &iSize);
if (FAILED(hr)) {
ERR("failed to GetNumberOfCapabilities method\n");
SAFE_RELEASE(pSConfig);
VIDEO_STREAM_CONFIG_CAPS scc;
AM_MEDIA_TYPE *pmtConfig;
- hr = pSConfig->lpVtbl->GetStreamCaps(pSConfig, iFormat,
- &pmtConfig, (BYTE *)&scc);
+ hr = IAMStreamConfig_GetStreamCaps(pSConfig, iFormat,
+ &pmtConfig, (BYTE *)&scc);
if (hr == S_OK) {
if (IsEqualIID(&pmtConfig->formattype, &FORMAT_VideoInfo)) {
VIDEOINFOHEADER *pvi =
pvi->AvgTimePerFrame =
(REFERENCE_TIME)scc.MaxFrameInterval;
#endif
- hr = pSConfig->lpVtbl->SetFormat(pSConfig, pmtConfig);
+ hr = IAMStreamConfig_SetFormat(pSConfig, pmtConfig);
DeleteMediaType(pmtConfig);
break;
}
long Flags;
IAMVideoProcAmp *pProcAmp = NULL;
- hr = backend->pSrcFilter->lpVtbl->QueryInterface(backend->pSrcFilter,
- &IID_IAMVideoProcAmp,
- (void **)&pProcAmp);
+ hr = IBaseFilter_QueryInterface(backend->pSrcFilter,
+ &IID_IAMVideoProcAmp,
+ (void **)&pProcAmp);
if (FAILED(hr)) {
return hr;
}
- hr = pProcAmp->lpVtbl->GetRange(pProcAmp, nProperty, pMin, pMax,
+ hr = IAMVideoProcAmp_GetRange(pProcAmp, nProperty, pMin, pMax,
pStep, pDefault, &Flags);
SAFE_RELEASE(pProcAmp);
long Flags;
IAMVideoProcAmp *pProcAmp = NULL;
- hr = backend->pSrcFilter->lpVtbl->QueryInterface(backend->pSrcFilter,
- &IID_IAMVideoProcAmp,
- (void **)&pProcAmp);
+ hr = IBaseFilter_QueryInterface(backend->pSrcFilter,
+ &IID_IAMVideoProcAmp,
+ (void **)&pProcAmp);
if (FAILED(hr)) {
return hr;
}
- hr = pProcAmp->lpVtbl->Get(pProcAmp, nProperty, pValue, &Flags);
+ hr = IAMVideoProcAmp_Get(pProcAmp, nProperty, pValue, &Flags);
if (FAILED(hr)) {
ERR("Failed to get property for video\n");
}
HRESULT hr;
IAMVideoProcAmp *pProcAmp = NULL;
- hr = backend->pSrcFilter->lpVtbl->QueryInterface(backend->pSrcFilter,
- &IID_IAMVideoProcAmp,
- (void **)&pProcAmp);
+ hr = IBaseFilter_QueryInterface(backend->pSrcFilter,
+ &IID_IAMVideoProcAmp,
+ (void **)&pProcAmp);
if (FAILED(hr)) {
return hr;
}
- hr = pProcAmp->lpVtbl->Set(pProcAmp, nProperty, value,
+ hr = IAMVideoProcAmp_Set(pProcAmp, nProperty, value,
VideoProcAmp_Flags_Manual);
if (FAILED(hr)) {
ERR("Failed to set property for video\n");
ICaptureGraphBuilder2 *pCGB = NULL;
IBaseFilter *pSrcFilter = NULL;
IEnumMoniker *pEnumMK = NULL;
- IMoniker *pMoniKer = NULL;
+ IMoniker *pMoniker = NULL;
IAMStreamConfig *pSConfig = NULL;
int iCount = 0, iSize = 0;
return ret;
}
- hr = pCreateDevEnum->lpVtbl->CreateClassEnumerator(pCreateDevEnum,
+ hr = ICreateDevEnum_CreateClassEnumerator(pCreateDevEnum,
&CLSID_VideoInputDeviceCategory, &pEnumMK, 0);
if (FAILED(hr)) {
ERR("Failed to create class enumerator\n");
t2.tv_sec-t1.tv_sec, t2.tv_usec-t1.tv_usec);
return ret;
}
- pEnumMK->lpVtbl->Reset(pEnumMK);
+ IEnumMoniker_Reset(pEnumMK);
- hr = pEnumMK->lpVtbl->Next(pEnumMK, 1, &pMoniKer, NULL);
+ hr = IEnumMoniker_Next(pEnumMK, 1, &pMoniker, NULL);
if (FAILED(hr) || (hr == S_FALSE)) {
ERR("Enum moniker returns a invalid value.\n");
SAFE_RELEASE(pEnumMK);
}
IPropertyBag *pBag = NULL;
- hr = pMoniKer->lpVtbl->BindToStorage(pMoniKer, 0, 0,
- &IID_IPropertyBag,
- (void **)&pBag);
+ hr = IMoniker_BindToStorage(pMoniker, 0, 0,
+ &IID_IPropertyBag,
+ (void **)&pBag);
if (FAILED(hr)) {
ERR("Failed to bind to storage.\n");
SAFE_RELEASE(pEnumMK);
} else {
VARIANT var;
var.vt = VT_BSTR;
- hr = pBag->lpVtbl->Read(pBag, L"FriendlyName", &var, NULL);
+ hr = IPropertyBag_Read(pBag, L"FriendlyName", &var, NULL);
if (hr == S_OK) {
ret = 1;
device_name = __wchar_to_char(var.bstrVal);
INFO("Device name : %s\n", device_name);
g_free(device_name);
- hr = pMoniKer->lpVtbl->BindToObject(pMoniKer, NULL, NULL,
- &IID_IBaseFilter,
- (void **)&pSrcFilter);
+ hr = IMoniker_BindToObject(pMoniker, NULL, NULL,
+ &IID_IBaseFilter,
+ (void **)&pSrcFilter);
if (FAILED(hr)) {
ERR("Counldn't bind moniker to filter object!!\n");
SysFreeString(var.bstrVal);
SAFE_RELEASE(pBag);
- SAFE_RELEASE(pMoniKer);
+ SAFE_RELEASE(pMoniker);
SAFE_RELEASE(pEnumMK);
SAFE_RELEASE(pCreateDevEnum);
SAFE_RELEASE(pCGB);
t2.tv_sec-t1.tv_sec, t2.tv_usec-t1.tv_usec);
return ret;
} else {
- pSrcFilter->lpVtbl->AddRef(pSrcFilter);
+ IBaseFilter_AddRef(pSrcFilter);
}
SysFreeString(var.bstrVal);
}
SAFE_RELEASE(pBag);
}
- SAFE_RELEASE(pMoniKer);
+ SAFE_RELEASE(pMoniker);
- hr = pGB->lpVtbl->AddFilter(pGB, pSrcFilter, L"Video Capture");
+ hr = IGraphBuilder_AddFilter(pGB, pSrcFilter, L"Video Capture");
if (hr != S_OK && hr != S_FALSE) {
ERR("Counldn't add Video Capture filter to our graph!\n");
SAFE_RELEASE(pSrcFilter);
return ret;
}
- hr = pCGB->lpVtbl->FindInterface(pCGB, &PIN_CATEGORY_CAPTURE, 0,
- pSrcFilter, &IID_IAMStreamConfig,
- (void **)&pSConfig);
+ hr = ICaptureGraphBuilder2_FindInterface(pCGB, &PIN_CATEGORY_CAPTURE, 0,
+ pSrcFilter, &IID_IAMStreamConfig,
+ (void **)&pSConfig);
if (FAILED(hr)) {
ERR("Failed to FindInterface method\n");
SAFE_RELEASE(pSrcFilter);
return ret;
}
- hr = pSConfig->lpVtbl->GetNumberOfCapabilities(pSConfig, &iCount, &iSize);
+ hr = IAMStreamConfig_GetNumberOfCapabilities(pSConfig, &iCount, &iSize);
if (FAILED(hr)) {
ERR("Failed to GetNumberOfCapabilities method\n");
SAFE_RELEASE(pSConfig);
VIDEO_STREAM_CONFIG_CAPS scc;
AM_MEDIA_TYPE *pmtConfig;
- hr = pSConfig->lpVtbl->GetStreamCaps(pSConfig, iFormat, &pmtConfig,
- (BYTE *)&scc);
+ hr = IAMStreamConfig_GetStreamCaps(pSConfig, iFormat, &pmtConfig,
+ (BYTE *)&scc);
if (hr == S_OK) {
if (IsEqualIID(&pmtConfig->formattype, &FORMAT_VideoInfo)) {
VIDEOINFOHEADER *pvi =
}
}
- hr = pGB->lpVtbl->RemoveFilter(pGB, pSrcFilter);
+ hr = IGraphBuilder_RemoveFilter(pGB, pSrcFilter);
if (FAILED(hr)) {
ERR("Failed to remove source filer. 0x%x\n", hr);
}
INFO("Starting preview\n");
assert(backend->pCallback != NULL);
- hr = ((HWCInPin *)backend->pInPin)->SetGrabCb(backend->pInPin,
- backend->pCallback);
+ hr = HWCPin_SetCallback(backend->pInPin, backend->pCallback);
if (FAILED(hr)) {
ERR("Failed to set IGrabCallback interface.\n");
state->io_ptr->err_code = EINVAL;
state->streamon = 0;
qemu_mutex_unlock(&state->thread_mutex);
- hr = ((HWCInPin *)backend->pInPin)->SetGrabCb(backend->pInPin, NULL);
+ hr = HWCPin_SetCallback(backend->pInPin, NULL);
if (FAILED(hr)) {
ERR("Failed to set IGrabCallback interface.\n");
state->io_ptr->err_code = EINVAL;
static void backend_win_g_parm(MaruCamState *state)
{
- struct v4l2_captureparm *cp = (struct v4l2_captureparm *)state->io_ptr->data;
+ struct v4l2_captureparm *cp =
+ (struct v4l2_captureparm *)state->io_ptr->data;
/* We use default FPS of the webcam
* return a fixed value on guest ini file (1/30).
*/
break;
default:
ERR("Our emulator does not support this control: 0x%x\n", ctrl->id);
- state->io_ptr->err_code= EINVAL;
+ state->io_ptr->err_code = EINVAL;
state->io_ptr->ret_val = -1;
return;
}
static void backend_win_enum_fsizes(MaruCamState *state)
{
- struct v4l2_frmsizeenum *fsize = (struct v4l2_frmsizeenum *)state->io_ptr->data;
+ struct v4l2_frmsizeenum *fsize =
+ (struct v4l2_frmsizeenum *)state->io_ptr->data;
uint32_t i;
if (fsize->index >= ARRAY_SIZE(support_frames)) {
static void backend_win_enum_fintv(MaruCamState *state)
{
- struct v4l2_frmivalenum *fival = (struct v4l2_frmivalenum *)state->io_ptr->data;
+ struct v4l2_frmivalenum *fival =
+ (struct v4l2_frmivalenum *)state->io_ptr->data;
/* switch by index) */
switch (fival->index) {