(fourcc >> 24) & 0xff
+static gboolean g_free_funcs_on_exit;
static gboolean g_is_virtual_camera_mode;
static uint32_t g_virtual_camera_bytesused;
static gulong g_virtual_camera_frame_delay;
static int camera_v4l2_backend_init(void **data)
{
- hal_backend_camera_funcs *funcs;
+ hal_backend_camera_funcs *funcs = NULL;
- funcs = calloc(1, sizeof(hal_backend_camera_funcs));
- if (!funcs)
- return CAMERA_ERROR_OUT_OF_MEMORY;
+ if (!data) {
+ LOGE("NULL data");
+ return -1;
+ }
+
+ if (*data) {
+ g_free_funcs_on_exit = FALSE;
+
+ LOGI("use data for funcs");
+
+ funcs = (hal_backend_camera_funcs *)*data;
+ } else {
+ g_free_funcs_on_exit = TRUE;
+
+ LOGI("allocate new one for funcs");
+
+ funcs = calloc(1, sizeof(hal_backend_camera_funcs));
+ if (!funcs) {
+ LOGE("funcs[size:%zu] failed", sizeof(hal_backend_camera_funcs));
+ return -1;
+ }
+
+ *data = (void *)funcs;
+ }
+
+ LOGI("camera HAL funcs[%p]", funcs);
funcs->init = camera_v4l2_init;
funcs->deinit = camera_v4l2_deinit;
funcs->set_extra_preview_gop_interval = camera_v4l2_set_extra_preview_gop_interval;
funcs->get_extra_preview_gop_interval = camera_v4l2_get_extra_preview_gop_interval;
- *data = (void *)funcs;
-
g_is_virtual_camera_mode = getenv(ENV_VIRTUAL_CAMERA) ? TRUE : FALSE;
LOGW("VIRTUAL CAMERA mode[%d]", g_is_virtual_camera_mode);
if (!data)
return 0;
- free(data);
+ if (g_free_funcs_on_exit) {
+ LOGI("release funcs[%p]", data);
+ free(data);
+ } else {
+ LOGI("clear function pointer set by backend");
+ memset(data, 0x0, sizeof(hal_backend_camera_funcs));
+ }
return 0;
}