maru_camera_win32 : support RGB24 and I420 image format
authorjinhyung.jo <jinhyung.jo@samsung.com>
Wed, 31 Oct 2012 04:58:49 +0000 (13:58 +0900)
committerjinhyung.jo <jinhyung.jo@samsung.com>
Wed, 31 Oct 2012 04:58:49 +0000 (13:58 +0900)
added a routine for image converting.
    - RGB24 -> I420, YV12, YUY2
    - I420 -> YV12, YUY2

Signed-off-by: Jinhyung Jo <jinhyung.jo@samsung.com>
tizen/src/hw/maru_camera_win32_pci.c

index bd972170884b8d48df199d1629c20d1474e35ccc..4371037f5ab7ef26182e6ab92180afbf6cb75198 100644 (file)
@@ -53,7 +53,7 @@ extern int hax_enabled(void);
             (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
@@ -61,8 +61,7 @@ typedef HRESULT (STDAPICALLTYPE *CallbackFn)(ULONG dwSize, BYTE *pBuffer);
  * 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
@@ -74,12 +73,13 @@ static inline HWCGrabCallback *impl_from_IGrabCallback(IGrabCallback *iface)
     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
@@ -100,10 +100,9 @@ static STDMETHODIMP_(ULONG) HWCGrabCallback_Release(IGrabCallback *iface)
 {\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
@@ -111,7 +110,8 @@ static STDMETHODIMP_(ULONG) HWCGrabCallback_Release(IGrabCallback *iface)
     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
@@ -123,7 +123,8 @@ static STDMETHODIMP HWCGrabCallback_Grab(IGrabCallback *iface, ULONG dwSize, BYT
     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
@@ -131,8 +132,7 @@ static STDMETHODIMP HWCGrabCallback_SetCallback(IGrabCallback *iface, CallbackFn
     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
@@ -141,7 +141,8 @@ static IGrabCallbackVtbl HWCGrabCallback_Vtbl =
 \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
@@ -160,8 +161,7 @@ static STDMETHODIMP HWCGrabCallback_Construct(IGrabCallback **ppv)
  * 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
@@ -189,13 +189,13 @@ static STDMETHODIMP HWCPin_QueryInterface(IPin *iface, REFIID riid, void **ppv)
 \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
@@ -215,8 +215,7 @@ static STDMETHODIMP_(ULONG) HWCPin_Release(IPin *iface)
 {\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
@@ -227,14 +226,16 @@ static STDMETHODIMP_(ULONG) HWCPin_Release(IPin *iface)
             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
@@ -246,19 +247,22 @@ static STDMETHODIMP HWCPin_Connect(IPin *iface, IPin *pReceivePin, const AM_MEDI
         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
@@ -307,8 +311,9 @@ static STDMETHODIMP HWCPin_ConnectedTo(IPin *iface, IPin **ppPin)
 {\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
@@ -332,22 +337,24 @@ static STDMETHODIMP HWCPin_QueryPinInfo(IPin *iface, PIN_INFO *pInfo)
 {\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
@@ -355,29 +362,35 @@ static STDMETHODIMP HWCPin_QueryDirection(IPin *iface, PIN_DIRECTION *pPinDir)
 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
@@ -397,24 +410,26 @@ static STDMETHODIMP HWCPin_EndFlush(IPin *iface)
     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
@@ -434,8 +449,7 @@ static STDMETHODIMP_(ULONG) HWCMemInputPin_Release(IMemInputPin *iface)
 {\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
@@ -446,19 +460,21 @@ static STDMETHODIMP_(ULONG) HWCMemInputPin_Release(IMemInputPin *iface)
             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
@@ -477,12 +493,15 @@ static STDMETHODIMP HWCMemInputPin_GetAllocator(IMemInputPin *iface, IMemAllocat
     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
@@ -497,12 +516,15 @@ static STDMETHODIMP HWCMemInputPin_NotifyAllocator(IMemInputPin *iface, IMemAllo
     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
@@ -512,7 +534,7 @@ static STDMETHODIMP HWCMemInputPin_Receive(IMemInputPin *iface, IMediaSample *pS
     }\r
     if (This->m_pCallback != NULL) {\r
         HRESULT hr;\r
-        BYTEpBuffer = NULL;\r
+        BYTE *pBuffer = NULL;\r
         DWORD dwSize = 0;\r
         dwSize = IMediaSample_GetSize(pSample);\r
         hr = IMediaSample_GetPointer(pSample, &pBuffer);\r
@@ -523,27 +545,32 @@ static STDMETHODIMP HWCMemInputPin_Receive(IMemInputPin *iface, IMediaSample *pS
         }\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
@@ -569,8 +596,7 @@ static STDMETHODIMP HWCPin_SetCallback(IPin *iface, IGrabCallback *pCaptureCB)
 }\r
 \r
 \r
-static IPinVtbl HWCPin_Vtbl =\r
-{\r
+static IPinVtbl HWCPin_Vtbl = {\r
     HWCPin_QueryInterface,\r
     HWCPin_AddRef,\r
     HWCPin_Release,\r
@@ -591,8 +617,7 @@ static IPinVtbl HWCPin_Vtbl =
     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
@@ -631,8 +656,7 @@ static STDMETHODIMP HWCInPin_Construct(IBaseFilter *pFilter, IPin **ppv)
  * 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
@@ -644,10 +668,12 @@ static inline HWCEnumPins *impl_from_IEnumPins(IEnumPins *iface)
     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
@@ -676,21 +702,22 @@ static STDMETHODIMP_(ULONG) HWCEnumPins_Release(IEnumPins *iface)
             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
@@ -723,14 +750,16 @@ static STDMETHODIMP HWCEnumPins_Reset(IEnumPins *iface)
     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
@@ -741,8 +770,7 @@ static STDMETHODIMP HWCEnumPins_Clone(IEnumPins *iface, IEnumPins **ppEnum)
     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
@@ -753,7 +781,8 @@ static IEnumPinsVtbl HWCEnumPins_Vtbl =
 };\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
@@ -778,8 +807,7 @@ static STDMETHODIMP HWCEnumPins_Construct(IBaseFilter *pFilter, int nPos, IEnumP
  * 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
@@ -792,16 +820,17 @@ static inline HWCFilter *impl_from_IBaseFilter(IBaseFilter *iface)
     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
@@ -826,7 +855,7 @@ static STDMETHODIMP_(ULONG) HWCFilter_Release(IBaseFilter *iface)
         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
@@ -835,24 +864,28 @@ static STDMETHODIMP_(ULONG) HWCFilter_Release(IBaseFilter *iface)
 \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
@@ -878,7 +911,7 @@ static STDMETHODIMP HWCFilter_Run(IBaseFilter *iface, REFERENCE_TIME tStart)
 {\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
@@ -893,26 +926,29 @@ static STDMETHODIMP HWCFilter_Run(IBaseFilter *iface, REFERENCE_TIME tStart)
 \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
@@ -920,14 +956,18 @@ static STDMETHODIMP HWCFilter_FindPin(IBaseFilter *iface, LPCWSTR Id, IPin **ppP
     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
@@ -935,8 +975,9 @@ static STDMETHODIMP HWCFilter_QueryFilterInfo(IBaseFilter *iface, FILTER_INFO *p
     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
@@ -944,13 +985,13 @@ static STDMETHODIMP HWCFilter_JoinFilterGraph(IBaseFilter *iface, IFilterGraph *
     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
@@ -1021,6 +1062,7 @@ IGrabCallback *g_pCallback;
 #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
@@ -1064,15 +1106,17 @@ struct marucam_qctrl {
 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
@@ -1099,12 +1143,19 @@ static uint32_t get_bytesperline(uint32_t pixfmt, uint32_t width)
 \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
@@ -1147,38 +1198,70 @@ 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;\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
@@ -1193,11 +1276,13 @@ static STDMETHODIMP marucam_device_callbackfn(ULONG dwSize, BYTE *pBuffer)
 \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
@@ -1228,33 +1313,31 @@ static STDMETHODIMP_(void) DeleteMediaType(AM_MEDIA_TYPE *pmt)
     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
@@ -1270,13 +1353,15 @@ static STDMETHODIMP GraphBuilder_Init(void)
 {\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
@@ -1288,17 +1373,20 @@ static STDMETHODIMP GraphBuilder_Init(void)
         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
@@ -1310,21 +1398,24 @@ static STDMETHODIMP BindSourceFilter(void)
     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
@@ -1332,28 +1423,25 @@ static STDMETHODIMP BindSourceFilter(void)
     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
@@ -1363,11 +1451,9 @@ static STDMETHODIMP BindSourceFilter(void)
         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
@@ -1383,11 +1469,9 @@ static STDMETHODIMP BindTargetFilter(void)
     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
@@ -1458,56 +1542,63 @@ static STDMETHODIMP RemoveFilters(void)
 #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
@@ -1515,8 +1606,8 @@ static STDMETHODIMP SetFormat(uint32_t dwWidth, uint32_t dwHeight,
                                 (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
@@ -1528,8 +1619,8 @@ static STDMETHODIMP SetFormat(uint32_t dwWidth, uint32_t dwHeight,
         }\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
@@ -1538,18 +1629,22 @@ static STDMETHODIMP SetFormat(uint32_t dwWidth, uint32_t dwHeight,
     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
@@ -1561,9 +1656,12 @@ static STDMETHODIMP GetVideoProcAmp(long nProperty, long *pValue)
     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
@@ -1579,11 +1677,15 @@ static STDMETHODIMP SetVideoProcAmp(long nProperty, long value)
     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
@@ -1591,7 +1693,7 @@ static STDMETHODIMP SetVideoProcAmp(long nProperty, long value)
     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
@@ -1628,7 +1730,7 @@ int marucam_device_check(int log_flag)
     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
@@ -1637,7 +1739,7 @@ int marucam_device_check(int log_flag)
     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
@@ -1653,7 +1755,7 @@ int marucam_device_check(int log_flag)
     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
@@ -1703,7 +1805,7 @@ int marucam_device_check(int log_flag)
             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
@@ -1726,33 +1828,28 @@ int marucam_device_check(int log_flag)
 \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
@@ -1797,16 +1894,16 @@ leave_check:
 }\r
 \r
 /* MARUCAM_CMD_INIT */\r
-void marucam_device_init(MaruCamStatestate)\r
+void marucam_device_init(MaruCamState *state)\r
 {\r
     g_state = state;\r
 }\r
 \r
 /* MARUCAM_CMD_OPEN */\r
-void marucam_device_open(MaruCamStatestate)\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
@@ -1847,7 +1944,8 @@ void marucam_device_open(MaruCamState* state)
 \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
@@ -1866,7 +1964,7 @@ error_failed:
 }\r
 \r
 /* MARUCAM_CMD_CLOSE */\r
-void marucam_device_close(MaruCamStatestate)\r
+void marucam_device_close(MaruCamState *state)\r
 {\r
     MaruCamParam *param = state->param;\r
     param->top = 0;\r
@@ -1879,7 +1977,7 @@ void marucam_device_close(MaruCamState* state)
 }\r
 \r
 /* MARUCAM_CMD_START_PREVIEW */\r
-void marucam_device_start_preview(MaruCamStatestate)\r
+void marucam_device_start_preview(MaruCamState *state)\r
 {\r
     HRESULT hr;\r
     uint32_t pixfmt, width, height;\r
@@ -1899,13 +1997,24 @@ void marucam_device_start_preview(MaruCamState* state)
     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
@@ -1921,7 +2030,7 @@ void marucam_device_start_preview(MaruCamState* state)
 }\r
 \r
 /* MARUCAM_CMD_STOP_PREVIEW */\r
-void marucam_device_stop_preview(MaruCamStatestate)\r
+void marucam_device_stop_preview(MaruCamState *state)\r
 {\r
     HRESULT hr;\r
     MaruCamParam *param = state->param;\r
@@ -1932,7 +2041,7 @@ void marucam_device_stop_preview(MaruCamState* state)
     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
@@ -1946,13 +2055,17 @@ void marucam_device_stop_preview(MaruCamState* state)
         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(MaruCamStatestate)\r
+void marucam_device_s_param(MaruCamState *state)\r
 {\r
     MaruCamParam *param = state->param;\r
 \r
@@ -1961,7 +2074,7 @@ void marucam_device_s_param(MaruCamState* state)
 }\r
 \r
 /* MARUCAM_CMD_G_PARAM */\r
-void marucam_device_g_param(MaruCamStatestate)\r
+void marucam_device_g_param(MaruCamState *state)\r
 {\r
     MaruCamParam *param = state->param;\r
 \r
@@ -1975,7 +2088,7 @@ void marucam_device_g_param(MaruCamState* state)
 }\r
 \r
 /* MARUCAM_CMD_S_FMT */\r
-void marucam_device_s_fmt(MaruCamStatestate)\r
+void marucam_device_s_fmt(MaruCamState *state)\r
 {\r
     uint32_t width, height, pixfmt, pidx, fidx;\r
     MaruCamParam *param = state->param;\r
@@ -2007,7 +2120,7 @@ void marucam_device_s_fmt(MaruCamState* state)
 \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
@@ -2034,7 +2147,7 @@ void marucam_device_s_fmt(MaruCamState* state)
 }\r
 \r
 /* MARUCAM_CMD_G_FMT */\r
-void marucam_device_g_fmt(MaruCamStatestate)\r
+void marucam_device_g_fmt(MaruCamState *state)\r
 {\r
     uint32_t width, height, pixfmt;\r
     MaruCamParam *param = state->param;\r
@@ -2056,7 +2169,7 @@ void marucam_device_g_fmt(MaruCamState* state)
     TRACE("Get format...\n");\r
 }\r
 \r
-void marucam_device_try_fmt(MaruCamStatestate)\r
+void marucam_device_try_fmt(MaruCamState *state)\r
 {\r
     uint32_t width, height, pixfmt, i;\r
     MaruCamParam *param = state->param;\r
@@ -2096,7 +2209,7 @@ void marucam_device_try_fmt(MaruCamState* state)
     param->stack[7] = 0;\r
 }\r
 \r
-void marucam_device_enum_fmt(MaruCamStatestate)\r
+void marucam_device_enum_fmt(MaruCamState *state)\r
 {\r
     uint32_t index;\r
     MaruCamParam *param = state->param;\r
@@ -2124,7 +2237,7 @@ void marucam_device_enum_fmt(MaruCamState* state)
     }\r
 }\r
 \r
-void marucam_device_qctrl(MaruCamStatestate)\r
+void marucam_device_qctrl(MaruCamState *state)\r
 {\r
     HRESULT hr;\r
     uint32_t id, i;\r
@@ -2139,25 +2252,25 @@ void marucam_device_qctrl(MaruCamState* state)
     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
@@ -2196,10 +2309,10 @@ void marucam_device_qctrl(MaruCamState* state)
     param->stack[4] = MARUCAM_CTRL_VALUE_MID;  /* default_value */\r
     param->stack[5] = V4L2_CTRL_FLAG_SLIDER;\r
     /* name field setting */\r
-    memcpy(&param->stack[6], (void*)name, sizeof(name)/sizeof(name[0]));\r
+    memcpy(&param->stack[6], (void *)name, sizeof(name)/sizeof(name[0]));\r
 }\r
 \r
-void marucam_device_s_ctrl(MaruCamStatestate)\r
+void marucam_device_s_ctrl(MaruCamState *state)\r
 {\r
     HRESULT hr;\r
     uint32_t i;\r
@@ -2239,7 +2352,7 @@ void marucam_device_s_ctrl(MaruCamState* state)
     }\r
 }\r
 \r
-void marucam_device_g_ctrl(MaruCamStatestate)\r
+void marucam_device_g_ctrl(MaruCamState *state)\r
 {\r
     HRESULT hr;\r
     uint32_t i;\r
@@ -2279,7 +2392,7 @@ void marucam_device_g_ctrl(MaruCamState* state)
                 qctrl_tbl[i].max, get_val);\r
 }\r
 \r
-void marucam_device_enum_fsizes(MaruCamStatestate)\r
+void marucam_device_enum_fsizes(MaruCamState *state)\r
 {\r
     uint32_t index, pixfmt, i;\r
     MaruCamParam *param = state->param;\r
@@ -2293,8 +2406,9 @@ void marucam_device_enum_fsizes(MaruCamState* state)
         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
@@ -2306,7 +2420,7 @@ void marucam_device_enum_fsizes(MaruCamState* state)
     param->stack[1] = supported_dst_frames[index].height;\r
 }\r
 \r
-void marucam_device_enum_fintv(MaruCamStatestate)\r
+void marucam_device_enum_fintv(MaruCamState *state)\r
 {\r
     MaruCamParam *param = state->param;\r
 \r
@@ -2324,7 +2438,7 @@ void marucam_device_enum_fintv(MaruCamState* state)
     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
@@ -2362,3 +2476,172 @@ void v4lconvert_yuyv_to_yuv420(const unsigned char *src, unsigned char *dest,
         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