[Title] Improved memory leaks.
authorjinhyung.jo <jinhyung.jo@samsung.com>
Fri, 7 Sep 2012 15:46:44 +0000 (00:46 +0900)
committerjinhyung.jo <jinhyung.jo@samsung.com>
Tue, 11 Sep 2012 11:42:35 +0000 (20:42 +0900)
[Type] Bugfix
[Module] Emulator / Camera
[Priority] Critical
[CQ#]
[Redmine#]
[Problem]
[Cause]
[Solution]
[TestCase]

tizen/src/hw/maru_camera_win32_pci.c

index e5817b1..71320f3 100644 (file)
@@ -104,6 +104,7 @@ static STDMETHODIMP_(ULONG) HWCGrabCallback_Release(IGrabCallback *iface)
     {\r
         This->m_pCallback = NULL;\r
         g_free((void*)This);\r
+        This = NULL;\r
         return 0;\r
     }\r
 \r
@@ -166,6 +167,7 @@ typedef struct HWCInPin
     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
@@ -218,7 +220,11 @@ static STDMETHODIMP_(ULONG) HWCPin_Release(IPin *iface)
         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
@@ -406,7 +412,11 @@ static STDMETHODIMP_(ULONG) HWCMemInputPin_Release(IMemInputPin *iface)
         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
@@ -414,17 +424,46 @@ static STDMETHODIMP_(ULONG) HWCMemInputPin_Release(IMemInputPin *iface)
 \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
@@ -539,6 +578,7 @@ static STDMETHODIMP HWCInPin_Construct(IBaseFilter *pFilter, IPin **ppv)
     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
@@ -548,6 +588,7 @@ static STDMETHODIMP HWCInPin_Construct(IBaseFilter *pFilter, IPin **ppv)
     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
@@ -605,6 +646,7 @@ static STDMETHODIMP_(ULONG) HWCEnumPins_Release(IEnumPins *iface)
         }\r
         This->m_nPos = 0;\r
         g_free((void*)This);\r
+        This = NULL;\r
         return 0;\r
     }\r
     return This->m_cRef;\r
@@ -661,6 +703,7 @@ static STDMETHODIMP HWCEnumPins_Clone(IEnumPins *iface, IEnumPins **ppEnum)
 \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
@@ -684,6 +727,7 @@ static STDMETHODIMP HWCEnumPins_Construct(IBaseFilter *pFilter, int nPos, IEnumP
     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
@@ -752,6 +796,7 @@ static STDMETHODIMP_(ULONG) HWCFilter_Release(IBaseFilter *iface)
             SAFE_RELEASE(This->m_pPin);\r
         }\r
         g_free((void*)This);\r
+        This = NULL;\r
         return 0;\r
     }\r
     return This->m_cRef;\r
@@ -897,6 +942,7 @@ static STDMETHODIMP HWCFilter_Construct(IBaseFilter **ppv)
     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
@@ -1101,9 +1147,11 @@ static STDMETHODIMP marucam_device_callbackfn(ULONG dwSize, BYTE *pBuffer)
         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
@@ -1669,6 +1717,9 @@ void marucam_device_start_preview(MaruCamState* state)
     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
@@ -1698,23 +1749,24 @@ void marucam_device_stop_preview(MaruCamState* state)
     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