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