Move initialization of display handle
[platform/core/api/camera.git] / src / camera.c
1 /*
2  * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <string.h>
21 #include <mm.h>
22 #include <mm_types.h>
23 #include <camera.h>
24 #include <muse_camera.h>
25 #include <muse_camera_msg.h>
26 #include <camera_private.h>
27 #include <muse_core.h>
28 #include <muse_client.h>
29 #include <dlog.h>
30 #include <tbm_surface_internal.h>
31 #include <gio/gio.h>
32
33 #ifdef LOG_TAG
34 #undef LOG_TAG
35 #endif
36 #define LOG_TAG "TIZEN_N_CAMERA"
37
38 /* for device changed callback */
39 static GMutex g_cam_dev_state_changed_cb_lock;
40 static GList *g_cam_dev_state_changed_cb_list;
41 static int g_cam_dev_state_changed_cb_id;
42 static GDBusConnection *g_cam_dev_state_changed_cb_conn;
43 static guint g_cam_dev_state_changed_cb_subscribe_id;
44
45 static void _camera_msg_send(int api, camera_cb_info_s *cb_info,
46         int *ret, int timeout);
47 static void _camera_msg_send_param1(int api, camera_cb_info_s *cb_info,
48         int *ret, camera_msg_param *param, int timeout);
49 static int _camera_import_tbm_key(tbm_bufmgr bufmgr, unsigned int tbm_key, tbm_bo *bo, tbm_bo_handle *bo_handle);
50 static void _camera_release_imported_bo(tbm_bo *bo);
51 static void _camera_preview_frame_create(camera_stream_data_s *stream, int num_buffer_key,
52         tbm_bo_handle *buffer_bo_handle, tbm_bo_handle *data_bo_handle, camera_preview_data_s *frame);
53 static int _camera_media_packet_create(camera_cb_info_s *cb_info, camera_stream_data_s *stream,
54         camera_media_packet_data *mp_data, media_packet_h *packet);
55 static int _camera_media_packet_data_create(int tbm_key, int num_buffer_key, tbm_bo bo,
56         tbm_bo *buffer_bo, tbm_bo data_bo, camera_media_packet_data **mp_data);
57 static void _camera_media_packet_data_release(camera_media_packet_data *mp_data, camera_cb_info_s *cb_info);
58
59
60 static void __camera_update_api_waiting(camera_cb_info_s *cb_info, int api, int value)
61 {
62         if (!cb_info ||
63                 api < 0 || api >= MUSE_CAMERA_API_MAX) {
64                 LOGE("invalid param %p %d", cb_info, api);
65                 return;
66         }
67
68         g_mutex_lock(&(cb_info->api_mutex[api]));
69         cb_info->api_waiting[api] += value;
70         g_mutex_unlock(&(cb_info->api_mutex[api]));
71
72         /*LOGD("api %d, value %d, waiting %d",
73                 api, value, cb_info->api_waiting[api]);*/
74
75         return;
76 }
77
78
79 static void __camera_device_state_changed_cb(GDBusConnection *connection,
80         const gchar *sender_name, const gchar *object_path, const gchar *interface_name,
81         const gchar *signal_name, GVariant *param, gpointer user_data)
82 {
83         int value = 0;
84         camera_device_e device = CAMERA_DEVICE_CAMERA0;
85         camera_device_state_e state = CAMERA_DEVICE_STATE_NULL;
86         GList *tmp_list = NULL;
87         camera_cb_info *info = NULL;
88
89         g_mutex_lock(&g_cam_dev_state_changed_cb_lock);
90
91         if (!g_cam_dev_state_changed_cb_list || !param) {
92                 LOGW("no callback or NULL param %p", param);
93                 goto _DONE;
94         }
95
96         /* get device and state */
97         g_variant_get(param, "(i)", &value);
98
99         device = value >> 16;
100         state = 0x0000ffff & value;
101
102         LOGD("device %d, state %d", device, state);
103
104         tmp_list = g_cam_dev_state_changed_cb_list;
105
106         do {
107                 info = (camera_cb_info *)tmp_list->data;
108
109                 if (info) {
110                         if (info->callback) {
111                                 LOGD("start id[%d] callback", info->id);
112                                 ((camera_device_state_changed_cb)info->callback)(device, state, info->user_data);
113                                 LOGD("returned id[%d] callback", info->id);
114                         } else {
115                                 LOGW("NULL callback for id %d", info->id);
116                         }
117                 }
118
119                 tmp_list = tmp_list->next;
120         } while (tmp_list);
121
122 _DONE:
123         g_mutex_unlock(&g_cam_dev_state_changed_cb_lock);
124
125         return;
126 }
127
128
129 static void __camera_event_handler_preview(camera_cb_info_s *cb_info, char *recv_msg)
130 {
131         int i = 0;
132         int ret = 0;
133         int num_buffer_key = 0;
134         int buffer_key[BUFFER_MAX_PLANE_NUM] = {0, };
135         int tbm_key = 0;
136         int data_key = 0;
137         unsigned char *buf_pos = NULL;
138         camera_msg_param param;
139
140         tbm_bo bo = NULL;
141         tbm_bo buffer_bo[BUFFER_MAX_PLANE_NUM] = {NULL, };
142         tbm_bo_handle bo_handle = {.ptr = NULL};
143         tbm_bo_handle buffer_bo_handle[BUFFER_MAX_PLANE_NUM] = {{.ptr = NULL}, };
144         tbm_bo data_bo = NULL;
145         tbm_bo_handle data_bo_handle = {.ptr = NULL};
146
147         camera_preview_data_s frame;
148         camera_stream_data_s *stream = NULL;
149         camera_media_packet_data *mp_data = NULL;
150         media_packet_h pkt = NULL;
151         media_packet_h pkt_evas = NULL;
152
153         if (!cb_info || !recv_msg) {
154                 LOGE("invalid param %p %p", cb_info, recv_msg);
155                 return;
156         }
157
158         muse_camera_msg_get(tbm_key, recv_msg);
159         muse_camera_msg_get(num_buffer_key, recv_msg);
160         muse_camera_msg_get_array(buffer_key, recv_msg);
161         muse_camera_msg_get(data_key, recv_msg);
162
163         memset(&frame, 0x0, sizeof(camera_preview_data_s));
164
165         if (tbm_key <= 0) {
166                 LOGE("invalid key %d", tbm_key);
167                 return;
168         }
169
170         CAMERA_MSG_PARAM_SET(param, INT, tbm_key);
171
172         if (num_buffer_key < 0 || num_buffer_key > BUFFER_MAX_PLANE_NUM) {
173                 LOGE("invalid num buffer key %d", num_buffer_key);
174                 goto _PREVIEW_CB_HANDLER_DONE;
175         }
176
177         if (data_key > 0) {
178                 /* import tbm data_bo and get virtual address */
179                 if (!_camera_import_tbm_key(cb_info->bufmgr, data_key, &data_bo, &data_bo_handle)) {
180                         LOGE("failed to import data key %d", data_key);
181                         goto _PREVIEW_CB_HANDLER_DONE;
182                 }
183         }
184
185         /* import tbm bo and get virtual address */
186         if (!_camera_import_tbm_key(cb_info->bufmgr, tbm_key, &bo, &bo_handle)) {
187                 LOGE("failed to import key %d", tbm_key);
188                 goto _PREVIEW_CB_HANDLER_DONE;
189         }
190
191         buf_pos = (unsigned char *)bo_handle.ptr;
192
193         /* get stream info */
194         stream = (camera_stream_data_s *)buf_pos;
195
196         for (i = 0 ; i < num_buffer_key ; i++) {
197                 /* import buffer bo and get virtual address */
198                 if (!_camera_import_tbm_key(cb_info->bufmgr, buffer_key[i], &buffer_bo[i], &buffer_bo_handle[i])) {
199                         LOGE("failed to import buffer key %d", buffer_key[i]);
200                         goto _PREVIEW_CB_HANDLER_DONE;
201                 }
202         }
203
204         /* call preview callback */
205         if (cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_PREVIEW]) {
206                 _camera_preview_frame_create(stream, num_buffer_key, buffer_bo_handle, &data_bo_handle, &frame);
207
208                 ((camera_preview_cb)cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_PREVIEW])(&frame,
209                         cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_PREVIEW]);
210         }
211
212         if (CHECK_PREVIEW_CB(cb_info, PREVIEW_CB_TYPE_EVAS)) {
213                 ret = _camera_media_packet_data_create(tbm_key, num_buffer_key, bo, buffer_bo, data_bo, &mp_data);
214
215                 if (ret == CAMERA_ERROR_NONE) {
216                         ret = _camera_media_packet_create(cb_info, stream, mp_data, &pkt_evas);
217                         if (ret != CAMERA_ERROR_NONE) {
218                                 LOGE("create pkt for evas failed");
219                                 _camera_media_packet_data_release(mp_data, cb_info);
220                                 mp_data = NULL;
221                         }
222                 }
223         }
224
225         /* call media packet callback */
226         if (cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW]) {
227                 ret = _camera_media_packet_data_create(tbm_key, num_buffer_key, bo, buffer_bo, data_bo, &mp_data);
228
229                 if (ret == CAMERA_ERROR_NONE) {
230                         ret = _camera_media_packet_create(cb_info, stream, mp_data, &pkt);
231
232                         if (ret == CAMERA_ERROR_NONE) {
233                                 ((camera_media_packet_preview_cb)cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW])(pkt,
234                                         cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW]);
235                         } else {
236                                 _camera_media_packet_data_release(mp_data, cb_info);
237                                 mp_data = NULL;
238                         }
239                 }
240         }
241
242         /* call evas renderer */
243         if (pkt_evas) {
244                 if (cb_info->run_evas_render) {
245                         mm_display_interface_evas_render(cb_info->dp_interface, pkt_evas);
246                 } else {
247                         LOGW("evas renderer is stopped, skip this buffer...");
248                         media_packet_destroy(pkt_evas);
249                 }
250                 pkt_evas = NULL;
251         }
252
253         /* send message for preview callback return */
254         if (!CHECK_PREVIEW_CB(cb_info, PREVIEW_CB_TYPE_EVAS))
255                 _camera_msg_send(MUSE_CAMERA_API_PREVIEW_CB_RETURN, cb_info, NULL, 0);
256
257 _PREVIEW_CB_HANDLER_DONE:
258         if (mp_data == NULL) {
259                 /* release imported bo */
260                 for (i = 0 ; i < num_buffer_key && i < BUFFER_MAX_PLANE_NUM ; i++)
261                         _camera_release_imported_bo(&buffer_bo[i]);
262
263                 /* unmap and unref tbm bo */
264                 _camera_release_imported_bo(&data_bo);
265                 _camera_release_imported_bo(&bo);
266
267                 /* return buffer */
268                 _camera_msg_send_param1(MUSE_CAMERA_API_RETURN_BUFFER, cb_info, NULL, &param, 0);
269
270                 /*LOGD("return buffer Done");*/
271         }
272
273         return;
274 }
275
276
277 static void __camera_event_handler_capture(camera_cb_info_s *cb_info, char *recv_msg)
278 {
279         int tbm_key = 0;
280         int tbm_key_main = 0;
281         int tbm_key_post = 0;
282         int tbm_key_thumb = 0;
283         unsigned char *buf_pos = NULL;
284
285         camera_msg_param param;
286         camera_image_data_s *rImage = NULL;
287         camera_image_data_s *rPostview = NULL;
288         camera_image_data_s *rThumbnail = NULL;
289
290         tbm_bo bo_main = NULL;
291         tbm_bo bo_post = NULL;
292         tbm_bo bo_thumb = NULL;
293         tbm_bo_handle bo_main_handle = {.ptr = NULL};
294         tbm_bo_handle bo_post_handle = {.ptr = NULL};
295         tbm_bo_handle bo_thumb_handle = {.ptr = NULL};
296
297         if (!cb_info || !recv_msg) {
298                 LOGE("invalid param %p %p", cb_info, recv_msg);
299                 return;
300         }
301
302         muse_camera_msg_get(tbm_key_main, recv_msg);
303         muse_camera_msg_get(tbm_key_post, recv_msg);
304         muse_camera_msg_get(tbm_key_thumb, recv_msg);
305
306         /*
307         LOGD("camera capture callback came in. tbm_key_main %d, tbm_key_post %d, tbm_key_thumb %d",
308                 tbm_key_main, tbm_key_post, tbm_key_thumb);
309         */
310
311         if (tbm_key_main <= 0) {
312                 LOGE("invalid key %d", tbm_key_main);
313                 goto _CAPTURE_CB_HANDLER_DONE;
314         }
315
316         if (cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_CAPTURE] == NULL) {
317                 LOGW("NULL callback");
318                 goto _CAPTURE_CB_HANDLER_DONE;
319         }
320
321         /* import tbm bo and get virtual address */
322         if (!_camera_import_tbm_key(cb_info->bufmgr, tbm_key_main, &bo_main, &bo_main_handle)) {
323                 LOGE("failed to import key [%d] for main", tbm_key_main);
324                 goto _CAPTURE_CB_HANDLER_DONE;
325         }
326
327         buf_pos = (unsigned char *)bo_main_handle.ptr;
328         rImage = (camera_image_data_s *)buf_pos;
329         rImage->data = buf_pos + sizeof(camera_image_data_s);
330         if (rImage->exif && rImage->exif_size > 0) {
331                 rImage->exif = rImage->data + rImage->size;
332         } else {
333                 rImage->exif = NULL;
334                 rImage->exif_size = 0;
335         }
336
337         LOGD("image info %dx%d, size %d, EXIF info %p, size %d",
338                 rImage->width, rImage->height, rImage->size, rImage->exif, rImage->exif_size);
339
340         if (tbm_key_post > 0) {
341                 /* import tbm bo and get virtual address */
342                 if (_camera_import_tbm_key(cb_info->bufmgr, tbm_key_post, &bo_post, &bo_post_handle)) {
343                         buf_pos = (unsigned char *)bo_post_handle.ptr;
344                         rPostview = (camera_image_data_s *)buf_pos;
345                         LOGD("rPostview->size : %d", rPostview->size);
346                         rPostview->data = buf_pos + sizeof(camera_image_data_s);
347                 } else {
348                         LOGE("failed to import key [%d] for postview", tbm_key_post);
349                 }
350         }
351
352         if (tbm_key_thumb > 0) {
353                 /* import tbm bo and get virtual address */
354                 if (_camera_import_tbm_key(cb_info->bufmgr, tbm_key_thumb, &bo_thumb, &bo_thumb_handle)) {
355                         buf_pos = (unsigned char *)bo_thumb_handle.ptr;
356                         rThumbnail = (camera_image_data_s *)buf_pos;
357                         LOGD("rThumbnail->size : %d", rThumbnail->size);
358                         rThumbnail->data = buf_pos + sizeof(camera_image_data_s);
359                 } else {
360                         LOGE("failed to import key [%d] for thumbnail", tbm_key_thumb);
361                 }
362         }
363
364         ((camera_capturing_cb)cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_CAPTURE])(rImage,
365                 rPostview, rThumbnail, cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_CAPTURE]);
366
367 _CAPTURE_CB_HANDLER_DONE:
368         /* return buffer */
369         if (tbm_key_main > 0) {
370                 _camera_release_imported_bo(&bo_main);
371
372                 tbm_key = tbm_key_main;
373                 CAMERA_MSG_PARAM_SET(param, INT, tbm_key);
374
375                 _camera_msg_send_param1(MUSE_CAMERA_API_RETURN_BUFFER, cb_info, NULL, &param, 0);
376         }
377
378         if (tbm_key_post > 0) {
379                 _camera_release_imported_bo(&bo_post);
380
381                 tbm_key = tbm_key_post;
382                 CAMERA_MSG_PARAM_SET(param, INT, tbm_key);
383
384                 _camera_msg_send_param1(MUSE_CAMERA_API_RETURN_BUFFER, cb_info, NULL, &param, 0);
385         }
386
387         if (tbm_key_thumb > 0) {
388                 _camera_release_imported_bo(&bo_thumb);
389
390                 tbm_key = tbm_key_thumb;
391                 CAMERA_MSG_PARAM_SET(param, INT, tbm_key);
392
393                 _camera_msg_send_param1(MUSE_CAMERA_API_RETURN_BUFFER, cb_info, NULL, &param, 0);
394         }
395
396         LOGD("return buffer done");
397
398         return;
399 }
400
401
402 static void __camera_event_handler_face_detection(camera_cb_info_s *cb_info, char *recv_msg)
403 {
404         int count = 0;
405         int tbm_key = 0;
406         camera_detected_face_s *faces = NULL;
407         camera_msg_param param;
408
409         tbm_bo bo = NULL;
410         tbm_bo_handle bo_handle = {.ptr = NULL};
411
412         if (!cb_info || !recv_msg) {
413                 LOGE("invalid param %p %p", cb_info, recv_msg);
414                 return;
415         }
416
417         muse_camera_msg_get(count, recv_msg);
418         muse_camera_msg_get(tbm_key, recv_msg);
419
420         if (count >= 0 && cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FACE_DETECTION]) {
421                 LOGD("FACE_DETECTION - count %d, tbm_key %d", count, tbm_key);
422
423                 if (tbm_key > 0) {
424
425                         if (_camera_import_tbm_key(cb_info->bufmgr, tbm_key, &bo, &bo_handle)) {
426                                 /* set face info */
427                                 faces = bo_handle.ptr;
428                         }
429                 }
430
431                 ((camera_face_detected_cb)cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FACE_DETECTION])(faces,
432                         count, cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FACE_DETECTION]);
433
434                 /* release bo */
435                 _camera_release_imported_bo(&bo);
436         } else {
437                 LOGW("skip face detection message [count %d, key %d, cb %p",
438                         count, tbm_key, cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FACE_DETECTION]);
439         }
440
441         /* return buffer */
442         if (tbm_key > 0) {
443                 CAMERA_MSG_PARAM_SET(param, INT, tbm_key);
444                 _camera_msg_send_param1(MUSE_CAMERA_API_RETURN_BUFFER, cb_info, NULL, &param, 0);
445                 /*LOGD("return buffer done");*/
446         }
447
448         return;
449 }
450
451
452 static int _camera_import_tbm_key(tbm_bufmgr bufmgr, unsigned int tbm_key, tbm_bo *bo, tbm_bo_handle *bo_handle)
453 {
454         tbm_bo tmp_bo = NULL;
455         tbm_bo_handle tmp_bo_handle = {NULL, };
456
457         if (!bufmgr || !bo || !bo_handle || !tbm_key) {
458                 LOGE("invalid parameter - %p %p %p, key %d",
459                      bufmgr, bo, bo_handle, tbm_key);
460                 return false;
461         }
462
463         tmp_bo = tbm_bo_import(bufmgr, tbm_key);
464         if (tmp_bo == NULL) {
465                 LOGE("import failed - key %d", tbm_key);
466                 return false;
467         }
468
469         tmp_bo_handle = tbm_bo_map(tmp_bo, TBM_DEVICE_CPU, TBM_OPTION_READ);
470         if (tmp_bo_handle.ptr == NULL) {
471                 LOGE("map failed %p", tmp_bo);
472                 tbm_bo_unref(tmp_bo);
473                 tmp_bo = NULL;
474                 return false;
475         }
476
477         tbm_bo_unmap(tmp_bo);
478
479         /* set bo and bo_handle */
480         *bo = tmp_bo;
481         *bo_handle = tmp_bo_handle;
482
483         return true;
484 }
485
486 static void _camera_release_imported_bo(tbm_bo *bo)
487 {
488         if (!bo || !(*bo)) {
489                 /*LOGW("NULL bo");*/
490                 return;
491         }
492
493         tbm_bo_unref(*bo);
494         *bo = NULL;
495
496         return;
497 }
498
499 static int _camera_client_wait_for_cb_return(muse_camera_api_e api, camera_cb_info_s *cb_info, int time_out)
500 {
501         int ret = CAMERA_ERROR_NONE;
502         gint64 end_time;
503
504         /*LOGD("Enter api : %d", api);*/
505
506         if (!cb_info->is_server_connected) {
507                 LOGE("server is disconnected");
508                 return CAMERA_ERROR_SERVICE_DISCONNECTED;
509         }
510
511         g_mutex_lock(&(cb_info->api_mutex[api]));
512
513         if (cb_info->api_activating[api] == 0) {
514                 if (time_out == CAMERA_CB_NO_TIMEOUT) {
515                         LOGW("wait for api %d", api);
516                         g_cond_wait(&(cb_info->api_cond[api]), &(cb_info->api_mutex[api]));
517                         ret = cb_info->api_ret[api];
518                         cb_info->api_activating[api] = 0;
519                         LOGW("api %d returned 0x%x", api, ret);
520                 } else {
521                         end_time = g_get_monotonic_time() + time_out * G_TIME_SPAN_SECOND;
522                         if (g_cond_wait_until(&(cb_info->api_cond[api]), &(cb_info->api_mutex[api]), end_time)) {
523                                 ret = cb_info->api_ret[api];
524                                 cb_info->api_activating[api] = 0;
525                                 /*LOGD("return value : 0x%x", ret);*/
526                         } else {
527                                 ret = CAMERA_ERROR_INVALID_OPERATION;
528                                 LOGE("api %d was TIMED OUT!", api);
529                         }
530                 }
531         } else {
532                 ret = cb_info->api_ret[api];
533                 cb_info->api_activating[api] = 0;
534
535                 /*LOGD("condition is already checked for the api[%d], return[0x%x]", api, ret);*/
536         }
537
538         g_mutex_unlock(&(cb_info->api_mutex[api]));
539
540         if (ret != CAMERA_ERROR_NONE) {
541                 LOGE("api %d : error 0x%x", api, ret);
542
543                 if (ret == CAMERA_ERROR_SOUND_POLICY)
544                         LOGW("DEPRECATION WARNING: CAMERA_ERROR_SOUND_POLICY is deprecated and will be removed from next release.");
545                 else if (ret == CAMERA_ERROR_SOUND_POLICY_BY_CALL)
546                         LOGW("DEPRECATION WARNING: CAMERA_ERROR_SOUND_POLICY_BY_CALL is deprecated and will be removed from next release.");
547                 else if (ret == CAMERA_ERROR_SOUND_POLICY_BY_ALARM)
548                         LOGW("DEPRECATION WARNING: CAMERA_ERROR_SOUND_POLICY_BY_ALARM is deprecated and will be removed from next release.");
549         }
550
551         return ret;
552 }
553
554
555 static void _camera_msg_send(int api, camera_cb_info_s *cb_info,
556         int *ret, int timeout)
557 {
558         int send_ret = 0;
559         char *msg = NULL;
560
561         if (!cb_info) {
562                 LOGE("NULL info - api %d", api);
563
564                 if (ret)
565                         *ret = CAMERA_ERROR_INVALID_PARAMETER;
566
567                 return;
568         }
569
570         msg = muse_core_msg_new(api, NULL);
571         if (!msg) {
572                 LOGE("msg failed: api %d", api);
573
574                 if (ret)
575                         *ret = CAMERA_ERROR_OUT_OF_MEMORY;
576
577                 return;
578         }
579
580         /*LOGD("send msg %s", msg);*/
581
582         if (cb_info->is_server_connected) {
583                 __camera_update_api_waiting(cb_info, api, 1);
584
585                 g_mutex_lock(&cb_info->fd_lock);
586                 send_ret = muse_core_msg_send(cb_info->fd, msg);
587                 g_mutex_unlock(&cb_info->fd_lock);
588         }
589
590         if (send_ret < 0) {
591                 LOGE("msg send failed");
592                 if (ret)
593                         *ret = CAMERA_ERROR_INVALID_OPERATION;
594         } else {
595                 if (ret)
596                         *ret = _camera_client_wait_for_cb_return(api, cb_info, timeout);
597         }
598
599         __camera_update_api_waiting(cb_info, api, -1);
600
601         muse_core_msg_free(msg);
602
603         return;
604 }
605
606
607 static void _camera_msg_send_param1(int api, camera_cb_info_s *cb_info,
608         int *ret, camera_msg_param *param, int timeout)
609 {
610         int send_ret = 0;
611         char *msg = NULL;
612
613         if (!cb_info || !param) {
614                 LOGE("invalid pointer : api %d - %p %p", api, cb_info, param);
615
616                 if (ret)
617                         *ret = CAMERA_ERROR_INVALID_PARAMETER;
618
619                 return;
620         }
621
622         /*LOGD("type %d, name %s", param->type, param->name);*/
623
624         switch (param->type) {
625         case MUSE_TYPE_INT:
626                 msg = muse_core_msg_new(api,
627                         param->type, param->name, param->value.value_INT,
628                         NULL);
629                 break;
630         case MUSE_TYPE_STRING:
631                 msg = muse_core_msg_new(api,
632                         param->type, param->name, param->value.value_STRING,
633                         NULL);
634                 break;
635         default:
636                 LOGE("unknown type %d", param->type);
637                 break;
638         }
639
640         if (!msg) {
641                 LOGE("msg failed: api %d", api);
642
643                 if (ret)
644                         *ret = CAMERA_ERROR_OUT_OF_MEMORY;
645
646                 return;
647         }
648
649         /*LOGD("send msg %s", msg);*/
650
651         if (cb_info->is_server_connected) {
652                 __camera_update_api_waiting(cb_info, api, 1);
653
654                 g_mutex_lock(&cb_info->fd_lock);
655                 send_ret = muse_core_msg_send(cb_info->fd, msg);
656                 g_mutex_unlock(&cb_info->fd_lock);
657         }
658
659         if (send_ret < 0) {
660                 LOGE("msg send failed");
661
662                 if (ret)
663                         *ret = CAMERA_ERROR_INVALID_OPERATION;
664         } else {
665                 if (ret)
666                         *ret = _camera_client_wait_for_cb_return(api, cb_info, timeout);
667         }
668
669         __camera_update_api_waiting(cb_info, api, -1);
670
671         muse_core_msg_free(msg);
672
673         return;
674 }
675
676
677 int _camera_get_tbm_surface_format(int in_format, uint32_t *out_format)
678 {
679         if (in_format <= MM_PIXEL_FORMAT_INVALID ||
680             in_format >= MM_PIXEL_FORMAT_NUM ||
681             out_format == NULL) {
682                 LOGE("INVALID_PARAMETER : in_format %d, out_format ptr %p", in_format, out_format);
683                 return CAMERA_ERROR_INVALID_PARAMETER;
684         }
685
686         switch (in_format) {
687         case MM_PIXEL_FORMAT_NV12:
688         case MM_PIXEL_FORMAT_NV12T:
689                 *out_format = TBM_FORMAT_NV12;
690                 break;
691         case MM_PIXEL_FORMAT_NV16:
692                 *out_format = TBM_FORMAT_NV16;
693                 break;
694         case MM_PIXEL_FORMAT_NV21:
695                 *out_format = TBM_FORMAT_NV21;
696                 break;
697         case MM_PIXEL_FORMAT_YUYV:
698                 *out_format = TBM_FORMAT_YUYV;
699                 break;
700         case MM_PIXEL_FORMAT_UYVY:
701         case MM_PIXEL_FORMAT_ITLV_JPEG_UYVY:
702                 *out_format = TBM_FORMAT_UYVY;
703                 break;
704         case MM_PIXEL_FORMAT_422P:
705                 *out_format = TBM_FORMAT_YUV422;
706                 break;
707         case MM_PIXEL_FORMAT_I420:
708                 *out_format = TBM_FORMAT_YUV420;
709                 break;
710         case MM_PIXEL_FORMAT_YV12:
711                 *out_format = TBM_FORMAT_YVU420;
712                 break;
713         case MM_PIXEL_FORMAT_RGB565:
714                 *out_format = TBM_FORMAT_RGB565;
715                 break;
716         case MM_PIXEL_FORMAT_RGB888:
717                 *out_format = TBM_FORMAT_RGB888;
718                 break;
719         case MM_PIXEL_FORMAT_RGBA:
720                 *out_format = TBM_FORMAT_RGBA8888;
721                 break;
722         case MM_PIXEL_FORMAT_ARGB:
723                 *out_format = TBM_FORMAT_ARGB8888;
724                 break;
725         default:
726                 LOGE("invalid in_format %d", in_format);
727                 return CAMERA_ERROR_INVALID_PARAMETER;
728         }
729
730         return CAMERA_ERROR_NONE;
731 }
732
733
734 int _camera_get_media_packet_mimetype(int in_format, media_format_mimetype_e *mimetype)
735 {
736         if (in_format <= MM_PIXEL_FORMAT_INVALID ||
737             in_format >= MM_PIXEL_FORMAT_NUM ||
738             mimetype == NULL) {
739                 LOGE("INVALID_PARAMETER : in_format %d, mimetype ptr %p", in_format, mimetype);
740                 return CAMERA_ERROR_INVALID_PARAMETER;
741         }
742
743         switch (in_format) {
744         case MM_PIXEL_FORMAT_NV12:
745         case MM_PIXEL_FORMAT_NV12T:
746                 *mimetype = MEDIA_FORMAT_NV12;
747                 break;
748         case MM_PIXEL_FORMAT_NV16:
749                 *mimetype = MEDIA_FORMAT_NV16;
750                 break;
751         case MM_PIXEL_FORMAT_NV21:
752                 *mimetype = MEDIA_FORMAT_NV21;
753                 break;
754         case MM_PIXEL_FORMAT_YUYV:
755                 *mimetype = MEDIA_FORMAT_YUYV;
756                 break;
757         case MM_PIXEL_FORMAT_UYVY:
758         case MM_PIXEL_FORMAT_ITLV_JPEG_UYVY:
759                 *mimetype = MEDIA_FORMAT_UYVY;
760                 break;
761         case MM_PIXEL_FORMAT_422P:
762                 *mimetype = MEDIA_FORMAT_422P;
763                 break;
764         case MM_PIXEL_FORMAT_I420:
765                 *mimetype = MEDIA_FORMAT_I420;
766                 break;
767         case MM_PIXEL_FORMAT_YV12:
768                 *mimetype = MEDIA_FORMAT_YV12;
769                 break;
770         case MM_PIXEL_FORMAT_RGB565:
771                 *mimetype = MEDIA_FORMAT_RGB565;
772                 break;
773         case MM_PIXEL_FORMAT_RGB888:
774                 *mimetype = MEDIA_FORMAT_RGB888;
775                 break;
776         case MM_PIXEL_FORMAT_RGBA:
777                 *mimetype = MEDIA_FORMAT_RGBA;
778                 break;
779         case MM_PIXEL_FORMAT_ARGB:
780                 *mimetype = MEDIA_FORMAT_ARGB;
781                 break;
782         default:
783                 LOGE("invalid in_format %d", in_format);
784                 return CAMERA_ERROR_INVALID_PARAMETER;
785         }
786
787         return CAMERA_ERROR_NONE;
788 }
789
790 static void _camera_preview_frame_create(camera_stream_data_s *stream, int num_buffer_key,
791         tbm_bo_handle *buffer_bo_handle, tbm_bo_handle *data_bo_handle, camera_preview_data_s *frame)
792 {
793         int total_size = 0;
794         unsigned char *buf_pos = NULL;
795
796         if (stream == NULL || buffer_bo_handle == NULL || frame == NULL) {
797                 LOGE("invalid parameter - stream:%p, buffer_bo_handle:%p", stream, buffer_bo_handle);
798                 return;
799         }
800
801         /* set frame info */
802         if (stream->format == MM_PIXEL_FORMAT_ITLV_JPEG_UYVY)
803                 frame->format  = MM_PIXEL_FORMAT_UYVY;
804         else
805                 frame->format = stream->format;
806
807         frame->width = stream->width;
808         frame->height = stream->height;
809         frame->timestamp = stream->timestamp;
810         frame->num_of_planes = stream->num_planes;
811
812         if (num_buffer_key == 0) {
813                 /* non-zero copy */
814                 if (!data_bo_handle || !data_bo_handle->ptr) {
815                         LOGE("NULL pointer");
816                         return;
817                 }
818
819                 buf_pos = data_bo_handle->ptr;
820
821                 if (stream->format == MM_PIXEL_FORMAT_ENCODED_H264) {
822                         frame->data.encoded_plane.data = buf_pos;
823                         frame->data.encoded_plane.size = stream->data.encoded.length_data;
824                         total_size = stream->data.encoded.length_data;
825                 } else {
826                         switch (stream->num_planes) {
827                         case 1:
828                                 frame->data.single_plane.yuv = buf_pos;
829                                 frame->data.single_plane.size = stream->data.yuv420.length_yuv;
830                                 total_size = stream->data.yuv420.length_yuv;
831                                 break;
832                         case 2:
833                                 frame->data.double_plane.y = buf_pos;
834                                 frame->data.double_plane.y_size = stream->data.yuv420sp.length_y;
835                                 buf_pos += stream->data.yuv420sp.length_y;
836                                 frame->data.double_plane.uv = buf_pos;
837                                 frame->data.double_plane.uv_size = stream->data.yuv420sp.length_uv;
838                                 total_size = stream->data.yuv420sp.length_y + \
839                                         stream->data.yuv420sp.length_uv;
840                                 break;
841                         case 3:
842                                 frame->data.triple_plane.y = buf_pos;
843                                 frame->data.triple_plane.y_size = stream->data.yuv420p.length_y;
844                                 buf_pos += stream->data.yuv420p.length_y;
845                                 frame->data.triple_plane.u = buf_pos;
846                                 frame->data.triple_plane.u_size = stream->data.yuv420p.length_u;
847                                 buf_pos += stream->data.yuv420p.length_u;
848                                 frame->data.triple_plane.v = buf_pos;
849                                 frame->data.triple_plane.v_size = stream->data.yuv420p.length_v;
850                                 total_size = stream->data.yuv420p.length_y + \
851                                         stream->data.yuv420p.length_u + \
852                                         stream->data.yuv420p.length_v;
853                                 break;
854                         default:
855                                 break;
856                         }
857                 }
858         } else {
859                 /* zero copy */
860                 switch (stream->num_planes) {
861                 case 1:
862                         frame->data.single_plane.yuv = buffer_bo_handle[0].ptr;
863                         frame->data.single_plane.size = stream->data.yuv420.length_yuv;
864                         total_size = stream->data.yuv420.length_yuv;
865                         break;
866                 case 2:
867                         frame->data.double_plane.y = buffer_bo_handle[0].ptr;
868                         if (stream->num_planes == (unsigned int)num_buffer_key)
869                                 frame->data.double_plane.uv = buffer_bo_handle[1].ptr;
870                         else
871                                 frame->data.double_plane.uv = buffer_bo_handle[0].ptr + stream->data.yuv420sp.length_y;
872                         frame->data.double_plane.y_size = stream->data.yuv420sp.length_y;
873                         frame->data.double_plane.uv_size = stream->data.yuv420sp.length_uv;
874                         total_size = stream->data.yuv420sp.length_y + \
875                                 stream->data.yuv420sp.length_uv;
876                         break;
877                 case 3:
878                         frame->data.triple_plane.y = buffer_bo_handle[0].ptr;
879                         if (stream->num_planes == (unsigned int)num_buffer_key) {
880                                 frame->data.triple_plane.u = buffer_bo_handle[1].ptr;
881                                 frame->data.triple_plane.v = buffer_bo_handle[2].ptr;
882                         } else {
883                                 frame->data.triple_plane.u = buffer_bo_handle[0].ptr + stream->data.yuv420p.length_y;
884                                 frame->data.triple_plane.v = buffer_bo_handle[1].ptr + stream->data.yuv420p.length_u;
885                         }
886                         frame->data.triple_plane.y_size = stream->data.yuv420p.length_y;
887                         frame->data.triple_plane.u_size = stream->data.yuv420p.length_u;
888                         frame->data.triple_plane.v_size = stream->data.yuv420p.length_v;
889                         total_size = stream->data.yuv420p.length_y + \
890                                 stream->data.yuv420p.length_u + \
891                                 stream->data.yuv420p.length_v;
892                         break;
893                 default:
894                         break;
895                 }
896         }
897
898         /*
899         LOGD("format %d, %dx%d, size %d plane num %d",
900              frame.format, frame.width, frame.height, total_size, frame.num_of_planes);
901         */
902
903         return;
904 }
905
906 static int _camera_media_packet_data_create(int tbm_key, int num_buffer_key, tbm_bo bo,
907         tbm_bo *buffer_bo, tbm_bo data_bo, camera_media_packet_data **mp_data)
908 {
909         int i = 0;
910         int ret = CAMERA_ERROR_NONE;
911         camera_media_packet_data *tmp_mp_data = NULL;
912
913         if (*mp_data == NULL) {
914                 tmp_mp_data = g_new0(camera_media_packet_data, 1);
915                 if (tmp_mp_data) {
916                         tmp_mp_data->tbm_key = tbm_key;
917                         tmp_mp_data->num_buffer_key = num_buffer_key;
918                         tmp_mp_data->bo = bo;
919                         tmp_mp_data->data_bo = data_bo;
920                         tmp_mp_data->ref_cnt++;
921
922                         for (i = 0 ; i < num_buffer_key ; i++)
923                                 tmp_mp_data->buffer_bo[i] = buffer_bo[i];
924
925                         *mp_data = tmp_mp_data;
926                         /*LOGD("mp_data %p", tmp_mp_data);*/
927                 } else {
928                         ret = CAMERA_ERROR_OUT_OF_MEMORY;
929                         LOGE("failed to alloc media packet data");
930                 }
931         } else {
932                 ((camera_media_packet_data *)*mp_data)->ref_cnt++;
933         }
934
935         return ret;
936 }
937
938 static void _camera_media_packet_data_release(camera_media_packet_data *mp_data, camera_cb_info_s *cb_info)
939 {
940         int i = 0;
941         int tbm_key = 0;
942         camera_msg_param param;
943
944         if (!mp_data || !cb_info) {
945                 LOGE("NULL pointer %p %p", mp_data, cb_info);
946                 return;
947         }
948
949         if (mp_data->ref_cnt > 1) {
950                 mp_data->ref_cnt--;
951                 LOGD("ref count %d", mp_data->ref_cnt);
952         } else {
953                 /* release imported bo */
954                 for (i = 0 ; i < mp_data->num_buffer_key ; i++) {
955                         tbm_bo_unref(mp_data->buffer_bo[i]);
956                         mp_data->buffer_bo[i] = NULL;
957                 }
958
959                 /* unref tbm bo */
960                 _camera_release_imported_bo(&mp_data->bo);
961                 _camera_release_imported_bo(&mp_data->data_bo);
962
963                 /* return buffer */
964                 tbm_key = mp_data->tbm_key;
965
966                 CAMERA_MSG_PARAM_SET(param, INT, tbm_key);
967
968                 _camera_msg_send_param1(MUSE_CAMERA_API_RETURN_BUFFER, cb_info, NULL, &param, 0);
969
970                 g_free(mp_data);
971                 mp_data = NULL;
972         }
973
974         return;
975 }
976
977 static int _camera_media_packet_create(camera_cb_info_s *cb_info, camera_stream_data_s *stream,
978         camera_media_packet_data *mp_data, media_packet_h *packet)
979 {
980         media_packet_h pkt = NULL;
981         bool make_pkt_fmt = false;
982         tbm_surface_h tsurf = NULL;
983         tbm_surface_info_s tsurf_info;
984         media_format_mimetype_e mimetype = MEDIA_FORMAT_NV12;
985         uint32_t bo_format = 0;
986         int ret = 0;
987         int i = 0;
988         int num_buffer_key = 0;
989         tbm_bo *buffer_bo = NULL;
990
991         if (cb_info == NULL || stream == NULL || mp_data == NULL || packet == NULL) {
992                 LOGE("invalid parameter - cb_info:%p, stream:%p, mp_data:%p, packet:%p",
993                         cb_info, stream, mp_data, packet);
994                 return CAMERA_ERROR_INVALID_PARAMETER;
995         }
996
997         memset(&tsurf_info, 0x0, sizeof(tbm_surface_info_s));
998         buffer_bo = mp_data->buffer_bo;
999         num_buffer_key = mp_data->num_buffer_key;
1000
1001         /* create tbm surface */
1002         for (i = 0 ; i < BUFFER_MAX_PLANE_NUM ; i++)
1003                 tsurf_info.planes[i].stride = stream->stride[i];
1004
1005         /* get tbm surface format */
1006         ret = _camera_get_tbm_surface_format(stream->format, &bo_format);
1007         ret |= _camera_get_media_packet_mimetype(stream->format, &mimetype);
1008
1009         if (ret == CAMERA_ERROR_NONE) {
1010                 tsurf_info.width = stream->width;
1011                 tsurf_info.height = stream->height;
1012                 tsurf_info.format = bo_format;
1013                 tsurf_info.bpp = tbm_surface_internal_get_bpp(bo_format);
1014                 tsurf_info.num_planes = tbm_surface_internal_get_num_planes(bo_format);
1015
1016                 if (num_buffer_key > 0) {
1017                         switch (bo_format) {
1018                         case TBM_FORMAT_NV12:
1019                         case TBM_FORMAT_NV21:
1020                                 tsurf_info.planes[0].size = stream->stride[0] * stream->elevation[0];
1021                                 tsurf_info.planes[1].size = stream->stride[1] * stream->elevation[1];
1022                                 tsurf_info.planes[0].offset = 0;
1023                                 if (num_buffer_key == 1)
1024                                         tsurf_info.planes[1].offset = tsurf_info.planes[0].size;
1025                                 tsurf_info.size = tsurf_info.planes[0].size + tsurf_info.planes[1].size;
1026                                 break;
1027                         case TBM_FORMAT_YUV420:
1028                         case TBM_FORMAT_YVU420:
1029                                 tsurf_info.planes[0].size = stream->stride[0] * stream->elevation[0];
1030                                 tsurf_info.planes[1].size = stream->stride[1] * stream->elevation[1];
1031                                 tsurf_info.planes[2].size = stream->stride[2] * stream->elevation[2];
1032                                 tsurf_info.planes[0].offset = 0;
1033                                 if (num_buffer_key == 1) {
1034                                         tsurf_info.planes[1].offset = tsurf_info.planes[0].size;
1035                                         tsurf_info.planes[2].offset = tsurf_info.planes[0].size + tsurf_info.planes[1].size;
1036                                 }
1037                                 tsurf_info.size = tsurf_info.planes[0].size + tsurf_info.planes[1].size + tsurf_info.planes[2].size;
1038                                 break;
1039                         case TBM_FORMAT_UYVY:
1040                         case TBM_FORMAT_YUYV:
1041                                 tsurf_info.planes[0].size = (stream->stride[0] * stream->elevation[0]) << 1;
1042                                 tsurf_info.planes[0].offset = 0;
1043                                 tsurf_info.size = tsurf_info.planes[0].size;
1044                                 break;
1045                         default:
1046                                 break;
1047                         }
1048
1049                         tsurf = tbm_surface_internal_create_with_bos(&tsurf_info, buffer_bo, num_buffer_key);
1050                 } else if (mp_data->data_bo) {
1051                         switch (bo_format) {
1052                         case TBM_FORMAT_NV12:
1053                         case TBM_FORMAT_NV21:
1054                                 tsurf_info.planes[0].size = stream->width * stream->height;
1055                                 tsurf_info.planes[1].size = (tsurf_info.planes[0].size) >> 1;
1056                                 tsurf_info.planes[0].offset = 0;
1057                                 tsurf_info.planes[1].offset = tsurf_info.planes[0].size;
1058                                 tsurf_info.size = tsurf_info.planes[0].size + tsurf_info.planes[1].size;
1059                                 break;
1060                         case TBM_FORMAT_YUV420:
1061                         case TBM_FORMAT_YVU420:
1062                                 tsurf_info.planes[0].size = stream->width * stream->height;
1063                                 tsurf_info.planes[1].size = (stream->width >> 1) * (stream->height >> 1);
1064                                 tsurf_info.planes[2].size = tsurf_info.planes[1].size;
1065                                 tsurf_info.planes[0].offset = 0;
1066                                 tsurf_info.planes[1].offset = tsurf_info.planes[0].size;
1067                                 tsurf_info.planes[2].offset = tsurf_info.planes[0].size + tsurf_info.planes[1].size;
1068                                 tsurf_info.size = tsurf_info.planes[0].size + tsurf_info.planes[1].size + tsurf_info.planes[2].size;
1069                                 break;
1070                         case TBM_FORMAT_UYVY:
1071                         case TBM_FORMAT_YUYV:
1072                                 tsurf_info.planes[0].size = (stream->width * stream->height) << 1;
1073                                 tsurf_info.planes[0].offset = 0;
1074                                 tsurf_info.size = tsurf_info.planes[0].size;
1075                                 break;
1076                         default:
1077                                 break;
1078                         }
1079
1080                         tsurf = tbm_surface_internal_create_with_bos(&tsurf_info, &mp_data->data_bo, 1);
1081                 }
1082                 /*LOGD("tbm surface %p", tsurf);*/
1083         }
1084
1085         if (tsurf) {
1086                 /* check media packet format */
1087                 if (cb_info->pkt_fmt) {
1088                         int pkt_fmt_width = 0;
1089                         int pkt_fmt_height = 0;
1090                         media_format_mimetype_e pkt_fmt_mimetype = MEDIA_FORMAT_NV12;
1091
1092                         media_format_get_video_info(cb_info->pkt_fmt, &pkt_fmt_mimetype, &pkt_fmt_width, &pkt_fmt_height, NULL, NULL);
1093                         if (pkt_fmt_mimetype != mimetype ||
1094                             pkt_fmt_width != stream->width ||
1095                             pkt_fmt_height != stream->height) {
1096                                 LOGW("change fmt: current 0x%x, %dx%d",
1097                                      pkt_fmt_mimetype, pkt_fmt_width, pkt_fmt_height);
1098                                 media_format_unref(cb_info->pkt_fmt);
1099                                 cb_info->pkt_fmt = NULL;
1100                                 make_pkt_fmt = true;
1101                         }
1102                 } else {
1103                         make_pkt_fmt = true;
1104                 }
1105
1106                 /* create packet format */
1107                 if (make_pkt_fmt) {
1108                         LOGW("make new pkt_fmt - 0x%x, %dx%d", mimetype, stream->width, stream->height);
1109                         ret = media_format_create(&cb_info->pkt_fmt);
1110                         if (ret == MEDIA_FORMAT_ERROR_NONE) {
1111                                 ret = media_format_set_video_mime(cb_info->pkt_fmt, mimetype);
1112                                 ret |= media_format_set_video_width(cb_info->pkt_fmt, stream->width);
1113                                 ret |= media_format_set_video_height(cb_info->pkt_fmt, stream->height);
1114                                 LOGW("media_format_set : 0x%x", ret);
1115                         } else {
1116                                 LOGW("media_format_create failed 0x%x", ret);
1117                         }
1118                 }
1119
1120                 /* create media packet */
1121                 ret = media_packet_create_from_tbm_surface(cb_info->pkt_fmt,
1122                         tsurf, (media_packet_finalize_cb)_camera_media_packet_finalize,
1123                         (void *)cb_info, &pkt);
1124                 if (ret != MEDIA_PACKET_ERROR_NONE) {
1125                         LOGE("media_packet_create failed 0x%x", ret);
1126                         tbm_surface_destroy(tsurf);
1127                         tsurf = NULL;
1128                 }
1129         } else {
1130                 LOGE("tbm surface failed. %dx%d, format %d, num_buffer_key %d, data_bo %p",
1131                         stream->width, stream->height, stream->format, num_buffer_key, mp_data->data_bo);
1132         }
1133
1134         if (pkt) {
1135                 /*LOGD("media packet %p, internal buffer %p", pkt, stream->internal_buffer);*/
1136                 /* set media packet data */
1137                 ret = media_packet_set_extra(pkt, (void *)mp_data);
1138                 if (ret != MEDIA_PACKET_ERROR_NONE) {
1139                         LOGE("media_packet_set_extra failed");
1140
1141                         _camera_media_packet_data_release(mp_data, cb_info);
1142                         mp_data = NULL;
1143
1144                         media_packet_destroy(pkt);
1145                         pkt = NULL;
1146                 } else {
1147                         /* set timestamp : msec -> nsec */
1148                         if (media_packet_set_pts(pkt, (uint64_t)(stream->timestamp) * 1000000) != MEDIA_PACKET_ERROR_NONE)
1149                                 LOGW("media_packet_set_pts failed");
1150
1151                         *packet = pkt;
1152                 }
1153         }
1154
1155         return ret;
1156 }
1157
1158 int _camera_media_packet_finalize(media_packet_h pkt, int error_code, void *user_data)
1159 {
1160         int ret = 0;
1161         camera_cb_info_s *cb_info = (camera_cb_info_s *)user_data;
1162         camera_media_packet_data *mp_data = NULL;
1163         tbm_surface_h tsurf = NULL;
1164
1165         if (!pkt || !cb_info) {
1166                 LOGE("NULL pointer %p %p", pkt, cb_info);
1167                 return MEDIA_PACKET_FINALIZE;
1168         }
1169
1170         ret = media_packet_get_extra(pkt, (void **)&mp_data);
1171         if (ret != MEDIA_PACKET_ERROR_NONE) {
1172                 LOGE("media_packet_get_extra failed 0x%x", ret);
1173                 return MEDIA_PACKET_FINALIZE;
1174         }
1175
1176         /*LOGD("mp_data %p", mp_data);*/
1177
1178         g_mutex_lock(&cb_info->mp_data_mutex);
1179
1180         _camera_media_packet_data_release(mp_data, cb_info);
1181         mp_data = NULL;
1182
1183         g_mutex_unlock(&cb_info->mp_data_mutex);
1184
1185         ret = media_packet_get_tbm_surface(pkt, &tsurf);
1186         if (ret != MEDIA_PACKET_ERROR_NONE)
1187                 LOGE("get tbm_surface failed 0x%x", ret);
1188
1189         if (tsurf) {
1190                 tbm_surface_destroy(tsurf);
1191                 tsurf = NULL;
1192         }
1193
1194         return MEDIA_PACKET_FINALIZE;
1195 }
1196
1197 static void _camera_client_user_callback(camera_cb_info_s *cb_info, char *recv_msg, muse_camera_event_e event)
1198 {
1199         int param1 = 0;
1200         int param2 = 0;
1201
1202         if (!recv_msg || event >= MUSE_CAMERA_EVENT_TYPE_NUM) {
1203                 LOGE("invalid parameter - camera msg %p, event %d", recv_msg, event);
1204                 return;
1205         }
1206
1207         /*LOGD("get camera msg %s, event %d", recv_msg, event);*/
1208
1209         g_mutex_lock(&cb_info->user_cb_mutex[event]);
1210
1211         if (cb_info->user_cb[event] == NULL) {
1212                 if (event != MUSE_CAMERA_EVENT_TYPE_PREVIEW &&
1213                         event != MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW &&
1214                         event != MUSE_CAMERA_EVENT_TYPE_FACE_DETECTION &&
1215                         event != MUSE_CAMERA_EVENT_TYPE_CAPTURE) {
1216                         g_mutex_unlock(&cb_info->user_cb_mutex[event]);
1217                         LOGW("NULL callback for event %d, return here", event);
1218                         return;
1219                 }
1220
1221                 /* return buffer message should be sent for some events.
1222                  - MUSE_CAMERA_EVENT_TYPE_PREVIEW
1223                  - MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW
1224                  - MUSE_CAMERA_EVENT_TYPE_FACE_DETECTION
1225                  - MUSE_CAMERA_EVENT_TYPE_CAPTURE
1226                 */
1227         }
1228
1229         switch (event) {
1230         case MUSE_CAMERA_EVENT_TYPE_STATE_CHANGE:
1231                 {
1232                         int previous = 0;
1233                         int current = 0;
1234                         int by_policy = 0;
1235
1236                         muse_camera_msg_get(previous, recv_msg);
1237                         muse_camera_msg_get(current, recv_msg);
1238                         muse_camera_msg_get(by_policy, recv_msg);
1239
1240                         LOGD("STATE CHANGE - previous %d, current %d, by_policy %d",
1241                                 previous, current, by_policy);
1242
1243                         ((camera_state_changed_cb)cb_info->user_cb[event])((camera_state_e)previous,
1244                                 (camera_state_e)current, (bool)by_policy, cb_info->user_data[event]);
1245                 }
1246                 break;
1247         case MUSE_CAMERA_EVENT_TYPE_FOCUS_CHANGE:
1248                 {
1249                         int state = 0;
1250
1251                         muse_camera_msg_get(state, recv_msg);
1252
1253                         LOGD("FOCUS state - %d", state);
1254
1255                         ((camera_focus_changed_cb)cb_info->user_cb[event])((camera_focus_state_e)state, cb_info->user_data[event]);
1256                 }
1257                 break;
1258         case MUSE_CAMERA_EVENT_TYPE_CAPTURE_COMPLETE:
1259                 LOGD("CAPTURE_COMPLETED");
1260                 ((camera_capture_completed_cb)cb_info->user_cb[event])(cb_info->user_data[event]);
1261                 break;
1262         case MUSE_CAMERA_EVENT_TYPE_PREVIEW:
1263         case MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW:
1264                 __camera_event_handler_preview(cb_info, recv_msg);
1265                 break;
1266         case MUSE_CAMERA_EVENT_TYPE_HDR_PROGRESS:
1267                 {
1268                         int percent = 0;
1269
1270                         muse_camera_msg_get(percent, recv_msg);
1271
1272                         LOGD("HDR progress - %d %%", percent);
1273
1274                         ((camera_attr_hdr_progress_cb)cb_info->user_cb[event])(percent, cb_info->user_data[event]);
1275                 }
1276                 break;
1277         case MUSE_CAMERA_EVENT_TYPE_INTERRUPTED:
1278                 {
1279                         int policy = 0;
1280                         int previous = 0;
1281                         int current = 0;
1282
1283                         muse_camera_msg_get(policy, recv_msg);
1284                         muse_camera_msg_get(previous, recv_msg);
1285                         muse_camera_msg_get(current, recv_msg);
1286
1287                         LOGW("INTERRUPTED - policy %d, state previous %d, current %d",
1288                              policy, previous, current);
1289
1290                         if (policy == CAMERA_POLICY_SOUND)
1291                                 LOGW("DEPRECATION WARNING: CAMERA_POLICY_SOUND is deprecated and will be removed from next release.");
1292                         else if (policy == CAMERA_POLICY_SOUND_BY_CALL)
1293                                 LOGW("DEPRECATION WARNING: CAMERA_POLICY_SOUND_BY_CALL is deprecated and will be removed from next release.");
1294                         else if (policy == CAMERA_POLICY_SOUND_BY_ALARM)
1295                                 LOGW("DEPRECATION WARNING: CAMERA_POLICY_SOUND_BY_ALARM is deprecated and will be removed from next release.");
1296
1297                         ((camera_interrupted_cb)cb_info->user_cb[event])((camera_policy_e)policy,
1298                                 (camera_state_e)previous, (camera_state_e)current, cb_info->user_data[event]);
1299                 }
1300                 break;
1301         case MUSE_CAMERA_EVENT_TYPE_INTERRUPT_STARTED:
1302                 {
1303                         int policy = 0;
1304                         int state = 0;
1305
1306                         muse_camera_msg_get(policy, recv_msg);
1307                         muse_camera_msg_get(state, recv_msg);
1308
1309                         LOGW("INTERRUPT_STARTED - policy %d, state %d", policy, state);
1310
1311                         if (policy == CAMERA_POLICY_SOUND)
1312                                 LOGW("DEPRECATION WARNING: CAMERA_POLICY_SOUND is deprecated and will be removed from next release.");
1313                         else if (policy == CAMERA_POLICY_SOUND_BY_CALL)
1314                                 LOGW("DEPRECATION WARNING: CAMERA_POLICY_SOUND_BY_CALL is deprecated and will be removed from next release.");
1315                         else if (policy == CAMERA_POLICY_SOUND_BY_ALARM)
1316                                 LOGW("DEPRECATION WARNING: CAMERA_POLICY_SOUND_BY_ALARM is deprecated and will be removed from next release.");
1317
1318                         ((camera_interrupt_started_cb)cb_info->user_cb[event])((camera_policy_e)policy,
1319                                 (camera_state_e)state, cb_info->user_data[event]);
1320                 }
1321                 break;
1322         case MUSE_CAMERA_EVENT_TYPE_FACE_DETECTION:
1323                 __camera_event_handler_face_detection(cb_info, recv_msg);
1324                 break;
1325         case MUSE_CAMERA_EVENT_TYPE_ERROR:
1326                 {
1327                         int error = 0;
1328                         int current_state = 0;
1329
1330                         muse_camera_msg_get(error, recv_msg);
1331                         muse_camera_msg_get(current_state, recv_msg);
1332
1333                         LOGE("ERROR - error 0x%x, current_state %d", error, current_state);
1334
1335                         if (error == CAMERA_ERROR_SOUND_POLICY)
1336                                 LOGW("DEPRECATION WARNING: CAMERA_ERROR_SOUND_POLICY is deprecated and will be removed from next release.");
1337                         else if (error == CAMERA_ERROR_SOUND_POLICY_BY_CALL)
1338                                 LOGW("DEPRECATION WARNING: CAMERA_ERROR_SOUND_POLICY_BY_CALL is deprecated and will be removed from next release.");
1339                         else if (error == CAMERA_ERROR_SOUND_POLICY_BY_ALARM)
1340                                 LOGW("DEPRECATION WARNING: CAMERA_ERROR_SOUND_POLICY_BY_ALARM is deprecated and will be removed from next release.");
1341
1342                         ((camera_error_cb)cb_info->user_cb[event])((camera_error_e)error,
1343                                 (camera_state_e)current_state, cb_info->user_data[event]);
1344                 }
1345                 break;
1346         case MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_PREVIEW_RESOLUTION:
1347                 /* fall through */
1348         case MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_CAPTURE_RESOLUTION:
1349                 muse_camera_msg_get(param1, recv_msg);
1350                 muse_camera_msg_get(param2, recv_msg);
1351
1352                 /*LOGD("event %d SUPPORTED %d, %d", event, param1, param2);*/
1353
1354                 if (((camera_supported_cb_param2)cb_info->user_cb[event])(param1, param2, cb_info->user_data[event]) == false) {
1355                         cb_info->user_cb[event] = NULL;
1356                         cb_info->user_data[event] = NULL;
1357                         LOGW("stop foreach callback for event %d", event);
1358                 }
1359                 break;
1360         case MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_CAPTURE_FORMAT:
1361                 /* fall through */
1362         case MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_PREVIEW_FORMAT:
1363                 /* fall through */
1364         case MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_AF_MODE:
1365                 /* fall through */
1366         case MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_EXPOSURE_MODE:
1367                 /* fall through */
1368         case MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_ISO:
1369                 /* fall through */
1370         case MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_WHITEBALANCE:
1371                 /* fall through */
1372         case MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_EFFECT:
1373                 /* fall through */
1374         case MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_SCENE_MODE:
1375                 /* fall through */
1376         case MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_FLASH_MODE:
1377                 /* fall through */
1378         case MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_FPS:
1379                 /* fall through */
1380         case MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_FPS_BY_RESOLUTION:
1381                 /* fall through */
1382         case MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_STREAM_FLIP:
1383                 /* fall through */
1384         case MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_STREAM_ROTATION:
1385                 /* fall through */
1386         case MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_THEATER_MODE:
1387                 /* fall through */
1388         case MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_PTZ_TYPE:
1389                 muse_camera_msg_get(param1, recv_msg);
1390
1391                 /*LOGD("event %d SUPPORTED %d ", event, param1);*/
1392
1393                 if (((camera_supported_cb_param1)cb_info->user_cb[event])(param1, cb_info->user_data[event]) == false) {
1394                         cb_info->user_cb[event] = NULL;
1395                         cb_info->user_data[event] = NULL;
1396                         LOGW("stop foreach callback for event %d", event);
1397                 }
1398                 break;
1399         case MUSE_CAMERA_EVENT_TYPE_CAPTURE:
1400                 __camera_event_handler_capture(cb_info, recv_msg);
1401                 break;
1402         default:
1403                 LOGW("unhandled event %d", event);
1404                 break;
1405         }
1406
1407         g_mutex_unlock(&cb_info->user_cb_mutex[event]);
1408
1409         return;
1410 }
1411
1412 static bool _camera_idle_event_callback(void *data)
1413 {
1414         camera_cb_info_s *cb_info = NULL;
1415         camera_idle_event_s *cam_idle_event = (camera_idle_event_s *)data;
1416
1417         if (cam_idle_event == NULL) {
1418                 LOGE("cam_idle_event is NULL");
1419                 return false;
1420         }
1421
1422         /* lock event */
1423         g_mutex_lock(&cam_idle_event->event_mutex);
1424
1425         cb_info = cam_idle_event->cb_info;
1426         if (cb_info == NULL) {
1427                 LOGW("camera cb_info is NULL. event %p %d", cam_idle_event, cam_idle_event->event);
1428                 goto IDLE_EVENT_CALLBACK_DONE;
1429         }
1430
1431         /* remove event from list */
1432         g_mutex_lock(&cb_info->idle_event_mutex);
1433
1434         if (cb_info->idle_event_list)
1435                 cb_info->idle_event_list = g_list_remove(cb_info->idle_event_list, (gpointer)cam_idle_event);
1436
1437         /*LOGD("remove camera idle event %p, %p", cam_idle_event, cb_info->idle_event_list);*/
1438         g_mutex_unlock(&cb_info->idle_event_mutex);
1439
1440         /* user callback */
1441         _camera_client_user_callback(cb_info, cam_idle_event->recv_msg, cam_idle_event->event);
1442
1443         /* send signal for waiting thread */
1444         g_cond_signal(&cb_info->idle_event_cond);
1445
1446 IDLE_EVENT_CALLBACK_DONE:
1447         /* unlock and release event */
1448         g_mutex_unlock(&cam_idle_event->event_mutex);
1449         g_mutex_clear(&cam_idle_event->event_mutex);
1450
1451         g_free(cam_idle_event);
1452         cam_idle_event = NULL;
1453
1454         return false;
1455 }
1456
1457 static void *_camera_msg_handler_func(gpointer data)
1458 {
1459         int api = 0;
1460         int type = 0;
1461         camera_message_s *cam_msg = NULL;
1462         camera_idle_event_s *cam_idle_event = NULL;
1463         camera_msg_handler_info_s *handler_info = (camera_msg_handler_info_s *)data;
1464         camera_cb_info_s *cb_info = NULL;
1465
1466         if (!handler_info || !handler_info->cb_info) {
1467                 LOGE("NULL handler %p", handler_info);
1468                 return NULL;
1469         }
1470
1471         cb_info = (camera_cb_info_s *)handler_info->cb_info;
1472         type = handler_info->type;
1473
1474         LOGD("t:%d start", type);
1475
1476         g_mutex_lock(&handler_info->mutex);
1477
1478         while (g_atomic_int_get(&handler_info->running)) {
1479                 if (g_queue_is_empty(handler_info->queue)) {
1480                         /*LOGD("t:%d signal wait...", type);*/
1481                         g_cond_wait(&handler_info->cond, &handler_info->mutex);
1482                         /*LOGD("t:%d signal received", type);*/
1483
1484                         if (g_atomic_int_get(&handler_info->running) == 0) {
1485                                 LOGD("t:%d stop event thread", type);
1486                                 break;
1487                         }
1488                 }
1489
1490                 cam_msg = (camera_message_s *)g_queue_pop_head(handler_info->queue);
1491
1492                 g_mutex_unlock(&handler_info->mutex);
1493
1494                 if (cam_msg == NULL) {
1495                         LOGE("t:%d NULL message", type);
1496                         g_mutex_lock(&handler_info->mutex);
1497                         continue;
1498                 }
1499
1500                 api = cam_msg->api;
1501
1502                 if (api < MUSE_CAMERA_API_MAX) {
1503                         int ret = 0;
1504
1505                         g_mutex_lock(&cb_info->api_mutex[api]);
1506
1507                         if (muse_camera_msg_get(ret, cam_msg->recv_msg)) {
1508                                 if (cb_info->api_waiting[api] > 0) {
1509                                         cb_info->api_ret[api] = ret;
1510                                         cb_info->api_activating[api] = 1;
1511
1512                                         /*LOGD("t:%d camera api %d - return 0x%x", type, ret);*/
1513
1514                                         g_cond_signal(&cb_info->api_cond[api]);
1515                                 } else {
1516                                         LOGW("no waiting for this api [%d]", api);
1517                                 }
1518                         } else {
1519                                 LOGE("t:%d failed to get camera ret for api %d, msg %s", type, api, cam_msg->recv_msg);
1520                         }
1521
1522                         g_mutex_unlock(&cb_info->api_mutex[api]);
1523                 } else if (api == MUSE_CAMERA_CB_EVENT) {
1524                         switch (cam_msg->event_class) {
1525                         case MUSE_CAMERA_EVENT_CLASS_THREAD_SUB:
1526                                 _camera_client_user_callback(cb_info, cam_msg->recv_msg, cam_msg->event);
1527                                 break;
1528                         case MUSE_CAMERA_EVENT_CLASS_THREAD_MAIN:
1529                                 cam_idle_event = g_new0(camera_idle_event_s, 1);
1530                                 if (cam_idle_event == NULL) {
1531                                         LOGE("t:%d cam_idle_event alloc failed", type);
1532                                         break;
1533                                 }
1534
1535                                 cam_idle_event->event = cam_msg->event;
1536                                 cam_idle_event->cb_info = cb_info;
1537                                 g_mutex_init(&cam_idle_event->event_mutex);
1538                                 strncpy(cam_idle_event->recv_msg, cam_msg->recv_msg, sizeof(cam_idle_event->recv_msg) - 1);
1539
1540                                 /*LOGD("t:%d add camera event[%d, %p] to IDLE", type, cam_msg->event, cam_idle_event);*/
1541
1542                                 g_mutex_lock(&cb_info->idle_event_mutex);
1543                                 cb_info->idle_event_list = g_list_append(cb_info->idle_event_list, (gpointer)cam_idle_event);
1544                                 g_mutex_unlock(&cb_info->idle_event_mutex);
1545
1546                                 g_idle_add_full(G_PRIORITY_DEFAULT,
1547                                         (GSourceFunc)_camera_idle_event_callback,
1548                                         (gpointer)cam_idle_event,
1549                                         NULL);
1550                                 break;
1551                         default:
1552                                 LOGE("t:%d not handled event class %d", type, cam_msg->event_class);
1553                                 break;
1554                         }
1555                 } else {
1556                         LOGE("t:%d unknown camera api[%d] message[%s]", type, api, cam_msg->recv_msg);
1557                 }
1558
1559                 g_free(cam_msg);
1560                 cam_msg = NULL;
1561
1562                 g_mutex_lock(&handler_info->mutex);
1563         }
1564
1565         /* remove remained event */
1566         while (!g_queue_is_empty(handler_info->queue)) {
1567                 cam_msg = (camera_message_s *)g_queue_pop_head(handler_info->queue);
1568                 if (cam_msg) {
1569                         LOGD("t:%d remove camera message %p", type, cam_msg);
1570                         free(cam_msg);
1571                         cam_msg = NULL;
1572                 } else {
1573                         LOGW("t:%d NULL camera message", type);
1574                 }
1575         }
1576
1577         g_mutex_unlock(&handler_info->mutex);
1578
1579         LOGD("t:%d return", type);
1580
1581         return NULL;
1582 }
1583
1584
1585 static void _camera_deactivate_idle_event_all(camera_cb_info_s *cb_info)
1586 {
1587         camera_idle_event_s *cam_idle_event = NULL;
1588         GList *list = NULL;
1589         gint64 end_time = 0;
1590
1591         if (cb_info == NULL) {
1592                 LOGE("cb_info is NULL");
1593                 return;
1594         }
1595
1596         g_mutex_lock(&cb_info->idle_event_mutex);
1597
1598         if (cb_info->idle_event_list == NULL) {
1599                 LOGD("No remained idle event");
1600                 g_mutex_unlock(&cb_info->idle_event_mutex);
1601                 return;
1602         }
1603
1604         list = cb_info->idle_event_list;
1605
1606         while (list) {
1607                 cam_idle_event = list->data;
1608                 list = g_list_next(list);
1609
1610                 if (!cam_idle_event) {
1611                         LOGW("Fail to remove idle event. The event is NULL");
1612                         continue;
1613                 }
1614
1615                 if (g_idle_remove_by_data(cam_idle_event)) {
1616                         LOGW("remove idle event %p done", cam_idle_event);
1617
1618                         cb_info->idle_event_list = g_list_remove(cb_info->idle_event_list, (gpointer)cam_idle_event);
1619
1620                         g_mutex_clear(&cam_idle_event->event_mutex);
1621                         g_free(cam_idle_event);
1622                         cam_idle_event = NULL;
1623
1624                         continue;
1625                 }
1626
1627                 LOGW("remove idle event %p failed", cam_idle_event);
1628
1629                 if (!g_mutex_trylock(&cam_idle_event->event_mutex)) {
1630                         LOGW("lock failed, %p event is calling now", cam_idle_event);
1631
1632                         end_time = g_get_monotonic_time() + G_TIME_SPAN_MILLISECOND * 100;
1633
1634                         if (g_cond_wait_until(&cb_info->idle_event_cond, &cb_info->idle_event_mutex, end_time))
1635                                 LOGW("signal received");
1636                         else
1637                                 LOGW("timeout");
1638
1639                         continue;
1640                 }
1641
1642                 LOGW("set NULL cb_info for event %p %d, it will be freed on idle callback",
1643                         cam_idle_event, cam_idle_event->event);
1644
1645                 cam_idle_event->cb_info = NULL;
1646
1647                 cb_info->idle_event_list = g_list_remove(cb_info->idle_event_list, (gpointer)cam_idle_event);
1648
1649                 g_mutex_unlock(&cam_idle_event->event_mutex);
1650         }
1651
1652         g_list_free(cb_info->idle_event_list);
1653         cb_info->idle_event_list = NULL;
1654
1655         g_mutex_unlock(&cb_info->idle_event_mutex);
1656
1657         return;
1658 }
1659
1660
1661 static void __camera_add_msg_to_queue(camera_cb_info_s *cb_info, int api, int event, int event_class, char *msg)
1662 {
1663         camera_message_s *cam_msg = NULL;
1664
1665         if (!cb_info || !msg) {
1666                 LOGE("NULL pointer %p %p", cb_info, msg);
1667                 return;
1668         }
1669
1670         cam_msg = g_new0(camera_message_s, 1);
1671         if (!cam_msg) {
1672                 LOGE("failed to alloc cam_msg for [%s]", msg);
1673                 return;
1674         }
1675
1676         cam_msg->api = api;
1677         cam_msg->event = event;
1678         cam_msg->event_class = event_class;
1679
1680         strncpy(cam_msg->recv_msg, msg, sizeof(cam_msg->recv_msg) - 1);
1681
1682         /*LOGD("add camera message to queue : api %d, event %d, event_class %d", api, event, event_class);*/
1683
1684         if (event == MUSE_CAMERA_EVENT_TYPE_PREVIEW) {
1685                 g_mutex_lock(&cb_info->preview_cb_info.mutex);
1686                 g_queue_push_tail(cb_info->preview_cb_info.queue, (gpointer)cam_msg);
1687                 g_cond_signal(&cb_info->preview_cb_info.cond);
1688                 g_mutex_unlock(&cb_info->preview_cb_info.mutex);
1689         } else if (event == MUSE_CAMERA_EVENT_TYPE_CAPTURE) {
1690                 g_mutex_lock(&cb_info->capture_cb_info.mutex);
1691                 g_queue_push_tail(cb_info->capture_cb_info.queue, (gpointer)cam_msg);
1692                 g_cond_signal(&cb_info->capture_cb_info.cond);
1693                 g_mutex_unlock(&cb_info->capture_cb_info.mutex);
1694         } else {
1695                 g_mutex_lock(&cb_info->msg_handler_info.mutex);
1696                 g_queue_push_tail(cb_info->msg_handler_info.queue, (gpointer)cam_msg);
1697                 g_cond_signal(&cb_info->msg_handler_info.cond);
1698                 g_mutex_unlock(&cb_info->msg_handler_info.mutex);
1699         }
1700
1701         cam_msg = NULL;
1702
1703         return;
1704 }
1705
1706
1707 static void __camera_process_msg(camera_cb_info_s *cb_info, char *msg)
1708 {
1709         int ret = CAMERA_ERROR_NONE;
1710         int api = -1;
1711         int api_class = -1;
1712         int event = -1;
1713         int event_class = -1;
1714         int get_type = -1;
1715         int get_index = -1;
1716
1717         if (!cb_info || !msg) {
1718                 LOGE("invalid ptr %p %p", cb_info, msg);
1719                 return;
1720         }
1721
1722         /*LOGD("msg [%s]", msg);*/
1723
1724         if (!muse_camera_msg_get(api, msg)) {
1725                 LOGE("failed to get camera api");
1726                 return;
1727         }
1728
1729         if (api == MUSE_CAMERA_CB_EVENT) {
1730                 if (!muse_camera_msg_get(event, msg) ||
1731                         !muse_camera_msg_get(event_class, msg)) {
1732                         LOGE("failed to get camera event or event_class [%s]", msg);
1733                         return;
1734                 }
1735         } else {
1736                 if (!muse_camera_msg_get(api_class, msg)) {
1737                         LOGE("failed to get camera api_class [%s]", msg);
1738                         return;
1739                 }
1740         }
1741
1742         if (api_class == MUSE_CAMERA_API_CLASS_IMMEDIATE) {
1743                 if (api >= MUSE_CAMERA_API_MAX) {
1744                         LOGE("invalid api %d", api);
1745                         return;
1746                 }
1747
1748                 if (!muse_camera_msg_get(ret, msg)) {
1749                         LOGE("failed to get camera ret");
1750                         return;
1751                 }
1752
1753                 g_mutex_lock(&cb_info->api_mutex[api]);
1754
1755                 switch (api) {
1756                 case MUSE_CAMERA_API_CREATE:
1757                         if (ret != CAMERA_ERROR_NONE) {
1758                                 g_atomic_int_set(&cb_info->msg_recv_running, 0);
1759                                 LOGE("camera create error 0x%x. close client cb handler", ret);
1760                         }
1761                         break;
1762                 case MUSE_CAMERA_API_DESTROY:
1763                         if (ret == CAMERA_ERROR_NONE) {
1764                                 g_atomic_int_set(&cb_info->msg_recv_running, 0);
1765                                 LOGD("camera destroy done. close client cb handler");
1766                         }
1767                         break;
1768                 default:
1769                         muse_camera_msg_get(get_type, msg);
1770                         if (get_type != MUSE_CAMERA_GET_TYPE_NONE) {
1771                                 if (get_type != MUSE_CAMERA_GET_TYPE_ARRAY)
1772                                         muse_camera_msg_get(get_index, msg);
1773
1774                                 switch (get_type) {
1775                                 case MUSE_CAMERA_GET_TYPE_INT:
1776                                         muse_core_msg_deserialize("get_value", msg, NULL, NULL, MUSE_TYPE_INT, &cb_info->get_int[get_index]);
1777                                         break;
1778                                 case MUSE_CAMERA_GET_TYPE_INT_PAIR:
1779                                         muse_core_msg_deserialize("get_value0", msg, NULL, NULL, MUSE_TYPE_INT, &cb_info->get_int_pair[get_index][0]);
1780                                         muse_core_msg_deserialize("get_value1", msg, NULL, NULL, MUSE_TYPE_INT, &cb_info->get_int_pair[get_index][1]);
1781                                         break;
1782                                 case MUSE_CAMERA_GET_TYPE_ARRAY:
1783                                         if (api == MUSE_CAMERA_API_GET_DISPLAY_ROI_AREA) {
1784                                                 muse_core_msg_deserialize("get_value",
1785                                                         msg, NULL, NULL, MUSE_TYPE_ARRAY, cb_info->get_display_roi_area);
1786                                                 LOGD("get display roi %d,%d,%dx%d",
1787                                                         cb_info->get_display_roi_area[0],
1788                                                         cb_info->get_display_roi_area[1],
1789                                                         cb_info->get_display_roi_area[2],
1790                                                         cb_info->get_display_roi_area[3]);
1791                                         } else {
1792                                                 muse_core_msg_deserialize("get_value",
1793                                                         msg, NULL, NULL, MUSE_TYPE_ARRAY, cb_info->get_geotag);
1794                                                 LOGD("get geotag %lf, %lf, %lf",
1795                                                         cb_info->get_geotag[0], cb_info->get_geotag[1], cb_info->get_geotag[2]);
1796                                         }
1797                                         break;
1798                                 case MUSE_CAMERA_GET_TYPE_STRING:
1799                                         muse_core_msg_deserialize("get_value", msg, NULL, NULL, MUSE_TYPE_STRING, cb_info->get_string[get_index]);
1800                                         break;
1801                                 default:
1802                                         LOGW("unknown type %d", get_type);
1803                                         break;
1804                                 }
1805                         }
1806                         break;
1807                 }
1808
1809                 if (cb_info->api_waiting[api] > 0) {
1810                         cb_info->api_ret[api] = ret;
1811                         cb_info->api_activating[api] = 1;
1812
1813                         g_cond_signal(&cb_info->api_cond[api]);
1814                 } else {
1815                         LOGW("no waiting for this api [%d]", api);
1816                 }
1817
1818                 g_mutex_unlock(&cb_info->api_mutex[api]);
1819         } else if (api_class == MUSE_CAMERA_API_CLASS_THREAD_SUB || api == MUSE_CAMERA_CB_EVENT) {
1820                 __camera_add_msg_to_queue(cb_info, api, event, event_class, msg);
1821         } else {
1822                 LOGW("unknown camera api %d, class %d", api, api_class);
1823         }
1824
1825         return;
1826 }
1827
1828
1829 static void *_camera_msg_recv_func(gpointer data)
1830 {
1831         int recv_length = 0;
1832         int single_length = 0;
1833         int remained_length = 0;
1834         char *recv_msg = NULL;
1835         char *single_msg = NULL;
1836         char *remained_msg = NULL;
1837         int num_msg = 0;
1838         int cur_pos = 0;
1839         int prev_pos = 0;
1840         camera_cb_info_s *cb_info = (camera_cb_info_s *)data;
1841
1842         if (!cb_info) {
1843                 LOGE("cb_info NULL");
1844                 return NULL;
1845         }
1846
1847         LOGD("start - fd : %d", cb_info->fd);
1848
1849         single_msg = (char *)malloc(sizeof(char) * MUSE_CAMERA_MSG_MAX_LENGTH);
1850         if (!single_msg) {
1851                 LOGE("single_msg malloc failed");
1852                 return NULL;
1853         }
1854
1855         recv_msg = cb_info->recv_msg;
1856
1857         while (g_atomic_int_get(&cb_info->msg_recv_running)) {
1858                 recv_length = muse_core_msg_recv(cb_info->fd, recv_msg);
1859                 if (recv_length <= 0) {
1860                         cb_info->is_server_connected = FALSE;
1861                         LOGE("receive msg failed - server disconnected");
1862                         break;
1863                 }
1864
1865                 cur_pos = 0;
1866                 prev_pos = 0;
1867                 num_msg = 0;
1868
1869                 /*LOGD("recv msg : %s, length : %d", recv_msg, recv_length);*/
1870
1871                 /* Need to split the combined entering msgs */
1872                 for (cur_pos = 0 ; cur_pos < recv_length ; cur_pos++) {
1873                         if (recv_msg[cur_pos] == '}') {
1874                                 single_length = cur_pos - prev_pos + 1;
1875
1876                                 if (single_length < MUSE_CAMERA_MSG_MAX_LENGTH) {
1877                                         /* check remained msg */
1878                                         if (remained_length > 0) {
1879                                                 if (remained_msg) {
1880                                                         strncpy(single_msg, remained_msg, remained_length);
1881                                                         strncpy(single_msg + remained_length, recv_msg + prev_pos, single_length);
1882                                                         single_msg[remained_length + single_length] = '\0';
1883
1884                                                         free(remained_msg);
1885                                                         remained_msg = NULL;
1886                                                 } else {
1887                                                         strncpy(single_msg, recv_msg + prev_pos, single_length);
1888                                                         single_msg[single_length] = '\0';
1889                                                         LOGE("lost msg [%s], skip...", single_msg);
1890                                                 }
1891
1892                                                 remained_length = 0;
1893                                         } else {
1894                                                 strncpy(single_msg, recv_msg + prev_pos, single_length);
1895                                                 single_msg[single_length] = '\0';
1896                                         }
1897
1898                                         if (single_msg[0] == '{') {
1899                                                 num_msg++;
1900                                                 /*LOGD("splitted msg : [%s], Index : %d", single_msg, num_msg);*/
1901                                                 /* process each message */
1902                                                 __camera_process_msg(cb_info, single_msg);
1903                                         } else {
1904                                                 LOGE("invalid msg [%s]", single_msg);
1905                                         }
1906                                 } else {
1907                                         LOGE("too long message [len %d] skip...", single_length);
1908                                 }
1909
1910                                 prev_pos = cur_pos + 1;
1911                         }
1912                 }
1913
1914                 /* check incompleted message */
1915                 if (recv_msg[recv_length - 1] != '}') {
1916                         remained_length = recv_length - prev_pos;
1917
1918                         LOGW("incompleted message [len %d]", remained_length);
1919
1920                         if (remained_msg) {
1921                                 free(remained_msg);
1922                                 remained_msg = NULL;
1923                         }
1924
1925                         remained_msg = (char *)malloc(remained_length + 1);
1926                         if (remained_msg) {
1927                                 strncpy(remained_msg, recv_msg + prev_pos, remained_length);
1928                                 remained_msg[remained_length] = '\0';
1929                         } else {
1930                                 LOGE("failed to alloc for remained msg");
1931                         }
1932                 } else {
1933                         remained_length = 0;
1934                 }
1935         }
1936
1937         LOGD("client cb exit - server connected %d", cb_info->is_server_connected);
1938
1939         if (!cb_info->is_server_connected) {
1940                 char *error_msg = NULL;
1941
1942                 if (cb_info->fd < 0) {
1943                         LOGE("fd is closed in client side");
1944                         goto CB_HANDLER_EXIT;
1945                 }
1946
1947                 /* send error msg for server disconnection */
1948                 error_msg = muse_core_msg_new(MUSE_CAMERA_CB_EVENT,
1949                         MUSE_TYPE_INT, "error", CAMERA_ERROR_SERVICE_DISCONNECTED,
1950                         MUSE_TYPE_INT, "current_state", CAMERA_STATE_NONE,
1951                         NULL);
1952
1953                 if (!error_msg) {
1954                         LOGE("error_msg failed");
1955                         goto CB_HANDLER_EXIT;
1956                 }
1957
1958                 __camera_add_msg_to_queue(cb_info,
1959                         MUSE_CAMERA_CB_EVENT,
1960                         MUSE_CAMERA_EVENT_TYPE_ERROR,
1961                         MUSE_CAMERA_EVENT_CLASS_THREAD_MAIN,
1962                         error_msg);
1963
1964                 muse_core_msg_free(error_msg);
1965                 error_msg = NULL;
1966
1967                 LOGE("add error msg for service disconnection done");
1968         }
1969
1970 CB_HANDLER_EXIT:
1971         if (single_msg) {
1972                 free(single_msg);
1973                 single_msg = NULL;
1974         }
1975
1976         if (remained_msg) {
1977                 free(remained_msg);
1978                 remained_msg = NULL;
1979         }
1980
1981         return NULL;
1982 }
1983
1984
1985 static bool __create_msg_handler_thread(camera_msg_handler_info_s *handler_info,
1986         int type, const char *thread_name, camera_cb_info_s *cb_info)
1987 {
1988         if (!handler_info || !thread_name || !cb_info) {
1989                 LOGE("t:%d NULL %p %p %p",
1990                         type, handler_info, thread_name, cb_info);
1991                 return false;
1992         }
1993
1994         LOGD("t:%d", type);
1995
1996         handler_info->type = type;
1997         handler_info->queue = g_queue_new();
1998         if (handler_info->queue == NULL) {
1999                 LOGE("t:%d queue failed", type);
2000                 return false;
2001         }
2002
2003         g_mutex_init(&handler_info->mutex);
2004         g_cond_init(&handler_info->cond);
2005
2006         handler_info->cb_info = (void *)cb_info;
2007         g_atomic_int_set(&handler_info->running, 1);
2008
2009         handler_info->thread = g_thread_try_new(thread_name,
2010                 _camera_msg_handler_func, (gpointer)handler_info, NULL);
2011         if (handler_info->thread == NULL) {
2012                 LOGE("t:%d thread failed", type);
2013
2014                 g_mutex_clear(&handler_info->mutex);
2015                 g_cond_clear(&handler_info->cond);
2016                 g_queue_free(handler_info->queue);
2017                 handler_info->queue = NULL;
2018
2019                 return false;
2020         }
2021
2022         LOGD("t:%d done", type);
2023
2024         return true;
2025 }
2026
2027
2028 static void __destroy_msg_handler_thread(camera_msg_handler_info_s *handler_info)
2029 {
2030         int type = 0;
2031
2032         if (!handler_info) {
2033                 LOGE("NULL handler");
2034                 return;
2035         }
2036
2037         if (!handler_info->thread) {
2038                 LOGW("thread is not created");
2039                 return;
2040         }
2041
2042         type = handler_info->type;
2043
2044         LOGD("t:%d thread %p", type, handler_info->thread);
2045
2046         g_mutex_lock(&handler_info->mutex);
2047         g_atomic_int_set(&handler_info->running, 0);
2048         g_cond_signal(&handler_info->cond);
2049         g_mutex_unlock(&handler_info->mutex);
2050
2051         g_thread_join(handler_info->thread);
2052         handler_info->thread = NULL;
2053
2054         g_mutex_clear(&handler_info->mutex);
2055         g_cond_clear(&handler_info->cond);
2056         g_queue_free(handler_info->queue);
2057         handler_info->queue = NULL;
2058
2059         LOGD("t:%d done", type);
2060
2061         return;
2062 }
2063
2064
2065 static camera_cb_info_s *_camera_client_callback_new(gint sockfd)
2066 {
2067         camera_cb_info_s *cb_info = NULL;
2068         gint i = 0;
2069
2070         g_return_val_if_fail(sockfd > 0, NULL);
2071
2072         cb_info = g_new0(camera_cb_info_s, 1);
2073         if (cb_info == NULL) {
2074                 LOGE("cb_info failed");
2075                 goto ErrorExit;
2076         }
2077
2078         cb_info->api_waiting[MUSE_CAMERA_API_CREATE] = 1;
2079
2080         for (i = 0 ; i < MUSE_CAMERA_API_MAX ; i++) {
2081                 g_mutex_init(&cb_info->api_mutex[i]);
2082                 g_cond_init(&cb_info->api_cond[i]);
2083         }
2084
2085         g_mutex_init(&cb_info->fd_lock);
2086         g_mutex_init(&cb_info->idle_event_mutex);
2087         g_cond_init(&cb_info->idle_event_cond);
2088         g_mutex_init(&cb_info->mp_data_mutex);
2089
2090         for (i = 0 ; i < MUSE_CAMERA_EVENT_TYPE_NUM ; i++)
2091                 g_mutex_init(&cb_info->user_cb_mutex[i]);
2092
2093         /* message handler thread */
2094         if (!__create_msg_handler_thread(&cb_info->msg_handler_info,
2095                 CAMERA_MESSAGE_HANDLER_TYPE_GENERAL, "camera_msg_handler", cb_info)) {
2096                 LOGE("msg_handler_info failed");
2097                 goto ErrorExit;
2098         }
2099
2100         /* message handler thread for preview callback */
2101         if (!__create_msg_handler_thread(&cb_info->preview_cb_info,
2102                 CAMERA_MESSAGE_HANDLER_TYPE_PREVIEW_CB, "camera_msg_handler:preview_cb", cb_info)) {
2103                 LOGE("preview_cb_info failed");
2104                 goto ErrorExit;
2105         }
2106
2107         /* message handler thread for capture callback */
2108         if (!__create_msg_handler_thread(&cb_info->capture_cb_info,
2109                 CAMERA_MESSAGE_HANDLER_TYPE_CAPTURE_CB, "camera_msg_handler:capture_cb", cb_info)) {
2110                 LOGE("capture_cb_info failed");
2111                 goto ErrorExit;
2112         }
2113
2114         cb_info->fd = sockfd;
2115         cb_info->preview_cb_flag = 0;
2116
2117         /* message receive thread */
2118         g_atomic_int_set(&cb_info->msg_recv_running, 1);
2119         cb_info->msg_recv_thread = g_thread_try_new("camera_msg_recv",
2120                 _camera_msg_recv_func, (gpointer)cb_info, NULL);
2121         if (cb_info->msg_recv_thread == NULL) {
2122                 LOGE("message receive thread creation failed");
2123                 goto ErrorExit;
2124         }
2125
2126         cb_info->is_server_connected = TRUE;
2127
2128         return cb_info;
2129
2130 ErrorExit:
2131         if (cb_info) {
2132                 __destroy_msg_handler_thread(&cb_info->msg_handler_info);
2133                 __destroy_msg_handler_thread(&cb_info->preview_cb_info);
2134                 __destroy_msg_handler_thread(&cb_info->capture_cb_info);
2135
2136                 for (i = 0 ; i < MUSE_CAMERA_EVENT_TYPE_NUM ; i++)
2137                         g_mutex_clear(&cb_info->user_cb_mutex[i]);
2138
2139                 g_mutex_clear(&cb_info->fd_lock);
2140                 g_mutex_clear(&cb_info->idle_event_mutex);
2141                 g_cond_clear(&cb_info->idle_event_cond);
2142                 g_mutex_clear(&cb_info->mp_data_mutex);
2143
2144                 for (i = 0 ; i < MUSE_CAMERA_API_MAX ; i++) {
2145                         g_mutex_clear(&cb_info->api_mutex[i]);
2146                         g_cond_clear(&cb_info->api_cond[i]);
2147                 }
2148
2149                 g_free(cb_info);
2150                 cb_info = NULL;
2151         }
2152
2153         return NULL;
2154 }
2155
2156 static void _camera_client_callback_destroy(camera_cb_info_s *cb_info)
2157 {
2158         int i = 0;
2159
2160         g_return_if_fail(cb_info != NULL);
2161
2162         LOGD("msg_recv thread[%p] destroy", cb_info->msg_recv_thread);
2163
2164         g_thread_join(cb_info->msg_recv_thread);
2165         cb_info->msg_recv_thread = NULL;
2166
2167         LOGD("msg_recv thread removed");
2168
2169         /* destroy msg handler threads */
2170         __destroy_msg_handler_thread(&cb_info->msg_handler_info);
2171         __destroy_msg_handler_thread(&cb_info->preview_cb_info);
2172         __destroy_msg_handler_thread(&cb_info->capture_cb_info);
2173
2174         for (i = 0 ; i < MUSE_CAMERA_EVENT_TYPE_NUM ; i++)
2175                 g_mutex_clear(&cb_info->user_cb_mutex[i]);
2176
2177         g_mutex_clear(&cb_info->fd_lock);
2178         g_mutex_clear(&cb_info->idle_event_mutex);
2179         g_cond_clear(&cb_info->idle_event_cond);
2180         g_mutex_clear(&cb_info->mp_data_mutex);
2181
2182         for (i = 0 ; i < MUSE_CAMERA_API_MAX ; i++) {
2183                 g_mutex_clear(&cb_info->api_mutex[i]);
2184                 g_cond_clear(&cb_info->api_cond[i]);
2185         }
2186
2187         if (cb_info->fd > -1) {
2188                 muse_client_close(cb_info->fd);
2189                 cb_info->fd = -1;
2190         }
2191
2192         if (cb_info->bufmgr) {
2193                 tbm_bufmgr_deinit(cb_info->bufmgr);
2194                 cb_info->bufmgr = NULL;
2195         }
2196         if (cb_info->pkt_fmt) {
2197                 media_format_unref(cb_info->pkt_fmt);
2198                 cb_info->pkt_fmt = NULL;
2199         }
2200
2201         if (cb_info->dp_interface) {
2202                 mm_display_interface_deinit(cb_info->dp_interface);
2203                 cb_info->dp_interface = NULL;
2204         }
2205
2206         cb_info->preview_cb_flag = 0;
2207
2208         g_free(cb_info);
2209         cb_info = NULL;
2210
2211         return;
2212 }
2213
2214
2215 int _camera_start_evas_rendering(camera_h camera)
2216 {
2217         camera_cli_s *pc = (camera_cli_s *)camera;
2218
2219         if (!pc || !pc->cb_info) {
2220                 LOGE("NULL handle");
2221                 return CAMERA_ERROR_INVALID_PARAMETER;
2222         }
2223
2224         LOGD("start");
2225
2226         if (!CHECK_PREVIEW_CB(pc->cb_info, PREVIEW_CB_TYPE_EVAS)) {
2227                 LOGE("EVAS surface is not set");
2228                 return CAMERA_ERROR_NONE;
2229         }
2230
2231         /* set evas render flag as RUN */
2232         pc->cb_info->run_evas_render = true;
2233
2234         return CAMERA_ERROR_NONE;
2235 }
2236
2237
2238 int _camera_stop_evas_rendering(camera_h camera, bool keep_screen)
2239 {
2240         int ret = CAMERA_ERROR_NONE;
2241         camera_cli_s *pc = (camera_cli_s *)camera;
2242
2243         if (!pc || !pc->cb_info) {
2244                 LOGE("NULL handle");
2245                 return CAMERA_ERROR_INVALID_PARAMETER;
2246         }
2247
2248         LOGD("stop - keep screen %d", keep_screen);
2249
2250         if (!CHECK_PREVIEW_CB(pc->cb_info, PREVIEW_CB_TYPE_EVAS)) {
2251                 LOGE("EVAS surface is not set");
2252                 return CAMERA_ERROR_NONE;
2253         }
2254
2255         /* set evas render flag as STOP and release buffers */
2256         pc->cb_info->run_evas_render = false;
2257
2258         ret = mm_display_interface_evas_flush(pc->cb_info->dp_interface, keep_screen);
2259         if (ret == MM_ERROR_NONE) {
2260                 ret = CAMERA_ERROR_NONE;
2261         } else {
2262                 LOGE("mm_evas_renderer_retrieve_all_packets failed 0x%x", ret);
2263                 ret = CAMERA_ERROR_INVALID_OPERATION;
2264         }
2265
2266         return ret;
2267 }
2268
2269
2270 int _camera_independent_request(int api, int device_type, const char *key, int *value)
2271 {
2272         int ret = CAMERA_ERROR_NONE;
2273         int sock_fd = -1;
2274         char *msg = NULL;
2275         char recv_msg[MUSE_CAMERA_MSG_MAX_LENGTH] = {'\0',};
2276
2277         /* create muse connection */
2278         if (!key || !value) {
2279                 LOGE("NULL pointer");
2280                 return CAMERA_ERROR_INVALID_PARAMETER;
2281         }
2282
2283         sock_fd = muse_client_new();
2284         if (sock_fd < 0) {
2285                 LOGE("muse_client_new failed");
2286                 return CAMERA_ERROR_INVALID_OPERATION;
2287         }
2288
2289         msg = muse_core_msg_new(api,
2290                 MUSE_TYPE_INT, "module", MUSE_CAMERA,
2291                 MUSE_TYPE_INT, PARAM_DEVICE_TYPE, device_type,
2292                 0);
2293         if (!msg) {
2294                 LOGE("msg failed");
2295                 ret = CAMERA_ERROR_OUT_OF_MEMORY;
2296                 goto _REQUEST_EXIT;
2297         }
2298
2299         ret = muse_core_msg_send(sock_fd, msg);
2300
2301         muse_core_msg_free(msg);
2302         msg = NULL;
2303
2304         if (ret < 0) {
2305                 LOGE("send msg failed");
2306                 ret = CAMERA_ERROR_INVALID_OPERATION;
2307                 goto _REQUEST_EXIT;
2308         }
2309
2310         ret = muse_core_msg_recv(sock_fd, recv_msg);
2311         if (ret <= 0) {
2312                 LOGE("recv msg failed %d", errno);
2313                 ret = CAMERA_ERROR_INVALID_OPERATION;
2314                 goto _REQUEST_EXIT;
2315         }
2316
2317         if (!muse_camera_msg_get(ret, recv_msg)) {
2318                 LOGE("failed to get return value from msg [%s]", recv_msg);
2319                 ret = CAMERA_ERROR_INVALID_OPERATION;
2320                 goto _REQUEST_EXIT;
2321         }
2322
2323         if (ret == CAMERA_ERROR_NONE)
2324                 muse_core_msg_deserialize(key, recv_msg, NULL, NULL, MUSE_TYPE_ANY, value);
2325
2326         LOGD("api %d - value %d", api, *value);
2327
2328 _REQUEST_EXIT:
2329         if (sock_fd > -1) {
2330                 muse_client_close(sock_fd);
2331                 sock_fd = -1;
2332         }
2333
2334         return ret;
2335 }
2336
2337
2338 int camera_create(camera_device_e device, camera_h *camera)
2339 {
2340         int sock_fd = -1;
2341         char *send_msg = NULL;
2342         int send_ret = 0;
2343         int ret = CAMERA_ERROR_NONE;
2344         int pid = 0;
2345         camera_cli_s *pc = NULL;
2346         tbm_bufmgr bufmgr = NULL;
2347
2348         muse_camera_api_e api = MUSE_CAMERA_API_CREATE;
2349         muse_core_api_module_e muse_module = MUSE_CAMERA;
2350         int device_type = (int)device;
2351
2352         if (!camera) {
2353                 LOGE("NULL pointer");
2354                 return CAMERA_ERROR_INVALID_PARAMETER;
2355         }
2356
2357         sock_fd = muse_client_new();
2358         if (sock_fd < 0) {
2359                 LOGE("muse_client_new failed - returned fd %d", sock_fd);
2360                 ret = CAMERA_ERROR_INVALID_OPERATION;
2361                 goto ErrorExit;
2362         }
2363
2364         pid = getpid();
2365
2366         send_msg = muse_core_msg_new(api,
2367                 MUSE_TYPE_INT, "module", muse_module,
2368                 MUSE_TYPE_INT, PARAM_DEVICE_TYPE, device_type,
2369                 MUSE_TYPE_INT, "pid", pid,
2370                 0);
2371
2372         if (!send_msg) {
2373                 LOGE("NULL msg");
2374                 ret = CAMERA_ERROR_OUT_OF_MEMORY;
2375                 goto ErrorExit;
2376         }
2377
2378         send_ret = muse_core_msg_send(sock_fd, send_msg);
2379
2380         muse_core_msg_free(send_msg);
2381         send_msg = NULL;
2382
2383         if (send_ret < 0) {
2384                 LOGE("send msg failed %d", errno);
2385                 ret = CAMERA_ERROR_INVALID_OPERATION;
2386                 goto ErrorExit;
2387         }
2388
2389         pc = g_new0(camera_cli_s, 1);
2390         if (pc == NULL) {
2391                 LOGE("camera_cli_s alloc failed");
2392                 ret = CAMERA_ERROR_OUT_OF_MEMORY;
2393                 goto ErrorExit;
2394         }
2395
2396         bufmgr = tbm_bufmgr_init(-1);
2397         if (bufmgr == NULL) {
2398                 LOGE("get tbm bufmgr failed");
2399                 ret = CAMERA_ERROR_INVALID_OPERATION;
2400                 goto ErrorExit;
2401         }
2402
2403         pc->cb_info = _camera_client_callback_new(sock_fd);
2404         if (pc->cb_info == NULL) {
2405                 LOGE("cb_info alloc failed");
2406                 ret = CAMERA_ERROR_OUT_OF_MEMORY;
2407                 goto ErrorExit;
2408         }
2409
2410         sock_fd = -1;
2411
2412         LOGD("cb info : %d", pc->cb_info->fd);
2413
2414         ret = _camera_client_wait_for_cb_return(api, pc->cb_info, CAMERA_CB_TIMEOUT);
2415
2416         pc->cb_info->api_waiting[MUSE_CAMERA_API_CREATE] = 0;
2417
2418         if (ret == CAMERA_ERROR_NONE) {
2419                 intptr_t handle = 0;
2420                 muse_camera_msg_get_pointer(handle, pc->cb_info->recv_msg);
2421                 if (handle == 0) {
2422                         LOGE("Receiving Handle Failed!!");
2423                         ret = CAMERA_ERROR_INVALID_OPERATION;
2424                         goto ErrorExit;
2425                 }
2426
2427                 pc->remote_handle = handle;
2428                 pc->cb_info->bufmgr = bufmgr;
2429
2430                 ret = camera_set_display((camera_h)pc, CAMERA_DISPLAY_TYPE_NONE, NULL);
2431                 if (ret != CAMERA_ERROR_NONE) {
2432                         LOGE("init display failed 0x%x", ret);
2433                         goto ErrorExit;
2434                 }
2435
2436                 LOGD("camera create 0x%x", pc->remote_handle);
2437                 *camera = (camera_h)pc;
2438         } else {
2439                 goto ErrorExit;
2440         }
2441
2442         return ret;
2443
2444 ErrorExit:
2445         if (bufmgr) {
2446                 tbm_bufmgr_deinit(bufmgr);
2447                 bufmgr = NULL;
2448         }
2449
2450         if (sock_fd > -1) {
2451                 muse_client_close(sock_fd);
2452                 sock_fd = -1;
2453         }
2454
2455         if (pc) {
2456                 if (pc->cb_info) {
2457                         int temp_fd = pc->cb_info->fd;
2458
2459                         /* pc->cb_info->fd should be closed,
2460                            because g_thread_join for msg_recv_thread is not returned
2461                            in _camera_client_callback_destroy. */
2462                         if (temp_fd > -1) {
2463                                 pc->cb_info->fd = -1;
2464                                 muse_client_close(temp_fd);
2465                         }
2466
2467                         _camera_client_callback_destroy(pc->cb_info);
2468                         pc->cb_info = NULL;
2469                 }
2470                 g_free(pc);
2471                 pc = NULL;
2472         }
2473
2474         LOGE("camera create error : 0x%x", ret);
2475
2476         return ret;
2477 }
2478
2479
2480 int camera_change_device(camera_h camera, camera_device_e device)
2481 {
2482         int i = 0;
2483         int ret = CAMERA_ERROR_NONE;
2484         muse_camera_api_e api = MUSE_CAMERA_API_CHANGE_DEVICE;
2485         camera_cli_s *pc = (camera_cli_s *)camera;
2486         camera_msg_param param;
2487
2488         if (!pc || !pc->cb_info) {
2489                 LOGE("NULL handle");
2490                 return CAMERA_ERROR_INVALID_PARAMETER;
2491         }
2492
2493         CAMERA_MSG_PARAM_SET(param, INT, device);
2494
2495         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
2496
2497         if (ret == CAMERA_ERROR_NONE) {
2498                 /* reset callback and user data */
2499                 for (i = 0 ; i < MUSE_CAMERA_EVENT_TYPE_NUM ; i++) {
2500                         pc->cb_info->user_cb[i] = NULL;
2501                         pc->cb_info->user_data[i] = NULL;
2502                 }
2503                 UNSET_PREVIEW_CB_TYPE(pc->cb_info, PREVIEW_CB_TYPE_USER);
2504         }
2505
2506         return ret;
2507 }
2508
2509
2510 int camera_destroy(camera_h camera)
2511 {
2512         int ret = CAMERA_ERROR_NONE;
2513         muse_camera_api_e api = MUSE_CAMERA_API_DESTROY;
2514         camera_cli_s *pc = (camera_cli_s *)camera;
2515
2516         if (!pc || !pc->cb_info) {
2517                 LOGE("NULL handle");
2518                 return CAMERA_ERROR_INVALID_PARAMETER;
2519         }
2520
2521         LOGD("Enter");
2522
2523         if (pc->cb_info->is_server_connected)
2524                 _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
2525         else
2526                 LOGW("server disconnected. release resource without send message.");
2527
2528         if (ret == CAMERA_ERROR_NONE) {
2529                 _camera_deactivate_idle_event_all(pc->cb_info);
2530                 _camera_client_callback_destroy(pc->cb_info);
2531                 pc->cb_info = NULL;
2532
2533                 g_free(pc);
2534                 pc = NULL;
2535         }
2536
2537         LOGD("ret : 0x%x", ret);
2538
2539         return ret;
2540 }
2541
2542 int camera_start_preview(camera_h camera)
2543 {
2544         int ret = CAMERA_ERROR_NONE;
2545         muse_camera_api_e api = MUSE_CAMERA_API_START_PREVIEW;
2546         camera_cli_s *pc = (camera_cli_s *)camera;
2547
2548         if (!pc || !pc->cb_info) {
2549                 LOGE("NULL handle");
2550                 return CAMERA_ERROR_INVALID_PARAMETER;
2551         }
2552
2553         LOGD("Enter");
2554
2555         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_NO_TIMEOUT);
2556         if (ret == CAMERA_ERROR_NONE && CHECK_PREVIEW_CB(pc->cb_info, PREVIEW_CB_TYPE_EVAS)) {
2557                 ret = _camera_start_evas_rendering(camera);
2558                 if (ret != CAMERA_ERROR_NONE) {
2559                         LOGE("stop preview because of error");
2560                         _camera_msg_send(MUSE_CAMERA_API_STOP_PREVIEW, pc->cb_info, NULL, 0);
2561                 }
2562         }
2563
2564         LOGD("ret : 0x%x", ret);
2565
2566         return ret;
2567 }
2568
2569
2570 int camera_stop_preview(camera_h camera)
2571 {
2572         int ret = CAMERA_ERROR_NONE;
2573         camera_cli_s *pc = (camera_cli_s *)camera;
2574         muse_camera_api_e api = MUSE_CAMERA_API_STOP_PREVIEW;
2575         camera_state_e current_state = CAMERA_STATE_NONE;
2576
2577         if (!pc || !pc->cb_info) {
2578                 LOGE("NULL handle");
2579                 return CAMERA_ERROR_INVALID_PARAMETER;
2580         }
2581
2582         LOGD("Enter");
2583
2584         if (CHECK_PREVIEW_CB(pc->cb_info, PREVIEW_CB_TYPE_EVAS)) {
2585                 ret = camera_get_state(camera, &current_state);
2586                 if (ret != CAMERA_ERROR_NONE) {
2587                         LOGE("failed to get current state 0x%x", ret);
2588                         return ret;
2589                 }
2590
2591                 if (current_state == CAMERA_STATE_PREVIEW) {
2592                         ret = _camera_stop_evas_rendering(camera, false);
2593                         if (ret != CAMERA_ERROR_NONE)
2594                                 return ret;
2595                 }
2596         }
2597
2598         /* send stop preview message */
2599         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
2600
2601         if (ret != CAMERA_ERROR_NONE &&
2602                 current_state == CAMERA_STATE_PREVIEW) {
2603                 LOGW("restart evas rendering");
2604                 _camera_start_evas_rendering(camera);
2605         }
2606
2607         LOGD("ret : 0x%x", ret);
2608
2609         return ret;
2610 }
2611
2612
2613 int camera_start_capture(camera_h camera, camera_capturing_cb capturing_cb, camera_capture_completed_cb completed_cb, void *user_data)
2614 {
2615         int ret = CAMERA_ERROR_NONE;
2616         camera_cli_s *pc = (camera_cli_s *)camera;
2617         muse_camera_api_e api = MUSE_CAMERA_API_START_CAPTURE;
2618
2619         if (!pc || !pc->cb_info) {
2620                 LOGE("NULL handle");
2621                 return CAMERA_ERROR_INVALID_PARAMETER;
2622         }
2623
2624         LOGD("Enter");
2625
2626         pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_CAPTURE] = capturing_cb;
2627         pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_CAPTURE] = user_data;
2628
2629         pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_CAPTURE_COMPLETE] = completed_cb;
2630         pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_CAPTURE_COMPLETE] = user_data;
2631
2632         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
2633
2634         LOGD("ret : 0x%x", ret);
2635
2636         return ret;
2637 }
2638
2639
2640 bool camera_is_supported_continuous_capture(camera_h camera)
2641 {
2642         int ret = CAMERA_ERROR_NONE;
2643         camera_cli_s *pc = (camera_cli_s *)camera;
2644         muse_camera_api_e api = MUSE_CAMERA_API_SUPPORT_CONTINUOUS_CAPTURE;
2645
2646         if (!pc || !pc->cb_info) {
2647                 LOGE("NULL handle");
2648                 return CAMERA_ERROR_INVALID_PARAMETER;
2649         }
2650
2651         LOGD("Enter");
2652
2653         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
2654
2655         if (ret < 0) {
2656                 LOGE("error is occurred 0x%x", ret);
2657                 ret = false;
2658         }
2659
2660         LOGD("ret : %d", ret);
2661
2662         return (bool)ret;
2663 }
2664
2665
2666 int camera_start_continuous_capture(camera_h camera, int count, int interval, camera_capturing_cb capturing_cb, camera_capture_completed_cb completed_cb, void *user_data)
2667 {
2668         int ret = CAMERA_ERROR_NONE;
2669         camera_cli_s *pc = (camera_cli_s *)camera;
2670         muse_camera_api_e api = MUSE_CAMERA_API_START_CONTINUOUS_CAPTURE;
2671         camera_msg_param param;
2672         int value = 0;
2673
2674         if (!pc || !pc->cb_info) {
2675                 LOGE("NULL handle");
2676                 return CAMERA_ERROR_INVALID_PARAMETER;
2677         }
2678
2679         LOGD("Enter");
2680
2681         pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_CAPTURE] = capturing_cb;
2682         pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_CAPTURE] = user_data;
2683
2684         pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_CAPTURE_COMPLETE] = completed_cb;
2685         pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_CAPTURE_COMPLETE] = user_data;
2686
2687         value = (count << 16) | interval;
2688         CAMERA_MSG_PARAM_SET(param, INT, value);
2689
2690         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
2691
2692         LOGD("ret : 0x%x", ret);
2693
2694         return ret;
2695 }
2696
2697
2698 int camera_stop_continuous_capture(camera_h camera)
2699 {
2700         int ret = CAMERA_ERROR_NONE;
2701         camera_cli_s *pc = (camera_cli_s *)camera;
2702         muse_camera_api_e api = MUSE_CAMERA_API_STOP_CONTINUOUS_CAPTURE;
2703
2704         if (!pc || !pc->cb_info) {
2705                 LOGE("NULL handle");
2706                 return CAMERA_ERROR_INVALID_PARAMETER;
2707         }
2708
2709         LOGD("Enter");
2710
2711         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
2712
2713         LOGD("ret : 0x%x", ret);
2714
2715         return ret;
2716 }
2717
2718
2719 bool camera_is_supported_face_detection(camera_h camera)
2720 {
2721         int ret = CAMERA_ERROR_NONE;
2722         camera_cli_s *pc = (camera_cli_s *)camera;
2723         muse_camera_api_e api = MUSE_CAMERA_API_SUPPORT_FACE_DETECTION;
2724
2725         if (!pc || !pc->cb_info) {
2726                 LOGE("NULL handle");
2727                 return CAMERA_ERROR_INVALID_PARAMETER;
2728         }
2729
2730         LOGD("Enter");
2731
2732         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
2733
2734         if (ret < 0) {
2735                 LOGE("error is occurred 0x%x", ret);
2736                 ret = false;
2737         }
2738
2739         LOGD("ret : %d", ret);
2740
2741         return (bool)ret;
2742 }
2743
2744
2745 bool camera_is_supported_zero_shutter_lag(camera_h camera)
2746 {
2747         int ret = CAMERA_ERROR_NONE;
2748         camera_cli_s *pc = (camera_cli_s *)camera;
2749         muse_camera_api_e api = MUSE_CAMERA_API_SUPPORT_ZERO_SHUTTER_LAG;
2750
2751         if (!pc || !pc->cb_info) {
2752                 LOGE("NULL handle");
2753                 return CAMERA_ERROR_INVALID_PARAMETER;
2754         }
2755
2756         LOGD("Enter");
2757
2758         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
2759
2760         if (ret < 0) {
2761                 LOGE("error is occurred 0x%x", ret);
2762                 ret = false;
2763         }
2764
2765         LOGD("ret : %d", ret);
2766
2767         return (bool)ret;
2768 }
2769
2770
2771 bool camera_is_supported_media_packet_preview_cb(camera_h camera)
2772 {
2773         int ret = CAMERA_ERROR_NONE;
2774         camera_cli_s *pc = (camera_cli_s *)camera;
2775         muse_camera_api_e api = MUSE_CAMERA_API_SUPPORT_MEDIA_PACKET_PREVIEW_CB;
2776
2777         if (!pc || !pc->cb_info) {
2778                 LOGE("NULL handle");
2779                 return CAMERA_ERROR_INVALID_PARAMETER;
2780         }
2781
2782         LOGD("Enter");
2783
2784         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
2785
2786         if (ret < 0) {
2787                 LOGE("error is occurred 0x%x", ret);
2788                 ret = false;
2789         }
2790
2791         LOGD("ret : %d", ret);
2792
2793         return (bool)ret;
2794 }
2795
2796 int camera_get_device_count(camera_h camera, int *device_count)
2797 {
2798         int ret = CAMERA_ERROR_NONE;
2799         camera_cli_s *pc = (camera_cli_s *)camera;
2800         muse_camera_api_e api = MUSE_CAMERA_API_GET_DEVICE_COUNT;
2801
2802         if (!pc || !pc->cb_info) {
2803                 LOGE("NULL handle");
2804                 return CAMERA_ERROR_INVALID_PARAMETER;
2805         }
2806
2807         LOGD("Enter");
2808
2809         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
2810
2811         if (ret == CAMERA_ERROR_NONE)
2812                 *device_count = pc->cb_info->get_int[MUSE_CAMERA_GET_INT_DEVICE_COUNT];
2813
2814         LOGD("ret : 0x%x", ret);
2815
2816         return ret;
2817 }
2818
2819 int camera_start_face_detection(camera_h camera, camera_face_detected_cb callback, void *user_data)
2820 {
2821         int ret = CAMERA_ERROR_NONE;
2822         camera_cli_s *pc = (camera_cli_s *)camera;
2823         muse_camera_api_e api = MUSE_CAMERA_API_START_FACE_DETECTION;
2824
2825         if (!pc || !pc->cb_info) {
2826                 LOGE("NULL handle");
2827                 return CAMERA_ERROR_INVALID_PARAMETER;
2828         }
2829
2830         LOGD("Enter");
2831
2832         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
2833
2834         if (ret == CAMERA_ERROR_NONE) {
2835                 g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_FACE_DETECTION]);
2836
2837                 pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FACE_DETECTION] = callback;
2838                 pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FACE_DETECTION] = user_data;
2839
2840                 g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_FACE_DETECTION]);
2841         }
2842
2843         LOGD("ret : 0x%x", ret);
2844
2845         return ret;
2846 }
2847
2848 int camera_stop_face_detection(camera_h camera)
2849 {
2850         int ret = CAMERA_ERROR_NONE;
2851         camera_cli_s *pc = (camera_cli_s *)camera;
2852         muse_camera_api_e api = MUSE_CAMERA_API_STOP_FACE_DETECTION;
2853
2854         if (!pc || !pc->cb_info) {
2855                 LOGE("NULL handle");
2856                 return CAMERA_ERROR_INVALID_PARAMETER;
2857         }
2858
2859         LOGD("Enter");
2860
2861         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
2862
2863         if (ret == CAMERA_ERROR_NONE) {
2864                 g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_FACE_DETECTION]);
2865
2866                 pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FACE_DETECTION] = NULL;
2867                 pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FACE_DETECTION] = NULL;
2868
2869                 g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_FACE_DETECTION]);
2870         }
2871
2872         LOGD("ret : 0x%x", ret);
2873
2874         return ret;
2875 }
2876
2877 int camera_get_state(camera_h camera, camera_state_e *state)
2878 {
2879         int ret = CAMERA_ERROR_NONE;
2880         camera_cli_s *pc = (camera_cli_s *)camera;
2881         muse_camera_api_e api = MUSE_CAMERA_API_GET_STATE;
2882
2883         if (!pc || !pc->cb_info || !state) {
2884                 LOGE("NULL pointer %p %p", pc, state);
2885                 return CAMERA_ERROR_INVALID_PARAMETER;
2886         }
2887
2888         LOGD("Enter");
2889
2890         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
2891
2892         if (ret == CAMERA_ERROR_NONE)
2893                 *state = (camera_state_e)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_STATE];
2894
2895         LOGD("ret : 0x%x", ret);
2896
2897         return ret;
2898 }
2899
2900 int camera_start_focusing(camera_h camera, bool continuous)
2901 {
2902         int ret = CAMERA_ERROR_NONE;
2903         camera_cli_s *pc = (camera_cli_s *)camera;
2904         muse_camera_api_e api = MUSE_CAMERA_API_START_FOCUSING;
2905         camera_msg_param param;
2906         int is_continuous = (int)continuous;
2907
2908         if (!pc || !pc->cb_info) {
2909                 LOGE("NULL handle");
2910                 return CAMERA_ERROR_INVALID_PARAMETER;
2911         }
2912
2913         LOGD("Enter");
2914
2915         CAMERA_MSG_PARAM_SET(param, INT, is_continuous);
2916
2917         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
2918
2919         LOGD("ret : 0x%x", ret);
2920
2921         return ret;
2922 }
2923
2924 int camera_cancel_focusing(camera_h camera)
2925 {
2926         int ret = CAMERA_ERROR_NONE;
2927         camera_cli_s *pc = (camera_cli_s *)camera;
2928         muse_camera_api_e api = MUSE_CAMERA_API_CANCEL_FOCUSING;
2929
2930         if (!pc || !pc->cb_info) {
2931                 LOGE("NULL handle");
2932                 return CAMERA_ERROR_INVALID_PARAMETER;
2933         }
2934
2935         LOGD("Enter, remote_handle : %x", pc->remote_handle);
2936
2937         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
2938
2939         LOGD("ret : 0x%x", ret);
2940
2941         return ret;
2942 }
2943
2944 int camera_set_display(camera_h camera, camera_display_type_e type, camera_display_h display)
2945 {
2946         int ret = CAMERA_ERROR_NONE;
2947         camera_cli_s *pc = (camera_cli_s *)camera;
2948         camera_cb_info_s *cb_info = NULL;
2949         muse_camera_api_e api = MUSE_CAMERA_API_SET_DISPLAY;
2950         camera_state_e current_state = CAMERA_STATE_NONE;
2951         camera_msg_param param;
2952         char *msg = NULL;
2953         int length = 0;
2954
2955         if (!pc || !pc->cb_info) {
2956                 LOGE("NULL handle");
2957                 return CAMERA_ERROR_INVALID_PARAMETER;
2958         }
2959
2960         if (type < CAMERA_DISPLAY_TYPE_OVERLAY || type > CAMERA_DISPLAY_TYPE_NONE) {
2961                 LOGE("invalid type %d", type);
2962                 return CAMERA_ERROR_INVALID_PARAMETER;
2963         }
2964
2965         if (type != CAMERA_DISPLAY_TYPE_NONE && display == NULL) {
2966                 LOGE("display type[%d] is not NONE, but display handle is NULL", type);
2967                 return CAMERA_ERROR_INVALID_PARAMETER;
2968         }
2969
2970         cb_info = (camera_cb_info_s *)pc->cb_info;
2971
2972         ret = camera_get_state(camera, &current_state);
2973         if (ret != CAMERA_ERROR_NONE) {
2974                 LOGE("failed to get current state 0x%x", ret);
2975                 return ret;
2976         }
2977
2978         if (current_state != CAMERA_STATE_CREATED) {
2979                 LOGE("INVALID_STATE : current %d", current_state);
2980                 return CAMERA_ERROR_INVALID_STATE;
2981         }
2982
2983         LOGD("Enter - display : %p", display);
2984
2985         if (type == CAMERA_DISPLAY_TYPE_NONE) {
2986                 LOGD("display type NONE");
2987         } else {
2988                 /* display interface handle */
2989                 if (!cb_info->dp_interface) {
2990                         if (mm_display_interface_init(&cb_info->dp_interface) != MM_ERROR_NONE) {
2991                                 LOGE("display interface init failed");
2992                                 return CAMERA_ERROR_NOT_SUPPORTED;
2993                         }
2994                 }
2995
2996                 ret = mm_display_interface_set_display(cb_info->dp_interface, type, display, &cb_info->parent_id);
2997                 if (ret == MM_ERROR_NONE && type == CAMERA_DISPLAY_TYPE_EVAS) {
2998                         camera_flip_e flip = CAMERA_FLIP_NONE;
2999                         camera_display_mode_e mode = CAMERA_DISPLAY_MODE_LETTER_BOX;
3000                         camera_rotation_e rotation = CAMERA_ROTATION_NONE;
3001                         bool visible = 0;
3002                         int x = 0;
3003                         int y = 0;
3004                         int width = 0;
3005                         int height = 0;
3006
3007                         camera_get_display_flip(camera, &flip);
3008                         camera_get_display_mode(camera, &mode);
3009                         camera_get_display_rotation(camera, &rotation);
3010                         camera_is_display_visible(camera, &visible);
3011                         camera_attr_get_display_roi_area(camera, &x, &y, &width, &height);
3012
3013                         LOGD("current setting : flip %d, mode %d, rotation %d, visible %d, roi %d,%d,%dx%d",
3014                                 flip, mode, rotation, visible, x, y, width, height);
3015
3016                         ret = mm_display_interface_evas_set_flip(cb_info->dp_interface, flip);
3017                         ret |= mm_display_interface_evas_set_mode(cb_info->dp_interface, mode);
3018                         ret |= mm_display_interface_evas_set_rotation(cb_info->dp_interface, rotation);
3019                         ret |= mm_display_interface_evas_set_visible(cb_info->dp_interface, visible);
3020
3021                         if (mode == CAMERA_DISPLAY_MODE_CUSTOM_ROI)
3022                                 ret |= mm_display_interface_evas_set_roi_area(cb_info->dp_interface, x, y, width, height);
3023                 }
3024         }
3025
3026         if (type == CAMERA_DISPLAY_TYPE_OVERLAY) {
3027                 int send_ret = 0;
3028
3029                 length = sizeof(camera_wl_info_s) / sizeof(int) + \
3030                         (sizeof(camera_wl_info_s) % sizeof(int) ? 1 : 0);
3031
3032                 msg = muse_core_msg_new(api,
3033                         MUSE_TYPE_INT, "type", type,
3034                         MUSE_TYPE_INT, "parent_id", cb_info->parent_id,
3035                         NULL);
3036                 if (!msg) {
3037                         LOGE("msg creation failed: api %d", api);
3038                         return CAMERA_ERROR_OUT_OF_MEMORY;
3039                 }
3040
3041                 if (pc->cb_info->is_server_connected) {
3042                         __camera_update_api_waiting(pc->cb_info, api, 1);
3043
3044                         g_mutex_lock(&pc->cb_info->fd_lock);
3045                         send_ret = muse_core_msg_send(pc->cb_info->fd, msg);
3046                         g_mutex_unlock(&pc->cb_info->fd_lock);
3047                 }
3048
3049                 if (send_ret < 0) {
3050                         LOGE("message send failed");
3051                         ret = CAMERA_ERROR_INVALID_OPERATION;
3052                 } else {
3053                         ret = _camera_client_wait_for_cb_return(api, pc->cb_info, CAMERA_CB_TIMEOUT);
3054                 }
3055
3056                 __camera_update_api_waiting(pc->cb_info, api, -1);
3057
3058                 muse_core_msg_free(msg);
3059         } else {
3060                 CAMERA_MSG_PARAM_SET(param, INT, type);
3061
3062                 _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
3063         }
3064
3065         if (ret != CAMERA_ERROR_NONE)
3066                 LOGE("set display error 0x%x", ret);
3067         else if (type == CAMERA_DISPLAY_TYPE_EVAS)
3068                 SET_PREVIEW_CB_TYPE(cb_info, PREVIEW_CB_TYPE_EVAS);
3069
3070         return ret;
3071 }
3072
3073
3074 int camera_set_preview_resolution(camera_h camera, int width, int height)
3075 {
3076         int ret = CAMERA_ERROR_NONE;
3077         camera_state_e current_state = CAMERA_STATE_NONE;
3078         camera_cli_s *pc = (camera_cli_s *)camera;
3079         muse_camera_api_e api = MUSE_CAMERA_API_SET_PREVIEW_RESOLUTION;
3080         camera_msg_param param;
3081         int value = 0;
3082
3083         if (!pc || !pc->cb_info) {
3084                 LOGE("NULL handle");
3085                 return CAMERA_ERROR_INVALID_PARAMETER;
3086         }
3087
3088         if (CHECK_PREVIEW_CB(pc->cb_info, PREVIEW_CB_TYPE_EVAS)) {
3089                 ret = camera_get_state(camera, &current_state);
3090                 if (ret != CAMERA_ERROR_NONE) {
3091                         LOGE("failed to get current state 0x%x", ret);
3092                         return ret;
3093                 }
3094
3095                 if (current_state == CAMERA_STATE_PREVIEW) {
3096                         ret = _camera_stop_evas_rendering(camera, true);
3097                         if (ret != CAMERA_ERROR_NONE)
3098                                 return ret;
3099                 }
3100         }
3101
3102         value = (width << 16) | height;
3103         CAMERA_MSG_PARAM_SET(param, INT, value);
3104
3105         LOGD("%dx%d -> 0x%x", width, height, value);
3106
3107         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
3108
3109         LOGD("ret : 0x%x", ret);
3110
3111         if (current_state == CAMERA_STATE_PREVIEW) {
3112                 LOGW("restart evas rendering");
3113                 _camera_start_evas_rendering(camera);
3114         }
3115
3116         return ret;
3117 }
3118
3119
3120 int camera_set_capture_resolution(camera_h camera, int width, int height)
3121 {
3122         int ret = CAMERA_ERROR_NONE;
3123         camera_cli_s *pc = (camera_cli_s *)camera;
3124         muse_camera_api_e api = MUSE_CAMERA_API_SET_CAPTURE_RESOLUTION;
3125         camera_msg_param param;
3126         int value = 0;
3127
3128         if (!pc || !pc->cb_info) {
3129                 LOGE("NULL handle");
3130                 return CAMERA_ERROR_INVALID_PARAMETER;
3131         }
3132
3133         LOGD("Enter");
3134
3135         value = (width << 16) | height;
3136         CAMERA_MSG_PARAM_SET(param, INT, value);
3137
3138         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
3139
3140         LOGD("ret : 0x%x", ret);
3141
3142         return ret;
3143 }
3144
3145
3146 int camera_set_capture_format(camera_h camera, camera_pixel_format_e format)
3147 {
3148         int ret = CAMERA_ERROR_NONE;
3149         int set_format = (int)format;
3150         camera_cli_s *pc = (camera_cli_s *)camera;
3151         muse_camera_api_e api = MUSE_CAMERA_API_SET_CAPTURE_FORMAT;
3152         camera_msg_param param;
3153
3154         if (!pc || !pc->cb_info) {
3155                 LOGE("NULL handle");
3156                 return CAMERA_ERROR_INVALID_PARAMETER;
3157         }
3158
3159         LOGD("Enter - format %d", set_format);
3160
3161         CAMERA_MSG_PARAM_SET(param, INT, set_format);
3162
3163         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
3164
3165         LOGD("ret : 0x%x", ret);
3166
3167         return ret;
3168 }
3169
3170
3171 int camera_set_preview_format(camera_h camera, camera_pixel_format_e format)
3172 {
3173         int ret = CAMERA_ERROR_NONE;
3174         int set_format = (int)format;
3175         camera_msg_param param;
3176         camera_cli_s *pc = (camera_cli_s *)camera;
3177         muse_camera_api_e api = MUSE_CAMERA_API_SET_PREVIEW_FORMAT;
3178
3179         if (!pc || !pc->cb_info) {
3180                 LOGE("NULL handle");
3181                 return CAMERA_ERROR_INVALID_PARAMETER;
3182         }
3183
3184         LOGD("Enter - capture_format %d", set_format);
3185
3186         CAMERA_MSG_PARAM_SET(param, INT, set_format);
3187
3188         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
3189
3190         LOGD("ret : 0x%x", ret);
3191
3192         return ret;
3193 }
3194
3195
3196 int camera_get_preview_resolution(camera_h camera, int *width, int *height)
3197 {
3198         int ret = CAMERA_ERROR_NONE;
3199         camera_cli_s *pc = (camera_cli_s *)camera;
3200         muse_camera_api_e api = MUSE_CAMERA_API_GET_PREVIEW_RESOLUTION;
3201
3202         if (!pc || !pc->cb_info || !width || !height) {
3203                 LOGE("NULL pointer %p %p %p", pc, width, height);
3204                 return CAMERA_ERROR_INVALID_PARAMETER;
3205         }
3206
3207         LOGD("Enter");
3208
3209         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3210
3211         if (ret == CAMERA_ERROR_NONE) {
3212                 *width = pc->cb_info->get_int[MUSE_CAMERA_GET_INT_PREVIEW_RESOLUTION] >> 16;
3213                 *height = 0x0000ffff & pc->cb_info->get_int[MUSE_CAMERA_GET_INT_PREVIEW_RESOLUTION];
3214         }
3215
3216         LOGD("ret : 0x%x", ret);
3217
3218         return ret;
3219 }
3220
3221
3222 int camera_set_display_rotation(camera_h camera, camera_rotation_e rotation)
3223 {
3224         int ret = CAMERA_ERROR_NONE;
3225         int set_rotation = (int)rotation;
3226         camera_cli_s *pc = (camera_cli_s *)camera;
3227         camera_msg_param param;
3228
3229         if (!pc || !pc->cb_info) {
3230                 LOGE("NULL handle");
3231                 return CAMERA_ERROR_INVALID_PARAMETER;
3232         }
3233
3234         if (CHECK_PREVIEW_CB(pc->cb_info, PREVIEW_CB_TYPE_EVAS)) {
3235                 ret = mm_display_interface_evas_set_rotation(pc->cb_info->dp_interface, rotation);
3236                 if (ret != MM_ERROR_NONE) {
3237                         LOGE("failed to set rotation for evas surface 0x%x", ret);
3238                         return CAMERA_ERROR_INVALID_OPERATION;
3239                 }
3240         }
3241
3242         CAMERA_MSG_PARAM_SET(param, INT, set_rotation);
3243
3244         _camera_msg_send_param1(MUSE_CAMERA_API_SET_DISPLAY_ROTATION, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
3245
3246         return ret;
3247 }
3248
3249
3250 int camera_get_display_rotation(camera_h camera, camera_rotation_e *rotation)
3251 {
3252         int ret = CAMERA_ERROR_NONE;
3253         camera_cli_s *pc = (camera_cli_s *)camera;
3254
3255         if (!pc || !pc->cb_info || !rotation) {
3256                 LOGE("NULL pointer %p %p", pc, rotation);
3257                 return CAMERA_ERROR_INVALID_PARAMETER;
3258         }
3259
3260         _camera_msg_send(MUSE_CAMERA_API_GET_DISPLAY_ROTATION, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3261
3262         if (ret == CAMERA_ERROR_NONE)
3263                 *rotation = (camera_rotation_e)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_DISPLAY_ROTATION];
3264
3265         return ret;
3266 }
3267
3268
3269 int camera_set_display_flip(camera_h camera, camera_flip_e flip)
3270 {
3271         int ret = CAMERA_ERROR_NONE;
3272         int set_flip = (int)flip;
3273         camera_cli_s *pc = (camera_cli_s *)camera;
3274         camera_msg_param param;
3275
3276         if (!pc || !pc->cb_info) {
3277                 LOGE("NULL handle");
3278                 return CAMERA_ERROR_INVALID_PARAMETER;
3279         }
3280
3281         if (CHECK_PREVIEW_CB(pc->cb_info, PREVIEW_CB_TYPE_EVAS)) {
3282                 ret = mm_display_interface_evas_set_flip(pc->cb_info->dp_interface, flip);
3283                 if (ret != MM_ERROR_NONE) {
3284                         LOGE("failed to set flip for evas surface 0x%x", ret);
3285                         return CAMERA_ERROR_INVALID_OPERATION;
3286                 }
3287         }
3288
3289         CAMERA_MSG_PARAM_SET(param, INT, set_flip);
3290
3291         _camera_msg_send_param1(MUSE_CAMERA_API_SET_DISPLAY_FLIP, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
3292
3293         return ret;
3294 }
3295
3296
3297 int camera_get_display_flip(camera_h camera, camera_flip_e *flip)
3298 {
3299         int ret = CAMERA_ERROR_NONE;
3300         camera_cli_s *pc = (camera_cli_s *)camera;
3301
3302         if (!pc || !pc->cb_info || !flip) {
3303                 LOGE("NULL pointer %p %p", pc, flip);
3304                 return CAMERA_ERROR_INVALID_PARAMETER;
3305         }
3306
3307         _camera_msg_send(MUSE_CAMERA_API_GET_DISPLAY_FLIP, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3308
3309         if (ret == CAMERA_ERROR_NONE)
3310                 *flip = (camera_flip_e)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_DISPLAY_FLIP];
3311
3312         return ret;
3313 }
3314
3315
3316 int camera_set_display_visible(camera_h camera, bool visible)
3317 {
3318         int ret = CAMERA_ERROR_NONE;
3319         int set_visible = (int)visible;
3320         camera_cli_s *pc = (camera_cli_s *)camera;
3321         camera_msg_param param;
3322
3323         if (!pc || !pc->cb_info) {
3324                 LOGE("NULL handle");
3325                 return CAMERA_ERROR_INVALID_PARAMETER;
3326         }
3327
3328         if (CHECK_PREVIEW_CB(pc->cb_info, PREVIEW_CB_TYPE_EVAS)) {
3329                 ret = mm_display_interface_evas_set_visible(pc->cb_info->dp_interface, visible);
3330                 if (ret != MM_ERROR_NONE) {
3331                         LOGE("failed to set visible for evas surface 0x%x", ret);
3332                         return CAMERA_ERROR_INVALID_OPERATION;
3333                 }
3334         }
3335
3336         CAMERA_MSG_PARAM_SET(param, INT, set_visible);
3337
3338         _camera_msg_send_param1(MUSE_CAMERA_API_SET_DISPLAY_VISIBLE, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
3339
3340         return ret;
3341 }
3342
3343
3344 int camera_is_display_visible(camera_h camera, bool *visible)
3345 {
3346         int ret = CAMERA_ERROR_NONE;
3347         camera_cli_s *pc = (camera_cli_s *)camera;
3348
3349         if (!pc || !pc->cb_info || !visible) {
3350                 LOGE("NULL pointer %p %p", pc, visible);
3351                 return CAMERA_ERROR_INVALID_PARAMETER;
3352         }
3353
3354         _camera_msg_send(MUSE_CAMERA_API_IS_DISPLAY_VISIBLE, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3355
3356         if (ret == CAMERA_ERROR_NONE)
3357                 *visible = (bool)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_DISPLAY_VISIBLE];
3358
3359         return ret;
3360 }
3361
3362
3363 int camera_set_display_mode(camera_h camera, camera_display_mode_e mode)
3364 {
3365         int ret = CAMERA_ERROR_NONE;
3366         int set_mode = (int)mode;
3367         camera_cli_s *pc = (camera_cli_s *)camera;
3368         camera_msg_param param;
3369
3370         if (!pc || !pc->cb_info) {
3371                 LOGE("NULL handle");
3372                 return CAMERA_ERROR_INVALID_PARAMETER;
3373         }
3374
3375         if (CHECK_PREVIEW_CB(pc->cb_info, PREVIEW_CB_TYPE_EVAS)) {
3376                 ret = mm_display_interface_evas_set_mode(pc->cb_info->dp_interface, mode);
3377                 if (ret != MM_ERROR_NONE) {
3378                         LOGE("failed to set geometry for evas surface 0x%x", ret);
3379                         return CAMERA_ERROR_INVALID_OPERATION;
3380                 }
3381         }
3382
3383         CAMERA_MSG_PARAM_SET(param, INT, set_mode);
3384
3385         _camera_msg_send_param1(MUSE_CAMERA_API_SET_DISPLAY_MODE, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
3386
3387         return ret;
3388 }
3389
3390
3391 int camera_get_display_mode(camera_h camera, camera_display_mode_e *mode)
3392 {
3393         int ret = CAMERA_ERROR_NONE;
3394         camera_cli_s *pc = (camera_cli_s *)camera;
3395
3396         if (!pc || !pc->cb_info || !mode) {
3397                 LOGE("NULL pointer %p %p", pc, mode);
3398                 return CAMERA_ERROR_INVALID_PARAMETER;
3399         }
3400
3401         _camera_msg_send(MUSE_CAMERA_API_GET_DISPLAY_MODE, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3402
3403         if (ret == CAMERA_ERROR_NONE)
3404                 *mode = (camera_display_mode_e)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_DISPLAY_MODE];
3405
3406         return ret;
3407 }
3408
3409
3410 int camera_set_display_reuse_hint(camera_h camera, bool hint)
3411 {
3412         int ret = CAMERA_ERROR_NONE;
3413         int set_hint = (int)hint;
3414         camera_cli_s *pc = (camera_cli_s *)camera;
3415         camera_msg_param param;
3416
3417         if (!pc || !pc->cb_info) {
3418                 LOGE("NULL handle");
3419                 return CAMERA_ERROR_INVALID_PARAMETER;
3420         }
3421
3422         LOGD("Enter - hint %d", set_hint);
3423
3424         CAMERA_MSG_PARAM_SET(param, INT, set_hint);
3425
3426         _camera_msg_send_param1(MUSE_CAMERA_API_SET_DISPLAY_REUSE_HINT, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
3427
3428         return ret;
3429 }
3430
3431
3432 int camera_get_display_reuse_hint(camera_h camera, bool *hint)
3433 {
3434         int ret = CAMERA_ERROR_NONE;
3435         camera_cli_s *pc = (camera_cli_s *)camera;
3436         muse_camera_api_e api = MUSE_CAMERA_API_GET_DISPLAY_REUSE_HINT;
3437
3438         if (!pc || !pc->cb_info || !hint) {
3439                 LOGE("NULL pointer %p %p", pc, hint);
3440                 return CAMERA_ERROR_INVALID_PARAMETER;
3441         }
3442
3443         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3444
3445         if (ret == CAMERA_ERROR_NONE) {
3446                 *hint = (bool)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_DISPLAY_REUSE_HINT];
3447                 LOGD("display reuse hint %d", *hint);
3448         }
3449
3450         return ret;
3451 }
3452
3453
3454 int camera_get_capture_resolution(camera_h camera, int *width, int *height)
3455 {
3456         int ret = CAMERA_ERROR_NONE;
3457         camera_cli_s *pc = (camera_cli_s *)camera;
3458         muse_camera_api_e api = MUSE_CAMERA_API_GET_CAPTURE_RESOLUTION;
3459
3460         if (!pc || !pc->cb_info || !width || !height) {
3461                 LOGE("NULL pointer %p %p %p", pc, width, height);
3462                 return CAMERA_ERROR_INVALID_PARAMETER;
3463         }
3464
3465         LOGD("Enter");
3466
3467         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3468
3469         if (ret == CAMERA_ERROR_NONE) {
3470                 *width = pc->cb_info->get_int[MUSE_CAMERA_GET_INT_CAPTURE_RESOLUTION] >> 16;
3471                 *height = 0x0000ffff & pc->cb_info->get_int[MUSE_CAMERA_GET_INT_CAPTURE_RESOLUTION];
3472         }
3473
3474         LOGD("ret : 0x%x", ret);
3475
3476         return ret;
3477 }
3478
3479
3480 int camera_get_capture_format(camera_h camera, camera_pixel_format_e *format)
3481 {
3482         int ret = CAMERA_ERROR_NONE;
3483         camera_cli_s *pc = (camera_cli_s *)camera;
3484         muse_camera_api_e api = MUSE_CAMERA_API_GET_CAPTURE_FORMAT;
3485
3486         if (!pc || !pc->cb_info || !format) {
3487                 LOGE("NULL pointer %p %p", pc, format);
3488                 return CAMERA_ERROR_INVALID_PARAMETER;
3489         }
3490
3491         LOGD("Enter");
3492
3493         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3494
3495         if (ret == CAMERA_ERROR_NONE)
3496                 *format = (camera_pixel_format_e)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_CAPTURE_FORMAT];
3497
3498         LOGD("ret : 0x%x", ret);
3499
3500         return ret;
3501 }
3502
3503
3504 int camera_get_preview_format(camera_h camera, camera_pixel_format_e *format)
3505 {
3506         int ret = CAMERA_ERROR_NONE;
3507         camera_cli_s *pc = (camera_cli_s *)camera;
3508         muse_camera_api_e api = MUSE_CAMERA_API_GET_PREVIEW_FORMAT;
3509
3510         if (!pc || !pc->cb_info || !format) {
3511                 LOGE("NULL pointer %p %p", pc, format);
3512                 return CAMERA_ERROR_INVALID_PARAMETER;
3513         }
3514
3515         LOGD("Enter");
3516
3517         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3518
3519         if (ret == CAMERA_ERROR_NONE)
3520                 *format = (camera_pixel_format_e)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_PREVIEW_FORMAT];
3521
3522         LOGD("ret : 0x%x", ret);
3523
3524         return ret;
3525 }
3526
3527
3528 int camera_get_facing_direction(camera_h camera, camera_facing_direction_e *facing_direction)
3529 {
3530         int ret = CAMERA_ERROR_NONE;
3531         camera_cli_s *pc = (camera_cli_s *)camera;
3532         muse_camera_api_e api = MUSE_CAMERA_API_GET_FACING_DIRECTION;
3533
3534         if (!pc || !pc->cb_info || !facing_direction) {
3535                 LOGE("NULL pointer %p %p", pc, facing_direction);
3536                 return CAMERA_ERROR_INVALID_PARAMETER;
3537         }
3538
3539         LOGD("Enter");
3540
3541         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3542
3543         if (ret == CAMERA_ERROR_NONE)
3544                 *facing_direction = (camera_facing_direction_e)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_FACING_DIRECTION];
3545
3546         LOGD("ret : 0x%x", ret);
3547
3548         return ret;
3549 }
3550
3551
3552 int camera_set_preview_cb(camera_h camera, camera_preview_cb callback, void *user_data)
3553 {
3554         int ret = CAMERA_ERROR_NONE;
3555         camera_cli_s *pc = (camera_cli_s *)camera;
3556         muse_camera_api_e api = MUSE_CAMERA_API_SET_PREVIEW_CB;
3557
3558         if (!pc || !pc->cb_info || !callback) {
3559                 LOGE("NULL pointer %p %p", pc, callback);
3560                 return CAMERA_ERROR_INVALID_PARAMETER;
3561         }
3562
3563         LOGD("Enter");
3564
3565         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3566
3567         if (ret == CAMERA_ERROR_NONE) {
3568                 g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_PREVIEW]);
3569
3570                 pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_PREVIEW] = callback;
3571                 pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_PREVIEW] = user_data;
3572
3573                 g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_PREVIEW]);
3574
3575                 SET_PREVIEW_CB_TYPE(pc->cb_info, PREVIEW_CB_TYPE_USER);
3576         }
3577
3578         LOGD("ret : 0x%x", ret);
3579
3580         return ret;
3581 }
3582
3583
3584 int camera_unset_preview_cb(camera_h camera)
3585 {
3586         int ret = CAMERA_ERROR_NONE;
3587         camera_cli_s *pc = (camera_cli_s *)camera;
3588         muse_camera_api_e api = MUSE_CAMERA_API_UNSET_PREVIEW_CB;
3589
3590         if (!pc || !pc->cb_info) {
3591                 LOGE("NULL handle");
3592                 return CAMERA_ERROR_INVALID_PARAMETER;
3593         }
3594
3595         LOGD("Enter");
3596
3597         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3598
3599         if (ret == CAMERA_ERROR_NONE) {
3600                 g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_PREVIEW]);
3601
3602                 pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_PREVIEW] = NULL;
3603                 pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_PREVIEW] = NULL;
3604
3605                 g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_PREVIEW]);
3606
3607                 UNSET_PREVIEW_CB_TYPE(pc->cb_info, PREVIEW_CB_TYPE_USER);
3608         }
3609
3610         LOGD("ret : 0x%x", ret);
3611
3612         return ret;
3613 }
3614
3615
3616 int camera_set_media_packet_preview_cb(camera_h camera, camera_media_packet_preview_cb callback, void *user_data)
3617 {
3618         int ret = CAMERA_ERROR_NONE;
3619         camera_cli_s *pc = (camera_cli_s *)camera;
3620         muse_camera_api_e api = MUSE_CAMERA_API_SET_MEDIA_PACKET_PREVIEW_CB;
3621
3622         if (!pc || !pc->cb_info) {
3623                 LOGE("NULL handle");
3624                 return CAMERA_ERROR_INVALID_PARAMETER;
3625         }
3626
3627         if (camera_is_supported_media_packet_preview_cb(camera) == false) {
3628                 LOGE("NOT SUPPORTED");
3629                 return CAMERA_ERROR_NOT_SUPPORTED;
3630         }
3631
3632         if (callback == NULL) {
3633                 LOGE("NULL callback");
3634                 return CAMERA_ERROR_INVALID_PARAMETER;
3635         }
3636
3637         LOGD("Enter");
3638
3639         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3640
3641         if (ret == CAMERA_ERROR_NONE) {
3642                 g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW]);
3643
3644                 pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW] = callback;
3645                 pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW] = user_data;
3646
3647                 g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW]);
3648         }
3649
3650         LOGD("ret : 0x%x", ret);
3651
3652         return ret;
3653 }
3654
3655
3656 int camera_unset_media_packet_preview_cb(camera_h camera)
3657 {
3658         int ret = CAMERA_ERROR_NONE;
3659         camera_cli_s *pc = (camera_cli_s *)camera;
3660         muse_camera_api_e api = MUSE_CAMERA_API_UNSET_MEDIA_PACKET_PREVIEW_CB;
3661
3662         if (!pc || !pc->cb_info) {
3663                 LOGE("NULL handle");
3664                 return CAMERA_ERROR_INVALID_PARAMETER;
3665         }
3666
3667         LOGD("Enter");
3668
3669         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3670
3671         if (ret == CAMERA_ERROR_NONE) {
3672                 g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW]);
3673
3674                 pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW] = NULL;
3675                 pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW] = NULL;
3676
3677                 g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW]);
3678         }
3679
3680         LOGD("ret : 0x%x", ret);
3681
3682         return ret;
3683 }
3684
3685
3686 int camera_set_state_changed_cb(camera_h camera, camera_state_changed_cb callback, void *user_data)
3687 {
3688         int ret = CAMERA_ERROR_NONE;
3689         camera_cli_s *pc = (camera_cli_s *)camera;
3690         muse_camera_api_e api = MUSE_CAMERA_API_SET_STATE_CHANGED_CB;
3691
3692         if (!pc || !pc->cb_info || !callback) {
3693                 LOGE("NULL pointer %p %p", pc, callback);
3694                 return CAMERA_ERROR_INVALID_PARAMETER;
3695         }
3696
3697         LOGD("Enter");
3698
3699         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3700
3701         if (ret == CAMERA_ERROR_NONE) {
3702                 g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_STATE_CHANGE]);
3703
3704                 pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_STATE_CHANGE] = callback;
3705                 pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_STATE_CHANGE] = user_data;
3706
3707                 g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_STATE_CHANGE]);
3708         }
3709
3710         LOGD("ret : 0x%x", ret);
3711
3712         return ret;
3713 }
3714
3715
3716 int camera_unset_state_changed_cb(camera_h camera)
3717 {
3718         int ret = CAMERA_ERROR_NONE;
3719         camera_cli_s *pc = (camera_cli_s *)camera;
3720         muse_camera_api_e api = MUSE_CAMERA_API_UNSET_STATE_CHANGED_CB;
3721
3722         if (!pc || !pc->cb_info) {
3723                 LOGE("NULL handle");
3724                 return CAMERA_ERROR_INVALID_PARAMETER;
3725         }
3726
3727         LOGD("Enter");
3728
3729         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3730
3731         if (ret == CAMERA_ERROR_NONE) {
3732                 g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_STATE_CHANGE]);
3733
3734                 pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_STATE_CHANGE] = NULL;
3735                 pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_STATE_CHANGE] = NULL;
3736
3737                 g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_STATE_CHANGE]);
3738         }
3739
3740         LOGD("ret : 0x%x", ret);
3741
3742         return ret;
3743 }
3744
3745
3746 int camera_set_interrupted_cb(camera_h camera, camera_interrupted_cb callback, void *user_data)
3747 {
3748         int ret = CAMERA_ERROR_NONE;
3749         camera_cli_s *pc = (camera_cli_s *)camera;
3750         muse_camera_api_e api = MUSE_CAMERA_API_SET_INTERRUPTED_CB;
3751
3752         if (!pc || !pc->cb_info || !callback) {
3753                 LOGE("NULL pointer %p %p", pc, callback);
3754                 return CAMERA_ERROR_INVALID_PARAMETER;
3755         }
3756
3757         LOGD("Enter");
3758
3759         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3760
3761         if (ret == CAMERA_ERROR_NONE) {
3762                 g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_INTERRUPTED]);
3763
3764                 pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_INTERRUPTED] = callback;
3765                 pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_INTERRUPTED] = user_data;
3766
3767                 g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_INTERRUPTED]);
3768         }
3769
3770         LOGD("ret : 0x%x", ret);
3771
3772         return ret;
3773 }
3774
3775
3776 int camera_unset_interrupted_cb(camera_h camera)
3777 {
3778         int ret = CAMERA_ERROR_NONE;
3779         camera_cli_s *pc = (camera_cli_s *)camera;
3780         muse_camera_api_e api = MUSE_CAMERA_API_UNSET_INTERRUPTED_CB;
3781
3782         if (!pc || !pc->cb_info) {
3783                 LOGE("NULL handle");
3784                 return CAMERA_ERROR_INVALID_PARAMETER;
3785         }
3786
3787         LOGD("Enter");
3788
3789         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3790
3791         if (ret == CAMERA_ERROR_NONE) {
3792                 g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_INTERRUPTED]);
3793
3794                 pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_INTERRUPTED] = NULL;
3795                 pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_INTERRUPTED] = NULL;
3796
3797                 g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_INTERRUPTED]);
3798         }
3799
3800         LOGD("ret : 0x%x", ret);
3801
3802         return ret;
3803 }
3804
3805
3806 int camera_set_interrupt_started_cb(camera_h camera, camera_interrupt_started_cb callback, void *user_data)
3807 {
3808         int ret = CAMERA_ERROR_NONE;
3809         camera_cli_s *pc = (camera_cli_s *)camera;
3810         muse_camera_api_e api = MUSE_CAMERA_API_SET_INTERRUPT_STARTED_CB;
3811
3812         if (!pc || !pc->cb_info || !callback) {
3813                 LOGE("NULL pointer %p %p", pc, callback);
3814                 return CAMERA_ERROR_INVALID_PARAMETER;
3815         }
3816
3817         LOGD("Enter");
3818
3819         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3820
3821         if (ret == CAMERA_ERROR_NONE) {
3822                 g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_INTERRUPT_STARTED]);
3823
3824                 pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_INTERRUPT_STARTED] = callback;
3825                 pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_INTERRUPT_STARTED] = user_data;
3826
3827                 g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_INTERRUPT_STARTED]);
3828         }
3829
3830         LOGD("ret : 0x%x", ret);
3831
3832         return ret;
3833 }
3834
3835
3836 int camera_unset_interrupt_started_cb(camera_h camera)
3837 {
3838         int ret = CAMERA_ERROR_NONE;
3839         camera_cli_s *pc = (camera_cli_s *)camera;
3840         muse_camera_api_e api = MUSE_CAMERA_API_UNSET_INTERRUPT_STARTED_CB;
3841
3842         if (!pc || !pc->cb_info) {
3843                 LOGE("NULL handle");
3844                 return CAMERA_ERROR_INVALID_PARAMETER;
3845         }
3846
3847         LOGD("Enter");
3848
3849         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3850
3851         if (ret == CAMERA_ERROR_NONE) {
3852                 g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_INTERRUPT_STARTED]);
3853
3854                 pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_INTERRUPT_STARTED] = NULL;
3855                 pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_INTERRUPT_STARTED] = NULL;
3856
3857                 g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_INTERRUPT_STARTED]);
3858         }
3859
3860         LOGD("ret : 0x%x", ret);
3861
3862         return ret;
3863 }
3864
3865
3866 int camera_set_focus_changed_cb(camera_h camera, camera_focus_changed_cb callback, void *user_data)
3867 {
3868         int ret = CAMERA_ERROR_NONE;
3869         camera_cli_s *pc = (camera_cli_s *)camera;
3870         muse_camera_api_e api = MUSE_CAMERA_API_SET_FOCUS_CHANGED_CB;
3871
3872         if (!pc || !pc->cb_info || !callback) {
3873                 LOGE("NULL pointer %p %p", pc, callback);
3874                 return CAMERA_ERROR_INVALID_PARAMETER;
3875         }
3876
3877         LOGD("Enter");
3878
3879         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3880
3881         if (ret == CAMERA_ERROR_NONE) {
3882                 g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_FOCUS_CHANGE]);
3883
3884                 pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FOCUS_CHANGE] = callback;
3885                 pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FOCUS_CHANGE] = user_data;
3886
3887                 g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_FOCUS_CHANGE]);
3888         }
3889
3890         LOGD("ret : 0x%x", ret);
3891
3892         return ret;
3893 }
3894
3895
3896 int camera_unset_focus_changed_cb(camera_h camera)
3897 {
3898         int ret = CAMERA_ERROR_NONE;
3899         camera_cli_s *pc = (camera_cli_s *)camera;
3900         muse_camera_api_e api = MUSE_CAMERA_API_UNSET_FOCUS_CHANGED_CB;
3901
3902         if (!pc || !pc->cb_info) {
3903                 LOGE("NULL handle");
3904                 return CAMERA_ERROR_INVALID_PARAMETER;
3905         }
3906
3907         LOGD("Enter");
3908
3909         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3910
3911         if (ret == CAMERA_ERROR_NONE) {
3912                 g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_FOCUS_CHANGE]);
3913
3914                 pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FOCUS_CHANGE] = NULL;
3915                 pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FOCUS_CHANGE] = NULL;
3916
3917                 g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_FOCUS_CHANGE]);
3918         }
3919
3920         LOGD("ret : 0x%x", ret);
3921
3922         return ret;
3923 }
3924
3925
3926 int camera_set_error_cb(camera_h camera, camera_error_cb callback, void *user_data)
3927 {
3928         int ret = CAMERA_ERROR_NONE;
3929         camera_cli_s *pc = (camera_cli_s *)camera;
3930         muse_camera_api_e api = MUSE_CAMERA_API_SET_ERROR_CB;
3931
3932         if (!pc || !pc->cb_info || !callback) {
3933                 LOGE("NULL pointer %p %p", pc, callback);
3934                 return CAMERA_ERROR_INVALID_PARAMETER;
3935         }
3936
3937         LOGD("Enter");
3938
3939         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3940
3941         if (ret == CAMERA_ERROR_NONE) {
3942                 g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_ERROR]);
3943
3944                 pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_ERROR] = callback;
3945                 pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_ERROR] = user_data;
3946
3947                 g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_ERROR]);
3948         }
3949
3950         LOGD("ret : 0x%x", ret);
3951
3952         return ret;
3953 }
3954
3955
3956 int camera_unset_error_cb(camera_h camera)
3957 {
3958         int ret = CAMERA_ERROR_NONE;
3959         camera_cli_s *pc = (camera_cli_s *)camera;
3960         muse_camera_api_e api = MUSE_CAMERA_API_UNSET_ERROR_CB;
3961
3962         if (!pc || !pc->cb_info) {
3963                 LOGE("NULL handle");
3964                 return CAMERA_ERROR_INVALID_PARAMETER;
3965         }
3966
3967         LOGD("Enter");
3968
3969         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
3970
3971         if (ret == CAMERA_ERROR_NONE) {
3972                 g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_ERROR]);
3973
3974                 pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_ERROR] = NULL;
3975                 pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_ERROR] = NULL;
3976
3977                 g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_ERROR]);
3978         }
3979
3980         LOGD("ret : 0x%x", ret);
3981
3982         return ret;
3983 }
3984
3985
3986 int camera_foreach_supported_preview_resolution(camera_h camera, camera_supported_preview_resolution_cb foreach_cb, void *user_data)
3987 {
3988         int ret = CAMERA_ERROR_NONE;
3989         camera_cli_s *pc = (camera_cli_s *)camera;
3990         muse_camera_api_e api = MUSE_CAMERA_API_SET_FOREACH_SUPPORTED_PREVIEW_RESOLUTION;
3991
3992         if (!pc || !pc->cb_info || !foreach_cb) {
3993                 LOGE("NULL pointer %p %p", pc, foreach_cb);
3994                 return CAMERA_ERROR_INVALID_PARAMETER;
3995         }
3996
3997         LOGD("Enter");
3998
3999         pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_PREVIEW_RESOLUTION] = foreach_cb;
4000         pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_PREVIEW_RESOLUTION] = user_data;
4001
4002         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
4003
4004         LOGD("ret : 0x%x", ret);
4005
4006         return ret;
4007 }
4008
4009
4010 int camera_foreach_supported_capture_resolution(camera_h camera, camera_supported_capture_resolution_cb foreach_cb, void *user_data)
4011 {
4012         int ret = CAMERA_ERROR_NONE;
4013         camera_cli_s *pc = (camera_cli_s *)camera;
4014         muse_camera_api_e api = MUSE_CAMERA_API_SET_FOREACH_SUPPORTED_CAPTURE_RESOLUTION;
4015
4016         if (!pc || !pc->cb_info || !foreach_cb) {
4017                 LOGE("NULL pointer %p %p", pc, foreach_cb);
4018                 return CAMERA_ERROR_INVALID_PARAMETER;
4019         }
4020
4021         LOGD("Enter");
4022
4023         pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_CAPTURE_RESOLUTION] = foreach_cb;
4024         pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_CAPTURE_RESOLUTION] = user_data;
4025
4026         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
4027
4028         LOGD("ret : 0x%x", ret);
4029
4030         return ret;
4031 }
4032
4033
4034 int camera_foreach_supported_capture_format(camera_h camera, camera_supported_capture_format_cb foreach_cb, void *user_data)
4035 {
4036         int ret = CAMERA_ERROR_NONE;
4037         camera_cli_s *pc = (camera_cli_s *)camera;
4038         muse_camera_api_e api = MUSE_CAMERA_API_SET_FOREACH_SUPPORTED_CAPTURE_FORMAT;
4039
4040         if (!pc || !pc->cb_info || !foreach_cb) {
4041                 LOGE("NULL pointer %p %p", pc, foreach_cb);
4042                 return CAMERA_ERROR_INVALID_PARAMETER;
4043         }
4044
4045         LOGD("Enter");
4046
4047         pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_CAPTURE_FORMAT] = foreach_cb;
4048         pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_CAPTURE_FORMAT] = user_data;
4049
4050         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
4051
4052         LOGD("ret : 0x%x", ret);
4053
4054         return ret;
4055 }
4056
4057
4058 int camera_foreach_supported_preview_format(camera_h camera, camera_supported_preview_format_cb foreach_cb, void *user_data)
4059 {
4060         int ret = CAMERA_ERROR_NONE;
4061         camera_cli_s *pc = (camera_cli_s *)camera;
4062         muse_camera_api_e api = MUSE_CAMERA_API_SET_FOREACH_SUPPORTED_PREVIEW_FORMAT;
4063
4064         if (!pc || !pc->cb_info || !foreach_cb) {
4065                 LOGE("NULL pointer %p %p", pc, foreach_cb);
4066                 return CAMERA_ERROR_INVALID_PARAMETER;
4067         }
4068
4069         LOGD("Enter");
4070
4071         pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_PREVIEW_FORMAT] = foreach_cb;
4072         pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_PREVIEW_FORMAT] = user_data;
4073
4074         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
4075
4076         LOGD("ret : 0x%x", ret);
4077
4078         return ret;
4079 }
4080
4081
4082 int camera_get_recommended_preview_resolution(camera_h camera, int *width, int *height)
4083 {
4084         int ret = CAMERA_ERROR_NONE;
4085         camera_cli_s *pc = (camera_cli_s *)camera;
4086         muse_camera_api_e api = MUSE_CAMERA_API_GET_RECOMMENDED_PREVIEW_RESOLUTION;
4087
4088         if (!pc || !pc->cb_info || !width || !height) {
4089                 LOGE("NULL pointer %p %p %p", pc, width, height);
4090                 return CAMERA_ERROR_INVALID_PARAMETER;
4091         }
4092
4093         LOGD("Enter");
4094         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
4095
4096         if (ret == CAMERA_ERROR_NONE) {
4097                 *width = pc->cb_info->get_int[MUSE_CAMERA_GET_INT_RECOMMENDED_PREVIEW_RESOLUTION] >> 16;
4098                 *height = 0x0000ffff & pc->cb_info->get_int[MUSE_CAMERA_GET_INT_RECOMMENDED_PREVIEW_RESOLUTION];
4099         }
4100
4101         LOGD("ret : 0x%x", ret);
4102
4103         return ret;
4104 }
4105
4106
4107 int camera_attr_get_lens_orientation(camera_h camera, int *angle)
4108 {
4109         int ret = CAMERA_ERROR_NONE;
4110         camera_cli_s *pc = (camera_cli_s *)camera;
4111         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_LENS_ORIENTATION;
4112
4113         if (!pc || !pc->cb_info || !angle) {
4114                 LOGE("NULL pointer %p %p", pc, angle);
4115                 return CAMERA_ERROR_INVALID_PARAMETER;
4116         }
4117
4118         LOGD("Enter");
4119
4120         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
4121
4122         if (ret == CAMERA_ERROR_NONE)
4123                 *angle = pc->cb_info->get_int[MUSE_CAMERA_GET_INT_LENS_ORIENTATION];
4124
4125         LOGD("ret : 0x%x", ret);
4126
4127         return ret;
4128 }
4129
4130
4131 int camera_attr_set_theater_mode(camera_h camera, camera_attr_theater_mode_e mode)
4132 {
4133         int ret = CAMERA_ERROR_NONE;
4134         camera_cli_s *pc = (camera_cli_s *)camera;
4135         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_THEATER_MODE;
4136         camera_msg_param param;
4137         int set_mode = (int)mode;
4138
4139         if (!pc || !pc->cb_info) {
4140                 LOGE("NULL handle");
4141                 return CAMERA_ERROR_INVALID_PARAMETER;
4142         }
4143
4144         LOGD("Enter");
4145
4146         CAMERA_MSG_PARAM_SET(param, INT, set_mode);
4147
4148         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
4149
4150         LOGD("ret : 0x%x", ret);
4151
4152         return ret;
4153 }
4154
4155
4156 int camera_attr_get_theater_mode(camera_h camera, camera_attr_theater_mode_e *mode)
4157 {
4158         int ret = CAMERA_ERROR_NONE;
4159         camera_cli_s *pc = (camera_cli_s *)camera;
4160         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_THEATER_MODE;
4161
4162         if (!pc || !pc->cb_info || !mode) {
4163                 LOGE("NULL pointer %p %p", pc, mode);
4164                 return CAMERA_ERROR_INVALID_PARAMETER;
4165         }
4166
4167         LOGD("Enter");
4168
4169         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
4170
4171         if (ret == CAMERA_ERROR_NONE)
4172                 *mode = (camera_attr_theater_mode_e)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_THEATER_MODE];
4173
4174         LOGD("ret : 0x%x", ret);
4175
4176         return ret;
4177 }
4178
4179
4180 int camera_attr_foreach_supported_theater_mode(camera_h camera, camera_attr_supported_theater_mode_cb foreach_cb, void *user_data)
4181 {
4182         int ret = CAMERA_ERROR_NONE;
4183         camera_cli_s *pc = (camera_cli_s *)camera;
4184         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_FOREACH_SUPPORTED_THEATER_MODE;
4185
4186         if (!pc || !pc->cb_info || !foreach_cb) {
4187                 LOGE("NULL pointer %p %p", pc, foreach_cb);
4188                 return CAMERA_ERROR_INVALID_PARAMETER;
4189         }
4190
4191         LOGD("Enter");
4192
4193         pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_THEATER_MODE] = foreach_cb;
4194         pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_THEATER_MODE] = user_data;
4195
4196         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
4197
4198         LOGD("Finish, return :%x", ret);
4199
4200         return ret;
4201 }
4202
4203
4204 int camera_attr_set_preview_fps(camera_h camera, camera_attr_fps_e fps)
4205 {
4206         int ret = CAMERA_ERROR_NONE;
4207         camera_cli_s *pc = (camera_cli_s *)camera;
4208         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_PREVIEW_FPS;
4209         camera_msg_param param;
4210         int set_fps = (int)fps;
4211
4212         if (!pc || !pc->cb_info) {
4213                 LOGE("NULL handle");
4214                 return CAMERA_ERROR_INVALID_PARAMETER;
4215         }
4216
4217         LOGD("Enter");
4218
4219         CAMERA_MSG_PARAM_SET(param, INT, set_fps);
4220
4221         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
4222
4223         LOGD("ret : 0x%x", ret);
4224
4225         return ret;
4226 }
4227
4228
4229 int camera_attr_set_image_quality(camera_h camera, int quality)
4230 {
4231         int ret = CAMERA_ERROR_NONE;
4232         camera_cli_s *pc = (camera_cli_s *)camera;
4233         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_IMAGE_QUALITY;
4234         camera_msg_param param;
4235
4236         if (!pc || !pc->cb_info) {
4237                 LOGE("NULL handle");
4238                 return CAMERA_ERROR_INVALID_PARAMETER;
4239         }
4240
4241         LOGD("Enter");
4242
4243         CAMERA_MSG_PARAM_SET(param, INT, quality);
4244
4245         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
4246
4247         LOGD("ret : 0x%x", ret);
4248
4249         return ret;
4250 }
4251
4252
4253 int camera_attr_get_preview_fps(camera_h camera, camera_attr_fps_e *fps)
4254 {
4255         int ret = CAMERA_ERROR_NONE;
4256         camera_cli_s *pc = (camera_cli_s *)camera;
4257         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_PREVIEW_FPS;
4258
4259         if (!pc || !pc->cb_info || !fps) {
4260                 LOGE("NULL pointer %p %p", pc, fps);
4261                 return CAMERA_ERROR_INVALID_PARAMETER;
4262         }
4263
4264         LOGD("Enter");
4265
4266         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
4267
4268         if (ret == CAMERA_ERROR_NONE)
4269                 *fps = (camera_attr_fps_e)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_PREVIEW_FPS];
4270
4271         LOGD("ret : 0x%x", ret);
4272
4273         return ret;
4274 }
4275
4276
4277 int camera_attr_get_image_quality(camera_h camera, int *quality)
4278 {
4279         int ret = CAMERA_ERROR_NONE;
4280         camera_cli_s *pc = (camera_cli_s *)camera;
4281         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_IMAGE_QUALITY;
4282
4283         if (!pc || !pc->cb_info || !quality) {
4284                 LOGE("NULL pointer %p %p", pc, quality);
4285                 return CAMERA_ERROR_INVALID_PARAMETER;
4286         }
4287
4288         LOGD("Enter");
4289
4290         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
4291
4292         if (ret == CAMERA_ERROR_NONE)
4293                 *quality = pc->cb_info->get_int[MUSE_CAMERA_GET_INT_IMAGE_QUALITY];
4294
4295         LOGD("ret : 0x%x", ret);
4296
4297         return ret;
4298 }
4299
4300
4301 int camera_attr_get_encoded_preview_bitrate(camera_h camera, int *bitrate)
4302 {
4303         int ret = CAMERA_ERROR_NONE;
4304         camera_cli_s *pc = (camera_cli_s *)camera;
4305         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_ENCODED_PREVIEW_BITRATE;
4306
4307         if (!pc || !pc->cb_info || !bitrate) {
4308                 LOGE("NULL pointer %p %p", pc, bitrate);
4309                 return CAMERA_ERROR_INVALID_PARAMETER;
4310         }
4311
4312         LOGD("Enter");
4313
4314         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
4315
4316         if (ret == CAMERA_ERROR_NONE)
4317                 *bitrate = pc->cb_info->get_int[MUSE_CAMERA_GET_INT_ENCODED_PREVIEW_BITRATE];
4318
4319         LOGD("ret : 0x%x", ret);
4320
4321         return ret;
4322 }
4323
4324
4325 int camera_attr_set_encoded_preview_bitrate(camera_h camera, int bitrate)
4326 {
4327         int ret = CAMERA_ERROR_NONE;
4328         camera_cli_s *pc = (camera_cli_s *)camera;
4329         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_ENCODED_PREVIEW_BITRATE;
4330         camera_msg_param param;
4331         int set_bitrate = bitrate;
4332
4333         if (!pc || !pc->cb_info) {
4334                 LOGE("NULL handle");
4335                 return CAMERA_ERROR_INVALID_PARAMETER;
4336         }
4337
4338         LOGD("Enter");
4339
4340         CAMERA_MSG_PARAM_SET(param, INT, set_bitrate);
4341
4342         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
4343
4344         LOGD("ret : 0x%x", ret);
4345
4346         return ret;
4347 }
4348
4349
4350 int camera_attr_get_encoded_preview_gop_interval(camera_h camera, int *interval)
4351 {
4352         int ret = CAMERA_ERROR_NONE;
4353         camera_cli_s *pc = (camera_cli_s *)camera;
4354         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_ENCODED_PREVIEW_GOP_INTERVAL;
4355
4356         if (!pc || !pc->cb_info || !interval) {
4357                 LOGE("NULL pointer %p %p", pc, interval);
4358                 return CAMERA_ERROR_INVALID_PARAMETER;
4359         }
4360
4361         LOGD("Enter");
4362
4363         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
4364
4365         if (ret == CAMERA_ERROR_NONE)
4366                 *interval = pc->cb_info->get_int[MUSE_CAMERA_GET_INT_ENCODED_PREVIEW_GOP_INTERVAL];
4367
4368         LOGD("ret : 0x%x", ret);
4369
4370         return ret;
4371 }
4372
4373
4374 int camera_attr_set_encoded_preview_gop_interval(camera_h camera, int interval)
4375 {
4376         int ret = CAMERA_ERROR_NONE;
4377         camera_cli_s *pc = (camera_cli_s *)camera;
4378         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_ENCODED_PREVIEW_GOP_INTERVAL;
4379         camera_msg_param param;
4380         int set_gop_interval = interval;
4381
4382         if (!pc || !pc->cb_info) {
4383                 LOGE("NULL handle");
4384                 return CAMERA_ERROR_INVALID_PARAMETER;
4385         }
4386
4387         LOGD("Enter");
4388
4389         CAMERA_MSG_PARAM_SET(param, INT, set_gop_interval);
4390
4391         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
4392
4393         LOGD("ret : 0x%x", ret);
4394
4395         return ret;
4396 }
4397
4398
4399 int camera_attr_set_zoom(camera_h camera, int zoom)
4400 {
4401         int ret = CAMERA_ERROR_NONE;
4402         camera_cli_s *pc = (camera_cli_s *)camera;
4403         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_ZOOM;
4404         camera_msg_param param;
4405
4406         if (!pc || !pc->cb_info) {
4407                 LOGE("NULL handle");
4408                 return CAMERA_ERROR_INVALID_PARAMETER;
4409         }
4410
4411         LOGD("Enter, remote_handle : %x", pc->remote_handle);
4412
4413         CAMERA_MSG_PARAM_SET(param, INT, zoom);
4414
4415         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
4416
4417         LOGD("ret : 0x%x", ret);
4418
4419         return ret;
4420 }
4421
4422
4423 int camera_attr_set_af_mode(camera_h camera, camera_attr_af_mode_e mode)
4424 {
4425         int ret = CAMERA_ERROR_NONE;
4426         camera_cli_s *pc = (camera_cli_s *)camera;
4427         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_AF_MODE;
4428         camera_msg_param param;
4429         int set_mode = (int)mode;
4430
4431         if (!pc || !pc->cb_info) {
4432                 LOGE("NULL handle");
4433                 return CAMERA_ERROR_INVALID_PARAMETER;
4434         }
4435
4436         LOGD("Enter, remote_handle : %x", pc->remote_handle);
4437
4438         CAMERA_MSG_PARAM_SET(param, INT, set_mode);
4439
4440         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
4441
4442         return ret;
4443 }
4444
4445
4446 int camera_attr_set_af_area(camera_h camera, int x, int y)
4447 {
4448         int ret = CAMERA_ERROR_NONE;
4449         camera_cli_s *pc = (camera_cli_s *)camera;
4450         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_AF_AREA;
4451         camera_msg_param param;
4452         int value = 0;
4453
4454         if (!pc || !pc->cb_info) {
4455                 LOGE("NULL handle");
4456                 return CAMERA_ERROR_INVALID_PARAMETER;
4457         }
4458
4459         LOGD("Enter - %d,%d", x, y);
4460
4461         value = (x << 16) | y;
4462         CAMERA_MSG_PARAM_SET(param, INT, value);
4463
4464         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
4465
4466         LOGD("ret : 0x%x", ret);
4467
4468         return ret;
4469 }
4470
4471
4472 int camera_attr_clear_af_area(camera_h camera)
4473 {
4474         int ret = CAMERA_ERROR_NONE;
4475         camera_cli_s *pc = (camera_cli_s *)camera;
4476         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_CLEAR_AF_AREA;
4477
4478         if (!pc || !pc->cb_info) {
4479                 LOGE("NULL handle");
4480                 return CAMERA_ERROR_INVALID_PARAMETER;
4481         }
4482
4483         LOGD("Enter");
4484
4485         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
4486
4487         LOGD("ret : 0x%x", ret);
4488
4489         return ret;
4490 }
4491
4492
4493 int camera_attr_set_exposure_mode(camera_h camera, camera_attr_exposure_mode_e mode)
4494 {
4495         int ret = CAMERA_ERROR_NONE;
4496         camera_cli_s *pc = (camera_cli_s *)camera;
4497         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_EXPOSURE_MODE;
4498         camera_msg_param param;
4499         int set_mode = (int)mode;
4500
4501         if (!pc || !pc->cb_info) {
4502                 LOGE("NULL handle");
4503                 return CAMERA_ERROR_INVALID_PARAMETER;
4504         }
4505
4506         LOGD("Enter");
4507
4508         CAMERA_MSG_PARAM_SET(param, INT, set_mode);
4509
4510         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
4511
4512         LOGD("ret : 0x%x", ret);
4513
4514         return ret;
4515 }
4516
4517
4518 int camera_attr_set_exposure(camera_h camera, int value)
4519 {
4520         int ret = CAMERA_ERROR_NONE;
4521         camera_cli_s *pc = (camera_cli_s *)camera;
4522         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_EXPOSURE;
4523         camera_msg_param param;
4524
4525         if (!pc || !pc->cb_info) {
4526                 LOGE("NULL handle");
4527                 return CAMERA_ERROR_INVALID_PARAMETER;
4528         }
4529
4530         LOGD("Enter");
4531
4532         CAMERA_MSG_PARAM_SET(param, INT, value);
4533
4534         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
4535
4536         LOGD("ret : 0x%x", ret);
4537
4538         return ret;
4539 }
4540
4541
4542 int camera_attr_set_iso(camera_h camera, camera_attr_iso_e iso)
4543 {
4544         int ret = CAMERA_ERROR_NONE;
4545         camera_cli_s *pc = (camera_cli_s *)camera;
4546         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_ISO;
4547         camera_msg_param param;
4548         int set_iso = (int)iso;
4549
4550         if (!pc || !pc->cb_info) {
4551                 LOGE("NULL handle");
4552                 return CAMERA_ERROR_INVALID_PARAMETER;
4553         }
4554
4555         LOGD("Enter");
4556
4557         CAMERA_MSG_PARAM_SET(param, INT, set_iso);
4558
4559         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
4560
4561         LOGD("ret : 0x%x", ret);
4562
4563         return ret;
4564 }
4565
4566
4567 int camera_attr_set_brightness(camera_h camera, int level)
4568 {
4569         int ret = CAMERA_ERROR_NONE;
4570         camera_cli_s *pc = (camera_cli_s *)camera;
4571         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_BRIGHTNESS;
4572         camera_msg_param param;
4573
4574         if (!pc || !pc->cb_info) {
4575                 LOGE("NULL handle");
4576                 return CAMERA_ERROR_INVALID_PARAMETER;
4577         }
4578
4579         LOGD("Enter");
4580
4581         CAMERA_MSG_PARAM_SET(param, INT, level);
4582
4583         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
4584
4585         LOGD("ret : 0x%x", ret);
4586
4587         return ret;
4588 }
4589
4590
4591 int camera_attr_set_contrast(camera_h camera, int level)
4592 {
4593         int ret = CAMERA_ERROR_NONE;
4594         camera_cli_s *pc = (camera_cli_s *)camera;
4595         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_CONTRAST;
4596         camera_msg_param param;
4597
4598         if (!pc || !pc->cb_info) {
4599                 LOGE("NULL handle");
4600                 return CAMERA_ERROR_INVALID_PARAMETER;
4601         }
4602
4603         LOGD("Enter");
4604
4605         CAMERA_MSG_PARAM_SET(param, INT, level);
4606
4607         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
4608
4609         LOGD("ret : 0x%x", ret);
4610
4611         return ret;
4612 }
4613
4614
4615 int camera_attr_set_hue(camera_h camera, int level)
4616 {
4617         int ret = CAMERA_ERROR_NONE;
4618         camera_cli_s *pc = (camera_cli_s *)camera;
4619         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_HUE;
4620         camera_msg_param param;
4621
4622         if (!pc || !pc->cb_info) {
4623                 LOGE("NULL handle");
4624                 return CAMERA_ERROR_INVALID_PARAMETER;
4625         }
4626
4627         LOGD("Enter");
4628
4629         CAMERA_MSG_PARAM_SET(param, INT, level);
4630
4631         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
4632
4633         LOGD("ret : 0x%x", ret);
4634
4635         return ret;
4636 }
4637
4638
4639 int camera_attr_set_whitebalance(camera_h camera, camera_attr_whitebalance_e wb)
4640 {
4641         int ret = CAMERA_ERROR_NONE;
4642         camera_cli_s *pc = (camera_cli_s *)camera;
4643         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_WHITEBALANCE;
4644         camera_msg_param param;
4645         int set_whitebalance = (int)wb;
4646
4647         if (!pc || !pc->cb_info) {
4648                 LOGE("NULL handle");
4649                 return CAMERA_ERROR_INVALID_PARAMETER;
4650         }
4651
4652         LOGD("Enter");
4653
4654         CAMERA_MSG_PARAM_SET(param, INT, set_whitebalance);
4655
4656         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
4657
4658         LOGD("ret : 0x%x", ret);
4659
4660         return ret;
4661 }
4662
4663
4664 int camera_attr_set_effect(camera_h camera, camera_attr_effect_mode_e effect)
4665 {
4666         int ret = CAMERA_ERROR_NONE;
4667         camera_cli_s *pc = (camera_cli_s *)camera;
4668         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_EFFECT;
4669         camera_msg_param param;
4670         int set_effect = (int)effect;
4671
4672         if (!pc || !pc->cb_info) {
4673                 LOGE("NULL handle");
4674                 return CAMERA_ERROR_INVALID_PARAMETER;
4675         }
4676
4677         LOGD("Enter");
4678
4679         CAMERA_MSG_PARAM_SET(param, INT, set_effect);
4680
4681         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
4682
4683         LOGD("ret : 0x%x", ret);
4684
4685         return ret;
4686 }
4687
4688
4689 int camera_attr_set_scene_mode(camera_h camera, camera_attr_scene_mode_e mode)
4690 {
4691         int ret = CAMERA_ERROR_NONE;
4692         camera_cli_s *pc = (camera_cli_s *)camera;
4693         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_SCENE_MODE;
4694         camera_msg_param param;
4695         int set_mode = (int)mode;
4696
4697         if (!pc || !pc->cb_info) {
4698                 LOGE("NULL handle");
4699                 return CAMERA_ERROR_INVALID_PARAMETER;
4700         }
4701
4702         LOGD("Enter");
4703
4704         CAMERA_MSG_PARAM_SET(param, INT, set_mode);
4705
4706         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
4707
4708         LOGD("ret : 0x%x", ret);
4709
4710         return ret;
4711 }
4712
4713
4714 int camera_attr_enable_tag(camera_h camera, bool enable)
4715 {
4716         int ret = CAMERA_ERROR_NONE;
4717         camera_cli_s *pc = (camera_cli_s *)camera;
4718         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_ENABLE_TAG;
4719         camera_msg_param param;
4720         int set_enable = (int)enable;
4721
4722         if (!pc || !pc->cb_info) {
4723                 LOGE("NULL handle");
4724                 return CAMERA_ERROR_INVALID_PARAMETER;
4725         }
4726
4727         LOGD("Enter");
4728
4729         CAMERA_MSG_PARAM_SET(param, INT, set_enable);
4730
4731         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
4732
4733         LOGD("ret : 0x%x", ret);
4734
4735         return ret;
4736 }
4737
4738
4739 int camera_attr_set_tag_image_description(camera_h camera, const char *description)
4740 {
4741         int ret = CAMERA_ERROR_NONE;
4742         camera_cli_s *pc = (camera_cli_s *)camera;
4743         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_TAG_IMAGE_DESCRIPTION;
4744         camera_msg_param param;
4745
4746         if (!pc || !pc->cb_info || !description) {
4747                 LOGE("NULL pointer %p %p", pc, description);
4748                 return CAMERA_ERROR_INVALID_PARAMETER;
4749         }
4750
4751         LOGD("Enter");
4752
4753         CAMERA_MSG_PARAM_SET(param, STRING, description);
4754
4755         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
4756
4757         LOGD("ret : 0x%x", ret);
4758
4759         return ret;
4760 }
4761
4762
4763 int camera_attr_set_tag_orientation(camera_h camera, camera_attr_tag_orientation_e orientation)
4764 {
4765         int ret = CAMERA_ERROR_NONE;
4766         camera_cli_s *pc = (camera_cli_s *)camera;
4767         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_TAG_ORIENTATION;
4768         camera_msg_param param;
4769         int set_orientation = (int)orientation;
4770
4771         if (!pc || !pc->cb_info) {
4772                 LOGE("NULL handle");
4773                 return CAMERA_ERROR_INVALID_PARAMETER;
4774         }
4775
4776         LOGD("Enter");
4777
4778         CAMERA_MSG_PARAM_SET(param, INT, set_orientation);
4779
4780         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
4781
4782         LOGD("ret : 0x%x", ret);
4783
4784         return ret;
4785 }
4786
4787
4788 int camera_attr_set_tag_software(camera_h camera, const char *software)
4789 {
4790         int ret = CAMERA_ERROR_NONE;
4791         camera_cli_s *pc = (camera_cli_s *)camera;
4792         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_TAG_SOFTWARE;
4793         camera_msg_param param;
4794
4795         if (!pc || !pc->cb_info || !software) {
4796                 LOGE("NULL pointer %p %p", pc, software);
4797                 return CAMERA_ERROR_INVALID_PARAMETER;
4798         }
4799
4800         LOGD("Enter, remote_handle : %x", pc->remote_handle);
4801
4802         CAMERA_MSG_PARAM_SET(param, STRING, software);
4803
4804         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
4805
4806         LOGD("ret : 0x%x", ret);
4807
4808         return ret;
4809 }
4810
4811
4812 int camera_attr_set_geotag(camera_h camera, double latitude, double longitude, double altitude)
4813 {
4814         int ret = CAMERA_ERROR_NONE;
4815         camera_cli_s *pc = (camera_cli_s *)camera;
4816         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_GEOTAG;
4817         double set_geotag[3] = {latitude, longitude, altitude};
4818         char *msg = NULL;
4819         int length = 0;
4820         int send_ret = 0;
4821
4822         if (!pc || !pc->cb_info) {
4823                 LOGE("NULL handle");
4824                 return CAMERA_ERROR_INVALID_PARAMETER;
4825         }
4826
4827         LOGD("Enter");
4828
4829         length = sizeof(set_geotag) / sizeof(int) + \
4830                 (sizeof(set_geotag) % sizeof(int) ? 1 : 0);
4831
4832         msg = muse_core_msg_new(api,
4833                 MUSE_TYPE_ARRAY, "set_geotag", length, (int *)set_geotag,
4834                 NULL);
4835         if (!msg) {
4836                 LOGE("msg creation failed: api %d", api);
4837                 return CAMERA_ERROR_OUT_OF_MEMORY;
4838         }
4839
4840         if (pc->cb_info->is_server_connected) {
4841                 __camera_update_api_waiting(pc->cb_info, api, 1);
4842
4843                 g_mutex_lock(&pc->cb_info->fd_lock);
4844                 send_ret = muse_core_msg_send(pc->cb_info->fd, msg);
4845                 g_mutex_unlock(&pc->cb_info->fd_lock);
4846         }
4847
4848         if (send_ret < 0) {
4849                 LOGE("message send failed");
4850                 ret = CAMERA_ERROR_INVALID_OPERATION;
4851         } else {
4852                 ret = _camera_client_wait_for_cb_return(api, pc->cb_info, CAMERA_CB_TIMEOUT);
4853         }
4854
4855         __camera_update_api_waiting(pc->cb_info, api, -1);
4856
4857         muse_core_msg_free(msg);
4858
4859         LOGD("ret : 0x%x", ret);
4860
4861         return ret;
4862 }
4863
4864
4865 int camera_attr_remove_geotag(camera_h camera)
4866 {
4867         int ret = CAMERA_ERROR_NONE;
4868         camera_cli_s *pc = (camera_cli_s *)camera;
4869         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_REMOVE_GEOTAG;
4870
4871         if (!pc || !pc->cb_info) {
4872                 LOGE("NULL handle");
4873                 return CAMERA_ERROR_INVALID_PARAMETER;
4874         }
4875
4876         LOGD("Enter");
4877
4878         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
4879
4880         LOGD("ret : 0x%x", ret);
4881
4882         return ret;
4883 }
4884
4885
4886 int camera_attr_set_flash_mode(camera_h camera, camera_attr_flash_mode_e mode)
4887 {
4888         int ret = CAMERA_ERROR_NONE;
4889         camera_cli_s *pc = (camera_cli_s *)camera;
4890         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_FLASH_MODE;
4891         camera_msg_param param;
4892         int set_mode = (int)mode;
4893
4894         if (!pc || !pc->cb_info) {
4895                 LOGE("NULL handle");
4896                 return CAMERA_ERROR_INVALID_PARAMETER;
4897         }
4898
4899         LOGD("Enter");
4900
4901         CAMERA_MSG_PARAM_SET(param, INT, set_mode);
4902
4903         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
4904
4905         LOGD("ret : 0x%x", ret);
4906
4907         return ret;
4908 }
4909
4910
4911 int camera_attr_get_zoom(camera_h camera, int *zoom)
4912 {
4913         int ret = CAMERA_ERROR_NONE;
4914         camera_cli_s *pc = (camera_cli_s *)camera;
4915         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_ZOOM;
4916
4917         if (!pc || !pc->cb_info || !zoom) {
4918                 LOGE("NULL pointer %p %p", pc, zoom);
4919                 return CAMERA_ERROR_INVALID_PARAMETER;
4920         }
4921
4922         LOGD("Enter");
4923
4924         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
4925
4926         if (ret == CAMERA_ERROR_NONE)
4927                 *zoom = pc->cb_info->get_int[MUSE_CAMERA_GET_INT_ZOOM];
4928
4929         LOGD("ret : 0x%x", ret);
4930
4931         return ret;
4932 }
4933
4934
4935 int camera_attr_get_zoom_range(camera_h camera, int *min, int *max)
4936 {
4937         int ret = CAMERA_ERROR_NONE;
4938         camera_cli_s *pc = (camera_cli_s *)camera;
4939         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_ZOOM_RANGE;
4940
4941         if (!pc || !pc->cb_info || !min || !max) {
4942                 LOGE("NULL pointer %p %p %p", pc, min, max);
4943                 return CAMERA_ERROR_INVALID_PARAMETER;
4944         }
4945
4946         LOGD("Enter");
4947
4948         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
4949
4950         if (ret == CAMERA_ERROR_NONE) {
4951                 *min = pc->cb_info->get_int_pair[MUSE_CAMERA_GET_INT_PAIR_ZOOM_RANGE][0];
4952                 *max = pc->cb_info->get_int_pair[MUSE_CAMERA_GET_INT_PAIR_ZOOM_RANGE][1];
4953         }
4954
4955         LOGD("ret : 0x%x", ret);
4956
4957         return ret;
4958 }
4959
4960
4961 int camera_attr_get_af_mode(camera_h camera, camera_attr_af_mode_e *mode)
4962 {
4963         int ret = CAMERA_ERROR_NONE;
4964         camera_cli_s *pc = (camera_cli_s *)camera;
4965         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_AF_MODE;
4966
4967         if (!pc || !pc->cb_info || !mode) {
4968                 LOGE("NULL pointer %p %p", pc, mode);
4969                 return CAMERA_ERROR_INVALID_PARAMETER;
4970         }
4971
4972         LOGD("Enter");
4973
4974         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
4975
4976         if (ret == CAMERA_ERROR_NONE)
4977                 *mode = (camera_attr_af_mode_e)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_AF_MODE];
4978
4979         LOGD("ret : 0x%x", ret);
4980
4981         return ret;
4982 }
4983
4984
4985 int camera_attr_get_exposure_mode(camera_h camera, camera_attr_exposure_mode_e *mode)
4986 {
4987         int ret = CAMERA_ERROR_NONE;
4988         camera_cli_s *pc = (camera_cli_s *)camera;
4989         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_EXPOSURE_MODE;
4990
4991         if (!pc || !pc->cb_info || !mode) {
4992                 LOGE("NULL pointer %p %p", pc, mode);
4993                 return CAMERA_ERROR_INVALID_PARAMETER;
4994         }
4995
4996         LOGD("Enter");
4997
4998         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
4999
5000         if (ret == CAMERA_ERROR_NONE)
5001                 *mode = (camera_attr_exposure_mode_e)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_EXPOSURE_MODE];
5002
5003         LOGD("ret : 0x%x", ret);
5004
5005         return ret;
5006 }
5007
5008
5009 int camera_attr_get_exposure(camera_h camera, int *value)
5010 {
5011         int ret = CAMERA_ERROR_NONE;
5012         camera_cli_s *pc = (camera_cli_s *)camera;
5013         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_EXPOSURE;
5014
5015         if (!pc || !pc->cb_info || !value) {
5016                 LOGE("NULL pointer %p %p", pc, value);
5017                 return CAMERA_ERROR_INVALID_PARAMETER;
5018         }
5019
5020         LOGD("Enter");
5021
5022         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5023
5024         if (ret == CAMERA_ERROR_NONE)
5025                 *value = pc->cb_info->get_int[MUSE_CAMERA_GET_INT_EXPOSURE];
5026
5027         LOGD("ret : 0x%x", ret);
5028
5029         return ret;
5030 }
5031
5032
5033 int camera_attr_get_exposure_range(camera_h camera, int *min, int *max)
5034 {
5035         int ret = CAMERA_ERROR_NONE;
5036         camera_cli_s *pc = (camera_cli_s *)camera;
5037         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_EXPOSURE_RANGE;
5038
5039         if (!pc || !pc->cb_info || !min || !max) {
5040                 LOGE("NULL pointer %p %p %p", pc, min, max);
5041                 return CAMERA_ERROR_INVALID_PARAMETER;
5042         }
5043
5044         LOGD("Enter");
5045
5046         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5047
5048         if (ret == CAMERA_ERROR_NONE) {
5049                 *min = pc->cb_info->get_int_pair[MUSE_CAMERA_GET_INT_PAIR_EXPOSURE_RANGE][0];
5050                 *max = pc->cb_info->get_int_pair[MUSE_CAMERA_GET_INT_PAIR_EXPOSURE_RANGE][1];
5051         }
5052
5053         LOGD("ret : 0x%x", ret);
5054
5055         return ret;
5056 }
5057
5058
5059 int camera_attr_get_iso(camera_h camera, camera_attr_iso_e *iso)
5060 {
5061         int ret = CAMERA_ERROR_NONE;
5062         camera_cli_s *pc = (camera_cli_s *)camera;
5063         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_ISO;
5064
5065         if (!pc || !pc->cb_info || !iso) {
5066                 LOGE("NULL pointer %p %p", pc, iso);
5067                 return CAMERA_ERROR_INVALID_PARAMETER;
5068         }
5069
5070         LOGD("Enter");
5071
5072         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5073
5074         if (ret == CAMERA_ERROR_NONE)
5075                 *iso = (camera_attr_iso_e)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_ISO];
5076
5077         LOGD("ret : 0x%x", ret);
5078
5079         return ret;
5080 }
5081
5082
5083 int camera_attr_get_brightness(camera_h camera, int *level)
5084 {
5085         int ret = CAMERA_ERROR_NONE;
5086         camera_cli_s *pc = (camera_cli_s *)camera;
5087         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_BRIGHTNESS;
5088
5089         if (!pc || !pc->cb_info || !level) {
5090                 LOGE("NULL pointer %p %p", pc, level);
5091                 return CAMERA_ERROR_INVALID_PARAMETER;
5092         }
5093
5094         LOGD("Enter");
5095
5096         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5097
5098         if (ret == CAMERA_ERROR_NONE)
5099                 *level = pc->cb_info->get_int[MUSE_CAMERA_GET_INT_BRIGHTNESS];
5100
5101         LOGD("ret : 0x%x", ret);
5102
5103         return ret;
5104 }
5105
5106
5107 int camera_attr_get_brightness_range(camera_h camera, int *min, int *max)
5108 {
5109         int ret = CAMERA_ERROR_NONE;
5110         camera_cli_s *pc = (camera_cli_s *)camera;
5111         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_BRIGHTNESS_RANGE;
5112
5113         if (!pc || !pc->cb_info || !min || !max) {
5114                 LOGE("NULL pointer %p %p %p", pc, min, max);
5115                 return CAMERA_ERROR_INVALID_PARAMETER;
5116         }
5117
5118         LOGD("Enter");
5119
5120         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5121
5122         if (ret == CAMERA_ERROR_NONE) {
5123                 *min = pc->cb_info->get_int_pair[MUSE_CAMERA_GET_INT_PAIR_BRIGHTNESS_RANGE][0];
5124                 *max = pc->cb_info->get_int_pair[MUSE_CAMERA_GET_INT_PAIR_BRIGHTNESS_RANGE][1];
5125         }
5126
5127         LOGD("ret : 0x%x", ret);
5128
5129         return ret;
5130 }
5131
5132
5133 int camera_attr_get_contrast(camera_h camera, int *level)
5134 {
5135         int ret = CAMERA_ERROR_NONE;
5136         camera_cli_s *pc = (camera_cli_s *)camera;
5137         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_CONTRAST;
5138
5139         if (!pc || !pc->cb_info || !level) {
5140                 LOGE("NULL pointer %p %p", pc, level);
5141                 return CAMERA_ERROR_INVALID_PARAMETER;
5142         }
5143
5144         LOGD("Enter");
5145
5146         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5147
5148         if (ret == CAMERA_ERROR_NONE)
5149                 *level = pc->cb_info->get_int[MUSE_CAMERA_GET_INT_CONTRAST];
5150
5151         LOGD("ret : 0x%x", ret);
5152
5153         return ret;
5154 }
5155
5156
5157 int camera_attr_get_contrast_range(camera_h camera, int *min, int *max)
5158 {
5159         int ret = CAMERA_ERROR_NONE;
5160         camera_cli_s *pc = (camera_cli_s *)camera;
5161         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_CONTRAST_RANGE;
5162
5163         if (!pc || !pc->cb_info || !min || !max) {
5164                 LOGE("NULL pointer %p %p %p", pc, min, max);
5165                 return CAMERA_ERROR_INVALID_PARAMETER;
5166         }
5167
5168         LOGD("Enter");
5169
5170         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5171
5172         if (ret == CAMERA_ERROR_NONE) {
5173                 *min = pc->cb_info->get_int_pair[MUSE_CAMERA_GET_INT_PAIR_CONTRAST_RANGE][0];
5174                 *max = pc->cb_info->get_int_pair[MUSE_CAMERA_GET_INT_PAIR_CONTRAST_RANGE][1];
5175                 LOGD("min %d, max %d", *min, *max);
5176         }
5177
5178         LOGD("ret : 0x%x", ret);
5179
5180         return ret;
5181 }
5182
5183
5184 int camera_attr_get_hue(camera_h camera, int *level)
5185 {
5186         int ret = CAMERA_ERROR_NONE;
5187         camera_cli_s *pc = (camera_cli_s *)camera;
5188         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_HUE;
5189
5190         if (!pc || !pc->cb_info || !level) {
5191                 LOGE("NULL pointer %p %p", pc, level);
5192                 return CAMERA_ERROR_INVALID_PARAMETER;
5193         }
5194
5195         LOGD("Enter");
5196
5197         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5198
5199         if (ret == CAMERA_ERROR_NONE)
5200                 *level = pc->cb_info->get_int[MUSE_CAMERA_GET_INT_HUE];
5201
5202         LOGD("ret : 0x%x", ret);
5203
5204         return ret;
5205 }
5206
5207
5208 int camera_attr_get_hue_range(camera_h camera, int *min, int *max)
5209 {
5210         int ret = CAMERA_ERROR_NONE;
5211         camera_cli_s *pc = (camera_cli_s *)camera;
5212         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_HUE_RANGE;
5213
5214         if (!pc || !pc->cb_info || !min || !max) {
5215                 LOGE("NULL pointer %p %p %p", pc, min, max);
5216                 return CAMERA_ERROR_INVALID_PARAMETER;
5217         }
5218
5219         LOGD("Enter");
5220
5221         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5222
5223         if (ret == CAMERA_ERROR_NONE) {
5224                 *min = pc->cb_info->get_int_pair[MUSE_CAMERA_GET_INT_PAIR_HUE_RANGE][0];
5225                 *max = pc->cb_info->get_int_pair[MUSE_CAMERA_GET_INT_PAIR_HUE_RANGE][1];
5226                 LOGD("min %d, max %d", *min, *max);
5227         }
5228
5229         LOGD("ret : 0x%x", ret);
5230
5231         return ret;
5232 }
5233
5234
5235 int camera_attr_get_whitebalance(camera_h camera, camera_attr_whitebalance_e *wb)
5236 {
5237         int ret = CAMERA_ERROR_NONE;
5238         camera_cli_s *pc = (camera_cli_s *)camera;
5239         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_WHITEBALANCE;
5240
5241         if (!pc || !pc->cb_info || !wb) {
5242                 LOGE("NULL pointer %p %p", pc, wb);
5243                 return CAMERA_ERROR_INVALID_PARAMETER;
5244         }
5245
5246         LOGD("Enter");
5247
5248         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5249
5250         if (ret == CAMERA_ERROR_NONE)
5251                 *wb = (camera_attr_whitebalance_e)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_WHITE_BALANCE];
5252
5253         LOGD("ret : 0x%x", ret);
5254
5255         return ret;
5256 }
5257
5258
5259 int camera_attr_get_effect(camera_h camera, camera_attr_effect_mode_e *effect)
5260 {
5261         int ret = CAMERA_ERROR_NONE;
5262         camera_cli_s *pc = (camera_cli_s *)camera;
5263         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_EFFECT;
5264
5265         if (!pc || !pc->cb_info || !effect) {
5266                 LOGE("NULL pointer %p %p", pc, effect);
5267                 return CAMERA_ERROR_INVALID_PARAMETER;
5268         }
5269
5270         LOGD("Enter");
5271
5272         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5273
5274         if (ret == CAMERA_ERROR_NONE)
5275                 *effect = (camera_attr_effect_mode_e)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_EFFECT];
5276
5277         LOGD("ret : 0x%x", ret);
5278
5279         return ret;
5280 }
5281
5282
5283 int camera_attr_get_scene_mode(camera_h camera, camera_attr_scene_mode_e *mode)
5284 {
5285         int ret = CAMERA_ERROR_NONE;
5286         camera_cli_s *pc = (camera_cli_s *)camera;
5287         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_SCENE_MODE;
5288
5289         if (!pc || !pc->cb_info || !mode) {
5290                 LOGE("NULL pointer %p %p", pc, mode);
5291                 return CAMERA_ERROR_INVALID_PARAMETER;
5292         }
5293
5294         LOGD("Enter");
5295
5296         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5297
5298         if (ret == CAMERA_ERROR_NONE)
5299                 *mode = (camera_attr_scene_mode_e)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_SCENE_MODE];
5300
5301         LOGD("ret : 0x%x", ret);
5302
5303         return ret;
5304 }
5305
5306
5307 int camera_attr_is_enabled_tag(camera_h camera, bool *enable)
5308 {
5309         int ret = CAMERA_ERROR_NONE;
5310         camera_cli_s *pc = (camera_cli_s *)camera;
5311         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_IS_ENABLED_TAG;
5312
5313         if (!pc || !pc->cb_info || !enable) {
5314                 LOGE("NULL pointer %p %p", pc, enable);
5315                 return CAMERA_ERROR_INVALID_PARAMETER;
5316         }
5317
5318         LOGD("Enter");
5319
5320         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5321
5322         if (ret == CAMERA_ERROR_NONE)
5323                 *enable = (bool)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_ENABLED_TAG];
5324
5325         LOGD("ret : 0x%x", ret);
5326
5327         return ret;
5328 }
5329
5330
5331 int camera_attr_get_tag_image_description(camera_h camera, char **description)
5332 {
5333         int ret = CAMERA_ERROR_NONE;
5334         camera_cli_s *pc = (camera_cli_s *)camera;
5335         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_TAG_IMAGE_DESCRIPTION;
5336
5337         if (!pc || !pc->cb_info || !description) {
5338                 LOGE("NULL pointer %p %p", pc, description);
5339                 return CAMERA_ERROR_INVALID_PARAMETER;
5340         }
5341
5342         LOGD("Enter");
5343
5344         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5345
5346         if (ret == CAMERA_ERROR_NONE)
5347                 *description = strdup(pc->cb_info->get_string[MUSE_CAMERA_GET_STRING_TAG_IMAGE_DESCRIPTION]);
5348
5349         LOGD("ret : 0x%x", ret);
5350
5351         return ret;
5352 }
5353
5354
5355 int camera_attr_get_tag_orientation(camera_h camera, camera_attr_tag_orientation_e *orientation)
5356 {
5357         int ret = CAMERA_ERROR_NONE;
5358         camera_cli_s *pc = (camera_cli_s *)camera;
5359         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_TAG_ORIENTATION;
5360
5361         if (!pc || !pc->cb_info || !orientation) {
5362                 LOGE("NULL pointer %p %p", pc, orientation);
5363                 return CAMERA_ERROR_INVALID_PARAMETER;
5364         }
5365
5366         LOGD("Enter");
5367
5368         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5369
5370         if (ret == CAMERA_ERROR_NONE)
5371                 *orientation = (camera_attr_tag_orientation_e)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_TAG_ORIENTATION];
5372
5373         LOGD("ret : 0x%x", ret);
5374
5375         return ret;
5376 }
5377
5378
5379 int camera_attr_get_tag_software(camera_h camera, char **software)
5380 {
5381         int ret = CAMERA_ERROR_NONE;
5382         camera_cli_s *pc = (camera_cli_s *)camera;
5383         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_TAG_SOFTWARE;
5384
5385         if (!pc || !pc->cb_info || !software) {
5386                 LOGE("NULL pointer %p %p", pc, software);
5387                 return CAMERA_ERROR_INVALID_PARAMETER;
5388         }
5389
5390         LOGD("Enter");
5391
5392         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5393
5394         if (ret == CAMERA_ERROR_NONE)
5395                 *software = strdup(pc->cb_info->get_string[MUSE_CAMERA_GET_STRING_TAG_SOFTWARE]);
5396
5397         LOGD("ret : 0x%x", ret);
5398
5399         return ret;
5400 }
5401
5402
5403 int camera_attr_get_geotag(camera_h camera, double *latitude, double *longitude, double *altitude)
5404 {
5405         int ret = CAMERA_ERROR_NONE;
5406         camera_cli_s *pc = (camera_cli_s *)camera;
5407         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_GEOTAG;
5408
5409         if (!pc || !pc->cb_info || !latitude || !longitude || !altitude) {
5410                 LOGE("NULL pointer %p %p %p %p", pc, latitude, longitude, altitude);
5411                 return CAMERA_ERROR_INVALID_PARAMETER;
5412         }
5413
5414         LOGD("Enter");
5415
5416         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5417
5418         if (ret == CAMERA_ERROR_NONE) {
5419                 *latitude = pc->cb_info->get_geotag[0];
5420                 *longitude = pc->cb_info->get_geotag[1];
5421                 *altitude = pc->cb_info->get_geotag[2];
5422         }
5423
5424         LOGD("ret : 0x%x", ret);
5425
5426         return ret;
5427 }
5428
5429
5430 int camera_attr_get_flash_mode(camera_h camera, camera_attr_flash_mode_e *mode)
5431 {
5432         int ret = CAMERA_ERROR_NONE;
5433         camera_cli_s *pc = (camera_cli_s *)camera;
5434         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_FLASH_MODE;
5435
5436         if (!pc || !pc->cb_info || !mode) {
5437                 LOGE("NULL pointer %p %p", pc, mode);
5438                 return CAMERA_ERROR_INVALID_PARAMETER;
5439         }
5440
5441         LOGD("Enter");
5442
5443         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5444
5445         if (ret == CAMERA_ERROR_NONE)
5446                 *mode = (camera_attr_flash_mode_e)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_FLASH_MODE];
5447
5448         LOGD("ret : 0x%x", ret);
5449
5450         return ret;
5451 }
5452
5453
5454 int camera_get_flash_state(camera_device_e device, camera_flash_state_e *state)
5455 {
5456         int ret = CAMERA_ERROR_NONE;
5457         int get_flash_state = 0;
5458
5459         if (!state) {
5460                 LOGE("NULL pointer");
5461                 return CAMERA_ERROR_INVALID_PARAMETER;
5462         }
5463
5464         ret = _camera_independent_request(MUSE_CAMERA_API_GET_FLASH_STATE,
5465                 (int)device, "get_flash_state", &get_flash_state);
5466
5467         if (ret == CAMERA_ERROR_NONE) {
5468                 *state = (camera_flash_state_e)get_flash_state;
5469                 LOGD("flash state %d", *state);
5470         } else {
5471                 LOGE("failed 0x%x", ret);
5472         }
5473
5474         return ret;
5475 }
5476
5477
5478 int camera_attr_foreach_supported_af_mode(camera_h camera, camera_attr_supported_af_mode_cb foreach_cb, void *user_data)
5479 {
5480         int ret = CAMERA_ERROR_NONE;
5481         camera_cli_s *pc = (camera_cli_s *)camera;
5482         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_FOREACH_SUPPORTED_AF_MODE;
5483
5484         if (!pc || !pc->cb_info || !foreach_cb) {
5485                 LOGE("NULL pointer %p %p", pc, foreach_cb);
5486                 return CAMERA_ERROR_INVALID_PARAMETER;
5487         }
5488
5489         LOGD("Enter");
5490
5491         pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_AF_MODE] = foreach_cb;
5492         pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_AF_MODE] = user_data;
5493
5494         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5495
5496         LOGD("ret : 0x%x", ret);
5497
5498         return ret;
5499 }
5500
5501
5502 int camera_attr_foreach_supported_exposure_mode(camera_h camera, camera_attr_supported_exposure_mode_cb foreach_cb, void *user_data)
5503 {
5504         int ret = CAMERA_ERROR_NONE;
5505         camera_cli_s *pc = (camera_cli_s *)camera;
5506         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_FOREACH_SUPPORTED_EXPOSURE_MODE;
5507
5508         if (!pc || !pc->cb_info || !foreach_cb) {
5509                 LOGE("NULL pointer %p %p", pc, foreach_cb);
5510                 return CAMERA_ERROR_INVALID_PARAMETER;
5511         }
5512
5513         LOGD("Enter");
5514
5515         pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_EXPOSURE_MODE] = foreach_cb;
5516         pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_EXPOSURE_MODE] = user_data;
5517
5518         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5519
5520         LOGD("ret : 0x%x", ret);
5521
5522         return ret;
5523 }
5524
5525
5526 int camera_attr_foreach_supported_iso(camera_h camera, camera_attr_supported_iso_cb foreach_cb, void *user_data)
5527 {
5528         int ret = CAMERA_ERROR_NONE;
5529         camera_cli_s *pc = (camera_cli_s *)camera;
5530         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_FOREACH_SUPPORTED_ISO;
5531
5532         if (!pc || !pc->cb_info || !foreach_cb) {
5533                 LOGE("NULL pointer %p %p", pc, foreach_cb);
5534                 return CAMERA_ERROR_INVALID_PARAMETER;
5535         }
5536
5537         LOGD("Enter");
5538
5539         pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_ISO] = foreach_cb;
5540         pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_ISO] = user_data;
5541
5542         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5543
5544         LOGD("ret : 0x%x", ret);
5545
5546         return ret;
5547 }
5548
5549
5550 int camera_attr_foreach_supported_whitebalance(camera_h camera, camera_attr_supported_whitebalance_cb foreach_cb, void *user_data)
5551 {
5552         int ret = CAMERA_ERROR_NONE;
5553         camera_cli_s *pc = (camera_cli_s *)camera;
5554         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_FOREACH_SUPPORTED_WHITEBALANCE;
5555
5556         if (!pc || !pc->cb_info || !foreach_cb) {
5557                 LOGE("NULL pointer %p %p", pc, foreach_cb);
5558                 return CAMERA_ERROR_INVALID_PARAMETER;
5559         }
5560
5561         LOGD("Enter");
5562
5563         pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_WHITEBALANCE] = foreach_cb;
5564         pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_WHITEBALANCE] = user_data;
5565
5566         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5567
5568         LOGD("ret : 0x%x", ret);
5569
5570         return ret;
5571 }
5572
5573
5574 int camera_attr_foreach_supported_effect(camera_h camera, camera_attr_supported_effect_cb foreach_cb, void *user_data)
5575 {
5576         int ret = CAMERA_ERROR_NONE;
5577         camera_cli_s *pc = (camera_cli_s *)camera;
5578         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_FOREACH_SUPPORTED_EFFECT;
5579
5580         if (!pc || !pc->cb_info || !foreach_cb) {
5581                 LOGE("NULL pointer %p %p", pc, foreach_cb);
5582                 return CAMERA_ERROR_INVALID_PARAMETER;
5583         }
5584
5585         LOGD("Enter");
5586
5587         pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_EFFECT] = foreach_cb;
5588         pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_EFFECT] = user_data;
5589
5590         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5591
5592         LOGD("ret : 0x%x", ret);
5593
5594         return ret;
5595 }
5596
5597
5598 int camera_attr_foreach_supported_scene_mode(camera_h camera, camera_attr_supported_scene_mode_cb foreach_cb, void *user_data)
5599 {
5600         int ret = CAMERA_ERROR_NONE;
5601         camera_cli_s *pc = (camera_cli_s *)camera;
5602         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_FOREACH_SUPPORTED_SCENE_MODE;
5603
5604         if (!pc || !pc->cb_info || !foreach_cb) {
5605                 LOGE("NULL pointer %p %p", pc, foreach_cb);
5606                 return CAMERA_ERROR_INVALID_PARAMETER;
5607         }
5608
5609         LOGD("Enter");
5610
5611         pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_SCENE_MODE] = foreach_cb;
5612         pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_SCENE_MODE] = user_data;
5613
5614         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5615
5616         LOGD("ret : 0x%x", ret);
5617
5618         return ret;
5619 }
5620
5621
5622 int camera_attr_foreach_supported_flash_mode(camera_h camera, camera_attr_supported_flash_mode_cb foreach_cb, void *user_data)
5623 {
5624         int ret = CAMERA_ERROR_NONE;
5625         camera_cli_s *pc = (camera_cli_s *)camera;
5626         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_FOREACH_SUPPORTED_FLASH_MODE;
5627
5628         if (!pc || !pc->cb_info || !foreach_cb) {
5629                 LOGE("NULL pointer %p %p", pc, foreach_cb);
5630                 return CAMERA_ERROR_INVALID_PARAMETER;
5631         }
5632
5633         LOGD("Enter");
5634
5635         pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_FLASH_MODE] = foreach_cb;
5636         pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_FLASH_MODE] = user_data;
5637
5638         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5639
5640         LOGD("ret : 0x%x", ret);
5641
5642         return ret;
5643 }
5644
5645
5646 int camera_attr_foreach_supported_fps(camera_h camera, camera_attr_supported_fps_cb foreach_cb, void *user_data)
5647 {
5648         int ret = CAMERA_ERROR_NONE;
5649         camera_cli_s *pc = (camera_cli_s *)camera;
5650         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_FOREACH_SUPPORTED_FPS;
5651
5652         if (!pc || !pc->cb_info || !foreach_cb) {
5653                 LOGE("NULL pointer %p %p", pc, foreach_cb);
5654                 return CAMERA_ERROR_INVALID_PARAMETER;
5655         }
5656
5657         LOGD("Enter");
5658
5659         pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_FPS] = foreach_cb;
5660         pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_FPS] = user_data;
5661
5662         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5663
5664         LOGD("Enter, handle :%x", pc->remote_handle);
5665
5666         return ret;
5667 }
5668
5669
5670 int camera_attr_foreach_supported_fps_by_resolution(camera_h camera, int width, int height, camera_attr_supported_fps_cb foreach_cb, void *user_data)
5671 {
5672         int ret = CAMERA_ERROR_NONE;
5673         camera_cli_s *pc = (camera_cli_s *)camera;
5674         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_FOREACH_SUPPORTED_FPS_BY_RESOLUTION;
5675         camera_msg_param param;
5676         int value = 0;
5677
5678         if (!pc || !pc->cb_info || !foreach_cb) {
5679                 LOGE("NULL pointer %p %p", pc, foreach_cb);
5680                 return CAMERA_ERROR_INVALID_PARAMETER;
5681         }
5682
5683         LOGD("Enter");
5684
5685         pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_FPS_BY_RESOLUTION] = foreach_cb;
5686         pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_FPS_BY_RESOLUTION] = user_data;
5687
5688         value = (width << 16) | height;
5689         CAMERA_MSG_PARAM_SET(param, INT, value);
5690
5691         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
5692
5693         LOGD("ret : 0x%x", ret);
5694
5695         return ret;
5696 }
5697
5698
5699 int camera_attr_foreach_supported_stream_flip(camera_h camera, camera_attr_supported_stream_flip_cb foreach_cb, void *user_data)
5700 {
5701         int ret = CAMERA_ERROR_NONE;
5702         camera_cli_s *pc = (camera_cli_s *)camera;
5703         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_FOREACH_SUPPORTED_STREAM_FLIP;
5704
5705         if (!pc || !pc->cb_info || !foreach_cb) {
5706                 LOGE("NULL pointer %p %p", pc, foreach_cb);
5707                 return CAMERA_ERROR_INVALID_PARAMETER;
5708         }
5709
5710         LOGD("Enter");
5711
5712         pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_STREAM_FLIP] = foreach_cb;
5713         pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_STREAM_FLIP] = user_data;
5714
5715         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5716
5717         LOGD("ret : 0x%x", ret);
5718
5719         return ret;
5720 }
5721
5722
5723 int camera_attr_foreach_supported_stream_rotation(camera_h camera, camera_attr_supported_stream_rotation_cb foreach_cb, void *user_data)
5724 {
5725         int ret = CAMERA_ERROR_NONE;
5726         camera_cli_s *pc = (camera_cli_s *)camera;
5727         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_FOREACH_SUPPORTED_STREAM_ROTATION;
5728
5729         if (!pc || !pc->cb_info || !foreach_cb) {
5730                 LOGE("NULL pointer %p %p", pc, foreach_cb);
5731                 return CAMERA_ERROR_INVALID_PARAMETER;
5732         }
5733
5734         LOGD("Enter");
5735
5736         pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_STREAM_ROTATION] = foreach_cb;
5737         pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_STREAM_ROTATION] = user_data;
5738
5739         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5740
5741         LOGD("ret : 0x%x", ret);
5742
5743         return ret;
5744 }
5745
5746
5747 int camera_attr_set_stream_rotation(camera_h camera, camera_rotation_e rotation)
5748 {
5749         int ret = CAMERA_ERROR_NONE;
5750         camera_cli_s *pc = (camera_cli_s *)camera;
5751         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_STREAM_ROTATION;
5752         camera_msg_param param;
5753         int set_rotation = (int)rotation;
5754
5755         if (!pc || !pc->cb_info) {
5756                 LOGE("NULL handle");
5757                 return CAMERA_ERROR_INVALID_PARAMETER;
5758         }
5759
5760         LOGD("Enter");
5761
5762         CAMERA_MSG_PARAM_SET(param, INT, set_rotation);
5763
5764         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
5765
5766         LOGD("ret : 0x%x", ret);
5767
5768         return ret;
5769 }
5770
5771
5772 int camera_attr_get_stream_rotation(camera_h camera, camera_rotation_e *rotation)
5773 {
5774         int ret = CAMERA_ERROR_NONE;
5775         camera_cli_s *pc = (camera_cli_s *)camera;
5776         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_STREAM_ROTATION;
5777
5778         if (!pc || !pc->cb_info || !rotation) {
5779                 LOGE("NULL pointer %p %p", pc, rotation);
5780                 return CAMERA_ERROR_INVALID_PARAMETER;
5781         }
5782
5783         LOGD("Enter");
5784
5785         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5786
5787         if (ret == CAMERA_ERROR_NONE)
5788                 *rotation = (camera_rotation_e)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_STREAM_ROTATION];
5789
5790         LOGD("ret : 0x%x", ret);
5791
5792         return ret;
5793 }
5794
5795
5796 int camera_attr_set_stream_flip(camera_h camera, camera_flip_e flip)
5797 {
5798         int ret = CAMERA_ERROR_NONE;
5799         camera_cli_s *pc = (camera_cli_s *)camera;
5800         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_STREAM_FLIP;
5801         camera_msg_param param;
5802         int set_flip = (int)flip;
5803
5804         if (!pc || !pc->cb_info) {
5805                 LOGE("NULL handle");
5806                 return CAMERA_ERROR_INVALID_PARAMETER;
5807         }
5808
5809         LOGD("Enter");
5810
5811         CAMERA_MSG_PARAM_SET(param, INT, set_flip);
5812
5813         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
5814
5815         LOGD("ret : 0x%x", ret);
5816
5817         return ret;
5818 }
5819
5820
5821 int camera_attr_get_stream_flip(camera_h camera, camera_flip_e *flip)
5822 {
5823         int ret = CAMERA_ERROR_NONE;
5824         camera_cli_s *pc = (camera_cli_s *)camera;
5825         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_STREAM_FLIP;
5826
5827         if (!pc || !pc->cb_info || !flip) {
5828                 LOGE("NULL pointer %p %p", pc, flip);
5829                 return CAMERA_ERROR_INVALID_PARAMETER;
5830         }
5831
5832         LOGD("Enter");
5833
5834         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5835
5836         if (ret == CAMERA_ERROR_NONE)
5837                 *flip = (camera_flip_e)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_STREAM_FLIP];
5838
5839         LOGD("ret : 0x%x", ret);
5840
5841         return ret;
5842 }
5843
5844 int camera_attr_set_hdr_mode(camera_h camera, camera_attr_hdr_mode_e mode)
5845 {
5846         int ret = CAMERA_ERROR_NONE;
5847         camera_cli_s *pc = (camera_cli_s *)camera;
5848         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_HDR_MODE;
5849         camera_msg_param param;
5850         int set_mode = (int)mode;
5851
5852         if (!pc || !pc->cb_info) {
5853                 LOGE("NULL handle");
5854                 return CAMERA_ERROR_INVALID_PARAMETER;
5855         }
5856
5857         LOGD("Enter");
5858
5859         CAMERA_MSG_PARAM_SET(param, INT, set_mode);
5860
5861         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
5862
5863         LOGD("ret : 0x%x", ret);
5864
5865         return ret;
5866 }
5867
5868
5869 int camera_attr_get_hdr_mode(camera_h camera, camera_attr_hdr_mode_e *mode)
5870 {
5871         int ret = CAMERA_ERROR_NONE;
5872         camera_cli_s *pc = (camera_cli_s *)camera;
5873         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_HDR_MODE;
5874
5875         if (!pc || !pc->cb_info || !mode) {
5876                 LOGE("NULL pointer %p %p", pc, mode);
5877                 return CAMERA_ERROR_INVALID_PARAMETER;
5878         }
5879
5880         LOGD("Enter");
5881
5882         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5883
5884         if (ret == CAMERA_ERROR_NONE)
5885                 *mode = (camera_attr_hdr_mode_e)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_HDR_MODE];
5886
5887         LOGD("ret : 0x%x", ret);
5888
5889         return ret;
5890 }
5891
5892
5893 bool camera_attr_is_supported_hdr_capture(camera_h camera)
5894 {
5895         int ret = CAMERA_ERROR_NONE;
5896         camera_cli_s *pc = (camera_cli_s *)camera;
5897         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_IS_SUPPORTED_HDR_CAPTURE;
5898
5899         if (!pc || !pc->cb_info) {
5900                 LOGE("NULL handle");
5901                 return CAMERA_ERROR_INVALID_PARAMETER;
5902         }
5903
5904         LOGD("Enter");
5905
5906         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5907
5908         if (ret < 0) {
5909                 LOGE("error is occurred 0x%x", ret);
5910                 ret = false;
5911         }
5912
5913         LOGD("ret : %d", ret);
5914
5915         return (bool)ret;
5916 }
5917
5918
5919 int camera_attr_set_hdr_capture_progress_cb(camera_h camera, camera_attr_hdr_progress_cb callback, void *user_data)
5920 {
5921         int ret = CAMERA_ERROR_NONE;
5922         camera_cli_s *pc = (camera_cli_s *)camera;
5923         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_HDR_CAPTURE_PROGRESS_CB;
5924
5925         if (!pc || !pc->cb_info) {
5926                 LOGE("NULL handle");
5927                 return CAMERA_ERROR_INVALID_PARAMETER;
5928         }
5929
5930         LOGD("Enter");
5931
5932         if (!camera_attr_is_supported_hdr_capture(camera)) {
5933                 LOGE("HDR not supported");
5934                 return CAMERA_ERROR_NOT_SUPPORTED;
5935         }
5936
5937         if (!callback) {
5938                 LOGE("NULL callback");
5939                 return CAMERA_ERROR_INVALID_PARAMETER;
5940         }
5941
5942         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5943
5944         if (ret == CAMERA_ERROR_NONE) {
5945                 g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_HDR_PROGRESS]);
5946
5947                 pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_HDR_PROGRESS] = callback;
5948                 pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_HDR_PROGRESS] = user_data;
5949
5950                 g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_HDR_PROGRESS]);
5951         }
5952
5953         LOGD("ret : 0x%x", ret);
5954
5955         return ret;
5956 }
5957
5958
5959 int camera_attr_unset_hdr_capture_progress_cb(camera_h camera)
5960 {
5961         int ret = CAMERA_ERROR_NONE;
5962         camera_cli_s *pc = (camera_cli_s *)camera;
5963         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_UNSET_HDR_CAPTURE_PROGRESS_CB;
5964
5965         if (!pc || !pc->cb_info) {
5966                 LOGE("NULL handle");
5967                 return CAMERA_ERROR_INVALID_PARAMETER;
5968         }
5969
5970         LOGD("Enter");
5971
5972         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
5973
5974         if (ret == CAMERA_ERROR_NONE) {
5975                 g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_HDR_PROGRESS]);
5976
5977                 pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_HDR_PROGRESS] = NULL;
5978                 pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_HDR_PROGRESS] = NULL;
5979
5980                 g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_CAMERA_EVENT_TYPE_HDR_PROGRESS]);
5981         }
5982
5983         LOGD("ret : 0x%x", ret);
5984
5985         return ret;
5986 }
5987
5988
5989 int camera_attr_enable_anti_shake(camera_h camera, bool enable)
5990 {
5991         int ret = CAMERA_ERROR_NONE;
5992         camera_cli_s *pc = (camera_cli_s *)camera;
5993         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_ENABLE_ANTI_SHAKE;
5994         camera_msg_param param;
5995         int set_enable = (int)enable;
5996
5997         if (!pc || !pc->cb_info) {
5998                 LOGE("NULL handle");
5999                 return CAMERA_ERROR_INVALID_PARAMETER;
6000         }
6001
6002         LOGD("Enter");
6003
6004         CAMERA_MSG_PARAM_SET(param, INT, set_enable);
6005
6006         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
6007
6008         LOGD("ret : 0x%x", ret);
6009
6010         return ret;
6011 }
6012
6013
6014 int camera_attr_is_enabled_anti_shake(camera_h camera, bool *enabled)
6015 {
6016         int ret = CAMERA_ERROR_NONE;
6017         camera_cli_s *pc = (camera_cli_s *)camera;
6018         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_IS_ENABLED_ANTI_SHAKE;
6019
6020         if (!pc || !pc->cb_info || !enabled) {
6021                 LOGE("NULL pointer %p %p", pc, enabled);
6022                 return CAMERA_ERROR_INVALID_PARAMETER;
6023         }
6024
6025         LOGD("Enter");
6026
6027         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
6028
6029         if (ret == CAMERA_ERROR_NONE)
6030                 *enabled = (bool)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_ENABLED_ANTI_SHAKE];
6031
6032         LOGD("ret : 0x%x", ret);
6033
6034         return ret;
6035 }
6036
6037
6038 bool camera_attr_is_supported_anti_shake(camera_h camera)
6039 {
6040         int ret = CAMERA_ERROR_NONE;
6041         camera_cli_s *pc = (camera_cli_s *)camera;
6042         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_IS_SUPPORTED_ANTI_SHAKE;
6043
6044         if (!pc || !pc->cb_info) {
6045                 LOGE("NULL handle");
6046                 return CAMERA_ERROR_INVALID_PARAMETER;
6047         }
6048
6049         LOGD("Enter");
6050
6051         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
6052
6053         if (ret < 0) {
6054                 LOGE("error is occurred 0x%x", ret);
6055                 ret = false;
6056         }
6057
6058         LOGD("ret : %d", ret);
6059
6060         return (bool)ret;
6061 }
6062
6063
6064 int camera_attr_enable_video_stabilization(camera_h camera, bool enable)
6065 {
6066         int ret = CAMERA_ERROR_NONE;
6067         camera_cli_s *pc = (camera_cli_s *)camera;
6068         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_ENABLE_VIDEO_STABILIZATION;
6069         camera_msg_param param;
6070         int set_enable = (int)enable;
6071
6072         if (!pc || !pc->cb_info) {
6073                 LOGE("NULL handle");
6074                 return CAMERA_ERROR_INVALID_PARAMETER;
6075         }
6076
6077         LOGD("Enter");
6078
6079         CAMERA_MSG_PARAM_SET(param, INT, set_enable);
6080
6081         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
6082
6083         LOGD("ret : 0x%x", ret);
6084
6085         return ret;
6086 }
6087
6088
6089 int camera_attr_is_enabled_video_stabilization(camera_h camera, bool *enabled)
6090 {
6091         int ret = CAMERA_ERROR_NONE;
6092         camera_cli_s *pc = (camera_cli_s *)camera;
6093         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_IS_ENABLED_VIDEO_STABILIZATION;
6094
6095         if (!pc || !pc->cb_info || !enabled) {
6096                 LOGE("NULL pointer %p %p", pc, enabled);
6097                 return CAMERA_ERROR_INVALID_PARAMETER;
6098         }
6099
6100         LOGD("Enter");
6101
6102         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
6103
6104         if (ret == CAMERA_ERROR_NONE)
6105                 *enabled = (bool)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_ENABLED_VIDEO_STABILIZATION];
6106
6107         LOGD("ret : 0x%x", ret);
6108
6109         return ret;
6110 }
6111
6112
6113 bool camera_attr_is_supported_video_stabilization(camera_h camera)
6114 {
6115         int ret = CAMERA_ERROR_NONE;
6116         camera_cli_s *pc = (camera_cli_s *)camera;
6117         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_IS_SUPPORTED_VIDEO_STABILIZATION;
6118
6119         if (!pc || !pc->cb_info) {
6120                 LOGE("NULL handle");
6121                 return CAMERA_ERROR_INVALID_PARAMETER;
6122         }
6123
6124         LOGD("Enter");
6125
6126         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
6127
6128         if (ret < 0) {
6129                 LOGE("error is occurred 0x%x", ret);
6130                 ret = false;
6131         }
6132
6133         LOGD("ret : %d", ret);
6134
6135         return (bool)ret;
6136 }
6137
6138
6139 int camera_attr_enable_auto_contrast(camera_h camera, bool enable)
6140 {
6141         int ret = CAMERA_ERROR_NONE;
6142         camera_cli_s *pc = (camera_cli_s *)camera;
6143         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_ENABLE_AUTO_CONTRAST;
6144         camera_msg_param param;
6145         int set_enable = (int)enable;
6146
6147         if (!pc || !pc->cb_info) {
6148                 LOGE("NULL handle");
6149                 return CAMERA_ERROR_INVALID_PARAMETER;
6150         }
6151
6152         LOGD("Enter");
6153
6154         CAMERA_MSG_PARAM_SET(param, INT, set_enable);
6155
6156         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
6157
6158         LOGD("ret : 0x%x", ret);
6159
6160         return ret;
6161 }
6162
6163
6164 int camera_attr_is_enabled_auto_contrast(camera_h camera, bool *enabled)
6165 {
6166         int ret = CAMERA_ERROR_NONE;
6167         camera_cli_s *pc = (camera_cli_s *)camera;
6168         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_IS_ENABLED_AUTO_CONTRAST;
6169
6170         if (!pc || !pc->cb_info || !enabled) {
6171                 LOGE("NULL pointer %p %p", pc, enabled);
6172                 return CAMERA_ERROR_INVALID_PARAMETER;
6173         }
6174
6175         LOGD("Enter");
6176
6177         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
6178
6179         if (ret == CAMERA_ERROR_NONE)
6180                 *enabled = (bool)pc->cb_info->get_int[MUSE_CAMERA_GET_INT_ENABLED_AUTO_CONTRAST];
6181
6182         LOGD("ret : 0x%x", ret);
6183
6184         return ret;
6185 }
6186
6187
6188 bool camera_attr_is_supported_auto_contrast(camera_h camera)
6189 {
6190         int ret = CAMERA_ERROR_NONE;
6191         camera_cli_s *pc = (camera_cli_s *)camera;
6192         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_IS_SUPPORTED_AUTO_CONTRAST;
6193
6194         if (!pc || !pc->cb_info) {
6195                 LOGE("NULL handle");
6196                 return CAMERA_ERROR_INVALID_PARAMETER;
6197         }
6198
6199         LOGD("Enter");
6200
6201         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
6202
6203         if (ret < 0) {
6204                 LOGE("error is occurred 0x%x", ret);
6205                 ret = false;
6206         }
6207
6208         LOGD("ret : %d", ret);
6209
6210         return (bool)ret;
6211 }
6212
6213
6214 int camera_attr_disable_shutter_sound(camera_h camera, bool disable)
6215 {
6216         int ret = CAMERA_ERROR_NONE;
6217         camera_cli_s *pc = (camera_cli_s *)camera;
6218         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_DISABLE_SHUTTER_SOUND;
6219         camera_msg_param param;
6220         int set_disable = (int)disable;
6221
6222         if (!pc || !pc->cb_info) {
6223                 LOGE("NULL handle");
6224                 return CAMERA_ERROR_INVALID_PARAMETER;
6225         }
6226
6227         LOGD("Enter");
6228
6229         CAMERA_MSG_PARAM_SET(param, INT, set_disable);
6230
6231         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
6232
6233         LOGD("ret : 0x%x", ret);
6234
6235         return ret;
6236 }
6237
6238
6239 int camera_attr_set_pan(camera_h camera, camera_attr_ptz_move_type_e move_type, int pan_step)
6240 {
6241         int ret = CAMERA_ERROR_NONE;
6242         camera_cli_s *pc = (camera_cli_s *)camera;
6243         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_PAN;
6244         camera_msg_param param;
6245         int set_move_type = (int)move_type;
6246         int value = 0;
6247
6248         if (!pc || !pc->cb_info) {
6249                 LOGE("NULL handle");
6250                 return CAMERA_ERROR_INVALID_PARAMETER;
6251         }
6252
6253         LOGD("Enter");
6254
6255         value = (set_move_type << 16) | pan_step;
6256         CAMERA_MSG_PARAM_SET(param, INT, value);
6257
6258         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
6259
6260         LOGD("ret : 0x%x", ret);
6261
6262         return ret;
6263 }
6264
6265
6266 int camera_attr_get_pan(camera_h camera, int *pan_step)
6267 {
6268         int ret = CAMERA_ERROR_NONE;
6269         camera_cli_s *pc = (camera_cli_s *)camera;
6270         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_PAN;
6271
6272         if (!pc || !pc->cb_info || !pan_step) {
6273                 LOGE("NULL pointer %p %p", pc, pan_step);
6274                 return CAMERA_ERROR_INVALID_PARAMETER;
6275         }
6276
6277         LOGD("Enter");
6278
6279         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
6280
6281         if (ret == CAMERA_ERROR_NONE)
6282                 *pan_step = pc->cb_info->get_int[MUSE_CAMERA_GET_INT_PAN];
6283
6284         LOGD("ret : 0x%x", ret);
6285
6286         return ret;
6287 }
6288
6289
6290 int camera_attr_get_pan_range(camera_h camera, int *min, int *max)
6291 {
6292         int ret = CAMERA_ERROR_NONE;
6293         camera_cli_s *pc = (camera_cli_s *)camera;
6294         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_PAN_RANGE;
6295
6296         if (!pc || !pc->cb_info || !min || !max) {
6297                 LOGE("NULL pointer %p %p %p", pc, min, max);
6298                 return CAMERA_ERROR_INVALID_PARAMETER;
6299         }
6300
6301         LOGD("Enter");
6302
6303         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
6304
6305         if (ret == CAMERA_ERROR_NONE) {
6306                 *min = pc->cb_info->get_int_pair[MUSE_CAMERA_GET_INT_PAIR_PAN_RANGE][0];
6307                 *max = pc->cb_info->get_int_pair[MUSE_CAMERA_GET_INT_PAIR_PAN_RANGE][1];
6308         }
6309
6310         LOGD("ret : 0x%x", ret);
6311
6312         return ret;
6313 }
6314
6315
6316 int camera_attr_set_tilt(camera_h camera, camera_attr_ptz_move_type_e move_type, int tilt_step)
6317 {
6318         int ret = CAMERA_ERROR_NONE;
6319         camera_cli_s *pc = (camera_cli_s *)camera;
6320         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_TILT;
6321         camera_msg_param param;
6322         int set_move_type = (int)move_type;
6323         int value = 0;
6324
6325         if (!pc || !pc->cb_info) {
6326                 LOGE("NULL handle");
6327                 return CAMERA_ERROR_INVALID_PARAMETER;
6328         }
6329
6330         LOGD("Enter");
6331
6332         value = (set_move_type << 16) | tilt_step;
6333         CAMERA_MSG_PARAM_SET(param, INT, value);
6334
6335         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
6336
6337         LOGD("ret : 0x%x", ret);
6338
6339         return ret;
6340 }
6341
6342
6343 int camera_attr_get_tilt(camera_h camera, int *tilt_step)
6344 {
6345         int ret = CAMERA_ERROR_NONE;
6346         camera_cli_s *pc = (camera_cli_s *)camera;
6347         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_TILT;
6348
6349         if (!pc || !pc->cb_info || !tilt_step) {
6350                 LOGE("NULL pointer %p %p", pc, tilt_step);
6351                 return CAMERA_ERROR_INVALID_PARAMETER;
6352         }
6353
6354         LOGD("Enter");
6355
6356         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
6357
6358         if (ret == CAMERA_ERROR_NONE)
6359                 *tilt_step = pc->cb_info->get_int[MUSE_CAMERA_GET_INT_TILT];
6360
6361         LOGD("ret : 0x%x", ret);
6362
6363         return ret;
6364 }
6365
6366
6367 int camera_attr_get_tilt_range(camera_h camera, int *min, int *max)
6368 {
6369         int ret = CAMERA_ERROR_NONE;
6370         camera_cli_s *pc = (camera_cli_s *)camera;
6371         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_TILT_RANGE;
6372
6373         if (!pc || !pc->cb_info || !min || !max) {
6374                 LOGE("NULL pointer %p %p %p", pc, min, max);
6375                 return CAMERA_ERROR_INVALID_PARAMETER;
6376         }
6377
6378         LOGD("Enter");
6379
6380         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
6381
6382         if (ret == CAMERA_ERROR_NONE) {
6383                 *min = pc->cb_info->get_int_pair[MUSE_CAMERA_GET_INT_PAIR_TILT_RANGE][0];
6384                 *max = pc->cb_info->get_int_pair[MUSE_CAMERA_GET_INT_PAIR_TILT_RANGE][1];
6385         }
6386
6387         LOGD("ret : 0x%x", ret);
6388
6389         return ret;
6390 }
6391
6392
6393 int camera_attr_set_ptz_type(camera_h camera, camera_attr_ptz_type_e ptz_type)
6394 {
6395         int ret = CAMERA_ERROR_NONE;
6396         camera_cli_s *pc = (camera_cli_s *)camera;
6397         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_PTZ_TYPE;
6398         camera_msg_param param;
6399         int set_ptz_type = (int)ptz_type;
6400
6401         if (!pc || !pc->cb_info) {
6402                 LOGE("NULL handle");
6403                 return CAMERA_ERROR_INVALID_PARAMETER;
6404         }
6405
6406         LOGD("Enter");
6407
6408         CAMERA_MSG_PARAM_SET(param, INT, set_ptz_type);
6409
6410         _camera_msg_send_param1(api, pc->cb_info, &ret, &param, CAMERA_CB_TIMEOUT);
6411
6412         LOGD("ret : 0x%x", ret);
6413
6414         return ret;
6415 }
6416
6417
6418 int camera_attr_foreach_supported_ptz_type(camera_h camera, camera_attr_supported_ptz_type_cb foreach_cb, void *user_data)
6419 {
6420         int ret = CAMERA_ERROR_NONE;
6421         camera_cli_s *pc = (camera_cli_s *)camera;
6422         muse_camera_api_e api = MUSE_CAMERA_API_ATTR_FOREACH_SUPPORTED_PTZ_TYPE;
6423
6424         if (!pc || !pc->cb_info || !foreach_cb) {
6425                 LOGE("NULL pointer %p %p", pc, foreach_cb);
6426                 return CAMERA_ERROR_INVALID_PARAMETER;
6427         }
6428
6429         LOGD("Enter");
6430
6431         pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_PTZ_TYPE] = foreach_cb;
6432         pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_PTZ_TYPE] = user_data;
6433
6434         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
6435
6436         LOGD("ret : 0x%x", ret);
6437
6438         return ret;
6439 }
6440
6441
6442 int camera_attr_set_display_roi_area(camera_h camera, int x, int y, int width, int height)
6443 {
6444         int ret = CAMERA_ERROR_NONE;
6445         camera_cli_s *pc = (camera_cli_s *)camera;
6446         muse_camera_api_e api = MUSE_CAMERA_API_SET_DISPLAY_ROI_AREA;
6447         int set_display_roi_area[4] = {x, y, width, height};
6448         char *msg = NULL;
6449         int length = 0;
6450         int send_ret = 0;
6451
6452         if (!pc || !pc->cb_info) {
6453                 LOGE("NULL handle");
6454                 return CAMERA_ERROR_INVALID_PARAMETER;
6455         }
6456
6457         LOGD("Enter");
6458
6459         if (CHECK_PREVIEW_CB(pc->cb_info, PREVIEW_CB_TYPE_EVAS)) {
6460                 ret = mm_display_interface_evas_set_roi_area(pc->cb_info->dp_interface, x, y, width, height);
6461                 if (ret != MM_ERROR_NONE) {
6462                         LOGE("mm_evas_renderer_set_roi_area error 0x%x", ret);
6463                         return CAMERA_ERROR_INVALID_OPERATION;
6464                 }
6465         }
6466
6467         length = sizeof(set_display_roi_area) / sizeof(int) + \
6468                 (sizeof(set_display_roi_area) % sizeof(int) ? 1 : 0);
6469
6470         msg = muse_core_msg_new(api,
6471                 MUSE_TYPE_ARRAY, "set_display_roi_area", length, (int *)set_display_roi_area,
6472                 NULL);
6473         if (!msg) {
6474                 LOGE("msg creation failed: api %d", api);
6475                 return CAMERA_ERROR_OUT_OF_MEMORY;
6476         }
6477
6478         if (pc->cb_info->is_server_connected) {
6479                 __camera_update_api_waiting(pc->cb_info, api, 1);
6480
6481                 g_mutex_lock(&pc->cb_info->fd_lock);
6482                 send_ret = muse_core_msg_send(pc->cb_info->fd, msg);
6483                 g_mutex_unlock(&pc->cb_info->fd_lock);
6484         }
6485
6486         if (send_ret < 0) {
6487                 LOGE("message send failed");
6488                 ret = CAMERA_ERROR_INVALID_OPERATION;
6489         } else {
6490                 ret = _camera_client_wait_for_cb_return(api, pc->cb_info, CAMERA_CB_TIMEOUT);
6491         }
6492
6493         __camera_update_api_waiting(pc->cb_info, api, -1);
6494
6495         muse_core_msg_free(msg);
6496
6497         LOGD("ret : 0x%x", ret);
6498
6499         return ret;
6500 }
6501
6502
6503 int camera_attr_get_display_roi_area(camera_h camera, int *x, int *y, int *width, int *height)
6504 {
6505         camera_cli_s *pc = (camera_cli_s *)camera;
6506         int ret = CAMERA_ERROR_NONE;
6507         muse_camera_api_e api = MUSE_CAMERA_API_GET_DISPLAY_ROI_AREA;
6508
6509         if (!pc || !pc->cb_info || !x || !y || !width || !height) {
6510                 LOGE("NULL pointer %p %p %p %p %p", pc, x, y, width, height);
6511                 return CAMERA_ERROR_INVALID_PARAMETER;
6512         }
6513
6514         LOGD("Enter");
6515
6516         _camera_msg_send(api, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
6517
6518         if (ret == CAMERA_ERROR_NONE) {
6519                 *x = pc->cb_info->get_display_roi_area[0];
6520                 *y = pc->cb_info->get_display_roi_area[1];
6521                 *width = pc->cb_info->get_display_roi_area[2];
6522                 *height = pc->cb_info->get_display_roi_area[3];
6523         }
6524
6525         LOGD("ret : 0x%x", ret);
6526
6527         return ret;
6528 }
6529
6530
6531 int camera_get_device_state(camera_device_e device, camera_device_state_e *state)
6532 {
6533         int ret = CAMERA_ERROR_NONE;
6534         int get_device_state = 0;
6535
6536         if (!state) {
6537                 LOGE("NULL pointer");
6538                 return CAMERA_ERROR_INVALID_PARAMETER;
6539         }
6540
6541         ret = _camera_independent_request(MUSE_CAMERA_API_GET_DEVICE_STATE,
6542                 (int)device, "get_device_state", &get_device_state);
6543
6544         if (ret == CAMERA_ERROR_NONE) {
6545                 *state = (camera_device_state_e)get_device_state;
6546                 LOGD("device state %d", *state);
6547         } else {
6548                 LOGE("failed 0x%x", ret);
6549         }
6550
6551         return ret;
6552 }
6553
6554
6555 int camera_add_device_state_changed_cb(camera_device_state_changed_cb callback, void *user_data, int *cb_id)
6556 {
6557         int ret = CAMERA_ERROR_NONE;
6558         camera_device_state_e state = CAMERA_DEVICE_STATE_NULL;
6559         camera_cb_info *info = NULL;
6560
6561         if (!callback || !cb_id) {
6562                 LOGE("invalid pointer %p %p", callback, cb_id);
6563                 return CAMERA_ERROR_INVALID_PARAMETER;
6564         }
6565
6566         /* check camera support */
6567         ret = camera_get_device_state(CAMERA_DEVICE_CAMERA0, &state);
6568         if (ret != CAMERA_ERROR_NONE) {
6569                 LOGE("get device state failed");
6570                 return ret;
6571         }
6572
6573         g_mutex_lock(&g_cam_dev_state_changed_cb_lock);
6574
6575         info = g_new0(camera_cb_info, 1);
6576         if (!info) {
6577                 LOGE("info failed");
6578                 ret = CAMERA_ERROR_OUT_OF_MEMORY;
6579                 goto _DONE;
6580         }
6581
6582         info->id = ++g_cam_dev_state_changed_cb_id;
6583         info->callback = (void *)callback;
6584         info->user_data = user_data;
6585
6586         *cb_id = info->id;
6587
6588         /* subscribe dbus signal for camera state change */
6589         if (!g_cam_dev_state_changed_cb_conn) {
6590                 g_cam_dev_state_changed_cb_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL);
6591                 if (!g_cam_dev_state_changed_cb_conn) {
6592                         LOGE("failed to get gdbus connection");
6593                         ret = CAMERA_ERROR_INVALID_OPERATION;
6594                         goto _DONE;
6595                 }
6596
6597                 LOGD("subscribe signal %s - %s - %s",
6598                         MM_CAMCORDER_DBUS_OBJECT,
6599                         MM_CAMCORDER_DBUS_INTERFACE_CAMERA,
6600                         MM_CAMCORDER_DBUS_SIGNAL_STATE_CHANGED);
6601
6602                 g_cam_dev_state_changed_cb_subscribe_id = g_dbus_connection_signal_subscribe(g_cam_dev_state_changed_cb_conn,
6603                         NULL, MM_CAMCORDER_DBUS_INTERFACE_CAMERA, MM_CAMCORDER_DBUS_SIGNAL_STATE_CHANGED, MM_CAMCORDER_DBUS_OBJECT, NULL,
6604                         G_DBUS_SIGNAL_FLAGS_NONE, (GDBusSignalCallback)__camera_device_state_changed_cb, NULL, NULL);
6605                 if (!g_cam_dev_state_changed_cb_subscribe_id) {
6606                         LOGE("failed to get gdbus connection");
6607                         ret = CAMERA_ERROR_INVALID_OPERATION;
6608                         goto _DONE;
6609                 }
6610
6611                 LOGD("signal subscribe id %u", g_cam_dev_state_changed_cb_subscribe_id);
6612         }
6613
6614         g_cam_dev_state_changed_cb_list = g_list_prepend(g_cam_dev_state_changed_cb_list, (gpointer)info);
6615
6616         LOGD("callback id %d", info->id);
6617
6618 _DONE:
6619         if (ret != CAMERA_ERROR_NONE) {
6620                 if (info) {
6621                         g_free(info);
6622                         info = NULL;
6623                 }
6624
6625                 if (g_cam_dev_state_changed_cb_conn) {
6626                         g_object_unref(g_cam_dev_state_changed_cb_conn);
6627                         g_cam_dev_state_changed_cb_conn = NULL;
6628                 }
6629         }
6630
6631         g_mutex_unlock(&g_cam_dev_state_changed_cb_lock);
6632
6633         return ret;
6634 }
6635
6636
6637 int camera_remove_device_state_changed_cb(int cb_id)
6638 {
6639         int ret = CAMERA_ERROR_NONE;
6640         camera_device_state_e state = CAMERA_DEVICE_STATE_NULL;
6641         GList *tmp_list = NULL;
6642         camera_cb_info *info = NULL;
6643
6644         /* check camera support */
6645         ret = camera_get_device_state(CAMERA_DEVICE_CAMERA0, &state);
6646         if (ret != CAMERA_ERROR_NONE) {
6647                 LOGE("get device state failed");
6648                 return ret;
6649         }
6650
6651         g_mutex_lock(&g_cam_dev_state_changed_cb_lock);
6652
6653         if (!g_cam_dev_state_changed_cb_list) {
6654                 LOGE("there is no callback info");
6655                 ret = CAMERA_ERROR_INVALID_OPERATION;
6656                 goto _DONE;
6657         }
6658
6659         tmp_list = g_cam_dev_state_changed_cb_list;
6660
6661         do {
6662                 info = tmp_list->data;
6663                 tmp_list = tmp_list->next;
6664
6665                 if (!info) {
6666                         LOGW("NULL info");
6667                         continue;
6668                 }
6669
6670                 if (info->id == cb_id) {
6671                         g_cam_dev_state_changed_cb_list = g_list_remove(g_cam_dev_state_changed_cb_list, info);
6672
6673                         g_free(info);
6674                         info = NULL;
6675
6676                         if (!g_cam_dev_state_changed_cb_list) {
6677                                 /* no remained callback */
6678                                 if (g_cam_dev_state_changed_cb_conn) {
6679                                         /* unsubscribe signal */
6680                                         g_dbus_connection_signal_unsubscribe(g_cam_dev_state_changed_cb_conn, g_cam_dev_state_changed_cb_subscribe_id);
6681                                         g_cam_dev_state_changed_cb_subscribe_id = 0;
6682
6683                                         /* unref connection */
6684                                         g_object_unref(g_cam_dev_state_changed_cb_conn);
6685                                         g_cam_dev_state_changed_cb_conn = NULL;
6686                                 }
6687                         }
6688
6689                         LOGD("id %d callback removed", cb_id);
6690                         ret = CAMERA_ERROR_NONE;
6691
6692                         goto _DONE;
6693                 }
6694         } while (tmp_list);
6695
6696         LOGE("id %d callback not found", cb_id);
6697         ret = CAMERA_ERROR_INVALID_PARAMETER;
6698
6699 _DONE:
6700         g_mutex_unlock(&g_cam_dev_state_changed_cb_lock);
6701
6702         return ret;
6703 }