Update for multi-HAL interface 62/314262/3 accepted/tizen/unified/20240805.114554 accepted/tizen/unified/dev/20240807.093103 accepted/tizen/unified/toolchain/20240812.133424 accepted/tizen/unified/x/20240806.012806 accepted/tizen/unified/x/asan/20240813.231907
authorJeongmo Yang <jm80.yang@samsung.com>
Tue, 9 Jul 2024 09:59:54 +0000 (18:59 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Thu, 18 Jul 2024 01:00:10 +0000 (10:00 +0900)
[Version] 1.0.0
[Issue Type] New feature

Change-Id: I8974c03d46f1b916a9ba93f82f32c7d35ca8d426
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
packaging/hal-backend-camera-v4l2.spec
src/hal_backend_camera_v4l2.c

index beafe871fa80958e4145bd8ac2a11c56e87ad997..4df07fdbcbf7e2f9e5f0b33e01bb32d11801c469 100644 (file)
@@ -8,7 +8,7 @@
 
 Name:       hal-backend-camera-v4l2
 Summary:    Tizen Camera Hal using generic V4L2 interface
-Version:    0.0.8
+Version:    1.0.0
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index 16d35ddc0bc607f2fb667efc08b861e51dee18cf..ac799a8ea4ecdd14d16ea024eba2d796c18aea86 100644 (file)
@@ -53,6 +53,7 @@
        (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;
@@ -2748,11 +2749,34 @@ int camera_v4l2_set_batch_command(void *camera_handle, camera_batch_command_cont
 
 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;
@@ -2790,8 +2814,6 @@ static int camera_v4l2_backend_init(void **data)
        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);
@@ -2805,7 +2827,13 @@ static int camera_v4l2_backend_exit(void *data)
        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;
 }