summaryrefslogtreecommitdiff
path: root/exception/resource_camera.c
diff options
context:
space:
mode:
Diffstat (limited to 'exception/resource_camera.c')
-rw-r--r--exception/resource_camera.c233
1 files changed, 233 insertions, 0 deletions
diff --git a/exception/resource_camera.c b/exception/resource_camera.c
new file mode 100644
index 0000000..e3e4043
--- /dev/null
+++ b/exception/resource_camera.c
@@ -0,0 +1,233 @@
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ *
+ * Contact: Jin Yoon <jinny.yoon@samsung.com>
+ * Geunsun Lee <gs86.lee@samsung.com>
+ * Eunyoung Lee <ey928.lee@samsung.com>
+ * Junkyu Han <junkyu.han@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <camera.h>
+#include <glib.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <tizen.h>
+
+#include "log.h"
+#include "resource/resource_camera.h"
+
+#define RESOLUTION_W 320
+#define RESOLUTION_H 240
+
+static int __init(void);
+static void __completed_cb(void *user_data);
+static bool __resolution_list_cb(int width, int height, void *user_data);
+static void __capturing_cb(camera_image_data_s *image, camera_image_data_s *postview,
+ camera_image_data_s *thumbnail, void *user_data);
+
+struct __camera_data {
+ camera_h cam_handle;
+ int resolution_w;
+ int resolution_h;
+ void *captured_file;
+ unsigned int image_size;
+ capture_completed_cb completed_cb;
+ void *completed_cb_data;
+};
+
+static struct __camera_data *camera_data = NULL;
+
+int resource_capture_camera(capture_completed_cb capture_completed, void *user_data)
+{
+ camera_state_e state;
+ int ret = CAMERA_ERROR_NONE;
+
+ if (camera_data == NULL) {
+ _I("Camera is not initialized");
+ ret = __init();
+ if (ret < 0) {
+ _E("Failed to initialize camera");
+ return -1;
+ }
+ }
+
+ ret = camera_get_state(camera_data->cam_handle, &state);
+ if (ret != CAMERA_ERROR_NONE) {
+ _E("Failed to get camera state");
+ return -1;
+ }
+
+ if (state >= CAMERA_STATE_CAPTURING) {
+ _D("Camera is now capturing");
+ return 0;
+ }
+
+ if (state != CAMERA_STATE_PREVIEW) {
+ _I("Preview is not started");
+ ret = camera_start_preview(camera_data->cam_handle);
+ if (ret != CAMERA_ERROR_NONE) {
+ _E("Failed to start preview");
+ return -1;
+ }
+ }
+
+ ret = camera_start_capture(camera_data->cam_handle, __capturing_cb, __completed_cb, camera_data);
+ if (ret != CAMERA_ERROR_NONE) {
+ _E("Failed to start capturing");
+ return -1;
+ }
+
+ camera_data->completed_cb = capture_completed;
+ camera_data->completed_cb_data = user_data;
+
+ return 0;
+}
+
+void resource_close_camera(void)
+{
+ if (camera_data == NULL)
+ return;
+
+ camera_stop_preview(camera_data->cam_handle);
+
+ camera_destroy(camera_data->cam_handle);
+ camera_data->cam_handle = NULL;
+
+ free(camera_data);
+ camera_data = NULL;
+}
+
+static void __capturing_cb(camera_image_data_s *image, camera_image_data_s *postview,
+ camera_image_data_s *thumbnail, void *user_data)
+{
+ struct __camera_data *camera_data = user_data;
+ if (image == NULL) {
+ _E("Image is NULL");
+ return;
+ }
+
+ camera_data->captured_file = malloc(image->size);
+ if (camera_data->captured_file == NULL)
+ return;
+
+ _D("Now is on Capturing: Image size[%d x %d]", image->width, image->height);
+
+ memcpy(camera_data->captured_file, image->data, image->size);
+ camera_data->image_size = image->size;
+
+ return;
+}
+
+static void __completed_cb(void *user_data)
+{
+ struct __camera_data *camera_data = user_data;
+ int ret = CAMERA_ERROR_NONE;
+
+ if (camera_data->completed_cb)
+ camera_data->completed_cb(camera_data->captured_file, camera_data->image_size, camera_data->completed_cb_data);
+
+ free(camera_data->captured_file);
+ camera_data->captured_file = NULL;
+
+ if (!camera_data->cam_handle) {
+ _E("Camera is NULL");
+ return;
+ }
+ _D("Capture is completed");
+
+ ret = camera_start_preview(camera_data->cam_handle);
+ if (ret != CAMERA_ERROR_NONE) {
+ _E("Failed to start preview");
+ return;
+ }
+
+ ret = camera_stop_preview(camera_data->cam_handle);
+ if (ret != CAMERA_ERROR_NONE) {
+ _E("Failed to stop preview");
+ return;
+ }
+
+ return;
+}
+
+static bool __resolution_list_cb(int width, int height, void *user_data)
+{
+ _D("Supported resolution - Width[%d], Height[%d]", width, height);
+
+ if (width > camera_data->resolution_w && width <= RESOLUTION_W &&
+ height > camera_data->resolution_h && height <= RESOLUTION_H) {
+ camera_data->resolution_w = width;
+ camera_data->resolution_h = height;
+ }
+ _D("Fixed Resolution is Width[%d], Height[%d]", camera_data->resolution_w, camera_data->resolution_h);
+
+ return true;
+}
+
+static int __init(void)
+{
+ int ret = CAMERA_ERROR_NONE;
+
+ camera_data = malloc(sizeof(struct __camera_data));
+ if (camera_data == NULL) {
+ _E("Failed to allocate Camera data");
+ return -1;
+ }
+ memset(camera_data, 0, sizeof(struct __camera_data));
+
+ ret = camera_create(CAMERA_DEVICE_CAMERA0, &(camera_data->cam_handle));
+ if (ret != CAMERA_ERROR_NONE) {
+ _E("Failed to create camera");
+ goto ERROR;
+ }
+
+ ret = camera_foreach_supported_capture_resolution(camera_data->cam_handle, __resolution_list_cb, NULL);
+ if (ret != CAMERA_ERROR_NONE) {
+ _E("Failed to foreach supported capture resolution");
+ goto ERROR;
+ }
+
+ ret = camera_set_preview_resolution(camera_data->cam_handle, camera_data->resolution_w, camera_data->resolution_h);
+ if (ret != CAMERA_ERROR_NONE) {
+ _E("Failed to set preview resolution");
+ goto ERROR;
+ }
+
+ ret = camera_set_capture_resolution(camera_data->cam_handle, camera_data->resolution_w, camera_data->resolution_h);
+ if (ret != CAMERA_ERROR_NONE) {
+ _E("Failed to set capture resolution");
+ goto ERROR;
+ }
+
+ ret = camera_set_capture_format(camera_data->cam_handle, CAMERA_PIXEL_FORMAT_JPEG);
+ if (ret != CAMERA_ERROR_NONE) {
+ _E("Failed to set capture resolution");
+ goto ERROR;
+ }
+
+ ret = camera_start_preview(camera_data->cam_handle);
+ if (ret != CAMERA_ERROR_NONE) {
+ _E("Failed to start preview[%d]", ret);
+ goto ERROR;
+ }
+
+ return 0;
+
+ERROR:
+ camera_destroy(camera_data->cam_handle);
+ free(camera_data);
+ return -1;
+}
+