+ if (!hcamcorder) {
+ MMCAM_LOG_ERROR("NULL handle");
+ return MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
+ }
+
+ /* Create mmf_camcorder_t handle and initialize every variable */
+ new_handle = (mmf_camcorder_t *)malloc(sizeof(mmf_camcorder_t));
+ if (!new_handle) {
+ MMCAM_LOG_ERROR("new handle allocation failed");
+ return MM_ERROR_CAMCORDER_LOW_MEMORY;
+ }
+
+ memset(new_handle, 0x00, sizeof(mmf_camcorder_t));
+
+ /* set device type */
+ new_handle->device_type = device_type;
+
+ MMCAM_LOG_WARNING("Device Type : %d", new_handle->device_type);
+
+ new_handle->type = MM_CAMCORDER_MODE_VIDEO_CAPTURE;
+ new_handle->state = MM_CAMCORDER_STATE_NONE;
+ new_handle->old_state = MM_CAMCORDER_STATE_NONE;
+ new_handle->capture_in_recording = FALSE;
+
+ /* init mutex and cond */
+ g_mutex_init(&(new_handle->mtsafe).lock);
+ g_cond_init(&(new_handle->mtsafe).cond);
+ g_mutex_init(&(new_handle->mtsafe).cmd_lock);
+ g_cond_init(&(new_handle->mtsafe).cmd_cond);
+ g_mutex_init(&(new_handle->mtsafe).interrupt_lock);
+ g_mutex_init(&(new_handle->mtsafe).state_lock);
+ g_mutex_init(&(new_handle->mtsafe).gst_state_lock);
+ g_mutex_init(&(new_handle->mtsafe).gst_encode_state_lock);
+ g_mutex_init(&(new_handle->mtsafe).message_cb_lock);
+ g_mutex_init(&(new_handle->mtsafe).vcapture_cb_lock);
+ g_mutex_init(&(new_handle->mtsafe).vstream_cb_lock);
+ g_mutex_init(&(new_handle->mtsafe).astream_cb_lock);
+ g_mutex_init(&(new_handle->mtsafe).mstream_cb_lock);
+ g_mutex_init(&(new_handle->mtsafe).vedecision_cb_lock);
+#ifdef _MMCAMCORDER_MM_RM_SUPPORT
+ g_mutex_init(&(new_handle->mtsafe).resource_lock);
+#endif /* _MMCAMCORDER_MM_RM_SUPPORT */
+
+ g_mutex_init(&new_handle->restart_preview_lock);
+
+ g_mutex_init(&new_handle->snd_info.open_mutex);
+ g_cond_init(&new_handle->snd_info.open_cond);
+ g_mutex_init(&new_handle->snd_info.play_mutex);
+ g_cond_init(&new_handle->snd_info.play_cond);
+
+ g_mutex_init(&new_handle->task_thread_lock);
+ g_cond_init(&new_handle->task_thread_cond);
+ new_handle->task_thread_state = _MMCAMCORDER_TASK_THREAD_STATE_NONE;
+
+ if (device_type != MM_VIDEO_DEVICE_NONE) {
+ new_handle->gdbus_info_sound.mm_handle = new_handle;
+ g_mutex_init(&new_handle->gdbus_info_sound.sync_mutex);
+ g_cond_init(&new_handle->gdbus_info_sound.sync_cond);
+
+ new_handle->gdbus_info_solo_sound.mm_handle = new_handle;
+ g_mutex_init(&new_handle->gdbus_info_solo_sound.sync_mutex);
+ g_cond_init(&new_handle->gdbus_info_solo_sound.sync_cond);
+ }
+
+ /* create task thread */
+ new_handle->task_thread = g_thread_try_new("MMCAM_TASK_THREAD",
+ (GThreadFunc)_mmcamcorder_util_task_thread_func, (gpointer)new_handle, NULL);
+ if (new_handle->task_thread == NULL) {
+ MMCAM_LOG_ERROR("_mmcamcorder_create::failed to create task thread");
+ ret = MM_ERROR_CAMCORDER_RESOURCE_CREATION;
+ goto _INIT_HANDLE_FAILED;
+ }
+
+ /* Get Camera Configure information from Camcorder INI file */
+ ret = _mmcamcorder_conf_get_info((MMHandleType)new_handle, CONFIGURE_TYPE_MAIN, CONFIGURE_MAIN_FILE, &new_handle->conf_main);
+ if (ret != MM_ERROR_NONE) {
+ MMCAM_LOG_ERROR("Failed to get configure(main) info.");
+ goto _INIT_HANDLE_FAILED;
+ }
+
+ /* Get log level from conf */
+ _mmcamcorder_conf_get_value_int((MMHandleType)new_handle, new_handle->conf_main,
+ CONFIGURE_CATEGORY_MAIN_GENERAL,
+ "LogLevel",
+ &log_level);
+
+ _mmcamcorder_set_log_level(log_level);
+
+ /* allocate attribute */
+ new_handle->attributes = _mmcamcorder_alloc_attribute((MMHandleType)new_handle);
+ if (!new_handle->attributes) {
+ ret = MM_ERROR_CAMCORDER_RESOURCE_CREATION;
+ goto _INIT_HANDLE_FAILED;
+ }
+
+ *hcamcorder = new_handle;
+
+ MMCAM_LOG_INFO("new handle %p", new_handle);
+
+ return MM_ERROR_NONE;
+
+_INIT_HANDLE_FAILED:
+ __mmcamcorder_deinit_handle(new_handle);
+ return ret;
+}
+
+
+static void __mmcamcorder_deinit_handle(mmf_camcorder_t *hcamcorder)
+{
+ if (!hcamcorder) {
+ MMCAM_LOG_ERROR("NULL handle");
+ return;
+ }
+
+ /* Remove exif info */
+ if (hcamcorder->exif_info) {
+ mm_exif_destory_exif_info(hcamcorder->exif_info);
+ hcamcorder->exif_info = NULL;
+ }
+
+ /* remove attributes */
+ if (hcamcorder->attributes) {
+ _mmcamcorder_dealloc_attribute((MMHandleType)hcamcorder, hcamcorder->attributes);
+ hcamcorder->attributes = 0;
+ }
+
+ /* Release configure info */
+ __mmcamcorder_deinit_configure(hcamcorder);
+
+ /* remove task thread */
+ if (hcamcorder->task_thread) {
+ g_mutex_lock(&hcamcorder->task_thread_lock);
+ MMCAM_LOG_INFO("send signal for task thread exit");
+ hcamcorder->task_thread_state = _MMCAMCORDER_TASK_THREAD_STATE_EXIT;
+ g_cond_signal(&hcamcorder->task_thread_cond);
+ g_mutex_unlock(&hcamcorder->task_thread_lock);
+ g_thread_join(hcamcorder->task_thread);
+ hcamcorder->task_thread = NULL;
+ }
+
+ /* Release lock, cond */
+ g_mutex_clear(&(hcamcorder->mtsafe).lock);
+ g_cond_clear(&(hcamcorder->mtsafe).cond);
+ g_mutex_clear(&(hcamcorder->mtsafe).cmd_lock);
+ g_cond_clear(&(hcamcorder->mtsafe).cmd_cond);
+ g_mutex_clear(&(hcamcorder->mtsafe).interrupt_lock);
+ g_mutex_clear(&(hcamcorder->mtsafe).state_lock);
+ g_mutex_clear(&(hcamcorder->mtsafe).gst_state_lock);
+ g_mutex_clear(&(hcamcorder->mtsafe).gst_encode_state_lock);
+ g_mutex_clear(&(hcamcorder->mtsafe).message_cb_lock);
+ g_mutex_clear(&(hcamcorder->mtsafe).vcapture_cb_lock);
+ g_mutex_clear(&(hcamcorder->mtsafe).vstream_cb_lock);
+ g_mutex_clear(&(hcamcorder->mtsafe).astream_cb_lock);
+ g_mutex_clear(&(hcamcorder->mtsafe).mstream_cb_lock);
+ g_mutex_clear(&(hcamcorder->mtsafe).vedecision_cb_lock);
+#ifdef _MMCAMCORDER_MM_RM_SUPPORT
+ g_mutex_clear(&(hcamcorder->mtsafe).resource_lock);
+#endif /* _MMCAMCORDER_MM_RM_SUPPORT */
+
+ g_mutex_clear(&hcamcorder->snd_info.open_mutex);
+ g_cond_clear(&hcamcorder->snd_info.open_cond);
+ g_mutex_clear(&hcamcorder->restart_preview_lock);
+
+ if (hcamcorder->device_type != MM_VIDEO_DEVICE_NONE) {
+ g_mutex_clear(&hcamcorder->gdbus_info_sound.sync_mutex);
+ g_cond_clear(&hcamcorder->gdbus_info_sound.sync_cond);
+ g_mutex_clear(&hcamcorder->gdbus_info_solo_sound.sync_mutex);
+ g_cond_clear(&hcamcorder->gdbus_info_solo_sound.sync_cond);
+ }
+
+ g_mutex_clear(&hcamcorder->task_thread_lock);
+ g_cond_clear(&hcamcorder->task_thread_cond);
+
+ if (hcamcorder->model_name)
+ free(hcamcorder->model_name);
+
+ if (hcamcorder->software_version)
+ free(hcamcorder->software_version);
+
+ /* Release handle */
+ memset(hcamcorder, 0x00, sizeof(mmf_camcorder_t));
+
+ free(hcamcorder);
+
+ return;
+}
+
+
+static void __mmcamcorder_get_system_info(mmf_camcorder_t *hcamcorder)
+{
+ int ret = 0;
+
+ if (!hcamcorder) {
+ MMCAM_LOG_ERROR("NULL handle");
+ return;
+ }
+
+ /* get shutter sound policy */
+ vconf_get_int(VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY, &hcamcorder->shutter_sound_policy);
+ MMCAM_LOG_INFO("current shutter sound policy : %d", hcamcorder->shutter_sound_policy);
+
+ /* get model name */
+ ret = system_info_get_platform_string("http://tizen.org/system/model_name", &hcamcorder->model_name);
+
+ MMCAM_LOG_WARNING("model name [%s], ret 0x%x",
+ hcamcorder->model_name ? hcamcorder->model_name : "NULL", ret);
+
+ /* get software version */
+ ret = system_info_get_platform_string("http://tizen.org/system/build.string", &hcamcorder->software_version);
+
+ MMCAM_LOG_WARNING("software version [%s], ret 0x%x",
+ hcamcorder->software_version ? hcamcorder->software_version : "NULL", ret);
+
+ return;
+}
+
+
+static gint __mmcamcorder_init_configure_video_capture(mmf_camcorder_t *hcamcorder)