(x)->lpVtbl->Release(x); \\r
x = NULL; \\r
} \\r
- } while(0)\r
+ } while (0)\r
\r
typedef HRESULT (STDAPICALLTYPE *CallbackFn)(ULONG dwSize, BYTE *pBuffer);\r
\r
* HWCGrabCallback\r
*/\r
\r
-typedef struct HWCGrabCallback\r
-{\r
+typedef struct HWCGrabCallback {\r
IGrabCallback IGrabCallback_iface;\r
long m_cRef;\r
CallbackFn m_pCallback;\r
return CONTAINING_RECORD(iface, HWCGrabCallback, IGrabCallback_iface);\r
}\r
\r
-static STDMETHODIMP HWCGrabCallback_QueryInterface(IGrabCallback *iface, REFIID riid, void **ppv)\r
+static STDMETHODIMP HWCGrabCallback_QueryInterface(IGrabCallback *iface,\r
+ REFIID riid, void **ppv)\r
{\r
if (IsEqualIID(riid, &IID_IUnknown)) {\r
- *ppv = (IUnknown*)iface;\r
+ *ppv = (IUnknown *)iface;\r
} else if (IsEqualIID(riid, &IID_IGrabCallback)) {\r
- *ppv = (IGrabCallback*)iface;\r
+ *ppv = (IGrabCallback *)iface;\r
} else {\r
*ppv = NULL;\r
return E_NOINTERFACE;\r
{\r
HWCGrabCallback *This = impl_from_IGrabCallback(iface);\r
\r
- if (InterlockedDecrement(&This->m_cRef) == 0)\r
- {\r
+ if (InterlockedDecrement(&This->m_cRef) == 0) {\r
This->m_pCallback = NULL;\r
- g_free((void*)This);\r
+ g_free((void *)This);\r
This = NULL;\r
return 0;\r
}\r
return This->m_cRef;\r
}\r
\r
-static STDMETHODIMP HWCGrabCallback_Grab(IGrabCallback *iface, ULONG dwSize, BYTE *pBuffer)\r
+static STDMETHODIMP HWCGrabCallback_Grab(IGrabCallback *iface,\r
+ ULONG dwSize, BYTE *pBuffer)\r
{\r
HWCGrabCallback *This = impl_from_IGrabCallback(iface);\r
\r
return E_FAIL;\r
}\r
\r
-static STDMETHODIMP HWCGrabCallback_SetCallback(IGrabCallback *iface, CallbackFn pCallbackFn)\r
+static STDMETHODIMP HWCGrabCallback_SetCallback(IGrabCallback *iface,\r
+ CallbackFn pCallbackFn)\r
{\r
HWCGrabCallback *This = impl_from_IGrabCallback(iface);\r
\r
return S_OK;\r
}\r
\r
-static IGrabCallbackVtbl HWCGrabCallback_Vtbl =\r
-{\r
+static IGrabCallbackVtbl HWCGrabCallback_Vtbl = {\r
HWCGrabCallback_QueryInterface,\r
HWCGrabCallback_AddRef,\r
HWCGrabCallback_Release,\r
\r
static STDMETHODIMP HWCGrabCallback_Construct(IGrabCallback **ppv)\r
{\r
- HWCGrabCallback *This = (HWCGrabCallback *)g_malloc0(sizeof(HWCGrabCallback));\r
+ HWCGrabCallback *This =\r
+ (HWCGrabCallback *)g_malloc0(sizeof(HWCGrabCallback));\r
\r
if (!This) {\r
ERR("failed to HWCGrabCallback_Construct, E_OUTOFMEMORY\n");\r
* HWCPin\r
*/\r
\r
-typedef struct HWCInPin\r
-{\r
+typedef struct HWCInPin {\r
IPin IPin_iface;\r
IMemInputPin IMemInputPin_iface;\r
IBaseFilter *m_pCFilter;\r
\r
if (IsEqualIID(riid, &IID_IUnknown)) {\r
*ppv = (IUnknown *)(&This->IPin_iface);\r
- IPin_AddRef((IPin*)*ppv);\r
+ IPin_AddRef((IPin *)*ppv);\r
} else if (IsEqualIID(riid, &IID_IPin)) {\r
*ppv = (IPin *)(&This->IPin_iface);\r
- IPin_AddRef((IPin*)*ppv);\r
+ IPin_AddRef((IPin *)*ppv);\r
} else if (IsEqualIID(riid, &IID_IMemInputPin)) {\r
*ppv = (IMemInputPin *)(&This->IMemInputPin_iface);\r
- IPin_AddRef((IMemInputPin*)*ppv);\r
+ IPin_AddRef((IMemInputPin *)*ppv);\r
} else {\r
*ppv = NULL;\r
return E_NOINTERFACE;\r
{\r
HWCInPin *This = impl_from_IPin(iface);\r
\r
- if (InterlockedDecrement(&This->m_cRef) == 0)\r
- {\r
+ if (InterlockedDecrement(&This->m_cRef) == 0) {\r
if (This->m_pCallback) {\r
SAFE_RELEASE(This->m_pCallback);\r
}\r
IMemAllocator_Decommit(This->m_pAllocator);\r
SAFE_RELEASE(This->m_pAllocator);\r
}\r
- g_free((void*)This);\r
+ g_free((void *)This);\r
This = NULL;\r
return 0;\r
}\r
return This->m_cRef;\r
}\r
\r
-static STDMETHODIMP HWCPin_Connect(IPin *iface, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)\r
+static STDMETHODIMP HWCPin_Connect(IPin *iface,\r
+ IPin *pReceivePin,\r
+ const AM_MEDIA_TYPE *pmt)\r
{\r
HWCInPin *This = impl_from_IPin(iface);\r
\r
return VFW_E_ALREADY_CONNECTED;\r
}\r
\r
- if (!pmt)\r
+ if (!pmt) {\r
return S_OK;\r
+ }\r
return S_FALSE;\r
}\r
\r
-static STDMETHODIMP HWCPin_ReceiveConnection(IPin *iface, IPin *pConnector, const AM_MEDIA_TYPE *pmt)\r
+static STDMETHODIMP HWCPin_ReceiveConnection(IPin *iface, IPin *pConnector,\r
+ const AM_MEDIA_TYPE *pmt)\r
{\r
PIN_DIRECTION pd;\r
FILTER_STATE fs;\r
HWCInPin *This = impl_from_IPin(iface);\r
\r
- if (pConnector == NULL || pmt == NULL)\r
+ if (pConnector == NULL || pmt == NULL) {\r
return E_POINTER;\r
+ }\r
\r
if (This->m_pConnectedPin) {\r
return VFW_E_ALREADY_CONNECTED;\r
{\r
HWCInPin *This = impl_from_IPin(iface);\r
\r
- if (ppPin == NULL)\r
+ if (ppPin == NULL) {\r
return E_POINTER;\r
+ }\r
\r
if (This->m_pConnectedPin == NULL) {\r
*ppPin = NULL;\r
{\r
HWCInPin *This = impl_from_IPin(iface);\r
\r
- if (pInfo == NULL)\r
+ if (pInfo == NULL) {\r
return E_POINTER;\r
+ }\r
\r
pInfo->pFilter = This->m_pCFilter;\r
if (This->m_pCFilter) {\r
IBaseFilter_AddRef(This->m_pCFilter);\r
}\r
- memcpy((void*)pInfo->achName, (void*)HWCPinName, sizeof(HWCPinName));\r
+ memcpy((void *)pInfo->achName, (void *)HWCPinName, sizeof(HWCPinName));\r
pInfo->dir = PINDIR_INPUT;\r
return S_OK;\r
}\r
\r
static STDMETHODIMP HWCPin_QueryDirection(IPin *iface, PIN_DIRECTION *pPinDir)\r
{\r
- if (pPinDir == NULL)\r
+ if (pPinDir == NULL) {\r
return E_POINTER;\r
+ }\r
*pPinDir = PINDIR_INPUT;\r
return S_OK;\r
}\r
static STDMETHODIMP HWCPin_QueryId(IPin *iface, LPWSTR *Id)\r
{\r
PVOID pId;\r
- if (Id == NULL)\r
+ if (Id == NULL) {\r
return E_POINTER;\r
+ }\r
pId = CoTaskMemAlloc(sizeof(HWCPinName));\r
- memcpy((void*)pId, (void*)HWCPinName, sizeof(HWCPinName));\r
+ memcpy((void *)pId, (void *)HWCPinName, sizeof(HWCPinName));\r
*Id = (LPWSTR)pId;\r
return S_OK;\r
}\r
\r
static STDMETHODIMP HWCPin_QueryAccept(IPin *iface, const AM_MEDIA_TYPE *pmt)\r
{\r
- if (pmt == NULL)\r
+ if (pmt == NULL) {\r
return E_POINTER;\r
+ }\r
return S_OK;\r
}\r
\r
-static STDMETHODIMP HWCPin_EnumMediaTypes(IPin *iface, IEnumMediaTypes **ppEnum)\r
+static STDMETHODIMP HWCPin_EnumMediaTypes(IPin *iface,\r
+ IEnumMediaTypes **ppEnum)\r
{\r
- if (ppEnum == NULL)\r
+ if (ppEnum == NULL) {\r
return E_POINTER;\r
+ }\r
return E_NOTIMPL;\r
}\r
\r
-static STDMETHODIMP HWCPin_QueryInternalConnections(IPin *iface, IPin **ppPin, ULONG *nPin)\r
+static STDMETHODIMP HWCPin_QueryInternalConnections(IPin *iface,\r
+ IPin **ppPin,\r
+ ULONG *nPin)\r
{\r
return E_NOTIMPL;\r
}\r
return S_OK;\r
}\r
\r
-static STDMETHODIMP HWCPin_NewSegment(IPin *iface, REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)\r
+static STDMETHODIMP HWCPin_NewSegment(IPin *iface, REFERENCE_TIME tStart,\r
+ REFERENCE_TIME tStop, double dRate)\r
{\r
return S_OK;\r
}\r
\r
-static STDMETHODIMP HWCMemInputPin_QueryInterface(IMemInputPin *iface, REFIID riid, void **ppv)\r
+static STDMETHODIMP HWCMemInputPin_QueryInterface(IMemInputPin *iface,\r
+ REFIID riid, void **ppv)\r
{\r
HWCInPin *This = impl_from_IMemInputPin(iface);\r
\r
if (IsEqualIID(riid, &IID_IUnknown)) {\r
*ppv = (IUnknown *)(&This->IMemInputPin_iface);\r
- IPin_AddRef((IPin*)*ppv);\r
+ IPin_AddRef((IPin *)*ppv);\r
} else if (IsEqualIID(riid, &IID_IPin)) {\r
*ppv = (IPin *)(&This->IPin_iface);\r
- IPin_AddRef((IPin*)*ppv);\r
+ IPin_AddRef((IPin *)*ppv);\r
} else if (IsEqualIID(riid, &IID_IMemInputPin)) {\r
*ppv = (IMemInputPin *)(&This->IMemInputPin_iface);\r
- IPin_AddRef((IMemInputPin*)*ppv);\r
+ IPin_AddRef((IMemInputPin *)*ppv);\r
} else {\r
*ppv = NULL;\r
return E_NOINTERFACE;\r
{\r
HWCInPin *This = impl_from_IMemInputPin(iface);\r
\r
- if (InterlockedDecrement(&This->m_cRef) == 0)\r
- {\r
+ if (InterlockedDecrement(&This->m_cRef) == 0) {\r
if (This->m_pCallback) {\r
SAFE_RELEASE(This->m_pCallback);\r
}\r
IMemAllocator_Decommit(This->m_pAllocator);\r
SAFE_RELEASE(This->m_pAllocator);\r
}\r
- g_free((void*)This);\r
+ g_free((void *)This);\r
This = NULL;\r
return 0;\r
}\r
return This->m_cRef;\r
}\r
\r
-static STDMETHODIMP HWCMemInputPin_GetAllocator(IMemInputPin *iface, IMemAllocator **ppAllocator)\r
+static STDMETHODIMP HWCMemInputPin_GetAllocator(IMemInputPin *iface,\r
+ IMemAllocator **ppAllocator)\r
{\r
HWCInPin *This = impl_from_IMemInputPin(iface);\r
\r
- if (ppAllocator == NULL)\r
+ if (ppAllocator == NULL) {\r
return E_POINTER;\r
+ }\r
\r
if (This->m_pAllocator == NULL) {\r
HRESULT hr = CoCreateInstance(&CLSID_MemoryAllocator, NULL,\r
return S_OK;\r
}\r
\r
-static STDMETHODIMP HWCMemInputPin_NotifyAllocator(IMemInputPin *iface, IMemAllocator *pAllocator, BOOL bReadOnly)\r
+static STDMETHODIMP HWCMemInputPin_NotifyAllocator(IMemInputPin *iface,\r
+ IMemAllocator *pAllocator,\r
+ BOOL bReadOnly)\r
{\r
HWCInPin *This = impl_from_IMemInputPin(iface);\r
\r
- if (pAllocator == NULL)\r
+ if (pAllocator == NULL) {\r
return E_POINTER;\r
+ }\r
\r
IMemAllocator *pOldAllocator = This->m_pAllocator;\r
IMemAllocator_AddRef(pAllocator);\r
return S_OK;\r
}\r
\r
-static STDMETHODIMP HWCMemInputPin_GetAllocatorRequirements(IMemInputPin *iface, ALLOCATOR_PROPERTIES *pProps)\r
+static STDMETHODIMP HWCMemInputPin_GetAllocatorRequirements(\r
+ IMemInputPin *iface,\r
+ ALLOCATOR_PROPERTIES *pProps)\r
{\r
return E_NOTIMPL;\r
}\r
\r
-static STDMETHODIMP HWCMemInputPin_Receive(IMemInputPin *iface, IMediaSample *pSample)\r
+static STDMETHODIMP HWCMemInputPin_Receive(IMemInputPin *iface,\r
+ IMediaSample *pSample)\r
{\r
HWCInPin *This = impl_from_IMemInputPin(iface);\r
\r
}\r
if (This->m_pCallback != NULL) {\r
HRESULT hr;\r
- BYTE* pBuffer = NULL;\r
+ BYTE *pBuffer = NULL;\r
DWORD dwSize = 0;\r
dwSize = IMediaSample_GetSize(pSample);\r
hr = IMediaSample_GetPointer(pSample, &pBuffer);\r
}\r
hr = IGrabCallback_Grab(This->m_pCallback, dwSize, pBuffer);\r
if (FAILED(hr)) {\r
- ERR("Receive function : failed to IGrabCallback_Grab, 0x%ld\n", hr);\r
+ ERR("Receive function : failed to IGrabCallback_Grab, 0x%ld\n",\r
+ hr);\r
return hr;\r
}\r
}\r
return S_OK;\r
}\r
\r
-static STDMETHODIMP HWCMemInputPin_ReceiveMultiple(IMemInputPin *iface, IMediaSample **pSamples, long nSamples, long *nSamplesProcessed)\r
+static STDMETHODIMP HWCMemInputPin_ReceiveMultiple(IMemInputPin *iface,\r
+ IMediaSample **pSamples,\r
+ long nSamples,\r
+ long *nSamplesProcessed)\r
{\r
HRESULT hr = S_OK;\r
\r
- if (pSamples == NULL)\r
+ if (pSamples == NULL) {\r
return E_POINTER;\r
+ }\r
\r
*nSamplesProcessed = 0;\r
\r
- while (nSamples-- > 0)\r
- {\r
+ while (nSamples-- > 0) {\r
hr = IMemInputPin_Receive(iface, pSamples[*nSamplesProcessed]);\r
- if (hr != S_OK)\r
+ if (hr != S_OK) {\r
break;\r
+ }\r
(*nSamplesProcessed)++;\r
}\r
return hr;\r
}\r
\r
\r
-static IPinVtbl HWCPin_Vtbl =\r
-{\r
+static IPinVtbl HWCPin_Vtbl = {\r
HWCPin_QueryInterface,\r
HWCPin_AddRef,\r
HWCPin_Release,\r
HWCPin_NewSegment\r
};\r
\r
-static IMemInputPinVtbl HWCMemInputPin_Vtbl =\r
-{\r
+static IMemInputPinVtbl HWCMemInputPin_Vtbl = {\r
HWCMemInputPin_QueryInterface,\r
HWCMemInputPin_AddRef,\r
HWCMemInputPin_Release,\r
* HWCEnumPins\r
*/\r
\r
-typedef struct HWCEnumPins\r
-{\r
+typedef struct HWCEnumPins {\r
IEnumPins IEnumPins_iface;\r
IBaseFilter *m_pFilter;\r
int m_nPos;\r
return CONTAINING_RECORD(iface, HWCEnumPins, IEnumPins_iface);\r
}\r
\r
-static STDMETHODIMP HWCEnumPins_QueryInterface(IEnumPins *iface, REFIID riid, void **ppv)\r
+static STDMETHODIMP HWCEnumPins_QueryInterface(IEnumPins *iface,\r
+ REFIID riid, void **ppv)\r
{\r
- if (ppv == NULL)\r
+ if (ppv == NULL) {\r
return E_POINTER;\r
+ }\r
\r
if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IEnumPins)) {\r
*ppv = iface;\r
SAFE_RELEASE(This->m_pFilter);\r
}\r
This->m_nPos = 0;\r
- g_free((void*)This);\r
+ g_free((void *)This);\r
This = NULL;\r
return 0;\r
}\r
return This->m_cRef;\r
}\r
\r
-static STDMETHODIMP HWCEnumPins_Next(IEnumPins *iface, ULONG cPins, IPin **ppPins,\r
- ULONG *pcFetched)\r
+static STDMETHODIMP HWCEnumPins_Next(IEnumPins *iface, ULONG cPins,\r
+ IPin **ppPins, ULONG *pcFetched)\r
{\r
ULONG fetched;\r
HWCEnumPins *This = impl_from_IEnumPins(iface);\r
\r
- if (ppPins == NULL)\r
- return E_POINTER;\r
+ if (ppPins == NULL) {\r
+ return E_POINTER;\r
+ }\r
\r
if (This->m_nPos < 1 && cPins > 0) {\r
IPin *pPin;\r
return S_OK;\r
}\r
\r
-static STDMETHODIMP HWCEnumPins_Construct(IBaseFilter *pFilter, int nPos, IEnumPins **ppv);\r
+static STDMETHODIMP HWCEnumPins_Construct(IBaseFilter *pFilter,\r
+ int nPos, IEnumPins **ppv);\r
\r
static STDMETHODIMP HWCEnumPins_Clone(IEnumPins *iface, IEnumPins **ppEnum)\r
{\r
HWCEnumPins *This = impl_from_IEnumPins(iface);\r
\r
- if (ppEnum == NULL)\r
+ if (ppEnum == NULL) {\r
return E_POINTER;\r
+ }\r
\r
HWCEnumPins_Construct(This->m_pFilter, This->m_nPos, ppEnum);\r
if (*ppEnum == NULL) {\r
return S_OK;\r
}\r
\r
-static IEnumPinsVtbl HWCEnumPins_Vtbl =\r
-{\r
+static IEnumPinsVtbl HWCEnumPins_Vtbl = {\r
HWCEnumPins_QueryInterface,\r
HWCEnumPins_AddRef,\r
HWCEnumPins_Release,\r
};\r
\r
\r
-static STDMETHODIMP HWCEnumPins_Construct(IBaseFilter *pFilter, int nPos, IEnumPins **ppv)\r
+static STDMETHODIMP HWCEnumPins_Construct(IBaseFilter *pFilter,\r
+ int nPos, IEnumPins **ppv)\r
{\r
HWCEnumPins *This = (HWCEnumPins *)g_malloc0(sizeof(HWCEnumPins));\r
\r
* HWCFilter\r
*/\r
\r
-typedef struct HWCFilter\r
-{\r
+typedef struct HWCFilter {\r
IBaseFilter IBaseFilter_iface;\r
IPin *m_pPin;\r
IFilterGraph *m_pFilterGraph;\r
return CONTAINING_RECORD(iface, HWCFilter, IBaseFilter_iface);\r
}\r
\r
-static STDMETHODIMP HWCFilter_QueryInterface(IBaseFilter *iface, REFIID riid, void **ppv)\r
+static STDMETHODIMP HWCFilter_QueryInterface(IBaseFilter *iface,\r
+ REFIID riid, void **ppv)\r
{\r
if (IsEqualIID(riid, &IID_IUnknown)) {\r
- *ppv = (IUnknown*)iface;\r
+ *ppv = (IUnknown *)iface;\r
} else if (IsEqualIID(riid, &IID_IPersist)) {\r
- *ppv = (IPersist*)iface;\r
+ *ppv = (IPersist *)iface;\r
} else if (IsEqualIID(riid, &IID_IMediaFilter)) {\r
- *ppv = (IMediaFilter*)iface;\r
+ *ppv = (IMediaFilter *)iface;\r
} else if (IsEqualIID(riid, &IID_IBaseFilter)) {\r
- *ppv = (IBaseFilter*)iface;\r
+ *ppv = (IBaseFilter *)iface;\r
} else {\r
*ppv = NULL;\r
return E_NOINTERFACE;\r
if (This->m_pPin) {\r
SAFE_RELEASE(This->m_pPin);\r
}\r
- g_free((void*)This);\r
+ g_free((void *)This);\r
This = NULL;\r
return 0;\r
}\r
\r
static STDMETHODIMP HWCFilter_GetClassID(IBaseFilter *iface, CLSID *pClsID)\r
{\r
- if (pClsID == NULL)\r
+ if (pClsID == NULL) {\r
return E_POINTER;\r
+ }\r
return E_NOTIMPL;\r
}\r
\r
-static STDMETHODIMP HWCFilter_GetState(IBaseFilter *iface, DWORD dwMSecs, FILTER_STATE *State)\r
+static STDMETHODIMP HWCFilter_GetState(IBaseFilter *iface, DWORD dwMSecs,\r
+ FILTER_STATE *State)\r
{\r
HWCFilter *This = impl_from_IBaseFilter(iface);\r
*State = This->m_state;\r
return S_OK;\r
}\r
\r
-static STDMETHODIMP HWCFilter_SetSyncSource(IBaseFilter *iface, IReferenceClock *pClock)\r
+static STDMETHODIMP HWCFilter_SetSyncSource(IBaseFilter *iface,\r
+ IReferenceClock *pClock)\r
{\r
return S_OK;\r
}\r
\r
-static STDMETHODIMP HWCFilter_GetSyncSource(IBaseFilter *iface, IReferenceClock **pClock)\r
+static STDMETHODIMP HWCFilter_GetSyncSource(IBaseFilter *iface,\r
+ IReferenceClock **pClock)\r
{\r
*pClock = NULL;\r
return S_OK;\r
{\r
HWCFilter *This = impl_from_IBaseFilter(iface);\r
\r
- if (This->m_state == State_Stopped){\r
+ if (This->m_state == State_Stopped) {\r
HRESULT hr;\r
hr = IBaseFilter_Pause(iface);\r
if (FAILED(hr)) {\r
\r
static STDMETHODIMP HWCFilter_EnumPins(IBaseFilter *iface, IEnumPins **ppEnum)\r
{\r
- if (ppEnum == NULL)\r
+ if (ppEnum == NULL) {\r
return E_POINTER;\r
+ }\r
\r
HWCEnumPins_Construct(iface, 0, ppEnum);\r
return *ppEnum == NULL ? E_OUTOFMEMORY : S_OK;\r
}\r
\r
-static STDMETHODIMP HWCFilter_FindPin(IBaseFilter *iface, LPCWSTR Id, IPin **ppPin)\r
+static STDMETHODIMP HWCFilter_FindPin(IBaseFilter *iface, LPCWSTR Id,\r
+ IPin **ppPin)\r
{\r
HWCFilter *This = impl_from_IBaseFilter(iface);\r
\r
- if (ppPin == NULL)\r
+ if (ppPin == NULL) {\r
return E_POINTER;\r
+ }\r
\r
- if (memcmp((void*)Id, (void*)HWCPinName, sizeof(HWCPinName))) {\r
+ if (memcmp((void *)Id, (void *)HWCPinName, sizeof(HWCPinName))) {\r
return VFW_E_NOT_FOUND;\r
}\r
\r
if (!This->m_pPin) {\r
- HWCInPin_Construct(iface, &This->m_pPin);\r
+ HWCInPin_Construct(iface, &This->m_pPin);\r
}\r
*ppPin = This->m_pPin;\r
\r
return S_OK;\r
}\r
\r
-static STDMETHODIMP HWCFilter_QueryFilterInfo(IBaseFilter *iface, FILTER_INFO *pInfo)\r
+static STDMETHODIMP HWCFilter_QueryFilterInfo(IBaseFilter *iface,\r
+ FILTER_INFO *pInfo)\r
{\r
HWCFilter *This = impl_from_IBaseFilter(iface);\r
\r
- if (pInfo == NULL)\r
+ if (pInfo == NULL) {\r
return E_POINTER;\r
+ }\r
\r
- memcpy((void*)pInfo->achName, (void*)HWCFilterName, sizeof(HWCFilterName));\r
+ memcpy((void *)pInfo->achName,\r
+ (void *)HWCFilterName,\r
+ sizeof(HWCFilterName));\r
pInfo->pGraph = This->m_pFilterGraph;\r
if (This->m_pFilterGraph) {\r
IFilterGraph_AddRef(This->m_pFilterGraph);\r
return S_OK;\r
}\r
\r
-static STDMETHODIMP HWCFilter_JoinFilterGraph(IBaseFilter *iface, IFilterGraph *pGraph,\r
- LPCWSTR pName)\r
+static STDMETHODIMP HWCFilter_JoinFilterGraph(IBaseFilter *iface,\r
+ IFilterGraph *pGraph,\r
+ LPCWSTR pName)\r
{\r
HWCFilter *This = impl_from_IBaseFilter(iface);\r
\r
return S_OK;\r
}\r
\r
-static STDMETHODIMP HWCFilter_QueryVendorInfo(IBaseFilter *iface, LPWSTR* pVendorInfo)\r
+static STDMETHODIMP HWCFilter_QueryVendorInfo(IBaseFilter *iface,\r
+ LPWSTR *pVendorInfo)\r
{\r
return E_NOTIMPL;\r
}\r
\r
-static IBaseFilterVtbl HWCFilter_Vtbl =\r
-{\r
+static IBaseFilterVtbl HWCFilter_Vtbl = {\r
HWCFilter_QueryInterface,\r
HWCFilter_AddRef,\r
HWCFilter_Release,\r
#define V4L2_PIX_FMT_YUYV MAKEFOURCC('Y', 'U', 'Y', 'V') /* 16 YUV 4:2:2 */\r
#define V4L2_PIX_FMT_YUV420 MAKEFOURCC('Y', 'U', '1', '2') /* 12 YUV 4:2:0 */\r
#define V4L2_PIX_FMT_YVU420 MAKEFOURCC('Y', 'V', '1', '2') /* 12 YVU 4:2:0 */\r
+#define V4L2_PIX_FMT_RGB24 MAKEFOURCC('R', 'G', 'B', '3') /* 24 RGB-8-8-8 */\r
\r
typedef struct tagMaruCamConvertPixfmt {\r
uint32_t fmt; /* fourcc */\r
static struct marucam_qctrl qctrl_tbl[] = {\r
{ V4L2_CID_BRIGHTNESS, 0, },\r
{ V4L2_CID_CONTRAST, 0, },\r
- { V4L2_CID_SATURATION,0, },\r
+ { V4L2_CID_SATURATION, 0, },\r
{ V4L2_CID_SHARPNESS, 0, },\r
};\r
\r
-static MaruCamState *g_state = NULL;\r
+static MaruCamState *g_state;\r
\r
-static uint32_t ready_count = 0;\r
-static uint32_t cur_fmt_idx = 0;\r
-static uint32_t cur_frame_idx = 0;\r
+static uint32_t ready_count;\r
+static uint32_t cur_fmt_idx;\r
+static uint32_t cur_frame_idx;\r
+static void *grab_buf;\r
+static uint32_t g_dwSrcFmt;\r
\r
\r
/*\r
\r
static uint32_t get_sizeimage(uint32_t pixfmt, uint32_t width, uint32_t height)\r
{\r
- return (get_bytesperline(pixfmt, width) * height);\r
+ return get_bytesperline(pixfmt, width) * height;\r
}\r
\r
-void v4lconvert_yuyv_to_yuv420(const unsigned char *src, unsigned char *dest,\r
+void yuyv_to_yuv420(const unsigned char *src, unsigned char *dest,\r
uint32_t width, uint32_t height, uint32_t yvu);\r
-\r
+void rgb24_to_yuv420(const unsigned char *src, unsigned char *dest,\r
+ uint32_t width, uint32_t height, uint32_t yvu);\r
+void rgb24_to_yuyv(unsigned char *src, unsigned char *dest,\r
+ uint32_t width, uint32_t height);\r
+void yuv420_to_yvu420(unsigned char *src, unsigned char *dest,\r
+ uint32_t width, uint32_t height);\r
+void yuv420_to_yuyv(unsigned char *src, unsigned char *dest,\r
+ uint32_t width, uint32_t height);\r
\r
static long value_convert_from_guest(long min, long max, long value)\r
{\r
static STDMETHODIMP marucam_device_callbackfn(ULONG dwSize, BYTE *pBuffer)\r
{\r
void *tmp_buf;\r
- uint32_t width, height;\r
-\r
- qemu_mutex_lock(&g_state->thread_mutex);\r
- if (g_state->req_frame == 0) {\r
- qemu_mutex_unlock(&g_state->thread_mutex);\r
- return S_OK;\r
- }\r
- tmp_buf = g_state->vaddr + g_state->buf_size * (g_state->req_frame - 1);\r
- qemu_mutex_unlock(&g_state->thread_mutex);\r
+ uint32_t width, height, fmt;\r
\r
width = supported_dst_frames[cur_frame_idx].width;\r
height = supported_dst_frames[cur_frame_idx].height;\r
+ fmt = supported_dst_pixfmts[cur_fmt_idx].fmt;\r
\r
- switch (supported_dst_pixfmts[cur_fmt_idx].fmt) {\r
- case V4L2_PIX_FMT_YUV420:\r
- v4lconvert_yuyv_to_yuv420(pBuffer, tmp_buf, width, height, 0);\r
+ switch (g_dwSrcFmt) {\r
+ case V4L2_PIX_FMT_YUYV:\r
+ switch (fmt) {\r
+ case V4L2_PIX_FMT_YUV420:\r
+ yuyv_to_yuv420(pBuffer, grab_buf, width, height, 0);\r
+ break;\r
+ case V4L2_PIX_FMT_YVU420:\r
+ yuyv_to_yuv420(pBuffer, grab_buf, width, height, 1);\r
+ break;\r
+ case V4L2_PIX_FMT_YUYV:\r
+ memcpy(grab_buf, (void *)pBuffer, (size_t)dwSize);\r
+ break;\r
+ }\r
break;\r
- case V4L2_PIX_FMT_YVU420:\r
- v4lconvert_yuyv_to_yuv420(pBuffer, tmp_buf, width, height, 1);\r
+ case V4L2_PIX_FMT_RGB24:\r
+ switch (fmt) {\r
+ case V4L2_PIX_FMT_YUV420:\r
+ rgb24_to_yuv420(pBuffer, grab_buf, width, height, 0);\r
+ break;\r
+ case V4L2_PIX_FMT_YVU420:\r
+ rgb24_to_yuv420(pBuffer, grab_buf, width, height, 1);\r
+ break;\r
+ case V4L2_PIX_FMT_YUYV:\r
+ rgb24_to_yuyv(pBuffer, grab_buf, width, height);\r
+ break;\r
+ }\r
break;\r
- case V4L2_PIX_FMT_YUYV:\r
- memcpy(tmp_buf, (void*)pBuffer, (size_t)dwSize);\r
+ case V4L2_PIX_FMT_YUV420:\r
+ switch (fmt) {\r
+ case V4L2_PIX_FMT_YUV420:\r
+ memcpy(grab_buf, (void *)pBuffer, (size_t)dwSize);\r
+ break;\r
+ case V4L2_PIX_FMT_YVU420:\r
+ yuv420_to_yvu420(pBuffer, grab_buf, width, height);\r
+ break;\r
+ case V4L2_PIX_FMT_YUYV:\r
+ yuv420_to_yuyv(pBuffer, grab_buf, width, height);\r
+ break;\r
+ }\r
break;\r
}\r
\r
qemu_mutex_lock(&g_state->thread_mutex);\r
- if (ready_count < MARUCAM_SKIPFRAMES) {\r
- ++ready_count; /* skip a frame cause first some frame are distorted */\r
- qemu_mutex_unlock(&g_state->thread_mutex);\r
- return S_OK;\r
- }\r
if (g_state->streamon) {\r
+ if (ready_count < MARUCAM_SKIPFRAMES) {\r
+ /* skip a frame cause first some frame are distorted */\r
+ ++ready_count;\r
+ TRACE("skip %d frame\n", ready_count);\r
+ qemu_mutex_unlock(&g_state->thread_mutex);\r
+ return S_OK;\r
+ }\r
+ if (g_state->req_frame == 0) {\r
+ TRACE("there is no request\n");\r
+ qemu_mutex_unlock(&g_state->thread_mutex);\r
+ return S_OK;\r
+ }\r
+ tmp_buf = g_state->vaddr + g_state->buf_size * (g_state->req_frame - 1);\r
+ memcpy(tmp_buf, grab_buf, g_state->buf_size);\r
g_state->req_frame = 0; /* clear request */\r
g_state->isr |= 0x01; /* set a flag of rasing a interrupt */\r
qemu_bh_schedule(g_state->tx_bh);\r
\r
static STDMETHODIMP_(void) CloseInterfaces(void)\r
{\r
- if (g_pMediaControl)\r
+ if (g_pMediaControl) {\r
g_pMediaControl->lpVtbl->Stop(g_pMediaControl);\r
+ }\r
\r
- if (g_pOutputPin)\r
+ if (g_pOutputPin) {\r
g_pOutputPin->lpVtbl->Disconnect(g_pOutputPin);\r
+ }\r
\r
SAFE_RELEASE(g_pGB);\r
SAFE_RELEASE(g_pCGB);\r
CoTaskMemFree((PVOID)pmt);\r
}\r
\r
-static STDMETHODIMP GetPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir, IPin **ppPin)\r
+static STDMETHODIMP GetPin(IBaseFilter *pFilter,\r
+ PIN_DIRECTION PinDir, IPin **ppPin)\r
{\r
HRESULT hr;\r
IEnumPins *pEnum = NULL;\r
IPin *pPin = NULL;\r
\r
- if (ppPin == NULL)\r
- {\r
+ if (ppPin == NULL) {\r
return E_POINTER;\r
}\r
\r
hr = pFilter->lpVtbl->EnumPins(pFilter, &pEnum);\r
- if (FAILED(hr))\r
+ if (FAILED(hr)) {\r
return hr;\r
+ }\r
\r
- while(pEnum->lpVtbl->Next(pEnum, 1, &pPin, 0) == S_OK)\r
- {\r
+ while (pEnum->lpVtbl->Next(pEnum, 1, &pPin, 0) == S_OK) {\r
PIN_DIRECTION PinDirThis;\r
hr = pPin->lpVtbl->QueryDirection(pPin, &PinDirThis);\r
- if (FAILED(hr))\r
- {\r
+ if (FAILED(hr)) {\r
SAFE_RELEASE(pPin);\r
SAFE_RELEASE(pEnum);\r
return hr;\r
}\r
- if (PinDir == PinDirThis)\r
- {\r
+ if (PinDir == PinDirThis) {\r
*ppPin = pPin;\r
SAFE_RELEASE(pEnum);\r
return S_OK;\r
{\r
HRESULT hr;\r
\r
- hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC, &IID_IGraphBuilder, (void**)&g_pGB);\r
+ hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC,\r
+ &IID_IGraphBuilder, (void **)&g_pGB);\r
if (FAILED(hr)) {\r
ERR("Failed to create instance of GraphBuilder, 0x%x\n", hr);\r
return hr;\r
}\r
\r
- hr = CoCreateInstance(&CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC, &IID_ICaptureGraphBuilder2, (void**)&g_pCGB);\r
+ hr = CoCreateInstance(&CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC,\r
+ &IID_ICaptureGraphBuilder2, (void **)&g_pCGB);\r
if (FAILED(hr)) {\r
ERR("Failed to create instance of CaptureGraphBuilder2, 0x%x\n", hr);\r
return hr;\r
return hr;\r
}\r
\r
- hr = g_pGB->lpVtbl->QueryInterface(g_pGB, &IID_IMediaControl, (void **)&g_pMediaControl);\r
+ hr = g_pGB->lpVtbl->QueryInterface(g_pGB, &IID_IMediaControl,\r
+ (void **)&g_pMediaControl);\r
if (FAILED(hr)) {\r
ERR("Failed to QueryInterface for IMediaControl, 0x%x\n", hr);\r
return hr;\r
}\r
\r
hr = HWCGrabCallback_Construct(&g_pCallback);\r
- if (g_pCallback == NULL)\r
+ if (g_pCallback == NULL) {\r
hr = E_OUTOFMEMORY;\r
+ }\r
\r
- hr = ((HWCGrabCallback*)g_pCallback)->SetCallback(g_pCallback, (CallbackFn)marucam_device_callbackfn);\r
+ hr = ((HWCGrabCallback *)g_pCallback)->SetCallback(g_pCallback,\r
+ (CallbackFn)marucam_device_callbackfn);\r
\r
return hr;\r
}\r
IEnumMoniker *pEnumMK = NULL;\r
IMoniker *pMoniKer;\r
\r
- hr = CoCreateInstance(&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, &IID_ICreateDevEnum, (void**)&pCreateDevEnum);\r
+ hr = CoCreateInstance(&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,\r
+ &IID_ICreateDevEnum,\r
+ (void **)&pCreateDevEnum);\r
if (FAILED(hr)) {\r
ERR("Failed to create instance of CreateDevEnum, 0x%x\n", hr);\r
return hr;\r
}\r
\r
- hr = pCreateDevEnum->lpVtbl->CreateClassEnumerator(pCreateDevEnum, &CLSID_VideoInputDeviceCategory, &pEnumMK, 0);\r
+ hr = pCreateDevEnum->lpVtbl->CreateClassEnumerator(pCreateDevEnum,\r
+ &CLSID_VideoInputDeviceCategory,\r
+ &pEnumMK, 0);\r
if (FAILED(hr)) {\r
ERR("Failed to get VideoInputDeviceCategory, 0x%x\n", hr);\r
SAFE_RELEASE(pCreateDevEnum);\r
return hr;\r
}\r
\r
- if (!pEnumMK)\r
- {\r
+ if (!pEnumMK) {\r
ERR("ClassEnumerator moniker is NULL\n");\r
SAFE_RELEASE(pCreateDevEnum);\r
return E_FAIL;\r
pEnumMK->lpVtbl->Reset(pEnumMK);\r
\r
hr = pEnumMK->lpVtbl->Next(pEnumMK, 1, &pMoniKer, NULL);\r
- if (hr == S_FALSE)\r
- {\r
+ if (hr == S_FALSE) {\r
hr = E_FAIL;\r
}\r
- if (SUCCEEDED(hr))\r
- {\r
+ if (SUCCEEDED(hr)) {\r
IPropertyBag *pBag = NULL;\r
- hr = pMoniKer->lpVtbl->BindToStorage(pMoniKer, 0, 0, &IID_IPropertyBag, (void **)&pBag);\r
- if (SUCCEEDED(hr))\r
- {\r
+ hr = pMoniKer->lpVtbl->BindToStorage(pMoniKer, 0, 0,\r
+ &IID_IPropertyBag,\r
+ (void **)&pBag);\r
+ if (SUCCEEDED(hr)) {\r
VARIANT var;\r
var.vt = VT_BSTR;\r
hr = pBag->lpVtbl->Read(pBag, L"FriendlyName", &var, NULL);\r
- if (hr == NOERROR)\r
- {\r
- hr = pMoniKer->lpVtbl->BindToObject(pMoniKer, NULL, NULL, &IID_IBaseFilter, (void**)&g_pSrcFilter);\r
- if (FAILED(hr))\r
- {\r
+ if (hr == NOERROR) {\r
+ hr = pMoniKer->lpVtbl->BindToObject(pMoniKer, NULL, NULL,\r
+ &IID_IBaseFilter,\r
+ (void **)&g_pSrcFilter);\r
+ if (FAILED(hr)) {\r
ERR("Counldn't bind moniker to filter object!!\n");\r
- }\r
- else\r
- {\r
+ } else {\r
g_pSrcFilter->lpVtbl->AddRef(g_pSrcFilter);\r
}\r
SysFreeString(var.bstrVal);\r
SAFE_RELEASE(pMoniKer);\r
}\r
\r
- if (SUCCEEDED(hr))\r
- {\r
+ if (SUCCEEDED(hr)) {\r
hr = g_pGB->lpVtbl->AddFilter(g_pGB, g_pSrcFilter, L"Video Capture");\r
- if (hr != S_OK && hr != S_FALSE)\r
- {\r
+ if (hr != S_OK && hr != S_FALSE) {\r
ERR("Counldn't add Video Capture filter to our graph!\n");\r
SAFE_RELEASE(g_pSrcFilter);\r
}\r
HRESULT hr;\r
hr = HWCFilter_Construct(&g_pDstFilter);\r
\r
- if (SUCCEEDED(hr) && g_pDstFilter)\r
- {\r
+ if (SUCCEEDED(hr) && g_pDstFilter) {\r
hr = g_pGB->lpVtbl->AddFilter(g_pGB, g_pDstFilter, L"HWCFilter");\r
- if (FAILED(hr))\r
- {\r
+ if (FAILED(hr)) {\r
ERR("Counldn't add HWCFilterr to our graph!\n");\r
SAFE_RELEASE(g_pDstFilter);\r
}\r
#define MARUCAM_DEFAULT_FRAMEINTERVAL 666666\r
\r
static STDMETHODIMP SetFormat(uint32_t dwWidth, uint32_t dwHeight,\r
- uint32_t dwFourcc)\r
+ uint32_t dwDstFmt, uint32_t *dwSrcFmt)\r
{\r
HRESULT hr;\r
IAMStreamConfig *pSConfig;\r
int iCount = 0, iSize = 0;\r
+ DWORD dwYUY2 = MAKEFOURCC('Y', 'U', 'Y', '2');\r
+ DWORD dwI420 = MAKEFOURCC('I', '4', '2', '0');\r
\r
- if (dwFourcc == 0) {\r
- dwFourcc = MAKEFOURCC('Y','U','Y','2');\r
+ if (dwSrcFmt == NULL) {\r
+ ERR("invalid the source format pointer\n");\r
+ return E_FAIL;\r
}\r
\r
hr = g_pCGB->lpVtbl->FindInterface(g_pCGB, &PIN_CATEGORY_CAPTURE, 0,\r
g_pSrcFilter, &IID_IAMStreamConfig,\r
- (void**)&pSConfig);\r
+ (void **)&pSConfig);\r
if (FAILED(hr)) {\r
ERR("failed to FindInterface method\n");\r
return hr;\r
}\r
\r
hr = pSConfig->lpVtbl->GetNumberOfCapabilities(pSConfig, &iCount, &iSize);\r
- if (FAILED(hr))\r
- {\r
+ if (FAILED(hr)) {\r
ERR("failed to GetNumberOfCapabilities method\n");\r
SAFE_RELEASE(pSConfig);\r
return hr;\r
}\r
\r
- if (iSize == sizeof(VIDEO_STREAM_CONFIG_CAPS))\r
- {\r
+ if (iSize == sizeof(VIDEO_STREAM_CONFIG_CAPS)) {\r
int iFormat = 0;\r
- for (iFormat = 0; iFormat < iCount; iFormat++)\r
- {\r
+ for (iFormat = 0; iFormat < iCount; iFormat++) {\r
VIDEO_STREAM_CONFIG_CAPS scc;\r
AM_MEDIA_TYPE *pmtConfig;\r
\r
- hr = pSConfig->lpVtbl->GetStreamCaps(pSConfig, iFormat, &pmtConfig,\r
- (BYTE*)&scc);\r
- if (hr == S_OK)\r
- {\r
- if (IsEqualIID(&pmtConfig->formattype, &FORMAT_VideoInfo))\r
- {\r
+ hr = pSConfig->lpVtbl->GetStreamCaps(pSConfig, iFormat,\r
+ &pmtConfig, (BYTE *)&scc);\r
+ if (hr == S_OK) {\r
+ if (IsEqualIID(&pmtConfig->formattype, &FORMAT_VideoInfo)) {\r
VIDEOINFOHEADER *pvi =\r
(VIDEOINFOHEADER *)pmtConfig->pbFormat;\r
if ((pvi->bmiHeader.biWidth == (LONG)dwWidth) &&\r
- (pvi->bmiHeader.biHeight == (LONG)dwHeight) &&\r
- (pvi->bmiHeader.biCompression == (DWORD)dwFourcc))\r
- {\r
+ (pvi->bmiHeader.biHeight == (LONG)dwHeight)) {\r
+ if (pvi->bmiHeader.biCompression == dwYUY2) {\r
+ *dwSrcFmt = V4L2_PIX_FMT_YUYV;\r
+ } else if ((pvi->bmiHeader.biCompression == BI_RGB) &&\r
+ (pvi->bmiHeader.biBitCount == 24)) {\r
+ *dwSrcFmt = V4L2_PIX_FMT_RGB24;\r
+ } else if (pvi->bmiHeader.biCompression == dwI420) {\r
+ *dwSrcFmt = V4L2_PIX_FMT_YUV420;\r
+ } else { /* not support format */\r
+ DeleteMediaType(pmtConfig);\r
+ continue;\r
+ }\r
/* use minimum FPS(maximum frameinterval)\r
with non-VT system */\r
#ifdef CONFIG_HAX\r
- if (!hax_enabled()) {\r
+ if (!hax_enabled()) {\r
pvi->AvgTimePerFrame =\r
(REFERENCE_TIME)scc.MaxFrameInterval;\r
} else {\r
(REFERENCE_TIME)MARUCAM_DEFAULT_FRAMEINTERVAL;\r
}\r
#else\r
- pvi->AvgTimePerFrame =\r
- (REFERENCE_TIME)scc.MaxFrameInterval;\r
+ pvi->AvgTimePerFrame =\r
+ (REFERENCE_TIME)scc.MaxFrameInterval;\r
#endif\r
hr = pSConfig->lpVtbl->SetFormat(pSConfig, pmtConfig);\r
DeleteMediaType(pmtConfig);\r
}\r
if (iFormat >= iCount) {\r
ERR("Failed to Set format. "\r
- "Maybe connected webcam does not support "\r
- "(%ldx%ld) resolution or YUY2 image format.\n",\r
+ "Maybe connected webcam does not support the (%ldx%ld) "\r
+ "resolution or image formats(YUY2, RGB24, I420).\n",\r
dwWidth, dwHeight);\r
hr = E_FAIL;\r
}\r
return hr;\r
}\r
\r
-static STDMETHODIMP QueryVideoProcAmp(long nProperty, long *pMin, long *pMax, long *pStep, long *pDefault)\r
+static STDMETHODIMP QueryVideoProcAmp(long nProperty, long *pMin, long *pMax,\r
+ long *pStep, long *pDefault)\r
{\r
HRESULT hr;\r
long Flags;\r
IAMVideoProcAmp *pProcAmp = NULL;\r
\r
- hr = g_pSrcFilter->lpVtbl->QueryInterface(g_pSrcFilter, &IID_IAMVideoProcAmp, (void**)&pProcAmp);\r
+ hr = g_pSrcFilter->lpVtbl->QueryInterface(g_pSrcFilter,\r
+ &IID_IAMVideoProcAmp,\r
+ (void **)&pProcAmp);\r
if (FAILED(hr)) {\r
return hr;\r
}\r
\r
- hr = pProcAmp->lpVtbl->GetRange(pProcAmp, nProperty, pMin, pMax, pStep, pDefault, &Flags);\r
+ hr = pProcAmp->lpVtbl->GetRange(pProcAmp, nProperty, pMin, pMax,\r
+ pStep, pDefault, &Flags);\r
\r
SAFE_RELEASE(pProcAmp);\r
return hr;\r
long Flags;\r
IAMVideoProcAmp *pProcAmp = NULL;\r
\r
- hr = g_pSrcFilter->lpVtbl->QueryInterface(g_pSrcFilter, &IID_IAMVideoProcAmp, (void**)&pProcAmp);\r
- if (FAILED(hr))\r
+ hr = g_pSrcFilter->lpVtbl->QueryInterface(g_pSrcFilter,\r
+ &IID_IAMVideoProcAmp,\r
+ (void **)&pProcAmp);\r
+ if (FAILED(hr)) {\r
return hr;\r
+ }\r
\r
hr = pProcAmp->lpVtbl->Get(pProcAmp, nProperty, pValue, &Flags);\r
if (FAILED(hr)) {\r
HRESULT hr;\r
\r
IAMVideoProcAmp *pProcAmp = NULL;\r
- hr = g_pSrcFilter->lpVtbl->QueryInterface(g_pSrcFilter, &IID_IAMVideoProcAmp, (void**)&pProcAmp);\r
- if (FAILED(hr))\r
+ hr = g_pSrcFilter->lpVtbl->QueryInterface(g_pSrcFilter,\r
+ &IID_IAMVideoProcAmp,\r
+ (void **)&pProcAmp);\r
+ if (FAILED(hr)) {\r
return hr;\r
+ }\r
\r
- hr = pProcAmp->lpVtbl->Set(pProcAmp, nProperty, value, VideoProcAmp_Flags_Manual);\r
+ hr = pProcAmp->lpVtbl->Set(pProcAmp, nProperty, value,\r
+ VideoProcAmp_Flags_Manual);\r
if (FAILED(hr)) {\r
ERR("Failed to set property for video\n");\r
}\r
return hr;\r
}\r
\r
-static char* __wchar_to_char(const WCHAR *pwstr)\r
+static char *__wchar_to_char(const WCHAR *pwstr)\r
{\r
char *pstr = NULL;\r
int len = 0;\r
hr = CoCreateInstance(&CLSID_FilterGraph, NULL,\r
CLSCTX_INPROC,\r
&IID_IGraphBuilder,\r
- (void**)&pGB);\r
+ (void **)&pGB);\r
if (FAILED(hr)) {\r
fprintf(stdout, "[Webcam] Failed to create GraphBuilder, 0x%x\n", hr);\r
goto leave_check;\r
hr = CoCreateInstance(&CLSID_CaptureGraphBuilder2, NULL,\r
CLSCTX_INPROC,\r
&IID_ICaptureGraphBuilder2,\r
- (void**)&pCGB);\r
+ (void **)&pCGB);\r
if (FAILED(hr)) {\r
fprintf(stdout,\r
"[Webcam] Failed to create CaptureGraphBuilder2, 0x%x\n", hr);\r
hr = CoCreateInstance(&CLSID_SystemDeviceEnum, NULL,\r
CLSCTX_INPROC,\r
&IID_ICreateDevEnum,\r
- (void**)&pCreateDevEnum);\r
+ (void **)&pCreateDevEnum);\r
if (FAILED(hr)) {\r
fprintf(stdout,\r
"[Webcam] failed to create instance of CLSID_SystemDeviceEnum\n");\r
g_free(device_name);\r
hr = pMoniKer->lpVtbl->BindToObject(pMoniKer, NULL, NULL,\r
&IID_IBaseFilter,\r
- (void**)&pSrcFilter);\r
+ (void **)&pSrcFilter);\r
if (FAILED(hr)) {\r
fprintf(stdout,\r
"[Webcam] Counldn't bind moniker to filter object!!\n");\r
\r
hr = pCGB->lpVtbl->FindInterface(pCGB, &PIN_CATEGORY_CAPTURE, 0,\r
pSrcFilter, &IID_IAMStreamConfig,\r
- (void**)&pSConfig);\r
+ (void **)&pSConfig);\r
if (FAILED(hr)) {\r
fprintf(stdout, "[Webcam] failed to FindInterface method\n");\r
goto leave_check;\r
}\r
\r
hr = pSConfig->lpVtbl->GetNumberOfCapabilities(pSConfig, &iCount, &iSize);\r
- if (FAILED(hr))\r
- {\r
+ if (FAILED(hr)) {\r
fprintf(stdout, "[Webcam] failed to GetNumberOfCapabilities method\n");\r
goto leave_check;\r
}\r
\r
- if (iSize == sizeof(VIDEO_STREAM_CONFIG_CAPS))\r
- {\r
+ if (iSize == sizeof(VIDEO_STREAM_CONFIG_CAPS)) {\r
int iFormat = 0;\r
- for (iFormat = 0; iFormat < iCount; iFormat++)\r
- {\r
+ for (iFormat = 0; iFormat < iCount; iFormat++) {\r
VIDEO_STREAM_CONFIG_CAPS scc;\r
AM_MEDIA_TYPE *pmtConfig;\r
\r
hr = pSConfig->lpVtbl->GetStreamCaps(pSConfig, iFormat, &pmtConfig,\r
- (BYTE*)&scc);\r
- if (hr == S_OK)\r
- {\r
- if (IsEqualIID(&pmtConfig->formattype, &FORMAT_VideoInfo))\r
- {\r
+ (BYTE *)&scc);\r
+ if (hr == S_OK) {\r
+ if (IsEqualIID(&pmtConfig->formattype, &FORMAT_VideoInfo)) {\r
VIDEOINFOHEADER *pvi =\r
(VIDEOINFOHEADER *)pmtConfig->pbFormat;\r
if (pvi->bmiHeader.biCompression == BI_RGB) {\r
}\r
\r
/* MARUCAM_CMD_INIT */\r
-void marucam_device_init(MaruCamState* state)\r
+void marucam_device_init(MaruCamState *state)\r
{\r
g_state = state;\r
}\r
\r
/* MARUCAM_CMD_OPEN */\r
-void marucam_device_open(MaruCamState* state)\r
+void marucam_device_open(MaruCamState *state)\r
{\r
HRESULT hr;\r
- uint32_t dwHeight, dwWidth;\r
+ uint32_t dwHeight, dwWidth, dwDstFmt;\r
MaruCamParam *param = state->param;\r
param->top = 0;\r
\r
\r
dwHeight = supported_dst_frames[cur_frame_idx].height;\r
dwWidth = supported_dst_frames[cur_frame_idx].width;\r
- hr = SetFormat(dwWidth, dwHeight, 0);\r
+ dwDstFmt = supported_dst_pixfmts[cur_fmt_idx].fmt;\r
+ hr = SetFormat(dwWidth, dwHeight, dwDstFmt, &g_dwSrcFmt);\r
if (hr != S_OK) {\r
ERR("failed to Set default values\n");\r
goto error_failed;\r
}\r
\r
/* MARUCAM_CMD_CLOSE */\r
-void marucam_device_close(MaruCamState* state)\r
+void marucam_device_close(MaruCamState *state)\r
{\r
MaruCamParam *param = state->param;\r
param->top = 0;\r
}\r
\r
/* MARUCAM_CMD_START_PREVIEW */\r
-void marucam_device_start_preview(MaruCamState* state)\r
+void marucam_device_start_preview(MaruCamState *state)\r
{\r
HRESULT hr;\r
uint32_t pixfmt, width, height;\r
INFO("Starting preview\n");\r
\r
assert(g_pCallback != NULL);\r
- hr = ((HWCInPin*)g_pInputPin)->SetGrabCallbackIF(g_pInputPin, g_pCallback);\r
+ hr = ((HWCInPin *)g_pInputPin)->SetGrabCallbackIF(g_pInputPin,\r
+ g_pCallback);\r
if (FAILED(hr)) {\r
ERR("Failed to set IGrabCallback interface.\n");\r
param->errCode = EINVAL;\r
return;\r
}\r
\r
+ if (grab_buf) {\r
+ g_free(grab_buf);\r
+ grab_buf = NULL;\r
+ }\r
+ grab_buf = (void *)g_malloc0(state->buf_size);\r
+ if (grab_buf == NULL) {\r
+ param->errCode = ENOMEM;\r
+ return;\r
+ }\r
+\r
hr = g_pMediaControl->lpVtbl->Run(g_pMediaControl);\r
if (FAILED(hr)) {\r
ERR("Failed to run media control. hr=0x%x\n", hr);\r
}\r
\r
/* MARUCAM_CMD_STOP_PREVIEW */\r
-void marucam_device_stop_preview(MaruCamState* state)\r
+void marucam_device_stop_preview(MaruCamState *state)\r
{\r
HRESULT hr;\r
MaruCamParam *param = state->param;\r
state->streamon = 0;\r
qemu_mutex_unlock(&state->thread_mutex);\r
\r
- hr = ((HWCInPin*)g_pInputPin)->SetGrabCallbackIF(g_pInputPin, NULL);\r
+ hr = ((HWCInPin *)g_pInputPin)->SetGrabCallbackIF(g_pInputPin, NULL);\r
if (FAILED(hr)) {\r
ERR("Failed to set IGrabCallback interface.\n");\r
param->errCode = EINVAL;\r
return;\r
}\r
\r
+ if (grab_buf) {\r
+ g_free(grab_buf);\r
+ grab_buf = NULL;\r
+ }\r
state->buf_size = 0;\r
\r
INFO("Stopping preview\n");\r
}\r
\r
/* MARUCAM_CMD_S_PARAM */\r
-void marucam_device_s_param(MaruCamState* state)\r
+void marucam_device_s_param(MaruCamState *state)\r
{\r
MaruCamParam *param = state->param;\r
\r
}\r
\r
/* MARUCAM_CMD_G_PARAM */\r
-void marucam_device_g_param(MaruCamState* state)\r
+void marucam_device_g_param(MaruCamState *state)\r
{\r
MaruCamParam *param = state->param;\r
\r
}\r
\r
/* MARUCAM_CMD_S_FMT */\r
-void marucam_device_s_fmt(MaruCamState* state)\r
+void marucam_device_s_fmt(MaruCamState *state)\r
{\r
uint32_t width, height, pixfmt, pidx, fidx;\r
MaruCamParam *param = state->param;\r
\r
if ((supported_dst_frames[cur_frame_idx].width != width) &&\r
(supported_dst_frames[cur_frame_idx].height != height)) {\r
- HRESULT hr = SetFormat(width, height, 0);\r
+ HRESULT hr = SetFormat(width, height, pixfmt, &g_dwSrcFmt);\r
if (FAILED(hr)) {\r
param->errCode = EINVAL;\r
return;\r
}\r
\r
/* MARUCAM_CMD_G_FMT */\r
-void marucam_device_g_fmt(MaruCamState* state)\r
+void marucam_device_g_fmt(MaruCamState *state)\r
{\r
uint32_t width, height, pixfmt;\r
MaruCamParam *param = state->param;\r
TRACE("Get format...\n");\r
}\r
\r
-void marucam_device_try_fmt(MaruCamState* state)\r
+void marucam_device_try_fmt(MaruCamState *state)\r
{\r
uint32_t width, height, pixfmt, i;\r
MaruCamParam *param = state->param;\r
param->stack[7] = 0;\r
}\r
\r
-void marucam_device_enum_fmt(MaruCamState* state)\r
+void marucam_device_enum_fmt(MaruCamState *state)\r
{\r
uint32_t index;\r
MaruCamParam *param = state->param;\r
}\r
}\r
\r
-void marucam_device_qctrl(MaruCamState* state)\r
+void marucam_device_qctrl(MaruCamState *state)\r
{\r
HRESULT hr;\r
uint32_t id, i;\r
case V4L2_CID_BRIGHTNESS:\r
TRACE("V4L2_CID_BRIGHTNESS\n");\r
property = VideoProcAmp_Brightness;\r
- memcpy((void*)name, (void*)"brightness", 32);\r
+ memcpy((void *)name, (void *)"brightness", 32);\r
i = 0;\r
break;\r
case V4L2_CID_CONTRAST:\r
TRACE("V4L2_CID_CONTRAST\n");\r
property = VideoProcAmp_Contrast;\r
- memcpy((void*)name, (void*)"contrast", 32);\r
+ memcpy((void *)name, (void *)"contrast", 32);\r
i = 1;\r
break;\r
case V4L2_CID_SATURATION:\r
TRACE("V4L2_CID_SATURATION\n");\r
property = VideoProcAmp_Saturation;\r
- memcpy((void*)name, (void*)"saturation", 32);\r
+ memcpy((void *)name, (void *)"saturation", 32);\r
i = 2;\r
break;\r
case V4L2_CID_SHARPNESS:\r
TRACE("V4L2_CID_SHARPNESS\n");\r
property = VideoProcAmp_Sharpness;\r
- memcpy((void*)name, (void*)"sharpness", 32);\r
+ memcpy((void *)name, (void *)"sharpness", 32);\r
i = 3;\r
break;\r
default:\r
param->stack[4] = MARUCAM_CTRL_VALUE_MID; /* default_value */\r
param->stack[5] = V4L2_CTRL_FLAG_SLIDER;\r
/* name field setting */\r
- memcpy(¶m->stack[6], (void*)name, sizeof(name)/sizeof(name[0]));\r
+ memcpy(¶m->stack[6], (void *)name, sizeof(name)/sizeof(name[0]));\r
}\r
\r
-void marucam_device_s_ctrl(MaruCamState* state)\r
+void marucam_device_s_ctrl(MaruCamState *state)\r
{\r
HRESULT hr;\r
uint32_t i;\r
}\r
}\r
\r
-void marucam_device_g_ctrl(MaruCamState* state)\r
+void marucam_device_g_ctrl(MaruCamState *state)\r
{\r
HRESULT hr;\r
uint32_t i;\r
qctrl_tbl[i].max, get_val);\r
}\r
\r
-void marucam_device_enum_fsizes(MaruCamState* state)\r
+void marucam_device_enum_fsizes(MaruCamState *state)\r
{\r
uint32_t index, pixfmt, i;\r
MaruCamParam *param = state->param;\r
return;\r
}\r
for (i = 0; i < ARRAY_SIZE(supported_dst_pixfmts); i++) {\r
- if (supported_dst_pixfmts[i].fmt == pixfmt)\r
+ if (supported_dst_pixfmts[i].fmt == pixfmt) {\r
break;\r
+ }\r
}\r
\r
if (i == ARRAY_SIZE(supported_dst_pixfmts)) {\r
param->stack[1] = supported_dst_frames[index].height;\r
}\r
\r
-void marucam_device_enum_fintv(MaruCamState* state)\r
+void marucam_device_enum_fintv(MaruCamState *state)\r
{\r
MaruCamParam *param = state->param;\r
\r
param->stack[0] = 1; /* numerator */\r
}\r
\r
-void v4lconvert_yuyv_to_yuv420(const unsigned char *src, unsigned char *dest,\r
+void yuyv_to_yuv420(const unsigned char *src, unsigned char *dest,\r
uint32_t width, uint32_t height, uint32_t yvu)\r
{\r
uint32_t i, j;\r
src1 += width * 2;\r
}\r
}\r
+\r
+#define RGB2Y(r, g, b, y) \\r
+ (y) = ((8453 * (r) + 16594 * (g) + 3223 * (b) + 524288) >> 15)\r
+\r
+#define RGB2UV(r, g, b, u, v) \\r
+ do { \\r
+ (u) = ((-4878 * (r) - 9578 * (g) + 14456 * (b) + 4210688) >> 15); \\r
+ (v) = ((14456 * (r) - 12105 * (g) - 2351 * (b) + 4210688) >> 15); \\r
+ } while (0)\r
+\r
+#define CLIP(color) \\r
+ (unsigned char)(((color) > 0xFF) ? 0xff : (((color) < 0) ? 0 : (color)))\r
+\r
+void rgb24_to_yuv420(const unsigned char *src, unsigned char *dest,\r
+ uint32_t width, uint32_t height, uint32_t yvu)\r
+{\r
+ uint32_t x, y;\r
+ unsigned char *udest, *vdest;\r
+ uint32_t bytesperline = width * 3;\r
+\r
+ /* Y */\r
+ for (y = 0; y < height; y++) {\r
+ for (x = 0; x < width; x++) {\r
+ /* RGB2Y(src[0], src[1], src[2], *dest++); */\r
+ RGB2Y(src[2], src[1], src[0], *dest++);\r
+ src += 3;\r
+ }\r
+ src += bytesperline - 3 * width;\r
+ }\r
+ src -= height * bytesperline;\r
+\r
+ /* U + V */\r
+ if (yvu) {\r
+ vdest = dest;\r
+ udest = dest + width * height / 4;\r
+ } else {\r
+ udest = dest;\r
+ vdest = dest + width * height / 4;\r
+ }\r
+\r
+ for (y = 0; y < height / 2; y++) {\r
+ for (x = 0; x < width / 2; x++) {\r
+ uint32_t avg_src[3];\r
+\r
+ avg_src[0] = (src[0] + src[3] + src[bytesperline] +\r
+ src[bytesperline + 3]) / 4;\r
+ avg_src[1] = (src[1] + src[4] + src[bytesperline + 1] +\r
+ src[bytesperline + 4]) / 4;\r
+ avg_src[2] = (src[2] + src[5] + src[bytesperline + 2] +\r
+ src[bytesperline + 5]) / 4;\r
+ /*\r
+ RGB2UV(avg_src[0], avg_src[1], avg_src[2], *udest++, *vdest++);\r
+ */\r
+ RGB2UV(avg_src[2], avg_src[1], avg_src[0], *udest++, *vdest++);\r
+ src += 6;\r
+ }\r
+ src += 2 * bytesperline - 3 * width;\r
+ }\r
+}\r
+\r
+void rgb24_to_yuyv(unsigned char *src, unsigned char *dest,\r
+ uint32_t width, uint32_t height)\r
+{\r
+ uint32_t i = 0;\r
+\r
+ for (i = 0; i < (width * height * 3); i = i + 6) {\r
+ /* y */\r
+ *dest++ = CLIP(0.299 * (src[i + 2] - 128) +\r
+ 0.587 * (src[i + 1] - 128) +\r
+ 0.114 * (src[i] - 128) + 128);\r
+ /* u */\r
+ *dest++ = CLIP(((-0.147 * (src[i + 2] - 128) -\r
+ 0.289 * (src[i + 1] - 128) +\r
+ 0.436 * (src[i] - 128) + 128) +\r
+ (-0.147 * (src[i + 5] - 128) -\r
+ 0.289 * (src[i + 4] - 128) +\r
+ 0.436 * (src[i + 3] - 128) + 128)) / 2);\r
+ /* y1 */\r
+ *dest++ = CLIP(0.299 * (src[i + 5] - 128) +\r
+ 0.587 * (src[i + 4] - 128) +\r
+ 0.114 * (src[i + 3] - 128) + 128);\r
+ /* v */\r
+ *dest++ = CLIP(((0.615 * (src[i + 2] - 128) -\r
+ 0.515 * (src[i + 1] - 128) -\r
+ 0.100 * (src[i] - 128) + 128) +\r
+ (0.615 * (src[i + 5] - 128) -\r
+ 0.515 * (src[i + 4] - 128) -\r
+ 0.100 * (src[i + 3] - 128) + 128)) / 2);\r
+ }\r
+}\r
+\r
+void yuv420_to_yvu420(unsigned char *src, unsigned char *dest,\r
+ uint32_t width, uint32_t height)\r
+{\r
+ unsigned char *psrc_y, *pdst_y;\r
+ unsigned char *psrc_u, *pdst_u;\r
+ unsigned char *psrc_v, *pdst_v;\r
+\r
+ psrc_y = src;\r
+ psrc_u = psrc_y + (width * height);\r
+ psrc_v = psrc_u + (width * height / 4);\r
+\r
+ pdst_y = dest;\r
+ pdst_v = pdst_y + (width * height);\r
+ pdst_u = pdst_v + (width * height / 4);\r
+\r
+ memcpy(pdst_y, psrc_y, width * height);\r
+ memcpy(pdst_v, psrc_v, width * height / 4);\r
+ memcpy(pdst_u, psrc_u, width * height / 4);\r
+}\r
+\r
+void yuv420_to_yuyv(unsigned char *src, unsigned char *dest,\r
+ uint32_t width, uint32_t height)\r
+{\r
+ unsigned char *py;\r
+ unsigned char *pu;\r
+ unsigned char *pv;\r
+\r
+ uint32_t linesize = width * 2;\r
+ uint32_t uvlinesize = width / 2;\r
+ uint32_t offset = 0;\r
+ uint32_t offset1 = 0;\r
+ uint32_t offsety = 0;\r
+ uint32_t offsety1 = 0;\r
+ uint32_t offsetuv = 0;\r
+ uint32_t h = 0;\r
+ uint32_t w = 0;\r
+ uint32_t wy = 0;\r
+ uint32_t huv = 0;\r
+ uint32_t wuv = 0;\r
+\r
+ py = src;\r
+ pu = py + (width * height);\r
+ pv = pu + (width * height / 4);\r
+\r
+ for (h = 0; h < height; h += 2) {\r
+ wy = 0;\r
+ wuv = 0;\r
+ offset = h * linesize;\r
+ offset1 = (h + 1) * linesize;\r
+ offsety = h * width;\r
+ offsety1 = (h + 1) * width;\r
+ offsetuv = huv * uvlinesize;\r
+\r
+ for (w = 0; w < linesize; w += 4) {\r
+ /* y00 */\r
+ dest[w + offset] = py[wy + offsety];\r
+ /* u0 */\r
+ dest[(w + 1) + offset] = pu[wuv + offsetuv];\r
+ /* y01 */\r
+ dest[(w + 2) + offset] = py[(wy + 1) + offsety];\r
+ /* v0 */\r
+ dest[(w + 3) + offset] = pv[wuv + offsetuv];\r
+\r
+ /* y10 */\r
+ dest[w + offset1] = py[wy + offsety1];\r
+ /* u0 */\r
+ dest[(w + 1) + offset1] = pu[wuv + offsetuv];\r
+ /* y11 */\r
+ dest[(w + 2) + offset1] = py[(wy + 1) + offsety1];\r
+ /* v0 */\r
+ dest[(w + 3) + offset1] = pv[wuv + offsetuv];\r
+\r
+ wuv++;\r
+ wy += 2;\r
+ }\r
+ huv++;\r
+ }\r
+}\r