4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Jeongmo Yang <jm80.yang@samsung.com>
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
12 * http://www.apache.org/licenses/LICENSE-2.0
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.
22 /*=======================================================================================
24 ========================================================================================*/
29 #include <gst/gstutils.h>
30 #include <gst/gstpad.h>
33 #include "mm_camcorder_internal.h"
36 #include <gst/interfaces/colorbalance.h>
37 #include <gst/interfaces/cameracontrol.h>
38 #include <asm/types.h>
40 #include <mm_session.h>
41 #include <mm_session_private.h>
42 #include <audio-session-manager.h>
44 #include <system_info_internal.h>
46 /*---------------------------------------------------------------------------------------
47 | GLOBAL VARIABLE DEFINITIONS for internal |
48 ---------------------------------------------------------------------------------------*/
50 /*---------------------------------------------------------------------------------------
51 | LOCAL VARIABLE DEFINITIONS for internal |
52 ---------------------------------------------------------------------------------------*/
53 #define __MMCAMCORDER_CMD_ITERATE_MAX 3
54 #define __MMCAMCORDER_SET_GST_STATE_TIMEOUT 3
55 #define __MMCAMCORDER_FORCE_STOP_TRY_COUNT 30
56 #define __MMCAMCORDER_FORCE_STOP_WAIT_TIME 100000 /* us */
57 #define __MMCAMCORDER_SOUND_WAIT_TIMEOUT 3
58 #define __MMCAMCORDER_PATH_CAMERA_RESOURCE "/usr/share/sounds/mm-camcorder/camera_resource"
59 #define __MMCAMCORDER_PATH_RECORDER_RESOURCE "/usr/share/sounds/mm-camcorder/recorder_resource"
61 #define SAFE_G_MUTEX_FREE(x) \
66 #define SAFE_G_COND_FREE(x) \
71 /*---------------------------------------------------------------------------------------
72 | LOCAL FUNCTION PROTOTYPES: |
73 ---------------------------------------------------------------------------------------*/
74 /* STATIC INTERNAL FUNCTION */
75 static gboolean __mmcamcorder_gstreamer_init(camera_conf * conf);
77 static gboolean __mmcamcorder_handle_gst_error(MMHandleType handle, GstMessage *message, GError *error);
78 static gint __mmcamcorder_gst_handle_stream_error(MMHandleType handle, int code, GstMessage *message);
79 static gint __mmcamcorder_gst_handle_resource_error(MMHandleType handle, int code, GstMessage *message);
80 static gint __mmcamcorder_gst_handle_library_error(MMHandleType handle, int code, GstMessage *message);
81 static gint __mmcamcorder_gst_handle_core_error(MMHandleType handle, int code, GstMessage *message);
82 static gint __mmcamcorder_gst_handle_resource_warning(MMHandleType handle, GstMessage *message , GError *error);
83 static gboolean __mmcamcorder_handle_gst_warning(MMHandleType handle, GstMessage *message, GError *error);
85 static void __mmcamcorder_force_stop(mmf_camcorder_t *hcamcorder);
86 static void __mmcamcorder_force_resume(mmf_camcorder_t *hcamcorder);
87 ASM_cb_result_t _mmcamcorder_asm_callback(int handle, ASM_event_sources_t event_src,
88 ASM_sound_commands_t command,
89 unsigned int sound_status, void *cb_data);
91 #ifdef _MMCAMCORDER_USE_SET_ATTR_CB
92 static gboolean __mmcamcorder_set_attr_to_camsensor_cb(gpointer data);
93 #endif /* _MMCAMCORDER_USE_SET_ATTR_CB */
95 /*=======================================================================================
96 | FUNCTION DEFINITIONS |
97 =======================================================================================*/
98 /*---------------------------------------------------------------------------------------
99 | GLOBAL FUNCTION DEFINITIONS: |
100 ---------------------------------------------------------------------------------------*/
102 /* Internal command functions {*/
103 int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info)
105 int ret = MM_ERROR_NONE;
107 int errorcode = MM_ERROR_NONE;
108 int rcmd_fmt_capture = MM_PIXEL_FORMAT_YUYV;
109 int rcmd_fmt_recording = MM_PIXEL_FORMAT_NV12;
110 int rcmd_dpy_rotation = MM_DISPLAY_ROTATION_270;
111 int play_capture_sound = TRUE;
112 int camera_device_count = MM_VIDEO_DEVICE_NUM;
113 int camera_default_flip = MM_FLIP_NONE;
114 int camera_facing_direction = MM_CAMCORDER_CAMERA_FACING_DIRECTION_REAR;
115 int resource_fd = -1;
116 char *err_attr_name = NULL;
117 const char *ConfCtrlFile = NULL;
118 mmf_camcorder_t *hcamcorder = NULL;
119 ASM_resource_t mm_resource = ASM_RESOURCE_NONE;
120 type_element *EvasSurfaceElement = NULL;
122 _mmcam_dbg_log("Entered");
124 mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
125 mmf_return_val_if_fail(info, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
127 /* Create mmf_camcorder_t handle and initialize every variable */
128 hcamcorder = (mmf_camcorder_t *)malloc(sizeof(mmf_camcorder_t));
129 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_LOW_MEMORY);
130 memset(hcamcorder, 0x00, sizeof(mmf_camcorder_t));
133 hcamcorder->type = 0;
134 hcamcorder->state = MM_CAMCORDER_STATE_NONE;
135 hcamcorder->sub_context = NULL;
136 hcamcorder->target_state = MM_CAMCORDER_STATE_NULL;
137 hcamcorder->capture_in_recording = FALSE;
138 hcamcorder->asm_session_type = MM_SESSION_TYPE_RECORD_VIDEO;
139 hcamcorder->asm_handle = -1;
141 /* thread - for g_mutex_new() */
142 if (!g_thread_supported()) {
146 (hcamcorder->mtsafe).lock = g_mutex_new();
147 (hcamcorder->mtsafe).cond = g_cond_new();
149 (hcamcorder->mtsafe).cmd_lock = g_mutex_new();
150 (hcamcorder->mtsafe).asm_lock = g_mutex_new();
151 (hcamcorder->mtsafe).state_lock = g_mutex_new();
152 (hcamcorder->mtsafe).gst_state_lock = g_mutex_new();
153 (hcamcorder->mtsafe).gst_encode_state_lock = g_mutex_new();
154 (hcamcorder->mtsafe).message_cb_lock = g_mutex_new();
155 (hcamcorder->mtsafe).vcapture_cb_lock = g_mutex_new();
156 (hcamcorder->mtsafe).vstream_cb_lock = g_mutex_new();
157 (hcamcorder->mtsafe).astream_cb_lock = g_mutex_new();
159 pthread_mutex_init(&(hcamcorder->sound_lock), NULL);
160 pthread_cond_init(&(hcamcorder->sound_cond), NULL);
161 pthread_mutex_init(&(hcamcorder->restart_preview_lock), NULL);
163 /* Sound mutex/cond init */
164 pthread_mutex_init(&(hcamcorder->snd_info.open_mutex), NULL);
165 pthread_cond_init(&(hcamcorder->snd_info.open_cond), NULL);
167 /* init for sound thread */
168 pthread_mutex_init(&(hcamcorder->task_thread_lock), NULL);
169 pthread_cond_init(&(hcamcorder->task_thread_cond), NULL);
170 hcamcorder->task_thread_state = _MMCAMCORDER_SOUND_STATE_NONE;
172 /* create task thread */
173 pthread_create(&(hcamcorder->task_thread), NULL, _mmcamcorder_util_task_thread_func, (void *)hcamcorder);
175 if (info->videodev_type < MM_VIDEO_DEVICE_NONE ||
176 info->videodev_type >= MM_VIDEO_DEVICE_NUM) {
177 _mmcam_dbg_err("_mmcamcorder_create::video device type is out of range.");
178 ret = MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
179 goto _ERR_DEFAULT_VALUE_INIT;
182 /* set device type */
183 hcamcorder->device_type = info->videodev_type;
184 _mmcam_dbg_warn("Device Type : %d", hcamcorder->device_type);
186 if (hcamcorder->device_type == MM_VIDEO_DEVICE_NONE) {
187 resource_fd = open(__MMCAMCORDER_PATH_RECORDER_RESOURCE, O_RDONLY);
189 resource_fd = open(__MMCAMCORDER_PATH_CAMERA_RESOURCE, O_RDONLY);
192 if (resource_fd < 0) {
193 _mmcam_dbg_log("open error %s : cur %d",strerror(errno),errno);
194 if(errno == EPERM || errno == EACCES) {
195 ret = MM_ERROR_COMMON_INVALID_PERMISSION;
197 ret = MM_ERROR_CAMCORDER_INTERNAL;
199 goto _ERR_DEFAULT_VALUE_INIT;
203 _mmcam_dbg_warn("permission check done");
206 /* Check and register ASM */
207 if (MM_ERROR_NONE != _mm_session_util_read_information(-1, &hcamcorder->asm_session_type, &hcamcorder->asm_session_options)) {
208 _mmcam_dbg_log("_mm_session_util_read_information failed. use default session..");
209 ret = _mm_session_util_write_type(-1, MM_SESSION_TYPE_MEDIA);
211 _mmcam_dbg_err("mm_session_util_write_type() [type %d] failed[%x]", MM_SESSION_TYPE_MEDIA, ret);
212 goto _ERR_DEFAULT_VALUE_INIT;
214 /* register default type */
215 hcamcorder->asm_session_type = MM_SESSION_TYPE_MEDIA;
216 hcamcorder->asm_register = _MMCamcorder_ASM_SESSION_REGISTERED_INTERNALLY;
217 hcamcorder->asm_event_type = ASM_EVENT_MEDIA_MMCAMCORDER;
220 if ((hcamcorder->asm_session_type == MM_SESSION_TYPE_RECORD_AUDIO && info->videodev_type != MM_VIDEO_DEVICE_NONE) ||
221 (hcamcorder->asm_session_type == MM_SESSION_TYPE_RECORD_VIDEO && info->videodev_type == MM_VIDEO_DEVICE_NONE)) {
222 ret = MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
223 goto _ERR_DEFAULT_VALUE_INIT;
225 if (hcamcorder->asm_session_type == MM_SESSION_TYPE_RECORD_VIDEO ||
226 hcamcorder->asm_session_type == MM_SESSION_TYPE_RECORD_AUDIO ||
227 hcamcorder->asm_session_type == MM_SESSION_TYPE_CALL ||
228 hcamcorder->asm_session_type == MM_SESSION_TYPE_VIDEOCALL) {
229 hcamcorder->asm_register = _MMCamcorder_ASM_NO_NEED_REGISTER;
230 if (hcamcorder->asm_session_type == MM_SESSION_TYPE_RECORD_AUDIO) {
231 hcamcorder->asm_event_type = ASM_EVENT_MMCAMCORDER_AUDIO;
233 hcamcorder->asm_event_type = ASM_EVENT_MMCAMCORDER_VIDEO;
235 } else if (hcamcorder->asm_session_type == MM_SESSION_TYPE_MEDIA || hcamcorder->asm_session_type == MM_SESSION_TYPE_MEDIA_RECORD) {
236 hcamcorder->asm_register = _MMCamcorder_ASM_SESSION_REGISTERED_BY_OUTSIDE;
237 hcamcorder->asm_event_type = ASM_EVENT_MEDIA_MMCAMCORDER;
239 _mmcam_dbg_err("Not allowed this asm_session_type(%d) for mm-camcorder", hcamcorder->asm_session_type);
240 ret = MM_ERROR_POLICY_BLOCKED;
241 goto _ERR_DEFAULT_VALUE_INIT;
245 if (hcamcorder->asm_register) {
246 int pid = -1; /* process id of itself */
249 if (!ASM_register_sound(pid, &(hcamcorder->asm_handle), hcamcorder->asm_event_type, ASM_STATE_NONE,
250 (ASM_sound_cb_t)_mmcamcorder_asm_callback,
251 (void*)hcamcorder, mm_resource, &errorcode)) {
252 _mmcam_dbg_err("ASM_register_sound() [type %d] failed[%x]", hcamcorder->asm_event_type, errorcode);
253 ret = MM_ERROR_POLICY_INTERNAL;
254 goto _ERR_DEFAULT_VALUE_INIT;
256 if (hcamcorder->asm_session_options) {
257 if(! ASM_set_session_option(hcamcorder->asm_handle, hcamcorder->asm_session_options, &errorcode)) {
258 _mmcam_dbg_err("ASM_set_session_options() [options %x] failed[%x]", hcamcorder->asm_session_options, errorcode);
259 goto _ERR_AUDIO_BLOCKED;
263 _mmcam_dbg_log("ASM handle - %d, event type %d, options %x", hcamcorder->asm_handle, hcamcorder->asm_event_type, hcamcorder->asm_session_options);
266 /* Get Camera Configure information from Camcorder INI file */
267 _mmcamcorder_conf_get_info(CONFIGURE_TYPE_MAIN, CONFIGURE_MAIN_FILE, &hcamcorder->conf_main);
269 if (!(hcamcorder->conf_main)) {
270 _mmcam_dbg_err( "Failed to get configure(main) info." );
272 ret = MM_ERROR_CAMCORDER_CREATE_CONFIGURE;
273 goto _ERR_AUDIO_BLOCKED;
276 hcamcorder->attributes = _mmcamcorder_alloc_attribute((MMHandleType)hcamcorder, info);
277 if (!(hcamcorder->attributes)) {
278 _mmcam_dbg_err("_mmcamcorder_create::alloc attribute error.");
280 ret = MM_ERROR_CAMCORDER_RESOURCE_CREATION;
281 goto _ERR_AUDIO_BLOCKED;
284 if (info->videodev_type != MM_VIDEO_DEVICE_NONE) {
285 _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
286 CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
287 "UseConfCtrl", &UseConfCtrl);
289 _mmcam_dbg_log( "Enable Configure Control system." );
291 switch (info->videodev_type) {
292 case MM_VIDEO_DEVICE_CAMERA0:
293 _mmcamcorder_conf_get_value_string(hcamcorder->conf_main,
294 CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
295 "ConfCtrlFile0", &ConfCtrlFile);
297 case MM_VIDEO_DEVICE_CAMERA1:
298 _mmcamcorder_conf_get_value_string(hcamcorder->conf_main,
299 CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
300 "ConfCtrlFile1", &ConfCtrlFile);
303 _mmcam_dbg_err( "Not supported camera type." );
304 ret = MM_ERROR_CAMCORDER_NOT_SUPPORTED;
305 goto _ERR_ALLOC_ATTRIBUTE;
308 _mmcam_dbg_log("videodev_type : [%d], ConfCtrlPath : [%s]", info->videodev_type, ConfCtrlFile);
310 _mmcamcorder_conf_get_info(CONFIGURE_TYPE_CTRL, ConfCtrlFile, &hcamcorder->conf_ctrl);
312 _mmcamcorder_conf_print_info(&hcamcorder->conf_main);
313 _mmcamcorder_conf_print_info(&hcamcorder->conf_ctrl);
315 if (!(hcamcorder->conf_ctrl)) {
316 _mmcam_dbg_err( "Failed to get configure(control) info." );
317 ret = MM_ERROR_CAMCORDER_NOT_SUPPORTED;
318 goto _ERR_ALLOC_ATTRIBUTE;
321 ret = _mmcamcorder_init_convert_table((MMHandleType)hcamcorder);
322 if (ret != MM_ERROR_NONE) {
323 _mmcam_dbg_warn("converting table initialize error!!");
326 ret = _mmcamcorder_init_attr_from_configure((MMHandleType)hcamcorder);
327 if (ret != MM_ERROR_NONE) {
328 _mmcam_dbg_warn("converting table initialize error!!");
331 /* Get device info, recommend preview fmt and display rotation from INI */
332 _mmcamcorder_conf_get_value_int(hcamcorder->conf_ctrl,
333 CONFIGURE_CATEGORY_CTRL_CAMERA,
334 "RecommendPreviewFormatCapture",
337 _mmcamcorder_conf_get_value_int(hcamcorder->conf_ctrl,
338 CONFIGURE_CATEGORY_CTRL_CAMERA,
339 "RecommendPreviewFormatRecord",
340 &rcmd_fmt_recording);
342 _mmcamcorder_conf_get_value_int(hcamcorder->conf_ctrl,
343 CONFIGURE_CATEGORY_CTRL_CAMERA,
344 "RecommendDisplayRotation",
347 _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
348 CONFIGURE_CATEGORY_MAIN_CAPTURE,
350 &play_capture_sound);
352 _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
353 CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
355 &camera_device_count);
357 _mmcamcorder_conf_get_value_int(hcamcorder->conf_ctrl,
358 CONFIGURE_CATEGORY_CTRL_CAMERA,
360 &camera_facing_direction);
362 _mmcamcorder_conf_get_value_int(hcamcorder->conf_ctrl,
363 CONFIGURE_CATEGORY_CTRL_EFFECT,
364 "BrightnessStepDenominator",
365 &hcamcorder->brightness_step_denominator);
367 _mmcamcorder_conf_get_value_int(hcamcorder->conf_ctrl,
368 CONFIGURE_CATEGORY_CTRL_CAPTURE,
370 &hcamcorder->support_zsl_capture);
372 _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",
373 rcmd_fmt_capture, rcmd_fmt_recording, rcmd_dpy_rotation,
374 play_capture_sound, camera_device_count, camera_facing_direction,
375 hcamcorder->brightness_step_denominator, hcamcorder->support_zsl_capture);
377 /* Get UseZeroCopyFormat value from INI */
378 _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
379 CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
381 &(hcamcorder->use_zero_copy_format));
383 /* Get SupportMediaPacketPreviewCb value from INI */
384 _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
385 CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
386 "SupportMediaPacketPreviewCb",
387 &(hcamcorder->support_media_packet_preview_cb));
389 _mmcam_dbg_log("UseZeroCopyFormat : %d", hcamcorder->use_zero_copy_format);
390 _mmcam_dbg_log("SupportMediaPacketPreviewCb : %d", hcamcorder->support_media_packet_preview_cb);
392 if (camera_facing_direction == 1) {
393 if (rcmd_dpy_rotation == MM_DISPLAY_ROTATION_270 || rcmd_dpy_rotation == MM_DISPLAY_ROTATION_90) {
394 camera_default_flip = MM_FLIP_VERTICAL;
396 camera_default_flip = MM_FLIP_HORIZONTAL;
398 _mmcam_dbg_log("camera_default_flip : [%d]",camera_default_flip);
401 mm_camcorder_set_attributes((MMHandleType)hcamcorder, &err_attr_name,
402 MMCAM_CAMERA_DEVICE_COUNT, camera_device_count,
403 MMCAM_CAMERA_FACING_DIRECTION, camera_facing_direction,
404 MMCAM_RECOMMEND_PREVIEW_FORMAT_FOR_CAPTURE, rcmd_fmt_capture,
405 MMCAM_RECOMMEND_PREVIEW_FORMAT_FOR_RECORDING, rcmd_fmt_recording,
406 MMCAM_RECOMMEND_DISPLAY_ROTATION, rcmd_dpy_rotation,
407 MMCAM_SUPPORT_ZSL_CAPTURE, hcamcorder->support_zsl_capture,
408 MMCAM_SUPPORT_ZERO_COPY_FORMAT, hcamcorder->use_zero_copy_format,
409 MMCAM_SUPPORT_MEDIA_PACKET_PREVIEW_CB, hcamcorder->support_media_packet_preview_cb,
410 MMCAM_DISPLAY_FLIP, camera_default_flip,
411 "capture-sound-enable", play_capture_sound,
414 _mmcam_dbg_err("Set %s FAILED.", err_attr_name);
416 err_attr_name = NULL;
419 /* Get default value of brightness */
420 mm_camcorder_get_attributes((MMHandleType)hcamcorder, &err_attr_name,
421 MMCAM_FILTER_BRIGHTNESS, &hcamcorder->brightness_default,
424 _mmcam_dbg_err("Get brightness FAILED.");
426 err_attr_name = NULL;
428 _mmcam_dbg_log("Default brightness : %d", hcamcorder->brightness_default);
430 _mmcam_dbg_log( "Disable Configure Control system." );
431 hcamcorder->conf_ctrl = NULL;
434 _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
435 CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
437 &camera_device_count);
438 mm_camcorder_set_attributes((MMHandleType)hcamcorder, &err_attr_name,
439 MMCAM_CAMERA_DEVICE_COUNT, camera_device_count,
442 _mmcam_dbg_err("Set %s FAILED.", err_attr_name);
444 err_attr_name = NULL;
448 ret = __mmcamcorder_gstreamer_init(hcamcorder->conf_main);
450 _mmcam_dbg_err( "Failed to initialize gstreamer!!" );
451 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
452 goto _ERR_ALLOC_ATTRIBUTE;
455 /* Make some attributes as read-only type */
456 _mmcamcorder_lock_readonly_attributes((MMHandleType)hcamcorder);
458 /* Disable attributes in each model */
459 _mmcamcorder_set_disabled_attributes((MMHandleType)hcamcorder);
461 /* Get videosink name for evas surface */
462 _mmcamcorder_conf_get_element(hcamcorder->conf_main,
463 CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
464 "VideosinkElementEvas",
465 &EvasSurfaceElement);
466 if (EvasSurfaceElement) {
468 const char *evassink_name = NULL;
469 mmf_attribute_t *item_evassink_name = NULL;
470 mmf_attrs_t *attrs = (mmf_attrs_t *)MMF_CAMCORDER_ATTRS(hcamcorder);
472 _mmcamcorder_conf_get_value_element_name(EvasSurfaceElement, &evassink_name);
473 mm_attrs_get_index((MMHandleType)attrs, MMCAM_DISPLAY_EVAS_SURFACE_SINK, &attr_index);
474 item_evassink_name = &attrs->items[attr_index];
475 mmf_attribute_set_string(item_evassink_name, evassink_name, strlen(evassink_name));
476 mmf_attribute_commit(item_evassink_name);
478 _mmcam_dbg_log("Evassink name : %s", evassink_name);
481 /* get shutter sound policy */
482 vconf_get_int(VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY, &hcamcorder->shutter_sound_policy);
483 _mmcam_dbg_log("current shutter sound policy : %d", hcamcorder->shutter_sound_policy);
486 system_info_get_value_string(SYSTEM_INFO_KEY_MODEL, &hcamcorder->model_name);
488 /* get software version */
489 system_info_get_value_string(SYSTEM_INFO_KEY_BUILD_STRING, &hcamcorder->software_version);
491 /* Set initial state */
492 _mmcamcorder_set_state((MMHandleType)hcamcorder, MM_CAMCORDER_STATE_NULL);
494 _mmcam_dbg_log("created handle %p", hcamcorder);
496 *handle = (MMHandleType)hcamcorder;
498 return MM_ERROR_NONE;
500 _ERR_ALLOC_ATTRIBUTE:
502 /* unregister audio session manager */
503 if(hcamcorder->asm_register) {
504 int res = MM_ERROR_NONE;
506 if (!ASM_unregister_sound(hcamcorder->asm_handle, hcamcorder->asm_event_type, &errorcode)) {
507 _mmcam_dbg_err("ASM_unregister_sound() MMCAMCORDER_AUDIO failed(hdl:%p, stype:%d, err:%x)",
508 (void*)hcamcorder->asm_handle, hcamcorder->asm_session_type, errorcode);
510 /* Update session information */
511 if (hcamcorder->asm_register == _MMCamcorder_ASM_SESSION_REGISTERED_INTERNALLY) {
512 /* Remove session information */
513 res = _mm_session_util_delete_information(-1);
515 _mmcam_dbg_err("_mm_session_util_delete_information() failed[%x]", res);
520 _ERR_DEFAULT_VALUE_INIT:
521 /* Release lock, cond */
522 SAFE_G_MUTEX_FREE((hcamcorder->mtsafe).lock);
523 SAFE_G_COND_FREE((hcamcorder->mtsafe).cond);
524 SAFE_G_MUTEX_FREE((hcamcorder->mtsafe).cmd_lock);
525 SAFE_G_MUTEX_FREE((hcamcorder->mtsafe).asm_lock);
526 SAFE_G_MUTEX_FREE((hcamcorder->mtsafe).state_lock);
527 SAFE_G_MUTEX_FREE((hcamcorder->mtsafe).gst_state_lock);
528 SAFE_G_MUTEX_FREE((hcamcorder->mtsafe).gst_encode_state_lock);
529 SAFE_G_MUTEX_FREE((hcamcorder->mtsafe).message_cb_lock);
530 SAFE_G_MUTEX_FREE((hcamcorder->mtsafe).vcapture_cb_lock);
531 SAFE_G_MUTEX_FREE((hcamcorder->mtsafe).vstream_cb_lock);
532 SAFE_G_MUTEX_FREE((hcamcorder->mtsafe).astream_cb_lock);
534 pthread_mutex_destroy(&(hcamcorder->sound_lock));
535 pthread_cond_destroy(&(hcamcorder->sound_cond));
536 pthread_mutex_destroy(&(hcamcorder->snd_info.open_mutex));
537 pthread_cond_destroy(&(hcamcorder->snd_info.open_cond));
538 pthread_mutex_destroy(&(hcamcorder->restart_preview_lock));
540 if (hcamcorder->conf_ctrl) {
541 _mmcamcorder_conf_release_info( &hcamcorder->conf_ctrl );
544 if (hcamcorder->conf_main) {
545 _mmcamcorder_conf_release_info( &hcamcorder->conf_main );
548 if (hcamcorder->model_name) {
549 free(hcamcorder->model_name);
550 hcamcorder->model_name = NULL;
553 if (hcamcorder->software_version) {
554 free(hcamcorder->software_version);
555 hcamcorder->software_version = NULL;
558 if (hcamcorder->task_thread) {
559 pthread_mutex_lock(&(hcamcorder->task_thread_lock));
560 _mmcam_dbg_log("send signal for task thread exit");
561 hcamcorder->task_thread_state = _MMCAMCORDER_TASK_THREAD_STATE_EXIT;
562 pthread_cond_signal(&(hcamcorder->task_thread_cond));
563 pthread_mutex_unlock(&(hcamcorder->task_thread_lock));
564 pthread_join(hcamcorder->task_thread, NULL);
566 pthread_mutex_destroy(&(hcamcorder->task_thread_lock));
567 pthread_cond_destroy(&(hcamcorder->task_thread_cond));
570 memset(hcamcorder, 0x00, sizeof(mmf_camcorder_t));
577 int _mmcamcorder_destroy(MMHandleType handle)
579 int ret = MM_ERROR_NONE;
580 int state = MM_CAMCORDER_STATE_NONE;
581 int state_FROM = MM_CAMCORDER_STATE_NULL;
582 int errorcode = MM_ERROR_NONE;
584 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
589 _mmcam_dbg_err("Not initialized");
590 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
591 goto _ERR_CAMCORDER_CMD_PRECON;
594 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
595 _mmcam_dbg_err("Another command is running.");
596 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
597 goto _ERR_CAMCORDER_CMD_PRECON;
600 state = _mmcamcorder_get_state(handle);
601 if (state != state_FROM) {
602 _mmcam_dbg_err("Wrong state(%d)", state);
603 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
604 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
607 /* set exit state for sound thread */
608 pthread_mutex_lock(&(hcamcorder->task_thread_lock));
609 _mmcam_dbg_log("send signal for task thread exit");
610 hcamcorder->task_thread_state = _MMCAMCORDER_TASK_THREAD_STATE_EXIT;
611 pthread_cond_signal(&(hcamcorder->task_thread_cond));
612 pthread_mutex_unlock(&(hcamcorder->task_thread_lock));
614 pthread_mutex_lock(&(hcamcorder->sound_lock));
615 while (hcamcorder->capture_sound_count > 0) {
616 struct timespec timeout;
619 gettimeofday(&tv, NULL);
620 timeout.tv_sec = tv.tv_sec + __MMCAMCORDER_SOUND_WAIT_TIMEOUT;
621 timeout.tv_nsec = tv.tv_usec * 1000;
623 _mmcam_dbg_warn("capture_sound_count[%d] is not zero. wait signal...",
624 hcamcorder->capture_sound_count);
626 if (!pthread_cond_timedwait(&(hcamcorder->sound_cond), &(hcamcorder->sound_lock), &timeout)) {
627 _mmcam_dbg_warn("signal received. check again...");
629 hcamcorder->capture_sound_count = 0;
630 _mmcam_dbg_err("capture sound completion wait time out");
634 pthread_mutex_unlock(&(hcamcorder->sound_lock));
636 /* Release SubContext and pipeline */
637 if (hcamcorder->sub_context) {
638 if (hcamcorder->sub_context->element) {
639 _mmcamcorder_destroy_pipeline(handle, hcamcorder->type);
642 _mmcamcorder_dealloc_subcontext(hcamcorder->sub_context);
643 hcamcorder->sub_context = NULL;
646 /* Remove idle function which is not called yet */
647 if (hcamcorder->setting_event_id) {
648 _mmcam_dbg_log("Remove remaining idle function");
649 g_source_remove(hcamcorder->setting_event_id);
650 hcamcorder->setting_event_id = 0;
653 /* Remove attributes */
654 if (hcamcorder->attributes) {
655 _mmcamcorder_dealloc_attribute(hcamcorder->attributes);
656 hcamcorder->attributes = 0;
659 /* Remove exif info */
660 if (hcamcorder->exif_info) {
661 mm_exif_destory_exif_info(hcamcorder->exif_info);
662 hcamcorder->exif_info=NULL;
666 /* Release configure info */
667 if (hcamcorder->conf_ctrl) {
668 _mmcamcorder_conf_release_info( &hcamcorder->conf_ctrl );
670 if (hcamcorder->conf_main) {
671 _mmcamcorder_conf_release_info( &hcamcorder->conf_main );
674 /* Remove messages which are not called yet */
675 _mmcamcroder_remove_message_all(handle);
677 if (hcamcorder->asm_register) {
679 if (!ASM_unregister_sound(hcamcorder->asm_handle, hcamcorder->asm_event_type, &errorcode)) {
680 _mmcam_dbg_err("ASM_unregister_sound() failed(hdl:%p, err:%x)",
681 (void*)hcamcorder->asm_handle, errorcode);
683 /* Update session information */
684 if (hcamcorder->asm_register == _MMCamcorder_ASM_SESSION_REGISTERED_INTERNALLY) {
685 int res = MM_ERROR_NONE;
686 /* Remove session information */
687 res = _mm_session_util_delete_information(-1);
689 _mmcam_dbg_err("_mm_session_util_delete_information() failed[%x]", res);
694 /* release model_name */
695 if (hcamcorder->model_name) {
696 free(hcamcorder->model_name);
697 hcamcorder->model_name = NULL;
700 if (hcamcorder->software_version) {
701 free(hcamcorder->software_version);
702 hcamcorder->software_version = NULL;
705 /* join task thread */
706 _mmcam_dbg_log("task thread join");
707 pthread_join(hcamcorder->task_thread, NULL);
709 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
711 /* Release lock, cond */
712 SAFE_G_MUTEX_FREE((hcamcorder->mtsafe).lock);
713 SAFE_G_COND_FREE((hcamcorder->mtsafe).cond);
714 SAFE_G_MUTEX_FREE((hcamcorder->mtsafe).cmd_lock);
715 SAFE_G_MUTEX_FREE((hcamcorder->mtsafe).asm_lock);
716 SAFE_G_MUTEX_FREE((hcamcorder->mtsafe).state_lock);
717 SAFE_G_MUTEX_FREE((hcamcorder->mtsafe).gst_state_lock);
718 SAFE_G_MUTEX_FREE((hcamcorder->mtsafe).gst_encode_state_lock);
719 SAFE_G_MUTEX_FREE((hcamcorder->mtsafe).message_cb_lock);
720 SAFE_G_MUTEX_FREE((hcamcorder->mtsafe).vcapture_cb_lock);
721 SAFE_G_MUTEX_FREE((hcamcorder->mtsafe).vstream_cb_lock);
722 SAFE_G_MUTEX_FREE((hcamcorder->mtsafe).astream_cb_lock);
724 pthread_mutex_destroy(&(hcamcorder->sound_lock));
725 pthread_cond_destroy(&(hcamcorder->sound_cond));
726 pthread_mutex_destroy(&(hcamcorder->snd_info.open_mutex));
727 pthread_cond_destroy(&(hcamcorder->snd_info.open_cond));
728 pthread_mutex_destroy(&(hcamcorder->restart_preview_lock));
729 pthread_mutex_destroy(&(hcamcorder->task_thread_lock));
730 pthread_cond_destroy(&(hcamcorder->task_thread_cond));
733 memset(hcamcorder, 0x00, sizeof(mmf_camcorder_t));
736 return MM_ERROR_NONE;
738 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
739 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
741 _ERR_CAMCORDER_CMD_PRECON:
743 _mmcam_dbg_err("Destroy fail (type %d, state %d)", hcamcorder->type, state);
746 _mmcam_dbg_err("Destroy fail (ret %x)", ret);
752 int _mmcamcorder_realize(MMHandleType handle)
754 int ret = MM_ERROR_NONE;
755 int state = MM_CAMCORDER_STATE_NONE;
756 int state_FROM = MM_CAMCORDER_STATE_NULL;
757 int state_TO = MM_CAMCORDER_STATE_READY;
758 int errorcode = MM_ERROR_NONE;
759 int display_surface_type = MM_DISPLAY_SURFACE_X;
760 double motion_rate = _MMCAMCORDER_DEFAULT_RECORDING_MOTION_RATE;
761 char *videosink_element_type = NULL;
762 const char *videosink_name = NULL;
764 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
766 /*_mmcam_dbg_log("");*/
769 _mmcam_dbg_err("Not initialized");
770 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
774 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
775 _mmcam_dbg_err("Another command is running.");
776 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
777 goto _ERR_CAMCORDER_CMD_PRECON;
780 state = _mmcamcorder_get_state(handle);
781 if (state != state_FROM) {
782 _mmcam_dbg_err("Wrong state(%d)", state);
783 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
784 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
787 mm_camcorder_get_attributes(handle, NULL,
788 MMCAM_MODE, &hcamcorder->type,
791 /* Get profile mode */
792 _mmcam_dbg_log("Profile mode [%d]", hcamcorder->type);
794 /* set camera state to vconf key */
795 if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
796 int vconf_camera_state = 0;
798 /* get current camera state of vconf key */
799 vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state);
800 if (vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_OPEN)) {
801 _mmcam_dbg_log("VCONF ERROR %s : cur %d",strerror(errno),errno);
802 if(errno == EPERM || errno == EACCES) {
803 ret = MM_ERROR_COMMON_INVALID_PERMISSION;
804 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
807 _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d",
808 vconf_camera_state, VCONFKEY_CAMERA_STATE_OPEN);
810 int vconf_recorder_state = 0;
812 /* get current recorder state of vconf key */
813 vconf_get_int(VCONFKEY_RECORDER_STATE, &vconf_recorder_state);
814 if (vconf_set_int(VCONFKEY_RECORDER_STATE, VCONFKEY_RECORDER_STATE_CREATED)) {
815 _mmcam_dbg_log("VCONF ERROR %s : cur %d",strerror(errno),errno);
816 if (errno == EPERM || errno == EACCES) {
817 ret = MM_ERROR_COMMON_INVALID_PERMISSION;
818 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
822 _mmcam_dbg_log("VCONFKEY_RECORDER_STATE prev %d -> cur %d",
823 vconf_recorder_state, VCONFKEY_RECORDER_STATE_CREATED);
826 mm_camcorder_get_attributes(handle, NULL,
827 MMCAM_DISPLAY_SURFACE, &display_surface_type,
828 MMCAM_CAMERA_RECORDING_MOTION_RATE, &motion_rate,
831 /* Check and make SHARE session as PLAYING */
832 if (hcamcorder->asm_register) {
834 ASM_resource_t mm_resource = ASM_RESOURCE_NONE;
836 switch (hcamcorder->type) {
837 case MM_CAMCORDER_MODE_AUDIO:
838 mm_resource = ASM_RESOURCE_NONE;
840 case MM_CAMCORDER_MODE_VIDEO_CAPTURE:
842 mm_resource = ASM_RESOURCE_CAMERA | ASM_RESOURCE_HW_ENCODER;
844 if (display_surface_type == MM_DISPLAY_SURFACE_X ||
845 display_surface_type == MM_DISPLAY_SURFACE_X_EXT) {
846 mm_resource |= ASM_RESOURCE_VIDEO_OVERLAY;
847 _mmcam_dbg_warn("VIDEO_OVERLAY resource INCLUDED");
849 _mmcam_dbg_warn("VIDEO_OVERLAY resource EXCLUDED");
854 asm_ret = ASM_set_sound_state(hcamcorder->asm_handle, hcamcorder->asm_event_type,
855 ASM_STATE_PLAYING, mm_resource, &errorcode);
858 case ERR_ASM_POLICY_CANNOT_PLAY_BY_CALL:
859 ret = MM_ERROR_POLICY_BLOCKED_BY_CALL;
861 case ERR_ASM_POLICY_CANNOT_PLAY_BY_ALARM:
862 ret = MM_ERROR_POLICY_BLOCKED_BY_ALARM;
865 ret = MM_ERROR_POLICY_BLOCKED;
869 _mmcam_dbg_err("Set ASM state to playing failed errorcode: 0x%x, ret: 0x%x", errorcode, ret);
871 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
873 } else if (hcamcorder->asm_session_type == MM_SESSION_TYPE_RECORD_VIDEO ||
874 hcamcorder->asm_session_type == MM_SESSION_TYPE_RECORD_AUDIO) {
875 /* ASM attach callback - application can remove ASM callback by destroy session */
876 if (!ASM_attach_callback(hcamcorder->asm_event_type, _mmcamcorder_asm_callback,
877 (void*)hcamcorder, &errorcode)) {
878 if (errorcode == ERR_ASM_ALREADY_REGISTERED) {
879 _mmcam_dbg_warn("ASM callback is already registered");
881 _mmcam_dbg_err("ASM_attach_callback() [type %d] failed[%x]", hcamcorder->asm_event_type, errorcode);
882 ret = MM_ERROR_POLICY_INTERNAL;
883 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
887 _mmcam_dbg_log("attached ASM callback - evnet type %d", hcamcorder->asm_event_type);
889 _mmcam_dbg_log("do nothing for ASM");
892 /* alloc sub context */
893 hcamcorder->sub_context = _mmcamcorder_alloc_subcontext(hcamcorder->type);
894 if(!hcamcorder->sub_context) {
895 ret = MM_ERROR_CAMCORDER_RESOURCE_CREATION;
896 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
899 /* Set basic configure information */
900 if (motion_rate != _MMCAMCORDER_DEFAULT_RECORDING_MOTION_RATE) {
901 hcamcorder->sub_context->is_modified_rate = TRUE;
904 _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
905 CONFIGURE_CATEGORY_MAIN_CAPTURE,
907 &(hcamcorder->sub_context->bencbin_capture));
908 _mmcam_dbg_warn("UseEncodebin [%d]", hcamcorder->sub_context->bencbin_capture);
910 if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
911 /* get dual stream support info */
912 _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
913 CONFIGURE_CATEGORY_MAIN_RECORD,
915 &(hcamcorder->sub_context->info_video->support_dual_stream));
916 _mmcam_dbg_warn("SupportDualStream [%d]", hcamcorder->sub_context->info_video->support_dual_stream);
919 switch (display_surface_type) {
920 case MM_DISPLAY_SURFACE_X:
921 case MM_DISPLAY_SURFACE_X_EXT:
922 videosink_element_type = strdup("VideosinkElementX");
924 case MM_DISPLAY_SURFACE_EVAS:
925 videosink_element_type = strdup("VideosinkElementEvas");
927 case MM_DISPLAY_SURFACE_GL:
928 videosink_element_type = strdup("VideosinkElementGL");
930 case MM_DISPLAY_SURFACE_NULL:
931 videosink_element_type = strdup("VideosinkElementNull");
934 videosink_element_type = strdup("VideosinkElementX");
938 /* check string of videosink element */
939 if (videosink_element_type) {
940 _mmcamcorder_conf_get_element(hcamcorder->conf_main,
941 CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
942 videosink_element_type,
943 &hcamcorder->sub_context->VideosinkElement);
944 free(videosink_element_type);
945 videosink_element_type = NULL;
947 _mmcam_dbg_warn("strdup failed(display_surface_type %d). Use default X type",
948 display_surface_type);
950 _mmcamcorder_conf_get_element(hcamcorder->conf_main,
951 CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
952 _MMCAMCORDER_DEFAULT_VIDEOSINK_TYPE,
953 &hcamcorder->sub_context->VideosinkElement);
956 _mmcamcorder_conf_get_value_element_name(hcamcorder->sub_context->VideosinkElement, &videosink_name);
957 _mmcam_dbg_log("Videosink name : %s", videosink_name);
959 /* get videoconvert element */
960 _mmcamcorder_conf_get_element(hcamcorder->conf_main,
961 CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
962 "VideoconvertElement",
963 &hcamcorder->sub_context->VideoconvertElement);
965 _mmcamcorder_conf_get_value_int(hcamcorder->conf_ctrl,
966 CONFIGURE_CATEGORY_CTRL_CAPTURE,
967 "SensorEncodedCapture",
968 &(hcamcorder->sub_context->SensorEncodedCapture));
969 _mmcam_dbg_log("Support sensor encoded capture : %d", hcamcorder->sub_context->SensorEncodedCapture);
971 /* create pipeline */
972 ret = _mmcamcorder_create_pipeline(handle, hcamcorder->type);
973 if (ret != MM_ERROR_NONE) {
974 /* check internal error of gstreamer */
975 if (hcamcorder->sub_context->error_code != MM_ERROR_NONE) {
976 ret = hcamcorder->sub_context->error_code;
977 _mmcam_dbg_log("gstreamer error is occurred. return it %x", ret);
980 /* release sub context */
981 _mmcamcorder_dealloc_subcontext(hcamcorder->sub_context);
982 hcamcorder->sub_context = NULL;
983 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
986 /* set command function */
987 ret = _mmcamcorder_set_functions(handle, hcamcorder->type);
988 if (ret != MM_ERROR_NONE) {
989 _mmcamcorder_destroy_pipeline(handle, hcamcorder->type);
990 _mmcamcorder_dealloc_subcontext(hcamcorder->sub_context);
991 hcamcorder->sub_context = NULL;
992 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
995 _mmcamcorder_set_state(handle, state_TO);
997 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
999 return MM_ERROR_NONE;
1001 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1002 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1004 _ERR_CAMCORDER_CMD_PRECON:
1005 _mmcam_dbg_err("Realize fail (type %d, state %d, ret %x)",
1006 hcamcorder->type, state, ret);
1008 /* rollback camera state to vconf key */
1009 if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
1010 int vconf_camera_state = 0;
1012 /* get current camera state of vconf key */
1013 vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state);
1014 vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_NULL);
1016 _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d",
1017 vconf_camera_state, VCONFKEY_CAMERA_STATE_NULL);
1019 int vconf_recorder_state = 0;
1021 /* get current recorder state of vconf key */
1022 vconf_get_int(VCONFKEY_RECORDER_STATE, &vconf_recorder_state);
1023 vconf_set_int(VCONFKEY_RECORDER_STATE, VCONFKEY_RECORDER_STATE_NULL);
1025 _mmcam_dbg_log("VCONFKEY_RECORDER_STATE prev %d -> cur %d",
1026 vconf_recorder_state, VCONFKEY_RECORDER_STATE_NULL);
1033 int _mmcamcorder_unrealize(MMHandleType handle)
1035 int ret = MM_ERROR_NONE;
1036 int state = MM_CAMCORDER_STATE_NONE;
1037 int state_FROM = MM_CAMCORDER_STATE_READY;
1038 int state_TO = MM_CAMCORDER_STATE_NULL;
1039 ASM_resource_t mm_resource = ASM_RESOURCE_NONE;
1041 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1046 _mmcam_dbg_err("Not initialized");
1047 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1051 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1052 _mmcam_dbg_err("Another command is running.");
1053 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1054 goto _ERR_CAMCORDER_CMD_PRECON;
1057 state = _mmcamcorder_get_state(handle);
1058 if (state != state_FROM) {
1059 _mmcam_dbg_err("Wrong state(%d)", state);
1060 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1061 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1064 /* Release SubContext */
1065 if (hcamcorder->sub_context) {
1066 /* destroy pipeline */
1067 _mmcamcorder_destroy_pipeline(handle, hcamcorder->type);
1068 /* Deallocate SubContext */
1069 _mmcamcorder_dealloc_subcontext(hcamcorder->sub_context);
1070 hcamcorder->sub_context = NULL;
1073 /* Deinitialize main context member */
1075 hcamcorder->command = NULL;
1077 /* check who calls unrealize. it's no need to set ASM state if caller is ASM */
1078 if (hcamcorder->state_change_by_system != _MMCAMCORDER_STATE_CHANGE_BY_ASM) {
1079 if (hcamcorder->asm_register) {
1080 mm_resource = ASM_RESOURCE_NONE;
1082 switch (hcamcorder->type) {
1083 case MM_CAMCORDER_MODE_AUDIO:
1084 mm_resource = ASM_RESOURCE_NONE;
1086 case MM_CAMCORDER_MODE_VIDEO_CAPTURE:
1088 mm_resource = ASM_RESOURCE_CAMERA | ASM_RESOURCE_VIDEO_OVERLAY | ASM_RESOURCE_HW_ENCODER;
1093 if (!ASM_set_sound_state(hcamcorder->asm_handle, hcamcorder->asm_event_type,
1094 ASM_STATE_STOP, mm_resource, &ret)) {
1095 _mmcam_dbg_err("Set ASM state to STOP failed 0x%x", ret);
1100 /* set camera state to vconf key */
1101 if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
1102 int vconf_camera_state = 0;
1104 /* get current camera state of vconf key */
1105 vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state);
1106 vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_NULL);
1108 _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d",
1109 vconf_camera_state, VCONFKEY_CAMERA_STATE_NULL);
1111 int vconf_recorder_state = 0;
1113 /* get current recorder state of vconf key */
1114 vconf_get_int(VCONFKEY_RECORDER_STATE, &vconf_recorder_state);
1115 vconf_set_int(VCONFKEY_RECORDER_STATE, VCONFKEY_RECORDER_STATE_NULL);
1117 _mmcam_dbg_log("VCONFKEY_RECORDER_STATE prev %d -> cur %d",
1118 vconf_recorder_state, VCONFKEY_RECORDER_STATE_NULL);
1121 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1123 _mmcamcorder_set_state(handle, state_TO);
1125 return MM_ERROR_NONE;
1127 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1128 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1130 _ERR_CAMCORDER_CMD_PRECON:
1132 _mmcam_dbg_err("Unrealize fail (type %d, state %d, ret %x)",
1133 hcamcorder->type, state, ret);
1138 int _mmcamcorder_start(MMHandleType handle)
1140 int ret = MM_ERROR_NONE;
1141 int state = MM_CAMCORDER_STATE_NONE;
1142 int state_FROM = MM_CAMCORDER_STATE_READY;
1143 int state_TO =MM_CAMCORDER_STATE_PREPARE;
1145 _MMCamcorderSubContext *sc = NULL;
1146 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1151 _mmcam_dbg_err("Not initialized");
1152 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1156 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
1157 mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1159 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1160 _mmcam_dbg_err("Another command is running.");
1161 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1162 goto _ERR_CAMCORDER_CMD_PRECON;
1165 state = _mmcamcorder_get_state(handle);
1166 if (state != state_FROM) {
1167 _mmcam_dbg_err("Wrong state(%d)", state);
1168 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1169 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1172 /* initialize error code */
1173 hcamcorder->sub_context->error_code = MM_ERROR_NONE;
1175 /* set attributes related sensor */
1176 if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
1177 _mmcamcorder_set_attribute_to_camsensor(handle);
1180 ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_PREVIEW_START);
1181 if (ret != MM_ERROR_NONE) {
1182 /* check internal error of gstreamer */
1183 if (hcamcorder->sub_context->error_code != MM_ERROR_NONE) {
1184 ret = hcamcorder->sub_context->error_code;
1185 _mmcam_dbg_log("gstreamer error is occurred. return it %x", ret);
1187 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1190 _mmcamcorder_set_state(handle, state_TO);
1192 if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
1193 int vconf_camera_state = 0;
1195 /* check camera state of vconf key */
1196 vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state);
1198 /* set camera state to vconf key */
1199 vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_PREVIEW);
1201 _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d",
1202 vconf_camera_state, VCONFKEY_CAMERA_STATE_PREVIEW);
1205 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1207 return MM_ERROR_NONE;
1209 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1210 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1212 _ERR_CAMCORDER_CMD_PRECON:
1213 /* check internal error of gstreamer */
1214 if (hcamcorder->sub_context &&
1215 hcamcorder->sub_context->error_code != MM_ERROR_NONE) {
1216 ret = hcamcorder->sub_context->error_code;
1217 hcamcorder->sub_context->error_code = MM_ERROR_NONE;
1219 _mmcam_dbg_log("gstreamer error is occurred. return it %x", ret);
1222 _mmcam_dbg_err("Start fail (type %d, state %d, ret %x)",
1223 hcamcorder->type, state, ret);
1228 int _mmcamcorder_stop(MMHandleType handle)
1230 int ret = MM_ERROR_NONE;
1231 int state = MM_CAMCORDER_STATE_NONE;
1232 int state_FROM = MM_CAMCORDER_STATE_PREPARE;
1233 int state_TO = MM_CAMCORDER_STATE_READY;
1236 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1241 _mmcam_dbg_err("Not initialized");
1242 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1246 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1247 _mmcam_dbg_err("Another command is running.");
1248 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1249 goto _ERR_CAMCORDER_CMD_PRECON;
1252 state = _mmcamcorder_get_state(handle);
1253 if (state != state_FROM) {
1254 _mmcam_dbg_err("Wrong state(%d)", state);
1255 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1256 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1259 ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_PREVIEW_STOP);
1260 if (ret != MM_ERROR_NONE) {
1261 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1264 /* KPI : frame rate */
1265 frame_rate =_mmcamcorder_video_average_framerate(handle);
1267 _mmcamcorder_set_state(handle, state_TO);
1269 if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
1270 int vconf_camera_state = 0;
1272 /* check camera state of vconf key */
1273 vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state);
1275 /* set camera state to vconf key */
1276 vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_OPEN);
1278 _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d",
1279 vconf_camera_state, VCONFKEY_CAMERA_STATE_OPEN);
1282 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1284 return MM_ERROR_NONE;
1286 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1287 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1289 _ERR_CAMCORDER_CMD_PRECON:
1291 _mmcam_dbg_err("Stop fail (type %d, state %d, ret %x)",
1292 hcamcorder->type, state, ret);
1298 int _mmcamcorder_capture_start(MMHandleType handle)
1300 int ret = MM_ERROR_NONE;
1301 int state = MM_CAMCORDER_STATE_NONE;
1302 int state_FROM_0 = MM_CAMCORDER_STATE_PREPARE;
1303 int state_FROM_1 = MM_CAMCORDER_STATE_RECORDING;
1304 int state_FROM_2 = MM_CAMCORDER_STATE_PAUSED;
1305 int state_TO = MM_CAMCORDER_STATE_CAPTURING;
1307 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1312 _mmcam_dbg_err("Not initialized");
1313 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1317 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1318 _mmcam_dbg_err("Another command is running.");
1319 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1320 goto _ERR_CAMCORDER_CMD_PRECON;
1323 state = _mmcamcorder_get_state(handle);
1324 if (state != state_FROM_0 &&
1325 state != state_FROM_1 &&
1326 state != state_FROM_2) {
1327 _mmcam_dbg_err("Wrong state(%d)", state);
1328 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1329 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1332 /* Handle capture in recording case */
1333 if (state == state_FROM_1 || state == state_FROM_2) {
1334 if (hcamcorder->capture_in_recording == TRUE) {
1335 _mmcam_dbg_err("Capturing in recording (%d)", state);
1336 ret = MM_ERROR_CAMCORDER_DEVICE_BUSY;
1337 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1339 hcamcorder->capture_in_recording = TRUE;
1343 ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_CAPTURE);
1344 if (ret != MM_ERROR_NONE) {
1345 goto _ERR_CAMCORDER_CMD;
1348 /* Do not change state when recording snapshot capture */
1349 if (state == state_FROM_0) {
1350 _mmcamcorder_set_state(handle, state_TO);
1353 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1355 /* Init break continuous shot attr */
1356 if (mm_camcorder_set_attributes(handle, NULL, "capture-break-cont-shot", 0, NULL) != MM_ERROR_NONE) {
1357 _mmcam_dbg_warn("capture-break-cont-shot set 0 failed");
1360 return MM_ERROR_NONE;
1363 if (hcamcorder->capture_in_recording) {
1364 hcamcorder->capture_in_recording = FALSE;
1367 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1368 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1370 _ERR_CAMCORDER_CMD_PRECON:
1372 _mmcam_dbg_err("Capture start fail (type %d, state %d, ret %x)",
1373 hcamcorder->type, state, ret);
1378 int _mmcamcorder_capture_stop(MMHandleType handle)
1380 int ret = MM_ERROR_NONE;
1381 int state = MM_CAMCORDER_STATE_NONE;
1382 int state_FROM = MM_CAMCORDER_STATE_CAPTURING;
1383 int state_TO = MM_CAMCORDER_STATE_PREPARE;
1384 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1389 _mmcam_dbg_err("Not initialized");
1390 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1394 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1395 _mmcam_dbg_err("Another command is running.");
1396 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1397 goto _ERR_CAMCORDER_CMD_PRECON;
1400 state = _mmcamcorder_get_state(handle);
1401 if (state != state_FROM) {
1402 _mmcam_dbg_err("Wrong state(%d)", state);
1403 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1404 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1407 ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_PREVIEW_START);
1408 if (ret != MM_ERROR_NONE) {
1409 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1412 _mmcamcorder_set_state(handle, state_TO);
1414 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1416 return MM_ERROR_NONE;
1418 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1419 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1421 _ERR_CAMCORDER_CMD_PRECON:
1423 _mmcam_dbg_err("Capture stop fail (type %d, state %d, ret %x)",
1424 hcamcorder->type, state, ret);
1429 int _mmcamcorder_record(MMHandleType handle)
1431 int ret = MM_ERROR_NONE;
1432 int state = MM_CAMCORDER_STATE_NONE;
1433 int state_FROM1 = MM_CAMCORDER_STATE_PREPARE;
1434 int state_FROM2 = MM_CAMCORDER_STATE_PAUSED;
1435 int state_TO = MM_CAMCORDER_STATE_RECORDING;
1437 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1442 _mmcam_dbg_err("Not initialized");
1443 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1447 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1448 _mmcam_dbg_err("Another command is running.");
1449 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1450 goto _ERR_CAMCORDER_CMD_PRECON;
1453 state = _mmcamcorder_get_state(handle);
1454 if (state != state_FROM1 && state != state_FROM2) {
1455 _mmcam_dbg_err("Wrong state(%d)", state);
1456 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1457 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1460 /* initialize error code */
1461 hcamcorder->sub_context->error_code = MM_ERROR_NONE;
1463 /* update session information */
1464 if (hcamcorder->asm_register == _MMCamcorder_ASM_SESSION_REGISTERED_BY_OUTSIDE ||
1465 hcamcorder->asm_register == _MMCamcorder_ASM_SESSION_REGISTERED_INTERNALLY) {
1466 ret = _mm_session_util_read_information(-1, &hcamcorder->asm_session_type, &hcamcorder->asm_session_options);
1467 if (ret != MM_ERROR_NONE) {
1468 _mmcam_dbg_warn("_mm_session_util_read_information failed[%x]", ret);
1469 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1471 if (hcamcorder->asm_session_type == MM_SESSION_TYPE_MEDIA_RECORD) {
1472 _mmcam_dbg_err("session was already registered to MEDIA_RECORD, could not process it..");
1473 ret = MM_ERROR_POLICY_INTERNAL;
1474 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1476 int asm_ret = MM_ERROR_NONE;
1477 _mmcam_dbg_log("session was already registered to MEDIA, update it to MEDIA_RECORD");
1478 hcamcorder->asm_session_type = MM_SESSION_TYPE_MEDIA_RECORD;
1479 asm_ret = _mm_session_util_write_information(-1, hcamcorder->asm_session_type, hcamcorder->asm_session_options);
1480 if (asm_ret != MM_ERROR_NONE) {
1481 _mmcam_dbg_err("_mm_session_util_write_information() [type %d, options %x] failed[%x]", hcamcorder->asm_session_type, hcamcorder->asm_session_options, asm_ret);
1482 ret = MM_ERROR_POLICY_INTERNAL;
1483 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1489 ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_RECORD);
1490 if (ret != MM_ERROR_NONE) {
1491 /* check internal error of gstreamer */
1492 if (hcamcorder->sub_context->error_code != MM_ERROR_NONE) {
1493 ret = hcamcorder->sub_context->error_code;
1494 _mmcam_dbg_log("gstreamer error is occurred. return it %x", ret);
1496 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1499 _mmcamcorder_set_state(handle, state_TO);
1501 /* set camera state to vconf key */
1502 if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
1503 int vconf_camera_state = 0;
1505 /* get current camera state of vconf key */
1506 vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state);
1507 vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_RECORDING);
1509 _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d",
1510 vconf_camera_state, VCONFKEY_CAMERA_STATE_RECORDING);
1512 int vconf_recorder_state = 0;
1514 /* get current recorder state of vconf key */
1515 vconf_get_int(VCONFKEY_RECORDER_STATE, &vconf_recorder_state);
1516 vconf_set_int(VCONFKEY_RECORDER_STATE, VCONFKEY_RECORDER_STATE_RECORDING);
1518 _mmcam_dbg_log("VCONFKEY_RECORDER_STATE prev %d -> cur %d",
1519 vconf_recorder_state, VCONFKEY_RECORDER_STATE_RECORDING);
1522 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1524 return MM_ERROR_NONE;
1526 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1527 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1529 _ERR_CAMCORDER_CMD_PRECON:
1530 /* check internal error of gstreamer */
1531 if (hcamcorder->sub_context &&
1532 hcamcorder->sub_context->error_code != MM_ERROR_NONE) {
1533 ret = hcamcorder->sub_context->error_code;
1534 hcamcorder->sub_context->error_code = MM_ERROR_NONE;
1536 _mmcam_dbg_log("gstreamer error is occurred. return it %x", ret);
1539 _mmcam_dbg_err("Record fail (type %d, state %d, ret %x)",
1540 hcamcorder->type, state, ret);
1546 int _mmcamcorder_pause(MMHandleType handle)
1548 int ret = MM_ERROR_NONE;
1549 int state = MM_CAMCORDER_STATE_NONE;
1550 int state_FROM = MM_CAMCORDER_STATE_RECORDING;
1551 int state_TO = MM_CAMCORDER_STATE_PAUSED;
1553 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1558 _mmcam_dbg_err("Not initialized");
1559 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1563 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1564 _mmcam_dbg_err("Another command is running.");
1565 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1566 goto _ERR_CAMCORDER_CMD_PRECON;
1569 state = _mmcamcorder_get_state(handle);
1570 if (state != state_FROM) {
1571 _mmcam_dbg_err("Wrong state(%d)", state);
1572 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1573 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1576 ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_PAUSE);
1577 if (ret != MM_ERROR_NONE) {
1578 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1581 _mmcamcorder_set_state(handle, state_TO);
1583 /* set camera state to vconf key */
1584 if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
1585 int vconf_camera_state = 0;
1587 /* get current camera state of vconf key */
1588 vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state);
1589 vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_RECORDING_PAUSE);
1591 _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d",
1592 vconf_camera_state, VCONFKEY_CAMERA_STATE_RECORDING_PAUSE);
1594 int vconf_recorder_state = 0;
1596 /* get current recorder state of vconf key */
1597 vconf_get_int(VCONFKEY_RECORDER_STATE, &vconf_recorder_state);
1598 vconf_set_int(VCONFKEY_RECORDER_STATE, VCONFKEY_RECORDER_STATE_RECORDING_PAUSE);
1600 _mmcam_dbg_log("VCONFKEY_RECORDER_STATE prev %d -> cur %d",
1601 vconf_recorder_state, VCONFKEY_RECORDER_STATE_RECORDING_PAUSE);
1604 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1606 return MM_ERROR_NONE;
1608 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1609 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1611 _ERR_CAMCORDER_CMD_PRECON:
1613 _mmcam_dbg_err("Pause fail (type %d, state %d, ret %x)",
1614 hcamcorder->type, state, ret);
1620 int _mmcamcorder_commit(MMHandleType handle)
1622 int ret = MM_ERROR_NONE;
1623 int state = MM_CAMCORDER_STATE_NONE;
1624 int state_FROM1 = MM_CAMCORDER_STATE_RECORDING;
1625 int state_FROM2 = MM_CAMCORDER_STATE_PAUSED;
1626 int state_TO = MM_CAMCORDER_STATE_PREPARE;
1628 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1633 _mmcam_dbg_err("Not initialized");
1634 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1638 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1639 _mmcam_dbg_err("Another command is running.");
1640 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1641 goto _ERR_CAMCORDER_CMD_PRECON;
1644 state = _mmcamcorder_get_state(handle);
1645 if (state != state_FROM1 && state != state_FROM2) {
1646 _mmcam_dbg_err("Wrong state(%d)", state);
1647 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1648 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1651 ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_COMMIT);
1652 if (ret != MM_ERROR_NONE) {
1653 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1656 /* set camera state to vconf key */
1657 if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
1658 int vconf_camera_state = 0;
1660 /* get current camera state of vconf key */
1661 vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state);
1662 vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_PREVIEW);
1664 _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d",
1665 vconf_camera_state, VCONFKEY_CAMERA_STATE_PREVIEW);
1667 int vconf_recorder_state = 0;
1669 /* get current recorder state of vconf key */
1670 vconf_get_int(VCONFKEY_RECORDER_STATE, &vconf_recorder_state);
1671 vconf_set_int(VCONFKEY_RECORDER_STATE, VCONFKEY_RECORDER_STATE_CREATED);
1673 _mmcam_dbg_log("VCONFKEY_RECORDER_STATE prev %d -> cur %d",
1674 vconf_recorder_state, VCONFKEY_RECORDER_STATE_CREATED);
1677 /* check who calls unrealize. it's no need to set ASM state if caller is ASM */
1678 if (hcamcorder->state_change_by_system != _MMCAMCORDER_STATE_CHANGE_BY_ASM) {
1679 /* update session information */
1680 if (hcamcorder->asm_register == _MMCamcorder_ASM_SESSION_REGISTERED_BY_OUTSIDE ||
1681 hcamcorder->asm_register == _MMCamcorder_ASM_SESSION_REGISTERED_INTERNALLY) {
1682 _mmcam_dbg_log("session was registered to MEDIA_RECORD, update it to MEDIA");
1683 int asm_ret = MM_ERROR_NONE;
1684 hcamcorder->asm_session_type = MM_SESSION_TYPE_MEDIA;
1685 asm_ret = _mm_session_util_write_information(-1, hcamcorder->asm_session_type, hcamcorder->asm_session_options);
1686 if (asm_ret != MM_ERROR_NONE) {
1687 _mmcam_dbg_err("_mm_session_util_write_information() [type %d, options %x] failed[%x]", hcamcorder->asm_session_type, hcamcorder->asm_session_options, asm_ret);
1692 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1694 _mmcamcorder_set_state(handle,state_TO);
1696 return MM_ERROR_NONE;
1698 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1699 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1701 _ERR_CAMCORDER_CMD_PRECON:
1703 _mmcam_dbg_err("Commit fail (type %d, state %d, ret %x)",
1704 hcamcorder->type, state, ret);
1710 int _mmcamcorder_cancel(MMHandleType handle)
1712 int ret = MM_ERROR_NONE;
1713 int state = MM_CAMCORDER_STATE_NONE;
1714 int state_FROM1 = MM_CAMCORDER_STATE_RECORDING;
1715 int state_FROM2 = MM_CAMCORDER_STATE_PAUSED;
1716 int state_TO = MM_CAMCORDER_STATE_PREPARE;
1718 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1723 _mmcam_dbg_err("Not initialized");
1724 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1728 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1729 _mmcam_dbg_err("Another command is running.");
1730 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1731 goto _ERR_CAMCORDER_CMD_PRECON;
1734 state = _mmcamcorder_get_state(handle);
1735 if (state != state_FROM1 && state != state_FROM2) {
1736 _mmcam_dbg_err("Wrong state(%d)", state);
1737 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1738 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1741 ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_CANCEL);
1742 if (ret != MM_ERROR_NONE) {
1743 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1746 _mmcamcorder_set_state(handle, state_TO);
1748 /* update session information */
1749 if (hcamcorder->asm_register == _MMCamcorder_ASM_SESSION_REGISTERED_BY_OUTSIDE ||
1750 hcamcorder->asm_register == _MMCamcorder_ASM_SESSION_REGISTERED_INTERNALLY) {
1751 _mmcam_dbg_log("session was registered to MEDIA_RECORD, update it to MEDIA");
1752 int asm_ret = MM_ERROR_NONE;
1753 hcamcorder->asm_session_type = MM_SESSION_TYPE_MEDIA;
1754 asm_ret = _mm_session_util_write_information(-1, hcamcorder->asm_session_type, hcamcorder->asm_session_options);
1755 if (asm_ret != MM_ERROR_NONE) {
1756 _mmcam_dbg_err("_mm_session_util_write_information() [type %d, options %x] failed[%x]", hcamcorder->asm_session_type, hcamcorder->asm_session_options, asm_ret);
1760 /* set camera state to vconf key */
1761 if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
1762 int vconf_camera_state = 0;
1764 /* get current camera state of vconf key */
1765 vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state);
1766 vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_PREVIEW);
1768 _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d",
1769 vconf_camera_state, VCONFKEY_CAMERA_STATE_PREVIEW);
1771 int vconf_recorder_state = 0;
1773 /* get current recorder state of vconf key */
1774 vconf_get_int(VCONFKEY_RECORDER_STATE, &vconf_recorder_state);
1775 vconf_set_int(VCONFKEY_RECORDER_STATE, VCONFKEY_RECORDER_STATE_CREATED);
1777 _mmcam_dbg_log("VCONFKEY_RECORDER_STATE prev %d -> cur %d",
1778 vconf_recorder_state, VCONFKEY_RECORDER_STATE_CREATED);
1781 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1783 return MM_ERROR_NONE;
1785 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1786 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1788 _ERR_CAMCORDER_CMD_PRECON:
1790 _mmcam_dbg_err("Cancel fail (type %d, state %d, ret %x)",
1791 hcamcorder->type, state, ret);
1795 /* } Internal command functions */
1798 int _mmcamcorder_commit_async_end(MMHandleType handle)
1802 _mmcam_dbg_warn("_mmcamcorder_commit_async_end : MM_CAMCORDER_STATE_PREPARE");
1803 _mmcamcorder_set_state(handle, MM_CAMCORDER_STATE_PREPARE);
1805 return MM_ERROR_NONE;
1809 int _mmcamcorder_set_message_callback(MMHandleType handle, MMMessageCallback callback, void *user_data)
1811 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1813 _mmcam_dbg_log("%p", hcamcorder);
1815 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1817 if (callback == NULL) {
1818 _mmcam_dbg_warn("Message Callback is disabled, because application sets it to NULL");
1821 if (!_MMCAMCORDER_TRYLOCK_MESSAGE_CALLBACK(hcamcorder)) {
1822 _mmcam_dbg_warn("Application's message callback is running now");
1823 return MM_ERROR_CAMCORDER_INVALID_CONDITION;
1826 /* set message callback to message handle */
1827 hcamcorder->msg_cb = callback;
1828 hcamcorder->msg_cb_param = user_data;
1830 _MMCAMCORDER_UNLOCK_MESSAGE_CALLBACK(hcamcorder);
1832 return MM_ERROR_NONE;
1836 int _mmcamcorder_set_video_stream_callback(MMHandleType handle, mm_camcorder_video_stream_callback callback, void *user_data)
1838 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1840 /*_mmcam_dbg_log("");*/
1842 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1844 if (callback == NULL) {
1845 _mmcam_dbg_warn("Video Stream Callback is disabled, because application sets it to NULL");
1848 if (!_MMCAMCORDER_TRYLOCK_VSTREAM_CALLBACK(hcamcorder)) {
1849 _mmcam_dbg_warn("Application's video stream callback is running now");
1850 return MM_ERROR_CAMCORDER_INVALID_CONDITION;
1853 hcamcorder->vstream_cb = callback;
1854 hcamcorder->vstream_cb_param = user_data;
1856 _MMCAMCORDER_UNLOCK_VSTREAM_CALLBACK(hcamcorder);
1858 return MM_ERROR_NONE;
1862 int _mmcamcorder_set_video_frame_render_error_callback(MMHandleType handle, mm_camcorder_video_frame_render_error_callback callback, void *user_data)
1864 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1866 /*_mmcam_dbg_log("");*/
1868 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1870 if (callback == NULL) {
1871 _mmcam_dbg_warn("Video Frame Rencoder Error Callback is disabled, because application sets it to NULL");
1874 hcamcorder->render_error_cb = callback;
1875 hcamcorder->render_error_cb_user_param = user_data;
1877 return MM_ERROR_NONE;
1881 int _mmcamcorder_set_audio_stream_callback(MMHandleType handle, mm_camcorder_audio_stream_callback callback, void *user_data)
1883 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1887 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1889 if (callback == NULL) {
1890 _mmcam_dbg_warn("Audio Stream Callback is disabled, because application sets it to NULL");
1893 if (!_MMCAMCORDER_TRYLOCK_ASTREAM_CALLBACK(hcamcorder)) {
1894 _mmcam_dbg_warn("Application's audio stream callback is running now");
1895 return MM_ERROR_CAMCORDER_INVALID_CONDITION;
1898 hcamcorder->astream_cb = callback;
1899 hcamcorder->astream_cb_param = user_data;
1901 _MMCAMCORDER_UNLOCK_ASTREAM_CALLBACK(hcamcorder);
1903 return MM_ERROR_NONE;
1907 int _mmcamcorder_set_video_capture_callback(MMHandleType handle, mm_camcorder_video_capture_callback callback, void *user_data)
1909 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1913 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1915 if (callback == NULL) {
1916 _mmcam_dbg_warn("Video Capture Callback is disabled, because application sets it to NULLL");
1919 if (!_MMCAMCORDER_TRYLOCK_VCAPTURE_CALLBACK(hcamcorder)) {
1920 _mmcam_dbg_warn("Application's video capture callback is running now");
1921 return MM_ERROR_CAMCORDER_INVALID_CONDITION;
1924 hcamcorder->vcapture_cb = callback;
1925 hcamcorder->vcapture_cb_param = user_data;
1927 _MMCAMCORDER_UNLOCK_VCAPTURE_CALLBACK(hcamcorder);
1929 return MM_ERROR_NONE;
1932 int _mmcamcorder_get_current_state(MMHandleType handle)
1934 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1938 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1940 return _mmcamcorder_get_state(handle);
1943 int _mmcamcorder_init_focusing(MMHandleType handle)
1946 int state = MM_CAMCORDER_STATE_NONE;
1947 int focus_mode = MM_CAMCORDER_FOCUS_MODE_NONE;
1948 int af_range = MM_CAMCORDER_AUTO_FOCUS_NORMAL;
1949 int sensor_focus_mode = 0;
1950 int sensor_af_range = 0;
1951 int current_focus_mode = 0;
1952 int current_af_range = 0;
1953 mmf_camcorder_t *hcamcorder = NULL;
1954 _MMCamcorderSubContext *sc = NULL;
1955 GstCameraControl *control = NULL;
1959 hcamcorder = MMF_CAMCORDER(handle);
1960 mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1962 sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
1963 mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1965 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1966 _mmcam_dbg_err("Another command is running.");
1967 return MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1970 state = _mmcamcorder_get_state(handle);
1972 if (state == MM_CAMCORDER_STATE_CAPTURING ||
1973 state < MM_CAMCORDER_STATE_PREPARE) {
1974 _mmcam_dbg_err( "Not proper state. state[%d]", state );
1975 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1976 return MM_ERROR_CAMCORDER_INVALID_STATE;
1979 if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
1980 _mmcam_dbg_log("Can't cast Video source into camera control.");
1981 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1982 return MM_ERROR_NONE;
1985 control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
1986 if (control == NULL) {
1987 _mmcam_dbg_err("cast CAMERA_CONTROL failed");
1988 return MM_ERROR_CAMCORDER_INTERNAL;
1991 ret = gst_camera_control_stop_auto_focus(control);
1993 _mmcam_dbg_err("Auto focusing stop fail.");
1994 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1995 return MM_ERROR_CAMCORDER_DEVICE_IO;
1998 /* Initialize lens position */
1999 mm_camcorder_get_attributes(handle, NULL,
2000 MMCAM_CAMERA_FOCUS_MODE, &focus_mode,
2001 MMCAM_CAMERA_AF_SCAN_RANGE, &af_range,
2003 sensor_af_range = _mmcamcorder_convert_msl_to_sensor(handle, MM_CAM_CAMERA_AF_SCAN_RANGE, af_range);
2004 sensor_focus_mode = _mmcamcorder_convert_msl_to_sensor(handle, MM_CAM_CAMERA_FOCUS_MODE, focus_mode);
2006 gst_camera_control_get_focus(control, ¤t_focus_mode, ¤t_af_range);
2008 if (current_focus_mode != sensor_focus_mode ||
2009 current_af_range != sensor_af_range) {
2010 ret = gst_camera_control_set_focus(control, sensor_focus_mode, sensor_af_range);
2012 _mmcam_dbg_log("No need to init FOCUS [mode:%d, range:%d]", focus_mode, af_range );
2016 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
2019 _mmcam_dbg_log("Lens init success.");
2020 return MM_ERROR_NONE;
2022 _mmcam_dbg_err("Lens init fail.");
2023 return MM_ERROR_CAMCORDER_DEVICE_IO;
2027 int _mmcamcorder_adjust_focus(MMHandleType handle, int direction)
2030 int focus_mode = MM_CAMCORDER_FOCUS_MODE_NONE;
2031 int ret = MM_ERROR_UNKNOWN;
2032 char *err_attr_name = NULL;
2034 mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
2035 mmf_return_val_if_fail(direction, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
2037 /*_mmcam_dbg_log("");*/
2039 if (!_MMCAMCORDER_TRYLOCK_CMD(handle)) {
2040 _mmcam_dbg_err("Another command is running.");
2041 return MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
2044 state = _mmcamcorder_get_state(handle);
2045 if (state == MM_CAMCORDER_STATE_CAPTURING ||
2046 state < MM_CAMCORDER_STATE_PREPARE) {
2047 _mmcam_dbg_err("Not proper state. state[%d]", state);
2048 _MMCAMCORDER_UNLOCK_CMD(handle);
2049 return MM_ERROR_CAMCORDER_INVALID_STATE;
2052 /* TODO : call a auto or manual focus function */
2053 ret = mm_camcorder_get_attributes(handle, &err_attr_name,
2054 MMCAM_CAMERA_FOCUS_MODE, &focus_mode,
2056 if (ret != MM_ERROR_NONE) {
2057 _mmcam_dbg_warn("Get focus-mode fail. (%s:%x)", err_attr_name, ret);
2058 SAFE_FREE (err_attr_name);
2059 _MMCAMCORDER_UNLOCK_CMD(handle);
2063 if (focus_mode == MM_CAMCORDER_FOCUS_MODE_MANUAL) {
2064 ret = _mmcamcorder_adjust_manual_focus(handle, direction);
2065 } else if (focus_mode == MM_CAMCORDER_FOCUS_MODE_AUTO ||
2066 focus_mode == MM_CAMCORDER_FOCUS_MODE_TOUCH_AUTO ||
2067 focus_mode == MM_CAMCORDER_FOCUS_MODE_CONTINUOUS) {
2068 ret = _mmcamcorder_adjust_auto_focus(handle);
2070 _mmcam_dbg_err("It doesn't adjust focus. Focusing mode(%d)", focus_mode);
2071 ret = MM_ERROR_CAMCORDER_NOT_SUPPORTED;
2074 _MMCAMCORDER_UNLOCK_CMD(handle);
2079 int _mmcamcorder_adjust_manual_focus(MMHandleType handle, int direction)
2084 int focus_level = 0;
2085 float unit_level = 0;
2086 GstCameraControl *control = NULL;
2087 _MMCamcorderSubContext *sc = NULL;
2088 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2092 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
2093 mmf_return_val_if_fail(_MMFCAMCORDER_FOCUS_TOTAL_LEVEL != 1, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
2094 mmf_return_val_if_fail((direction >= MM_CAMCORDER_MF_LENS_DIR_FORWARD) &&
2095 (direction <= MM_CAMCORDER_MF_LENS_DIR_BACKWARD),
2096 MM_ERROR_CAMCORDER_INVALID_ARGUMENT );
2098 sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
2099 mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
2101 if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
2102 _mmcam_dbg_log("Can't cast Video source into camera control.");
2103 return MM_ERROR_NONE;
2106 control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
2107 if (control == NULL) {
2108 _mmcam_dbg_err("cast CAMERA_CONTROL failed");
2109 return MM_ERROR_CAMCORDER_INTERNAL;
2112 /* TODO : get max, min level */
2113 if (max_level - min_level + 1 < _MMFCAMCORDER_FOCUS_TOTAL_LEVEL) {
2114 _mmcam_dbg_warn("Total level of manual focus of MMF is greater than that of the camera driver.");
2117 unit_level = ((float)max_level - (float)min_level)/(float)(_MMFCAMCORDER_FOCUS_TOTAL_LEVEL - 1);
2119 if (!gst_camera_control_get_focus_level(control, &cur_level)) {
2120 _mmcam_dbg_err("Can't get current level of manual focus.");
2121 return MM_ERROR_CAMCORDER_DEVICE_IO;
2124 //TODO : adjust unit level value
2125 if (direction == MM_CAMCORDER_MF_LENS_DIR_FORWARD) {
2126 focus_level = cur_level + unit_level;
2127 } else if (direction == MM_CAMCORDER_MF_LENS_DIR_BACKWARD) {
2128 focus_level = cur_level - unit_level;
2131 if (focus_level > max_level) {
2132 focus_level = max_level;
2133 } else if (focus_level < min_level) {
2134 focus_level = min_level;
2137 if (!gst_camera_control_set_focus_level(control, focus_level)) {
2138 _mmcam_dbg_err("Manual focusing fail.");
2139 return MM_ERROR_CAMCORDER_DEVICE_IO;
2142 return MM_ERROR_NONE;
2146 int _mmcamcorder_adjust_auto_focus(MMHandleType handle)
2149 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2150 GstCameraControl *control = NULL;
2151 _MMCamcorderSubContext *sc = NULL;
2153 mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
2155 /*_mmcam_dbg_log("");*/
2157 sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
2159 if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
2160 _mmcam_dbg_log("Can't cast Video source into camera control.");
2161 return MM_ERROR_NONE;
2164 control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
2167 ret = gst_camera_control_start_auto_focus(control);
2169 _mmcam_dbg_err("cast CAMERA_CONTROL failed");
2174 _mmcam_dbg_log("Auto focusing start success.");
2175 return MM_ERROR_NONE;
2177 _mmcam_dbg_err("Auto focusing start fail.");
2178 return MM_ERROR_CAMCORDER_DEVICE_IO;
2182 int _mmcamcorder_stop_focusing(MMHandleType handle)
2184 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2185 _MMCamcorderSubContext *sc = NULL;
2188 GstCameraControl *control = NULL;
2190 mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
2192 /*_mmcam_dbg_log("");*/
2194 sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
2196 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
2197 _mmcam_dbg_err("Another command is running.");
2198 return MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
2201 state = _mmcamcorder_get_state(handle);
2202 if (state == MM_CAMCORDER_STATE_CAPTURING ||
2203 state < MM_CAMCORDER_STATE_PREPARE) {
2204 _mmcam_dbg_err( "Not proper state. state[%d]", state );
2205 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
2206 return MM_ERROR_CAMCORDER_INVALID_STATE;
2209 if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
2210 _mmcam_dbg_log("Can't cast Video source into camera control.");
2211 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
2212 return MM_ERROR_NONE;
2214 control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
2216 ret = gst_camera_control_stop_auto_focus(control);
2218 _mmcam_dbg_err("cast CAMERA_CONTROL failed");
2222 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
2225 _mmcam_dbg_log("Auto focusing stop success.");
2226 return MM_ERROR_NONE;
2228 _mmcam_dbg_err("Auto focusing stop fail.");
2229 return MM_ERROR_CAMCORDER_DEVICE_IO;
2234 /*-----------------------------------------------
2235 | CAMCORDER INTERNAL LOCAL |
2236 -----------------------------------------------*/
2238 __mmcamcorder_gstreamer_init(camera_conf * conf)
2240 static const int max_argc = 10;
2244 gchar **argv = NULL;
2246 gboolean ret = FALSE;
2247 type_string_array *GSTInitOption = NULL;
2249 mmf_return_val_if_fail(conf, FALSE);
2254 argc = malloc(sizeof(int));
2255 argv = malloc(sizeof(gchar *) * max_argc);
2257 if (!argc || !argv) {
2261 memset(argv, 0, sizeof(gchar *) * max_argc);
2265 argv[0] = g_strdup("mmcamcorder");
2268 _mmcamcorder_conf_get_value_string_array(conf,
2269 CONFIGURE_CATEGORY_MAIN_GENERAL,
2272 if (GSTInitOption != NULL && GSTInitOption->value) {
2273 cnt_str = GSTInitOption->count;
2274 for( ; *argc < max_argc && *argc <= cnt_str ; (*argc)++ )
2276 argv[*argc] = g_strdup(GSTInitOption->value[(*argc)-1]);
2280 _mmcam_dbg_log("initializing gstreamer with following parameter[argc:%d]", *argc);
2282 for (i = 0; i < *argc; i++) {
2283 _mmcam_dbg_log("argv[%d] : %s", i, argv[i]);
2286 /* initializing gstreamer */
2287 ret = gst_init_check (argc, &argv, &err);
2289 _mmcam_dbg_err("Could not initialize GStreamer: %s ",
2290 err ? err->message : "unknown error occurred");
2297 for (i = 0; i < *argc; i++) {
2317 _mmcam_dbg_err("failed to initialize gstreamer");
2333 int _mmcamcorder_get_state(MMHandleType handle)
2336 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2338 mmf_return_val_if_fail(hcamcorder, -1);
2340 _MMCAMCORDER_LOCK_STATE(handle);
2342 state = hcamcorder->state;
2343 /*_mmcam_dbg_log("state=%d",state);*/
2345 _MMCAMCORDER_UNLOCK_STATE(handle);
2351 void _mmcamcorder_set_state(MMHandleType handle, int state)
2354 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2355 _MMCamcorderMsgItem msg;
2357 mmf_return_if_fail(hcamcorder);
2359 /*_mmcam_dbg_log("");*/
2361 _MMCAMCORDER_LOCK_STATE(handle);
2363 old_state = hcamcorder->state;
2364 if(old_state != state) {
2365 hcamcorder->state = state;
2366 hcamcorder->target_state = state;
2368 _mmcam_dbg_log("set state[%d] and send state-changed message", state);
2370 /* To discern who changes the state */
2371 switch (hcamcorder->state_change_by_system) {
2372 case _MMCAMCORDER_STATE_CHANGE_BY_ASM:
2373 msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED_BY_ASM;
2374 msg.param.state.code = hcamcorder->asm_event_code;
2376 case _MMCAMCORDER_STATE_CHANGE_NORMAL:
2378 msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
2379 msg.param.state.code = MM_ERROR_NONE;
2383 msg.param.state.previous = old_state;
2384 msg.param.state.current = state;
2386 /*_mmcam_dbg_log("_mmcamcroder_send_message : msg : %p, id:%x", &msg, msg.id);*/
2387 _mmcamcroder_send_message(handle, &msg);
2390 _MMCAMCORDER_UNLOCK_STATE(handle);
2396 int _mmcamcorder_get_async_state(MMHandleType handle)
2399 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2401 _MMCAMCORDER_LOCK_STATE(handle);
2402 state = hcamcorder->target_state;
2404 _MMCAMCORDER_UNLOCK_STATE(handle);
2410 _MMCamcorderSubContext *_mmcamcorder_alloc_subcontext(int type)
2413 _MMCamcorderSubContext *sc = NULL;
2415 /*_mmcam_dbg_log("");*/
2417 /* alloc container */
2418 sc = (_MMCamcorderSubContext *)malloc(sizeof(_MMCamcorderSubContext));
2419 mmf_return_val_if_fail(sc != NULL, NULL);
2422 memset(sc, 0x00, sizeof(_MMCamcorderSubContext));
2424 sc->element_num = _MMCAMCORDER_PIPELINE_ELEMENT_NUM;
2425 sc->encode_element_num = _MMCAMCORDER_ENCODE_PIPELINE_ELEMENT_NUM;
2427 /* alloc info for each mode */
2429 case MM_CAMCORDER_MODE_AUDIO:
2430 sc->info_audio = malloc( sizeof(_MMCamcorderAudioInfo));
2431 if(!sc->info_audio) {
2432 _mmcam_dbg_err("Failed to alloc info structure");
2433 goto ALLOC_SUBCONTEXT_FAILED;
2435 memset(sc->info_audio, 0x00, sizeof(_MMCamcorderAudioInfo));
2437 case MM_CAMCORDER_MODE_VIDEO_CAPTURE:
2439 sc->info_image = malloc( sizeof(_MMCamcorderImageInfo));
2440 if(!sc->info_image) {
2441 _mmcam_dbg_err("Failed to alloc info structure");
2442 goto ALLOC_SUBCONTEXT_FAILED;
2444 memset(sc->info_image, 0x00, sizeof(_MMCamcorderImageInfo));
2446 /* init sound status */
2447 sc->info_image->sound_status = _SOUND_STATUS_INIT;
2449 sc->info_video = malloc( sizeof(_MMCamcorderVideoInfo));
2450 if(!sc->info_video) {
2451 _mmcam_dbg_err("Failed to alloc info structure");
2452 goto ALLOC_SUBCONTEXT_FAILED;
2454 memset(sc->info_video, 0x00, sizeof(_MMCamcorderVideoInfo));
2455 pthread_mutex_init(&(sc->info_video->size_check_lock), NULL);
2459 /* alloc element array */
2460 sc->element = (_MMCamcorderGstElement *)malloc(sizeof(_MMCamcorderGstElement) * sc->element_num);
2462 _mmcam_dbg_err("Failed to alloc element structure");
2463 goto ALLOC_SUBCONTEXT_FAILED;
2466 sc->encode_element = (_MMCamcorderGstElement *)malloc(sizeof(_MMCamcorderGstElement) * sc->encode_element_num);
2467 if(!sc->encode_element) {
2468 _mmcam_dbg_err("Failed to alloc encode element structure");
2469 goto ALLOC_SUBCONTEXT_FAILED;
2472 for (i = 0 ; i < sc->element_num ; i++) {
2473 sc->element[i].id = _MMCAMCORDER_NONE;
2474 sc->element[i].gst = NULL;
2477 for (i = 0 ; i < sc->encode_element_num ; i++) {
2478 sc->encode_element[i].id = _MMCAMCORDER_NONE;
2479 sc->encode_element[i].gst = NULL;
2482 sc->fourcc = 0x80000000;
2483 sc->cam_stability_count = 0;
2484 sc->drop_vframe = 0;
2485 sc->pass_first_vframe = 0;
2486 sc->is_modified_rate = FALSE;
2490 ALLOC_SUBCONTEXT_FAILED:
2492 if (sc->info_audio) {
2493 free(sc->info_audio);
2494 sc->info_audio = NULL;
2496 if (sc->info_image) {
2497 free(sc->info_image);
2498 sc->info_image = NULL;
2500 if (sc->info_video) {
2501 pthread_mutex_destroy(&(sc->info_video->size_check_lock));
2502 free(sc->info_video);
2503 sc->info_video = NULL;
2509 if (sc->encode_element) {
2510 free(sc->encode_element);
2511 sc->encode_element = NULL;
2521 void _mmcamcorder_dealloc_subcontext(_MMCamcorderSubContext *sc)
2527 _mmcam_dbg_log("release element");
2532 if (sc->encode_element) {
2533 _mmcam_dbg_log("release encode_element");
2534 free(sc->encode_element);
2535 sc->encode_element = NULL;
2538 if (sc->info_image) {
2539 _mmcam_dbg_log("release info_image");
2540 free(sc->info_image);
2541 sc->info_image = NULL;
2544 if (sc->info_video) {
2545 _mmcam_dbg_log("release info_video");
2546 if (sc->info_video->filename) {
2547 free(sc->info_video->filename);
2548 sc->info_video->filename = NULL;
2550 pthread_mutex_destroy(&(sc->info_video->size_check_lock));
2551 free(sc->info_video);
2552 sc->info_video = NULL;
2555 if (sc->info_audio) {
2556 _mmcam_dbg_log("release info_audio");
2557 if (sc->info_audio->filename) {
2558 free(sc->info_audio->filename);
2559 sc->info_audio->filename = NULL;
2561 free(sc->info_audio);
2562 sc->info_audio = NULL;
2573 int _mmcamcorder_set_functions(MMHandleType handle, int type)
2575 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2577 /*_mmcam_dbg_log("");*/
2580 case MM_CAMCORDER_MODE_AUDIO:
2581 hcamcorder->command = _mmcamcorder_audio_command;
2583 case MM_CAMCORDER_MODE_VIDEO_CAPTURE:
2585 hcamcorder->command = _mmcamcorder_video_capture_command;
2589 return MM_ERROR_NONE;
2593 gboolean _mmcamcorder_pipeline_cb_message(GstBus *bus, GstMessage *message, gpointer data)
2595 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(data);
2596 _MMCamcorderSubContext *sc = NULL;
2598 mmf_return_val_if_fail(hcamcorder, FALSE);
2599 mmf_return_val_if_fail(message, FALSE);
2600 //_mmcam_dbg_log("message type=(%d)", GST_MESSAGE_TYPE(message));
2602 switch (GST_MESSAGE_TYPE(message)) {
2603 case GST_MESSAGE_UNKNOWN:
2604 _mmcam_dbg_log("GST_MESSAGE_UNKNOWN");
2606 case GST_MESSAGE_EOS:
2608 _mmcam_dbg_log ("Got EOS from element \"%s\".",
2609 GST_STR_NULL(GST_ELEMENT_NAME(GST_MESSAGE_SRC(message))));
2611 sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
2612 mmf_return_val_if_fail(sc, TRUE);
2614 if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
2615 mmf_return_val_if_fail(sc->info_video, TRUE);
2616 if (sc->info_video->b_commiting) {
2617 _mmcamcorder_video_handle_eos((MMHandleType)hcamcorder);
2620 mmf_return_val_if_fail(sc->info_audio, TRUE);
2621 if (sc->info_audio->b_commiting) {
2622 _mmcamcorder_audio_handle_eos((MMHandleType)hcamcorder);
2626 sc->bget_eos = TRUE;
2630 case GST_MESSAGE_ERROR:
2634 gst_message_parse_error(message, &err, &debug);
2636 _mmcam_dbg_err ("GSTERR: %s", err->message);
2637 _mmcam_dbg_err ("Error Debug: %s", debug);
2639 __mmcamcorder_handle_gst_error((MMHandleType)hcamcorder, message, err);
2645 case GST_MESSAGE_WARNING:
2649 gst_message_parse_warning (message, &err, &debug);
2651 _mmcam_dbg_warn("GSTWARN: %s", err->message);
2653 __mmcamcorder_handle_gst_warning((MMHandleType)hcamcorder, message, err);
2659 case GST_MESSAGE_INFO:
2660 _mmcam_dbg_log("GST_MESSAGE_INFO");
2662 case GST_MESSAGE_TAG:
2663 _mmcam_dbg_log("GST_MESSAGE_TAG");
2665 case GST_MESSAGE_BUFFERING:
2666 _mmcam_dbg_log("GST_MESSAGE_BUFFERING");
2668 case GST_MESSAGE_STATE_CHANGED:
2670 const GValue *vnewstate;
2672 GstElement *pipeline = NULL;
2674 sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
2675 if ((sc) && (sc->element)) {
2676 if (sc->element[_MMCAMCORDER_MAIN_PIPE].gst) {
2677 pipeline = sc->element[_MMCAMCORDER_MAIN_PIPE].gst;
2678 if (message->src == (GstObject*)pipeline) {
2679 vnewstate = gst_structure_get_value(message->structure, "new-state");
2680 newstate = (GstState)vnewstate->data[0].v_int;
2681 _mmcam_dbg_log("GST_MESSAGE_STATE_CHANGED[%s]",gst_element_state_get_name(newstate));
2687 case GST_MESSAGE_STATE_DIRTY:
2688 _mmcam_dbg_log("GST_MESSAGE_STATE_DIRTY");
2690 case GST_MESSAGE_STEP_DONE:
2691 _mmcam_dbg_log("GST_MESSAGE_STEP_DONE");
2693 case GST_MESSAGE_CLOCK_PROVIDE:
2694 _mmcam_dbg_log("GST_MESSAGE_CLOCK_PROVIDE");
2696 case GST_MESSAGE_CLOCK_LOST:
2697 _mmcam_dbg_log("GST_MESSAGE_CLOCK_LOST");
2699 case GST_MESSAGE_NEW_CLOCK:
2701 GstClock *pipe_clock = NULL;
2702 gst_message_parse_new_clock(message, &pipe_clock);
2703 /*_mmcam_dbg_log("GST_MESSAGE_NEW_CLOCK : %s", (clock ? GST_OBJECT_NAME (clock) : "NULL"));*/
2706 case GST_MESSAGE_STRUCTURE_CHANGE:
2707 _mmcam_dbg_log("GST_MESSAGE_STRUCTURE_CHANGE");
2709 case GST_MESSAGE_STREAM_STATUS:
2710 /*_mmcam_dbg_log("GST_MESSAGE_STREAM_STATUS");*/
2712 case GST_MESSAGE_APPLICATION:
2713 _mmcam_dbg_log("GST_MESSAGE_APPLICATION");
2715 case GST_MESSAGE_ELEMENT:
2716 /*_mmcam_dbg_log("GST_MESSAGE_ELEMENT");*/
2718 case GST_MESSAGE_SEGMENT_START:
2719 _mmcam_dbg_log("GST_MESSAGE_SEGMENT_START");
2721 case GST_MESSAGE_SEGMENT_DONE:
2722 _mmcam_dbg_log("GST_MESSAGE_SEGMENT_DONE");
2724 case GST_MESSAGE_DURATION:
2725 _mmcam_dbg_log("GST_MESSAGE_DURATION");
2727 case GST_MESSAGE_LATENCY:
2728 _mmcam_dbg_log("GST_MESSAGE_LATENCY");
2730 case GST_MESSAGE_ASYNC_START:
2731 _mmcam_dbg_log("GST_MESSAGE_ASYNC_START");
2733 case GST_MESSAGE_ASYNC_DONE:
2734 /*_mmcam_dbg_log("GST_MESSAGE_ASYNC_DONE");*/
2736 case GST_MESSAGE_ANY:
2737 _mmcam_dbg_log("GST_MESSAGE_ANY");
2740 _mmcam_dbg_log("not handled message type=(%d)", GST_MESSAGE_TYPE(message));
2748 GstBusSyncReply _mmcamcorder_pipeline_bus_sync_callback(GstBus *bus, GstMessage *message, gpointer data)
2750 GstElement *element = NULL;
2752 gchar *debug_info = NULL;
2754 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(data);
2755 _MMCamcorderSubContext *sc = NULL;
2757 mmf_return_val_if_fail(hcamcorder, GST_BUS_PASS);
2758 mmf_return_val_if_fail(message, GST_BUS_PASS);
2760 sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
2761 mmf_return_val_if_fail(sc, GST_BUS_PASS);
2763 if (GST_MESSAGE_TYPE(message) == GST_MESSAGE_ERROR) {
2764 /* parse error message */
2765 gst_message_parse_error(message, &err, &debug_info);
2768 _mmcam_dbg_err("GST ERROR : %s", debug_info);
2774 _mmcam_dbg_warn("failed to parse error message");
2775 return GST_BUS_PASS;
2778 /* set videosrc element to compare */
2779 element = GST_ELEMENT_CAST(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
2781 /* check domain[RESOURCE] and element[VIDEOSRC] */
2782 if (err->domain == GST_RESOURCE_ERROR &&
2783 GST_ELEMENT_CAST(message->src) == element) {
2784 switch (err->code) {
2785 case GST_RESOURCE_ERROR_BUSY:
2786 _mmcam_dbg_err("Camera device [busy]");
2787 sc->error_code = MM_ERROR_CAMCORDER_DEVICE_BUSY;
2789 case GST_RESOURCE_ERROR_OPEN_WRITE:
2790 _mmcam_dbg_err("Camera device [open failed]");
2791 sc->error_code = MM_ERROR_COMMON_INVALID_PERMISSION;
2792 //sc->error_code = MM_ERROR_CAMCORDER_DEVICE_OPEN; // SECURITY PART REQUEST PRIVILEGE
2794 case GST_RESOURCE_ERROR_OPEN_READ_WRITE:
2795 _mmcam_dbg_err("Camera device [open failed]");
2796 sc->error_code = MM_ERROR_CAMCORDER_DEVICE_OPEN;
2798 case GST_RESOURCE_ERROR_OPEN_READ:
2799 _mmcam_dbg_err("Camera device [register trouble]");
2800 sc->error_code = MM_ERROR_CAMCORDER_DEVICE_REG_TROUBLE;
2802 case GST_RESOURCE_ERROR_NOT_FOUND:
2803 _mmcam_dbg_err("Camera device [device not found]");
2804 sc->error_code = MM_ERROR_CAMCORDER_DEVICE_NOT_FOUND;
2806 case GST_RESOURCE_ERROR_TOO_LAZY:
2807 _mmcam_dbg_err("Camera device [timeout]");
2808 sc->error_code = MM_ERROR_CAMCORDER_DEVICE_TIMEOUT;
2810 case GST_RESOURCE_ERROR_SETTINGS:
2811 _mmcam_dbg_err("Camera device [not supported]");
2812 sc->error_code = MM_ERROR_CAMCORDER_NOT_SUPPORTED;
2814 case GST_RESOURCE_ERROR_FAILED:
2815 _mmcam_dbg_err("Camera device [working failed].");
2816 sc->error_code = MM_ERROR_CAMCORDER_DEVICE_IO;
2819 _mmcam_dbg_err("Camera device [General(%d)]", err->code);
2820 sc->error_code = MM_ERROR_CAMCORDER_DEVICE;
2824 sc->error_occurs = TRUE;
2829 /* store error code and drop this message if cmd is running */
2830 if (sc->error_code != MM_ERROR_NONE) {
2831 _MMCamcorderMsgItem msg;
2833 /* post error to application */
2834 sc->error_occurs = TRUE;
2835 msg.id = MM_MESSAGE_CAMCORDER_ERROR;
2836 msg.param.code = sc->error_code;
2837 _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
2839 gst_message_unref(message);
2842 return GST_BUS_DROP;
2844 } else if (GST_MESSAGE_TYPE(message) == GST_MESSAGE_ELEMENT) {
2845 _MMCamcorderMsgItem msg;
2847 if (gst_structure_has_name(message->structure, "avsysvideosrc-AF") ||
2848 gst_structure_has_name(message->structure, "camerasrc-AF")) {
2849 int focus_state = 0;
2851 gst_structure_get_int(message->structure, "focus-state", &focus_state);
2852 _mmcam_dbg_log("Focus State:%d", focus_state);
2854 msg.id = MM_MESSAGE_CAMCORDER_FOCUS_CHANGED;
2855 msg.param.code = focus_state;
2856 _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
2858 gst_message_unref(message);
2861 return GST_BUS_DROP;
2862 } else if (gst_structure_has_name(message->structure, "camerasrc-Light")) {
2863 int low_light_state = 0;
2865 gst_structure_get_int(message->structure, "low-light-state", &low_light_state);
2866 _mmcam_dbg_log("Low light state %d", low_light_state);
2868 msg.id = MM_MESSAGE_CAMCORDER_LOW_LIGHT_STATE;
2869 msg.param.code = low_light_state;
2870 _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
2872 gst_message_unref(message);
2875 return GST_BUS_DROP;
2876 } else if (gst_structure_has_name(message->structure, "camerasrc-HDR")) {
2880 if (gst_structure_get_int(message->structure, "progress", &progress)) {
2881 gst_structure_get_int(message->structure, "status", &status);
2882 _mmcam_dbg_log("HDR progress %d percent, status %d", progress, status);
2884 msg.id = MM_MESSAGE_CAMCORDER_HDR_PROGRESS;
2885 msg.param.code = progress;
2886 _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
2889 gst_message_unref(message);
2892 return GST_BUS_DROP;
2893 } else if (gst_structure_has_name(message->structure, "camerasrc-FD")) {
2895 const GValue *g_value = gst_structure_get_value(message->structure, "face-info");;
2896 GstCameraControlFaceDetectInfo *fd_info = NULL;
2897 MMCamFaceDetectInfo *cam_fd_info = NULL;
2900 fd_info = (GstCameraControlFaceDetectInfo *)g_value_get_pointer(g_value);
2903 if (fd_info == NULL) {
2904 _mmcam_dbg_warn("fd_info is NULL");
2908 cam_fd_info = (MMCamFaceDetectInfo *)malloc(sizeof(MMCamFaceDetectInfo));
2909 if (cam_fd_info == NULL) {
2910 _mmcam_dbg_warn("cam_fd_info alloc failed");
2918 /* set total face count */
2919 cam_fd_info->num_of_faces = fd_info->num_of_faces;
2921 if (cam_fd_info->num_of_faces > 0) {
2922 cam_fd_info->face_info = (MMCamFaceInfo *)malloc(sizeof(MMCamFaceInfo) * cam_fd_info->num_of_faces);
2923 if (cam_fd_info->face_info) {
2924 /* set information of each face */
2925 for (i = 0 ; i < fd_info->num_of_faces ; i++) {
2926 cam_fd_info->face_info[i].id = fd_info->face_info[i].id;
2927 cam_fd_info->face_info[i].score = fd_info->face_info[i].score;
2928 cam_fd_info->face_info[i].rect.x = fd_info->face_info[i].rect.x;
2929 cam_fd_info->face_info[i].rect.y = fd_info->face_info[i].rect.y;
2930 cam_fd_info->face_info[i].rect.width = fd_info->face_info[i].rect.width;
2931 cam_fd_info->face_info[i].rect.height = fd_info->face_info[i].rect.height;
2933 _mmcam_dbg_log("id %d, score %d, [%d,%d,%dx%d]",
2934 fd_info->face_info[i].id,
2935 fd_info->face_info[i].score,
2936 fd_info->face_info[i].rect.x,
2937 fd_info->face_info[i].rect.y,
2938 fd_info->face_info[i].rect.width,
2939 fd_info->face_info[i].rect.height);
2943 _mmcam_dbg_warn("MMCamFaceInfo alloc failed");
2945 /* free allocated memory that is not sent */
2950 cam_fd_info->face_info = NULL;
2954 /* send message - cam_fd_info should be freed by application */
2955 msg.id = MM_MESSAGE_CAMCORDER_FACE_DETECT_INFO;
2956 msg.param.data = cam_fd_info;
2957 msg.param.size = sizeof(MMCamFaceDetectInfo);
2960 _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
2963 /* free fd_info allocated by plugin */
2967 gst_message_unref(message);
2970 return GST_BUS_DROP;
2971 } else if (gst_structure_has_name(message->structure, "camerasrc-Capture")) {
2972 int capture_done = FALSE;
2974 if (gst_structure_get_int(message->structure, "capture-done", &capture_done)) {
2975 sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
2976 if (sc && sc->info_image) {
2977 /* play capture sound */
2978 _mmcamcorder_sound_solo_play((MMHandleType)hcamcorder, _MMCAMCORDER_FILEPATH_CAPTURE_SND, FALSE);
2982 gst_message_unref(message);
2985 return GST_BUS_DROP;
2989 return GST_BUS_PASS;
2992 GstBusSyncReply _mmcamcorder_audio_pipeline_bus_sync_callback(GstBus *bus, GstMessage *message, gpointer data)
2994 GstElement *element = NULL;
2996 gchar *debug_info = NULL;
2998 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(data);
2999 _MMCamcorderSubContext *sc = NULL;
3001 mmf_return_val_if_fail(hcamcorder, GST_BUS_PASS);
3002 mmf_return_val_if_fail(message, GST_BUS_PASS);
3004 sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
3005 mmf_return_val_if_fail(sc, GST_BUS_PASS);
3007 if (GST_MESSAGE_TYPE(message) == GST_MESSAGE_ERROR) {
3008 /* parse error message */
3009 gst_message_parse_error(message, &err, &debug_info);
3012 _mmcam_dbg_err("GST ERROR : %s", debug_info);
3018 _mmcam_dbg_warn("failed to parse error message");
3019 return GST_BUS_PASS;
3022 /* set videosrc element to compare */
3023 element = GST_ELEMENT_CAST(sc->encode_element[_MMCAMCORDER_AUDIOSRC_SRC].gst);
3025 /* check domain[RESOURCE] and element[VIDEOSRC] */
3026 if (err->domain == GST_RESOURCE_ERROR &&
3027 GST_ELEMENT_CAST(message->src) == element) {
3028 _MMCamcorderMsgItem msg;
3029 switch (err->code) {
3030 case GST_RESOURCE_ERROR_OPEN_READ_WRITE:
3031 case GST_RESOURCE_ERROR_OPEN_WRITE:
3032 _mmcam_dbg_err("audio device [open failed]");
3033 sc->error_code = MM_ERROR_COMMON_INVALID_PERMISSION;
3034 /* post error to application */
3035 sc->error_occurs = TRUE;
3036 msg.id = MM_MESSAGE_CAMCORDER_ERROR;
3037 msg.param.code = sc->error_code;
3038 _mmcam_dbg_err(" error : sc->error_occurs %d",sc->error_occurs);
3040 _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
3041 gst_message_unref(message);
3043 return GST_BUS_DROP;
3053 return GST_BUS_PASS;
3057 ASM_cb_result_t _mmcamcorder_asm_callback(int handle, ASM_event_sources_t event_src,
3058 ASM_sound_commands_t command,
3059 unsigned int sound_status, void* cb_data)
3061 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(cb_data);
3062 int current_state = MM_CAMCORDER_STATE_NONE;
3063 ASM_cb_result_t cb_res = ASM_CB_RES_NONE;
3065 mmf_return_val_if_fail((MMHandleType)hcamcorder, ASM_CB_RES_NONE);
3067 current_state = _mmcamcorder_get_state((MMHandleType)hcamcorder);
3068 if (current_state <= MM_CAMCORDER_STATE_NONE ||
3069 current_state >= MM_CAMCORDER_STATE_NUM) {
3070 _mmcam_dbg_err("Abnormal state. Or null handle. (%p, %d, %d)", hcamcorder, command, current_state);
3073 /* set value to inform a status is changed by asm */
3074 hcamcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_BY_ASM;
3076 /* set ASM event code for sending it to application */
3077 hcamcorder->asm_event_code = event_src;
3079 _mmcam_dbg_log("ASM SHARE callback : event code 0x%x, command 0x%x", event_src, command);
3081 _MMCAMCORDER_LOCK_ASM(hcamcorder);
3084 case ASM_COMMAND_PAUSE:
3085 _mmcam_dbg_log("Got msg from asm to Pause(state:%d)", current_state);
3087 if (hcamcorder->asm_event_type == ASM_EVENT_MMCAMCORDER_AUDIO || hcamcorder->asm_event_type == ASM_EVENT_MEDIA_MMCAMCORDER) {
3088 if (current_state == MM_CAMCORDER_STATE_RECORDING) {
3089 _mmcamcorder_pause((MMHandleType)hcamcorder);
3090 } else if (current_state == MM_CAMCORDER_STATE_PAUSED) {
3091 _MMCamcorderMsgItem msg;
3093 _mmcam_dbg_warn("Now PAUSED state, only send message to nofity interrupt");
3095 msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED_BY_ASM;
3096 msg.param.state.code = hcamcorder->asm_event_code;
3097 msg.param.state.previous = MM_CAMCORDER_STATE_PAUSED;
3098 msg.param.state.current = MM_CAMCORDER_STATE_PAUSED;
3100 _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
3102 _mmcam_dbg_log("do nothing at this state %d", current_state);
3105 __mmcamcorder_force_stop(hcamcorder);
3107 cb_res = ASM_CB_RES_STOP;
3109 _mmcam_dbg_log("Finish opeartion.");
3111 case ASM_COMMAND_STOP:
3112 _mmcam_dbg_log("Got msg from asm to Stop(state:%d)", current_state);
3114 __mmcamcorder_force_stop(hcamcorder);
3115 cb_res = ASM_CB_RES_STOP;
3117 _mmcam_dbg_log("Finish opeartion. Camera is released.(%d)", cb_res);
3119 case ASM_COMMAND_PLAY:
3120 _mmcam_dbg_log("Got msg from asm to Play(state %d)", current_state);
3122 if (current_state >= MM_CAMCORDER_STATE_PREPARE) {
3123 _mmcam_dbg_log("Already start previewing");
3125 __mmcamcorder_force_resume(hcamcorder);
3128 cb_res = ASM_CB_RES_PLAYING;
3130 _mmcam_dbg_log("Finish opeartion. Preview is started.(%d)", cb_res);
3132 case ASM_COMMAND_RESUME:
3134 _MMCamcorderMsgItem msg;
3136 _mmcam_dbg_log("Got msg from asm to Resume(state %d)", current_state);
3138 msg.id = MM_MESSAGE_READY_TO_RESUME;
3139 _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
3140 cb_res = ASM_CB_RES_PLAYING;
3142 _mmcam_dbg_log("Finish opeartion.(%d)", cb_res);
3145 default: /* should not be reached here */
3146 cb_res = ASM_CB_RES_PLAYING;
3147 _mmcam_dbg_err("Command[%d] err", command);
3152 hcamcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_NORMAL;
3154 _MMCAMCORDER_UNLOCK_ASM(hcamcorder);
3160 int _mmcamcorder_create_pipeline(MMHandleType handle, int type)
3162 int ret = MM_ERROR_NONE;
3163 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3164 _MMCamcorderSubContext *sc = NULL;
3165 GstElement *pipeline = NULL;
3167 _mmcam_dbg_log("handle : %x, type : %d", handle, type);
3169 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3171 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3172 mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3175 case MM_CAMCORDER_MODE_AUDIO:
3176 ret = _mmcamcorder_create_audio_pipeline(handle);
3177 if (ret != MM_ERROR_NONE) {
3181 case MM_CAMCORDER_MODE_VIDEO_CAPTURE:
3183 ret = _mmcamcorder_create_preview_pipeline(handle);
3184 if (ret != MM_ERROR_NONE) {
3188 /* connect capture signal */
3189 if (!sc->bencbin_capture) {
3190 ret = _mmcamcorder_connect_capture_signal(handle);
3191 if (ret != MM_ERROR_NONE) {
3198 pipeline = sc->element[_MMCAMCORDER_MAIN_PIPE].gst;
3199 if (type != MM_CAMCORDER_MODE_AUDIO) {
3200 ret = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_READY);
3202 #ifdef _MMCAMCORDER_GET_DEVICE_INFO
3203 if (!_mmcamcorder_get_device_info(handle)) {
3204 _mmcam_dbg_err("Getting device information error!!");
3208 _mmcam_dbg_log("ret[%x]", ret);
3209 if (ret != MM_ERROR_NONE) {
3210 _mmcam_dbg_err("error : destroy pipeline");
3211 _mmcamcorder_destroy_pipeline(handle, hcamcorder->type);
3218 void _mmcamcorder_destroy_pipeline(MMHandleType handle, int type)
3220 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3221 _MMCamcorderSubContext *sc = NULL;
3223 int element_num = 0;
3224 _MMCamcorderGstElement *element = NULL;
3227 mmf_return_if_fail(hcamcorder);
3229 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3230 mmf_return_if_fail(sc);
3234 /* Inside each pipeline destroy function, Set GST_STATE_NULL to Main pipeline */
3236 case MM_CAMCORDER_MODE_VIDEO_CAPTURE:
3237 element = sc->element;
3238 element_num = sc->element_num;
3239 bus = gst_pipeline_get_bus(GST_PIPELINE(sc->element[_MMCAMCORDER_MAIN_PIPE].gst));
3240 _mmcamcorder_destroy_video_capture_pipeline(handle);
3242 case MM_CAMCORDER_MODE_AUDIO:
3243 element = sc->encode_element;
3244 element_num = sc->encode_element_num;
3245 bus = gst_pipeline_get_bus(GST_PIPELINE(sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst));
3246 _mmcamcorder_destroy_audio_pipeline(handle);
3249 _mmcam_dbg_err("unknown type %d", type);
3253 _mmcam_dbg_log("Pipeline clear!!");
3255 /* Remove pipeline message callback */
3256 g_source_remove(hcamcorder->pipeline_cb_event_id);
3257 hcamcorder->pipeline_cb_event_id = 0;
3259 /* Remove remained message in bus */
3261 GstMessage *gst_msg = NULL;
3262 while ((gst_msg = gst_bus_pop(bus)) != NULL) {
3263 _mmcamcorder_pipeline_cb_message(bus, gst_msg, (gpointer)hcamcorder);
3264 gst_message_unref( gst_msg );
3267 gst_object_unref( bus );
3271 /* checking unreleased element */
3272 for (i = 0 ; i < element_num ; i++ ) {
3273 if (element[i].gst) {
3274 if (GST_IS_ELEMENT(element[i].gst)) {
3275 _mmcam_dbg_warn("Still alive element - ID[%d], name [%s], ref count[%d], status[%s]",
3277 GST_OBJECT_NAME(element[i].gst),
3278 GST_OBJECT_REFCOUNT(element[i].gst),
3279 gst_element_state_get_name(GST_STATE(element[i].gst)));
3280 g_object_weak_unref(G_OBJECT(element[i].gst), (GWeakNotify)_mmcamcorder_element_release_noti, sc);
3282 _mmcam_dbg_warn("The element[%d] is still aliving, check it", element[i].id);
3285 element[i].id = _MMCAMCORDER_NONE;
3286 element[i].gst = NULL;
3294 int _mmcamcorder_gst_set_state_async(MMHandleType handle, GstElement *pipeline, GstState target_state)
3296 GstStateChangeReturn setChangeReturn = GST_STATE_CHANGE_FAILURE;
3298 _MMCAMCORDER_LOCK_GST_STATE(handle);
3299 setChangeReturn = gst_element_set_state(pipeline, target_state);
3300 _MMCAMCORDER_UNLOCK_GST_STATE(handle);
3302 return setChangeReturn;
3306 #ifdef _MMCAMCORDER_USE_SET_ATTR_CB
3307 static gboolean __mmcamcorder_set_attr_to_camsensor_cb(gpointer data)
3309 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(data);
3311 mmf_return_val_if_fail(hcamcorder, FALSE);
3315 _mmcamcorder_set_attribute_to_camsensor((MMHandleType)hcamcorder);
3318 hcamcorder->setting_event_id = 0;
3320 _mmcam_dbg_log("Done");
3325 #endif /* _MMCAMCORDER_USE_SET_ATTR_CB */
3328 int _mmcamcorder_gst_set_state(MMHandleType handle, GstElement *pipeline, GstState target_state)
3331 _MMCamcorderSubContext *sc = NULL;
3332 GstState pipeline_state = GST_STATE_VOID_PENDING;
3333 GstStateChangeReturn setChangeReturn = GST_STATE_CHANGE_FAILURE;
3334 GstStateChangeReturn getChangeReturn = GST_STATE_CHANGE_FAILURE;
3335 GstClockTime get_timeout = __MMCAMCORDER_SET_GST_STATE_TIMEOUT * GST_SECOND;
3336 GMutex *state_lock = NULL;
3338 mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3339 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3340 mmf_return_val_if_fail(sc && sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3342 if (sc->element[_MMCAMCORDER_MAIN_PIPE].gst == pipeline) {
3343 _mmcam_dbg_log("Set state to %d - PREVIEW PIPELINE", target_state);
3344 state_lock = _MMCAMCORDER_GET_GST_STATE_LOCK(handle);
3346 _mmcam_dbg_log("Set state to %d - ENDODE PIPELINE", target_state);
3347 state_lock = _MMCAMCORDER_GET_GST_ENCODE_STATE_LOCK(handle);
3350 g_mutex_lock(state_lock);
3352 for (k = 0; k < _MMCAMCORDER_STATE_SET_COUNT; k++) {
3353 setChangeReturn = gst_element_set_state(pipeline, target_state);
3354 _mmcam_dbg_log("gst_element_set_state[%d] return %d",
3355 target_state, setChangeReturn);
3356 if (setChangeReturn != GST_STATE_CHANGE_FAILURE) {
3357 getChangeReturn = gst_element_get_state(pipeline, &pipeline_state, NULL, get_timeout);
3358 switch (getChangeReturn) {
3359 case GST_STATE_CHANGE_NO_PREROLL:
3360 _mmcam_dbg_log("status=GST_STATE_CHANGE_NO_PREROLL.");
3361 case GST_STATE_CHANGE_SUCCESS:
3362 /* if we reached the final target state, exit */
3363 if (pipeline_state == target_state) {
3364 _mmcam_dbg_log("Set state to %d - DONE", target_state);
3365 g_mutex_unlock(state_lock);
3366 return MM_ERROR_NONE;
3369 case GST_STATE_CHANGE_ASYNC:
3370 _mmcam_dbg_log("status=GST_STATE_CHANGE_ASYNC.");
3373 g_mutex_unlock(state_lock);
3374 _mmcam_dbg_log("status=GST_STATE_CHANGE_FAILURE.");
3375 return MM_ERROR_CAMCORDER_GST_STATECHANGE;
3378 g_mutex_unlock(state_lock);
3380 _mmcam_dbg_err("timeout of gst_element_get_state()!!");
3382 return MM_ERROR_CAMCORDER_RESPONSE_TIMEOUT;
3384 usleep(_MMCAMCORDER_STATE_CHECK_INTERVAL);
3387 g_mutex_unlock(state_lock);
3389 _mmcam_dbg_err("Failure. gst_element_set_state timeout!!");
3391 return MM_ERROR_CAMCORDER_RESPONSE_TIMEOUT;
3395 /* For performance check */
3396 int _mmcamcorder_video_current_framerate(MMHandleType handle)
3398 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3399 _MMCamcorderSubContext *sc = NULL;
3401 mmf_return_val_if_fail(hcamcorder, -1);
3403 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3404 mmf_return_val_if_fail(sc, -1);
3406 return sc->kpi.current_fps;
3410 int _mmcamcorder_video_average_framerate(MMHandleType handle)
3412 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3413 _MMCamcorderSubContext *sc = NULL;
3415 mmf_return_val_if_fail(hcamcorder, -1);
3417 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3418 mmf_return_val_if_fail(sc, -1);
3420 return sc->kpi.average_fps;
3424 void _mmcamcorder_video_current_framerate_init(MMHandleType handle)
3426 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3427 _MMCamcorderSubContext *sc = NULL;
3429 mmf_return_if_fail(hcamcorder);
3431 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3432 mmf_return_if_fail(sc);
3434 memset(&(sc->kpi), 0x00, sizeof(_MMCamcorderKPIMeasure));
3440 static void __mmcamcorder_force_stop(mmf_camcorder_t *hcamcorder)
3445 int result = MM_ERROR_NONE;
3446 int cmd_try_count = 0;
3447 int current_state = MM_CAMCORDER_STATE_NONE;
3449 mmf_return_if_fail(hcamcorder);
3451 /* check command running */
3453 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
3454 if (cmd_try_count++ < __MMCAMCORDER_FORCE_STOP_TRY_COUNT) {
3455 _mmcam_dbg_warn("Another command is running. try again after %d ms", __MMCAMCORDER_FORCE_STOP_WAIT_TIME/1000);
3456 usleep(__MMCAMCORDER_FORCE_STOP_WAIT_TIME);
3458 _mmcam_dbg_err("wait timeout");
3462 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
3467 current_state = _mmcamcorder_get_state((MMHandleType)hcamcorder);
3469 _mmcam_dbg_warn("Force STOP MMFW Camcorder");
3471 for (loop = 0 ; current_state > MM_CAMCORDER_STATE_NULL && loop < __MMCAMCORDER_CMD_ITERATE_MAX * 3 ; loop++) {
3472 itr_cnt = __MMCAMCORDER_CMD_ITERATE_MAX;
3473 switch (current_state) {
3474 case MM_CAMCORDER_STATE_CAPTURING:
3476 _MMCamcorderSubContext *sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
3477 _MMCamcorderImageInfo *info = NULL;
3479 mmf_return_if_fail(sc);
3480 mmf_return_if_fail((info = sc->info_image));
3482 _mmcam_dbg_warn("Stop capturing.");
3484 /* if caturing isn't finished, waiting for 2 sec to finish real capture operation. check 'info->capturing'. */
3485 mm_camcorder_set_attributes((MMHandleType)hcamcorder, NULL,
3486 MMCAM_CAPTURE_BREAK_CONTINUOUS_SHOT, TRUE,
3489 for (i = 0; i < 20 && info->capturing; i++) {
3494 _mmcam_dbg_err("Timeout. Can't check stop capturing.");
3497 while ((itr_cnt--) && ((result = _mmcamcorder_capture_stop((MMHandleType)hcamcorder)) != MM_ERROR_NONE)) {
3498 _mmcam_dbg_warn("Can't stop capturing.(%x)", result);
3503 case MM_CAMCORDER_STATE_RECORDING:
3504 case MM_CAMCORDER_STATE_PAUSED:
3506 _mmcam_dbg_warn("Stop recording.");
3508 while ((itr_cnt--) && ((result = _mmcamcorder_commit((MMHandleType)hcamcorder)) != MM_ERROR_NONE)) {
3509 _mmcam_dbg_warn("Can't commit.(%x)", result);
3513 case MM_CAMCORDER_STATE_PREPARE:
3515 _mmcam_dbg_warn("Stop preview.");
3517 while ((itr_cnt--) && ((result = _mmcamcorder_stop((MMHandleType)hcamcorder)) != MM_ERROR_NONE)) {
3518 _mmcam_dbg_warn("Can't stop preview.(%x)", result);
3522 case MM_CAMCORDER_STATE_READY:
3524 _mmcam_dbg_warn("unrealize");
3526 if ((result = _mmcamcorder_unrealize((MMHandleType)hcamcorder)) != MM_ERROR_NONE) {
3527 _mmcam_dbg_warn("Can't unrealize.(%x)", result);
3532 _mmcam_dbg_warn("Already stopped.");
3536 current_state = _mmcamcorder_get_state((MMHandleType)hcamcorder);
3539 _mmcam_dbg_warn( "Done." );
3545 static void __mmcamcorder_force_resume(mmf_camcorder_t *hcamcorder)
3548 int result = MM_ERROR_NONE;
3550 int current_state = MM_CAMCORDER_STATE_NONE;
3552 mmf_return_if_fail(hcamcorder);
3554 _mmcam_dbg_warn("Force RESUME MMFW Camcorder");
3556 current_state = _mmcamcorder_get_state((MMHandleType)hcamcorder);
3558 for (loop = 0 ; current_state < MM_CAMCORDER_STATE_PREPARE && loop < __MMCAMCORDER_CMD_ITERATE_MAX * 3 ; loop++) {
3559 itr_cnt = __MMCAMCORDER_CMD_ITERATE_MAX;
3561 switch (current_state) {
3562 case MM_CAMCORDER_STATE_NULL:
3563 _mmcam_dbg_warn("Realize");
3564 while ((itr_cnt--) && ((result = _mmcamcorder_realize((MMHandleType)hcamcorder)) != MM_ERROR_NONE)) {
3565 _mmcam_dbg_warn("Can't realize.(%x)", result);
3568 case MM_CAMCORDER_STATE_READY:
3569 _mmcam_dbg_warn("Start previewing");
3571 while ((itr_cnt--) && ((result = _mmcamcorder_start((MMHandleType)hcamcorder)) != MM_ERROR_NONE)) {
3572 _mmcam_dbg_warn("Can't start previewing.(%x)", result);
3576 _mmcam_dbg_warn("Abnormal state.");
3580 current_state = _mmcamcorder_get_state((MMHandleType)hcamcorder);
3583 _mmcam_dbg_warn("Done.");
3589 static gboolean __mmcamcorder_handle_gst_error(MMHandleType handle, GstMessage *message, GError *error)
3591 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3592 _MMCamcorderMsgItem msg;
3593 gchar *msg_src_element;
3594 _MMCamcorderSubContext *sc = NULL;
3596 return_val_if_fail(hcamcorder, FALSE);
3597 return_val_if_fail(error, FALSE);
3598 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3599 mmf_return_val_if_fail(sc, FALSE);
3603 /* filtering filesink related errors */
3604 if (hcamcorder->state == MM_CAMCORDER_STATE_RECORDING &&
3605 (error->code == GST_RESOURCE_ERROR_WRITE || error->code == GST_RESOURCE_ERROR_SEEK)) {
3606 if (sc->ferror_count == 2 && sc->ferror_send == FALSE) {
3607 sc->ferror_send = TRUE;
3608 msg.param.code = __mmcamcorder_gst_handle_resource_error(handle, error->code, message);
3611 _mmcam_dbg_warn("Skip error");
3616 if (error->domain == GST_CORE_ERROR) {
3617 msg.param.code = __mmcamcorder_gst_handle_core_error(handle, error->code, message);
3618 } else if (error->domain == GST_LIBRARY_ERROR) {
3619 msg.param.code = __mmcamcorder_gst_handle_library_error(handle, error->code, message);
3620 } else if (error->domain == GST_RESOURCE_ERROR) {
3621 msg.param.code = __mmcamcorder_gst_handle_resource_error(handle, error->code, message);
3622 } else if (error->domain == GST_STREAM_ERROR) {
3623 msg.param.code = __mmcamcorder_gst_handle_stream_error(handle, error->code, message);
3625 _mmcam_dbg_warn("This error domain is not defined.");
3627 /* we treat system error as an internal error */
3628 msg.param.code = MM_ERROR_CAMCORDER_INTERNAL;
3632 msg_src_element = GST_ELEMENT_NAME(GST_ELEMENT_CAST(message->src));
3633 _mmcam_dbg_err("-Msg src : [%s] Domain : [%s] Error : [%s] Code : [%d] is tranlated to error code : [0x%x]",
3634 msg_src_element, g_quark_to_string (error->domain), error->message, error->code, msg.param.code);
3636 _mmcam_dbg_err("Domain : [%s] Error : [%s] Code : [%d] is tranlated to error code : [0x%x]",
3637 g_quark_to_string (error->domain), error->message, error->code, msg.param.code);
3640 #ifdef _MMCAMCORDER_SKIP_GST_FLOW_ERROR
3641 /* Check whether send this error to application */
3642 if (msg.param.code == MM_ERROR_CAMCORDER_GST_FLOW_ERROR) {
3643 _mmcam_dbg_log("We got the error. But skip it.");
3646 #endif /* _MMCAMCORDER_SKIP_GST_FLOW_ERROR */
3648 /* post error to application */
3649 sc->error_occurs = TRUE;
3650 msg.id = MM_MESSAGE_CAMCORDER_ERROR;
3651 _mmcamcroder_send_message(handle, &msg);
3657 static gint __mmcamcorder_gst_handle_core_error(MMHandleType handle, int code, GstMessage *message)
3659 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3660 _MMCamcorderSubContext *sc = NULL;
3661 GstElement *element = NULL;
3665 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3667 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3668 mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3670 /* Specific plugin - video encoder plugin */
3671 element = GST_ELEMENT_CAST(sc->encode_element[_MMCAMCORDER_ENCSINK_VENC].gst);
3673 if (GST_ELEMENT_CAST(message->src) == element) {
3674 if (code == GST_CORE_ERROR_NEGOTIATION) {
3675 return MM_ERROR_CAMCORDER_GST_NEGOTIATION;
3677 return MM_ERROR_CAMCORDER_ENCODER;
3684 case GST_CORE_ERROR_STATE_CHANGE:
3685 return MM_ERROR_CAMCORDER_GST_STATECHANGE;
3686 case GST_CORE_ERROR_NEGOTIATION:
3687 return MM_ERROR_CAMCORDER_GST_NEGOTIATION;
3688 case GST_CORE_ERROR_MISSING_PLUGIN:
3689 case GST_CORE_ERROR_SEEK:
3690 case GST_CORE_ERROR_NOT_IMPLEMENTED:
3691 case GST_CORE_ERROR_FAILED:
3692 case GST_CORE_ERROR_TOO_LAZY:
3693 case GST_CORE_ERROR_PAD:
3694 case GST_CORE_ERROR_THREAD:
3695 case GST_CORE_ERROR_EVENT:
3696 case GST_CORE_ERROR_CAPS:
3697 case GST_CORE_ERROR_TAG:
3698 case GST_CORE_ERROR_CLOCK:
3699 case GST_CORE_ERROR_DISABLED:
3701 return MM_ERROR_CAMCORDER_GST_CORE;
3706 static gint __mmcamcorder_gst_handle_library_error(MMHandleType handle, int code, GstMessage *message)
3708 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3709 return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3713 /* Specific plugin - NONE */
3717 case GST_LIBRARY_ERROR_FAILED:
3718 case GST_LIBRARY_ERROR_TOO_LAZY:
3719 case GST_LIBRARY_ERROR_INIT:
3720 case GST_LIBRARY_ERROR_SHUTDOWN:
3721 case GST_LIBRARY_ERROR_SETTINGS:
3722 case GST_LIBRARY_ERROR_ENCODE:
3724 _mmcam_dbg_err("Library error(%d)", code);
3725 return MM_ERROR_CAMCORDER_GST_LIBRARY;
3730 static gint __mmcamcorder_gst_handle_resource_error(MMHandleType handle, int code, GstMessage *message)
3732 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3733 _MMCamcorderSubContext *sc = NULL;
3734 GstElement *element = NULL;
3736 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3738 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3739 mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3743 /* Specific plugin */
3745 element = GST_ELEMENT_CAST(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst);
3746 if (GST_ELEMENT_CAST(message->src) == element) {
3747 if (code == GST_RESOURCE_ERROR_WRITE) {
3748 _mmcam_dbg_err("Display device [Off]");
3749 return MM_ERROR_CAMCORDER_DISPLAY_DEVICE_OFF;
3751 _mmcam_dbg_err("Display device [General(%d)]", code);
3756 element = GST_ELEMENT_CAST(sc->encode_element[_MMCAMCORDER_ENCSINK_VENC].gst);
3757 if (GST_ELEMENT_CAST(message->src) == element) {
3758 if (code == GST_RESOURCE_ERROR_FAILED) {
3759 _mmcam_dbg_err("Encoder [Resource error]");
3760 return MM_ERROR_CAMCORDER_ENCODER_BUFFER;
3762 _mmcam_dbg_err("Encoder [General(%d)]", code);
3763 return MM_ERROR_CAMCORDER_ENCODER;
3769 case GST_RESOURCE_ERROR_WRITE:
3770 _mmcam_dbg_err("File write error");
3771 return MM_ERROR_FILE_WRITE;
3772 case GST_RESOURCE_ERROR_NO_SPACE_LEFT:
3773 _mmcam_dbg_err("No left space");
3774 return MM_MESSAGE_CAMCORDER_NO_FREE_SPACE;
3775 case GST_RESOURCE_ERROR_OPEN_WRITE:
3776 _mmcam_dbg_err("Out of storage");
3777 return MM_ERROR_OUT_OF_STORAGE;
3778 case GST_RESOURCE_ERROR_SEEK:
3779 _mmcam_dbg_err("File read(seek)");
3780 return MM_ERROR_FILE_READ;
3781 case GST_RESOURCE_ERROR_NOT_FOUND:
3782 case GST_RESOURCE_ERROR_FAILED:
3783 case GST_RESOURCE_ERROR_TOO_LAZY:
3784 case GST_RESOURCE_ERROR_BUSY:
3785 case GST_RESOURCE_ERROR_OPEN_READ:
3786 case GST_RESOURCE_ERROR_OPEN_READ_WRITE:
3787 case GST_RESOURCE_ERROR_CLOSE:
3788 case GST_RESOURCE_ERROR_READ:
3789 case GST_RESOURCE_ERROR_SYNC:
3790 case GST_RESOURCE_ERROR_SETTINGS:
3792 _mmcam_dbg_err("Resource error(%d)", code);
3793 return MM_ERROR_CAMCORDER_GST_RESOURCE;
3798 static gint __mmcamcorder_gst_handle_stream_error(MMHandleType handle, int code, GstMessage *message)
3800 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3801 _MMCamcorderSubContext *sc = NULL;
3802 GstElement *element =NULL;
3804 mmf_return_val_if_fail( hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED );
3806 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3807 mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3811 /* Specific plugin */
3813 element = GST_ELEMENT_CAST(sc->encode_element[_MMCAMCORDER_ENCSINK_VENC].gst);
3814 if (GST_ELEMENT_CAST(message->src) == element) {
3816 case GST_STREAM_ERROR_WRONG_TYPE:
3817 _mmcam_dbg_err("Video encoder [wrong stream type]");
3818 return MM_ERROR_CAMCORDER_ENCODER_WRONG_TYPE;
3819 case GST_STREAM_ERROR_ENCODE:
3820 _mmcam_dbg_err("Video encoder [encode error]");
3821 return MM_ERROR_CAMCORDER_ENCODER_WORKING;
3822 case GST_STREAM_ERROR_FAILED:
3823 _mmcam_dbg_err("Video encoder [stream failed]");
3824 return MM_ERROR_CAMCORDER_ENCODER_WORKING;
3826 _mmcam_dbg_err("Video encoder [General(%d)]", code);
3827 return MM_ERROR_CAMCORDER_ENCODER;
3831 /* General plugin */
3833 case GST_STREAM_ERROR_FORMAT:
3834 _mmcam_dbg_err("General [negotiation error(%d)]", code);
3835 return MM_ERROR_CAMCORDER_GST_NEGOTIATION;
3836 case GST_STREAM_ERROR_FAILED:
3837 _mmcam_dbg_err("General [flow error(%d)]", code);
3838 return MM_ERROR_CAMCORDER_GST_FLOW_ERROR;
3839 case GST_STREAM_ERROR_TYPE_NOT_FOUND:
3840 case GST_STREAM_ERROR_DECODE:
3841 case GST_STREAM_ERROR_CODEC_NOT_FOUND:
3842 case GST_STREAM_ERROR_NOT_IMPLEMENTED:
3843 case GST_STREAM_ERROR_TOO_LAZY:
3844 case GST_STREAM_ERROR_ENCODE:
3845 case GST_STREAM_ERROR_DEMUX:
3846 case GST_STREAM_ERROR_MUX:
3847 case GST_STREAM_ERROR_DECRYPT:
3848 case GST_STREAM_ERROR_DECRYPT_NOKEY:
3849 case GST_STREAM_ERROR_WRONG_TYPE:
3851 _mmcam_dbg_err("General [error(%d)]", code);
3852 return MM_ERROR_CAMCORDER_GST_STREAM;
3857 static gboolean __mmcamcorder_handle_gst_warning (MMHandleType handle, GstMessage *message, GError *error)
3859 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3860 gchar *debug = NULL;
3863 return_val_if_fail(hcamcorder, FALSE);
3864 return_val_if_fail(error, FALSE);
3868 gst_message_parse_warning(message, &err, &debug);
3870 if (error->domain == GST_CORE_ERROR) {
3871 _mmcam_dbg_warn("GST warning: GST_CORE domain");
3872 } else if (error->domain == GST_LIBRARY_ERROR) {
3873 _mmcam_dbg_warn("GST warning: GST_LIBRARY domain");
3874 } else if (error->domain == GST_RESOURCE_ERROR) {
3875 _mmcam_dbg_warn("GST warning: GST_RESOURCE domain");
3876 __mmcamcorder_gst_handle_resource_warning(handle, message, error);
3877 } else if (error->domain == GST_STREAM_ERROR ) {
3878 _mmcam_dbg_warn("GST warning: GST_STREAM domain");
3880 _mmcam_dbg_warn("This error domain(%d) is not defined.", error->domain);
3887 if (debug != NULL) {
3888 _mmcam_dbg_err ("Debug: %s", debug);
3897 static gint __mmcamcorder_gst_handle_resource_warning(MMHandleType handle, GstMessage *message , GError *error)
3899 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3900 _MMCamcorderSubContext *sc = NULL;
3901 GstElement *element =NULL;
3902 gchar *msg_src_element;
3904 mmf_return_val_if_fail( hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED );
3906 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3907 mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3911 /* Special message handling */
3913 element = GST_ELEMENT_CAST(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
3914 if (GST_ELEMENT_CAST(message->src) == element) {
3915 if (error->code == GST_RESOURCE_ERROR_FAILED) {
3916 msg_src_element = GST_ELEMENT_NAME(GST_ELEMENT_CAST(message->src));
3917 _mmcam_dbg_warn("-Msg src:[%s] Domain:[%s] Error:[%s]",
3918 msg_src_element, g_quark_to_string(error->domain), error->message);
3919 return MM_ERROR_NONE;
3923 /* General plugin */
3924 switch (error->code) {
3925 case GST_RESOURCE_ERROR_WRITE:
3926 case GST_RESOURCE_ERROR_NO_SPACE_LEFT:
3927 case GST_RESOURCE_ERROR_SEEK:
3928 case GST_RESOURCE_ERROR_NOT_FOUND:
3929 case GST_RESOURCE_ERROR_FAILED:
3930 case GST_RESOURCE_ERROR_TOO_LAZY:
3931 case GST_RESOURCE_ERROR_BUSY:
3932 case GST_RESOURCE_ERROR_OPEN_READ:
3933 case GST_RESOURCE_ERROR_OPEN_WRITE:
3934 case GST_RESOURCE_ERROR_OPEN_READ_WRITE:
3935 case GST_RESOURCE_ERROR_CLOSE:
3936 case GST_RESOURCE_ERROR_READ:
3937 case GST_RESOURCE_ERROR_SYNC:
3938 case GST_RESOURCE_ERROR_SETTINGS:
3940 _mmcam_dbg_warn("General GST warning(%d)", error->code);
3944 return MM_ERROR_NONE;