[libmm-camcorder] g_free and g_printf function fixes
[platform/core/multimedia/libmm-camcorder.git] / src / mm_camcorder_internal.c
1 /*
2  * libmm-camcorder
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Jeongmo Yang <jm80.yang@samsung.com>
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  */
21
22 /*=======================================================================================
23 |  INCLUDE FILES                                                                        |
24 ========================================================================================*/
25 #include <stdio.h>
26 #include <string.h>
27 #include <fcntl.h>
28 #include <gst/gst.h>
29 #include <gst/gstutils.h>
30 #include <gst/gstpad.h>
31 #include <sys/time.h>
32
33 #include <mm_error.h>
34 #include "mm_camcorder_internal.h"
35 #include <mm_types.h>
36
37 #include <gst/video/colorbalance.h>
38 #include <gst/video/cameracontrol.h>
39 #include <asm/types.h>
40
41 #include <system_info.h>
42 #include <mm_session.h>
43 #include <mm_session_private.h>
44
45 #include <murphy/common/glib-glue.h>
46
47 /*---------------------------------------------------------------------------------------
48 |    GLOBAL VARIABLE DEFINITIONS for internal                                           |
49 ---------------------------------------------------------------------------------------*/
50 struct sigaction mm_camcorder_int_old_action;
51 struct sigaction mm_camcorder_abrt_old_action;
52 struct sigaction mm_camcorder_segv_old_action;
53 struct sigaction mm_camcorder_term_old_action;
54 struct sigaction mm_camcorder_sys_old_action;
55
56 /*---------------------------------------------------------------------------------------
57 |    LOCAL VARIABLE DEFINITIONS for internal                                            |
58 ---------------------------------------------------------------------------------------*/
59 #define __MMCAMCORDER_CMD_ITERATE_MAX           3
60 #define __MMCAMCORDER_SET_GST_STATE_TIMEOUT     5
61 #define __MMCAMCORDER_FORCE_STOP_TRY_COUNT      30
62 #define __MMCAMCORDER_FORCE_STOP_WAIT_TIME      100000  /* us */
63 #define __MMCAMCORDER_SOUND_WAIT_TIMEOUT        3
64 #define __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN   64
65
66
67 /*---------------------------------------------------------------------------------------
68 |    LOCAL FUNCTION PROTOTYPES:                                                         |
69 ---------------------------------------------------------------------------------------*/
70 /* STATIC INTERNAL FUNCTION */
71 static gboolean __mmcamcorder_gstreamer_init(camera_conf * conf);
72
73 static gboolean __mmcamcorder_handle_gst_error(MMHandleType handle, GstMessage *message, GError *error);
74 static gint     __mmcamcorder_gst_handle_stream_error(MMHandleType handle, int code, GstMessage *message);
75 static gint     __mmcamcorder_gst_handle_resource_error(MMHandleType handle, int code, GstMessage *message);
76 static gint     __mmcamcorder_gst_handle_library_error(MMHandleType handle, int code, GstMessage *message);
77 static gint     __mmcamcorder_gst_handle_core_error(MMHandleType handle, int code, GstMessage *message);
78 static gint     __mmcamcorder_gst_handle_resource_warning(MMHandleType handle, GstMessage *message , GError *error);
79 static gboolean __mmcamcorder_handle_gst_warning(MMHandleType handle, GstMessage *message, GError *error);
80
81 #ifdef _MMCAMCORDER_USE_SET_ATTR_CB
82 static gboolean __mmcamcorder_set_attr_to_camsensor_cb(gpointer data);
83 #endif /* _MMCAMCORDER_USE_SET_ATTR_CB */
84
85 static void __mm_camcorder_signal_handler(int signo);
86 static void _mmcamcorder_constructor() __attribute__((constructor));
87
88 /*=======================================================================================
89 |  FUNCTION DEFINITIONS                                                                 |
90 =======================================================================================*/
91 /*---------------------------------------------------------------------------------------
92 |    GLOBAL FUNCTION DEFINITIONS:                                                       |
93 ---------------------------------------------------------------------------------------*/
94
95
96 static void __mm_camcorder_signal_handler(int signo)
97 {
98         pid_t my_pid = getpid();
99
100         _mmcam_dbg_warn("start - signo [%d], pid [%d]", signo, my_pid);
101
102         /* call old signal handler */
103         switch (signo) {
104         case SIGINT:
105                 sigaction(SIGINT, &mm_camcorder_int_old_action, NULL);
106                 raise(signo);
107                 break;
108         case SIGABRT:
109                 sigaction(SIGABRT, &mm_camcorder_abrt_old_action, NULL);
110                 raise(signo);
111                 break;
112         case SIGSEGV:
113                 sigaction(SIGSEGV, &mm_camcorder_segv_old_action, NULL);
114                 raise(signo);
115                 break;
116         case SIGTERM:
117                 sigaction(SIGTERM, &mm_camcorder_term_old_action, NULL);
118                 raise(signo);
119                 break;
120         case SIGSYS:
121                 sigaction(SIGSYS, &mm_camcorder_sys_old_action, NULL);
122                 raise(signo);
123                 break;
124         default:
125                 break;
126         }
127
128         _mmcam_dbg_warn("done");
129
130         return;
131 }
132
133
134 static void _mmcamcorder_constructor()
135 {
136         struct sigaction mm_camcorder_action;
137         mm_camcorder_action.sa_handler = __mm_camcorder_signal_handler;
138         mm_camcorder_action.sa_flags = SA_NOCLDSTOP;
139
140         _mmcam_dbg_warn("start");
141
142         sigemptyset(&mm_camcorder_action.sa_mask);
143
144         sigaction(SIGINT, &mm_camcorder_action, &mm_camcorder_int_old_action);
145         sigaction(SIGABRT, &mm_camcorder_action, &mm_camcorder_abrt_old_action);
146         sigaction(SIGSEGV, &mm_camcorder_action, &mm_camcorder_segv_old_action);
147         sigaction(SIGTERM, &mm_camcorder_action, &mm_camcorder_term_old_action);
148         sigaction(SIGSYS, &mm_camcorder_action, &mm_camcorder_sys_old_action);
149
150         _mmcam_dbg_warn("done");
151
152         return;
153 }
154
155 /* Internal command functions {*/
156 int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info)
157 {
158         int ret = MM_ERROR_NONE;
159         int sys_info_ret = SYSTEM_INFO_ERROR_NONE;
160         int UseConfCtrl = 0;
161         int rcmd_fmt_capture = MM_PIXEL_FORMAT_YUYV;
162         int rcmd_fmt_recording = MM_PIXEL_FORMAT_NV12;
163         int rcmd_dpy_rotation = MM_DISPLAY_ROTATION_270;
164         int play_capture_sound = TRUE;
165         int camera_device_count = MM_VIDEO_DEVICE_NUM;
166         int camera_default_flip = MM_FLIP_NONE;
167         int camera_facing_direction = MM_CAMCORDER_CAMERA_FACING_DIRECTION_REAR;
168         char *err_attr_name = NULL;
169         const char *ConfCtrlFile = NULL;
170         mmf_camcorder_t *hcamcorder = NULL;
171         type_element *EvasSurfaceElement = NULL;
172
173         _mmcam_dbg_log("Entered");
174
175         mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
176         mmf_return_val_if_fail(info, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
177
178         /* Create mmf_camcorder_t handle and initialize every variable */
179         hcamcorder = (mmf_camcorder_t *)malloc(sizeof(mmf_camcorder_t));
180         mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_LOW_MEMORY);
181         memset(hcamcorder, 0x00, sizeof(mmf_camcorder_t));
182
183         /* init values */
184         hcamcorder->type = 0;
185         hcamcorder->state = MM_CAMCORDER_STATE_NONE;
186         hcamcorder->sub_context = NULL;
187         hcamcorder->target_state = MM_CAMCORDER_STATE_NULL;
188         hcamcorder->capture_in_recording = FALSE;
189         hcamcorder->session_type = MM_SESSION_TYPE_MEDIA;
190
191         g_mutex_init(&(hcamcorder->mtsafe).lock);
192         g_cond_init(&(hcamcorder->mtsafe).cond);
193         g_mutex_init(&(hcamcorder->mtsafe).cmd_lock);
194         g_mutex_init(&(hcamcorder->mtsafe).asm_lock);
195         g_mutex_init(&(hcamcorder->mtsafe).state_lock);
196         g_mutex_init(&(hcamcorder->mtsafe).gst_state_lock);
197         g_mutex_init(&(hcamcorder->mtsafe).gst_encode_state_lock);
198         g_mutex_init(&(hcamcorder->mtsafe).message_cb_lock);
199         g_mutex_init(&(hcamcorder->mtsafe).vcapture_cb_lock);
200         g_mutex_init(&(hcamcorder->mtsafe).vstream_cb_lock);
201         g_mutex_init(&(hcamcorder->mtsafe).astream_cb_lock);
202
203         g_mutex_init(&hcamcorder->restart_preview_lock);
204
205         /* Sound mutex/cond init */
206         g_mutex_init(&hcamcorder->snd_info.open_mutex);
207         g_cond_init(&hcamcorder->snd_info.open_cond);
208         g_mutex_init(&hcamcorder->snd_info.play_mutex);
209         g_cond_init(&hcamcorder->snd_info.play_cond);
210
211         /* init for sound thread */
212         g_mutex_init(&hcamcorder->task_thread_lock);
213         g_cond_init(&hcamcorder->task_thread_cond);
214         hcamcorder->task_thread_state = _MMCAMCORDER_SOUND_STATE_NONE;
215
216         /* create task thread */
217         hcamcorder->task_thread = g_thread_try_new("MMCAM_TASK_THREAD",
218                 (GThreadFunc)_mmcamcorder_util_task_thread_func, (gpointer)hcamcorder, NULL);
219         if (hcamcorder->task_thread == NULL) {
220                 _mmcam_dbg_err("_mmcamcorder_create::failed to create task thread");
221                 ret = MM_ERROR_CAMCORDER_RESOURCE_CREATION;
222                 goto _ERR_DEFAULT_VALUE_INIT;
223         }
224
225         if (info->videodev_type < MM_VIDEO_DEVICE_NONE ||
226             info->videodev_type >= MM_VIDEO_DEVICE_NUM) {
227                 _mmcam_dbg_err("_mmcamcorder_create::video device type is out of range.");
228                 ret = MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
229                 goto _ERR_DEFAULT_VALUE_INIT;
230         }
231
232         /* set device type */
233         hcamcorder->device_type = info->videodev_type;
234         _mmcam_dbg_warn("Device Type : %d", hcamcorder->device_type);
235
236         if (MM_ERROR_NONE == _mm_session_util_read_information(-1, &hcamcorder->session_type, &hcamcorder->session_flags)) {
237                 _mmcam_dbg_log("use sound focus function.");
238                 hcamcorder->sound_focus_register = TRUE;
239
240                 if (MM_ERROR_NONE != mm_sound_focus_get_id(&hcamcorder->sound_focus_id)) {
241                         _mmcam_dbg_err("mm_sound_focus_get_uniq failed");
242                         ret = MM_ERROR_POLICY_BLOCKED;
243                         goto _ERR_DEFAULT_VALUE_INIT;
244                 }
245
246                 if (MM_ERROR_NONE != mm_sound_register_focus_for_session(hcamcorder->sound_focus_id,
247                                                                          getpid(),
248                                                                          "media",
249                                                                          _mmcamcorder_sound_focus_cb,
250                                                                          hcamcorder)) {
251                         _mmcam_dbg_err("mm_sound_register_focus failed");
252                         ret = MM_ERROR_POLICY_BLOCKED;
253                         goto _ERR_DEFAULT_VALUE_INIT;
254                 }
255
256                 _mmcam_dbg_log("mm_sound_register_focus done - id %d, session type %d, flags 0x%x",
257                                hcamcorder->sound_focus_id, hcamcorder->session_type, hcamcorder->session_flags);
258         } else {
259                 _mmcam_dbg_log("_mm_session_util_read_information failed. skip sound focus function.");
260                 hcamcorder->sound_focus_register = FALSE;
261         }
262
263         /* Get Camera Configure information from Camcorder INI file */
264         _mmcamcorder_conf_get_info((MMHandleType)hcamcorder, CONFIGURE_TYPE_MAIN, CONFIGURE_MAIN_FILE, &hcamcorder->conf_main);
265
266         if (!(hcamcorder->conf_main)) {
267                 _mmcam_dbg_err( "Failed to get configure(main) info." );
268
269                 ret = MM_ERROR_CAMCORDER_CREATE_CONFIGURE;
270                 goto _ERR_DEFAULT_VALUE_INIT;
271         }
272
273         hcamcorder->attributes = _mmcamcorder_alloc_attribute((MMHandleType)hcamcorder, info);
274         if (!(hcamcorder->attributes)) {
275                 _mmcam_dbg_err("_mmcamcorder_create::alloc attribute error.");
276
277                 ret = MM_ERROR_CAMCORDER_RESOURCE_CREATION;
278                 goto _ERR_DEFAULT_VALUE_INIT;
279         }
280
281         if (info->videodev_type != MM_VIDEO_DEVICE_NONE) {
282                 _mmcamcorder_conf_get_value_int((MMHandleType)hcamcorder, hcamcorder->conf_main,
283                                                 CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
284                                                 "UseConfCtrl", &UseConfCtrl);
285
286                 if (UseConfCtrl) {
287                         int resolution_width = 0;
288                         int resolution_height = 0;
289                         MMCamAttrsInfo fps_info;
290
291                         _mmcam_dbg_log( "Enable Configure Control system." );
292
293                         switch (info->videodev_type) {
294                         case MM_VIDEO_DEVICE_CAMERA0:
295                                 _mmcamcorder_conf_get_value_string((MMHandleType)hcamcorder, hcamcorder->conf_main,
296                                                                    CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
297                                                                    "ConfCtrlFile0", &ConfCtrlFile);
298                                 break;
299                         case MM_VIDEO_DEVICE_CAMERA1:
300                                 _mmcamcorder_conf_get_value_string((MMHandleType)hcamcorder, hcamcorder->conf_main,
301                                                                    CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
302                                                                    "ConfCtrlFile1", &ConfCtrlFile);
303                                 break;
304                         default:
305                                 _mmcam_dbg_err( "Not supported camera type." );
306                                 ret = MM_ERROR_CAMCORDER_NOT_SUPPORTED;
307                                 goto _ERR_DEFAULT_VALUE_INIT;
308                         }
309
310                         _mmcam_dbg_log("videodev_type : [%d], ConfCtrlPath : [%s]", info->videodev_type, ConfCtrlFile);
311
312                         _mmcamcorder_conf_get_info((MMHandleType)hcamcorder, CONFIGURE_TYPE_CTRL, ConfCtrlFile, &hcamcorder->conf_ctrl);
313 /*
314                         _mmcamcorder_conf_print_info(&hcamcorder->conf_main);
315                         _mmcamcorder_conf_print_info(&hcamcorder->conf_ctrl);
316 */
317                         if (!(hcamcorder->conf_ctrl)) {
318                                 _mmcam_dbg_err( "Failed to get configure(control) info." );
319                                 ret = MM_ERROR_CAMCORDER_CREATE_CONFIGURE;
320                                 goto _ERR_DEFAULT_VALUE_INIT;
321                         }
322
323                         ret = _mmcamcorder_init_convert_table((MMHandleType)hcamcorder);
324                         if (ret != MM_ERROR_NONE) {
325                                 _mmcam_dbg_warn("converting table initialize error!!");
326                                 ret = MM_ERROR_CAMCORDER_INTERNAL;
327                                 goto _ERR_DEFAULT_VALUE_INIT;
328                         }
329
330                         ret = _mmcamcorder_init_attr_from_configure((MMHandleType)hcamcorder, MM_CAMCONVERT_CATEGORY_ALL);
331                         if (ret != MM_ERROR_NONE) {
332                                 _mmcam_dbg_warn("converting table initialize error!!");
333                                 ret = MM_ERROR_CAMCORDER_INTERNAL;
334                                 goto _ERR_DEFAULT_VALUE_INIT;
335                         }
336
337                         /* Get device info, recommend preview fmt and display rotation from INI */
338                         _mmcamcorder_conf_get_value_int((MMHandleType)hcamcorder, hcamcorder->conf_ctrl,
339                                                         CONFIGURE_CATEGORY_CTRL_CAMERA,
340                                                         "RecommendPreviewFormatCapture",
341                                                         &rcmd_fmt_capture);
342
343                         _mmcamcorder_conf_get_value_int((MMHandleType)hcamcorder, hcamcorder->conf_ctrl,
344                                                         CONFIGURE_CATEGORY_CTRL_CAMERA,
345                                                         "RecommendPreviewFormatRecord",
346                                                         &rcmd_fmt_recording);
347
348                         _mmcamcorder_conf_get_value_int((MMHandleType)hcamcorder, hcamcorder->conf_ctrl,
349                                                         CONFIGURE_CATEGORY_CTRL_CAMERA,
350                                                         "RecommendDisplayRotation",
351                                                         &rcmd_dpy_rotation);
352
353                         _mmcamcorder_conf_get_value_int((MMHandleType)hcamcorder, hcamcorder->conf_main,
354                                                         CONFIGURE_CATEGORY_MAIN_CAPTURE,
355                                                         "PlayCaptureSound",
356                                                         &play_capture_sound);
357
358                         _mmcamcorder_conf_get_value_int((MMHandleType)hcamcorder, hcamcorder->conf_main,
359                                                         CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
360                                                         "DeviceCount",
361                                                         &camera_device_count);
362
363                         _mmcamcorder_conf_get_value_int((MMHandleType)hcamcorder, hcamcorder->conf_ctrl,
364                                                         CONFIGURE_CATEGORY_CTRL_CAMERA,
365                                                         "FacingDirection",
366                                                         &camera_facing_direction);
367
368                         _mmcamcorder_conf_get_value_int((MMHandleType)hcamcorder, hcamcorder->conf_ctrl,
369                                                         CONFIGURE_CATEGORY_CTRL_EFFECT,
370                                                         "BrightnessStepDenominator",
371                                                         &hcamcorder->brightness_step_denominator);
372
373                         _mmcamcorder_conf_get_value_int((MMHandleType)hcamcorder, hcamcorder->conf_ctrl,
374                                                         CONFIGURE_CATEGORY_CTRL_CAPTURE,
375                                                         "SupportZSL",
376                                                         &hcamcorder->support_zsl_capture);
377
378                         _mmcam_dbg_log("Recommend fmt[cap:%d,rec:%d], dpy rot %d, cap snd %d, dev cnt %d, cam facing dir %d, step denom %d, support zsl %d",
379                                        rcmd_fmt_capture, rcmd_fmt_recording, rcmd_dpy_rotation,
380                                        play_capture_sound, camera_device_count, camera_facing_direction,
381                                        hcamcorder->brightness_step_denominator, hcamcorder->support_zsl_capture);
382
383                         /* Get UseZeroCopyFormat value from INI */
384                         _mmcamcorder_conf_get_value_int((MMHandleType)hcamcorder, hcamcorder->conf_main,
385                                                         CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
386                                                         "UseZeroCopyFormat",
387                                                         &(hcamcorder->use_zero_copy_format));
388
389                         /* Get SupportMediaPacketPreviewCb value from INI */
390                         _mmcamcorder_conf_get_value_int((MMHandleType)hcamcorder, hcamcorder->conf_main,
391                                                         CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
392                                                         "SupportMediaPacketPreviewCb",
393                                                         &(hcamcorder->support_media_packet_preview_cb));
394
395                         ret = mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL,
396                                                     MMCAM_CAMERA_WIDTH, &resolution_width,
397                                                     MMCAM_CAMERA_HEIGHT, &resolution_height,
398                                                     NULL);
399
400                         mm_camcorder_get_fps_list_by_resolution((MMHandleType)hcamcorder, resolution_width, resolution_height, &fps_info);
401
402                         _mmcam_dbg_log("UseZeroCopyFormat : %d", hcamcorder->use_zero_copy_format);
403                         _mmcam_dbg_log("SupportMediaPacketPreviewCb : %d", hcamcorder->support_media_packet_preview_cb);
404                         _mmcam_dbg_log("res : %d X %d, Default FPS by resolution  : %d", resolution_width, resolution_height, fps_info.int_array.def);
405
406                         if (camera_facing_direction == 1) {
407                                 if (rcmd_dpy_rotation == MM_DISPLAY_ROTATION_270 || rcmd_dpy_rotation == MM_DISPLAY_ROTATION_90) {
408                                         camera_default_flip = MM_FLIP_VERTICAL;
409                                 } else {
410                                         camera_default_flip = MM_FLIP_HORIZONTAL;
411                                 }
412                                 _mmcam_dbg_log("camera_default_flip : [%d]",camera_default_flip);
413                         }
414
415                         mm_camcorder_set_attributes((MMHandleType)hcamcorder, &err_attr_name,
416                                                     MMCAM_CAMERA_DEVICE_COUNT, camera_device_count,
417                                                     MMCAM_CAMERA_FACING_DIRECTION, camera_facing_direction,
418                                                     MMCAM_RECOMMEND_PREVIEW_FORMAT_FOR_CAPTURE, rcmd_fmt_capture,
419                                                     MMCAM_RECOMMEND_PREVIEW_FORMAT_FOR_RECORDING, rcmd_fmt_recording,
420                                                     MMCAM_RECOMMEND_DISPLAY_ROTATION, rcmd_dpy_rotation,
421                                                     MMCAM_SUPPORT_ZSL_CAPTURE, hcamcorder->support_zsl_capture,
422                                                     MMCAM_SUPPORT_ZERO_COPY_FORMAT, hcamcorder->use_zero_copy_format,
423                                                     MMCAM_SUPPORT_MEDIA_PACKET_PREVIEW_CB, hcamcorder->support_media_packet_preview_cb,
424                                                     MMCAM_CAMERA_FPS, fps_info.int_array.def,
425                                                     MMCAM_DISPLAY_FLIP, camera_default_flip,
426                                                     "capture-sound-enable", play_capture_sound,
427                                                     NULL);
428                         if (err_attr_name) {
429                                 _mmcam_dbg_err("Set %s FAILED.", err_attr_name);
430                                 SAFE_FREE(err_attr_name);
431                                 ret = MM_ERROR_CAMCORDER_INTERNAL;
432                                 goto _ERR_DEFAULT_VALUE_INIT;
433                         }
434
435                         /* Get default value of brightness */
436                         mm_camcorder_get_attributes((MMHandleType)hcamcorder, &err_attr_name,
437                                                     MMCAM_FILTER_BRIGHTNESS, &hcamcorder->brightness_default,
438                                                     NULL);
439                         if (err_attr_name) {
440                                 _mmcam_dbg_err("Get brightness FAILED.");
441                                 SAFE_FREE(err_attr_name);
442                                 ret = MM_ERROR_CAMCORDER_INTERNAL;
443                                 goto _ERR_DEFAULT_VALUE_INIT;
444                         }
445                         _mmcam_dbg_log("Default brightness : %d", hcamcorder->brightness_default);
446                 } else {
447                         _mmcam_dbg_log( "Disable Configure Control system." );
448                         hcamcorder->conf_ctrl = NULL;
449                 }
450         } else {
451                 _mmcamcorder_conf_get_value_int((MMHandleType)hcamcorder, hcamcorder->conf_main,
452                                                     CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
453                                                     "DeviceCount",
454                                                     &camera_device_count);
455                 mm_camcorder_set_attributes((MMHandleType)hcamcorder, &err_attr_name,
456                                                     MMCAM_CAMERA_DEVICE_COUNT, camera_device_count,
457                                                     NULL);
458                 if (err_attr_name) {
459                         _mmcam_dbg_err("Set %s FAILED.", err_attr_name);
460                         SAFE_FREE(err_attr_name);
461                         ret = MM_ERROR_CAMCORDER_INTERNAL;
462                         goto _ERR_DEFAULT_VALUE_INIT;
463                 }
464
465                 ret = _mmcamcorder_init_attr_from_configure((MMHandleType)hcamcorder, MM_CAMCONVERT_CATEGORY_AUDIO);
466                 if (ret != MM_ERROR_NONE) {
467                         _mmcam_dbg_warn("init attribute from configure error : 0x%x", ret);
468                         ret = MM_ERROR_CAMCORDER_INTERNAL;
469                         goto _ERR_DEFAULT_VALUE_INIT;
470                 }
471         }
472
473         /* initialize resource manager */
474         ret = _mmcamcorder_resource_manager_init(&hcamcorder->resource_manager, (void *)hcamcorder);
475         if (ret != MM_ERROR_NONE) {
476                 _mmcam_dbg_err("failed to initialize resource manager");
477                 ret = MM_ERROR_CAMCORDER_INTERNAL;
478                 goto _ERR_DEFAULT_VALUE_INIT;
479         }
480
481         traceBegin(TTRACE_TAG_CAMERA, "MMCAMCORDER:CREATE:INIT_GSTREAMER");
482
483         ret = __mmcamcorder_gstreamer_init(hcamcorder->conf_main);
484
485         traceEnd(TTRACE_TAG_CAMERA);
486
487         if (!ret) {
488                 _mmcam_dbg_err( "Failed to initialize gstreamer!!" );
489                 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
490                 goto _ERR_DEFAULT_VALUE_INIT;
491         }
492
493         /* Make some attributes as read-only type */
494         _mmcamcorder_lock_readonly_attributes((MMHandleType)hcamcorder);
495
496         /* Disable attributes in each model */
497         _mmcamcorder_set_disabled_attributes((MMHandleType)hcamcorder);
498
499         /* Get videosink name for evas surface */
500         _mmcamcorder_conf_get_element((MMHandleType)hcamcorder, hcamcorder->conf_main,
501                                       CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
502                                       "VideosinkElementEvas",
503                                       &EvasSurfaceElement);
504         if (EvasSurfaceElement) {
505                 int attr_index = 0;
506                 const char *evassink_name = NULL;
507                 mmf_attribute_t *item_evassink_name = NULL;
508                 mmf_attrs_t *attrs = (mmf_attrs_t *)MMF_CAMCORDER_ATTRS(hcamcorder);
509
510                 _mmcamcorder_conf_get_value_element_name(EvasSurfaceElement, &evassink_name);
511                 mm_attrs_get_index((MMHandleType)attrs, MMCAM_DISPLAY_EVAS_SURFACE_SINK, &attr_index);
512                 item_evassink_name = &attrs->items[attr_index];
513                 mmf_attribute_set_string(item_evassink_name, evassink_name, strlen(evassink_name));
514                 mmf_attribute_commit(item_evassink_name);
515
516                 _mmcam_dbg_log("Evassink name : %s", evassink_name);
517         }
518
519         /* get shutter sound policy */
520         vconf_get_int(VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY, &hcamcorder->shutter_sound_policy);
521         _mmcam_dbg_log("current shutter sound policy : %d", hcamcorder->shutter_sound_policy);
522
523         /* get model name */
524         sys_info_ret = system_info_get_platform_string("http://tizen.org/system/model_name", &hcamcorder->model_name);
525         if (hcamcorder->model_name) {
526                 _mmcam_dbg_log("model name [%s], sys_info_ret 0x%x", hcamcorder->model_name, sys_info_ret);
527         } else {
528                 _mmcam_dbg_warn("failed get model name, sys_info_ret 0x%x", sys_info_ret);
529         }
530
531         /* get software version */
532         sys_info_ret = system_info_get_platform_string("http://tizen.org/system/build.string", &hcamcorder->software_version);
533         if (hcamcorder->software_version) {
534                 _mmcam_dbg_log("software version [%s], sys_info_ret 0x%d", hcamcorder->software_version, sys_info_ret);
535         } else {
536                 _mmcam_dbg_warn("failed get software version, sys_info_ret 0x%x", sys_info_ret);
537         }
538
539         /* Set initial state */
540         _mmcamcorder_set_state((MMHandleType)hcamcorder, MM_CAMCORDER_STATE_NULL);
541
542         _mmcam_dbg_log("created handle %p", hcamcorder);
543
544         *handle = (MMHandleType)hcamcorder;
545
546         return MM_ERROR_NONE;
547
548 _ERR_DEFAULT_VALUE_INIT:
549         /* unregister sound focus */
550         if (hcamcorder->sound_focus_register && hcamcorder->sound_focus_id > 0) {
551                 if (MM_ERROR_NONE != mm_sound_unregister_focus(hcamcorder->sound_focus_id)) {
552                         _mmcam_dbg_err("mm_sound_unregister_focus[id %d] failed", hcamcorder->sound_focus_id);
553                 } else {
554                         _mmcam_dbg_log("mm_sound_unregister_focus[id %d] done", hcamcorder->sound_focus_id);
555                 }
556         } else {
557                 _mmcam_dbg_warn("no need to unregister sound focus[%d, id %d]",
558                                hcamcorder->sound_focus_register, hcamcorder->sound_focus_id);
559         }
560
561         /* Remove attributes */
562         if (hcamcorder->attributes) {
563                 _mmcamcorder_dealloc_attribute((MMHandleType)hcamcorder, hcamcorder->attributes);
564                 hcamcorder->attributes = 0;
565         }
566
567         /* Release lock, cond */
568         g_mutex_clear(&(hcamcorder->mtsafe).lock);
569         g_cond_clear(&(hcamcorder->mtsafe).cond);
570         g_mutex_clear(&(hcamcorder->mtsafe).cmd_lock);
571         g_mutex_clear(&(hcamcorder->mtsafe).asm_lock);
572         g_mutex_clear(&(hcamcorder->mtsafe).state_lock);
573         g_mutex_clear(&(hcamcorder->mtsafe).gst_state_lock);
574         g_mutex_clear(&(hcamcorder->mtsafe).gst_encode_state_lock);
575         g_mutex_clear(&(hcamcorder->mtsafe).message_cb_lock);
576         g_mutex_clear(&(hcamcorder->mtsafe).vcapture_cb_lock);
577         g_mutex_clear(&(hcamcorder->mtsafe).vstream_cb_lock);
578         g_mutex_clear(&(hcamcorder->mtsafe).astream_cb_lock);
579
580         g_mutex_clear(&hcamcorder->snd_info.open_mutex);
581         g_cond_clear(&hcamcorder->snd_info.open_cond);
582         g_mutex_clear(&hcamcorder->restart_preview_lock);
583
584         if (hcamcorder->conf_ctrl) {
585                 _mmcamcorder_conf_release_info(handle, &hcamcorder->conf_ctrl);
586         }
587
588         if (hcamcorder->conf_main) {
589                 _mmcamcorder_conf_release_info(handle, &hcamcorder->conf_main);
590         }
591
592         if (hcamcorder->model_name) {
593                 free(hcamcorder->model_name);
594                 hcamcorder->model_name = NULL;
595         }
596
597         if (hcamcorder->software_version) {
598                 free(hcamcorder->software_version);
599                 hcamcorder->software_version = NULL;
600         }
601
602         if (hcamcorder->task_thread) {
603                 g_mutex_lock(&hcamcorder->task_thread_lock);
604                 _mmcam_dbg_log("send signal for task thread exit");
605                 hcamcorder->task_thread_state = _MMCAMCORDER_TASK_THREAD_STATE_EXIT;
606                 g_cond_signal(&hcamcorder->task_thread_cond);
607                 g_mutex_unlock(&hcamcorder->task_thread_lock);
608                 g_thread_join(hcamcorder->task_thread);
609                 hcamcorder->task_thread = NULL;
610         }
611         g_mutex_clear(&hcamcorder->task_thread_lock);
612         g_cond_clear(&hcamcorder->task_thread_cond);
613
614         /* Release handle */
615         memset(hcamcorder, 0x00, sizeof(mmf_camcorder_t));
616         free(hcamcorder);
617
618         return ret;
619 }
620
621
622 int _mmcamcorder_destroy(MMHandleType handle)
623 {
624         int ret = MM_ERROR_NONE;
625         int state = MM_CAMCORDER_STATE_NONE;
626         int state_FROM = MM_CAMCORDER_STATE_NULL;
627
628         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
629
630         _mmcam_dbg_log("");
631
632         if (!hcamcorder) {
633                 _mmcam_dbg_err("Not initialized");
634                 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
635                 goto _ERR_CAMCORDER_CMD_PRECON;
636         }
637
638         if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
639                 _mmcam_dbg_err("Another command is running.");
640                 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
641                 goto _ERR_CAMCORDER_CMD_PRECON;
642         }
643
644         state = _mmcamcorder_get_state(handle);
645         if (state != state_FROM) {
646                 _mmcam_dbg_err("Wrong state(%d)", state);
647                 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
648                 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
649         }
650
651         /* set exit state for sound thread */
652         g_mutex_lock(&hcamcorder->task_thread_lock);
653         _mmcam_dbg_log("send signal for task thread exit");
654         hcamcorder->task_thread_state = _MMCAMCORDER_TASK_THREAD_STATE_EXIT;
655         g_cond_signal(&hcamcorder->task_thread_cond);
656         g_mutex_unlock(&hcamcorder->task_thread_lock);
657
658         /* wait for completion of sound play */
659         _mmcamcorder_sound_solo_play_wait(handle);
660
661         /* Release SubContext and pipeline */
662         if (hcamcorder->sub_context) {
663                 if (hcamcorder->sub_context->element) {
664                         _mmcamcorder_destroy_pipeline(handle, hcamcorder->type);
665                 }
666
667                 _mmcamcorder_dealloc_subcontext(hcamcorder->sub_context);
668                 hcamcorder->sub_context = NULL;
669         }
670
671         /* de-initialize resource manager */
672         ret = _mmcamcorder_resource_manager_deinit(&hcamcorder->resource_manager);
673         if (ret != MM_ERROR_NONE) {
674                 _mmcam_dbg_err("failed to de-initialize resource manager 0x%x", ret);
675         }
676
677         /* Remove idle function which is not called yet */
678         if (hcamcorder->setting_event_id) {
679                 _mmcam_dbg_log("Remove remaining idle function");
680                 g_source_remove(hcamcorder->setting_event_id);
681                 hcamcorder->setting_event_id = 0;
682         }
683
684         /* Remove attributes */
685         if (hcamcorder->attributes) {
686                 _mmcamcorder_dealloc_attribute(handle, hcamcorder->attributes);
687                 hcamcorder->attributes = 0;
688         }
689
690         /* Remove exif info */
691         if (hcamcorder->exif_info) {
692                 mm_exif_destory_exif_info(hcamcorder->exif_info);
693                 hcamcorder->exif_info=NULL;
694
695         }
696
697         /* Release configure info */
698         if (hcamcorder->conf_ctrl) {
699                 _mmcamcorder_conf_release_info(handle, &hcamcorder->conf_ctrl);
700         }
701         if (hcamcorder->conf_main) {
702                 _mmcamcorder_conf_release_info(handle, &hcamcorder->conf_main);
703         }
704
705         /* Remove messages which are not called yet */
706         _mmcamcorder_remove_message_all(handle);
707
708         /* unregister sound focus */
709         if (hcamcorder->sound_focus_register && hcamcorder->sound_focus_id > 0) {
710                 if (mm_sound_unregister_focus(hcamcorder->sound_focus_id) != MM_ERROR_NONE) {
711                         _mmcam_dbg_err("mm_sound_unregister_focus[id %d] failed",
712                                        hcamcorder->sound_focus_id);
713                 } else {
714                         _mmcam_dbg_log("mm_sound_unregister_focus[id %d] done",
715                                        hcamcorder->sound_focus_id);
716                 }
717         } else {
718                 _mmcam_dbg_log("no need to unregister sound focus.[%d, id %d]",
719                                hcamcorder->sound_focus_register, hcamcorder->sound_focus_id);
720         }
721
722         /* release model_name */
723         if (hcamcorder->model_name) {
724                 free(hcamcorder->model_name);
725                 hcamcorder->model_name = NULL;
726         }
727
728         if (hcamcorder->software_version) {
729                 free(hcamcorder->software_version);
730                 hcamcorder->software_version = NULL;
731         }
732
733         /* join task thread */
734         _mmcam_dbg_log("task thread join");
735         g_thread_join(hcamcorder->task_thread);
736         hcamcorder->task_thread = NULL;
737
738         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
739
740         /* Release lock, cond */
741         g_mutex_clear(&(hcamcorder->mtsafe).lock);
742         g_cond_clear(&(hcamcorder->mtsafe).cond);
743         g_mutex_clear(&(hcamcorder->mtsafe).cmd_lock);
744         g_mutex_clear(&(hcamcorder->mtsafe).asm_lock);
745         g_mutex_clear(&(hcamcorder->mtsafe).state_lock);
746         g_mutex_clear(&(hcamcorder->mtsafe).gst_state_lock);
747         g_mutex_clear(&(hcamcorder->mtsafe).gst_encode_state_lock);
748         g_mutex_clear(&(hcamcorder->mtsafe).message_cb_lock);
749         g_mutex_clear(&(hcamcorder->mtsafe).vcapture_cb_lock);
750         g_mutex_clear(&(hcamcorder->mtsafe).vstream_cb_lock);
751         g_mutex_clear(&(hcamcorder->mtsafe).astream_cb_lock);
752
753         g_mutex_clear(&hcamcorder->snd_info.open_mutex);
754         g_cond_clear(&hcamcorder->snd_info.open_cond);
755         g_mutex_clear(&hcamcorder->restart_preview_lock);
756         g_mutex_clear(&hcamcorder->task_thread_lock);
757         g_cond_clear(&hcamcorder->task_thread_cond);
758
759         /* Release handle */
760         memset(hcamcorder, 0x00, sizeof(mmf_camcorder_t));
761         free(hcamcorder);
762
763         return MM_ERROR_NONE;
764
765 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
766         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
767
768 _ERR_CAMCORDER_CMD_PRECON:
769         if (hcamcorder) {
770                 _mmcam_dbg_err("Destroy fail (type %d, state %d)", hcamcorder->type, state);
771         }
772
773         _mmcam_dbg_err("Destroy fail (ret %x)", ret);
774
775         return ret;
776 }
777
778
779 int _mmcamcorder_realize(MMHandleType handle)
780 {
781         int ret = MM_ERROR_NONE;
782         int ret_sound = MM_ERROR_NONE;
783         int ret_resource = MM_ERROR_NONE;
784         int state = MM_CAMCORDER_STATE_NONE;
785         int state_FROM = MM_CAMCORDER_STATE_NULL;
786         int state_TO = MM_CAMCORDER_STATE_READY;
787         int display_surface_type = MM_DISPLAY_SURFACE_OVERLAY;
788         int pid_for_sound_focus = 0;
789         double motion_rate = _MMCAMCORDER_DEFAULT_RECORDING_MOTION_RATE;
790         char *videosink_element_type = NULL;
791         const char *videosink_name = NULL;
792         char *socket_path = NULL;
793         int socket_path_len;
794
795         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
796
797         /*_mmcam_dbg_log("");*/
798
799         if (!hcamcorder) {
800                 _mmcam_dbg_err("Not initialized");
801                 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
802                 return ret;
803         }
804
805         if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
806                 _mmcam_dbg_err("Another command is running.");
807                 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
808                 goto _ERR_CAMCORDER_CMD_PRECON;
809         }
810
811         state = _mmcamcorder_get_state(handle);
812         if (state != state_FROM) {
813                 _mmcam_dbg_err("Wrong state(%d)", state);
814                 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
815                 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
816         }
817
818         mm_camcorder_get_attributes(handle, NULL,
819                                     MMCAM_MODE, &hcamcorder->type,
820                                     NULL);
821
822         /* Get profile mode */
823         _mmcam_dbg_log("Profile mode [%d]", hcamcorder->type);
824
825         mm_camcorder_get_attributes(handle, NULL,
826                                     MMCAM_DISPLAY_SURFACE, &display_surface_type,
827                                     MMCAM_CAMERA_RECORDING_MOTION_RATE, &motion_rate,
828                                     MMCAM_DISPLAY_SOCKET_PATH, &socket_path, &socket_path_len,
829                                     NULL);
830
831         /* sound focus */
832         if (hcamcorder->sound_focus_register) {
833                 mm_camcorder_get_attributes(handle, NULL,
834                                             MMCAM_PID_FOR_SOUND_FOCUS, &pid_for_sound_focus,
835                                             NULL);
836
837                 if (pid_for_sound_focus == 0) {
838                         pid_for_sound_focus = getpid();
839                         _mmcam_dbg_warn("pid for sound focus is not set, use my pid %d", pid_for_sound_focus);
840                 }
841
842                 /* acquire sound focus or set sound focus watch callback */
843                 hcamcorder->acquired_focus = 0;
844                 hcamcorder->sound_focus_watch_id = 0;
845
846                 /* check session flags */
847                 if (hcamcorder->session_flags & MM_SESSION_OPTION_PAUSE_OTHERS) {
848                         /* acquire sound focus */
849                         _mmcam_dbg_log("PAUSE_OTHERS - acquire sound focus");
850
851                         ret_sound = mm_sound_acquire_focus(0, FOCUS_FOR_BOTH, NULL);
852                         if (ret_sound != MM_ERROR_NONE) {
853                                 _mmcam_dbg_err("mm_sound_acquire_focus failed [0x%x]", ret_sound);
854
855                                 /* TODO: MM_ERROR_POLICY_BLOCKED_BY_CALL, MM_ERROR_POLICY_BLOCKED_BY_ALARM*/
856                                 ret = MM_ERROR_POLICY_BLOCKED;
857                                 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
858                         }
859
860                         hcamcorder->acquired_focus = FOCUS_FOR_BOTH;
861                 } else if (hcamcorder->session_flags & MM_SESSION_OPTION_UNINTERRUPTIBLE) {
862                         /* do nothing */
863                         _mmcam_dbg_log("SESSION_UNINTERRUPTIBLE - do nothing for sound focus");
864                 } else {
865                         /* set sound focus watch callback */
866                         _mmcam_dbg_log("ETC - set sound focus watch callback - pid %d", pid_for_sound_focus);
867
868                         ret_sound = mm_sound_set_focus_watch_callback_for_session(pid_for_sound_focus,
869                                                                                   FOCUS_FOR_BOTH,
870                                                                                   (mm_sound_focus_changed_watch_cb)_mmcamcorder_sound_focus_watch_cb,
871                                                                                   hcamcorder,
872                                                                                   &hcamcorder->sound_focus_watch_id);
873                         if (ret_sound != MM_ERROR_NONE) {
874                                 _mmcam_dbg_err("mm_sound_set_focus_watch_callback failed [0x%x]", ret_sound);
875
876                                 /* TODO: MM_ERROR_POLICY_BLOCKED_BY_CALL, MM_ERROR_POLICY_BLOCKED_BY_ALARM*/
877                                 ret = MM_ERROR_POLICY_BLOCKED;
878                                 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
879                         }
880
881                         _mmcam_dbg_log("sound focus watch cb id %d", hcamcorder->sound_focus_watch_id);
882                 }
883         } else {
884                 _mmcam_dbg_log("no need to register sound focus");
885         }
886
887
888         /* alloc sub context */
889         hcamcorder->sub_context = _mmcamcorder_alloc_subcontext(hcamcorder->type);
890         if(!hcamcorder->sub_context) {
891                 ret = MM_ERROR_CAMCORDER_RESOURCE_CREATION;
892                 goto _ERR_CAMCORDER_CMD;
893         }
894
895         /* Set basic configure information */
896         if (motion_rate != _MMCAMCORDER_DEFAULT_RECORDING_MOTION_RATE) {
897                 hcamcorder->sub_context->is_modified_rate = TRUE;
898         }
899
900         _mmcamcorder_conf_get_value_int(handle, hcamcorder->conf_main,
901                                         CONFIGURE_CATEGORY_MAIN_CAPTURE,
902                                         "UseEncodebin",
903                                         &(hcamcorder->sub_context->bencbin_capture));
904         _mmcam_dbg_warn("UseEncodebin [%d]", hcamcorder->sub_context->bencbin_capture);
905
906         if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
907                 /* get dual stream support info */
908                 _mmcamcorder_conf_get_value_int(handle, hcamcorder->conf_main,
909                                                 CONFIGURE_CATEGORY_MAIN_RECORD,
910                                                 "SupportDualStream",
911                                                 &(hcamcorder->sub_context->info_video->support_dual_stream));
912                 _mmcam_dbg_warn("SupportDualStream [%d]", hcamcorder->sub_context->info_video->support_dual_stream);
913         }
914
915         if (socket_path == NULL) {
916                 _mmcam_dbg_warn("Socket Path is not properly set, -> to NullSink.");
917                 videosink_element_type = strdup("VideosinkElementNull");
918         } else {
919                 switch (display_surface_type) {
920                 case MM_DISPLAY_SURFACE_OVERLAY:
921                         videosink_element_type = strdup("VideosinkElementOverlay");
922                         break;
923                 case MM_DISPLAY_SURFACE_EVAS:
924                         videosink_element_type = strdup("VideosinkElementEvas");
925                         break;
926                 case MM_DISPLAY_SURFACE_GL:
927                         videosink_element_type = strdup("VideosinkElementGL");
928                         break;
929                 case MM_DISPLAY_SURFACE_NULL:
930                         videosink_element_type = strdup("VideosinkElementNull");
931                         break;
932                 case MM_DISPLAY_SURFACE_REMOTE:
933                         videosink_element_type = strdup("VideosinkElementRemote");
934                         break;
935                 default:
936                         videosink_element_type = strdup("VideosinkElementOverlay");
937                         break;
938                 }
939         }
940
941         /* check string of videosink element */
942         if (videosink_element_type) {
943                 _mmcamcorder_conf_get_element(handle, hcamcorder->conf_main,
944                                               CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
945                                               videosink_element_type,
946                                               &hcamcorder->sub_context->VideosinkElement);
947                 free(videosink_element_type);
948                 videosink_element_type = NULL;
949         } else {
950                 _mmcam_dbg_warn("strdup failed(display_surface_type %d). Use default X type",
951                                 display_surface_type);
952
953                 _mmcamcorder_conf_get_element(handle, hcamcorder->conf_main,
954                                               CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
955                                               _MMCAMCORDER_DEFAULT_VIDEOSINK_TYPE,
956                                               &hcamcorder->sub_context->VideosinkElement);
957         }
958
959         _mmcamcorder_conf_get_value_element_name(hcamcorder->sub_context->VideosinkElement, &videosink_name);
960         _mmcam_dbg_log("Videosink name : %s", videosink_name);
961
962         /* get videoconvert element */
963         _mmcamcorder_conf_get_element(handle, hcamcorder->conf_main,
964                                       CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
965                                       "VideoconvertElement",
966                                       &hcamcorder->sub_context->VideoconvertElement);
967
968         _mmcamcorder_conf_get_value_int(handle, hcamcorder->conf_ctrl,
969                                         CONFIGURE_CATEGORY_CTRL_CAPTURE,
970                                         "SensorEncodedCapture",
971                                         &(hcamcorder->sub_context->SensorEncodedCapture));
972         _mmcam_dbg_log("Support sensor encoded capture : %d", hcamcorder->sub_context->SensorEncodedCapture);
973
974         if (hcamcorder->type == MM_CAMCORDER_MODE_VIDEO_CAPTURE) {
975                 /* prepare resource manager for camera */
976                 if((_mmcamcorder_resource_manager_prepare(&hcamcorder->resource_manager, RESOURCE_TYPE_CAMERA))) {
977                         _mmcam_dbg_err("could not prepare for camera resource");
978                         ret = MM_ERROR_CAMCORDER_INTERNAL;
979                         goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
980                 }
981
982                 /* prepare resource manager for "video_overlay only if display surface is X" */
983                 mm_camcorder_get_attributes(handle, NULL,
984                                             MMCAM_DISPLAY_SURFACE, &display_surface_type,
985                                             NULL);
986                 if(display_surface_type == MM_DISPLAY_SURFACE_OVERLAY) {
987                         if((_mmcamcorder_resource_manager_prepare(&hcamcorder->resource_manager, RESOURCE_TYPE_VIDEO_OVERLAY))) {
988                                 _mmcam_dbg_err("could not prepare for video overlay resource");
989                                 ret = MM_ERROR_CAMCORDER_INTERNAL;
990                                 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
991                         }
992                 }
993                 /* acquire resources */
994                 if((hcamcorder->resource_manager.rset && _mmcamcorder_resource_manager_acquire(&hcamcorder->resource_manager))) {
995                         _mmcam_dbg_err("could not acquire resources");
996                         _mmcamcorder_resource_manager_unprepare(&hcamcorder->resource_manager);
997                         goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
998                 }
999         }
1000
1001         /* create pipeline */
1002         traceBegin(TTRACE_TAG_CAMERA, "MMCAMCORDER:REALIZE:CREATE_PIPELINE");
1003
1004         ret = _mmcamcorder_create_pipeline(handle, hcamcorder->type);
1005
1006         traceEnd(TTRACE_TAG_CAMERA);
1007
1008         if (ret != MM_ERROR_NONE) {
1009                 /* check internal error of gstreamer */
1010                 if (hcamcorder->error_code != MM_ERROR_NONE) {
1011                         ret = hcamcorder->error_code;
1012                         _mmcam_dbg_log("gstreamer error is occurred. return it %x", ret);
1013                 }
1014
1015                 /* release sub context */
1016                 _mmcamcorder_dealloc_subcontext(hcamcorder->sub_context);
1017                 hcamcorder->sub_context = NULL;
1018                 goto _ERR_CAMCORDER_CMD;
1019         }
1020
1021         /* set command function */
1022         ret = _mmcamcorder_set_functions(handle, hcamcorder->type);
1023         if (ret != MM_ERROR_NONE) {
1024                 _mmcamcorder_destroy_pipeline(handle, hcamcorder->type);
1025                 _mmcamcorder_dealloc_subcontext(hcamcorder->sub_context);
1026                 hcamcorder->sub_context = NULL;
1027                 goto _ERR_CAMCORDER_CMD;
1028         }
1029
1030         _mmcamcorder_set_state(handle, state_TO);
1031
1032         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1033
1034         return MM_ERROR_NONE;
1035
1036 _ERR_CAMCORDER_CMD:
1037         /* release hw resources */
1038         if (hcamcorder->type == MM_CAMCORDER_MODE_VIDEO_CAPTURE) {
1039                 ret_resource = _mmcamcorder_resource_manager_release(&hcamcorder->resource_manager);
1040                 if (ret_resource == MM_ERROR_RESOURCE_INVALID_STATE) {
1041                         _mmcam_dbg_warn("it could be in the middle of resource callback or there's no acquired resource");
1042                 }
1043                 else if (ret_resource != MM_ERROR_NONE) {
1044                         _mmcam_dbg_err("failed to release resource, ret_resource(0x%x)", ret_resource);
1045                 }
1046                 ret_resource = _mmcamcorder_resource_manager_unprepare(&hcamcorder->resource_manager);
1047                 if (ret_resource != MM_ERROR_NONE) {
1048                         _mmcam_dbg_err("failed to unprepare resource manager, ret_resource(0x%x)", ret_resource);
1049                 }
1050         }
1051
1052 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1053         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1054
1055         if (hcamcorder->sound_focus_register) {
1056                 if (hcamcorder->sound_focus_watch_id > 0) {
1057                         if (mm_sound_unset_focus_watch_callback(hcamcorder->sound_focus_watch_id) != MM_ERROR_NONE) {
1058                                 _mmcam_dbg_warn("mm_sound_unset_focus_watch_callback[id %d] failed",
1059                                                 hcamcorder->sound_focus_watch_id);
1060                         } else {
1061                                 _mmcam_dbg_warn("mm_sound_unset_focus_watch_callback[id %d] done",
1062                                                 hcamcorder->sound_focus_watch_id);
1063                         }
1064                 }
1065
1066                 if (hcamcorder->acquired_focus > 0) {
1067                                 if (mm_sound_release_focus(0, hcamcorder->acquired_focus, NULL) != MM_ERROR_NONE) {
1068                                         _mmcam_dbg_err("mm_sound_release_focus[focus %d] failed",
1069                                                        hcamcorder->acquired_focus);
1070                                 } else {
1071                                         _mmcam_dbg_err("mm_sound_release_focus[focus %d] done",
1072                                                        hcamcorder->acquired_focus);
1073                                 }
1074                 }
1075         }
1076
1077 _ERR_CAMCORDER_CMD_PRECON:
1078         _mmcam_dbg_err("Realize fail (type %d, state %d, ret %x)",
1079                        hcamcorder->type, state, ret);
1080
1081         return ret;
1082 }
1083
1084
1085 int _mmcamcorder_unrealize(MMHandleType handle)
1086 {
1087         int ret = MM_ERROR_NONE;
1088         int state = MM_CAMCORDER_STATE_NONE;
1089         int state_FROM = MM_CAMCORDER_STATE_READY;
1090         int state_TO = MM_CAMCORDER_STATE_NULL;
1091
1092         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1093
1094         _mmcam_dbg_log("");
1095
1096         if (!hcamcorder) {
1097                 _mmcam_dbg_err("Not initialized");
1098                 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1099                 return ret;
1100         }
1101
1102         if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1103                 _mmcam_dbg_err("Another command is running.");
1104                 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1105                 goto _ERR_CAMCORDER_CMD_PRECON;
1106         }
1107
1108         state = _mmcamcorder_get_state(handle);
1109         if (state != state_FROM) {
1110                 _mmcam_dbg_err("Wrong state(%d)", state);
1111                 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1112                 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1113         }
1114
1115         /* Release SubContext */
1116         if (hcamcorder->sub_context) {
1117                 /* destroy pipeline */
1118                 _mmcamcorder_destroy_pipeline(handle, hcamcorder->type);
1119                 /* Deallocate SubContext */
1120                 _mmcamcorder_dealloc_subcontext(hcamcorder->sub_context);
1121                 hcamcorder->sub_context = NULL;
1122         }
1123
1124         if (hcamcorder->type == MM_CAMCORDER_MODE_VIDEO_CAPTURE) {
1125                 ret = _mmcamcorder_resource_manager_release(&hcamcorder->resource_manager);
1126                 if (ret == MM_ERROR_RESOURCE_INVALID_STATE) {
1127                         _mmcam_dbg_warn("it could be in the middle of resource callback or there's no acquired resource");
1128                         ret = MM_ERROR_NONE;
1129                 } else if (ret != MM_ERROR_NONE) {
1130                         _mmcam_dbg_err("failed to release resource, ret(0x%x)", ret);
1131                         ret = MM_ERROR_CAMCORDER_INTERNAL;
1132                         goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1133                 }
1134                 ret = _mmcamcorder_resource_manager_unprepare(&hcamcorder->resource_manager);
1135                 if (ret != MM_ERROR_NONE) {
1136                         _mmcam_dbg_err("failed to unprepare resource manager, ret(0x%x)", ret);
1137                 }
1138         }
1139
1140         /* Deinitialize main context member */
1141         hcamcorder->command = NULL;
1142
1143         _mmcam_dbg_log("focus register %d, session flag 0x%x, state_change_by_system %d",
1144                        hcamcorder->sound_focus_register, hcamcorder->session_flags, hcamcorder->state_change_by_system);
1145
1146         /* release sound focus or unset sound focus watch callback */
1147         if (hcamcorder->sound_focus_register) {
1148                 int ret_sound = MM_ERROR_NONE;
1149
1150                 _mmcam_dbg_log("state_change_by_system %d, session flag 0x%x, acquired_focus %d, sound_focus_id %d, sound_focus_watch_id %d",
1151                                hcamcorder->state_change_by_system, hcamcorder->session_flags, hcamcorder->acquired_focus,
1152                                hcamcorder->sound_focus_id, hcamcorder->sound_focus_watch_id);
1153
1154                 if (hcamcorder->state_change_by_system != _MMCAMCORDER_STATE_CHANGE_BY_ASM &&
1155                     hcamcorder->sound_focus_watch_id > 0) {
1156                         ret_sound = mm_sound_unset_focus_watch_callback(hcamcorder->sound_focus_watch_id);
1157                         if (ret_sound != MM_ERROR_NONE) {
1158                                 _mmcam_dbg_warn("mm_sound_unset_focus_watch_callback failed [0x%x]",
1159                                                 ret_sound);
1160                         } else {
1161                                 _mmcam_dbg_warn("mm_sound_unset_focus_watch_callback done");
1162                         }
1163                 } else {
1164                         _mmcam_dbg_warn("no need to unset watch callback.[state_change_by_system %d, sound_focus_watch_id %d]",
1165                                         hcamcorder->state_change_by_system, hcamcorder->sound_focus_watch_id);
1166                 }
1167
1168                 if (hcamcorder->acquired_focus > 0) {
1169                         ret_sound = mm_sound_release_focus(0, hcamcorder->acquired_focus, NULL);
1170                         if (ret_sound != MM_ERROR_NONE) {
1171                                 _mmcam_dbg_warn("mm_sound_release_focus failed [0x%x]",
1172                                                 ret_sound);
1173                         } else {
1174                                 _mmcam_dbg_log("mm_sound_release_focus done");
1175                         }
1176                 } else {
1177                         _mmcam_dbg_warn("no need to release focus - current acquired focus %d",
1178                                         hcamcorder->acquired_focus);
1179                 }
1180         }
1181
1182         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1183
1184         _mmcamcorder_set_state(handle, state_TO);
1185
1186         return MM_ERROR_NONE;
1187
1188 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1189         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1190
1191 _ERR_CAMCORDER_CMD_PRECON:
1192         /* send message */
1193         _mmcam_dbg_err("Unrealize fail (type %d, state %d, ret %x)",
1194                        hcamcorder->type, state, ret);
1195
1196         return ret;
1197 }
1198
1199 int _mmcamcorder_start(MMHandleType handle)
1200 {
1201         int ret = MM_ERROR_NONE;
1202         int state = MM_CAMCORDER_STATE_NONE;
1203         int state_FROM = MM_CAMCORDER_STATE_READY;
1204         int state_TO =MM_CAMCORDER_STATE_PREPARE;
1205
1206         _MMCamcorderSubContext *sc = NULL;
1207         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1208
1209         _mmcam_dbg_log("");
1210
1211         if (!hcamcorder) {
1212                 _mmcam_dbg_err("Not initialized");
1213                 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1214                 return ret;
1215         }
1216
1217         sc = MMF_CAMCORDER_SUBCONTEXT(handle);
1218         mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1219
1220         if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1221                 _mmcam_dbg_err("Another command is running.");
1222                 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1223                 goto _ERR_CAMCORDER_CMD_PRECON;
1224         }
1225
1226         state = _mmcamcorder_get_state(handle);
1227         if (state != state_FROM) {
1228                 _mmcam_dbg_err("Wrong state(%d)", state);
1229                 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1230                 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1231         }
1232
1233         /* initialize error code */
1234         hcamcorder->error_code = MM_ERROR_NONE;
1235
1236         /* set attributes related sensor */
1237         if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
1238                 /* init for gdbus */
1239                 hcamcorder->gdbus_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL);
1240                 if (hcamcorder->gdbus_conn == NULL) {
1241                         _mmcam_dbg_err("failed to get gdbus");
1242                         ret = MM_ERROR_CAMCORDER_RESOURCE_CREATION;
1243                         goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1244                 }
1245
1246                 g_mutex_init(&hcamcorder->gdbus_info_sound.sync_mutex);
1247                 g_cond_init(&hcamcorder->gdbus_info_sound.sync_cond);
1248                 g_mutex_init(&hcamcorder->gdbus_info_solo_sound.sync_mutex);
1249                 g_cond_init(&hcamcorder->gdbus_info_solo_sound.sync_cond);
1250
1251                 _mmcamcorder_set_attribute_to_camsensor(handle);
1252         }
1253
1254         ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_PREVIEW_START);
1255         if (ret != MM_ERROR_NONE) {
1256                 /* check internal error of gstreamer */
1257                 if (hcamcorder->error_code != MM_ERROR_NONE) {
1258                         ret = hcamcorder->error_code;
1259                         _mmcam_dbg_log("gstreamer error is occurred. return it %x", ret);
1260                 }
1261                 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1262         }
1263
1264         _mmcamcorder_set_state(handle, state_TO);
1265
1266         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1267
1268         return MM_ERROR_NONE;
1269
1270 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1271         if (hcamcorder->gdbus_conn) {
1272                 g_object_unref(hcamcorder->gdbus_conn);
1273                 hcamcorder->gdbus_conn = NULL;
1274
1275                 g_mutex_clear(&hcamcorder->gdbus_info_sound.sync_mutex);
1276                 g_cond_clear(&hcamcorder->gdbus_info_sound.sync_cond);
1277                 g_mutex_clear(&hcamcorder->gdbus_info_solo_sound.sync_mutex);
1278                 g_cond_clear(&hcamcorder->gdbus_info_solo_sound.sync_cond);
1279         }
1280
1281         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1282
1283 _ERR_CAMCORDER_CMD_PRECON:
1284         /* check internal error of gstreamer */
1285         if (hcamcorder->error_code != MM_ERROR_NONE) {
1286                 ret = hcamcorder->error_code;
1287                 hcamcorder->error_code = MM_ERROR_NONE;
1288
1289                 _mmcam_dbg_log("gstreamer error is occurred. return it %x", ret);
1290         }
1291
1292         _mmcam_dbg_err("Start fail (type %d, state %d, ret %x)",
1293                        hcamcorder->type, state, ret);
1294
1295         return ret;
1296 }
1297
1298 int _mmcamcorder_stop(MMHandleType handle)
1299 {
1300         int ret = MM_ERROR_NONE;
1301         int state = MM_CAMCORDER_STATE_NONE;
1302         int state_FROM = MM_CAMCORDER_STATE_PREPARE;
1303         int state_TO = MM_CAMCORDER_STATE_READY;
1304
1305         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1306
1307         _mmcam_dbg_log("");
1308
1309         if (!hcamcorder) {
1310                 _mmcam_dbg_err("Not initialized");
1311                 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1312                 return ret;
1313         }
1314
1315         if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1316                 _mmcam_dbg_err("Another command is running.");
1317                 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1318                 goto _ERR_CAMCORDER_CMD_PRECON;
1319         }
1320
1321         state = _mmcamcorder_get_state(handle);
1322         if (state != state_FROM) {
1323                 _mmcam_dbg_err("Wrong state(%d)", state);
1324                 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1325                 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1326         }
1327
1328         ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_PREVIEW_STOP);
1329         if (ret != MM_ERROR_NONE) {
1330                 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1331         }
1332
1333         _mmcamcorder_set_state(handle, state_TO);
1334
1335         if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
1336                 g_mutex_lock(&hcamcorder->gdbus_info_sound.sync_mutex);
1337                 if (hcamcorder->gdbus_info_sound.subscribe_id > 0) {
1338                         _mmcam_dbg_warn("subscribe_id[%u] is remained. remove it.",
1339                                 hcamcorder->gdbus_info_sound.subscribe_id);
1340                         g_dbus_connection_signal_unsubscribe(hcamcorder->gdbus_conn,
1341                                 hcamcorder->gdbus_info_sound.subscribe_id);
1342                 }
1343                 g_mutex_unlock(&hcamcorder->gdbus_info_sound.sync_mutex);
1344
1345                 g_mutex_lock(&hcamcorder->gdbus_info_solo_sound.sync_mutex);
1346                 if (hcamcorder->gdbus_info_solo_sound.subscribe_id > 0) {
1347                         _mmcam_dbg_warn("subscribe_id[%u] is remained. remove it.",
1348                                 hcamcorder->gdbus_info_solo_sound.subscribe_id);
1349                         g_dbus_connection_signal_unsubscribe(hcamcorder->gdbus_conn,
1350                                 hcamcorder->gdbus_info_solo_sound.subscribe_id);
1351                 }
1352                 g_mutex_unlock(&hcamcorder->gdbus_info_solo_sound.sync_mutex);
1353
1354                 g_object_unref(hcamcorder->gdbus_conn);
1355                 hcamcorder->gdbus_conn = NULL;
1356
1357                 g_mutex_clear(&hcamcorder->gdbus_info_sound.sync_mutex);
1358                 g_cond_clear(&hcamcorder->gdbus_info_sound.sync_cond);
1359                 g_mutex_clear(&hcamcorder->gdbus_info_solo_sound.sync_mutex);
1360                 g_cond_clear(&hcamcorder->gdbus_info_solo_sound.sync_cond);
1361         }
1362
1363         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1364
1365         return MM_ERROR_NONE;
1366
1367 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1368         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1369
1370 _ERR_CAMCORDER_CMD_PRECON:
1371         /* send message */
1372         _mmcam_dbg_err("Stop fail (type %d, state %d, ret %x)",
1373                        hcamcorder->type, state, ret);
1374
1375         return ret;
1376 }
1377
1378
1379 int _mmcamcorder_capture_start(MMHandleType handle)
1380 {
1381         int ret = MM_ERROR_NONE;
1382         int state = MM_CAMCORDER_STATE_NONE;
1383         int state_FROM_0 = MM_CAMCORDER_STATE_PREPARE;
1384         int state_FROM_1 = MM_CAMCORDER_STATE_RECORDING;
1385         int state_FROM_2 = MM_CAMCORDER_STATE_PAUSED;
1386         int state_TO = MM_CAMCORDER_STATE_CAPTURING;
1387
1388         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1389
1390         _mmcam_dbg_log("");
1391
1392         if (!hcamcorder) {
1393                 _mmcam_dbg_err("Not initialized");
1394                 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1395                 return ret;
1396         }
1397
1398         if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1399                 _mmcam_dbg_err("Another command is running.");
1400                 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1401                 goto _ERR_CAMCORDER_CMD_PRECON;
1402         }
1403
1404         state = _mmcamcorder_get_state(handle);
1405         if (state != state_FROM_0 &&
1406             state != state_FROM_1 &&
1407             state != state_FROM_2) {
1408                 _mmcam_dbg_err("Wrong state(%d)", state);
1409                 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1410                 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1411         }
1412
1413         /* Handle capture in recording case */
1414         if (state == state_FROM_1 || state == state_FROM_2) {
1415                 if (hcamcorder->capture_in_recording == TRUE) {
1416                         _mmcam_dbg_err("Capturing in recording (%d)", state);
1417                         ret = MM_ERROR_CAMCORDER_DEVICE_BUSY;
1418                         goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1419                 } else {
1420                         g_mutex_lock(&hcamcorder->task_thread_lock);
1421                         if (hcamcorder->task_thread_state == _MMCAMCORDER_TASK_THREAD_STATE_NONE) {
1422                                 hcamcorder->capture_in_recording = TRUE;
1423                                 hcamcorder->task_thread_state = _MMCAMCORDER_TASK_THREAD_STATE_CHECK_CAPTURE_IN_RECORDING;
1424                                 _mmcam_dbg_log("send signal for capture in recording");
1425                                 g_cond_signal(&hcamcorder->task_thread_cond);
1426                                 g_mutex_unlock(&hcamcorder->task_thread_lock);
1427                         } else {
1428                                 _mmcam_dbg_err("task thread busy : %d", hcamcorder->task_thread_state);
1429                                 g_mutex_unlock(&hcamcorder->task_thread_lock);
1430                                 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1431                                 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1432                         }
1433                 }
1434         }
1435
1436         ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_CAPTURE);
1437         if (ret != MM_ERROR_NONE) {
1438                 goto _ERR_CAMCORDER_CMD;
1439         }
1440
1441         /* Do not change state when recording snapshot capture */
1442         if (state == state_FROM_0) {
1443                 _mmcamcorder_set_state(handle, state_TO);
1444         }
1445
1446         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1447
1448         /* Init break continuous shot attr */
1449         if (mm_camcorder_set_attributes(handle, NULL, "capture-break-cont-shot", 0, NULL) != MM_ERROR_NONE) {
1450                 _mmcam_dbg_warn("capture-break-cont-shot set 0 failed");
1451         }
1452
1453         return MM_ERROR_NONE;
1454
1455 _ERR_CAMCORDER_CMD:
1456         if (hcamcorder->capture_in_recording) {
1457                 hcamcorder->capture_in_recording = FALSE;
1458         }
1459
1460 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1461         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1462
1463 _ERR_CAMCORDER_CMD_PRECON:
1464         /* send message */
1465         _mmcam_dbg_err("Capture start fail (type %d, state %d, ret %x)",
1466                        hcamcorder->type, state, ret);
1467
1468         return ret;
1469 }
1470
1471 int _mmcamcorder_capture_stop(MMHandleType handle)
1472 {
1473         int ret = MM_ERROR_NONE;
1474         int state = MM_CAMCORDER_STATE_NONE;
1475         int state_FROM = MM_CAMCORDER_STATE_CAPTURING;
1476         int state_TO = MM_CAMCORDER_STATE_PREPARE;
1477         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1478
1479         _mmcam_dbg_log("");
1480
1481         if (!hcamcorder) {
1482                 _mmcam_dbg_err("Not initialized");
1483                 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1484                 return ret;
1485         }
1486
1487         if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1488                 _mmcam_dbg_err("Another command is running.");
1489                 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1490                 goto _ERR_CAMCORDER_CMD_PRECON;
1491         }
1492
1493         state = _mmcamcorder_get_state(handle);
1494         if (state != state_FROM) {
1495                 _mmcam_dbg_err("Wrong state(%d)", state);
1496                 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1497                 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1498         }
1499
1500         ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_PREVIEW_START);
1501         if (ret != MM_ERROR_NONE) {
1502                 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1503         }
1504
1505         _mmcamcorder_set_state(handle, state_TO);
1506
1507         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1508
1509         return MM_ERROR_NONE;
1510
1511 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1512         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1513
1514 _ERR_CAMCORDER_CMD_PRECON:
1515         /* send message */
1516         _mmcam_dbg_err("Capture stop fail (type %d, state %d, ret %x)",
1517                        hcamcorder->type, state, ret);
1518
1519         return ret;
1520 }
1521
1522 int _mmcamcorder_record(MMHandleType handle)
1523 {
1524         int ret = MM_ERROR_NONE;
1525         int state = MM_CAMCORDER_STATE_NONE;
1526         int state_FROM1 = MM_CAMCORDER_STATE_PREPARE;
1527         int state_FROM2 = MM_CAMCORDER_STATE_PAUSED;
1528         int state_TO = MM_CAMCORDER_STATE_RECORDING;
1529
1530         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1531
1532         _mmcam_dbg_log("");
1533
1534         if (!hcamcorder) {
1535                 _mmcam_dbg_err("Not initialized");
1536                 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1537                 return ret;
1538         }
1539
1540         if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1541                 _mmcam_dbg_err("Another command is running.");
1542                 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1543                 goto _ERR_CAMCORDER_CMD_PRECON;
1544         }
1545
1546         state = _mmcamcorder_get_state(handle);
1547         if (state != state_FROM1 && state != state_FROM2) {
1548                 _mmcam_dbg_err("Wrong state(%d)", state);
1549                 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1550                 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1551         }
1552
1553         /* initialize error code */
1554         hcamcorder->error_code = MM_ERROR_NONE;
1555
1556         ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_RECORD);
1557         if (ret != MM_ERROR_NONE) {
1558                 /* check internal error of gstreamer */
1559                 if (hcamcorder->error_code != MM_ERROR_NONE) {
1560                         ret = hcamcorder->error_code;
1561                         _mmcam_dbg_log("gstreamer error is occurred. return it %x", ret);
1562                 }
1563                 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1564         }
1565
1566         _mmcamcorder_set_state(handle, state_TO);
1567
1568         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1569
1570         return MM_ERROR_NONE;
1571
1572 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1573         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1574
1575 _ERR_CAMCORDER_CMD_PRECON:
1576         /* check internal error of gstreamer */
1577         if (hcamcorder->error_code != MM_ERROR_NONE) {
1578                 ret = hcamcorder->error_code;
1579                 hcamcorder->error_code = MM_ERROR_NONE;
1580
1581                 _mmcam_dbg_log("gstreamer error is occurred. return it %x", ret);
1582         }
1583
1584         _mmcam_dbg_err("Record fail (type %d, state %d, ret %x)",
1585                        hcamcorder->type, state, ret);
1586
1587         return ret;
1588 }
1589
1590
1591 int _mmcamcorder_pause(MMHandleType handle)
1592 {
1593         int ret = MM_ERROR_NONE;
1594         int state = MM_CAMCORDER_STATE_NONE;
1595         int state_FROM = MM_CAMCORDER_STATE_RECORDING;
1596         int state_TO = MM_CAMCORDER_STATE_PAUSED;
1597
1598         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1599
1600         _mmcam_dbg_log("");
1601
1602         if (!hcamcorder) {
1603                 _mmcam_dbg_err("Not initialized");
1604                 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1605                 return ret;
1606         }
1607
1608         if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1609                 _mmcam_dbg_err("Another command is running.");
1610                 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1611                 goto _ERR_CAMCORDER_CMD_PRECON;
1612         }
1613
1614         state = _mmcamcorder_get_state(handle);
1615         if (state != state_FROM) {
1616                 _mmcam_dbg_err("Wrong state(%d)", state);
1617                 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1618                 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1619         }
1620
1621         ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_PAUSE);
1622         if (ret != MM_ERROR_NONE) {
1623                 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1624         }
1625
1626         _mmcamcorder_set_state(handle, state_TO);
1627
1628         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1629
1630         return MM_ERROR_NONE;
1631
1632 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1633         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1634
1635 _ERR_CAMCORDER_CMD_PRECON:
1636         /* send message */
1637         _mmcam_dbg_err("Pause fail (type %d, state %d, ret %x)",
1638                        hcamcorder->type, state, ret);
1639
1640         return ret;
1641 }
1642
1643
1644 int _mmcamcorder_commit(MMHandleType handle)
1645 {
1646         int ret = MM_ERROR_NONE;
1647         int state = MM_CAMCORDER_STATE_NONE;
1648         int state_FROM1 = MM_CAMCORDER_STATE_RECORDING;
1649         int state_FROM2 = MM_CAMCORDER_STATE_PAUSED;
1650         int state_TO = MM_CAMCORDER_STATE_PREPARE;
1651
1652         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1653
1654         _mmcam_dbg_log("");
1655
1656         if (!hcamcorder) {
1657                 _mmcam_dbg_err("Not initialized");
1658                 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1659                 return ret;
1660         }
1661
1662         if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1663                 _mmcam_dbg_err("Another command is running.");
1664                 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1665                 goto _ERR_CAMCORDER_CMD_PRECON;
1666         }
1667
1668         state = _mmcamcorder_get_state(handle);
1669         if (state != state_FROM1 && state != state_FROM2) {
1670                 _mmcam_dbg_err("Wrong state(%d)", state);
1671                 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1672                 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1673         }
1674
1675         ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_COMMIT);
1676         if (ret != MM_ERROR_NONE) {
1677                 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1678         }
1679
1680         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1681
1682         _mmcamcorder_set_state(handle,state_TO);
1683
1684         return MM_ERROR_NONE;
1685
1686 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1687         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1688
1689 _ERR_CAMCORDER_CMD_PRECON:
1690         /* send message */
1691         _mmcam_dbg_err("Commit fail (type %d, state %d, ret %x)",
1692                        hcamcorder->type, state, ret);
1693
1694         return ret;
1695 }
1696
1697
1698 int _mmcamcorder_cancel(MMHandleType handle)
1699 {
1700         int ret = MM_ERROR_NONE;
1701         int state = MM_CAMCORDER_STATE_NONE;
1702         int state_FROM1 = MM_CAMCORDER_STATE_RECORDING;
1703         int state_FROM2 = MM_CAMCORDER_STATE_PAUSED;
1704         int state_TO = MM_CAMCORDER_STATE_PREPARE;
1705
1706         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1707
1708         _mmcam_dbg_log("");
1709
1710         if (!hcamcorder) {
1711                 _mmcam_dbg_err("Not initialized");
1712                 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1713                 return ret;
1714         }
1715
1716         if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1717                 _mmcam_dbg_err("Another command is running.");
1718                 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1719                 goto _ERR_CAMCORDER_CMD_PRECON;
1720         }
1721
1722         state = _mmcamcorder_get_state(handle);
1723         if (state != state_FROM1 && state != state_FROM2) {
1724                 _mmcam_dbg_err("Wrong state(%d)", state);
1725                 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1726                 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1727         }
1728
1729         ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_CANCEL);
1730         if (ret != MM_ERROR_NONE) {
1731                 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1732         }
1733
1734         _mmcamcorder_set_state(handle, state_TO);
1735
1736         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1737
1738         return MM_ERROR_NONE;
1739
1740 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1741         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1742
1743 _ERR_CAMCORDER_CMD_PRECON:
1744         /* send message */
1745         _mmcam_dbg_err("Cancel fail (type %d, state %d, ret %x)",
1746                        hcamcorder->type, state, ret);
1747
1748         return ret;
1749 }
1750 /* } Internal command functions */
1751
1752
1753 int _mmcamcorder_commit_async_end(MMHandleType handle)
1754 {
1755         _mmcam_dbg_log("");
1756
1757         _mmcam_dbg_warn("_mmcamcorder_commit_async_end : MM_CAMCORDER_STATE_PREPARE");
1758         _mmcamcorder_set_state(handle, MM_CAMCORDER_STATE_PREPARE);
1759
1760         return MM_ERROR_NONE;
1761 }
1762
1763
1764 int _mmcamcorder_set_message_callback(MMHandleType handle, MMMessageCallback callback, void *user_data)
1765 {
1766         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1767
1768         _mmcam_dbg_log("%p", hcamcorder);
1769
1770         mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1771
1772         if (callback == NULL) {
1773                 _mmcam_dbg_warn("Message Callback is disabled, because application sets it to NULL");
1774         }
1775
1776         if (!_MMCAMCORDER_TRYLOCK_MESSAGE_CALLBACK(hcamcorder)) {
1777                 _mmcam_dbg_warn("Application's message callback is running now");
1778                 return MM_ERROR_CAMCORDER_INVALID_CONDITION;
1779         }
1780
1781         /* set message callback to message handle */
1782         hcamcorder->msg_cb = callback;
1783         hcamcorder->msg_cb_param = user_data;
1784
1785         _MMCAMCORDER_UNLOCK_MESSAGE_CALLBACK(hcamcorder);
1786
1787         return MM_ERROR_NONE;
1788 }
1789
1790
1791 int _mmcamcorder_set_video_stream_callback(MMHandleType handle, mm_camcorder_video_stream_callback callback, void *user_data)
1792 {
1793         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1794
1795         /*_mmcam_dbg_log("");*/
1796
1797         mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1798
1799         if (callback == NULL) {
1800                 _mmcam_dbg_warn("Video Stream Callback is disabled, because application sets it to NULL");
1801         }
1802
1803         if (!_MMCAMCORDER_TRYLOCK_VSTREAM_CALLBACK(hcamcorder)) {
1804                 _mmcam_dbg_warn("Application's video stream callback is running now");
1805                 return MM_ERROR_CAMCORDER_INVALID_CONDITION;
1806         }
1807
1808         hcamcorder->vstream_cb = callback;
1809         hcamcorder->vstream_cb_param = user_data;
1810
1811         _MMCAMCORDER_UNLOCK_VSTREAM_CALLBACK(hcamcorder);
1812
1813         return MM_ERROR_NONE;
1814 }
1815
1816
1817 int _mmcamcorder_set_audio_stream_callback(MMHandleType handle, mm_camcorder_audio_stream_callback callback, void *user_data)
1818 {
1819         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1820
1821         _mmcam_dbg_log("");
1822
1823         mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1824
1825         if (callback == NULL) {
1826                 _mmcam_dbg_warn("Audio Stream Callback is disabled, because application sets it to NULL");
1827         }
1828
1829         if (!_MMCAMCORDER_TRYLOCK_ASTREAM_CALLBACK(hcamcorder)) {
1830                 _mmcam_dbg_warn("Application's audio stream callback is running now");
1831                 return MM_ERROR_CAMCORDER_INVALID_CONDITION;
1832         }
1833
1834         hcamcorder->astream_cb = callback;
1835         hcamcorder->astream_cb_param = user_data;
1836
1837         _MMCAMCORDER_UNLOCK_ASTREAM_CALLBACK(hcamcorder);
1838
1839         return MM_ERROR_NONE;
1840 }
1841
1842
1843 int _mmcamcorder_set_video_capture_callback(MMHandleType handle, mm_camcorder_video_capture_callback callback, void *user_data)
1844 {
1845         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1846
1847         _mmcam_dbg_log("");
1848
1849         mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1850
1851         if (callback == NULL) {
1852                 _mmcam_dbg_warn("Video Capture Callback is disabled, because application sets it to NULLL");
1853         }
1854
1855         if (!_MMCAMCORDER_TRYLOCK_VCAPTURE_CALLBACK(hcamcorder)) {
1856                 _mmcam_dbg_warn("Application's video capture callback is running now");
1857                 return MM_ERROR_CAMCORDER_INVALID_CONDITION;
1858         }
1859
1860         hcamcorder->vcapture_cb = callback;
1861         hcamcorder->vcapture_cb_param = user_data;
1862
1863         _MMCAMCORDER_UNLOCK_VCAPTURE_CALLBACK(hcamcorder);
1864
1865         return MM_ERROR_NONE;
1866 }
1867
1868 int _mmcamcorder_get_current_state(MMHandleType handle)
1869 {
1870         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1871
1872         _mmcam_dbg_log("");
1873
1874         mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1875
1876         return _mmcamcorder_get_state(handle);
1877 }
1878
1879 int _mmcamcorder_init_focusing(MMHandleType handle)
1880 {
1881         int ret = TRUE;
1882         int state = MM_CAMCORDER_STATE_NONE;
1883         int focus_mode = MM_CAMCORDER_FOCUS_MODE_NONE;
1884         int af_range = MM_CAMCORDER_AUTO_FOCUS_NORMAL;
1885         int sensor_focus_mode = 0;
1886         int sensor_af_range = 0;
1887         int current_focus_mode = 0;
1888         int current_af_range = 0;
1889         mmf_camcorder_t *hcamcorder = NULL;
1890         _MMCamcorderSubContext *sc = NULL;
1891         GstCameraControl *control = NULL;
1892
1893         _mmcam_dbg_log("");
1894
1895         hcamcorder = MMF_CAMCORDER(handle);
1896         mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1897
1898         sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
1899         mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1900
1901         if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1902                 _mmcam_dbg_err("Another command is running.");
1903                 return MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1904         }
1905
1906         state = _mmcamcorder_get_state(handle);
1907
1908         if (state == MM_CAMCORDER_STATE_CAPTURING ||
1909             state < MM_CAMCORDER_STATE_PREPARE) {
1910                 _mmcam_dbg_err( "Not proper state. state[%d]", state );
1911                 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1912                 return MM_ERROR_CAMCORDER_INVALID_STATE;
1913         }
1914
1915         if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
1916                 _mmcam_dbg_log("Can't cast Video source into camera control.");
1917                 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1918                 return MM_ERROR_NONE;
1919         }
1920
1921         control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
1922         if (control == NULL) {
1923                 _mmcam_dbg_err("cast CAMERA_CONTROL failed");
1924                 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1925                 return MM_ERROR_CAMCORDER_INTERNAL;
1926         }
1927
1928         ret = gst_camera_control_stop_auto_focus(control);
1929         if (!ret) {
1930                 _mmcam_dbg_err("Auto focusing stop fail.");
1931                 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1932                 return MM_ERROR_CAMCORDER_DEVICE_IO;
1933         }
1934
1935         /* Initialize lens position */
1936         mm_camcorder_get_attributes(handle, NULL,
1937                                     MMCAM_CAMERA_FOCUS_MODE, &focus_mode,
1938                                     MMCAM_CAMERA_AF_SCAN_RANGE, &af_range,
1939                                     NULL);
1940         sensor_af_range = _mmcamcorder_convert_msl_to_sensor(handle, MM_CAM_CAMERA_AF_SCAN_RANGE, af_range);
1941         sensor_focus_mode = _mmcamcorder_convert_msl_to_sensor(handle, MM_CAM_CAMERA_FOCUS_MODE, focus_mode);
1942
1943         gst_camera_control_get_focus(control, &current_focus_mode, &current_af_range);
1944
1945         if (current_focus_mode != sensor_focus_mode ||
1946             current_af_range != sensor_af_range) {
1947                 ret = gst_camera_control_set_focus(control, sensor_focus_mode, sensor_af_range);
1948         } else {
1949                 _mmcam_dbg_log("No need to init FOCUS [mode:%d, range:%d]", focus_mode, af_range );
1950                 ret = TRUE;
1951         }
1952
1953         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1954
1955         if (ret) {
1956                 _mmcam_dbg_log("Lens init success.");
1957                 return MM_ERROR_NONE;
1958         } else {
1959                 _mmcam_dbg_err("Lens init fail.");
1960                 return MM_ERROR_CAMCORDER_DEVICE_IO;
1961         }
1962 }
1963
1964 int _mmcamcorder_adjust_focus(MMHandleType handle, int direction)
1965 {
1966         int state;
1967         int focus_mode = MM_CAMCORDER_FOCUS_MODE_NONE;
1968         int ret = MM_ERROR_UNKNOWN;
1969         char *err_attr_name = NULL;
1970
1971         mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1972         mmf_return_val_if_fail(direction, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
1973
1974         /*_mmcam_dbg_log("");*/
1975
1976         if (!_MMCAMCORDER_TRYLOCK_CMD(handle)) {
1977                 _mmcam_dbg_err("Another command is running.");
1978                 return MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1979         }
1980
1981         state = _mmcamcorder_get_state(handle);
1982         if (state == MM_CAMCORDER_STATE_CAPTURING ||
1983             state < MM_CAMCORDER_STATE_PREPARE) {
1984                 _mmcam_dbg_err("Not proper state. state[%d]", state);
1985                 _MMCAMCORDER_UNLOCK_CMD(handle);
1986                 return MM_ERROR_CAMCORDER_INVALID_STATE;
1987         }
1988
1989         /* TODO : call a auto or manual focus function */
1990         ret = mm_camcorder_get_attributes(handle, &err_attr_name,
1991                                           MMCAM_CAMERA_FOCUS_MODE, &focus_mode,
1992                                           NULL);
1993         if (ret != MM_ERROR_NONE) {
1994                 _mmcam_dbg_warn("Get focus-mode fail. (%s:%x)", err_attr_name, ret);
1995                 SAFE_FREE (err_attr_name);
1996                 _MMCAMCORDER_UNLOCK_CMD(handle);
1997                 return ret;
1998         }
1999
2000         if (focus_mode == MM_CAMCORDER_FOCUS_MODE_MANUAL) {
2001                 ret = _mmcamcorder_adjust_manual_focus(handle, direction);
2002         } else if (focus_mode == MM_CAMCORDER_FOCUS_MODE_AUTO ||
2003                    focus_mode == MM_CAMCORDER_FOCUS_MODE_TOUCH_AUTO ||
2004                    focus_mode == MM_CAMCORDER_FOCUS_MODE_CONTINUOUS) {
2005                 ret = _mmcamcorder_adjust_auto_focus(handle);
2006         } else {
2007                 _mmcam_dbg_err("It doesn't adjust focus. Focusing mode(%d)", focus_mode);
2008                 ret = MM_ERROR_CAMCORDER_NOT_SUPPORTED;
2009         }
2010
2011         _MMCAMCORDER_UNLOCK_CMD(handle);
2012
2013         return ret;
2014 }
2015
2016 int _mmcamcorder_adjust_manual_focus(MMHandleType handle, int direction)
2017 {
2018         int max_level = 0;
2019         int min_level = 0;
2020         int cur_level = 0;
2021         int focus_level = 0;
2022         float unit_level = 0;
2023         GstCameraControl *control = NULL;
2024         _MMCamcorderSubContext *sc = NULL;
2025         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2026
2027         _mmcam_dbg_log("");
2028
2029         mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
2030         mmf_return_val_if_fail(_MMFCAMCORDER_FOCUS_TOTAL_LEVEL != 1, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
2031         mmf_return_val_if_fail((direction >= MM_CAMCORDER_MF_LENS_DIR_FORWARD) &&
2032                                (direction <= MM_CAMCORDER_MF_LENS_DIR_BACKWARD),
2033                                MM_ERROR_CAMCORDER_INVALID_ARGUMENT );
2034
2035         sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
2036         mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
2037
2038         if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
2039                 _mmcam_dbg_log("Can't cast Video source into camera control.");
2040                 return MM_ERROR_NONE;
2041         }
2042
2043         control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
2044         if (control == NULL) {
2045                 _mmcam_dbg_err("cast CAMERA_CONTROL failed");
2046                 return MM_ERROR_CAMCORDER_INTERNAL;
2047         }
2048
2049         /* TODO : get max, min level */
2050         if (max_level - min_level + 1 < _MMFCAMCORDER_FOCUS_TOTAL_LEVEL) {
2051                 _mmcam_dbg_warn("Total level  of manual focus of MMF is greater than that of the camera driver.");
2052         }
2053
2054         unit_level = ((float)max_level - (float)min_level)/(float)(_MMFCAMCORDER_FOCUS_TOTAL_LEVEL - 1);
2055
2056         if (!gst_camera_control_get_focus_level(control, &cur_level)) {
2057                 _mmcam_dbg_err("Can't get current level of manual focus.");
2058                 return MM_ERROR_CAMCORDER_DEVICE_IO;
2059         }
2060
2061         //TODO : adjust unit level value
2062         if (direction == MM_CAMCORDER_MF_LENS_DIR_FORWARD) {
2063                 focus_level = cur_level + unit_level;
2064         } else if (direction == MM_CAMCORDER_MF_LENS_DIR_BACKWARD) {
2065                 focus_level = cur_level - unit_level;
2066         }
2067
2068         if (focus_level > max_level) {
2069                 focus_level = max_level;
2070         } else if (focus_level < min_level) {
2071                 focus_level = min_level;
2072         }
2073
2074         if (!gst_camera_control_set_focus_level(control, focus_level)) {
2075                 _mmcam_dbg_err("Manual focusing fail.");
2076                 return MM_ERROR_CAMCORDER_DEVICE_IO;
2077         }
2078
2079         return MM_ERROR_NONE;
2080 }
2081
2082
2083 int _mmcamcorder_adjust_auto_focus(MMHandleType handle)
2084 {
2085         gboolean ret;
2086         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2087         GstCameraControl *control = NULL;
2088         _MMCamcorderSubContext *sc = NULL;
2089
2090         mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
2091
2092         /*_mmcam_dbg_log("");*/
2093
2094         sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
2095
2096         if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
2097                 _mmcam_dbg_log("Can't cast Video source into camera control.");
2098                 return MM_ERROR_NONE;
2099         }
2100
2101         control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
2102         if (control) {
2103                 /* Start AF */
2104                 ret = gst_camera_control_start_auto_focus(control);
2105         } else {
2106                 _mmcam_dbg_err("cast CAMERA_CONTROL failed");
2107                 ret = FALSE;
2108         }
2109
2110         if (ret) {
2111                 _mmcam_dbg_log("Auto focusing start success.");
2112                 return MM_ERROR_NONE;
2113         } else {
2114                 _mmcam_dbg_err("Auto focusing start fail.");
2115                 return MM_ERROR_CAMCORDER_DEVICE_IO;
2116         }
2117 }
2118
2119 int _mmcamcorder_stop_focusing(MMHandleType handle)
2120 {
2121         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2122         _MMCamcorderSubContext *sc = NULL;
2123
2124         int ret, state;
2125         GstCameraControl *control = NULL;
2126
2127         mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
2128
2129         /*_mmcam_dbg_log("");*/
2130
2131         sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
2132
2133         if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
2134                 _mmcam_dbg_err("Another command is running.");
2135                 return MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
2136         }
2137
2138         state = _mmcamcorder_get_state(handle);
2139         if (state == MM_CAMCORDER_STATE_CAPTURING ||
2140             state < MM_CAMCORDER_STATE_PREPARE) {
2141                 _mmcam_dbg_err( "Not proper state. state[%d]", state );
2142                 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
2143                 return MM_ERROR_CAMCORDER_INVALID_STATE;
2144         }
2145
2146         if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
2147                 _mmcam_dbg_log("Can't cast Video source into camera control.");
2148                 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
2149                 return MM_ERROR_NONE;
2150         }
2151
2152         control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
2153         if (control) {
2154                 ret = gst_camera_control_stop_auto_focus(control);
2155         } else {
2156                 _mmcam_dbg_err("cast CAMERA_CONTROL failed");
2157                 ret = FALSE;
2158         }
2159
2160         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
2161
2162         if (ret) {
2163                 _mmcam_dbg_log("Auto focusing stop success.");
2164                 return MM_ERROR_NONE;
2165         } else {
2166                 _mmcam_dbg_err("Auto focusing stop fail.");
2167                 return MM_ERROR_CAMCORDER_DEVICE_IO;
2168         }
2169 }
2170
2171
2172 /*-----------------------------------------------
2173 |         CAMCORDER INTERNAL LOCAL              |
2174 -----------------------------------------------*/
2175 static gboolean
2176 __mmcamcorder_gstreamer_init(camera_conf * conf)
2177 {
2178         static const int max_argc = 10;
2179         int i = 0;
2180         int cnt_str = 0;
2181         gint *argc = NULL;
2182         gchar **argv = NULL;
2183         GError *err = NULL;
2184         gboolean ret = FALSE;
2185         type_string_array *GSTInitOption = NULL;
2186
2187         mmf_return_val_if_fail(conf, FALSE);
2188
2189         _mmcam_dbg_log("");
2190
2191         /* alloc */
2192         argc = malloc(sizeof(int));
2193         argv = malloc(sizeof(gchar *) * max_argc);
2194
2195         if (!argc || !argv) {
2196                 goto ERROR;
2197         }
2198
2199         memset(argv, 0, sizeof(gchar *) * max_argc);
2200
2201         /* add initial */
2202         *argc = 1;
2203         argv[0] = g_strdup("mmcamcorder");
2204
2205         /* add gst_param */
2206         _mmcamcorder_conf_get_value_string_array(conf,
2207                                                  CONFIGURE_CATEGORY_MAIN_GENERAL,
2208                                                  "GSTInitOption",
2209                                                  &GSTInitOption);
2210         if (GSTInitOption != NULL && GSTInitOption->value) {
2211                 cnt_str = GSTInitOption->count;
2212                 for( ; *argc < max_argc && *argc <= cnt_str ; (*argc)++ )
2213                 {
2214                         argv[*argc] = g_strdup(GSTInitOption->value[(*argc)-1]);
2215                 }
2216         }
2217
2218         _mmcam_dbg_log("initializing gstreamer with following parameter[argc:%d]", *argc);
2219
2220         for (i = 0; i < *argc; i++) {
2221                 _mmcam_dbg_log("argv[%d] : %s", i, argv[i]);
2222         }
2223
2224         /* initializing gstreamer */
2225         ret = gst_init_check (argc, &argv, &err);
2226         if (!ret) {
2227                 _mmcam_dbg_err("Could not initialize GStreamer: %s ",
2228                                err ? err->message : "unknown error occurred");
2229                 if (err) {
2230                         g_error_free (err);
2231                 }
2232         }
2233
2234         /* release */
2235         for (i = 0; i < *argc; i++) {
2236                 if (argv[i]) {
2237                         g_free(argv[i]);
2238                         argv[i] = NULL;
2239                 }
2240         }
2241
2242         if (argv) {
2243                 free(argv);
2244                 argv = NULL;
2245         }
2246
2247         if (argc) {
2248                 free(argc);
2249                 argc = NULL;
2250         }
2251
2252         return ret;
2253
2254 ERROR:
2255         _mmcam_dbg_err("failed to initialize gstreamer");
2256
2257         if (argv) {
2258                 free(argv);
2259                 argv = NULL;
2260         }
2261
2262         if (argc) {
2263                 free(argc);
2264                 argc = NULL;
2265         }
2266
2267         return FALSE;
2268 }
2269
2270
2271 int _mmcamcorder_get_state(MMHandleType handle)
2272 {
2273         int state;
2274         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2275
2276         mmf_return_val_if_fail(hcamcorder, -1);
2277
2278         _MMCAMCORDER_LOCK_STATE(handle);
2279
2280         state = hcamcorder->state;
2281         /*_mmcam_dbg_log("state=%d",state);*/
2282
2283         _MMCAMCORDER_UNLOCK_STATE(handle);
2284
2285         return state;
2286 }
2287
2288
2289 void _mmcamcorder_set_state(MMHandleType handle, int state)
2290 {
2291         int old_state;
2292         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2293         _MMCamcorderMsgItem msg;
2294
2295         mmf_return_if_fail(hcamcorder);
2296
2297         /*_mmcam_dbg_log("");*/
2298
2299         _MMCAMCORDER_LOCK_STATE(handle);
2300
2301         old_state = hcamcorder->state;
2302         if(old_state != state) {
2303                 hcamcorder->state = state;
2304                 hcamcorder->target_state = state;
2305
2306                 _mmcam_dbg_log("set state[%d] and send state-changed message", state);
2307
2308                 /* To discern who changes the state */
2309                 switch (hcamcorder->state_change_by_system) {
2310                 case _MMCAMCORDER_STATE_CHANGE_BY_ASM:
2311                         msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED_BY_ASM;
2312                         msg.param.state.code = hcamcorder->interrupt_code;
2313                         break;
2314                 case _MMCAMCORDER_STATE_CHANGE_BY_RM:
2315                         msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED_BY_RM;
2316                         msg.param.state.code = MM_ERROR_NONE;
2317                         break;
2318                 case _MMCAMCORDER_STATE_CHANGE_NORMAL:
2319                 default:
2320                         msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
2321                         msg.param.state.code = MM_ERROR_NONE;
2322                         break;
2323                 }
2324
2325                 msg.param.state.previous = old_state;
2326                 msg.param.state.current = state;
2327
2328                 /*_mmcam_dbg_log("_mmcamcorder_send_message : msg : %p, id:%x", &msg, msg.id);*/
2329                 _mmcamcorder_send_message(handle, &msg);
2330         }
2331
2332         _MMCAMCORDER_UNLOCK_STATE(handle);
2333
2334         return;
2335 }
2336
2337
2338 int _mmcamcorder_get_async_state(MMHandleType handle)
2339 {
2340         int state;
2341         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2342
2343         _MMCAMCORDER_LOCK_STATE(handle);
2344         state = hcamcorder->target_state;
2345
2346         _MMCAMCORDER_UNLOCK_STATE(handle);
2347
2348         return state;
2349 }
2350
2351
2352 _MMCamcorderSubContext *_mmcamcorder_alloc_subcontext(int type)
2353 {
2354         int i;
2355         _MMCamcorderSubContext *sc = NULL;
2356
2357         /*_mmcam_dbg_log("");*/
2358
2359         /* alloc container */
2360         sc = (_MMCamcorderSubContext *)malloc(sizeof(_MMCamcorderSubContext));
2361         mmf_return_val_if_fail(sc != NULL, NULL);
2362
2363         /* init members */
2364         memset(sc, 0x00, sizeof(_MMCamcorderSubContext));
2365
2366         sc->element_num = _MMCAMCORDER_PIPELINE_ELEMENT_NUM;
2367         sc->encode_element_num = _MMCAMCORDER_ENCODE_PIPELINE_ELEMENT_NUM;
2368
2369         /* alloc info for each mode */
2370         switch (type) {
2371         case MM_CAMCORDER_MODE_AUDIO:
2372                 sc->info_audio = g_malloc0( sizeof(_MMCamcorderAudioInfo));
2373                 if(!sc->info_audio) {
2374                         _mmcam_dbg_err("Failed to alloc info structure");
2375                         goto ALLOC_SUBCONTEXT_FAILED;
2376                 }
2377                 break;
2378         case MM_CAMCORDER_MODE_VIDEO_CAPTURE:
2379         default:
2380                 sc->info_image = g_malloc0( sizeof(_MMCamcorderImageInfo));
2381                 if(!sc->info_image) {
2382                         _mmcam_dbg_err("Failed to alloc info structure");
2383                         goto ALLOC_SUBCONTEXT_FAILED;
2384                 }
2385
2386                 /* init sound status */
2387                 sc->info_image->sound_status = _SOUND_STATUS_INIT;
2388
2389                 sc->info_video = g_malloc0( sizeof(_MMCamcorderVideoInfo));
2390                 if(!sc->info_video) {
2391                         _mmcam_dbg_err("Failed to alloc info structure");
2392                         goto ALLOC_SUBCONTEXT_FAILED;
2393                 }
2394                 g_mutex_init(&sc->info_video->size_check_lock);
2395                 break;
2396         }
2397
2398         /* alloc element array */
2399         sc->element = (_MMCamcorderGstElement *)malloc(sizeof(_MMCamcorderGstElement) * sc->element_num);
2400         if(!sc->element) {
2401                 _mmcam_dbg_err("Failed to alloc element structure");
2402                 goto ALLOC_SUBCONTEXT_FAILED;
2403         }
2404
2405         sc->encode_element = (_MMCamcorderGstElement *)malloc(sizeof(_MMCamcorderGstElement) * sc->encode_element_num);
2406         if(!sc->encode_element) {
2407                 _mmcam_dbg_err("Failed to alloc encode element structure");
2408                 goto ALLOC_SUBCONTEXT_FAILED;
2409         }
2410
2411         for (i = 0 ; i < sc->element_num ; i++) {
2412                 sc->element[i].id = _MMCAMCORDER_NONE;
2413                 sc->element[i].gst = NULL;
2414         }
2415
2416         for (i = 0 ; i < sc->encode_element_num ; i++) {
2417                 sc->encode_element[i].id = _MMCAMCORDER_NONE;
2418                 sc->encode_element[i].gst = NULL;
2419         }
2420
2421         sc->fourcc = 0x80000000;
2422         sc->cam_stability_count = 0;
2423         sc->drop_vframe = 0;
2424         sc->pass_first_vframe = 0;
2425         sc->is_modified_rate = FALSE;
2426
2427         return sc;
2428
2429 ALLOC_SUBCONTEXT_FAILED:
2430         if (sc) {
2431                 SAFE_G_FREE(sc->info_audio);
2432                 SAFE_G_FREE(sc->info_image);
2433                 if (sc->info_video) {
2434                         g_mutex_clear(&sc->info_video->size_check_lock);
2435                 }
2436                 SAFE_G_FREE(sc->info_video);
2437                 if (sc->element) {
2438                         free(sc->element);
2439                         sc->element = NULL;
2440                 }
2441                 if (sc->encode_element) {
2442                         free(sc->encode_element);
2443                         sc->encode_element = NULL;
2444                 }
2445                 free(sc);
2446                 sc = NULL;
2447         }
2448
2449         return NULL;
2450 }
2451
2452
2453 void _mmcamcorder_dealloc_subcontext(_MMCamcorderSubContext *sc)
2454 {
2455         _mmcam_dbg_log("");
2456
2457         if (sc) {
2458                 if (sc->element) {
2459                         _mmcam_dbg_log("release element");
2460                         free(sc->element);
2461                         sc->element = NULL;
2462                 }
2463
2464                 if (sc->encode_element) {
2465                         _mmcam_dbg_log("release encode_element");
2466                         free(sc->encode_element);
2467                         sc->encode_element = NULL;
2468                 }
2469
2470                 if (sc->info_image) {
2471                         _mmcam_dbg_log("release info_image");
2472                         free(sc->info_image);
2473                         sc->info_image = NULL;
2474                 }
2475
2476                 if (sc->info_video) {
2477                         _mmcam_dbg_log("release info_video");
2478                         SAFE_G_FREE(sc->info_video->filename);
2479                         g_mutex_clear(&sc->info_video->size_check_lock);
2480                         free(sc->info_video);
2481                         sc->info_video = NULL;
2482                 }
2483
2484                 if (sc->info_audio) {
2485                         _mmcam_dbg_log("release info_audio");
2486                         SAFE_G_FREE(sc->info_audio->filename);
2487                         free(sc->info_audio);
2488                         sc->info_audio = NULL;
2489                 }
2490
2491                 free(sc);
2492                 sc = NULL;
2493         }
2494
2495         return;
2496 }
2497
2498
2499 int _mmcamcorder_set_functions(MMHandleType handle, int type)
2500 {
2501         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2502
2503         /*_mmcam_dbg_log("");*/
2504
2505         switch (type) {
2506         case MM_CAMCORDER_MODE_AUDIO:
2507                 hcamcorder->command = _mmcamcorder_audio_command;
2508                 break;
2509         case MM_CAMCORDER_MODE_VIDEO_CAPTURE:
2510         default:
2511                 hcamcorder->command = _mmcamcorder_video_capture_command;
2512                 break;
2513         }
2514
2515         return MM_ERROR_NONE;
2516 }
2517
2518
2519 gboolean _mmcamcorder_pipeline_cb_message(GstBus *bus, GstMessage *message, gpointer data)
2520 {
2521         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(data);
2522         _MMCamcorderSubContext *sc = NULL;
2523
2524         mmf_return_val_if_fail(hcamcorder, FALSE);
2525         mmf_return_val_if_fail(message, FALSE);
2526         //_mmcam_dbg_log("message type=(%d)", GST_MESSAGE_TYPE(message));
2527
2528         switch (GST_MESSAGE_TYPE(message)) {
2529         case GST_MESSAGE_UNKNOWN:
2530                 _mmcam_dbg_log("GST_MESSAGE_UNKNOWN");
2531                 break;
2532         case GST_MESSAGE_EOS:
2533         {
2534                 _mmcam_dbg_log ("Got EOS from element \"%s\".",
2535                                 GST_STR_NULL(GST_ELEMENT_NAME(GST_MESSAGE_SRC(message))));
2536
2537                 sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
2538                 mmf_return_val_if_fail(sc, TRUE);
2539
2540                 if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
2541                         mmf_return_val_if_fail(sc->info_video, TRUE);
2542                         if (sc->info_video->b_commiting) {
2543                                 _mmcamcorder_video_handle_eos((MMHandleType)hcamcorder);
2544                         }
2545                 } else {
2546                         mmf_return_val_if_fail(sc->info_audio, TRUE);
2547                         if (sc->info_audio->b_commiting) {
2548                                 _mmcamcorder_audio_handle_eos((MMHandleType)hcamcorder);
2549                         }
2550                 }
2551
2552                 sc->bget_eos = TRUE;
2553
2554                 break;
2555         }
2556         case GST_MESSAGE_ERROR:
2557         {
2558                 GError *err;
2559                 gchar *debug;
2560                 gst_message_parse_error(message, &err, &debug);
2561
2562                 _mmcam_dbg_err ("GSTERR: %s", err->message);
2563                 _mmcam_dbg_err ("Error Debug: %s", debug);
2564
2565                 __mmcamcorder_handle_gst_error((MMHandleType)hcamcorder, message, err);
2566
2567                 g_error_free (err);
2568                 g_free (debug);
2569                 break;
2570         }
2571         case GST_MESSAGE_WARNING:
2572         {
2573                 GError *err;
2574                 gchar *debug;
2575                 gst_message_parse_warning (message, &err, &debug);
2576
2577                 _mmcam_dbg_warn("GSTWARN: %s", err->message);
2578
2579                 __mmcamcorder_handle_gst_warning((MMHandleType)hcamcorder, message, err);
2580
2581                 g_error_free (err);
2582                 g_free (debug);
2583                 break;
2584         }
2585         case GST_MESSAGE_INFO:
2586                 _mmcam_dbg_log("GST_MESSAGE_INFO");
2587                 break;
2588         case GST_MESSAGE_TAG:
2589                 _mmcam_dbg_log("GST_MESSAGE_TAG");
2590                 break;
2591         case GST_MESSAGE_BUFFERING:
2592                 _mmcam_dbg_log("GST_MESSAGE_BUFFERING");
2593                 break;
2594         case GST_MESSAGE_STATE_CHANGED:
2595         {
2596                 const GValue *vnewstate;
2597                 GstState newstate;
2598                 GstElement *pipeline = NULL;
2599
2600                 sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
2601                 if ((sc) && (sc->element)) {
2602                         if (sc->element[_MMCAMCORDER_MAIN_PIPE].gst) {
2603                                 pipeline = sc->element[_MMCAMCORDER_MAIN_PIPE].gst;
2604                                 if (message->src == (GstObject*)pipeline) {
2605                                         vnewstate = gst_structure_get_value(gst_message_get_structure(message), "new-state");
2606                                         newstate = (GstState)vnewstate->data[0].v_int;
2607                                         _mmcam_dbg_log("GST_MESSAGE_STATE_CHANGED[%s]",gst_element_state_get_name(newstate));
2608                                 }
2609                         }
2610                 }
2611                 break;
2612         }
2613         case GST_MESSAGE_STATE_DIRTY:
2614                 _mmcam_dbg_log("GST_MESSAGE_STATE_DIRTY");
2615                 break;
2616         case GST_MESSAGE_STEP_DONE:
2617                 _mmcam_dbg_log("GST_MESSAGE_STEP_DONE");
2618                 break;
2619         case GST_MESSAGE_CLOCK_PROVIDE:
2620                 _mmcam_dbg_log("GST_MESSAGE_CLOCK_PROVIDE");
2621                 break;
2622         case GST_MESSAGE_CLOCK_LOST:
2623                 _mmcam_dbg_log("GST_MESSAGE_CLOCK_LOST");
2624                 break;
2625         case GST_MESSAGE_NEW_CLOCK:
2626         {
2627                 GstClock *pipe_clock = NULL;
2628                 gst_message_parse_new_clock(message, &pipe_clock);
2629                 /*_mmcam_dbg_log("GST_MESSAGE_NEW_CLOCK : %s", (clock ? GST_OBJECT_NAME (clock) : "NULL"));*/
2630                 break;
2631         }
2632         case GST_MESSAGE_STRUCTURE_CHANGE:
2633                 _mmcam_dbg_log("GST_MESSAGE_STRUCTURE_CHANGE");
2634                 break;
2635         case GST_MESSAGE_STREAM_STATUS:
2636                 /*_mmcam_dbg_log("GST_MESSAGE_STREAM_STATUS");*/
2637                 break;
2638         case GST_MESSAGE_APPLICATION:
2639                 _mmcam_dbg_log("GST_MESSAGE_APPLICATION");
2640                 break;
2641         case GST_MESSAGE_ELEMENT:
2642                 /*_mmcam_dbg_log("GST_MESSAGE_ELEMENT");*/
2643                 break;
2644         case GST_MESSAGE_SEGMENT_START:
2645                 _mmcam_dbg_log("GST_MESSAGE_SEGMENT_START");
2646                 break;
2647         case GST_MESSAGE_SEGMENT_DONE:
2648                 _mmcam_dbg_log("GST_MESSAGE_SEGMENT_DONE");
2649                 break;
2650         case GST_MESSAGE_DURATION_CHANGED:
2651                 _mmcam_dbg_log("GST_MESSAGE_DURATION_CHANGED");
2652                 break;
2653         case GST_MESSAGE_LATENCY:
2654                 _mmcam_dbg_log("GST_MESSAGE_LATENCY");
2655                 break;
2656         case GST_MESSAGE_ASYNC_START:
2657                 _mmcam_dbg_log("GST_MESSAGE_ASYNC_START");
2658                 break;
2659         case GST_MESSAGE_ASYNC_DONE:
2660                 /*_mmcam_dbg_log("GST_MESSAGE_ASYNC_DONE");*/
2661                 break;
2662         case GST_MESSAGE_ANY:
2663                 _mmcam_dbg_log("GST_MESSAGE_ANY");
2664                 break;
2665         case GST_MESSAGE_QOS:
2666 //              _mmcam_dbg_log("GST_MESSAGE_QOS");
2667                 break;
2668         default:
2669                 _mmcam_dbg_log("not handled message type=(%d)", GST_MESSAGE_TYPE(message));
2670                 break;
2671         }
2672
2673         return TRUE;
2674 }
2675
2676
2677 GstBusSyncReply _mmcamcorder_pipeline_bus_sync_callback(GstBus *bus, GstMessage *message, gpointer data)
2678 {
2679         GstElement *element = NULL;
2680         GError *err = NULL;
2681         gchar *debug_info = NULL;
2682
2683         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(data);
2684         _MMCamcorderSubContext *sc = NULL;
2685
2686         mmf_return_val_if_fail(hcamcorder, GST_BUS_PASS);
2687         mmf_return_val_if_fail(message, GST_BUS_PASS);
2688
2689         sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
2690         mmf_return_val_if_fail(sc, GST_BUS_PASS);
2691
2692         if (GST_MESSAGE_TYPE(message) == GST_MESSAGE_ERROR) {
2693                 /* parse error message */
2694                 gst_message_parse_error(message, &err, &debug_info);
2695
2696                 if (debug_info) {
2697                         _mmcam_dbg_err("GST ERROR : %s", debug_info);
2698                         g_free(debug_info);
2699                         debug_info = NULL;
2700                 }
2701
2702                 if (!err) {
2703                         _mmcam_dbg_warn("failed to parse error message");
2704                         return GST_BUS_PASS;
2705                 }
2706
2707                 /* set videosrc element to compare */
2708                 element = GST_ELEMENT_CAST(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
2709
2710                 /* check domain[RESOURCE] and element[VIDEOSRC] */
2711                 if (err->domain == GST_RESOURCE_ERROR &&
2712                     GST_ELEMENT_CAST(message->src) == element) {
2713                         switch (err->code) {
2714                         case GST_RESOURCE_ERROR_BUSY:
2715                                 _mmcam_dbg_err("Camera device [busy]");
2716                                 hcamcorder->error_code = MM_ERROR_CAMCORDER_DEVICE_BUSY;
2717                                 break;
2718                         case GST_RESOURCE_ERROR_OPEN_WRITE:
2719                                 _mmcam_dbg_err("Camera device [open failed]");
2720                                 hcamcorder->error_code = MM_ERROR_COMMON_INVALID_PERMISSION;
2721                                 //sc->error_code = MM_ERROR_CAMCORDER_DEVICE_OPEN; // SECURITY PART REQUEST PRIVILEGE
2722                                 break;
2723                         case GST_RESOURCE_ERROR_OPEN_READ_WRITE:
2724                                 _mmcam_dbg_err("Camera device [open failed]");
2725                                 hcamcorder->error_code = MM_ERROR_CAMCORDER_DEVICE_OPEN;
2726                                 break;
2727                         case GST_RESOURCE_ERROR_OPEN_READ:
2728                                 _mmcam_dbg_err("Camera device [register trouble]");
2729                                 hcamcorder->error_code = MM_ERROR_CAMCORDER_DEVICE_REG_TROUBLE;
2730                                 break;
2731                         case GST_RESOURCE_ERROR_NOT_FOUND:
2732                                 _mmcam_dbg_err("Camera device [device not found]");
2733                                 hcamcorder->error_code = MM_ERROR_CAMCORDER_DEVICE_NOT_FOUND;
2734                                 break;
2735                         case GST_RESOURCE_ERROR_TOO_LAZY:
2736                                 _mmcam_dbg_err("Camera device [timeout]");
2737                                 hcamcorder->error_code = MM_ERROR_CAMCORDER_DEVICE_TIMEOUT;
2738                                 break;
2739                         case GST_RESOURCE_ERROR_SETTINGS:
2740                                 _mmcam_dbg_err("Camera device [not supported]");
2741                                 hcamcorder->error_code = MM_ERROR_CAMCORDER_NOT_SUPPORTED;
2742                                 break;
2743                         case GST_RESOURCE_ERROR_FAILED:
2744                                 _mmcam_dbg_err("Camera device [working failed].");
2745                                 hcamcorder->error_code = MM_ERROR_CAMCORDER_DEVICE_IO;
2746                                 break;
2747                         default:
2748                                 _mmcam_dbg_err("Camera device [General(%d)]", err->code);
2749                                 hcamcorder->error_code = MM_ERROR_CAMCORDER_DEVICE;
2750                                 break;
2751                         }
2752
2753                         hcamcorder->error_occurs = TRUE;
2754                 }
2755
2756                 g_error_free(err);
2757
2758                 /* store error code and drop this message if cmd is running */
2759                 if (hcamcorder->error_code != MM_ERROR_NONE) {
2760                         _MMCamcorderMsgItem msg;
2761
2762                         /* post error to application */
2763                         hcamcorder->error_occurs = TRUE;
2764                         msg.id = MM_MESSAGE_CAMCORDER_ERROR;
2765                         msg.param.code = hcamcorder->error_code;
2766                         _mmcamcorder_send_message((MMHandleType)hcamcorder, &msg);
2767
2768                         goto DROP_MESSAGE;
2769                 }
2770         } else if (GST_MESSAGE_TYPE(message) == GST_MESSAGE_ELEMENT) {
2771                 _MMCamcorderMsgItem msg;
2772
2773                 if (gst_structure_has_name(gst_message_get_structure(message), "avsysvideosrc-AF") ||
2774                     gst_structure_has_name(gst_message_get_structure(message), "camerasrc-AF")) {
2775                         int focus_state = 0;
2776
2777                         gst_structure_get_int(gst_message_get_structure(message), "focus-state", &focus_state);
2778                         _mmcam_dbg_log("Focus State:%d", focus_state);
2779
2780                         msg.id = MM_MESSAGE_CAMCORDER_FOCUS_CHANGED;
2781                         msg.param.code = focus_state;
2782                         _mmcamcorder_send_message((MMHandleType)hcamcorder, &msg);
2783
2784                         goto DROP_MESSAGE;
2785                 } else if (gst_structure_has_name(gst_message_get_structure(message), "camerasrc-HDR")) {
2786                         int progress = 0;
2787                         int status = 0;
2788
2789                         if (gst_structure_get_int(gst_message_get_structure(message), "progress", &progress)) {
2790                                 gst_structure_get_int(gst_message_get_structure(message), "status", &status);
2791                                 _mmcam_dbg_log("HDR progress %d percent, status %d", progress, status);
2792
2793                                 msg.id = MM_MESSAGE_CAMCORDER_HDR_PROGRESS;
2794                                 msg.param.code = progress;
2795                                 _mmcamcorder_send_message((MMHandleType)hcamcorder, &msg);
2796                         }
2797
2798                         goto DROP_MESSAGE;
2799                 } else if (gst_structure_has_name(gst_message_get_structure(message), "camerasrc-FD")) {
2800                         int i = 0;
2801                         const GValue *g_value = gst_structure_get_value(gst_message_get_structure(message), "face-info");;
2802                         GstCameraControlFaceDetectInfo *fd_info = NULL;
2803                         MMCamFaceDetectInfo *cam_fd_info = NULL;
2804
2805                         if (g_value) {
2806                                 fd_info = (GstCameraControlFaceDetectInfo *)g_value_get_pointer(g_value);
2807                         }
2808
2809                         if (fd_info == NULL) {
2810                                 _mmcam_dbg_warn("fd_info is NULL");
2811                                 goto DROP_MESSAGE;
2812                         }
2813
2814                         cam_fd_info = (MMCamFaceDetectInfo *)g_malloc(sizeof(MMCamFaceDetectInfo));
2815                         if (cam_fd_info == NULL) {
2816                                 _mmcam_dbg_warn("cam_fd_info alloc failed");
2817                                 SAFE_FREE(fd_info);
2818                                 goto DROP_MESSAGE;
2819                         }
2820
2821                         /* set total face count */
2822                         cam_fd_info->num_of_faces = fd_info->num_of_faces;
2823
2824                         if (cam_fd_info->num_of_faces > 0) {
2825                                 cam_fd_info->face_info = (MMCamFaceInfo *)g_malloc(sizeof(MMCamFaceInfo) * cam_fd_info->num_of_faces);
2826                                 if (cam_fd_info->face_info) {
2827                                         /* set information of each face */
2828                                         for (i = 0 ; i < fd_info->num_of_faces ; i++) {
2829                                                 cam_fd_info->face_info[i].id = fd_info->face_info[i].id;
2830                                                 cam_fd_info->face_info[i].score = fd_info->face_info[i].score;
2831                                                 cam_fd_info->face_info[i].rect.x = fd_info->face_info[i].rect.x;
2832                                                 cam_fd_info->face_info[i].rect.y = fd_info->face_info[i].rect.y;
2833                                                 cam_fd_info->face_info[i].rect.width = fd_info->face_info[i].rect.width;
2834                                                 cam_fd_info->face_info[i].rect.height = fd_info->face_info[i].rect.height;
2835                                                 /*
2836                                                 _mmcam_dbg_log("id %d, score %d, [%d,%d,%dx%d]",
2837                                                                fd_info->face_info[i].id,
2838                                                                fd_info->face_info[i].score,
2839                                                                fd_info->face_info[i].rect.x,
2840                                                                fd_info->face_info[i].rect.y,
2841                                                                fd_info->face_info[i].rect.width,
2842                                                                fd_info->face_info[i].rect.height);
2843                                                 */
2844                                         }
2845                                 } else {
2846                                         _mmcam_dbg_warn("MMCamFaceInfo alloc failed");
2847
2848                                         /* free allocated memory that is not sent */
2849                                         SAFE_G_FREE(cam_fd_info);
2850                                 }
2851                         } else {
2852                                 cam_fd_info->face_info = NULL;
2853                         }
2854
2855                         if (cam_fd_info) {
2856                                 /* send message  - cam_fd_info should be freed by application */
2857                                 msg.id = MM_MESSAGE_CAMCORDER_FACE_DETECT_INFO;
2858                                 msg.param.data = cam_fd_info;
2859                                 msg.param.size = sizeof(MMCamFaceDetectInfo);
2860                                 msg.param.code = 0;
2861
2862                                 _mmcamcorder_send_message((MMHandleType)hcamcorder, &msg);
2863                         }
2864
2865                         /* free fd_info allocated by plugin */
2866                         free(fd_info);
2867                         fd_info = NULL;
2868
2869                         goto DROP_MESSAGE;
2870                 } else if (gst_structure_has_name(gst_message_get_structure(message), "camerasrc-Capture")) {
2871                         int capture_done = FALSE;
2872
2873                         if (gst_structure_get_int(gst_message_get_structure(message), "capture-done", &capture_done)) {
2874                                 sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
2875                                 if (sc && sc->info_image) {
2876                                         /* play capture sound */
2877                                         _mmcamcorder_sound_solo_play((MMHandleType)hcamcorder, _MMCAMCORDER_SAMPLE_SOUND_NAME_CAPTURE01, FALSE);
2878                                 }
2879                         }
2880
2881                         goto DROP_MESSAGE;
2882                 }
2883         }
2884
2885         return GST_BUS_PASS;
2886 DROP_MESSAGE:
2887         gst_message_unref(message);
2888         message = NULL;
2889
2890         return GST_BUS_DROP;
2891 }
2892
2893
2894 GstBusSyncReply _mmcamcorder_audio_pipeline_bus_sync_callback(GstBus *bus, GstMessage *message, gpointer data)
2895 {
2896         GstElement *element = NULL;
2897         GError *err = NULL;
2898         gchar *debug_info = NULL;
2899
2900         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(data);
2901         _MMCamcorderSubContext *sc = NULL;
2902
2903         mmf_return_val_if_fail(hcamcorder, GST_BUS_PASS);
2904         mmf_return_val_if_fail(message, GST_BUS_PASS);
2905
2906         sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
2907         mmf_return_val_if_fail(sc, GST_BUS_PASS);
2908
2909         if (GST_MESSAGE_TYPE(message) == GST_MESSAGE_ERROR) {
2910                 /* parse error message */
2911                 gst_message_parse_error(message, &err, &debug_info);
2912
2913                 if (debug_info) {
2914                         _mmcam_dbg_err("GST ERROR : %s", debug_info);
2915                         g_free(debug_info);
2916                         debug_info = NULL;
2917                 }
2918
2919                 if (!err) {
2920                         _mmcam_dbg_warn("failed to parse error message");
2921                         return GST_BUS_PASS;
2922                 }
2923
2924                 /* set videosrc element to compare */
2925                 element = GST_ELEMENT_CAST(sc->encode_element[_MMCAMCORDER_AUDIOSRC_SRC].gst);
2926
2927                 /* check domain[RESOURCE] and element[VIDEOSRC] */
2928                 if (err->domain == GST_RESOURCE_ERROR &&
2929                     GST_ELEMENT_CAST(message->src) == element) {
2930                         _MMCamcorderMsgItem msg;
2931                         switch (err->code) {
2932                         case GST_RESOURCE_ERROR_OPEN_READ_WRITE:
2933                         case GST_RESOURCE_ERROR_OPEN_WRITE:
2934                                 _mmcam_dbg_err("audio device [open failed]");
2935                                 hcamcorder->error_code = MM_ERROR_COMMON_INVALID_PERMISSION;
2936                                 /* post error to application */
2937                                 hcamcorder->error_occurs = TRUE;
2938                                 msg.id = MM_MESSAGE_CAMCORDER_ERROR;
2939                                 msg.param.code = hcamcorder->error_code;
2940                                 _mmcam_dbg_err(" error : sc->error_occurs %d", hcamcorder->error_occurs);
2941                                 g_error_free(err);
2942                                 _mmcamcorder_send_message((MMHandleType)hcamcorder, &msg);
2943                                 gst_message_unref(message);
2944                                 message = NULL;
2945                                 return GST_BUS_DROP;
2946                         default:
2947                                 break;
2948                         }
2949                 }
2950
2951                 g_error_free(err);
2952
2953         }
2954
2955         return GST_BUS_PASS;
2956 }
2957
2958
2959 void _mmcamcorder_sound_focus_cb(int id, mm_sound_focus_type_e focus_type,
2960                                  mm_sound_focus_state_e focus_state, const char *reason_for_change,
2961                                  const char *additional_info, void *user_data)
2962 {
2963         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(user_data);
2964         int current_state = MM_CAMCORDER_STATE_NONE;
2965
2966         mmf_return_if_fail((MMHandleType)hcamcorder);
2967
2968         current_state = _mmcamcorder_get_state((MMHandleType)hcamcorder);
2969         if (current_state <= MM_CAMCORDER_STATE_NONE ||
2970             current_state >= MM_CAMCORDER_STATE_NUM) {
2971                 _mmcam_dbg_err("Abnormal state. Or null handle. (%p, %d)", hcamcorder, current_state);
2972                 return;
2973         }
2974
2975         _mmcam_dbg_log("sound focus callback : focus state %d, reason %s",
2976                        focus_state, reason_for_change ? reason_for_change : "N/A");
2977
2978         if (hcamcorder->session_flags & MM_SESSION_OPTION_UNINTERRUPTIBLE) {
2979                 _mmcam_dbg_warn("session flag is UNINTERRUPTIBLE. do nothing.");
2980                 return;
2981         }
2982
2983         _MMCAMCORDER_LOCK_ASM(hcamcorder);
2984
2985         /* set value to inform a status is changed by asm */
2986         hcamcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_BY_ASM;
2987
2988         /* check the reason */
2989         if (!strncmp(reason_for_change, "ringtone-voip", __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN) ||
2990             !strncmp(reason_for_change, "ringtone-call", __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN) ||
2991             !strncmp(reason_for_change, "voip", __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN) ||
2992             !strncmp(reason_for_change, "call-voice", __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN)) {
2993                 hcamcorder->interrupt_code = MM_MSG_CODE_INTERRUPTED_BY_CALL_START;
2994         } else if (!strncmp(reason_for_change, "alarm", __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN)) {
2995                 hcamcorder->interrupt_code = MM_MSG_CODE_INTERRUPTED_BY_ALARM_START;
2996         } else {
2997                 hcamcorder->interrupt_code = MM_MSG_CODE_INTERRUPTED_BY_MEDIA;
2998         }
2999
3000         if (focus_state == FOCUS_IS_RELEASED) {
3001                 hcamcorder->acquired_focus &= ~focus_type;
3002
3003                 _mmcam_dbg_log("FOCUS is released [type %d, remained focus %d] : Stop pipeline[state:%d]",
3004                                focus_type, hcamcorder->acquired_focus, current_state);
3005
3006                 __mmcamcorder_force_stop(hcamcorder);
3007
3008                 _mmcam_dbg_log("Finish opeartion. Pipeline is released");
3009         } else if (focus_state == FOCUS_IS_ACQUIRED) {
3010                 _MMCamcorderMsgItem msg;
3011
3012                 hcamcorder->acquired_focus |= focus_type;
3013
3014                 _mmcam_dbg_log("FOCUS is acquired [type %d, new focus %d]",
3015                                focus_type, hcamcorder->acquired_focus);
3016
3017                 msg.id = MM_MESSAGE_READY_TO_RESUME;
3018                 _mmcamcorder_send_message((MMHandleType)hcamcorder, &msg);
3019
3020                 _mmcam_dbg_log("Finish opeartion");
3021         } else {
3022                 _mmcam_dbg_log("unknown focus state %d", focus_state);
3023         }
3024
3025         /* restore value */
3026         hcamcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_NORMAL;
3027
3028         _MMCAMCORDER_UNLOCK_ASM(hcamcorder);
3029
3030         return;
3031 }
3032
3033
3034 void _mmcamcorder_sound_focus_watch_cb(mm_sound_focus_type_e focus_type, mm_sound_focus_state_e focus_state,
3035                                        const char *reason_for_change, const char *additional_info, void *user_data)
3036 {
3037         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(user_data);
3038         int current_state = MM_CAMCORDER_STATE_NONE;
3039
3040         mmf_return_if_fail((MMHandleType)hcamcorder);
3041
3042         current_state = _mmcamcorder_get_state((MMHandleType)hcamcorder);
3043         if (current_state <= MM_CAMCORDER_STATE_NONE ||
3044             current_state >= MM_CAMCORDER_STATE_NUM) {
3045                 _mmcam_dbg_err("Abnormal state. Or null handle. (%p, %d)", hcamcorder, current_state);
3046                 return;
3047         }
3048
3049         _mmcam_dbg_log("sound focus watch callback : focus state %d, reason %s",
3050                        focus_state, reason_for_change ? reason_for_change : "N/A");
3051
3052         if (hcamcorder->session_flags & MM_SESSION_OPTION_UNINTERRUPTIBLE) {
3053                 _mmcam_dbg_warn("session flag is UNINTERRUPTIBLE. do nothing.");
3054                 return;
3055         }
3056
3057         _MMCAMCORDER_LOCK_ASM(hcamcorder);
3058
3059         /* set value to inform a status is changed by asm */
3060         hcamcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_BY_ASM;
3061
3062         /* check the reason */
3063         if (!strncmp(reason_for_change, "ringtone-voip", __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN) ||
3064             !strncmp(reason_for_change, "ringtone-call", __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN) ||
3065             !strncmp(reason_for_change, "voip", __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN) ||
3066             !strncmp(reason_for_change, "call-voice", __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN)) {
3067                 hcamcorder->interrupt_code = MM_MSG_CODE_INTERRUPTED_BY_CALL_START;
3068         } else if (!strncmp(reason_for_change, "alarm", __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN)) {
3069                 hcamcorder->interrupt_code = MM_MSG_CODE_INTERRUPTED_BY_ALARM_START;
3070         } else {
3071                 hcamcorder->interrupt_code = MM_MSG_CODE_INTERRUPTED_BY_MEDIA;
3072         }
3073
3074         if (focus_state == FOCUS_IS_RELEASED) {
3075                 _MMCamcorderMsgItem msg;
3076
3077                 _mmcam_dbg_log("other process's FOCUS is acquired");
3078
3079                 msg.id = MM_MESSAGE_READY_TO_RESUME;
3080                 _mmcamcorder_send_message((MMHandleType)hcamcorder, &msg);
3081
3082                 _mmcam_dbg_log("Finish opeartion");
3083         } else if (focus_state == FOCUS_IS_ACQUIRED) {
3084                 _mmcam_dbg_log("other process's FOCUS is released : Stop pipeline[state:%d]", current_state);
3085
3086                 __mmcamcorder_force_stop(hcamcorder);
3087
3088                 _mmcam_dbg_log("Finish opeartion. Pipeline is released");
3089         } else {
3090                 _mmcam_dbg_log("unknown focus state %d", focus_state);
3091         }
3092
3093         /* restore value */
3094         hcamcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_NORMAL;
3095
3096         _MMCAMCORDER_UNLOCK_ASM(hcamcorder);
3097
3098         return;
3099 }
3100
3101
3102 int _mmcamcorder_create_pipeline(MMHandleType handle, int type)
3103 {
3104         int ret = MM_ERROR_NONE;
3105         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3106         _MMCamcorderSubContext *sc = NULL;
3107         GstElement *pipeline = NULL;
3108
3109         _mmcam_dbg_log("handle : %x, type : %d", handle, type);
3110
3111         mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3112
3113         sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3114         mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3115
3116         switch (type) {
3117         case MM_CAMCORDER_MODE_AUDIO:
3118                 ret = _mmcamcorder_create_audio_pipeline(handle);
3119                 if (ret != MM_ERROR_NONE) {
3120                         return ret;
3121                 }
3122                 break;
3123         case MM_CAMCORDER_MODE_VIDEO_CAPTURE:
3124         default:
3125                 ret = _mmcamcorder_create_preview_pipeline(handle);
3126                 if (ret != MM_ERROR_NONE) {
3127                         return ret;
3128                 }
3129
3130                 /* connect capture signal */
3131                 if (!sc->bencbin_capture) {
3132                         ret = _mmcamcorder_connect_capture_signal(handle);
3133                         if (ret != MM_ERROR_NONE) {
3134                                 return ret;
3135                         }
3136                 }
3137                 break;
3138         }
3139
3140         pipeline = sc->element[_MMCAMCORDER_MAIN_PIPE].gst;
3141         if (type != MM_CAMCORDER_MODE_AUDIO) {
3142                 traceBegin(TTRACE_TAG_CAMERA, "MMCAMCORDER:REALIZE:SET_READY_TO_PIPELINE");
3143
3144                 ret = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_READY);
3145
3146                 traceEnd(TTRACE_TAG_CAMERA);
3147         }
3148 #ifdef _MMCAMCORDER_GET_DEVICE_INFO
3149         if (!_mmcamcorder_get_device_info(handle)) {
3150                 _mmcam_dbg_err("Getting device information error!!");
3151         }
3152 #endif
3153
3154         _mmcam_dbg_log("ret[%x]", ret);
3155         if (ret != MM_ERROR_NONE) {
3156                 _mmcam_dbg_err("error : destroy pipeline");
3157                 _mmcamcorder_destroy_pipeline(handle, hcamcorder->type);
3158         }
3159
3160         return ret;
3161 }
3162
3163
3164 void _mmcamcorder_destroy_pipeline(MMHandleType handle, int type)
3165 {
3166         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3167         _MMCamcorderSubContext *sc = NULL;
3168         gint i = 0;
3169         int element_num = 0;
3170         _MMCamcorderGstElement *element = NULL;
3171         GstBus *bus = NULL;
3172
3173         mmf_return_if_fail(hcamcorder);
3174
3175         sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3176         mmf_return_if_fail(sc);
3177
3178         _mmcam_dbg_log("");
3179
3180         /* Inside each pipeline destroy function, Set GST_STATE_NULL to Main pipeline */
3181         switch (type) {
3182         case MM_CAMCORDER_MODE_VIDEO_CAPTURE:
3183                 element = sc->element;
3184                 element_num = sc->element_num;
3185                 bus = gst_pipeline_get_bus(GST_PIPELINE(sc->element[_MMCAMCORDER_MAIN_PIPE].gst));
3186                 _mmcamcorder_destroy_video_capture_pipeline(handle);
3187                 break;
3188         case MM_CAMCORDER_MODE_AUDIO:
3189                 element = sc->encode_element;
3190                 element_num = sc->encode_element_num;
3191                 bus = gst_pipeline_get_bus(GST_PIPELINE(sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst));
3192                 _mmcamcorder_destroy_audio_pipeline(handle);
3193                 break;
3194         default:
3195                 _mmcam_dbg_err("unknown type %d", type);
3196                 break;
3197         }
3198
3199         _mmcam_dbg_log("Pipeline clear!!");
3200
3201         /* Remove pipeline message callback */
3202         if (hcamcorder->pipeline_cb_event_id > 0) {
3203                 g_source_remove(hcamcorder->pipeline_cb_event_id);
3204                 hcamcorder->pipeline_cb_event_id = 0;
3205         }
3206
3207         /* Remove remained message in bus */
3208         if (bus) {
3209                 GstMessage *gst_msg = NULL;
3210                 while ((gst_msg = gst_bus_pop(bus)) != NULL) {
3211                         _mmcamcorder_pipeline_cb_message(bus, gst_msg, (gpointer)hcamcorder);
3212                         gst_message_unref( gst_msg );
3213                         gst_msg = NULL;
3214                 }
3215                 gst_object_unref( bus );
3216                 bus = NULL;
3217         }
3218
3219         /* checking unreleased element */
3220         for (i = 0 ; i < element_num ; i++ ) {
3221                 if (element[i].gst) {
3222                         if (GST_IS_ELEMENT(element[i].gst)) {
3223                                 _mmcam_dbg_warn("Still alive element - ID[%d], name [%s], ref count[%d], status[%s]",
3224                                                 element[i].id,
3225                                                 GST_OBJECT_NAME(element[i].gst),
3226                                                 GST_OBJECT_REFCOUNT(element[i].gst),
3227                                                 gst_element_state_get_name(GST_STATE(element[i].gst)));
3228                                 g_object_weak_unref(G_OBJECT(element[i].gst), (GWeakNotify)_mmcamcorder_element_release_noti, sc);
3229                         } else {
3230                                 _mmcam_dbg_warn("The element[%d] is still aliving, check it", element[i].id);
3231                         }
3232
3233                         element[i].id = _MMCAMCORDER_NONE;
3234                         element[i].gst = NULL;
3235                 }
3236         }
3237
3238         return;
3239 }
3240
3241
3242 int _mmcamcorder_gst_set_state_async(MMHandleType handle, GstElement *pipeline, GstState target_state)
3243 {
3244         GstStateChangeReturn setChangeReturn = GST_STATE_CHANGE_FAILURE;
3245
3246         _MMCAMCORDER_LOCK_GST_STATE(handle);
3247         setChangeReturn = gst_element_set_state(pipeline, target_state);
3248         _MMCAMCORDER_UNLOCK_GST_STATE(handle);
3249
3250         return setChangeReturn;
3251 }
3252
3253
3254 #ifdef _MMCAMCORDER_USE_SET_ATTR_CB
3255 static gboolean __mmcamcorder_set_attr_to_camsensor_cb(gpointer data)
3256 {
3257         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(data);
3258
3259         mmf_return_val_if_fail(hcamcorder, FALSE);
3260
3261         _mmcam_dbg_log("");
3262
3263         _mmcamcorder_set_attribute_to_camsensor((MMHandleType)hcamcorder);
3264
3265         /* initialize */
3266         hcamcorder->setting_event_id = 0;
3267
3268         _mmcam_dbg_log("Done");
3269
3270         /* once */
3271         return FALSE;
3272 }
3273 #endif /* _MMCAMCORDER_USE_SET_ATTR_CB */
3274
3275
3276 int _mmcamcorder_gst_set_state(MMHandleType handle, GstElement *pipeline, GstState target_state)
3277 {
3278         unsigned int k = 0;
3279         _MMCamcorderSubContext *sc = NULL;
3280         GstState pipeline_state = GST_STATE_VOID_PENDING;
3281         GstStateChangeReturn setChangeReturn = GST_STATE_CHANGE_FAILURE;
3282         GstStateChangeReturn getChangeReturn = GST_STATE_CHANGE_FAILURE;
3283         GstClockTime get_timeout = __MMCAMCORDER_SET_GST_STATE_TIMEOUT * GST_SECOND;
3284         GMutex *state_lock = NULL;
3285
3286         mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3287         sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3288         mmf_return_val_if_fail(sc && sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3289
3290         if (sc->element[_MMCAMCORDER_MAIN_PIPE].gst == pipeline) {
3291                 _mmcam_dbg_log("Set state to %d - PREVIEW PIPELINE", target_state);
3292                 state_lock = &_MMCAMCORDER_GET_GST_STATE_LOCK(handle);
3293         } else {
3294                 _mmcam_dbg_log("Set state to %d - ENDODE PIPELINE", target_state);
3295                 state_lock = &_MMCAMCORDER_GET_GST_ENCODE_STATE_LOCK(handle);
3296         }
3297
3298         g_mutex_lock(state_lock);
3299
3300         for (k = 0; k < _MMCAMCORDER_STATE_SET_COUNT; k++) {
3301                 setChangeReturn = gst_element_set_state(pipeline, target_state);
3302                 _mmcam_dbg_log("gst_element_set_state[%d] return %d",
3303                                target_state, setChangeReturn);
3304                 if (setChangeReturn != GST_STATE_CHANGE_FAILURE) {
3305                         getChangeReturn = gst_element_get_state(pipeline, &pipeline_state, NULL, get_timeout);
3306                         switch (getChangeReturn) {
3307                         case GST_STATE_CHANGE_NO_PREROLL:
3308                                 _mmcam_dbg_log("status=GST_STATE_CHANGE_NO_PREROLL.");
3309                         case GST_STATE_CHANGE_SUCCESS:
3310                                 /* if we reached the final target state, exit */
3311                                 if (pipeline_state == target_state) {
3312                                         _mmcam_dbg_log("Set state to %d - DONE", target_state);
3313                                         g_mutex_unlock(state_lock);
3314                                         return MM_ERROR_NONE;
3315                                 }
3316                                 break;
3317                         case GST_STATE_CHANGE_ASYNC:
3318                                 _mmcam_dbg_log("status=GST_STATE_CHANGE_ASYNC.");
3319                                 break;
3320                         default:
3321                                 g_mutex_unlock(state_lock);
3322                                 _mmcam_dbg_log("status=GST_STATE_CHANGE_FAILURE.");
3323                                 return MM_ERROR_CAMCORDER_GST_STATECHANGE;
3324                         }
3325
3326                         g_mutex_unlock(state_lock);
3327
3328                         _mmcam_dbg_err("timeout of gst_element_get_state()!!");
3329
3330                         return MM_ERROR_CAMCORDER_RESPONSE_TIMEOUT;
3331                 }
3332
3333                 usleep(_MMCAMCORDER_STATE_CHECK_INTERVAL);
3334         }
3335
3336         g_mutex_unlock(state_lock);
3337
3338         _mmcam_dbg_err("Failure. gst_element_set_state timeout!!");
3339
3340         return MM_ERROR_CAMCORDER_RESPONSE_TIMEOUT;
3341 }
3342
3343
3344 /* For performance check */
3345 int _mmcamcorder_video_current_framerate(MMHandleType handle)
3346 {
3347         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3348         _MMCamcorderSubContext *sc = NULL;
3349
3350         mmf_return_val_if_fail(hcamcorder, -1);
3351
3352         sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3353         mmf_return_val_if_fail(sc, -1);
3354
3355         return sc->kpi.current_fps;
3356 }
3357
3358
3359 int _mmcamcorder_video_average_framerate(MMHandleType handle)
3360 {
3361         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3362         _MMCamcorderSubContext *sc = NULL;
3363
3364         mmf_return_val_if_fail(hcamcorder, -1);
3365
3366         sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3367         mmf_return_val_if_fail(sc, -1);
3368
3369         return sc->kpi.average_fps;
3370 }
3371
3372
3373 void _mmcamcorder_video_current_framerate_init(MMHandleType handle)
3374 {
3375         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3376         _MMCamcorderSubContext *sc = NULL;
3377
3378         mmf_return_if_fail(hcamcorder);
3379
3380         sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3381         mmf_return_if_fail(sc);
3382
3383         memset(&(sc->kpi), 0x00, sizeof(_MMCamcorderKPIMeasure));
3384
3385         return;
3386 }
3387
3388
3389 void __mmcamcorder_force_stop(mmf_camcorder_t *hcamcorder)
3390 {
3391         int i = 0;
3392         int loop = 0;
3393         int itr_cnt = 0;
3394         int result = MM_ERROR_NONE;
3395         int cmd_try_count = 0;
3396         int current_state = MM_CAMCORDER_STATE_NONE;
3397
3398         mmf_return_if_fail(hcamcorder);
3399
3400         /* check command running */
3401         do {
3402                 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
3403                         if (cmd_try_count++ < __MMCAMCORDER_FORCE_STOP_TRY_COUNT) {
3404                                 _mmcam_dbg_warn("Another command is running. try again after %d ms", __MMCAMCORDER_FORCE_STOP_WAIT_TIME/1000);
3405                                 usleep(__MMCAMCORDER_FORCE_STOP_WAIT_TIME);
3406                         } else {
3407                                 _mmcam_dbg_err("wait timeout");
3408                                 break;
3409                         }
3410                 } else {
3411                         _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
3412                         break;
3413                 }
3414         } while (TRUE);
3415
3416         current_state = _mmcamcorder_get_state((MMHandleType)hcamcorder);
3417
3418         _mmcam_dbg_warn("Force STOP MMFW Camcorder");
3419
3420         for (loop = 0 ; current_state > MM_CAMCORDER_STATE_NULL && loop < __MMCAMCORDER_CMD_ITERATE_MAX * 3 ; loop++) {
3421                 itr_cnt = __MMCAMCORDER_CMD_ITERATE_MAX;
3422                 switch (current_state) {
3423                 case MM_CAMCORDER_STATE_CAPTURING:
3424                 {
3425                         _MMCamcorderSubContext *sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
3426                         _MMCamcorderImageInfo *info = NULL;
3427
3428                         mmf_return_if_fail(sc);
3429                         mmf_return_if_fail((info = sc->info_image));
3430
3431                         _mmcam_dbg_warn("Stop capturing.");
3432
3433                         /* if caturing isn't finished, waiting for 2 sec to finish real capture operation. check 'info->capturing'. */
3434                         mm_camcorder_set_attributes((MMHandleType)hcamcorder, NULL,
3435                                                     MMCAM_CAPTURE_BREAK_CONTINUOUS_SHOT, TRUE,
3436                                                     NULL);
3437
3438                         for (i = 0; i < 20 && info->capturing; i++) {
3439                                 usleep(100000);
3440                         }
3441
3442                         if (i == 20) {
3443                                 _mmcam_dbg_err("Timeout. Can't check stop capturing.");
3444                         }
3445
3446                         while ((itr_cnt--) && ((result = _mmcamcorder_capture_stop((MMHandleType)hcamcorder)) != MM_ERROR_NONE)) {
3447                                         _mmcam_dbg_warn("Can't stop capturing.(%x)", result);
3448                         }
3449
3450                         break;
3451                 }
3452                 case MM_CAMCORDER_STATE_RECORDING:
3453                 case MM_CAMCORDER_STATE_PAUSED:
3454                 {
3455                         _mmcam_dbg_warn("Stop recording.");
3456
3457                         while ((itr_cnt--) && ((result = _mmcamcorder_commit((MMHandleType)hcamcorder)) != MM_ERROR_NONE)) {
3458                                 _mmcam_dbg_warn("Can't commit.(%x)", result);
3459                         }
3460                         break;
3461                 }
3462                 case MM_CAMCORDER_STATE_PREPARE:
3463                 {
3464                         _mmcam_dbg_warn("Stop preview.");
3465
3466                         while ((itr_cnt--) && ((result = _mmcamcorder_stop((MMHandleType)hcamcorder)) != MM_ERROR_NONE)) {
3467                                 _mmcam_dbg_warn("Can't stop preview.(%x)", result);
3468                         }
3469                         break;
3470                 }
3471                 case MM_CAMCORDER_STATE_READY:
3472                 {
3473                         _mmcam_dbg_warn("unrealize");
3474
3475                         if ((result = _mmcamcorder_unrealize((MMHandleType)hcamcorder)) != MM_ERROR_NONE) {
3476                                 _mmcam_dbg_warn("Can't unrealize.(%x)", result);
3477                         }
3478                         break;
3479                 }
3480                 case MM_CAMCORDER_STATE_NULL:
3481                 default:
3482                         _mmcam_dbg_warn("Already stopped.");
3483                         break;
3484                 }
3485
3486                 current_state = _mmcamcorder_get_state((MMHandleType)hcamcorder);
3487         }
3488
3489         _mmcam_dbg_warn( "Done." );
3490
3491         return;
3492 }
3493
3494
3495 static gboolean __mmcamcorder_handle_gst_error(MMHandleType handle, GstMessage *message, GError *error)
3496 {
3497         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3498         _MMCamcorderMsgItem msg;
3499         gchar *msg_src_element;
3500         _MMCamcorderSubContext *sc = NULL;
3501
3502         return_val_if_fail(hcamcorder, FALSE);
3503         return_val_if_fail(error, FALSE);
3504         sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3505         mmf_return_val_if_fail(sc, FALSE);
3506
3507         _mmcam_dbg_log("");
3508
3509         /* filtering filesink related errors */
3510         if (hcamcorder->state == MM_CAMCORDER_STATE_RECORDING &&
3511             (error->code ==  GST_RESOURCE_ERROR_WRITE || error->code ==  GST_RESOURCE_ERROR_SEEK)) {
3512                 if (sc->ferror_count == 2 && sc->ferror_send == FALSE) {
3513                         sc->ferror_send = TRUE;
3514                         msg.param.code = __mmcamcorder_gst_handle_resource_error(handle, error->code, message);
3515                 } else {
3516                         sc->ferror_count++;
3517                         _mmcam_dbg_warn("Skip error");
3518                         return TRUE;
3519                 }
3520         }
3521
3522         if (error->domain == GST_CORE_ERROR) {
3523                 msg.param.code = __mmcamcorder_gst_handle_core_error(handle, error->code, message);
3524         } else if (error->domain == GST_LIBRARY_ERROR) {
3525                 msg.param.code = __mmcamcorder_gst_handle_library_error(handle, error->code, message);
3526         } else if (error->domain == GST_RESOURCE_ERROR) {
3527                 msg.param.code = __mmcamcorder_gst_handle_resource_error(handle, error->code, message);
3528         } else if (error->domain == GST_STREAM_ERROR) {
3529                 msg.param.code = __mmcamcorder_gst_handle_stream_error(handle, error->code, message);
3530         } else {
3531                 _mmcam_dbg_warn("This error domain is not defined.");
3532
3533                 /* we treat system error as an internal error */
3534                 msg.param.code = MM_ERROR_CAMCORDER_INTERNAL;
3535         }
3536
3537         if (message->src) {
3538                 msg_src_element = GST_ELEMENT_NAME(GST_ELEMENT_CAST(message->src));
3539                 _mmcam_dbg_err("-Msg src : [%s] Domain : [%s]   Error : [%s]  Code : [%d] is tranlated to error code : [0x%x]",
3540                                msg_src_element, g_quark_to_string (error->domain), error->message, error->code, msg.param.code);
3541         } else {
3542                 _mmcam_dbg_err("Domain : [%s]   Error : [%s]  Code : [%d] is tranlated to error code : [0x%x]",
3543                                g_quark_to_string (error->domain), error->message, error->code, msg.param.code);
3544         }
3545
3546 #ifdef _MMCAMCORDER_SKIP_GST_FLOW_ERROR
3547         /* Check whether send this error to application */
3548         if (msg.param.code == MM_ERROR_CAMCORDER_GST_FLOW_ERROR) {
3549                 _mmcam_dbg_log("We got the error. But skip it.");
3550                 return TRUE;
3551         }
3552 #endif /* _MMCAMCORDER_SKIP_GST_FLOW_ERROR */
3553
3554         /* post error to application */
3555         hcamcorder->error_occurs = TRUE;
3556         msg.id = MM_MESSAGE_CAMCORDER_ERROR;
3557         _mmcamcorder_send_message(handle, &msg);
3558
3559         return TRUE;
3560 }
3561
3562
3563 static gint __mmcamcorder_gst_handle_core_error(MMHandleType handle, int code, GstMessage *message)
3564 {
3565         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3566         _MMCamcorderSubContext *sc = NULL;
3567         GstElement *element = NULL;
3568
3569         _mmcam_dbg_log("");
3570
3571         mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3572
3573         sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3574         mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3575
3576         /* Specific plugin - video encoder plugin */
3577         element = GST_ELEMENT_CAST(sc->encode_element[_MMCAMCORDER_ENCSINK_VENC].gst);
3578
3579         if (GST_ELEMENT_CAST(message->src) == element) {
3580                 if (code == GST_CORE_ERROR_NEGOTIATION) {
3581                         return MM_ERROR_CAMCORDER_GST_NEGOTIATION;
3582                 } else {
3583                         return MM_ERROR_CAMCORDER_ENCODER;
3584                 }
3585         }
3586
3587         /* General */
3588         switch (code)
3589         {
3590                 case GST_CORE_ERROR_STATE_CHANGE:
3591                         return MM_ERROR_CAMCORDER_GST_STATECHANGE;
3592                 case GST_CORE_ERROR_NEGOTIATION:
3593                         return MM_ERROR_CAMCORDER_GST_NEGOTIATION;
3594                 case GST_CORE_ERROR_MISSING_PLUGIN:
3595                 case GST_CORE_ERROR_SEEK:
3596                 case GST_CORE_ERROR_NOT_IMPLEMENTED:
3597                 case GST_CORE_ERROR_FAILED:
3598                 case GST_CORE_ERROR_TOO_LAZY:
3599                 case GST_CORE_ERROR_PAD:
3600                 case GST_CORE_ERROR_THREAD:
3601                 case GST_CORE_ERROR_EVENT:
3602                 case GST_CORE_ERROR_CAPS:
3603                 case GST_CORE_ERROR_TAG:
3604                 case GST_CORE_ERROR_CLOCK:
3605                 case GST_CORE_ERROR_DISABLED:
3606                 default:
3607                         return MM_ERROR_CAMCORDER_GST_CORE;
3608                 break;
3609         }
3610 }
3611
3612 static gint __mmcamcorder_gst_handle_library_error(MMHandleType handle, int code, GstMessage *message)
3613 {
3614         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3615         return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3616
3617         _mmcam_dbg_log("");
3618
3619         /* Specific plugin - NONE */
3620
3621         /* General */
3622         switch (code) {
3623         case GST_LIBRARY_ERROR_FAILED:
3624         case GST_LIBRARY_ERROR_TOO_LAZY:
3625         case GST_LIBRARY_ERROR_INIT:
3626         case GST_LIBRARY_ERROR_SHUTDOWN:
3627         case GST_LIBRARY_ERROR_SETTINGS:
3628         case GST_LIBRARY_ERROR_ENCODE:
3629         default:
3630                 _mmcam_dbg_err("Library error(%d)", code);
3631                 return MM_ERROR_CAMCORDER_GST_LIBRARY;
3632         }
3633 }
3634
3635
3636 static gint __mmcamcorder_gst_handle_resource_error(MMHandleType handle, int code, GstMessage *message)
3637 {
3638         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3639         _MMCamcorderSubContext *sc = NULL;
3640         GstElement *element = NULL;
3641
3642         mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3643
3644         sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3645         mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3646
3647         _mmcam_dbg_log("");
3648
3649         /* Specific plugin */
3650         /* video sink */
3651         element = GST_ELEMENT_CAST(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst);
3652         if (GST_ELEMENT_CAST(message->src) == element) {
3653                 if (code == GST_RESOURCE_ERROR_WRITE) {
3654                         _mmcam_dbg_err("Display device [Off]");
3655                         return MM_ERROR_CAMCORDER_DISPLAY_DEVICE_OFF;
3656                 } else {
3657                         _mmcam_dbg_err("Display device [General(%d)]", code);
3658                 }
3659         }
3660
3661         /* encodebin */
3662         element = GST_ELEMENT_CAST(sc->encode_element[_MMCAMCORDER_ENCSINK_VENC].gst);
3663         if (GST_ELEMENT_CAST(message->src) == element) {
3664                 if (code == GST_RESOURCE_ERROR_FAILED) {
3665                         _mmcam_dbg_err("Encoder [Resource error]");
3666                         return MM_ERROR_CAMCORDER_ENCODER_BUFFER;
3667                 } else {
3668                         _mmcam_dbg_err("Encoder [General(%d)]", code);
3669                         return MM_ERROR_CAMCORDER_ENCODER;
3670                 }
3671         }
3672
3673         /* General */
3674         switch (code) {
3675         case GST_RESOURCE_ERROR_WRITE:
3676                 _mmcam_dbg_err("File write error");
3677                 return MM_ERROR_FILE_WRITE;
3678         case GST_RESOURCE_ERROR_NO_SPACE_LEFT:
3679                 _mmcam_dbg_err("No left space");
3680                 return MM_MESSAGE_CAMCORDER_NO_FREE_SPACE;
3681         case GST_RESOURCE_ERROR_OPEN_WRITE:
3682                 _mmcam_dbg_err("Out of storage");
3683                 return MM_ERROR_OUT_OF_STORAGE;
3684         case GST_RESOURCE_ERROR_SEEK:
3685                 _mmcam_dbg_err("File read(seek)");
3686                 return MM_ERROR_FILE_READ;
3687         case GST_RESOURCE_ERROR_NOT_FOUND:
3688         case GST_RESOURCE_ERROR_FAILED:
3689         case GST_RESOURCE_ERROR_TOO_LAZY:
3690         case GST_RESOURCE_ERROR_BUSY:
3691         case GST_RESOURCE_ERROR_OPEN_READ:
3692         case GST_RESOURCE_ERROR_OPEN_READ_WRITE:
3693         case GST_RESOURCE_ERROR_CLOSE:
3694         case GST_RESOURCE_ERROR_READ:
3695         case GST_RESOURCE_ERROR_SYNC:
3696         case GST_RESOURCE_ERROR_SETTINGS:
3697         default:
3698                 _mmcam_dbg_err("Resource error(%d)", code);
3699                 return MM_ERROR_CAMCORDER_GST_RESOURCE;
3700         }
3701 }
3702
3703
3704 static gint __mmcamcorder_gst_handle_stream_error(MMHandleType handle, int code, GstMessage *message)
3705 {
3706         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3707         _MMCamcorderSubContext *sc = NULL;
3708         GstElement *element =NULL;
3709
3710         mmf_return_val_if_fail( hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED );
3711
3712         sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3713         mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3714
3715         _mmcam_dbg_log("");
3716
3717         /* Specific plugin */
3718         /* video encoder */
3719         element = GST_ELEMENT_CAST(sc->encode_element[_MMCAMCORDER_ENCSINK_VENC].gst);
3720         if (GST_ELEMENT_CAST(message->src) == element) {
3721                 switch (code) {
3722                 case GST_STREAM_ERROR_WRONG_TYPE:
3723                         _mmcam_dbg_err("Video encoder [wrong stream type]");
3724                         return MM_ERROR_CAMCORDER_ENCODER_WRONG_TYPE;
3725                 case GST_STREAM_ERROR_ENCODE:
3726                         _mmcam_dbg_err("Video encoder [encode error]");
3727                         return MM_ERROR_CAMCORDER_ENCODER_WORKING;
3728                 case GST_STREAM_ERROR_FAILED:
3729                         _mmcam_dbg_err("Video encoder [stream failed]");
3730                         return MM_ERROR_CAMCORDER_ENCODER_WORKING;
3731                 default:
3732                         _mmcam_dbg_err("Video encoder [General(%d)]", code);
3733                         return MM_ERROR_CAMCORDER_ENCODER;
3734                 }
3735         }
3736
3737         /* General plugin */
3738         switch (code) {
3739         case GST_STREAM_ERROR_FORMAT:
3740                 _mmcam_dbg_err("General [negotiation error(%d)]", code);
3741                 return MM_ERROR_CAMCORDER_GST_NEGOTIATION;
3742         case GST_STREAM_ERROR_FAILED:
3743                 _mmcam_dbg_err("General [flow error(%d)]", code);
3744                 return MM_ERROR_CAMCORDER_GST_FLOW_ERROR;
3745         case GST_STREAM_ERROR_TYPE_NOT_FOUND:
3746         case GST_STREAM_ERROR_DECODE:
3747         case GST_STREAM_ERROR_CODEC_NOT_FOUND:
3748         case GST_STREAM_ERROR_NOT_IMPLEMENTED:
3749         case GST_STREAM_ERROR_TOO_LAZY:
3750         case GST_STREAM_ERROR_ENCODE:
3751         case GST_STREAM_ERROR_DEMUX:
3752         case GST_STREAM_ERROR_MUX:
3753         case GST_STREAM_ERROR_DECRYPT:
3754         case GST_STREAM_ERROR_DECRYPT_NOKEY:
3755         case GST_STREAM_ERROR_WRONG_TYPE:
3756         default:
3757                 _mmcam_dbg_err("General [error(%d)]", code);
3758                 return MM_ERROR_CAMCORDER_GST_STREAM;
3759         }
3760 }
3761
3762
3763 static gboolean __mmcamcorder_handle_gst_warning (MMHandleType handle, GstMessage *message, GError *error)
3764 {
3765         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3766         gchar *debug = NULL;
3767         GError *err = NULL;
3768
3769         return_val_if_fail(hcamcorder, FALSE);
3770         return_val_if_fail(error, FALSE);
3771
3772         _mmcam_dbg_log("");
3773
3774         gst_message_parse_warning(message, &err, &debug);
3775
3776         if (error->domain == GST_CORE_ERROR) {
3777                 _mmcam_dbg_warn("GST warning: GST_CORE domain");
3778         } else if (error->domain == GST_LIBRARY_ERROR) {
3779                 _mmcam_dbg_warn("GST warning: GST_LIBRARY domain");
3780         } else if (error->domain == GST_RESOURCE_ERROR) {
3781                 _mmcam_dbg_warn("GST warning: GST_RESOURCE domain");
3782                 __mmcamcorder_gst_handle_resource_warning(handle, message, error);
3783         } else if (error->domain == GST_STREAM_ERROR ) {
3784                 _mmcam_dbg_warn("GST warning: GST_STREAM domain");
3785         } else {
3786                 _mmcam_dbg_warn("This error domain(%d) is not defined.", error->domain);
3787         }
3788
3789         if (err != NULL) {
3790                 g_error_free(err);
3791                 err = NULL;
3792         }
3793         if (debug != NULL) {
3794                 _mmcam_dbg_err ("Debug: %s", debug);
3795                 g_free(debug);
3796                 debug = NULL;
3797         }
3798
3799         return TRUE;
3800 }
3801
3802
3803 static gint __mmcamcorder_gst_handle_resource_warning(MMHandleType handle, GstMessage *message , GError *error)
3804 {
3805         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3806         _MMCamcorderSubContext *sc = NULL;
3807         GstElement *element =NULL;
3808         gchar *msg_src_element;
3809
3810         mmf_return_val_if_fail( hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED );
3811
3812         sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3813         mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3814
3815         _mmcam_dbg_log("");
3816
3817         /* Special message handling */
3818         /* video source */
3819         element = GST_ELEMENT_CAST(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
3820         if (GST_ELEMENT_CAST(message->src) == element) {
3821                 if (error->code == GST_RESOURCE_ERROR_FAILED) {
3822                         msg_src_element = GST_ELEMENT_NAME(GST_ELEMENT_CAST(message->src));
3823                         _mmcam_dbg_warn("-Msg src:[%s] Domain:[%s] Error:[%s]",
3824                                        msg_src_element, g_quark_to_string(error->domain), error->message);
3825                         return MM_ERROR_NONE;
3826                 }
3827         }
3828
3829         /* General plugin */
3830         switch (error->code) {
3831         case GST_RESOURCE_ERROR_WRITE:
3832         case GST_RESOURCE_ERROR_NO_SPACE_LEFT:
3833         case GST_RESOURCE_ERROR_SEEK:
3834         case GST_RESOURCE_ERROR_NOT_FOUND:
3835         case GST_RESOURCE_ERROR_FAILED:
3836         case GST_RESOURCE_ERROR_TOO_LAZY:
3837         case GST_RESOURCE_ERROR_BUSY:
3838         case GST_RESOURCE_ERROR_OPEN_READ:
3839         case GST_RESOURCE_ERROR_OPEN_WRITE:
3840         case GST_RESOURCE_ERROR_OPEN_READ_WRITE:
3841         case GST_RESOURCE_ERROR_CLOSE:
3842         case GST_RESOURCE_ERROR_READ:
3843         case GST_RESOURCE_ERROR_SYNC:
3844         case GST_RESOURCE_ERROR_SETTINGS:
3845         default:
3846                 _mmcam_dbg_warn("General GST warning(%d)", error->code);
3847                 break;
3848         }
3849
3850         return MM_ERROR_NONE;
3851 }
3852
3853 int _mmcamcorder_get_video_caps(MMHandleType handle, char **caps)
3854 {
3855         GstPad *pad = NULL;
3856         GstCaps *sink_caps = NULL;
3857         _MMCamcorderSubContext *sc = NULL;
3858
3859         sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3860         _mmcam_dbg_warn("Entered ");
3861         pad = gst_element_get_static_pad(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "sink");
3862         if(!pad) {
3863                 _mmcam_dbg_err("static pad is NULL");
3864                 return MM_ERROR_CAMCORDER_INVALID_STATE;
3865         }
3866
3867         sink_caps = gst_pad_get_current_caps(pad);
3868         gst_object_unref( pad );
3869         if(!sink_caps) {
3870                 _mmcam_dbg_err("fail to get caps");
3871                 return MM_ERROR_CAMCORDER_INVALID_STATE;
3872         }
3873
3874         *caps = gst_caps_to_string(sink_caps);
3875         _mmcam_dbg_err("video caps : %s", *caps);
3876         gst_caps_unref(sink_caps);
3877
3878         return MM_ERROR_NONE;
3879 }