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 ========================================================================================*/
28 #include <gst/gstutils.h>
29 #include <gst/gstpad.h>
32 #include "mm_camcorder_internal.h"
35 #include <gst/interfaces/colorbalance.h>
36 #include <gst/interfaces/cameracontrol.h>
37 #include <asm/types.h>
39 #include <mm_session.h>
40 #include <mm_session_private.h>
41 #include <audio-session-manager.h>
43 /*---------------------------------------------------------------------------------------
44 | GLOBAL VARIABLE DEFINITIONS for internal |
45 ---------------------------------------------------------------------------------------*/
47 /*---------------------------------------------------------------------------------------
48 | LOCAL VARIABLE DEFINITIONS for internal |
49 ---------------------------------------------------------------------------------------*/
51 //#define _MMCAM_USING_CAPTUREMODE
52 #define __MMCAMCORDER_CMD_ITERATE_MAX 3
54 /*---------------------------------------------------------------------------------------
55 | LOCAL FUNCTION PROTOTYPES: |
56 ---------------------------------------------------------------------------------------*/
57 /* STATIC INTERNAL FUNCTION */
58 static gboolean __mmcamcorder_gstreamer_init(camera_conf * conf);
60 static gboolean __mmcamcorder_handle_gst_error(MMHandleType handle, GstMessage *message, GError *error);
61 static gint __mmcamcorder_gst_handle_stream_error(MMHandleType handle, int code, GstMessage *message);
62 static gint __mmcamcorder_gst_handle_resource_error(MMHandleType handle, int code, GstMessage *message);
63 static gint __mmcamcorder_gst_handle_library_error(MMHandleType handle, int code, GstMessage *message);
64 static gint __mmcamcorder_gst_handle_core_error(MMHandleType handle, int code, GstMessage *message);
65 static gint __mmcamcorder_gst_handle_resource_warning(MMHandleType handle, GstMessage *message , GError *error);
66 static gboolean __mmcamcorder_handle_gst_warning(MMHandleType handle, GstMessage *message, GError *error);
68 static int __mmcamcorder_asm_get_event_type(int sessionType);
69 static void __mmcamcorder_force_stop(mmf_camcorder_t *hcamcorder);
70 static void __mmcamcorder_force_resume(mmf_camcorder_t *hcamcorder);
71 ASM_cb_result_t _mmcamcorder_asm_callback(int handle, ASM_event_sources_t event_src,
72 ASM_sound_commands_t command,
73 unsigned int sound_status, void *cb_data);
75 static gboolean __mmcamcorder_set_attr_to_camsensor_cb(gpointer data);
78 /*=======================================================================================
79 | FUNCTION DEFINITIONS |
80 =======================================================================================*/
81 /*---------------------------------------------------------------------------------------
82 | GLOBAL FUNCTION DEFINITIONS: |
83 ---------------------------------------------------------------------------------------*/
85 /* Internal command functions {*/
86 int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info)
88 int ret = MM_ERROR_NONE;
90 int sessionType = MM_SESSION_TYPE_EXCLUSIVE;
91 int errorcode = MM_ERROR_NONE;
92 int rcmd_fmt_capture = MM_PIXEL_FORMAT_YUYV;
93 int rcmd_fmt_recording = MM_PIXEL_FORMAT_NV12;
94 int rcmd_dpy_rotation = MM_DISPLAY_ROTATION_270;
95 char *err_attr_name = NULL;
96 char *ConfCtrlFile = NULL;
97 mmf_camcorder_t *hcamcorder = NULL;
98 ASM_resource_t mm_resource = ASM_RESOURCE_NONE;
100 _mmcam_dbg_log("Entered");
102 mmf_return_val_if_fail( handle, MM_ERROR_CAMCORDER_INVALID_ARGUMENT );
104 /* Create mmf_camcorder_t handle and initialize every variable */
105 hcamcorder = (mmf_camcorder_t *)malloc(sizeof(mmf_camcorder_t));
106 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_LOW_MEMORY);
107 memset(hcamcorder, 0x00, sizeof(mmf_camcorder_t));
111 hcamcorder->state=MM_CAMCORDER_STATE_NULL;
112 hcamcorder->sub_context=NULL;
113 hcamcorder->target_state=MM_CAMCORDER_STATE_NULL;
115 /* thread - for g_mutex_new() */
116 if (!g_thread_supported()) {
120 (hcamcorder->mtsafe).lock = g_mutex_new();
121 (hcamcorder->mtsafe).cond = g_cond_new();
123 (hcamcorder->mtsafe).cmd_lock = g_mutex_new();
124 (hcamcorder->mtsafe).state_lock = g_mutex_new();
125 (hcamcorder->mtsafe).gst_state_lock = g_mutex_new();
126 (hcamcorder->mtsafe).message_cb_lock = g_mutex_new();
127 (hcamcorder->mtsafe).vcapture_cb_lock = g_mutex_new();
128 (hcamcorder->mtsafe).vstream_cb_lock = g_mutex_new();
129 (hcamcorder->mtsafe).astream_cb_lock = g_mutex_new();
131 pthread_mutex_init(&(hcamcorder->sound_lock), NULL);
132 pthread_cond_init(&(hcamcorder->sound_cond), NULL);
134 /* Sound mutex/cond init */
135 pthread_mutex_init(&(hcamcorder->snd_info.open_mutex), NULL);
136 pthread_cond_init(&(hcamcorder->snd_info.open_cond), NULL);
138 if (info->videodev_type < MM_VIDEO_DEVICE_NONE ||
139 info->videodev_type >= MM_VIDEO_DEVICE_NUM) {
140 _mmcam_dbg_err("_mmcamcorder_create::video device type is out of range.");
141 ret = MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
142 goto _ERR_DEFAULT_VALUE_INIT;
145 /* Check and register ASM */
146 if (MM_ERROR_NONE != _mm_session_util_read_type(-1, &sessionType)) {
147 _mmcam_dbg_warn("Read _mm_session_util_read_type failed. use default \"exclusive\" type");
148 sessionType = MM_SESSION_TYPE_EXCLUSIVE;
149 if (MM_ERROR_NONE != mm_session_init(sessionType)) {
150 _mmcam_dbg_err("mm_session_init() failed");
151 ret = MM_ERROR_POLICY_INTERNAL;
152 goto _ERR_DEFAULT_VALUE_INIT;
155 if ((sessionType != MM_SESSION_TYPE_CALL) && (sessionType != MM_SESSION_TYPE_VIDEOCALL)) {
156 int asm_session_type = ASM_EVENT_NONE;
158 int pid = -1; /* process id of itself */
160 asm_session_type = __mmcamcorder_asm_get_event_type( sessionType );
161 /* Call will not be interrupted. so does not need callback function */
162 if (!ASM_register_sound(pid, &asm_handle, asm_session_type, ASM_STATE_NONE,
163 (ASM_sound_cb_t)_mmcamcorder_asm_callback,
164 (void*)hcamcorder, mm_resource, &errorcode)) {
165 _mmcam_dbg_err("ASM_register_sound() failed[%x]", errorcode);
166 ret = MM_ERROR_POLICY_INTERNAL;
167 goto _ERR_DEFAULT_VALUE_INIT;
169 hcamcorder->asm_handle = asm_handle;
172 /* Get Camera Configure information from Camcorder INI file */
173 __ta__( " _mmcamcorder_conf_get_info main",
174 _mmcamcorder_conf_get_info(CONFIGURE_TYPE_MAIN, CONFIGURE_MAIN_FILE, &hcamcorder->conf_main);
177 if (!(hcamcorder->conf_main)) {
178 _mmcam_dbg_err( "Failed to get configure(main) info." );
180 ret = MM_ERROR_CAMCORDER_CREATE_CONFIGURE;
181 goto _ERR_AUDIO_BLOCKED;
184 __ta__(" _mmcamcorder_alloc_attribute",
185 hcamcorder->attributes= _mmcamcorder_alloc_attribute((MMHandleType)hcamcorder, info);
187 if (!(hcamcorder->attributes)) {
188 _mmcam_dbg_err("_mmcamcorder_create::alloc attribute error.");
190 ret = MM_ERROR_CAMCORDER_RESOURCE_CREATION;
191 goto _ERR_AUDIO_BLOCKED;
194 if (info->videodev_type != MM_VIDEO_DEVICE_NONE) {
195 _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
196 CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
197 "UseConfCtrl", &UseConfCtrl);
200 _mmcam_dbg_log( "Enable Configure Control system." );
202 switch (info->videodev_type) {
203 case MM_VIDEO_DEVICE_CAMERA0:
204 _mmcamcorder_conf_get_value_string(hcamcorder->conf_main,
205 CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
206 "ConfCtrlFile0", &ConfCtrlFile);
208 case MM_VIDEO_DEVICE_CAMERA1:
209 _mmcamcorder_conf_get_value_string(hcamcorder->conf_main,
210 CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
211 "ConfCtrlFile1", &ConfCtrlFile);
214 _mmcam_dbg_err( "Not supported camera type." );
215 ret = MM_ERROR_CAMCORDER_NOT_SUPPORTED;
216 goto _ERR_ALLOC_ATTRIBUTE;
219 _mmcam_dbg_log("videodev_type : [%d], ConfCtrlPath : [%s]", info->videodev_type, ConfCtrlFile);
221 __ta__( " _mmcamcorder_conf_get_info ctrl",
222 _mmcamcorder_conf_get_info(CONFIGURE_TYPE_CTRL, ConfCtrlFile, &hcamcorder->conf_ctrl);
225 _mmcamcorder_conf_print_info(&hcamcorder->conf_main);
226 _mmcamcorder_conf_print_info(&hcamcorder->conf_ctrl);
229 _mmcamcorder_conf_query_info(CONFIGURE_TYPE_CTRL, info->videodev_type, &hcamcorder->conf_ctrl);
231 if (!(hcamcorder->conf_ctrl)) {
232 _mmcam_dbg_err( "Failed to get configure(control) info." );
233 ret = MM_ERROR_CAMCORDER_CREATE_CONFIGURE;
234 goto _ERR_ALLOC_ATTRIBUTE;
237 __ta__( " _mmcamcorder_init_convert_table",
238 ret = _mmcamcorder_init_convert_table((MMHandleType)hcamcorder);
240 if (ret != MM_ERROR_NONE) {
241 _mmcam_dbg_warn("converting table initialize error!!");
244 __ta__( " _mmcamcorder_init_attr_from_configure",
245 ret = _mmcamcorder_init_attr_from_configure((MMHandleType)hcamcorder);
247 if (ret != MM_ERROR_NONE) {
248 _mmcam_dbg_warn("converting table initialize error!!");
253 _mmcam_dbg_log( "Disable Configure Control system." );
254 hcamcorder->conf_ctrl = NULL;
258 __ta__( " __mmcamcorder_gstreamer_init",
259 ret = __mmcamcorder_gstreamer_init(hcamcorder->conf_main);
262 _mmcam_dbg_err( "Failed to initialize gstreamer!!" );
263 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
264 goto _ERR_ALLOC_ATTRIBUTE;
267 /* Get recommend preview format and display rotation from INI */
268 rcmd_fmt_capture = MM_PIXEL_FORMAT_YUYV;
269 rcmd_fmt_recording = MM_PIXEL_FORMAT_NV12;
270 rcmd_dpy_rotation = MM_DISPLAY_ROTATION_270;
271 err_attr_name = NULL;
273 _mmcamcorder_conf_get_value_int(hcamcorder->conf_ctrl,
274 CONFIGURE_CATEGORY_CTRL_CAMERA,
275 "RecommendPreviewFormatCapture",
278 _mmcamcorder_conf_get_value_int(hcamcorder->conf_ctrl,
279 CONFIGURE_CATEGORY_CTRL_CAMERA,
280 "RecommendPreviewFormatRecord",
281 &rcmd_fmt_recording);
283 _mmcamcorder_conf_get_value_int(hcamcorder->conf_ctrl,
284 CONFIGURE_CATEGORY_CTRL_CAMERA,
285 "RecommendDisplayRotation",
288 _mmcam_dbg_log("Recommend prv[capture:%d,recording:%d], rot[%d]",
289 rcmd_fmt_capture, rcmd_fmt_recording, rcmd_dpy_rotation);
291 ret = mm_camcorder_set_attributes((MMHandleType)hcamcorder, &err_attr_name,
292 MMCAM_RECOMMEND_PREVIEW_FORMAT_FOR_CAPTURE, rcmd_fmt_capture,
293 MMCAM_RECOMMEND_PREVIEW_FORMAT_FOR_RECORDING, rcmd_fmt_recording,
294 MMCAM_RECOMMEND_DISPLAY_ROTATION, rcmd_dpy_rotation,
296 if (ret != MM_ERROR_NONE) {
297 _mmcam_dbg_err( "Set %s FAILED.", err_attr_name );
298 if (err_attr_name != NULL) {
299 free( err_attr_name );
300 err_attr_name = NULL;
303 goto _ERR_ALLOC_ATTRIBUTE;
306 /* Get UseZeroCopyFormat value from INI */
307 _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
308 CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
310 &(hcamcorder->use_zero_copy_format));
311 _mmcam_dbg_log("UseZeroCopyFormat : %d", hcamcorder->use_zero_copy_format);
314 /* Make some attributes as read-only type */
315 __ta__( " _mmcamcorder_lock_readonly_attributes",
316 _mmcamcorder_lock_readonly_attributes((MMHandleType)hcamcorder);
319 /* Disable attributes in each model */
320 __ta__( " _mmcamcorder_set_disabled_attributes",
321 _mmcamcorder_set_disabled_attributes((MMHandleType)hcamcorder);
324 /* Determine state change as sync or async */
325 _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
326 CONFIGURE_CATEGORY_MAIN_GENERAL,
328 &hcamcorder->sync_state_change );
329 if (!(hcamcorder->sync_state_change)) {
330 _mmcamcorder_create_command_loop((MMHandleType)hcamcorder);
333 /* Set initial state */
334 _mmcamcorder_set_state((MMHandleType)hcamcorder, MM_CAMCORDER_STATE_NULL);
335 _mmcam_dbg_log("_mmcamcorder_set_state");
337 *handle = (MMHandleType)hcamcorder;
339 return MM_ERROR_NONE;
341 _ERR_ALLOC_ATTRIBUTE:
343 /* unregister audio session manager */
345 sessionType = MM_SESSION_TYPE_EXCLUSIVE;
346 errorcode = MM_ERROR_NONE;
347 if (MM_ERROR_NONE != _mm_session_util_read_type(-1, &sessionType)) {
348 sessionType = MM_SESSION_TYPE_EXCLUSIVE;
351 if((sessionType != MM_SESSION_TYPE_CALL) && (sessionType != MM_SESSION_TYPE_VIDEOCALL)) {
352 int asm_session_type = __mmcamcorder_asm_get_event_type( sessionType );
353 if (!ASM_unregister_sound(hcamcorder->asm_handle, asm_session_type, &errorcode)) {
354 _mmcam_dbg_err("ASM_unregister_sound() failed(hdl:%p, stype:%d, err:%x)",
355 (void*)hcamcorder->asm_handle, sessionType, errorcode);
360 _ERR_DEFAULT_VALUE_INIT:
361 g_mutex_free ((hcamcorder->mtsafe).lock);
362 g_cond_free ((hcamcorder->mtsafe).cond);
363 g_mutex_free ((hcamcorder->mtsafe).cmd_lock);
364 g_mutex_free ((hcamcorder->mtsafe).state_lock);
365 g_mutex_free ((hcamcorder->mtsafe).gst_state_lock);
367 if (hcamcorder->conf_ctrl) {
368 _mmcamcorder_conf_release_info( &hcamcorder->conf_ctrl );
371 if (hcamcorder->conf_main) {
372 _mmcamcorder_conf_release_info( &hcamcorder->conf_main );
379 int _mmcamcorder_destroy(MMHandleType handle)
381 int ret = MM_ERROR_NONE;
382 int state = MM_CAMCORDER_STATE_NONE;
383 int state_FROM = MM_CAMCORDER_STATE_NULL;
384 int state_TO = MM_CAMCORDER_STATE_NONE;
385 int asm_session_type = ASM_EVENT_EXCLUSIVE_MMCAMCORDER;
386 int sessionType = MM_SESSION_TYPE_SHARE;
387 int errorcode = MM_ERROR_NONE;
388 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
389 _MMCamcorderMsgItem msg;
394 _mmcam_dbg_err("Not initialized");
395 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
396 goto _ERR_CAMCORDER_CMD_PRECON;
399 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
400 _mmcam_dbg_err("Another command is running.");
401 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
402 goto _ERR_CAMCORDER_CMD_PRECON;
405 state = _mmcamcorder_get_state(handle);
406 if (state != state_FROM) {
407 _mmcam_dbg_err("Wrong state(%d)", state);
408 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
409 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
412 /* Set async state */
413 ret = _mmcamcorder_set_async_state(handle, state_TO);
415 _mmcam_dbg_err("Can't set async state");
416 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
419 /* Release sound handle */
420 __ta__("_mmcamcorder_sound_finalize",
421 ret = _mmcamcorder_sound_finalize(handle);
423 _mmcam_dbg_log("sound finalize [%d]", ret);
425 /* Release SubContext and pipeline */
426 if (hcamcorder->sub_context) {
427 if (hcamcorder->sub_context->element) {
428 __ta__(" _mmcamcorder_destroy_pipeline",
429 _mmcamcorder_destroy_pipeline(handle, hcamcorder->type);
433 _mmcamcorder_dealloc_subcontext(hcamcorder->sub_context);
434 hcamcorder->sub_context = NULL;
437 /* Remove idle function which is not called yet */
438 if (hcamcorder->setting_event_id) {
439 _mmcam_dbg_log("Remove remaining idle function");
440 g_source_remove(hcamcorder->setting_event_id);
441 hcamcorder->setting_event_id = 0;
444 /* Remove attributes */
445 if (hcamcorder->attributes) {
446 _mmcamcorder_dealloc_attribute(hcamcorder->attributes);
447 hcamcorder->attributes = 0;
450 /* Remove exif info */
451 if (hcamcorder->exif_info) {
452 mm_exif_destory_exif_info(hcamcorder->exif_info);
453 hcamcorder->exif_info=NULL;
457 /* Remove command loop when async state change mode */
458 if (!hcamcorder->sync_state_change) {
459 _mmcamcorder_destroy_command_loop(handle);
462 /* Release configure info */
463 if (hcamcorder->conf_ctrl) {
464 _mmcamcorder_conf_release_info( &hcamcorder->conf_ctrl );
466 if (hcamcorder->conf_main) {
467 _mmcamcorder_conf_release_info( &hcamcorder->conf_main );
470 /* Remove messages which are not called yet */
471 _mmcamcroder_remove_message_all(handle);
474 if (MM_ERROR_NONE != _mm_session_util_read_type(-1, &sessionType)) {
475 _mmcam_dbg_err("_mm_session_util_read_type Fail");
477 if ((sessionType != MM_SESSION_TYPE_CALL) && (sessionType != MM_SESSION_TYPE_VIDEOCALL)) {
478 asm_session_type = __mmcamcorder_asm_get_event_type(sessionType);
479 if (!ASM_unregister_sound(hcamcorder->asm_handle, asm_session_type, &errorcode)) {
480 _mmcam_dbg_err("ASM_unregister_sound() failed(hdl:%p, stype:%d, err:%x)",
481 (void*)hcamcorder->asm_handle, sessionType, errorcode);
485 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
487 /* Release lock, cond */
488 if ((hcamcorder->mtsafe).lock) {
489 g_mutex_free ((hcamcorder->mtsafe).lock);
490 (hcamcorder->mtsafe).lock = NULL;
492 if ((hcamcorder->mtsafe).cond) {
493 g_cond_free ((hcamcorder->mtsafe).cond);
494 (hcamcorder->mtsafe).cond = NULL;
496 if ((hcamcorder->mtsafe).cmd_lock) {
497 g_mutex_free ((hcamcorder->mtsafe).cmd_lock);
498 (hcamcorder->mtsafe).cmd_lock = NULL;
500 if ((hcamcorder->mtsafe).state_lock) {
501 g_mutex_free ((hcamcorder->mtsafe).state_lock);
502 (hcamcorder->mtsafe).state_lock = NULL;
504 if ((hcamcorder->mtsafe).gst_state_lock) {
505 g_mutex_free ((hcamcorder->mtsafe).gst_state_lock);
506 (hcamcorder->mtsafe).gst_state_lock = NULL;
508 if ((hcamcorder->mtsafe).message_cb_lock) {
509 g_mutex_free ((hcamcorder->mtsafe).message_cb_lock);
510 (hcamcorder->mtsafe).message_cb_lock = NULL;
512 if ((hcamcorder->mtsafe).vcapture_cb_lock) {
513 g_mutex_free ((hcamcorder->mtsafe).vcapture_cb_lock);
514 (hcamcorder->mtsafe).vcapture_cb_lock = NULL;
516 if ((hcamcorder->mtsafe).vstream_cb_lock) {
517 g_mutex_free ((hcamcorder->mtsafe).vstream_cb_lock);
518 (hcamcorder->mtsafe).vstream_cb_lock = NULL;
520 if ((hcamcorder->mtsafe).astream_cb_lock) {
521 g_mutex_free ((hcamcorder->mtsafe).astream_cb_lock);
522 (hcamcorder->mtsafe).astream_cb_lock = NULL;
525 pthread_mutex_destroy(&(hcamcorder->sound_lock));
526 pthread_cond_destroy(&(hcamcorder->sound_cond));
527 pthread_mutex_destroy(&(hcamcorder->snd_info.open_mutex));
528 pthread_cond_destroy(&(hcamcorder->snd_info.open_cond));
531 memset(hcamcorder, 0x00, sizeof(mmf_camcorder_t));
534 return MM_ERROR_NONE;
536 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
537 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
539 _ERR_CAMCORDER_CMD_PRECON:
542 _mmcam_dbg_err("Destroy fail (%d, %d)", hcamcorder->type, state);
543 msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
544 msg.param.state.previous = state;
545 msg.param.state.current = state;
546 msg.param.state.code = ret;
547 _mmcamcroder_send_message(handle, &msg);
549 _mmcam_dbg_err("Destroy fail (%d)", state);
556 int _mmcamcorder_realize(MMHandleType handle)
558 int ret = MM_ERROR_NONE;
559 int state = MM_CAMCORDER_STATE_NONE;
560 int state_FROM = MM_CAMCORDER_STATE_NULL;
561 int state_TO = MM_CAMCORDER_STATE_READY;
562 int sessionType = MM_SESSION_TYPE_EXCLUSIVE;
563 int errorcode = MM_ERROR_NONE;
564 int display_surface_type = MM_DISPLAY_SURFACE_X;
565 char *videosink_element_type = NULL;
566 char *videosink_name = NULL;
567 _MMCamcorderMsgItem msg;
568 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
573 _mmcam_dbg_err("Not initialized");
574 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
578 /* Check quick-device-close for emergency */
579 if (hcamcorder->quick_device_close) {
580 _mmcam_dbg_err("_mmcamcorder_realize can't be called!!!!");
581 ret = MM_ERROR_CAMCORDER_DEVICE;
582 goto _ERR_CAMCORDER_CMD_PRECON;
585 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
586 _mmcam_dbg_err("Another command is running.");
587 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
588 goto _ERR_CAMCORDER_CMD_PRECON;
591 state = _mmcamcorder_get_state(handle);
592 if (state != state_FROM) {
593 _mmcam_dbg_err("Wrong state(%d)", state);
594 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
595 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
598 /* Set async state */
599 ret = _mmcamcorder_set_async_state(handle, state_TO);
601 _mmcam_dbg_err("Can't set async state");
602 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
605 /* Get profile mode */
606 mm_camcorder_get_attributes(handle, NULL, MMCAM_MODE, &hcamcorder->type, NULL);
607 _mmcam_dbg_log("Profile mode set is (%d)", hcamcorder->type);
609 /* Check and register ASM */
610 if (MM_ERROR_NONE != _mm_session_util_read_type(-1, &sessionType)) {
611 _mmcam_dbg_warn("Read _mm_session_util_read_type failed. use default \"exclusive\" type");
612 sessionType = MM_SESSION_TYPE_EXCLUSIVE;
614 if ((sessionType != MM_SESSION_TYPE_CALL) && (sessionType != MM_SESSION_TYPE_VIDEOCALL)) {
615 int asm_session_type = ASM_EVENT_NONE;
616 ASM_resource_t mm_resource = ASM_RESOURCE_NONE;
618 asm_session_type = __mmcamcorder_asm_get_event_type(sessionType);
619 switch (hcamcorder->type) {
620 case MM_CAMCORDER_MODE_VIDEO:
621 mm_resource = ASM_RESOURCE_CAMERA | ASM_RESOURCE_VIDEO_OVERLAY | ASM_RESOURCE_HW_ENCODER;
623 case MM_CAMCORDER_MODE_AUDIO:
624 mm_resource = ASM_RESOURCE_NONE;
626 case MM_CAMCORDER_MODE_IMAGE:
628 mm_resource = ASM_RESOURCE_CAMERA | ASM_RESOURCE_VIDEO_OVERLAY;
632 if (!ASM_set_sound_state(hcamcorder->asm_handle, asm_session_type,
633 ASM_STATE_PLAYING, mm_resource, &errorcode)) {
634 debug_error("Set state to playing failed 0x%X\n", errorcode);
635 ret = MM_ERROR_POLICY_BLOCKED;
636 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
640 /* alloc sub context */
641 hcamcorder->sub_context = _mmcamcorder_alloc_subcontext(hcamcorder->type);
642 if(!hcamcorder->sub_context) {
643 ret = MM_ERROR_CAMCORDER_RESOURCE_CREATION;
644 goto _ERR_CAMCORDER_CMD;
647 /* Set basic configure information */
648 mm_camcorder_get_attributes(handle, NULL, MMCAM_DISPLAY_SURFACE, &display_surface_type, NULL);
649 switch (display_surface_type) {
650 case MM_DISPLAY_SURFACE_X:
651 videosink_element_type = strdup("VideosinkElementX");
653 case MM_DISPLAY_SURFACE_EVAS:
654 videosink_element_type = strdup("VideosinkElementEvas");
656 case MM_DISPLAY_SURFACE_GL:
657 videosink_element_type = strdup("VideosinkElementGL");
659 case MM_DISPLAY_SURFACE_NULL:
660 videosink_element_type = strdup("VideosinkElementNull");
663 videosink_element_type = strdup("VideosinkElementX");
666 _mmcamcorder_conf_get_element(hcamcorder->conf_main,
667 CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
668 videosink_element_type,
669 &hcamcorder->sub_context->VideosinkElement );
670 _mmcamcorder_conf_get_value_element_name( hcamcorder->sub_context->VideosinkElement, &videosink_name );
671 _mmcam_dbg_log( "Videosink name : %s", videosink_name );
673 if (videosink_element_type) {
674 free(videosink_element_type);
675 videosink_element_type = NULL;
678 _mmcamcorder_conf_get_value_int(hcamcorder->conf_ctrl,
679 CONFIGURE_CATEGORY_CTRL_CAPTURE,
680 "SensorEncodedCapture",
681 &(hcamcorder->sub_context->SensorEncodedCapture));
682 _mmcam_dbg_log("Support sensor encoded capture : %d", hcamcorder->sub_context->SensorEncodedCapture);
684 /* create pipeline */
685 __ta__(" _mmcamcorder_create_pipeline",
686 ret = _mmcamcorder_create_pipeline(handle, hcamcorder->type);
689 _mmcamcorder_dealloc_subcontext(hcamcorder->sub_context);
690 hcamcorder->sub_context = NULL;
691 goto _ERR_CAMCORDER_CMD;
694 /* set command function */
695 ret = _mmcamcorder_set_functions(handle, hcamcorder->type);
698 _mmcamcorder_destroy_pipeline(handle, hcamcorder->type);
699 _mmcamcorder_dealloc_subcontext(hcamcorder->sub_context);
700 hcamcorder->sub_context = NULL;
701 goto _ERR_CAMCORDER_CMD;
704 _mmcamcorder_set_state(handle, state_TO);
705 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
707 return MM_ERROR_NONE;
710 /* set async state and (set async cancel or set state) are pair. */
711 _mmcamcorder_set_async_cancel(handle);
713 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
714 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
716 _ERR_CAMCORDER_CMD_PRECON:
718 _mmcam_dbg_err("Realize fail (%d, %d, %x)", hcamcorder->type, state, ret);
720 msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
721 msg.param.state.previous = state;
722 msg.param.state.current = state;
723 msg.param.state.code = ret;
724 _mmcamcroder_send_message(handle, &msg);
730 int _mmcamcorder_unrealize(MMHandleType handle)
732 int ret = MM_ERROR_NONE;
733 int state = MM_CAMCORDER_STATE_NONE;
734 int state_FROM = MM_CAMCORDER_STATE_READY;
735 int state_TO = MM_CAMCORDER_STATE_NULL;
736 int sessionType = MM_SESSION_TYPE_SHARE;
737 int asm_session_type = ASM_EVENT_NONE;
738 ASM_resource_t mm_resource = ASM_RESOURCE_NONE;
739 _MMCamcorderMsgItem msg;
740 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
745 _mmcam_dbg_err("Not initialized");
746 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
750 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
751 _mmcam_dbg_err("Another command is running.");
752 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
753 goto _ERR_CAMCORDER_CMD_PRECON;
756 state = _mmcamcorder_get_state(handle);
757 if (state != state_FROM) {
758 _mmcam_dbg_err("Wrong state(%d)", state);
759 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
760 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
763 /* set async state */
764 ret = _mmcamcorder_set_async_state(handle, state_TO);
765 if (ret != MM_ERROR_NONE) {
766 _mmcam_dbg_err("Can't set async state");
767 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
770 /* Release sound handle */
771 __ta__("_mmcamcorder_sound_finalize",
772 ret = _mmcamcorder_sound_finalize(handle);
774 _mmcam_dbg_log("sound finalize [%d]", ret);
776 /* Release SubContext */
777 if (hcamcorder->sub_context) {
778 /* destroy pipeline */
779 _mmcamcorder_destroy_pipeline(handle, hcamcorder->type);
780 /* Deallocate SubContext */
781 _mmcamcorder_dealloc_subcontext(hcamcorder->sub_context);
782 hcamcorder->sub_context = NULL;
785 /* Deinitialize main context member */
787 hcamcorder->command = NULL;
789 if (MM_ERROR_NONE != _mm_session_util_read_type(-1, &sessionType)) {
790 _mmcam_dbg_err("_mm_session_util_read_type Fail\n");
793 if ((sessionType != MM_SESSION_TYPE_CALL) && (sessionType != MM_SESSION_TYPE_VIDEOCALL)) {
794 asm_session_type = ASM_EVENT_NONE;
795 mm_resource = ASM_RESOURCE_NONE;
796 asm_session_type = __mmcamcorder_asm_get_event_type( sessionType );
798 switch (hcamcorder->type) {
799 case MM_CAMCORDER_MODE_VIDEO:
800 mm_resource = ASM_RESOURCE_CAMERA | ASM_RESOURCE_VIDEO_OVERLAY | ASM_RESOURCE_HW_ENCODER;
802 case MM_CAMCORDER_MODE_AUDIO:
803 mm_resource = ASM_RESOURCE_NONE;
805 case MM_CAMCORDER_MODE_IMAGE:
807 mm_resource = ASM_RESOURCE_CAMERA | ASM_RESOURCE_VIDEO_OVERLAY;
811 /* Call session is not ended here */
812 if (!ASM_set_sound_state(hcamcorder->asm_handle, asm_session_type,
813 ASM_STATE_STOP, mm_resource, &ret)) {
814 _mmcam_dbg_err("Set state to playing failed 0x%X\n", ret);
818 _mmcamcorder_set_state(handle, state_TO);
819 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
821 return MM_ERROR_NONE;
823 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
824 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
826 _ERR_CAMCORDER_CMD_PRECON:
828 _mmcam_dbg_err("Unrealize fail (%d, %d)", hcamcorder->type, state);
830 msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
831 msg.param.state.previous = state;
832 msg.param.state.current = state;
833 msg.param.state.code = ret;
834 _mmcamcroder_send_message(handle, &msg);
839 int _mmcamcorder_start(MMHandleType handle)
841 int ret = MM_ERROR_NONE;
842 int state = MM_CAMCORDER_STATE_NONE;
843 int state_FROM = MM_CAMCORDER_STATE_READY;
844 int state_TO =MM_CAMCORDER_STATE_PREPARE;
845 _MMCamcorderMsgItem msg;
846 _MMCamcorderSubContext *sc = NULL;
847 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
852 _mmcam_dbg_err("Not initialized");
853 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
857 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
858 mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
860 /* check quick-device-close for emergency */
861 if (hcamcorder->quick_device_close) {
862 _mmcam_dbg_err("_mmcamcorder_start can't be called!!!!");
863 ret = MM_ERROR_CAMCORDER_DEVICE;
864 goto _ERR_CAMCORDER_CMD_PRECON;
867 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
868 _mmcam_dbg_err("Another command is running.");
869 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
870 goto _ERR_CAMCORDER_CMD_PRECON;
873 state = _mmcamcorder_get_state(handle);
874 if (state != state_FROM) {
875 _mmcam_dbg_err("Wrong state(%d)", state);
876 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
877 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
880 /* set async state */
881 ret = _mmcamcorder_set_async_state(handle, state_TO);
882 if (ret != MM_ERROR_NONE) {
883 _mmcam_dbg_err("Can't set async state");
884 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
887 ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_PREVIEW_START);
888 if (ret != MM_ERROR_NONE) {
889 goto _ERR_CAMCORDER_CMD;
892 _mmcamcorder_set_state(handle, state_TO);
894 if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
895 _mmcamcorder_set_attribute_to_camsensor(handle);
898 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
900 return MM_ERROR_NONE;
903 /* set async state and (set async cancel or set state) are pair. */
904 _mmcamcorder_set_async_cancel(handle);
906 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
907 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
909 _ERR_CAMCORDER_CMD_PRECON:
911 _mmcam_dbg_err("Start fail (%d, %d)", hcamcorder->type, state);
913 msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
914 msg.param.state.previous = state;
915 msg.param.state.current = state;
916 msg.param.state.code = ret;
917 _mmcamcroder_send_message(handle, &msg);
922 int _mmcamcorder_stop(MMHandleType handle)
924 int ret = MM_ERROR_NONE;
925 int state = MM_CAMCORDER_STATE_NONE;
926 int state_FROM = MM_CAMCORDER_STATE_PREPARE;
927 int state_TO = MM_CAMCORDER_STATE_READY;
929 _MMCamcorderMsgItem msg;
930 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
935 _mmcam_dbg_err("Not initialized");
936 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
940 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
941 _mmcam_dbg_err("Another command is running.");
942 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
943 goto _ERR_CAMCORDER_CMD_PRECON;
946 state = _mmcamcorder_get_state(handle);
947 if (state != state_FROM) {
948 _mmcam_dbg_err("Wrong state(%d)", state);
949 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
950 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
953 /* set async state */
954 ret = _mmcamcorder_set_async_state(handle, state_TO);
955 if (ret != MM_ERROR_NONE) {
956 _mmcam_dbg_err("Can't set async state");
957 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
960 ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_PREVIEW_STOP);
961 if (ret != MM_ERROR_NONE) {
962 goto _ERR_CAMCORDER_CMD;
965 /* KPI : frame rate */
966 frame_rate=_mmcamcorder_video_average_framerate(handle);
967 __ta__(__tafmt__("MM_CAM_006:: Frame per sec : %d", frame_rate), ;);
969 _mmcamcorder_set_state(handle, state_TO);
970 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
972 return MM_ERROR_NONE;
975 /* set async state and (set async cancel or set state) are pair. */
976 _mmcamcorder_set_async_cancel(handle);
978 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
979 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
981 _ERR_CAMCORDER_CMD_PRECON:
983 _mmcam_dbg_err("Stop fail (%d, %d)", hcamcorder->type, state);
985 msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
986 msg.param.state.previous = state;
987 msg.param.state.current = state;
988 msg.param.state.code = ret;
989 _mmcamcroder_send_message(handle, &msg);
995 int _mmcamcorder_capture_start(MMHandleType handle)
997 int ret = MM_ERROR_NONE;
998 int state = MM_CAMCORDER_STATE_NONE;
999 int state_FROM = MM_CAMCORDER_STATE_PREPARE;
1000 int state_TO = MM_CAMCORDER_STATE_CAPTURING;
1001 char *err_name = NULL;
1003 _MMCamcorderMsgItem msg;
1004 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1009 _mmcam_dbg_err("Not initialized");
1010 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1014 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1015 _mmcam_dbg_err("Another command is running.");
1016 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1017 goto _ERR_CAMCORDER_CMD_PRECON;
1020 state = _mmcamcorder_get_state(handle);
1021 if (state != state_FROM) {
1022 _mmcam_dbg_err("Wrong state(%d)", state);
1023 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1024 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1027 /* set async state */
1028 ret = _mmcamcorder_set_async_state(handle, state_TO);
1029 if (ret != MM_ERROR_NONE) {
1030 _mmcam_dbg_err("Can't set async state");
1031 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1034 ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_CAPTURE);
1035 if (ret != MM_ERROR_NONE) {
1036 goto _ERR_CAMCORDER_CMD;
1039 _mmcamcorder_set_state(handle, state_TO);
1041 /* Init break continuous shot attr */
1042 mm_camcorder_set_attributes(handle, &err_name, "capture-break-cont-shot", 0, NULL);
1044 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1046 return MM_ERROR_NONE;
1049 /* set async state and (set async cancel or set state) are pair. */
1050 _mmcamcorder_set_async_cancel(handle);
1052 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1053 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1055 _ERR_CAMCORDER_CMD_PRECON:
1057 _mmcam_dbg_err("Capture start fail (%d, %d)", hcamcorder->type, state);
1059 msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
1060 msg.param.state.previous = state;
1061 msg.param.state.current = state;
1062 msg.param.state.code = ret;
1063 _mmcamcroder_send_message(handle, &msg);
1068 int _mmcamcorder_capture_stop(MMHandleType handle)
1070 int ret = MM_ERROR_NONE;
1071 int state = MM_CAMCORDER_STATE_NONE;
1072 int state_FROM = MM_CAMCORDER_STATE_CAPTURING;
1073 int state_TO = MM_CAMCORDER_STATE_PREPARE;
1074 _MMCamcorderMsgItem msg;
1075 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1080 _mmcam_dbg_err("Not initialized");
1081 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1085 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1086 _mmcam_dbg_err("Another command is running.");
1087 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1088 goto _ERR_CAMCORDER_CMD_PRECON;
1091 state = _mmcamcorder_get_state(handle);
1092 if (state != state_FROM) {
1093 _mmcam_dbg_err("Wrong state(%d)", state);
1094 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1095 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1098 /* set async state */
1099 ret = _mmcamcorder_set_async_state(handle, state_TO);
1100 if (ret != MM_ERROR_NONE) {
1101 _mmcam_dbg_err("Can't set async state");
1102 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1105 ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_PREVIEW_START);
1106 if (ret != MM_ERROR_NONE) {
1107 goto _ERR_CAMCORDER_CMD;
1110 _mmcamcorder_set_state(handle, state_TO);
1112 /* Set strobe mode - strobe mode can not be set to driver while captuing */
1114 __ta__("Set strobe mode after capture",
1115 mmf_attrs_t *attr = (mmf_attrs_t *)MMF_CAMCORDER_ATTRS(handle);
1117 mmf_attribute_set_modified(&(attr->items[MM_CAM_STROBE_MODE]));
1118 if (mmf_attrs_commit((MMHandleType) attr) == -1) {
1119 _mmcam_dbg_warn("Failed to set strobe mode");
1125 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1127 return MM_ERROR_NONE;
1130 /* set async state and (set async cancel or set state) are pair. */
1131 _mmcamcorder_set_async_cancel(handle);
1133 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1134 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1136 _ERR_CAMCORDER_CMD_PRECON:
1138 _mmcam_dbg_err("Capture stop fail (%d, %d)", hcamcorder->type, state);
1140 msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
1141 msg.param.state.previous = state;
1142 msg.param.state.current = state;
1143 msg.param.state.code = ret;
1144 _mmcamcroder_send_message(handle, &msg);
1149 int _mmcamcorder_record(MMHandleType handle)
1151 int ret = MM_ERROR_NONE;
1152 int state = MM_CAMCORDER_STATE_NONE;
1153 int state_FROM1 = MM_CAMCORDER_STATE_PREPARE;
1154 int state_FROM2 = MM_CAMCORDER_STATE_PAUSED;
1155 int state_TO = MM_CAMCORDER_STATE_RECORDING;
1156 _MMCamcorderMsgItem msg;
1157 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1162 _mmcam_dbg_err("Not initialized");
1163 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1167 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1168 _mmcam_dbg_err("Another command is running.");
1169 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1170 goto _ERR_CAMCORDER_CMD_PRECON;
1173 state = _mmcamcorder_get_state(handle);
1174 if (state != state_FROM1 && state != state_FROM2) {
1175 _mmcam_dbg_err("Wrong state(%d)", state);
1176 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1177 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1180 /* set async state */
1181 ret = _mmcamcorder_set_async_state(handle, state_TO);
1182 if (ret != MM_ERROR_NONE) {
1183 _mmcam_dbg_err("Can't set async state");
1184 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1187 ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_RECORD);
1188 if (ret != MM_ERROR_NONE) {
1189 goto _ERR_CAMCORDER_CMD;
1192 _mmcamcorder_set_state(handle, state_TO);
1193 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1195 return MM_ERROR_NONE;
1198 /* set async state and (set async cancel or set state) are pair. */
1199 _mmcamcorder_set_async_cancel(handle);
1201 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1202 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1204 _ERR_CAMCORDER_CMD_PRECON:
1206 _mmcam_dbg_err("Record fail (%d, %d)", hcamcorder->type, state);
1208 msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
1209 msg.param.state.previous = state;
1210 msg.param.state.current = state;
1211 msg.param.state.code = ret;
1212 _mmcamcroder_send_message(handle, &msg);
1218 int _mmcamcorder_pause(MMHandleType handle)
1220 int ret = MM_ERROR_NONE;
1221 int state = MM_CAMCORDER_STATE_NONE;
1222 int state_FROM = MM_CAMCORDER_STATE_RECORDING;
1223 int state_TO = MM_CAMCORDER_STATE_PAUSED;
1224 _MMCamcorderMsgItem msg;
1225 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1230 _mmcam_dbg_err("Not initialized");
1231 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1235 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1236 _mmcam_dbg_err("Another command is running.");
1237 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1238 goto _ERR_CAMCORDER_CMD_PRECON;
1241 state = _mmcamcorder_get_state(handle);
1242 if (state != state_FROM) {
1243 _mmcam_dbg_err("Wrong state(%d)", state);
1244 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1245 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1248 /* set async state */
1249 ret = _mmcamcorder_set_async_state(handle, state_TO);
1250 if (ret != MM_ERROR_NONE) {
1251 _mmcam_dbg_err("Can't set async state");
1252 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1255 ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_PAUSE);
1256 if (ret != MM_ERROR_NONE) {
1257 goto _ERR_CAMCORDER_CMD;
1260 _mmcamcorder_set_state(handle, state_TO);
1261 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1263 return MM_ERROR_NONE;
1266 /* set async state and (set async cancel or set state) are pair. */
1267 _mmcamcorder_set_async_cancel(handle);
1269 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1270 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1272 _ERR_CAMCORDER_CMD_PRECON:
1274 _mmcam_dbg_err("Pause fail (%d, %d)", hcamcorder->type, state);
1276 msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
1277 msg.param.state.previous = state;
1278 msg.param.state.current = state;
1279 msg.param.state.code = ret;
1280 _mmcamcroder_send_message(handle, &msg);
1286 int _mmcamcorder_commit(MMHandleType handle)
1288 int ret = MM_ERROR_NONE;
1289 int state = MM_CAMCORDER_STATE_NONE;
1290 int state_FROM1 = MM_CAMCORDER_STATE_RECORDING;
1291 int state_FROM2 = MM_CAMCORDER_STATE_PAUSED;
1292 int state_TO = MM_CAMCORDER_STATE_PREPARE;
1293 _MMCamcorderMsgItem msg;
1294 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1299 _mmcam_dbg_err("Not initialized");
1300 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1304 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1305 _mmcam_dbg_err("Another command is running.");
1306 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1307 goto _ERR_CAMCORDER_CMD_PRECON;
1310 state = _mmcamcorder_get_state(handle);
1311 if (state != state_FROM1 && state != state_FROM2) {
1312 _mmcam_dbg_err("Wrong state(%d)", state);
1313 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1314 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1317 /* set async state */
1318 ret = _mmcamcorder_set_async_state(handle, state_TO);
1319 if (ret != MM_ERROR_NONE) {
1320 _mmcam_dbg_err("Can't set async state");
1321 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1324 ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_COMMIT);
1325 if (ret != MM_ERROR_NONE) {
1326 goto _ERR_CAMCORDER_CMD;
1329 _mmcamcorder_set_state(handle,state_TO);
1330 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1332 return MM_ERROR_NONE;
1335 /* set async state and (set async cancel or set state) are pair. */
1336 _mmcamcorder_set_async_cancel(handle);
1338 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1339 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1341 _ERR_CAMCORDER_CMD_PRECON:
1343 _mmcam_dbg_err("Commit fail (%d, %d)", hcamcorder->type, state);
1345 msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
1346 msg.param.state.previous = state;
1347 msg.param.state.current = state;
1348 msg.param.state.code = ret;
1349 _mmcamcroder_send_message(handle, &msg);
1355 int _mmcamcorder_cancel(MMHandleType handle)
1357 int ret = MM_ERROR_NONE;
1358 int state = MM_CAMCORDER_STATE_NONE;
1359 int state_FROM1 = MM_CAMCORDER_STATE_RECORDING;
1360 int state_FROM2 = MM_CAMCORDER_STATE_PAUSED;
1361 int state_TO = MM_CAMCORDER_STATE_PREPARE;
1362 _MMCamcorderMsgItem msg;
1363 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1368 _mmcam_dbg_err("Not initialized");
1369 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1373 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1374 _mmcam_dbg_err("Another command is running.");
1375 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1376 goto _ERR_CAMCORDER_CMD_PRECON;
1379 state = _mmcamcorder_get_state(handle);
1380 if (state != state_FROM1 && state != state_FROM2) {
1381 _mmcam_dbg_err("Wrong state(%d)", state);
1382 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1383 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1386 /* set async state */
1387 ret = _mmcamcorder_set_async_state(handle, state_TO);
1388 if (ret != MM_ERROR_NONE) {
1389 _mmcam_dbg_err("Can't set async state");
1390 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1393 ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_CANCEL);
1394 if (ret != MM_ERROR_NONE) {
1395 goto _ERR_CAMCORDER_CMD;
1398 _mmcamcorder_set_state(handle, state_TO);
1399 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1401 return MM_ERROR_NONE;
1404 /* set async state and (set async cancel or set state) are pair. */
1405 _mmcamcorder_set_async_cancel(handle);
1407 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1408 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1410 _ERR_CAMCORDER_CMD_PRECON:
1412 _mmcam_dbg_err("Cancel fail (%d, %d)", hcamcorder->type, state);
1414 msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
1415 msg.param.state.previous = state;
1416 msg.param.state.current = state;
1417 msg.param.state.code = ret;
1418 _mmcamcroder_send_message(handle, &msg);
1422 /* } Internal command functions */
1425 int _mmcamcorder_commit_async_end(MMHandleType handle)
1429 _mmcam_dbg_warn("_mmcamcorder_commit_async_end : MM_CAMCORDER_STATE_PREPARE");
1430 _mmcamcorder_set_state(handle, MM_CAMCORDER_STATE_PREPARE);
1432 return MM_ERROR_NONE;
1436 int _mmcamcorder_set_message_callback(MMHandleType handle, MMMessageCallback callback, void *user_data)
1438 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1440 _mmcam_dbg_log("%p", hcamcorder);
1442 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1444 if (callback == NULL) {
1445 _mmcam_dbg_warn("Message Callback is disabled, because application sets it to NULL");
1448 if (!_MMCAMCORDER_TRYLOCK_MESSAGE_CALLBACK(hcamcorder)) {
1449 _mmcam_dbg_warn("Application's message callback is running now");
1450 return MM_ERROR_CAMCORDER_INVALID_CONDITION;
1453 /* set message callback to message handle */
1454 hcamcorder->msg_cb = callback;
1455 hcamcorder->msg_cb_param = user_data;
1457 _MMCAMCORDER_UNLOCK_MESSAGE_CALLBACK(hcamcorder);
1459 return MM_ERROR_NONE;
1463 int _mmcamcorder_set_video_stream_callback(MMHandleType handle, mm_camcorder_video_stream_callback callback, void *user_data)
1465 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1469 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1471 if (callback == NULL) {
1472 _mmcam_dbg_warn("Video Stream Callback is disabled, because application sets it to NULL");
1475 if (!_MMCAMCORDER_TRYLOCK_VSTREAM_CALLBACK(hcamcorder)) {
1476 _mmcam_dbg_warn("Application's video stream callback is running now");
1477 return MM_ERROR_CAMCORDER_INVALID_CONDITION;
1480 hcamcorder->vstream_cb = callback;
1481 hcamcorder->vstream_cb_param = user_data;
1483 _MMCAMCORDER_UNLOCK_VSTREAM_CALLBACK(hcamcorder);
1485 return MM_ERROR_NONE;
1489 int _mmcamcorder_set_audio_stream_callback(MMHandleType handle, mm_camcorder_audio_stream_callback callback, void *user_data)
1491 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1495 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1497 if (callback == NULL) {
1498 _mmcam_dbg_warn("Audio Stream Callback is disabled, because application sets it to NULL");
1501 if (!_MMCAMCORDER_TRYLOCK_ASTREAM_CALLBACK(hcamcorder)) {
1502 _mmcam_dbg_warn("Application's audio stream callback is running now");
1503 return MM_ERROR_CAMCORDER_INVALID_CONDITION;
1506 hcamcorder->astream_cb = callback;
1507 hcamcorder->astream_cb_param = user_data;
1509 _MMCAMCORDER_UNLOCK_ASTREAM_CALLBACK(hcamcorder);
1511 return MM_ERROR_NONE;
1515 int _mmcamcorder_set_video_capture_callback(MMHandleType handle, mm_camcorder_video_capture_callback callback, void *user_data)
1517 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1521 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1523 if (callback == NULL) {
1524 _mmcam_dbg_warn("Video Capture Callback is disabled, because application sets it to NULLL");
1527 if (!_MMCAMCORDER_TRYLOCK_VCAPTURE_CALLBACK(hcamcorder)) {
1528 _mmcam_dbg_warn("Application's video capture callback is running now");
1529 return MM_ERROR_CAMCORDER_INVALID_CONDITION;
1532 hcamcorder->vcapture_cb = callback;
1533 hcamcorder->vcapture_cb_param = user_data;
1535 _MMCAMCORDER_UNLOCK_VCAPTURE_CALLBACK(hcamcorder);
1537 return MM_ERROR_NONE;
1540 int _mmcamcorder_get_current_state(MMHandleType handle)
1542 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1546 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1548 return _mmcamcorder_get_state(handle);
1551 int _mmcamcorder_init_focusing(MMHandleType handle)
1554 int state = MM_CAMCORDER_STATE_NONE;
1555 int focus_mode = MM_CAMCORDER_FOCUS_MODE_NONE;
1556 int af_range = MM_CAMCORDER_AUTO_FOCUS_NORMAL;
1557 int sensor_focus_mode = 0;
1558 int sensor_af_range = 0;
1559 mmf_camcorder_t *hcamcorder = NULL;
1560 _MMCamcorderSubContext *sc = NULL;
1561 mmf_attrs_t *attr = NULL;
1562 GstCameraControl *control = NULL;
1566 hcamcorder = MMF_CAMCORDER(handle);
1567 mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1569 sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
1570 mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1572 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1573 _mmcam_dbg_err("Another command is running.");
1574 return MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1577 state = _mmcamcorder_get_state(handle);
1579 if (state == MM_CAMCORDER_STATE_CAPTURING ||
1580 state < MM_CAMCORDER_STATE_PREPARE) {
1581 _mmcam_dbg_err( "Not proper state. state[%d]", state );
1582 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1583 return MM_ERROR_CAMCORDER_INVALID_STATE;
1586 if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
1587 _mmcam_dbg_log("Can't cast Video source into camera control.");
1588 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1589 return MM_ERROR_NONE;
1591 control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
1593 ret = gst_camera_control_stop_auto_focus(control);
1595 _mmcam_dbg_err("Auto focusing stop fail.");
1596 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1597 return MM_ERROR_CAMCORDER_DEVICE_IO;
1600 /* Initialize lens position */
1601 attr = (mmf_attrs_t *)MMF_CAMCORDER_ATTRS(handle);
1602 mm_camcorder_get_attributes(handle, NULL,
1603 MMCAM_CAMERA_FOCUS_MODE, &focus_mode,
1604 MMCAM_CAMERA_AF_SCAN_RANGE, &af_range,
1606 sensor_af_range = _mmcamcorder_convert_msl_to_sensor(MM_CAM_CAMERA_AF_SCAN_RANGE, af_range);
1607 sensor_focus_mode = _mmcamcorder_convert_msl_to_sensor(MM_CAM_CAMERA_FOCUS_MODE, focus_mode);
1609 ret = gst_camera_control_set_focus(control, sensor_focus_mode, sensor_af_range);
1611 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1614 _mmcam_dbg_log("Lens init success.");
1615 return MM_ERROR_NONE;
1617 _mmcam_dbg_err("Lens init fail.");
1618 return MM_ERROR_CAMCORDER_DEVICE_IO;
1622 int _mmcamcorder_adjust_focus(MMHandleType handle, int direction)
1625 int focus_mode = MM_CAMCORDER_FOCUS_MODE_NONE;
1626 int ret = MM_ERROR_UNKNOWN;
1627 char *err_attr_name = NULL;
1629 mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1630 mmf_return_val_if_fail(direction, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
1634 state = _mmcamcorder_get_state(handle);
1635 if (state == MM_CAMCORDER_STATE_CAPTURING ||
1636 state < MM_CAMCORDER_STATE_PREPARE) {
1637 _mmcam_dbg_err("Not proper state. state[%d]", state);
1638 return MM_ERROR_CAMCORDER_INVALID_STATE;
1641 /* TODO : call a auto or manual focus function */
1642 ret = mm_camcorder_get_attributes(handle, &err_attr_name,
1643 MMCAM_CAMERA_FOCUS_MODE, &focus_mode,
1645 if (ret != MM_ERROR_NONE) {
1646 _mmcam_dbg_warn("Get focus-mode fail. (%s:%x)", err_attr_name, ret);
1647 SAFE_FREE (err_attr_name);
1651 if (focus_mode == MM_CAMCORDER_FOCUS_MODE_MANUAL) {
1652 return _mmcamcorder_adjust_manual_focus(handle, direction);
1653 } else if (focus_mode == MM_CAMCORDER_FOCUS_MODE_AUTO ||
1654 focus_mode == MM_CAMCORDER_FOCUS_MODE_TOUCH_AUTO ||
1655 focus_mode == MM_CAMCORDER_FOCUS_MODE_CONTINUOUS) {
1656 return _mmcamcorder_adjust_auto_focus(handle);
1658 _mmcam_dbg_err("It doesn't adjust focus. Focusing mode(%d)", focus_mode);
1659 return MM_ERROR_CAMCORDER_NOT_SUPPORTED;
1663 int _mmcamcorder_adjust_manual_focus(MMHandleType handle, int direction)
1668 int focus_level = 0;
1669 float unit_level = 0;
1670 GstCameraControl *control = NULL;
1671 _MMCamcorderSubContext *sc = NULL;
1672 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1676 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1677 mmf_return_val_if_fail(_MMFCAMCORDER_FOCUS_TOTAL_LEVEL != 1, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
1678 mmf_return_val_if_fail((direction >= MM_CAMCORDER_MF_LENS_DIR_FORWARD) &&
1679 (direction <= MM_CAMCORDER_MF_LENS_DIR_BACKWARD),
1680 MM_ERROR_CAMCORDER_INVALID_ARGUMENT );
1682 sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
1683 mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1685 if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
1686 _mmcam_dbg_log("Can't cast Video source into camera control.");
1687 return MM_ERROR_NONE;
1689 control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
1691 /* TODO : get max, min level */
1692 if (max_level - min_level + 1 < _MMFCAMCORDER_FOCUS_TOTAL_LEVEL) {
1693 _mmcam_dbg_warn("Total level of manual focus of MMF is greater than that of the camera driver.");
1696 unit_level = ((float)max_level - (float)min_level)/(float)(_MMFCAMCORDER_FOCUS_TOTAL_LEVEL - 1);
1698 if (!gst_camera_control_get_focus_level(control, &cur_level)) {
1699 _mmcam_dbg_err("Can't get current level of manual focus.");
1700 return MM_ERROR_CAMCORDER_DEVICE_IO;
1703 //TODO : adjust unit level value
1704 if (direction == MM_CAMCORDER_MF_LENS_DIR_FORWARD) {
1705 focus_level = cur_level + unit_level;
1706 } else if (direction == MM_CAMCORDER_MF_LENS_DIR_BACKWARD) {
1707 focus_level = cur_level - unit_level;
1710 if (focus_level > max_level) {
1711 focus_level = max_level;
1712 } else if (focus_level < min_level) {
1713 focus_level = min_level;
1716 if (!gst_camera_control_set_focus_level(control, focus_level)) {
1717 _mmcam_dbg_err("Manual focusing fail.");
1718 return MM_ERROR_CAMCORDER_DEVICE_IO;
1721 return MM_ERROR_NONE;
1725 int _mmcamcorder_adjust_auto_focus(MMHandleType handle)
1727 int af_mode = MM_CAMCORDER_FOCUS_MODE_AUTO;
1729 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1730 GstCameraControl *control = NULL;
1731 _MMCamcorderSubContext *sc = NULL;
1733 mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1737 sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
1739 if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
1740 _mmcam_dbg_log("Can't cast Video source into camera control.");
1741 return MM_ERROR_NONE;
1743 control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
1746 ret = gst_camera_control_start_auto_focus(control);
1748 mm_camcorder_get_attributes(handle, NULL, MMCAM_CAMERA_FOCUS_MODE, &af_mode, NULL);
1749 if (af_mode == MM_CAMCORDER_FOCUS_MODE_CONTINUOUS) {
1750 sc->now_continuous_af = TRUE;
1751 _mmcam_dbg_log("Set now_continuous_af as TRUE");
1753 _mmcam_dbg_log("Auto focusing start success.");
1754 return MM_ERROR_NONE;
1756 _mmcam_dbg_err("Auto focusing start fail.");
1757 return MM_ERROR_CAMCORDER_DEVICE_IO;
1761 int _mmcamcorder_stop_focusing(MMHandleType handle)
1763 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1764 _MMCamcorderSubContext *sc = NULL;
1767 GstCameraControl *control = NULL;
1769 mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1773 sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
1775 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1776 _mmcam_dbg_err("Another command is running.");
1777 return MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1780 state = _mmcamcorder_get_state(handle);
1781 if (state == MM_CAMCORDER_STATE_CAPTURING ||
1782 state < MM_CAMCORDER_STATE_PREPARE) {
1783 _mmcam_dbg_err( "Not proper state. state[%d]", state );
1784 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1785 return MM_ERROR_CAMCORDER_INVALID_STATE;
1788 if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
1789 _mmcam_dbg_log("Can't cast Video source into camera control.");
1790 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1791 return MM_ERROR_NONE;
1793 control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
1795 ret = gst_camera_control_stop_auto_focus(control);
1796 sc->now_continuous_af = FALSE;
1797 _mmcam_dbg_log("Set now_continuous_af as FALSE");
1799 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1802 _mmcam_dbg_log("Auto focusing stop success.");
1803 return MM_ERROR_NONE;
1805 _mmcam_dbg_err("Auto focusing stop fail.");
1806 return MM_ERROR_CAMCORDER_DEVICE_IO;
1811 /*-----------------------------------------------
1812 | CAMCORDER INTERNAL LOCAL |
1813 -----------------------------------------------*/
1815 __mmcamcorder_gstreamer_init(camera_conf * conf)
1817 static const int max_argc = 10;
1821 gchar **argv = NULL;
1823 gboolean ret = FALSE;
1824 type_string_array *GSTInitOption = NULL;
1826 mmf_return_val_if_fail(conf, FALSE);
1831 argc = malloc(sizeof(int));
1832 argv = malloc(sizeof(gchar *) * max_argc);
1834 if (!argc || !argv) {
1838 memset(argv, 0, sizeof(gchar *) * max_argc);
1842 argv[0] = g_strdup("mmcamcorder");
1845 _mmcamcorder_conf_get_value_string_array(conf,
1846 CONFIGURE_CATEGORY_MAIN_GENERAL,
1849 if (GSTInitOption != NULL && GSTInitOption->value) {
1850 cnt_str = GSTInitOption->count;
1851 for( ; *argc < max_argc && *argc <= cnt_str ; (*argc)++ )
1853 argv[*argc] = g_strdup(GSTInitOption->value[(*argc)-1]);
1857 _mmcam_dbg_log("initializing gstreamer with following parameter[argc:%d]", *argc);
1859 for (i = 0; i < *argc; i++) {
1860 _mmcam_dbg_log("argv[%d] : %s", i, argv[i]);
1863 /* initializing gstreamer */
1864 __ta__(" gst_init_check",
1865 ret = gst_init_check (argc, &argv, &err);
1869 _mmcam_dbg_err("Could not initialize GStreamer: %s\n",
1870 err ? err->message : "unknown error occurred");
1877 for (i = 0; i < *argc; i++) {
1897 _mmcam_dbg_err("failed to initialize gstreamer");
1913 int _mmcamcorder_get_state(MMHandleType handle)
1916 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1918 mmf_return_val_if_fail(hcamcorder, -1);
1920 _MMCAMCORDER_LOCK_STATE(handle);
1922 state = hcamcorder->state;
1923 _mmcam_dbg_log("state=%d",state);
1925 _MMCAMCORDER_UNLOCK_STATE(handle);
1931 void _mmcamcorder_set_state(MMHandleType handle, int state)
1934 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1935 _MMCamcorderMsgItem msg;
1937 mmf_return_if_fail(hcamcorder);
1941 _MMCAMCORDER_LOCK_STATE(handle);
1943 old_state = hcamcorder->state;
1944 if(old_state != state) {
1945 hcamcorder->state = state;
1946 hcamcorder->target_state = state;
1948 _mmcam_dbg_log("set state[%d] and send state-changed message", state);
1950 /* To discern who changes the state */
1951 switch (hcamcorder->state_change_by_system) {
1952 case _MMCAMCORDER_STATE_CHANGE_BY_ASM:
1953 msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED_BY_ASM;
1954 msg.param.state.code = hcamcorder->asm_event_code;
1957 msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
1958 msg.param.state.code = MM_ERROR_NONE;
1962 msg.param.state.previous = old_state;
1963 msg.param.state.current = state;
1965 _mmcam_dbg_log("_mmcamcroder_send_message : msg : %p, id:%x", &msg, msg.id);
1966 _mmcamcroder_send_message(handle, &msg);
1969 _MMCAMCORDER_UNLOCK_STATE(handle);
1975 int _mmcamcorder_get_async_state(MMHandleType handle)
1978 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1980 _MMCAMCORDER_LOCK_STATE(handle);
1981 state = hcamcorder->target_state;
1983 _MMCAMCORDER_UNLOCK_STATE(handle);
1988 int _mmcamcorder_set_async_state(MMHandleType handle, int target_state)
1990 int error = MM_ERROR_NONE;
1991 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1993 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_CONDITION);
1997 if (hcamcorder->sync_state_change) {
2001 _MMCAMCORDER_LOCK_STATE(handle);
2003 /* check changing state */
2004 if (hcamcorder->state != hcamcorder->target_state) {
2005 _mmcam_dbg_warn("State is changing now.");
2006 error = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
2007 goto _SET_ASYNC_END;
2010 /* check already set */
2011 if (hcamcorder->state == target_state) {
2012 _mmcam_dbg_log("Target state already set.");
2013 error = MM_ERROR_CAMCORDER_INVALID_STATE;
2014 goto _SET_ASYNC_END;
2017 hcamcorder->target_state = target_state;
2019 _mmcam_dbg_log("Done");
2022 _MMCAMCORDER_UNLOCK_STATE(handle);
2027 gboolean _mmcamcorder_set_async_cancel(MMHandleType handle)
2029 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2031 mmf_return_val_if_fail(hcamcorder, FALSE);
2035 if (hcamcorder->sync_state_change) {
2039 _MMCAMCORDER_LOCK_STATE(handle);
2041 if (hcamcorder->target_state != hcamcorder->state) {
2042 hcamcorder->target_state = hcamcorder->state;
2043 _mmcam_dbg_log("Async state change is canceled.");
2044 _MMCAMCORDER_UNLOCK_STATE(handle);
2047 _mmcam_dbg_log("Nothing to be cancel or Already processed.");
2050 _MMCAMCORDER_UNLOCK_STATE(handle);
2056 gboolean _mmcamcorder_is_state_changing(MMHandleType handle)
2058 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2060 mmf_return_val_if_fail(hcamcorder, FALSE);
2062 _mmcam_dbg_log("(%d)", (hcamcorder->target_state != hcamcorder->state));
2064 if (hcamcorder->sync_state_change) {
2068 _MMCAMCORDER_LOCK_STATE(handle);
2070 if (hcamcorder->target_state != hcamcorder->state) {
2071 _MMCAMCORDER_UNLOCK_STATE(handle);
2075 _MMCAMCORDER_UNLOCK_STATE(handle);
2081 _MMCamcorderSubContext *_mmcamcorder_alloc_subcontext(int type)
2084 _MMCamcorderSubContext *sc = NULL;
2088 /* alloc container */
2089 sc = (_MMCamcorderSubContext *)malloc(sizeof(_MMCamcorderSubContext));
2090 mmf_return_val_if_fail(sc != NULL, NULL);
2093 memset(sc, 0x00, sizeof(_MMCamcorderSubContext));
2095 sc->element_num = _MMCamcorder_PIPELINE_ELEMENT_NUM;
2097 /* alloc info for each mode */
2099 case MM_CAMCORDER_MODE_IMAGE:
2100 sc->info = malloc( sizeof(_MMCamcorderImageInfo));
2101 if(sc->info == NULL) {
2102 _mmcam_dbg_err("Failed to alloc info structure");
2106 memset(sc->info, 0x00, sizeof(_MMCamcorderImageInfo));
2108 case MM_CAMCORDER_MODE_AUDIO:
2109 sc->info = malloc( sizeof(_MMCamcorderAudioInfo));
2110 if(sc->info == NULL) {
2111 _mmcam_dbg_err("Failed to alloc info structure");
2115 memset(sc->info, 0x00, sizeof(_MMCamcorderAudioInfo));
2117 case MM_CAMCORDER_MODE_VIDEO:
2118 sc->info = malloc( sizeof(_MMCamcorderVideoInfo));
2119 if(sc->info == NULL) {
2120 _mmcam_dbg_err("Failed to alloc info structure");
2124 memset(sc->info, 0x00, sizeof(_MMCamcorderVideoInfo));
2127 _mmcam_dbg_err("unknown type[%d]", type);
2132 /* alloc element array */
2133 sc->element = (_MMCamcorderGstElement *)malloc(sizeof(_MMCamcorderGstElement) * sc->element_num);
2135 _mmcam_dbg_err("Failed to alloc element structure");
2141 for (i = 0; i< sc->element_num; i++) {
2142 sc->element[i].id = _MMCAMCORDER_NONE;
2143 sc->element[i].gst = NULL;
2146 sc->fourcc = 0x80000000;
2148 sc->cam_stability_count = 0;
2149 sc->drop_vframe = 0;
2150 sc->pass_first_vframe = 0;
2156 void _mmcamcorder_dealloc_subcontext(_MMCamcorderSubContext *sc)
2179 int _mmcamcorder_set_functions(MMHandleType handle, int type)
2181 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2186 case MM_CAMCORDER_MODE_VIDEO:
2187 hcamcorder->command = _mmcamcorder_video_command;
2189 case MM_CAMCORDER_MODE_AUDIO:
2190 hcamcorder->command = _mmcamcorder_audio_command;
2192 case MM_CAMCORDER_MODE_IMAGE:
2193 hcamcorder->command = _mmcamcorder_image_command;
2196 return MM_ERROR_CAMCORDER_INTERNAL;
2200 return MM_ERROR_NONE;
2204 gboolean _mmcamcorder_pipeline_cb_message(GstBus *bus, GstMessage *message, gpointer data)
2206 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(data);
2207 _MMCamcorderMsgItem msg;
2208 _MMCamcorderSubContext *sc = NULL;
2210 mmf_return_val_if_fail(hcamcorder, FALSE);
2211 mmf_return_val_if_fail(message, FALSE);
2212 //_mmcam_dbg_log("message type=(%d)", GST_MESSAGE_TYPE(message));
2214 switch (GST_MESSAGE_TYPE(message)) {
2215 case GST_MESSAGE_UNKNOWN:
2216 _mmcam_dbg_log("GST_MESSAGE_UNKNOWN");
2218 case GST_MESSAGE_EOS:
2220 _mmcam_dbg_log ("Got EOS from element \"%s\".",
2221 GST_STR_NULL(GST_ELEMENT_NAME(GST_MESSAGE_SRC(message))));
2223 sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
2224 mmf_return_val_if_fail(sc, TRUE);
2225 mmf_return_val_if_fail(sc->info, TRUE);
2227 if (hcamcorder->type == MM_CAMCORDER_MODE_VIDEO) {
2228 _MMCamcorderVideoInfo *info = sc->info;
2229 if (info->b_commiting) {
2230 _mmcamcorder_video_handle_eos((MMHandleType)hcamcorder);
2232 } else if (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO) {
2233 _MMCamcorderAudioInfo *info = sc->info;
2234 if (info->b_commiting) {
2235 _mmcamcorder_audio_handle_eos((MMHandleType)hcamcorder);
2239 sc->bget_eos = TRUE;
2243 case GST_MESSAGE_ERROR:
2247 gst_message_parse_error(message, &err, &debug);
2249 _mmcam_dbg_err ("GSTERR: %s", err->message);
2250 _mmcam_dbg_err ("Error Debug: %s", debug);
2252 __mmcamcorder_handle_gst_error((MMHandleType)hcamcorder, message, err);
2258 case GST_MESSAGE_WARNING:
2262 gst_message_parse_warning (message, &err, &debug);
2264 _mmcam_dbg_warn("GSTWARN: %s", err->message);
2266 __mmcamcorder_handle_gst_warning((MMHandleType)hcamcorder, message, err);
2272 case GST_MESSAGE_INFO:
2273 _mmcam_dbg_log("GST_MESSAGE_INFO");
2275 case GST_MESSAGE_TAG:
2276 _mmcam_dbg_log("GST_MESSAGE_TAG");
2278 case GST_MESSAGE_BUFFERING:
2279 _mmcam_dbg_log("GST_MESSAGE_BUFFERING");
2281 case GST_MESSAGE_STATE_CHANGED:
2285 GstElement *pipeline = NULL;
2287 sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
2288 if ((sc) && (sc->element)) {
2289 if (sc->element[_MMCAMCORDER_MAIN_PIPE].gst) {
2290 pipeline = sc->element[_MMCAMCORDER_MAIN_PIPE].gst;
2291 if (message->src == (GstObject*)pipeline) {
2292 vnewstate = (GValue*)gst_structure_get_value(message->structure, "new-state");
2293 newstate = (GstState)vnewstate->data[0].v_int;
2294 _mmcam_dbg_log("GST_MESSAGE_STATE_CHANGED[%s]",gst_element_state_get_name(newstate));
2300 case GST_MESSAGE_STATE_DIRTY:
2301 _mmcam_dbg_log("GST_MESSAGE_STATE_DIRTY");
2303 case GST_MESSAGE_STEP_DONE:
2304 _mmcam_dbg_log("GST_MESSAGE_STEP_DONE");
2306 case GST_MESSAGE_CLOCK_PROVIDE:
2307 _mmcam_dbg_log("GST_MESSAGE_CLOCK_PROVIDE");
2309 case GST_MESSAGE_CLOCK_LOST:
2310 _mmcam_dbg_log("GST_MESSAGE_CLOCK_LOST");
2312 case GST_MESSAGE_NEW_CLOCK:
2315 gst_message_parse_new_clock(message, &clock);
2316 _mmcam_dbg_log("GST_MESSAGE_NEW_CLOCK : %s", (clock ? GST_OBJECT_NAME (clock) : "NULL"));
2319 case GST_MESSAGE_STRUCTURE_CHANGE:
2320 _mmcam_dbg_log("GST_MESSAGE_STRUCTURE_CHANGE");
2322 case GST_MESSAGE_STREAM_STATUS:
2323 _mmcam_dbg_log("GST_MESSAGE_STREAM_STATUS");
2325 case GST_MESSAGE_APPLICATION:
2326 _mmcam_dbg_log("GST_MESSAGE_APPLICATION");
2328 case GST_MESSAGE_ELEMENT:
2329 _mmcam_dbg_log("GST_MESSAGE_ELEMENT");
2331 if (gst_structure_has_name(message->structure, "avsysvideosrc-AF") ||
2332 gst_structure_has_name(message->structure, "camerasrc-AF")) {
2333 int focus_state = 0;
2335 gst_structure_get_int(message->structure, "focus-state", &focus_state);
2336 _mmcam_dbg_log("Focus State:%d", focus_state);
2338 msg.id = MM_MESSAGE_CAMCORDER_FOCUS_CHANGED;
2339 msg.param.code = focus_state;
2340 _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
2343 case GST_MESSAGE_SEGMENT_START:
2344 _mmcam_dbg_log("GST_MESSAGE_SEGMENT_START");
2346 case GST_MESSAGE_SEGMENT_DONE:
2347 _mmcam_dbg_log("GST_MESSAGE_SEGMENT_DONE");
2349 case GST_MESSAGE_DURATION:
2350 _mmcam_dbg_log("GST_MESSAGE_DURATION");
2352 case GST_MESSAGE_LATENCY:
2353 _mmcam_dbg_log("GST_MESSAGE_LATENCY");
2355 case GST_MESSAGE_ASYNC_START:
2356 _mmcam_dbg_log("GST_MESSAGE_ASYNC_START");
2358 case GST_MESSAGE_ASYNC_DONE:
2359 _mmcam_dbg_log("GST_MESSAGE_ASYNC_DONE");
2361 case GST_MESSAGE_ANY:
2362 _mmcam_dbg_log("GST_MESSAGE_ANY");
2365 _mmcam_dbg_log("not handled message type=(%d)", GST_MESSAGE_TYPE(message));
2373 static int __mmcamcorder_asm_get_event_type(int sessionType)
2375 switch (sessionType) {
2376 case MM_SESSION_TYPE_SHARE:
2377 return ASM_EVENT_SHARE_MMCAMCORDER;
2378 case MM_SESSION_TYPE_EXCLUSIVE:
2379 return ASM_EVENT_EXCLUSIVE_MMCAMCORDER;
2380 case MM_SESSION_TYPE_NOTIFY:
2381 return ASM_EVENT_NOTIFY;
2382 case MM_SESSION_TYPE_CALL:
2383 return ASM_EVENT_CALL;
2384 case MM_SESSION_TYPE_VIDEOCALL:
2385 return ASM_EVENT_VIDEOCALL;
2386 case MM_SESSION_TYPE_ALARM:
2387 return ASM_EVENT_ALARM;
2389 return ASM_EVENT_SHARE_MMCAMCORDER;
2393 ASM_cb_result_t _mmcamcorder_asm_callback(int handle, ASM_event_sources_t event_src,
2394 ASM_sound_commands_t command,
2395 unsigned int sound_status, void* cb_data)
2397 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(cb_data);
2398 int current_state = MM_CAMCORDER_STATE_NONE;
2399 ASM_cb_result_t cb_res = ASM_CB_RES_NONE;
2401 mmf_return_val_if_fail((MMHandleType)hcamcorder, ASM_CB_RES_NONE);
2403 current_state = _mmcamcorder_get_state((MMHandleType)hcamcorder);
2404 if (current_state <= MM_CAMCORDER_STATE_NONE ||
2405 current_state >= MM_CAMCORDER_STATE_NUM) {
2406 _mmcam_dbg_err("Abnormal state. Or null handle. (%p, %d, %d)", hcamcorder, command, current_state);
2409 /* set value to inform a status is changed by asm */
2410 hcamcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_BY_ASM;
2411 /* set ASM event code for sending it to application */
2412 hcamcorder->asm_event_code = event_src;
2415 case ASM_COMMAND_STOP:
2416 case ASM_COMMAND_PAUSE:
2417 _mmcam_dbg_log("Got msg from asm to Stop or Pause(%d, %d)", command, current_state);
2419 __mmcamcorder_force_stop(hcamcorder);
2420 cb_res = ASM_CB_RES_STOP;
2422 _mmcam_dbg_log("Finish opeartion. Camera is released.(%d)", cb_res);
2424 case ASM_COMMAND_PLAY:
2425 _mmcam_dbg_log("Got msg from asm to Play(%d, %d)", command, current_state);
2427 if (current_state >= MM_CAMCORDER_STATE_PREPARE) {
2428 _mmcam_dbg_log("Already start previewing");
2429 return ASM_CB_RES_PLAYING;
2432 __mmcamcorder_force_resume(hcamcorder);
2433 cb_res = ASM_CB_RES_PLAYING;
2435 _mmcam_dbg_log("Finish opeartion. Preview is started.(%d)", cb_res);
2437 case ASM_COMMAND_RESUME:
2439 _MMCamcorderMsgItem msg;
2441 _mmcam_dbg_log("Got msg from asm to Resume(%d, %d)", command, current_state);
2443 msg.id = MM_MESSAGE_READY_TO_RESUME;
2444 _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
2445 cb_res = ASM_CB_RES_PLAYING;
2447 _mmcam_dbg_log("Finish opeartion.(%d)", cb_res);
2450 default: /* should not be reached here */
2451 cb_res = ASM_CB_RES_PLAYING;
2452 _mmcam_dbg_err("Command err.");
2457 hcamcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_NORMAL;
2463 int _mmcamcorder_create_pipeline(MMHandleType handle, int type)
2465 int ret = MM_ERROR_NONE;
2466 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2467 _MMCamcorderSubContext *sc = NULL;
2468 GstElement *pipeline = NULL;
2470 _mmcam_dbg_log("handle : %x, type : %d", handle, type);
2472 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
2474 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
2475 mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
2478 case MM_CAMCORDER_MODE_IMAGE:
2479 __ta__(" _mmcamcorder_create_preview_pipeline",
2480 ret = _mmcamcorder_create_preview_pipeline(handle);
2482 if (ret != MM_ERROR_NONE) {
2486 __ta__(" _mmcamcorder_add_stillshot_pipeline",
2487 ret = _mmcamcorder_add_stillshot_pipeline(handle);
2489 if (ret != MM_ERROR_NONE) {
2493 case MM_CAMCORDER_MODE_AUDIO:
2494 __ta__(" _mmcamcorder_create_audio_pipeline",
2495 ret = _mmcamcorder_create_audio_pipeline(handle);
2497 if (ret != MM_ERROR_NONE) {
2501 case MM_CAMCORDER_MODE_VIDEO:
2502 __ta__(" _mmcamcorder_create_preview_pipeline",
2503 ret = _mmcamcorder_create_preview_pipeline(handle);
2505 if (ret != MM_ERROR_NONE) {
2510 return MM_ERROR_CAMCORDER_INTERNAL;
2513 pipeline = sc->element[_MMCAMCORDER_MAIN_PIPE].gst;
2514 if (type != MM_CAMCORDER_MODE_AUDIO) {
2515 if (hcamcorder->sync_state_change) {
2516 ret = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_READY);
2518 ret = _mmcamcorder_gst_set_state_async(handle, pipeline, GST_STATE_READY);
2519 if (ret == GST_STATE_CHANGE_FAILURE) {
2520 return MM_ERROR_CAMCORDER_GST_STATECHANGE;
2525 if (!_mmcamcorder_get_device_info(handle)) {
2526 _mmcam_dbg_err("Getting device information error!!");
2529 _mmcam_dbg_log("ret[%x]", ret);
2534 void _mmcamcorder_destroy_pipeline(MMHandleType handle, int type)
2536 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2537 _MMCamcorderSubContext *sc = NULL;
2541 mmf_return_if_fail(hcamcorder);
2543 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
2544 mmf_return_if_fail(sc);
2548 bus = gst_pipeline_get_bus(GST_PIPELINE(sc->element[_MMCAMCORDER_MAIN_PIPE].gst));
2550 /* Inside each pipeline destroy function, Set GST_STATE_NULL to Main pipeline */
2552 case MM_CAMCORDER_MODE_IMAGE:
2553 _mmcamcorder_destroy_image_pipeline(handle);
2555 case MM_CAMCORDER_MODE_AUDIO:
2556 _mmcamcorder_destroy_audio_pipeline(handle);
2558 case MM_CAMCORDER_MODE_VIDEO:
2559 _mmcamcorder_destroy_video_pipeline(handle);
2565 _mmcam_dbg_log("Pipeline clear!!");
2567 /* Remove pipeline message callback */
2568 g_source_remove(hcamcorder->pipeline_cb_event_id);
2570 /* Remove remained message in bus */
2572 GstMessage *gst_msg = NULL;
2573 while ((gst_msg = gst_bus_pop(bus)) != NULL) {
2574 _mmcamcorder_pipeline_cb_message(bus, gst_msg, (gpointer)hcamcorder);
2575 gst_message_unref( gst_msg );
2578 gst_object_unref( bus );
2582 /* checking unreleased element */
2583 for (i = 0 ; i < _MMCamcorder_PIPELINE_ELEMENT_NUM ; i++ ) {
2584 if (sc->element[i].gst) {
2585 if (GST_IS_ELEMENT(sc->element[i].gst)) {
2586 _mmcam_dbg_warn("Still alive element - ID[%d], name [%s], ref count[%d], status[%s]",
2588 GST_OBJECT_NAME(sc->element[i].gst),
2589 GST_OBJECT_REFCOUNT_VALUE(sc->element[i].gst),
2590 gst_element_state_get_name (GST_STATE (sc->element[i].gst)));
2591 g_object_weak_unref(G_OBJECT(sc->element[i].gst), (GWeakNotify)_mmcamcorder_element_release_noti, sc);
2593 _mmcam_dbg_warn("The element[%d] is still aliving, check it", sc->element[i].id);
2596 sc->element[i].id = _MMCAMCORDER_NONE;
2597 sc->element[i].gst = NULL;
2603 int _mmcamcorder_gst_set_state_async(MMHandleType handle, GstElement *pipeline, GstState target_state)
2605 GstStateChangeReturn setChangeReturn = GST_STATE_CHANGE_FAILURE;
2607 _MMCAMCORDER_LOCK_GST_STATE(handle);
2608 setChangeReturn = gst_element_set_state(pipeline, target_state);
2609 _MMCAMCORDER_UNLOCK_GST_STATE(handle);
2611 return setChangeReturn;
2615 static gboolean __mmcamcorder_set_attr_to_camsensor_cb(gpointer data)
2617 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(data);
2619 mmf_return_val_if_fail(hcamcorder, FALSE);
2623 _mmcamcorder_set_attribute_to_camsensor((MMHandleType)hcamcorder);
2626 hcamcorder->setting_event_id = 0;
2628 _mmcam_dbg_log("Done");
2635 int _mmcamcorder_gst_set_state (MMHandleType handle, GstElement *pipeline, GstState target_state)
2638 GstState pipeline_state = GST_STATE_VOID_PENDING;
2639 GstStateChangeReturn setChangeReturn = GST_STATE_CHANGE_FAILURE;
2640 GstStateChangeReturn getChangeReturn = GST_STATE_CHANGE_FAILURE;
2641 GstClockTime get_timeout = 3 * GST_SECOND;
2643 mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
2645 _mmcam_dbg_log("Set state to %d", target_state);
2647 _MMCAMCORDER_LOCK_GST_STATE(handle);
2649 for (k = 0; k < _MMCAMCORDER_STATE_SET_COUNT; k++) {
2650 setChangeReturn = gst_element_set_state(pipeline, target_state);
2651 if (setChangeReturn != GST_STATE_CHANGE_FAILURE) {
2652 getChangeReturn = gst_element_get_state(pipeline, &pipeline_state, NULL, get_timeout);
2653 switch (getChangeReturn) {
2654 case GST_STATE_CHANGE_NO_PREROLL:
2655 _mmcam_dbg_log("status=GST_STATE_CHANGE_NO_PREROLL.");
2656 case GST_STATE_CHANGE_SUCCESS:
2657 /* if we reached the final target state, exit */
2658 if (pipeline_state == target_state) {
2659 _MMCAMCORDER_UNLOCK_GST_STATE(handle);
2660 return MM_ERROR_NONE;
2663 case GST_STATE_CHANGE_ASYNC:
2664 _mmcam_dbg_log("status=GST_STATE_CHANGE_ASYNC.");
2667 _MMCAMCORDER_UNLOCK_GST_STATE(handle);
2668 _mmcam_dbg_log("status=GST_STATE_CHANGE_FAILURE.");
2669 return MM_ERROR_CAMCORDER_GST_STATECHANGE;
2672 _MMCAMCORDER_UNLOCK_GST_STATE(handle);
2673 _mmcam_dbg_err("timeout of gst_element_get_state()!!");
2674 return MM_ERROR_CAMCORDER_RESPONSE_TIMEOUT;
2676 usleep(_MMCAMCORDER_STATE_CHECK_INTERVAL);
2679 _MMCAMCORDER_UNLOCK_GST_STATE(handle);
2681 _mmcam_dbg_err("Failure. gst_element_set_state timeout!!");
2683 return MM_ERROR_CAMCORDER_RESPONSE_TIMEOUT;
2687 /* For performance check */
2688 int _mmcamcorder_video_current_framerate(MMHandleType handle)
2690 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2691 _MMCamcorderSubContext *sc = NULL;
2693 mmf_return_val_if_fail(hcamcorder, -1);
2695 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
2696 mmf_return_val_if_fail(sc, -1);
2698 return sc->kpi.current_fps;
2702 int _mmcamcorder_video_average_framerate(MMHandleType handle)
2704 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2705 _MMCamcorderSubContext *sc = NULL;
2707 mmf_return_val_if_fail(hcamcorder, -1);
2709 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
2710 mmf_return_val_if_fail(sc, -1);
2712 return sc->kpi.average_fps;
2716 void _mmcamcorder_video_current_framerate_init(MMHandleType handle)
2718 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2719 _MMCamcorderSubContext *sc = NULL;
2721 mmf_return_if_fail(hcamcorder);
2723 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
2724 mmf_return_if_fail(sc);
2726 memset(&(sc->kpi), 0x00, sizeof(_MMCamcorderKPIMeasure));
2731 /* Async state change */
2732 void _mmcamcorder_delete_command_info(__MMCamcorderCmdInfo *cmdinfo)
2739 static void __mmcamcorder_force_stop(mmf_camcorder_t *hcamcorder)
2744 int result = MM_ERROR_NONE;
2745 int current_state = MM_CAMCORDER_STATE_NONE;
2747 mmf_return_if_fail(hcamcorder);
2749 current_state = _mmcamcorder_get_state((MMHandleType)hcamcorder);
2751 _mmcam_dbg_log( "Force STOP MMFW Camcorder" );
2753 for (loop = 0 ; current_state > MM_CAMCORDER_STATE_NULL && loop < __MMCAMCORDER_CMD_ITERATE_MAX * 3 ; loop++) {
2754 itr_cnt = __MMCAMCORDER_CMD_ITERATE_MAX;
2755 switch (current_state) {
2756 case MM_CAMCORDER_STATE_CAPTURING:
2758 _MMCamcorderSubContext *sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
2759 _MMCamcorderImageInfo *info = NULL;
2761 mmf_return_if_fail(sc);
2762 mmf_return_if_fail((info = sc->info));
2764 _mmcam_dbg_log("Stop capturing.");
2766 /* if caturing isn't finished, waiting for 2 sec to finish real capture operation. check 'info->capturing'. */
2767 mm_camcorder_set_attributes((MMHandleType)hcamcorder, NULL,
2768 MMCAM_CAPTURE_BREAK_CONTINUOUS_SHOT, TRUE,
2771 for (i = 0; i < 20 && info->capturing; i++) {
2776 _mmcam_dbg_err("Timeout. Can't check stop capturing.");
2779 while ((itr_cnt--) && ((result = _mmcamcorder_capture_stop((MMHandleType)hcamcorder)) != MM_ERROR_NONE)) {
2780 _mmcam_dbg_warn("Can't stop capturing.(%x)", result);
2785 case MM_CAMCORDER_STATE_RECORDING:
2786 case MM_CAMCORDER_STATE_PAUSED:
2788 _mmcam_dbg_log("Stop recording.");
2790 while ((itr_cnt--) && ((result = _mmcamcorder_commit((MMHandleType)hcamcorder)) != MM_ERROR_NONE)) {
2791 _mmcam_dbg_warn("Can't commit.(%x)", result);
2795 case MM_CAMCORDER_STATE_PREPARE:
2797 _mmcam_dbg_log("Stop preview.");
2799 while ((itr_cnt--) && ((result = _mmcamcorder_stop((MMHandleType)hcamcorder)) != MM_ERROR_NONE)) {
2800 _mmcam_dbg_warn("Can't stop preview.(%x)", result);
2804 case MM_CAMCORDER_STATE_READY:
2806 _mmcam_dbg_log("unrealize");
2808 if ((result = _mmcamcorder_unrealize((MMHandleType)hcamcorder)) != MM_ERROR_NONE) {
2809 _mmcam_dbg_warn("Can't unrealize.(%x)", result);
2813 case MM_CAMCORDER_STATE_NULL:
2815 _mmcam_dbg_log("Already stopped.");
2819 current_state = _mmcamcorder_get_state((MMHandleType)hcamcorder);
2822 _mmcam_dbg_log( "Done." );
2828 static void __mmcamcorder_force_resume(mmf_camcorder_t *hcamcorder)
2831 int result = MM_ERROR_NONE;
2833 int current_state = MM_CAMCORDER_STATE_NONE;
2835 mmf_return_if_fail(hcamcorder);
2837 _mmcam_dbg_log("Force RESUME MMFW Camcorder");
2839 current_state = _mmcamcorder_get_state((MMHandleType)hcamcorder);
2841 for (loop = 0 ; current_state < MM_CAMCORDER_STATE_PREPARE && loop < __MMCAMCORDER_CMD_ITERATE_MAX * 3 ; loop++) {
2842 itr_cnt = __MMCAMCORDER_CMD_ITERATE_MAX;
2844 switch (current_state) {
2845 case MM_CAMCORDER_STATE_NULL:
2846 _mmcam_dbg_log("Realize");
2847 while ((itr_cnt--) && ((result = _mmcamcorder_realize((MMHandleType)hcamcorder)) != MM_ERROR_NONE)) {
2848 _mmcam_dbg_warn("Can't realize.(%x)", result);
2851 case MM_CAMCORDER_STATE_READY:
2852 _mmcam_dbg_log("Start previewing");
2854 while ((itr_cnt--) && ((result = _mmcamcorder_start((MMHandleType)hcamcorder)) != MM_ERROR_NONE)) {
2855 _mmcam_dbg_warn("Can't start previewing.(%x)", result);
2859 _mmcam_dbg_log("Abnormal state.");
2863 current_state = _mmcamcorder_get_state((MMHandleType)hcamcorder);
2866 _mmcam_dbg_log( "Done." );
2871 int _mmcamcorder_create_command_loop(MMHandleType handle)
2873 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2874 _MMCamcorderCommand *cmd;
2876 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
2880 cmd = (_MMCamcorderCommand *)&(hcamcorder->cmd);
2881 cmd->cmd_queue = g_queue_new();
2882 mmf_return_val_if_fail(cmd->cmd_queue, MM_ERROR_CAMCORDER_INVALID_CONDITION);
2884 sem_init(&cmd->sema, 0, 0);
2886 if (pthread_create(&cmd->pCommandThread, NULL, _mmcamcorder_command_loop_thread, hcamcorder)) {
2887 perror("Make Command Thread Fail");
2888 return MM_ERROR_COMMON_UNKNOWN;
2891 return MM_ERROR_NONE;
2895 int _mmcamcorder_destroy_command_loop(MMHandleType handle)
2897 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2898 _MMCamcorderCommand *cmd;
2900 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
2903 cmd = (_MMCamcorderCommand *)&(hcamcorder->cmd);
2904 mmf_return_val_if_fail(cmd->cmd_queue, MM_ERROR_CAMCORDER_INVALID_CONDITION);
2906 _mmcamcorder_append_simple_command(handle, _MMCAMCORDER_CMD_QUIT);
2908 sem_post(&cmd->sema); /* why is this needed? */
2910 _mmcam_dbg_log("wait for pthread join");
2912 pthread_join(cmd->pCommandThread, NULL);
2914 _mmcam_dbg_log("pthread join!!");
2916 sem_destroy(&cmd->sema);
2918 while (!g_queue_is_empty(cmd->cmd_queue)) {
2919 __MMCamcorderCmdInfo *info = NULL;
2920 info = g_queue_pop_head(cmd->cmd_queue);
2921 _mmcamcorder_delete_command_info(info);
2923 g_queue_free(cmd->cmd_queue);
2925 _mmcam_dbg_log("Command loop clear.");
2927 return MM_ERROR_NONE;
2931 int _mmcamcorder_append_command(MMHandleType handle, __MMCamcorderCmdInfo *info)
2934 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2935 _MMCamcorderCommand *cmd;
2937 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
2941 cmd = (_MMCamcorderCommand *)&(hcamcorder->cmd);
2942 mmf_return_val_if_fail(cmd->cmd_queue, MM_ERROR_CAMCORDER_INVALID_CONDITION);
2944 g_queue_push_tail (cmd->cmd_queue, (gpointer)info);
2946 sem_getvalue(&cmd->sema, &value);
2949 sem_post(&cmd->sema);
2951 /* Don't need to post. */
2954 return MM_ERROR_NONE;
2958 int _mmcamcorder_append_simple_command(MMHandleType handle, _MMCamcorderCommandType type)
2960 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2961 __MMCamcorderCmdInfo *info = NULL;
2963 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
2965 _mmcam_dbg_log("Command Type=%d", type);
2967 info = (__MMCamcorderCmdInfo*)malloc(sizeof(__MMCamcorderCmdInfo));
2969 info->handle = handle;
2972 _mmcamcorder_append_command(handle, info);
2974 return MM_ERROR_NONE;
2978 void *_mmcamcorder_command_loop_thread(void *arg)
2980 gboolean bExit_loop = FALSE;
2981 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(arg);
2982 _MMCamcorderCommand *cmd = NULL;
2983 __MMCamcorderCmdInfo *cmdinfo = NULL;
2985 mmf_return_val_if_fail(hcamcorder, NULL);
2987 cmd = (_MMCamcorderCommand *)&(hcamcorder->cmd);
2988 mmf_return_val_if_fail(cmd->cmd_queue, NULL);
2992 while (!bExit_loop) {
2993 sem_wait(&cmd->sema);
2996 while (!g_queue_is_empty (cmd->cmd_queue)) {
2997 int bRet = MM_ERROR_NONE;
2999 cmdinfo = g_queue_pop_head(cmd->cmd_queue);
3000 if (cmdinfo->handle == (MMHandleType)NULL) {
3001 _mmcam_dbg_log("Handle in cmdinfo is Null.");
3002 bRet = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
3004 switch (cmdinfo->type) {
3005 case _MMCAMCORDER_CMD_CREATE:
3006 case _MMCAMCORDER_CMD_DESTROY:
3007 case _MMCAMCORDER_CMD_CAPTURESTART:
3008 case _MMCAMCORDER_CMD_CAPTURESTOP:
3009 case _MMCAMCORDER_CMD_RECORD:
3010 case _MMCAMCORDER_CMD_PAUSE:
3011 case _MMCAMCORDER_CMD_COMMIT:
3012 __ta__("_mmcamcorder_commit",
3013 bRet = _mmcamcorder_commit(cmdinfo->handle);
3016 case _MMCAMCORDER_CMD_CANCEL:
3019 case _MMCAMCORDER_CMD_REALIZE:
3020 __ta__("_mmcamcorder_realize",
3021 bRet = _mmcamcorder_realize(cmdinfo->handle);
3024 case _MMCAMCORDER_CMD_UNREALIZE:
3025 __ta__("_mmcamcorder_unrealize",
3026 bRet = _mmcamcorder_unrealize(cmdinfo->handle);
3029 case _MMCAMCORDER_CMD_START:
3030 __ta__("_mmcamcorder_start",
3031 bRet = _mmcamcorder_start(cmdinfo->handle);
3034 case _MMCAMCORDER_CMD_STOP:
3035 __ta__("_mmcamcorder_stop",
3036 bRet = _mmcamcorder_stop(cmdinfo->handle);
3039 case _MMCAMCORDER_CMD_QUIT:
3040 _mmcam_dbg_log("Exit command loop!!");
3044 _mmcam_dbg_log("Wrong command type!!!");
3049 if (bRet != MM_ERROR_NONE) {
3050 _mmcam_dbg_log("Error on command process!(%x)", bRet);
3054 _mmcamcorder_delete_command_info(cmdinfo);
3067 static gboolean __mmcamcorder_handle_gst_error(MMHandleType handle, GstMessage *message, GError *error)
3069 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3070 _MMCamcorderMsgItem msg;
3071 gchar *msg_src_element;
3072 _MMCamcorderSubContext *sc = NULL;
3074 return_val_if_fail(hcamcorder, FALSE);
3075 return_val_if_fail(error, FALSE);
3076 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3077 mmf_return_val_if_fail(sc, FALSE);
3081 /* filtering filesink related errors */
3082 if (hcamcorder->state == MM_CAMCORDER_STATE_RECORDING &&
3083 (error->code == GST_RESOURCE_ERROR_WRITE || error->code == GST_RESOURCE_ERROR_SEEK)) {
3084 if (sc->ferror_count == 2 && sc->ferror_send == FALSE) {
3085 sc->ferror_send = TRUE;
3086 msg.param.code = __mmcamcorder_gst_handle_resource_error(handle, error->code, message);
3089 _mmcam_dbg_warn("Skip error");
3094 if (error->domain == GST_CORE_ERROR) {
3095 msg.param.code = __mmcamcorder_gst_handle_core_error(handle, error->code, message);
3096 } else if (error->domain == GST_LIBRARY_ERROR) {
3097 msg.param.code = __mmcamcorder_gst_handle_library_error(handle, error->code, message);
3098 } else if (error->domain == GST_RESOURCE_ERROR) {
3099 msg.param.code = __mmcamcorder_gst_handle_resource_error(handle, error->code, message);
3100 } else if (error->domain == GST_STREAM_ERROR) {
3101 msg.param.code = __mmcamcorder_gst_handle_stream_error(handle, error->code, message);
3103 debug_warning("This error domain is not defined.\n");
3105 /* we treat system error as an internal error */
3106 msg.param.code = MM_ERROR_CAMCORDER_INTERNAL;
3110 msg_src_element = GST_ELEMENT_NAME(GST_ELEMENT_CAST(message->src));
3111 debug_error("-Msg src : [%s] Domain : [%s] Error : [%s] Code : [%d] is tranlated to error code : [0x%x]\n",
3112 msg_src_element, g_quark_to_string (error->domain), error->message, error->code, msg.param.code);
3114 debug_error("Domain : [%s] Error : [%s] Code : [%d] is tranlated to error code : [0x%x]\n",
3115 g_quark_to_string (error->domain), error->message, error->code, msg.param.code);
3118 /* Check whether send this error to application */
3119 if (msg.param.code == MM_ERROR_CAMCORDER_GST_FLOW_ERROR) {
3120 _mmcam_dbg_log("We got the error. But skip it.");
3124 /* post error to application */
3125 sc->error_occurs = TRUE;
3126 msg.id = MM_MESSAGE_CAMCORDER_ERROR;
3127 _mmcamcroder_send_message(handle, &msg);
3133 static gint __mmcamcorder_gst_handle_core_error(MMHandleType handle, int code, GstMessage *message)
3135 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3136 _MMCamcorderSubContext *sc = NULL;
3137 GstElement *element = NULL;
3141 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3143 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3144 mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3146 /* Specific plugin - video encoder plugin */
3147 element = GST_ELEMENT_CAST(sc->element[_MMCAMCORDER_ENCSINK_VENC].gst);
3149 if (GST_ELEMENT_CAST(message->src) == element) {
3150 if (code == GST_CORE_ERROR_NEGOTIATION) {
3151 return MM_ERROR_CAMCORDER_GST_NEGOTIATION;
3153 return MM_ERROR_CAMCORDER_ENCODER;
3160 case GST_CORE_ERROR_STATE_CHANGE:
3161 return MM_ERROR_CAMCORDER_GST_STATECHANGE;
3162 case GST_CORE_ERROR_NEGOTIATION:
3163 return MM_ERROR_CAMCORDER_GST_NEGOTIATION;
3164 case GST_CORE_ERROR_MISSING_PLUGIN:
3165 case GST_CORE_ERROR_SEEK:
3166 case GST_CORE_ERROR_NOT_IMPLEMENTED:
3167 case GST_CORE_ERROR_FAILED:
3168 case GST_CORE_ERROR_TOO_LAZY:
3169 case GST_CORE_ERROR_PAD:
3170 case GST_CORE_ERROR_THREAD:
3171 case GST_CORE_ERROR_EVENT:
3172 case GST_CORE_ERROR_CAPS:
3173 case GST_CORE_ERROR_TAG:
3174 case GST_CORE_ERROR_CLOCK:
3175 case GST_CORE_ERROR_DISABLED:
3177 return MM_ERROR_CAMCORDER_GST_CORE;
3182 static gint __mmcamcorder_gst_handle_library_error(MMHandleType handle, int code, GstMessage *message)
3184 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3185 return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3189 /* Specific plugin - NONE */
3193 case GST_LIBRARY_ERROR_FAILED:
3194 case GST_LIBRARY_ERROR_TOO_LAZY:
3195 case GST_LIBRARY_ERROR_INIT:
3196 case GST_LIBRARY_ERROR_SHUTDOWN:
3197 case GST_LIBRARY_ERROR_SETTINGS:
3198 case GST_LIBRARY_ERROR_ENCODE:
3200 _mmcam_dbg_err("Library error(%d)", code);
3201 return MM_ERROR_CAMCORDER_GST_LIBRARY;
3206 static gint __mmcamcorder_gst_handle_resource_error(MMHandleType handle, int code, GstMessage *message)
3208 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3209 _MMCamcorderSubContext *sc = NULL;
3210 GstElement *element =NULL;
3212 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3214 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3215 mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3219 /* Specific plugin */
3221 element = GST_ELEMENT_CAST(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
3222 if (GST_ELEMENT_CAST(message->src) == element) {
3224 case GST_RESOURCE_ERROR_BUSY:
3225 _mmcam_dbg_err("Video device [busy]");
3226 return MM_ERROR_CAMCORDER_DEVICE_BUSY;
3227 case GST_RESOURCE_ERROR_FAILED:
3228 _mmcam_dbg_err("Video device [working failed].");
3229 return MM_ERROR_CAMCORDER_DEVICE_IO;
3230 case GST_RESOURCE_ERROR_TOO_LAZY:
3231 _mmcam_dbg_err("Video device [timeout]");
3232 return MM_ERROR_CAMCORDER_DEVICE_TIMEOUT;
3233 case GST_RESOURCE_ERROR_OPEN_READ:
3234 _mmcam_dbg_err("Video device [open failed]");
3235 return MM_ERROR_CAMCORDER_DEVICE_OPEN;
3236 case GST_RESOURCE_ERROR_SETTINGS:
3237 _mmcam_dbg_err("Video device [Not supported]");
3238 return MM_ERROR_CAMCORDER_NOT_SUPPORTED;
3239 case GST_RESOURCE_ERROR_NOT_FOUND:
3240 _mmcam_dbg_err("Video device [Register trouble]");
3241 return MM_ERROR_CAMCORDER_DEVICE_REG_TROUBLE;
3243 _mmcam_dbg_err("Video device [General(%d)]", code);
3244 return MM_ERROR_CAMCORDER_DEVICE;
3249 element = GST_ELEMENT_CAST(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst);
3250 if (GST_ELEMENT_CAST(message->src) == element) {
3251 if (code == GST_RESOURCE_ERROR_WRITE) {
3252 _mmcam_dbg_err("Display device [Off]");
3253 return MM_ERROR_CAMCORDER_DISPLAY_DEVICE_OFF;
3255 _mmcam_dbg_err("Display device [General(%d)]", code);
3260 element = GST_ELEMENT_CAST(sc->element[_MMCAMCORDER_ENCSINK_VENC].gst);
3261 if (GST_ELEMENT_CAST(message->src) == element) {
3262 if (code == GST_RESOURCE_ERROR_FAILED) {
3263 _mmcam_dbg_err("Encoder [Resource error]");
3264 return MM_ERROR_CAMCORDER_ENCODER_BUFFER;
3266 _mmcam_dbg_err("Encoder [General(%d)]", code);
3267 return MM_ERROR_CAMCORDER_ENCODER;
3273 case GST_RESOURCE_ERROR_WRITE:
3274 _mmcam_dbg_err("File write error");
3275 return MM_ERROR_FILE_WRITE;
3276 case GST_RESOURCE_ERROR_NO_SPACE_LEFT:
3277 _mmcam_dbg_err("No left space");
3278 return MM_MESSAGE_CAMCORDER_NO_FREE_SPACE;
3279 case GST_RESOURCE_ERROR_OPEN_WRITE:
3280 _mmcam_dbg_err("Out of storage");
3281 return MM_ERROR_OUT_OF_STORAGE;
3282 case GST_RESOURCE_ERROR_SEEK:
3283 _mmcam_dbg_err("File read(seek)");
3284 return MM_ERROR_FILE_READ;
3285 case GST_RESOURCE_ERROR_NOT_FOUND:
3286 case GST_RESOURCE_ERROR_FAILED:
3287 case GST_RESOURCE_ERROR_TOO_LAZY:
3288 case GST_RESOURCE_ERROR_BUSY:
3289 case GST_RESOURCE_ERROR_OPEN_READ:
3290 case GST_RESOURCE_ERROR_OPEN_READ_WRITE:
3291 case GST_RESOURCE_ERROR_CLOSE:
3292 case GST_RESOURCE_ERROR_READ:
3293 case GST_RESOURCE_ERROR_SYNC:
3294 case GST_RESOURCE_ERROR_SETTINGS:
3296 _mmcam_dbg_err("Resource error(%d)", code);
3297 return MM_ERROR_CAMCORDER_GST_RESOURCE;
3302 static gint __mmcamcorder_gst_handle_stream_error(MMHandleType handle, int code, GstMessage *message)
3304 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3305 _MMCamcorderSubContext *sc = NULL;
3306 GstElement *element =NULL;
3308 mmf_return_val_if_fail( hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED );
3310 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3311 mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3315 /* Specific plugin */
3317 element = GST_ELEMENT_CAST(sc->element[_MMCAMCORDER_ENCSINK_VENC].gst);
3318 if (GST_ELEMENT_CAST(message->src) == element) {
3320 case GST_STREAM_ERROR_WRONG_TYPE:
3321 _mmcam_dbg_err("Video encoder [wrong stream type]");
3322 return MM_ERROR_CAMCORDER_ENCODER_WRONG_TYPE;
3323 case GST_STREAM_ERROR_ENCODE:
3324 _mmcam_dbg_err("Video encoder [encode error]");
3325 return MM_ERROR_CAMCORDER_ENCODER_WORKING;
3326 case GST_STREAM_ERROR_FAILED:
3327 _mmcam_dbg_err("Video encoder [stream failed]");
3328 return MM_ERROR_CAMCORDER_ENCODER_WORKING;
3330 _mmcam_dbg_err("Video encoder [General(%d)]", code);
3331 return MM_ERROR_CAMCORDER_ENCODER;
3335 /* General plugin */
3337 case GST_STREAM_ERROR_FORMAT:
3338 _mmcam_dbg_err("General [negotiation error(%d)]", code);
3339 return MM_ERROR_CAMCORDER_GST_NEGOTIATION;
3340 case GST_STREAM_ERROR_FAILED:
3341 _mmcam_dbg_err("General [flow error(%d)]", code);
3342 return MM_ERROR_CAMCORDER_GST_FLOW_ERROR;
3343 case GST_STREAM_ERROR_TYPE_NOT_FOUND:
3344 case GST_STREAM_ERROR_DECODE:
3345 case GST_STREAM_ERROR_CODEC_NOT_FOUND:
3346 case GST_STREAM_ERROR_NOT_IMPLEMENTED:
3347 case GST_STREAM_ERROR_TOO_LAZY:
3348 case GST_STREAM_ERROR_ENCODE:
3349 case GST_STREAM_ERROR_DEMUX:
3350 case GST_STREAM_ERROR_MUX:
3351 case GST_STREAM_ERROR_DECRYPT:
3352 case GST_STREAM_ERROR_DECRYPT_NOKEY:
3353 case GST_STREAM_ERROR_WRONG_TYPE:
3355 _mmcam_dbg_err("General [error(%d)]", code);
3356 return MM_ERROR_CAMCORDER_GST_STREAM;
3361 static gboolean __mmcamcorder_handle_gst_warning (MMHandleType handle, GstMessage *message, GError *error)
3363 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3364 gchar *debug = NULL;
3367 return_val_if_fail(hcamcorder, FALSE);
3368 return_val_if_fail(error, FALSE);
3372 gst_message_parse_warning(message, &err, &debug);
3374 if (error->domain == GST_CORE_ERROR) {
3375 _mmcam_dbg_warn("GST warning: GST_CORE domain");
3376 } else if (error->domain == GST_LIBRARY_ERROR) {
3377 _mmcam_dbg_warn("GST warning: GST_LIBRARY domain");
3378 } else if (error->domain == GST_RESOURCE_ERROR) {
3379 _mmcam_dbg_warn("GST warning: GST_RESOURCE domain");
3380 __mmcamcorder_gst_handle_resource_warning(handle, message, error);
3381 } else if (error->domain == GST_STREAM_ERROR ) {
3382 _mmcam_dbg_warn("GST warning: GST_STREAM domain");
3384 _mmcam_dbg_warn("This error domain(%d) is not defined.", error->domain);
3391 if (debug != NULL) {
3392 _mmcam_dbg_err ("Debug: %s", debug);
3401 static gint __mmcamcorder_gst_handle_resource_warning(MMHandleType handle, GstMessage *message , GError *error)
3403 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3404 _MMCamcorderSubContext *sc = NULL;
3405 GstElement *element =NULL;
3406 gchar *msg_src_element;
3408 mmf_return_val_if_fail( hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED );
3410 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3411 mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3415 /* Special message handling */
3417 element = GST_ELEMENT_CAST(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
3418 if (GST_ELEMENT_CAST(message->src) == element) {
3419 if (error->code == GST_RESOURCE_ERROR_FAILED) {
3420 msg_src_element = GST_ELEMENT_NAME(GST_ELEMENT_CAST(message->src));
3421 _mmcam_dbg_warn("-Msg src:[%s] Domain:[%s] Error:[%s]",
3422 msg_src_element, g_quark_to_string(error->domain), error->message);
3423 return MM_ERROR_NONE;
3427 /* General plugin */
3428 switch (error->code) {
3429 case GST_RESOURCE_ERROR_WRITE:
3430 case GST_RESOURCE_ERROR_NO_SPACE_LEFT:
3431 case GST_RESOURCE_ERROR_SEEK:
3432 case GST_RESOURCE_ERROR_NOT_FOUND:
3433 case GST_RESOURCE_ERROR_FAILED:
3434 case GST_RESOURCE_ERROR_TOO_LAZY:
3435 case GST_RESOURCE_ERROR_BUSY:
3436 case GST_RESOURCE_ERROR_OPEN_READ:
3437 case GST_RESOURCE_ERROR_OPEN_WRITE:
3438 case GST_RESOURCE_ERROR_OPEN_READ_WRITE:
3439 case GST_RESOURCE_ERROR_CLOSE:
3440 case GST_RESOURCE_ERROR_READ:
3441 case GST_RESOURCE_ERROR_SYNC:
3442 case GST_RESOURCE_ERROR_SETTINGS:
3444 _mmcam_dbg_warn("General GST warning(%d)", error->code);
3448 return MM_ERROR_NONE;