maru_camera : remove Sonar violations & fixed a bug
authorjinhyung.jo <jinhyung.jo@samsung.com>
Fri, 14 Dec 2012 08:03:55 +0000 (17:03 +0900)
committerjinhyung.jo <jinhyung.jo@samsung.com>
Fri, 14 Dec 2012 08:03:55 +0000 (17:03 +0900)
remove Sonar violations
fixed a bug that unexpected temination when play camera on Windows7

Signed-off-by: Jinhyung Jo <jinhyung.jo@samsung.com>
tizen/src/hw/maru_camera_common.h
tizen/src/hw/maru_camera_common_pci.c
tizen/src/hw/maru_camera_darwin_pci.m
tizen/src/hw/maru_camera_linux_pci.c
tizen/src/hw/maru_camera_win32_interface.h
tizen/src/hw/maru_camera_win32_pci.c

index deb0f11c45dccc3b6184f493affde7535c13d0b3..802030891b0c53e6a0f999b88a80229a271a68e9 100644 (file)
@@ -76,6 +76,7 @@ struct MaruCamState {
     QemuCond            thread_cond;\r
     QEMUBH              *tx_bh;\r
 \r
+    bool                destroying;\r
     void                *vaddr;     /* vram ptr */\r
     uint32_t            isr;\r
     uint32_t            streamon;\r
@@ -86,11 +87,12 @@ struct MaruCamState {
     MemoryRegion        mmio;\r
 };\r
 \r
-/* ----------------------------------------------------------------------------- */\r
-/* Fucntion prototype                                                            */\r
-/* ----------------------------------------------------------------------------- */\r
+/* ------------------------------------------------------------------------- */\r
+/* Fucntion prototype                                                        */\r
+/* ------------------------------------------------------------------------- */\r
 int marucam_device_check(int log_flag);\r
 void marucam_device_init(MaruCamState *state);\r
+void marucam_device_exit(MaruCamState *state);\r
 void marucam_device_open(MaruCamState *state);\r
 void marucam_device_close(MaruCamState *state);\r
 void marucam_device_start_preview(MaruCamState *state);\r
index 3bdcb01e85a52dcebfad02da59b0f7c0a5e5b1ff..42d853a6e90c300bf50cee52a3505f0e1b78260f 100644 (file)
@@ -48,13 +48,14 @@ MULTI_DEBUG_CHANNEL(tizen, camera_pci);
 \r
 #define MARU_PCI_CAMERA_DEVICE_NAME     "maru_camera_pci"\r
 \r
-#define MARUCAM_MEM_SIZE        (4 * 1024 * 1024)   // 4MB\r
-#define MARUCAM_REG_SIZE        (256)               // 64 * 4\r
+#define MARUCAM_MEM_SIZE    (4 * 1024 * 1024)   /* 4MB */\r
+#define MARUCAM_REG_SIZE    (256)               /* 64 * 4Byte */\r
 \r
 /*\r
  *  I/O functions\r
  */\r
-static inline uint32_t marucam_mmio_read(void *opaque, target_phys_addr_t offset)\r
+static inline uint32_t\r
+marucam_mmio_read(void *opaque, target_phys_addr_t offset)\r
 {\r
     uint32_t ret = 0;\r
     MaruCamState *state = (MaruCamState*)opaque;\r
@@ -91,13 +92,15 @@ static inline uint32_t marucam_mmio_read(void *opaque, target_phys_addr_t offset
         state->param->errCode = 0;\r
         break;\r
     default:\r
-        WARN("Not supported command!!\n");\r
+        ERR("Not supported command: 0x%x\n", offset);\r
+        ret = EINVAL;\r
         break;\r
     }\r
     return ret;\r
 }\r
 \r
-static inline void marucam_mmio_write(void *opaque, target_phys_addr_t offset, uint32_t value)\r
+static inline void\r
+marucam_mmio_write(void *opaque, target_phys_addr_t offset, uint32_t value)\r
 {\r
     MaruCamState *state = (MaruCamState*)opaque;\r
     \r
@@ -160,7 +163,7 @@ static inline void marucam_mmio_write(void *opaque, target_phys_addr_t offset, u
         qemu_mutex_unlock(&state->thread_mutex);\r
         break;\r
     default:\r
-        WARN("Not supported command!!\n");\r
+        ERR("Not supported command: 0x%x\n", offset);\r
         break;\r
     }\r
 }\r
@@ -230,11 +233,12 @@ static int marucam_initfn(PCIDevice *dev)
 /*\r
  *  Termination function\r
  */\r
-static int marucam_exitfn(PCIDevice *obj)\r
+static void marucam_exitfn(PCIDevice *pci_dev)\r
 {\r
     MaruCamState *s =\r
-        OBJECT_CHECK(MaruCamState, obj, MARU_PCI_CAMERA_DEVICE_NAME);\r
+        OBJECT_CHECK(MaruCamState, pci_dev, MARU_PCI_CAMERA_DEVICE_NAME);\r
 \r
+    marucam_device_exit(s);\r
     g_free(s->param);\r
     qemu_cond_destroy(&s->thread_cond);\r
     qemu_mutex_destroy(&s->thread_mutex);\r
@@ -244,7 +248,6 @@ static int marucam_exitfn(PCIDevice *obj)
 \r
 \r
     INFO("[%s] camera device was released.\n", __func__);\r
-    return 0;\r
 }\r
 \r
 int maru_camera_pci_init(PCIBus *bus)\r
index e91bbf15b7cc55d7d4a14f75e44d691245e474ec..7f590c22f7f4af6bc8aef1347efc9c9154bd3081 100644 (file)
@@ -472,26 +472,31 @@ static void *marucam_worker_thread(void *thread_param)
 {
   //MaruCamState *state = (MaruCamState*)thread_param;
 
-  wait_worker_thread:
-    qemu_mutex_lock(&g_state->thread_mutex);
-    // Wait on the condition
-    qemu_cond_wait(&g_state->thread_cond, &g_state->thread_mutex);
-    qemu_mutex_unlock(&g_state->thread_mutex);
+    while (1) {
+        qemu_mutex_lock(&g_state->thread_mutex);
+        // Wait on the condition
+        qemu_cond_wait(&g_state->thread_cond, &g_state->thread_mutex);
+        qemu_mutex_unlock(&g_state->thread_mutex);
 
-    /* Loop: capture frame -> convert format -> render to screen */
-    while (1)
-    {
-        if (g_state->streamon) {
-            if (marucam_device_read_frame() < 0) {
+        if (g_state->destroying) {
+            break;
+        }
+
+        /* Loop: capture frame -> convert format -> render to screen */
+        while (1) {
+            if (g_state->streamon) {
+                if (marucam_device_read_frame() < 0) {
+                   INFO("Streaming is off ...\n");
+                   break;
+                }
+            } else {
                 INFO("Streaming is off ...\n");
-                goto wait_worker_thread;
+                break;
             }
-        } else {
-            INFO("Streaming is off ...\n");
-            goto wait_worker_thread;
+            //camera_sleep(50);
         }
-        //camera_sleep(50);
     }
+
     return NULL;
 }
 
@@ -509,9 +514,19 @@ int marucam_device_check(int log_flag)
 void marucam_device_init(MaruCamState* state)
 {
     g_state = state;
+    g_state->destroying = false;
     qemu_thread_create(&state->thread_id, marucam_worker_thread, (void*)g_state, QEMU_THREAD_JOINABLE);
 }
 
+void marucam_device_exit(MaruCamState *state)
+{
+    state->destroying = true;
+    qemu_mutex_lock(&state->thread_mutex);
+    qemu_cond_signal(&state->thread_cond);
+    qemu_mutex_unlock(&state->thread_mutex);
+    qemu_thread_join(&state->thread_id);
+}
+
 /* MARUCAM_CMD_OPEN */
 void marucam_device_open(MaruCamState* state)
 {
@@ -740,6 +755,9 @@ void marucam_device_enum_fmt(MaruCamState* state)
         case V4L2_PIX_FMT_YVU420:
             memcpy(&param->stack[3], "YV12", 32);
             break;
+        default:
+            param->errCode = EINVAL;
+            break;
     }
 }
 
index e078bc0f2cbb5a5ac1015e5a13e4c82188dd83f3..38601ca0352907a6a69bfa2ef9965486f6a0c988 100644 (file)
@@ -504,30 +504,36 @@ static void *marucam_worker_thread(void *thread_param)
 {\r
     MaruCamState *state = (MaruCamState *)thread_param;\r
 \r
-wait_worker_thread:\r
-    qemu_mutex_lock(&state->thread_mutex);\r
-    state->streamon = _MC_THREAD_PAUSED;\r
-    qemu_cond_wait(&state->thread_cond, &state->thread_mutex);\r
-    qemu_mutex_unlock(&state->thread_mutex);\r
+    while (1) {\r
+        qemu_mutex_lock(&state->thread_mutex);\r
+        state->streamon = _MC_THREAD_PAUSED;\r
+        qemu_cond_wait(&state->thread_cond, &state->thread_mutex);\r
+        qemu_mutex_unlock(&state->thread_mutex);\r
 \r
-    convert_trial = 10;\r
-    ready_count = 0;\r
-    qemu_mutex_lock(&state->thread_mutex);\r
-    state->streamon = _MC_THREAD_STREAMON;\r
-    qemu_mutex_unlock(&state->thread_mutex);\r
-    INFO("Streaming on ......\n");\r
+        if (state->destroying) {\r
+            break;\r
+        }\r
 \r
-    while (1) {\r
-        if (is_streamon(state)) {\r
-            if (__v4l2_streaming(state) < 0) {\r
+        convert_trial = 10;\r
+        ready_count = 0;\r
+        qemu_mutex_lock(&state->thread_mutex);\r
+        state->streamon = _MC_THREAD_STREAMON;\r
+        qemu_mutex_unlock(&state->thread_mutex);\r
+        INFO("Streaming on ......\n");\r
+\r
+        while (1) {\r
+            if (is_streamon(state)) {\r
+                if (__v4l2_streaming(state) < 0) {\r
+                    INFO("...... Streaming off\n");\r
+                    break;\r
+                }\r
+            } else {\r
                 INFO("...... Streaming off\n");\r
-                goto wait_worker_thread;\r
+                break;\r
             }\r
-        } else {\r
-            INFO("...... Streaming off\n");\r
-            goto wait_worker_thread;\r
         }\r
     }\r
+\r
     return NULL;\r
 }\r
 \r
@@ -555,16 +561,27 @@ int marucam_device_check(int log_flag)
     tmp_fd = open(dev_name, O_RDWR | O_NONBLOCK, 0);\r
     if (tmp_fd < 0) {\r
         fprintf(stdout, "[Webcam] Camera device open failed: %s\n", dev_name);\r
-        goto error;\r
+        gettimeofday(&t2, NULL);\r
+        fprintf(stdout, "[Webcam] Elapsed time: %lu:%06lu\n",\r
+                t2.tv_sec-t1.tv_sec, t2.tv_usec-t1.tv_usec);\r
+        return ret;\r
     }\r
     if (ioctl(tmp_fd, VIDIOC_QUERYCAP, &cap) < 0) {\r
         fprintf(stdout, "[Webcam] Could not qeury video capabilities\n");\r
-        goto error;\r
+        close(tmp_fd);\r
+        gettimeofday(&t2, NULL);\r
+        fprintf(stdout, "[Webcam] Elapsed time: %lu:%06lu\n",\r
+                t2.tv_sec-t1.tv_sec, t2.tv_usec-t1.tv_usec);\r
+        return ret;\r
     }\r
     if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) ||\r
             !(cap.capabilities & V4L2_CAP_STREAMING)) {\r
         fprintf(stdout, "[Webcam] Not supported video driver\n");\r
-        goto error;\r
+        close(tmp_fd);\r
+        gettimeofday(&t2, NULL);\r
+        fprintf(stdout, "[Webcam] Elapsed time: %lu:%06lu\n",\r
+                t2.tv_sec-t1.tv_sec, t2.tv_usec-t1.tv_usec);\r
+        return ret;\r
     }\r
     ret = 1;\r
 \r
@@ -578,7 +595,11 @@ int marucam_device_check(int log_flag)
         format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;\r
 \r
         if (yioctl(tmp_fd, VIDIOC_ENUM_FMT, &format) < 0) {\r
-            goto error;\r
+            close(tmp_fd);\r
+            gettimeofday(&t2, NULL);\r
+            fprintf(stdout, "[Webcam] Elapsed time: %lu:%06lu\n",\r
+                    t2.tv_sec-t1.tv_sec, t2.tv_usec-t1.tv_usec);\r
+            return ret;\r
         }\r
 \r
         do {\r
@@ -593,7 +614,11 @@ int marucam_device_check(int log_flag)
                              (char)(format.pixelformat >> 24));\r
 \r
             if (yioctl(tmp_fd, VIDIOC_ENUM_FRAMESIZES, &size) < 0) {\r
-                goto error;\r
+                close(tmp_fd);\r
+                gettimeofday(&t2, NULL);\r
+                fprintf(stdout, "[Webcam] Elapsed time: %lu:%06lu\n",\r
+                        t2.tv_sec-t1.tv_sec, t2.tv_usec-t1.tv_usec);\r
+                return ret;\r
             }\r
 \r
             if (size.type == V4L2_FRMSIZE_TYPE_DISCRETE) {\r
@@ -621,7 +646,7 @@ int marucam_device_check(int log_flag)
             format.index++;\r
         } while (yioctl(tmp_fd, VIDIOC_ENUM_FMT, &format) >= 0);\r
     }\r
-error:\r
+\r
     close(tmp_fd);\r
     gettimeofday(&t2, NULL);\r
     fprintf(stdout, "[Webcam] Elapsed time: %lu:%06lu\n",\r
@@ -631,10 +656,20 @@ error:
 \r
 void marucam_device_init(MaruCamState *state)\r
 {\r
+    state->destroying = false;\r
     qemu_thread_create(&state->thread_id, marucam_worker_thread, (void *)state,\r
             QEMU_THREAD_JOINABLE);\r
 }\r
 \r
+void marucam_device_exit(MaruCamState *state)\r
+{\r
+    state->destroying = true;\r
+    qemu_mutex_lock(&state->thread_mutex);\r
+    qemu_cond_signal(&state->thread_cond);\r
+    qemu_mutex_unlock(&state->thread_mutex);\r
+    qemu_thread_join(&state->thread_id);\r
+}\r
+\r
 void marucam_device_open(MaruCamState *state)\r
 {\r
     MaruCamParam *param = state->param;\r
@@ -906,6 +941,10 @@ void marucam_device_enum_fmt(MaruCamState *state)
     case V4L2_PIX_FMT_YVU420:\r
         memcpy(&param->stack[3], "YV12", 32);\r
         break;\r
+    default:\r
+        ERR("Invalid fixel format\n");\r
+        param->errCode = EINVAL;\r
+        break;\r
     }\r
 }\r
 \r
@@ -942,6 +981,7 @@ void marucam_device_qctrl(MaruCamState *state)
         i = 3;\r
         break;\r
     default:\r
+        ERR("Invalid control ID\n");\r
         param->errCode = EINVAL;\r
         return;\r
     }\r
index 6ae5e20334fd0960ac49230c1206d9a159b1688b..9c0e126735d91d052ba9c83a0ec546d270887342 100644 (file)
@@ -40,6 +40,12 @@ FWD_DECL(IFilterGraph);
 #define MAX_PIN_NAME     128\r
 #define MAX_FILTER_NAME  128\r
 \r
+#define DECLARE_INTERFACE2(i) \\r
+   _COM_interface i { CONST_VTABLE struct i##Vtbl *lpVtbl; }; \\r
+   typedef CONST_VTABLE struct i##Vtbl i##Vtbl; \\r
+   CONST_VTABLE struct i##Vtbl\r
+#define DECLARE_INTERFACE2_(i,b) DECLARE_INTERFACE2(i)\r
+\r
 typedef LONGLONG REFERENCE_TIME;\r
 typedef long OAFilterState;\r
 typedef DWORD_PTR HSEMAPHORE;\r
@@ -308,10 +314,7 @@ DECLARE_INTERFACE_(IMediaFilter, IPersist)
 };\r
 #undef INTERFACE\r
 #define INTERFACE IBaseFilter\r
-//DECLARE_INTERFACE_(IBaseFilter, IMediaFilter)\r
-_COM_interface IBaseFilter { CONST_VTABLE struct IBaseFilterVtbl *lpVtbl; };\r
-typedef CONST_VTABLE struct IBaseFilterVtbl IBaseFilterVtbl;\r
-CONST_VTABLE struct IBaseFilterVtbl\r
+DECLARE_INTERFACE2_(IBaseFilter, IMediaFilter)\r
 {\r
     STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;\r
     STDMETHOD_(ULONG,AddRef)(THIS) PURE;\r
@@ -331,10 +334,7 @@ CONST_VTABLE struct IBaseFilterVtbl
 };\r
 #undef INTERFACE\r
 #define INTERFACE IFilterGraph\r
-//DECLARE_INTERFACE_(IFilterGraph ,IUnknown)\r
-_COM_interface IFilterGraph { CONST_VTABLE struct IFilterGraphVtbl *lpVtbl; };\r
-typedef CONST_VTABLE struct IFilterGraphVtbl IFilterGraphVtbl;\r
-CONST_VTABLE struct IFilterGraphVtbl\r
+DECLARE_INTERFACE2_(IFilterGraph, IUnknown)\r
 {\r
     STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;\r
     STDMETHOD_(ULONG,AddRef)(THIS) PURE;\r
index 4371037f5ab7ef26182e6ab92180afbf6cb75198..312f86a0f7a2bf7cc0c82b1a08b7d2edb5f8142e 100644 (file)
@@ -116,8 +116,12 @@ static STDMETHODIMP HWCGrabCallback_Grab(IGrabCallback *iface,
     HWCGrabCallback *This = impl_from_IGrabCallback(iface);\r
 \r
     if (This->m_pCallback) {\r
-        This->m_pCallback(dwSize, pBuffer);\r
-        return S_OK;\r
+        HRESULT hr = This->m_pCallback(dwSize, pBuffer);\r
+        if (FAILED(hr)) {\r
+            return E_FAIL;\r
+        } else {\r
+            return S_OK;\r
+        }\r
     }\r
 \r
     return E_FAIL;\r
@@ -1198,11 +1202,17 @@ static long value_convert_to_guest(long min, long max, long value)
 static STDMETHODIMP marucam_device_callbackfn(ULONG dwSize, BYTE *pBuffer)\r
 {\r
     void *tmp_buf;\r
-    uint32_t width, height, fmt;\r
+    uint32_t width, height, fmt, imgsize;\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
+    imgsize = get_sizeimage(fmt, width, height);\r
+\r
+    if (imgsize > (uint32_t)dwSize) {\r
+        ERR("Image size is mismatched\n");\r
+        return E_FAIL;\r
+    }\r
 \r
     switch (g_dwSrcFmt) {\r
     case V4L2_PIX_FMT_YUYV:\r
@@ -1216,6 +1226,9 @@ static STDMETHODIMP marucam_device_callbackfn(ULONG dwSize, BYTE *pBuffer)
         case V4L2_PIX_FMT_YUYV:\r
             memcpy(grab_buf, (void *)pBuffer, (size_t)dwSize);\r
             break;\r
+        default:\r
+            ERR("Invalid pixel format\n");\r
+            return E_FAIL;\r
         }\r
         break;\r
     case V4L2_PIX_FMT_RGB24:\r
@@ -1229,6 +1242,9 @@ static STDMETHODIMP marucam_device_callbackfn(ULONG dwSize, BYTE *pBuffer)
         case V4L2_PIX_FMT_YUYV:\r
             rgb24_to_yuyv(pBuffer, grab_buf, width, height);\r
             break;\r
+        default:\r
+            ERR("Invalid pixel format\n");\r
+            return E_FAIL;\r
         }\r
         break;\r
     case V4L2_PIX_FMT_YUV420:\r
@@ -1242,8 +1258,14 @@ static STDMETHODIMP marucam_device_callbackfn(ULONG dwSize, BYTE *pBuffer)
         case V4L2_PIX_FMT_YUYV:\r
             yuv420_to_yuyv(pBuffer, grab_buf, width, height);\r
             break;\r
+        default:\r
+            ERR("Invalid pixel format\n");\r
+            return E_FAIL;\r
         }\r
         break;\r
+    default:\r
+        ERR("Invalid pixel format\n");\r
+        return E_FAIL;\r
     }\r
 \r
     qemu_mutex_lock(&g_state->thread_mutex);\r
@@ -1724,7 +1746,10 @@ int marucam_device_check(int log_flag)
     hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);\r
     if (FAILED(hr)) {\r
         fprintf(stdout, "[Webcam] failed to CoInitailizeEx\n");\r
-        goto leave_check;\r
+        gettimeofday(&t2, NULL);\r
+        fprintf(stdout, "[Webcam] Elapsed time : %lu.%06lu\n",\r
+                        t2.tv_sec-t1.tv_sec, t2.tv_usec-t1.tv_usec);\r
+        return ret;\r
     }\r
 \r
     hr = CoCreateInstance(&CLSID_FilterGraph, NULL,\r
@@ -1733,7 +1758,11 @@ int marucam_device_check(int log_flag)
                           (void **)&pGB);\r
     if (FAILED(hr)) {\r
         fprintf(stdout, "[Webcam] Failed to create GraphBuilder, 0x%x\n", hr);\r
-        goto leave_check;\r
+        CoUninitialize();\r
+        gettimeofday(&t2, NULL);\r
+        fprintf(stdout, "[Webcam] Elapsed time : %lu.%06lu\n",\r
+                        t2.tv_sec-t1.tv_sec, t2.tv_usec-t1.tv_usec);\r
+        return ret;\r
     }\r
 \r
     hr = CoCreateInstance(&CLSID_CaptureGraphBuilder2, NULL,\r
@@ -1743,13 +1772,24 @@ int marucam_device_check(int log_flag)
     if (FAILED(hr)) {\r
         fprintf(stdout,\r
         "[Webcam] Failed to create CaptureGraphBuilder2, 0x%x\n", hr);\r
-        goto leave_check;\r
+        SAFE_RELEASE(pGB);\r
+        CoUninitialize();\r
+        gettimeofday(&t2, NULL);\r
+        fprintf(stdout, "[Webcam] Elapsed time : %lu.%06lu\n",\r
+                        t2.tv_sec-t1.tv_sec, t2.tv_usec-t1.tv_usec);\r
+        return ret;\r
     }\r
 \r
     hr = pCGB->lpVtbl->SetFiltergraph(pCGB, pGB);\r
     if (FAILED(hr)) {\r
         fprintf(stdout, "[Webcam] Failed to SetFiltergraph, 0x%x\n", hr);\r
-        goto leave_check;\r
+        SAFE_RELEASE(pCGB);\r
+        SAFE_RELEASE(pGB);\r
+        CoUninitialize();\r
+        gettimeofday(&t2, NULL);\r
+        fprintf(stdout, "[Webcam] Elapsed time : %lu.%06lu\n",\r
+                        t2.tv_sec-t1.tv_sec, t2.tv_usec-t1.tv_usec);\r
+        return ret;\r
     }\r
 \r
     hr = CoCreateInstance(&CLSID_SystemDeviceEnum, NULL,\r
@@ -1759,26 +1799,54 @@ int marucam_device_check(int log_flag)
     if (FAILED(hr)) {\r
         fprintf(stdout,\r
             "[Webcam] failed to create instance of CLSID_SystemDeviceEnum\n");\r
-        goto leave_check;\r
+        SAFE_RELEASE(pCGB);\r
+        SAFE_RELEASE(pGB);\r
+        CoUninitialize();\r
+        gettimeofday(&t2, NULL);\r
+        fprintf(stdout, "[Webcam] Elapsed time : %lu.%06lu\n",\r
+                        t2.tv_sec-t1.tv_sec, t2.tv_usec-t1.tv_usec);\r
+        return ret;\r
     }\r
 \r
     hr = pCreateDevEnum->lpVtbl->CreateClassEnumerator(pCreateDevEnum,\r
                                   &CLSID_VideoInputDeviceCategory, &pEnumMK, 0);\r
     if (FAILED(hr)) {\r
         fprintf(stdout, "[Webcam] failed to create class enumerator\n");\r
-        goto leave_check;\r
+        SAFE_RELEASE(pCreateDevEnum);\r
+        SAFE_RELEASE(pCGB);\r
+        SAFE_RELEASE(pGB);\r
+        CoUninitialize();\r
+        gettimeofday(&t2, NULL);\r
+        fprintf(stdout, "[Webcam] Elapsed time : %lu.%06lu\n",\r
+                        t2.tv_sec-t1.tv_sec, t2.tv_usec-t1.tv_usec);\r
+        return ret;\r
     }\r
 \r
     if (!pEnumMK) {\r
         fprintf(stdout, "[Webcam] class enumerator is NULL!!\n");\r
-        goto leave_check;\r
+        SAFE_RELEASE(pCreateDevEnum);\r
+        SAFE_RELEASE(pCGB);\r
+        SAFE_RELEASE(pGB);\r
+        CoUninitialize();\r
+        gettimeofday(&t2, NULL);\r
+        fprintf(stdout, "[Webcam] Elapsed time : %lu.%06lu\n",\r
+                        t2.tv_sec-t1.tv_sec, t2.tv_usec-t1.tv_usec);\r
+        return ret;\r
     }\r
     pEnumMK->lpVtbl->Reset(pEnumMK);\r
 \r
     hr = pEnumMK->lpVtbl->Next(pEnumMK, 1, &pMoniKer, NULL);\r
     if (FAILED(hr) || (hr == S_FALSE)) {\r
         fprintf(stdout, "[Webcam] enum moniker returns a invalid value.\n");\r
-        goto leave_check;\r
+        SAFE_RELEASE(pEnumMK);\r
+        SAFE_RELEASE(pCreateDevEnum);\r
+        SAFE_RELEASE(pCGB);\r
+        SAFE_RELEASE(pGB);\r
+        CoUninitialize();\r
+        gettimeofday(&t2, NULL);\r
+        fprintf(stdout, "[Webcam] Elapsed time : %lu.%06lu\n",\r
+                        t2.tv_sec-t1.tv_sec, t2.tv_usec-t1.tv_usec);\r
+        return ret;\r
     }\r
 \r
     IPropertyBag *pBag = NULL;\r
@@ -1787,7 +1855,15 @@ int marucam_device_check(int log_flag)
                                          (void **)&pBag);\r
     if (FAILED(hr)) {\r
         fprintf(stdout, "[Webcam] failed to bind to storage.\n");\r
-        goto leave_check;\r
+        SAFE_RELEASE(pEnumMK);\r
+        SAFE_RELEASE(pCreateDevEnum);\r
+        SAFE_RELEASE(pCGB);\r
+        SAFE_RELEASE(pGB);\r
+        CoUninitialize();\r
+        gettimeofday(&t2, NULL);\r
+        fprintf(stdout, "[Webcam] Elapsed time : %lu.%06lu\n",\r
+                        t2.tv_sec-t1.tv_sec, t2.tv_usec-t1.tv_usec);\r
+        return ret;\r
     } else {\r
         VARIANT var;\r
         var.vt = VT_BSTR;\r
@@ -1798,7 +1874,15 @@ int marucam_device_check(int log_flag)
                 SysFreeString(var.bstrVal);\r
                 SAFE_RELEASE(pBag);\r
                 SAFE_RELEASE(pMoniKer);\r
-                goto leave_check;\r
+                SAFE_RELEASE(pEnumMK);\r
+                SAFE_RELEASE(pCreateDevEnum);\r
+                SAFE_RELEASE(pCGB);\r
+                SAFE_RELEASE(pGB);\r
+                CoUninitialize();\r
+                gettimeofday(&t2, NULL);\r
+                fprintf(stdout, "[Webcam] Elapsed time : %lu.%06lu\n",\r
+                                t2.tv_sec-t1.tv_sec, t2.tv_usec-t1.tv_usec);\r
+                return ret;\r
             }\r
             device_name = __wchar_to_char(var.bstrVal);\r
             fprintf(stdout, "[Webcam] Device name : %s\n", device_name);\r
@@ -1809,7 +1893,18 @@ int marucam_device_check(int log_flag)
             if (FAILED(hr)) {\r
                 fprintf(stdout,\r
                    "[Webcam] Counldn't bind moniker to filter object!!\n");\r
-                goto leave_check;\r
+                SysFreeString(var.bstrVal);\r
+                SAFE_RELEASE(pBag);\r
+                SAFE_RELEASE(pMoniKer);\r
+                SAFE_RELEASE(pEnumMK);\r
+                SAFE_RELEASE(pCreateDevEnum);\r
+                SAFE_RELEASE(pCGB);\r
+                SAFE_RELEASE(pGB);\r
+                CoUninitialize();\r
+                gettimeofday(&t2, NULL);\r
+                fprintf(stdout, "[Webcam] Elapsed time : %lu.%06lu\n",\r
+                                t2.tv_sec-t1.tv_sec, t2.tv_usec-t1.tv_usec);\r
+                return ret;\r
             } else {\r
                 pSrcFilter->lpVtbl->AddRef(pSrcFilter);\r
             }\r
@@ -1823,7 +1918,16 @@ int marucam_device_check(int log_flag)
     if (hr != S_OK && hr != S_FALSE) {\r
         fprintf(stdout,\r
                 "[Webcam] Counldn't add Video Capture filter to our graph!\n");\r
-        goto leave_check;\r
+        SAFE_RELEASE(pSrcFilter);\r
+        SAFE_RELEASE(pEnumMK);\r
+        SAFE_RELEASE(pCreateDevEnum);\r
+        SAFE_RELEASE(pCGB);\r
+        SAFE_RELEASE(pGB);\r
+        CoUninitialize();\r
+        gettimeofday(&t2, NULL);\r
+        fprintf(stdout, "[Webcam] Elapsed time : %lu.%06lu\n",\r
+                        t2.tv_sec-t1.tv_sec, t2.tv_usec-t1.tv_usec);\r
+        return ret;\r
     }\r
 \r
     hr = pCGB->lpVtbl->FindInterface(pCGB, &PIN_CATEGORY_CAPTURE, 0,\r
@@ -1831,13 +1935,32 @@ int marucam_device_check(int log_flag)
                                        (void **)&pSConfig);\r
     if (FAILED(hr)) {\r
         fprintf(stdout, "[Webcam] failed to FindInterface method\n");\r
-        goto leave_check;\r
+        SAFE_RELEASE(pSrcFilter);\r
+        SAFE_RELEASE(pEnumMK);\r
+        SAFE_RELEASE(pCreateDevEnum);\r
+        SAFE_RELEASE(pCGB);\r
+        SAFE_RELEASE(pGB);\r
+        CoUninitialize();\r
+        gettimeofday(&t2, NULL);\r
+        fprintf(stdout, "[Webcam] Elapsed time : %lu.%06lu\n",\r
+                        t2.tv_sec-t1.tv_sec, t2.tv_usec-t1.tv_usec);\r
+        return ret;\r
     }\r
 \r
     hr = pSConfig->lpVtbl->GetNumberOfCapabilities(pSConfig, &iCount, &iSize);\r
     if (FAILED(hr)) {\r
         fprintf(stdout, "[Webcam] failed to GetNumberOfCapabilities method\n");\r
-        goto leave_check;\r
+        SAFE_RELEASE(pSConfig);\r
+        SAFE_RELEASE(pSrcFilter);\r
+        SAFE_RELEASE(pEnumMK);\r
+        SAFE_RELEASE(pCreateDevEnum);\r
+        SAFE_RELEASE(pCGB);\r
+        SAFE_RELEASE(pGB);\r
+        CoUninitialize();\r
+        gettimeofday(&t2, NULL);\r
+        fprintf(stdout, "[Webcam] Elapsed time : %lu.%06lu\n",\r
+                        t2.tv_sec-t1.tv_sec, t2.tv_usec-t1.tv_usec);\r
+        return ret;\r
     }\r
 \r
     if (iSize == sizeof(VIDEO_STREAM_CONFIG_CAPS)) {\r
@@ -1878,7 +2001,6 @@ int marucam_device_check(int log_flag)
         fprintf(stdout, "[Webcam] Failed to remove source filer. 0x%x\n", hr);\r
     }\r
 \r
-leave_check:\r
     SAFE_RELEASE(pSConfig);\r
     SAFE_RELEASE(pSrcFilter);\r
     SAFE_RELEASE(pCGB);\r
@@ -1899,6 +2021,10 @@ void marucam_device_init(MaruCamState *state)
     g_state = state;\r
 }\r
 \r
+void marucam_device_exit(MaruCamState *state)\r
+{\r
+}\r
+\r
 /* MARUCAM_CMD_OPEN */\r
 void marucam_device_open(MaruCamState *state)\r
 {\r
@@ -1918,25 +2044,49 @@ void marucam_device_open(MaruCamState *state)
     hr = GraphBuilder_Init();\r
     if (FAILED(hr)) {\r
         ERR("GraphBuilder_Init\n");\r
-        goto error_failed;\r
+        DisconnectPins();\r
+        RemoveFilters();\r
+        CloseInterfaces();\r
+        CoUninitialize();\r
+        param->errCode = EINVAL;\r
+        ERR("camera device open failed!!!, [HRESULT : 0x%x]\n", hr);\r
+        return;\r
     }\r
 \r
     hr = BindSourceFilter();\r
     if (FAILED(hr)) {\r
         ERR("BindSourceFilter\n");\r
-        goto error_failed;\r
+        DisconnectPins();\r
+        RemoveFilters();\r
+        CloseInterfaces();\r
+        CoUninitialize();\r
+        param->errCode = EINVAL;\r
+        ERR("camera device open failed!!!, [HRESULT : 0x%x]\n", hr);\r
+        return;\r
     }\r
 \r
     hr = BindTargetFilter();\r
     if (FAILED(hr)) {\r
         ERR("BindTargetFilter\n");\r
-        goto error_failed;\r
+        DisconnectPins();\r
+        RemoveFilters();\r
+        CloseInterfaces();\r
+        CoUninitialize();\r
+        param->errCode = EINVAL;\r
+        ERR("camera device open failed!!!, [HRESULT : 0x%x]\n", hr);\r
+        return;\r
     }\r
 \r
     hr = ConnectFilters();\r
     if (FAILED(hr)) {\r
         ERR("ConnectFilters\n");\r
-        goto error_failed;\r
+        DisconnectPins();\r
+        RemoveFilters();\r
+        CloseInterfaces();\r
+        CoUninitialize();\r
+        param->errCode = EINVAL;\r
+        ERR("camera device open failed!!!, [HRESULT : 0x%x]\n", hr);\r
+        return;\r
     }\r
 \r
     cur_frame_idx = 0;\r
@@ -1948,19 +2098,17 @@ void marucam_device_open(MaruCamState *state)
     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
+        DisconnectPins();\r
+        RemoveFilters();\r
+        CloseInterfaces();\r
+        CoUninitialize();\r
+        param->errCode = EINVAL;\r
+        ERR("camera device open failed!!!, [HRESULT : 0x%x]\n", hr);\r
+        return;\r
     }\r
 \r
     INFO("Opened\n");\r
     return;\r
-\r
-error_failed:\r
-    DisconnectPins();\r
-    RemoveFilters();\r
-    CloseInterfaces();\r
-    CoUninitialize();\r
-    param->errCode = EINVAL;\r
-    ERR("camera device open failed!!!, [HRESULT : 0x%x]\n", hr);\r
 }\r
 \r
 /* MARUCAM_CMD_CLOSE */\r
@@ -2234,6 +2382,10 @@ void marucam_device_enum_fmt(MaruCamState *state)
     case V4L2_PIX_FMT_YVU420:\r
         memcpy(&param->stack[3], "YV12", 32);\r
         break;\r
+    default:\r
+        ERR("Invalid pixel format\n");\r
+        param->errCode = EINVAL;\r
+        break;\r
     }\r
 }\r
 \r
@@ -2274,6 +2426,7 @@ void marucam_device_qctrl(MaruCamState *state)
         i = 3;\r
         break;\r
     default:\r
+        ERR("Invalid control ID\n");\r
         param->errCode = EINVAL;\r
         return;\r
     }\r
@@ -2499,7 +2652,6 @@ void rgb24_to_yuv420(const unsigned char *src, unsigned char *dest,
     /* 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
@@ -2526,9 +2678,6 @@ void rgb24_to_yuv420(const unsigned char *src, unsigned char *dest,
                     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