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