{\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
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
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
(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
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
\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
case V4L2_PIX_FMT_YVU420:\r
memcpy(¶m->stack[3], "YV12", 32);\r
break;\r
+ default:\r
+ ERR("Invalid fixel format\n");\r
+ param->errCode = EINVAL;\r
+ break;\r
}\r
}\r
\r
i = 3;\r
break;\r
default:\r
+ ERR("Invalid control ID\n");\r
param->errCode = EINVAL;\r
return;\r
}\r
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
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
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
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
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
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
(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
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
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
(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
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
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
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
(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
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
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
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
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
case V4L2_PIX_FMT_YVU420:\r
memcpy(¶m->stack[3], "YV12", 32);\r
break;\r
+ default:\r
+ ERR("Invalid pixel format\n");\r
+ param->errCode = EINVAL;\r
+ break;\r
}\r
}\r
\r
i = 3;\r
break;\r
default:\r
+ ERR("Invalid control ID\n");\r
param->errCode = EINVAL;\r
return;\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 + 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