[Title] fixed an abnormal termination on Windows
authorJinhyung Jo <jinhyung.jo@samsung.com>
Fri, 6 Apr 2012 12:07:52 +0000 (21:07 +0900)
committerJinhyung Jo <jinhyung.jo@samsung.com>
Mon, 9 Apr 2012 08:29:10 +0000 (17:29 +0900)
[Type] Bugfix
[Module] Emulator / Camera
[Priority] Critical
[CQ#]
[Redmine#]
[Problem]
[Cause]
[Solution]
[TestCase]

tizen/src/hw/maru_camera_win32_pci.c
tizen/src/mloop_event.c
tizen/src/mloop_event.h

index b59035c0e057c65974e653fa5f5fdd5548debd0b..acd1ee73b34be5839cbf1d0c5aaec9daf178f25c 100644 (file)
@@ -30,6 +30,7 @@
 #include "qemu-common.h"\r
 #include "maru_camera_common.h"\r
 #include "tizen/src/debug_ch.h"\r
+#include "tizen/src/mloop_event.h"\r
 \r
 #define CINTERFACE\r
 #define COBJMACROS\r
@@ -444,19 +445,12 @@ static STDMETHODIMP HWCMemInputPin_Receive(IMemInputPin *iface, IMediaSample *pS
     if (This->m_pCallback != NULL) {\r
         HRESULT hr;\r
         BYTE* pBuffer = NULL;\r
-        BYTE* pTmp_Buffer = NULL;   /* is this required? */\r
         DWORD dwSize = 0;\r
         dwSize = IMediaSample_GetSize(pSample);\r
         hr = IMediaSample_GetPointer(pSample, &pBuffer);\r
         if (FAILED(hr))\r
             return hr;\r
-\r
-        pTmp_Buffer = (BYTE *)g_malloc0((size_t)dwSize);\r
-        if (!pTmp_Buffer)\r
-            return E_OUTOFMEMORY;\r
-        memcpy((void*)pTmp_Buffer, (void*)pBuffer, (size_t)dwSize);\r
-\r
-        hr = IGrabCallback_Grab(This->m_pCallback, dwSize, pTmp_Buffer);\r
+        hr = IGrabCallback_Grab(This->m_pCallback, dwSize, pBuffer);\r
         if (FAILED(hr))\r
             return hr;\r
     }\r
@@ -1067,17 +1061,11 @@ static long value_convert_to_guest(long min, long max, long value)
 static STDMETHODIMP marucam_device_callbackfn(ULONG dwSize, BYTE *pBuffer)\r
 {\r
     static uint32_t index = 0;\r
-    static uint32_t is_init = 1;\r
     uint32_t width, height;\r
     width = supported_dst_frames[cur_frame_idx].width;\r
     height = supported_dst_frames[cur_frame_idx].height;\r
     void *buf = g_state->vaddr + (g_state->buf_size * index);\r
 \r
-    if (is_init == 1) {\r
-        qemu_thread_get_self(&g_state->thread_id);\r
-        is_init = 0;\r
-    }\r
-\r
     switch (supported_dst_pixfmts[cur_fmt_idx].fmt) {\r
     case V4L2_PIX_FMT_YUV420:\r
         v4lconvert_yuyv_to_yuv420(pBuffer, buf, width, height, 0);\r
@@ -1092,8 +1080,8 @@ static STDMETHODIMP marucam_device_callbackfn(ULONG dwSize, BYTE *pBuffer)
     index = !index;\r
 \r
     if (g_state->req_frame) {\r
-        qemu_irq_raise(g_state->dev.irq[2]);\r
-        g_state->req_frame = 0;\r
+               mloop_evcmd_raise_intr(g_state->dev.irq[2]);\r
+               g_state->req_frame = 0;\r
     }\r
     return S_OK;\r
 }\r
@@ -1104,7 +1092,6 @@ static STDMETHODIMP marucam_device_callbackfn(ULONG dwSize, BYTE *pBuffer)
 \r
 static STDMETHODIMP_(void) CloseInterfaces(void)\r
 {\r
-    INFO("%s\n", __func__);\r
     if (g_pMediaControl)\r
         g_pMediaControl->lpVtbl->Stop(g_pMediaControl);\r
 \r
@@ -1123,7 +1110,6 @@ static STDMETHODIMP_(void) CloseInterfaces(void)
 \r
 static STDMETHODIMP_(void) DeleteMediaType(AM_MEDIA_TYPE *pmt)\r
 {\r
-    INFO("%s\n", __func__);\r
     if (pmt == NULL) {\r
         return;\r
     }\r
@@ -1147,8 +1133,6 @@ static STDMETHODIMP GetPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir, IPin **pp
     IEnumPins *pEnum = NULL;\r
     IPin *pPin = NULL;\r
 \r
-    INFO("%s\n", __func__);\r
-\r
     if (ppPin == NULL)\r
     {\r
         return E_POINTER;\r
@@ -1184,7 +1168,6 @@ static STDMETHODIMP GetPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir, IPin **pp
 static STDMETHODIMP GraphBuilder_Init(void)\r
 {\r
     HRESULT hr;\r
-    INFO("%s\n", __func__);\r
 \r
     hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC, &IID_IGraphBuilder, (void**)&g_pGB);\r
     if (FAILED(hr))\r
@@ -1218,7 +1201,6 @@ static STDMETHODIMP BindSourceFilter(void)
     IEnumMoniker *pEnumMK = NULL;\r
     IMoniker *pMoniKer;\r
 \r
-    INFO("%s\n", __func__);\r
     hr = CoCreateInstance(&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, &IID_ICreateDevEnum, (void**)&pCreateDevEnum);\r
     if (FAILED(hr))\r
         return hr;\r
@@ -1286,7 +1268,6 @@ static STDMETHODIMP BindTargetFilter(void)
     HRESULT hr;\r
     hr = HWCFilter_Construct(&g_pDstFilter);\r
 \r
-    INFO("%s\n", __func__);\r
     if (SUCCEEDED(hr) && g_pDstFilter)\r
     {\r
         hr = g_pGB->lpVtbl->AddFilter(g_pGB, g_pDstFilter, L"HWCFilter");\r
@@ -1302,7 +1283,6 @@ static STDMETHODIMP ConnectFilters(void)
 {\r
     HRESULT hr;\r
 \r
-    INFO("%s\n", __func__);\r
     hr = GetPin(g_pSrcFilter, PINDIR_OUTPUT , &g_pOutputPin);\r
     if (FAILED(hr))\r
         return hr;\r
@@ -1321,7 +1301,6 @@ static STDMETHODIMP SetDefaultValues(void)
     IAMStreamConfig *pSConfig;\r
     int iCount = 0, iSize = 0;\r
 \r
-    INFO("%s\n", __func__);\r
     hr = g_pCGB->lpVtbl->FindInterface(g_pCGB, &PIN_CATEGORY_CAPTURE, 0, g_pSrcFilter, &IID_IAMStreamConfig, (void**)&pSConfig);\r
     if (FAILED(hr)) {\r
         ERR("failed to FindInterface method\n");\r
@@ -1375,7 +1354,6 @@ static STDMETHODIMP SetResolution(LONG width, LONG height)
     IAMStreamConfig* vsc = NULL;\r
     AM_MEDIA_TYPE* pmt = NULL;\r
 \r
-    INFO("%s\n", __func__);\r
     hr = g_pCGB->lpVtbl->FindInterface(g_pCGB, &PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, g_pSrcFilter, &IID_IAMStreamConfig, (void**)&vsc);\r
     if (FAILED(hr))\r
         return hr;\r
@@ -1410,8 +1388,6 @@ static STDMETHODIMP QueryVideoProcAmp(long nProperty, long *pMin, long *pMax, lo
     long Flags;\r
     IAMVideoProcAmp *pProcAmp = NULL;\r
 \r
-    INFO("%s\n", __func__);\r
-\r
     hr = g_pSrcFilter->lpVtbl->QueryInterface(g_pSrcFilter, &IID_IAMVideoProcAmp, (void**)&pProcAmp);\r
     if (FAILED(hr)) {\r
         return hr;\r
@@ -1429,7 +1405,6 @@ static STDMETHODIMP GetVideoProcAmp(long nProperty, long *pValue)
     long Flags;\r
     IAMVideoProcAmp *pProcAmp = NULL;\r
 \r
-    INFO("%s\n", __func__);\r
     hr = g_pSrcFilter->lpVtbl->QueryInterface(g_pSrcFilter, &IID_IAMVideoProcAmp, (void**)&pProcAmp);\r
     if (FAILED(hr))\r
         return hr;\r
@@ -1473,9 +1448,6 @@ void marucam_device_open(MaruCamState* state)
     MaruCamParam *param = state->param;\r
     param->top = 0;\r
 \r
-    INFO("%s\n", __func__);\r
-    CoInitialize(NULL);\r
-\r
     hr = GraphBuilder_Init();\r
     if (FAILED(hr)) {\r
         ERR("GraphBuilder_Init\n");\r
@@ -1500,7 +1472,7 @@ void marucam_device_open(MaruCamState* state)
         goto error_failed;\r
     }\r
 \r
-    g_dwAvgInterval = 333333;\r
+    g_dwAvgInterval = 666666;\r
     g_dwFourcc = MAKEFOURCC('Y','U','Y','2');\r
     g_dwHeight = 480;\r
     g_dwWidth = 640;\r
@@ -1515,7 +1487,6 @@ void marucam_device_open(MaruCamState* state)
 \r
 error_failed:\r
     CloseInterfaces();\r
-    CoUninitialize();\r
     param->errCode = EINVAL;\r
     ERR("camera device open failed!!!, [HRESULT : 0x%x]\n", hr);\r
 }\r
@@ -1527,7 +1498,6 @@ void marucam_device_close(MaruCamState* state)
     param->top = 0;\r
 \r
     CloseInterfaces();\r
-    CoUninitialize();\r
     INFO("Close successfully!!!\n");\r
 }\r
 \r
@@ -1539,7 +1509,6 @@ void marucam_device_start_preview(MaruCamState* state)
     MaruCamParam *param = state->param;\r
     param->top = 0;\r
 \r
-    INFO("%s\n", __func__);\r
     assert(g_pCallback != NULL);\r
     hr = ((HWCInPin*)g_pInputPin)->SetGrabCallbackIF(g_pInputPin, g_pCallback);\r
     if (FAILED(hr)) {\r
@@ -1601,7 +1570,6 @@ void marucam_device_s_param(MaruCamState* state)
     MaruCamParam *param = state->param;\r
 \r
     param->top = 0;\r
-    TRACE("setting fps : %d/%d\n", param->stack[0], param->stack[1]);\r
 }\r
 \r
 // MARUCAM_CMD_G_PARAM\r
@@ -1610,7 +1578,6 @@ void marucam_device_g_param(MaruCamState* state)
     MaruCamParam *param = state->param;\r
 \r
     param->top = 0;\r
-    TRACE("getting fps : 30/1\n");\r
 \r
     param->stack[0] = 0x1000; // V4L2_CAP_TIMEPERFRAME\r
     param->stack[1] = 1; // numerator;\r
index 494f75748422212302083f79fdc1874d4e85f107..3d5502f00d688f6801a64c1625f827b6f9f337a3 100644 (file)
@@ -37,6 +37,7 @@
 #include "qobject.h"\r
 #include "qemu-common.h"\r
 #include "hw/usb.h"\r
+#include "hw/irq.h"\r
 #include "mloop_event.h"\r
 \r
 #define error_report(x, ...)\r
@@ -62,6 +63,8 @@ struct mloop_evpack {
 \r
 #define MLOOP_EVTYPE_USB_ADD    1\r
 #define MLOOP_EVTYPE_USB_DEL    2\r
+#define MLOOP_EVTYPE_INTR_UP    3\r
+#define MLOOP_EVTYPE_INTR_DOWN  4\r
 \r
 static struct mloop_evsock mloop = {-1,0,0};\r
 \r
@@ -215,6 +218,24 @@ static void mloop_evhandle_usb_del(char *name)
     }\r
 }\r
 \r
+static void mloop_evhandle_intr_up(long data)\r
+{\r
+       if (data == 0) {\r
+               return;\r
+       }\r
+\r
+       qemu_irq_raise((qemu_irq)data);\r
+}\r
+\r
+static void mloop_evhandle_intr_down(long data)\r
+{\r
+       if (data == 0) {\r
+               return;\r
+       }\r
+\r
+       qemu_irq_lower((qemu_irq)data);\r
+}\r
+\r
 static void mloop_evcb_recv(struct mloop_evsock *ev)\r
 {\r
     struct mloop_evpack pack;\r
@@ -245,7 +266,13 @@ static void mloop_evcb_recv(struct mloop_evsock *ev)
         break;\r
     case MLOOP_EVTYPE_USB_DEL:\r
         mloop_evhandle_usb_del(pack.data);\r
-        break;\r
+               break;\r
+       case MLOOP_EVTYPE_INTR_UP:\r
+               mloop_evhandle_intr_up(ntohl(*(long*)&pack.data[0]));\r
+               break;\r
+       case MLOOP_EVTYPE_INTR_DOWN:\r
+               mloop_evhandle_intr_down(ntohl(*(long*)&pack.data[0]));\r
+               break;\r
     default:\r
         break;\r
     }\r
@@ -308,3 +335,23 @@ void mloop_evcmd_set_usbdisk(void *dev)
 {\r
        usbdisk = (USBDevice *)dev;\r
 }\r
+\r
+void mloop_evcmd_raise_intr(void *irq)\r
+{\r
+       struct mloop_evpack pack;\r
+       memset((void*)&pack, 0, sizeof(struct mloop_evpack));\r
+       pack.type = htons(MLOOP_EVTYPE_INTR_UP);\r
+       pack.size = htons(8);\r
+       *(long*)&pack.data[0] = htonl((long)irq);\r
+       mloop_evsock_send(&mloop, &pack);\r
+}\r
+\r
+void mloop_evcmd_lower_intr(void *irq)\r
+{\r
+       struct mloop_evpack pack;\r
+       memset((void*)&pack, 0, sizeof(struct mloop_evpack));\r
+       pack.type = htons(MLOOP_EVTYPE_INTR_DOWN);\r
+       pack.size = htons(8);\r
+       *(long*)&pack.data[0] = htonl((long)irq);\r
+       mloop_evsock_send(&mloop, &pack);\r
+}\r
index 2470c70a45384b701462dc1da683a846d691f0ec..94bd8213b55edd0810b55eb3c72778d2274048ce 100644 (file)
@@ -43,6 +43,8 @@ int mloop_evcmd_get_usbkbd_status(void);
 void mloop_evcmd_set_usbkbd(void *dev);\r
 void mloop_evcmd_set_usbdisk(void *dev);\r
 \r
+void mloop_evcmd_raise_intr(void *irq);\r
+void mloop_evcmd_lower_intr(void *irq);\r
 \r
 #ifdef __cplusplus\r
 }\r