{\r
This->m_pCallback = NULL;\r
g_free((void*)This);\r
+ This = NULL;\r
return 0;\r
}\r
\r
IBaseFilter *m_pCFilter;\r
IPin *m_pConnectedPin;\r
IGrabCallback *m_pCallback;\r
+ IMemAllocator *m_pAllocator;\r
BOOL m_bReadOnly;\r
long m_cRef;\r
STDMETHODIMP (*SetGrabCallbackIF)(IPin *iface, IGrabCallback *pCaptureCB);\r
if (This->m_pConnectedPin) {\r
SAFE_RELEASE(This->m_pConnectedPin);\r
}\r
+ if (This->m_pAllocator) {\r
+ SAFE_RELEASE(This->m_pAllocator);\r
+ }\r
g_free((void*)This);\r
+ This = NULL;\r
return 0;\r
}\r
return This->m_cRef;\r
if (This->m_pConnectedPin) {\r
SAFE_RELEASE(This->m_pConnectedPin);\r
}\r
+ if (This->m_pAllocator) {\r
+ SAFE_RELEASE(This->m_pAllocator);\r
+ }\r
g_free((void*)This);\r
+ This = NULL;\r
return 0;\r
}\r
return This->m_cRef;\r
\r
static STDMETHODIMP HWCMemInputPin_GetAllocator(IMemInputPin *iface, IMemAllocator **ppAllocator)\r
{\r
+ HWCInPin *This = impl_from_IMemInputPin(iface);\r
+\r
if (ppAllocator == NULL)\r
return E_POINTER;\r
- return VFW_E_NO_ALLOCATOR;\r
+\r
+ if (This->m_pAllocator == NULL) {\r
+ HRESULT hr = CoCreateInstance(&CLSID_MemoryAllocator, NULL,\r
+ CLSCTX_INPROC_SERVER,\r
+ &IID_IMemAllocator,\r
+ (void **)&(This->m_pAllocator));\r
+ if (FAILED(hr)) {\r
+ ERR("Failed to CoCreateInstance for retrieving MemoryAllocator\n");\r
+ return hr;\r
+ }\r
+ }\r
+ ASSERT(This->m_pAllocator != NULL);\r
+ *ppAllocator = This->m_pAllocator;\r
+ IMemAllocator_AddRef(This->m_pAllocator);\r
+\r
+ return S_OK;\r
}\r
\r
static STDMETHODIMP HWCMemInputPin_NotifyAllocator(IMemInputPin *iface, IMemAllocator *pAllocator, BOOL bReadOnly)\r
{\r
+ HWCInPin *This = impl_from_IMemInputPin(iface);\r
+\r
if (pAllocator == NULL)\r
return E_POINTER;\r
\r
- return NOERROR;\r
+ IMemAllocator *pOldAllocator = This->m_pAllocator;\r
+ IMemAllocator_AddRef(pAllocator);\r
+ This->m_pAllocator = pAllocator;\r
+\r
+ if (pOldAllocator != NULL) {\r
+ SAFE_RELEASE(pOldAllocator);\r
+ }\r
+\r
+ This->m_bReadOnly = bReadOnly;\r
+\r
+ return S_OK;\r
}\r
\r
static STDMETHODIMP HWCMemInputPin_GetAllocatorRequirements(IMemInputPin *iface, ALLOCATOR_PROPERTIES *pProps)\r
HWCInPin *This = (HWCInPin *)g_malloc0(sizeof(HWCInPin));\r
\r
if (!This) {\r
+ ERR("failed to HWCInPin_Construct, E_OUTOFMEMORY\n");\r
return E_OUTOFMEMORY;\r
}\r
\r
This->m_pCFilter = pFilter;\r
This->m_pConnectedPin = NULL;\r
This->m_pCallback = NULL;\r
+ This->m_pAllocator = NULL;\r
This->m_cRef = 1;\r
This->SetGrabCallbackIF = HWCPin_SetCallback;\r
*ppv = &This->IPin_iface;\r
}\r
This->m_nPos = 0;\r
g_free((void*)This);\r
+ This = NULL;\r
return 0;\r
}\r
return This->m_cRef;\r
\r
HWCEnumPins_Construct(This->m_pFilter, This->m_nPos, ppEnum);\r
if (*ppEnum == NULL) {\r
+ ERR("failed to HWCEnumPins_Construct in clone, E_OUTOFMEMORY\n");\r
return E_OUTOFMEMORY;\r
}\r
\r
HWCEnumPins *This = (HWCEnumPins *)g_malloc0(sizeof(HWCEnumPins));\r
\r
if (!This) {\r
+ ERR("failed to HWCEnumPins_Construct, E_OUTOFMEMORY\n");\r
return E_OUTOFMEMORY;\r
}\r
\r
SAFE_RELEASE(This->m_pPin);\r
}\r
g_free((void*)This);\r
+ This = NULL;\r
return 0;\r
}\r
return This->m_cRef;\r
HWCFilter *This = (HWCFilter *)g_malloc0(sizeof(HWCFilter));\r
\r
if (!This) {\r
+ ERR("failed to HWCFilter_Construct, E_OUTOFMEMORY\n");\r
return E_OUTOFMEMORY;\r
}\r
\r
qemu_mutex_unlock(&g_state->thread_mutex);\r
return S_OK;\r
}\r
- g_state->req_frame = 0; /* clear request */\r
- g_state->isr |= 0x01; /* set a flag raising a interrupt. */\r
- qemu_bh_schedule(g_state->tx_bh);\r
+ if (g_state->streamon) {\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
qemu_mutex_unlock(&g_state->thread_mutex);\r
return S_OK;\r
}\r
pixfmt = supported_dst_pixfmts[cur_fmt_idx].fmt;\r
state->buf_size = get_sizeimage(pixfmt, width, height);\r
\r
+ INFO("Pixfmt(0x%x), Width:Height(%d:%d), buffer size(%u)\n",\r
+ pixfmt, width, height, state->buf_size);\r
+\r
assert(g_pCallback != NULL);\r
hr = ((HWCInPin*)g_pInputPin)->SetGrabCallbackIF(g_pInputPin, g_pCallback);\r
if (FAILED(hr)) {\r
MaruCamParam *param = state->param;\r
param->top = 0;\r
\r
- hr = g_pMediaControl->lpVtbl->Stop(g_pMediaControl);\r
+ qemu_mutex_lock(&state->thread_mutex);\r
+ state->streamon = 0;\r
+ qemu_mutex_unlock(&state->thread_mutex);\r
+\r
+ hr = ((HWCInPin*)g_pInputPin)->SetGrabCallbackIF(g_pInputPin, NULL);\r
if (FAILED(hr)) {\r
- ERR("Failed to stop media control.\n");\r
+ ERR("Failed to set IGrabCallback interface.\n");\r
param->errCode = EINVAL;\r
return;\r
}\r
\r
- hr = ((HWCInPin*)g_pInputPin)->SetGrabCallbackIF(g_pInputPin, NULL);\r
+ hr = g_pMediaControl->lpVtbl->Stop(g_pMediaControl);\r
if (FAILED(hr)) {\r
- ERR("Failed to set IGrabCallback interface.\n");\r
+ ERR("Failed to stop media control.\n");\r
param->errCode = EINVAL;\r
return;\r
}\r
\r
- qemu_mutex_lock(&state->thread_mutex);\r
- state->streamon = 0;\r
- qemu_mutex_unlock(&state->thread_mutex);\r
state->buf_size = 0;\r
\r
INFO("Stop preview!!!\n");\r