Update valid range for encoded preview format related attributes
[platform/core/multimedia/libmm-camcorder.git] / src / mm_camcorder_videorec.c
index 6a0230e..cb4c3f1 100644 (file)
@@ -217,6 +217,12 @@ int _mmcamcorder_create_recorder_pipeline(MMHandleType handle)
                &RecordsinkElement);
        _mmcamcorder_conf_get_value_element_name(RecordsinkElement, &gst_element_rsink_name);
 
+       if (!gst_element_rsink_name) {
+               _mmcam_dbg_err("failed to get recordsink name");
+               err = MM_ERROR_CAMCORDER_INTERNAL;
+               goto pipeline_creation_error;
+       }
+
        /* set data probe function */
 
        /* register message cb */
@@ -351,10 +357,9 @@ int _mmcamcorder_remove_encode_pipeline(MMHandleType handle)
        GstPad *reqpad = NULL;
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        _MMCamcorderSubContext *sc = NULL;
-#ifdef _MMCAMCORDER_MURPHY_SUPPORT
+#ifdef _MMCAMCORDER_MM_RM_SUPPORT
        int ret = MM_ERROR_NONE;
-       MMCamcorderResourceManager *resource_manager = NULL;
-#endif /* _MMCAMCORDER_MURPHY_SUPPORT */
+#endif /* _MMCAMCORDER_MM_RM_SUPPORT */
 
        mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
@@ -396,31 +401,29 @@ int _mmcamcorder_remove_encode_pipeline(MMHandleType handle)
 
                _mmcam_dbg_warn("Encoder pipeline removed");
 
-#ifdef _MMCAMCORDER_MURPHY_SUPPORT
-               resource_manager = &hcamcorder->resource_manager_sub;
-
-               _mmcam_dbg_warn("lock resource - cb calling %d", resource_manager->is_release_cb_calling);
-
+#ifdef _MMCAMCORDER_MM_RM_SUPPORT
                _MMCAMCORDER_LOCK_RESOURCE(hcamcorder);
 
-               if (resource_manager->is_release_cb_calling == FALSE) {
+               _mmcam_dbg_warn("lock resource - cb calling %d", hcamcorder->is_release_cb_calling);
+
+               if (hcamcorder->is_release_cb_calling == FALSE) {
                        /* release resource */
-                       ret = _mmcamcorder_resource_manager_release(resource_manager);
+                       ret = mm_resource_manager_mark_for_release(hcamcorder->resource_manager,
+                                       hcamcorder->video_encoder_resource);
+                       if (ret == MM_RESOURCE_MANAGER_ERROR_NONE)
+                               hcamcorder->video_encoder_resource = NULL;
 
-                       _mmcam_dbg_warn("release resource 0x%x", ret);
+                       _mmcam_dbg_warn("mark resource for release 0x%x", ret);
 
-                       if (resource_manager->acquire_remain < resource_manager->acquire_count) {
-                               /* wait for resource release */
-                               gint64 end_time = g_get_monotonic_time() + (__MMCAMCORDER_RESOURCE_WAIT_TIME * G_TIME_SPAN_SECOND);
-                               _mmcam_dbg_log("resource is not released all. wait for signal...");
-                               _MMCAMCORDER_RESOURCE_WAIT_UNTIL(hcamcorder, end_time);
-                       }
+                       ret = mm_resource_manager_commit(hcamcorder->resource_manager);
+
+                       _mmcam_dbg_warn("commit resource release 0x%x", ret);
                }
 
                _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
 
                _mmcam_dbg_warn("unlock resource");
-#endif /* _MMCAMCORDER_MURPHY_SUPPORT */
+#endif /* _MMCAMCORDER_MM_RM_SUPPORT */
        }
 
        return MM_ERROR_NONE;
@@ -545,59 +548,36 @@ int _mmcamcorder_video_command(MMHandleType handle, int command)
                        /* Recording */
                        _mmcam_dbg_log("Record Start - dual stream %d", info->support_dual_stream);
 
-#ifdef _MMCAMCORDER_MURPHY_SUPPORT
-                       /* check connection */
-                       ret = _mmcamcorder_resource_check_connection(&hcamcorder->resource_manager_sub);
-                       if (ret != MM_ERROR_NONE)
-                               goto _ERR_CAMCORDER_VIDEO_COMMAND;
-
-                       /* create resource set */
-                       ret = _mmcamcorder_resource_create_resource_set(&hcamcorder->resource_manager_sub);
-                       if (ret != MM_ERROR_NONE)
-                               goto _ERR_CAMCORDER_VIDEO_COMMAND;
-
-                       hcamcorder->resource_manager_sub.acquire_count = 0;
+#ifdef _MMCAMCORDER_MM_RM_SUPPORT
+                       _MMCAMCORDER_LOCK_RESOURCE(hcamcorder);
 
                        /* prepare resource manager for H/W encoder */
-                       ret = _mmcamcorder_resource_manager_prepare(&hcamcorder->resource_manager_sub, MM_CAMCORDER_RESOURCE_TYPE_VIDEO_ENCODER);
-                       if (ret != MM_ERROR_NONE) {
-                               _mmcam_dbg_err("could not prepare for video_encoder resource");
-                               ret = MM_ERROR_CAMCORDER_INTERNAL;
-                               goto _ERR_CAMCORDER_VIDEO_COMMAND;
+                       if (hcamcorder->video_encoder_resource == NULL) {
+                               ret = mm_resource_manager_mark_for_acquire(hcamcorder->resource_manager,
+                                               MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_ENCODER,
+                                               MM_RESOURCE_MANAGER_RES_VOLUME_FULL,
+                                               &hcamcorder->video_encoder_resource);
+                               if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
+                                       _mmcam_dbg_err("could not prepare for encoder resource");
+                                       ret = MM_ERROR_RESOURCE_INTERNAL;
+                                       _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
+                                       goto _ERR_CAMCORDER_VIDEO_COMMAND;
+                               }
+                       } else {
+                               _mmcam_dbg_log("encoder already acquired");
                        }
 
                        /* acquire resources */
-                       _MMCAMCORDER_LOCK_RESOURCE(hcamcorder);
-
-                       ret = _mmcamcorder_resource_manager_acquire(&hcamcorder->resource_manager_sub);
-                       if (ret != MM_ERROR_NONE) {
+                       ret = mm_resource_manager_commit(hcamcorder->resource_manager);
+                       if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
+                               _mmcam_dbg_err("could not acquire resources");
+                               ret = MM_ERROR_RESOURCE_INTERNAL;
                                _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
-                               _mmcam_dbg_err("could not acquire resource");
                                goto _ERR_CAMCORDER_VIDEO_COMMAND;
                        }
 
-                       if (hcamcorder->resource_manager_sub.acquire_remain > 0) {
-                               gint64 end_time = 0;
-
-                               _mmcam_dbg_warn("wait for resource state change");
-
-                               /* wait for resource state change */
-                               end_time = g_get_monotonic_time() + (__MMCAMCORDER_RESOURCE_WAIT_TIME * G_TIME_SPAN_SECOND);
-
-                               if (_MMCAMCORDER_RESOURCE_WAIT_UNTIL(hcamcorder, end_time)) {
-                                       _mmcam_dbg_warn("signal received");
-                               } else {
-                                       _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
-                                       _mmcam_dbg_err("timeout");
-                                       ret = MM_ERROR_RESOURCE_INTERNAL;
-                                       goto _ERR_CAMCORDER_VIDEO_COMMAND;
-                               }
-                       } else {
-                               _mmcam_dbg_log("already acquired");
-                       }
-
                        _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
-#endif /* _MMCAMCORDER_MURPHY_SUPPORT */
+#endif /* _MMCAMCORDER_MM_RM_SUPPORT */
 
                        /* init record_dual_stream */
                        info->record_dual_stream = FALSE;
@@ -658,7 +638,7 @@ int _mmcamcorder_video_command(MMHandleType handle, int command)
                                        /* MSDOS_SUPER_MAGIC : 0x4d44 */
                                        if (file_system_type == MSDOS_SUPER_MAGIC &&
                                            (info->max_size == 0 || info->max_size > FAT32_FILE_SYSTEM_MAX_SIZE)) {
-                                               _mmcam_dbg_warn("FAT32 and too large max[%"G_GUINT64_FORMAT"], set max as %"G_GUINT64_FORMAT,
+                                               _mmcam_dbg_warn("FAT32 and too large max[%"G_GUINT64_FORMAT"], set max as %lu",
                                                        info->max_size, FAT32_FILE_SYSTEM_MAX_SIZE);
                                                info->max_size = FAT32_FILE_SYSTEM_MAX_SIZE;
                                        } else {
@@ -1228,18 +1208,8 @@ int _mmcamcorder_video_handle_eos(MMHandleType handle)
 
        _mmcam_dbg_err("");
 
-       if (hcamcorder->state_change_by_system != _MMCAMCORDER_STATE_CHANGE_BY_FOCUS) {
-               /* Play record stop sound */
-               _mmcamcorder_sound_solo_play(handle, _MMCAMCORDER_SAMPLE_SOUND_NAME_REC_STOP, FALSE);
-       } else {
-               _mmcam_dbg_warn("Play stop sound through pulseaudio");
-
-               _mmcamcorder_sound_init(handle);
-
-               _mmcamcorder_sound_play((MMHandleType)hcamcorder, _MMCAMCORDER_SAMPLE_SOUND_NAME_REC_STOP, TRUE);
-
-               _mmcamcorder_sound_finalize(handle);
-       }
+       /* Play record stop sound */
+       _mmcamcorder_sound_solo_play(handle, _MMCAMCORDER_SAMPLE_SOUND_NAME_REC_STOP, FALSE);
 
        /* remove blocking part */
        MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", FALSE);
@@ -1321,7 +1291,13 @@ int _mmcamcorder_video_handle_eos(MMHandleType handle)
                info->restart_preview = FALSE;
 
                /* recover preview size */
-               _mmcamcorder_set_camera_resolution(handle, info->preview_width, info->preview_height);
+               if (!_mmcamcorder_set_camera_resolution(handle, info->preview_width, info->preview_height)) {
+                       msg.id = MM_MESSAGE_CAMCORDER_ERROR;
+                       msg.param.code = MM_ERROR_CAMCORDER_INTERNAL;
+                       _mmcamcorder_send_message((MMHandleType)hcamcorder, &msg);
+                       _mmcam_dbg_err("Failed to set camera resolution %dx%d",
+                               info->preview_width, info->preview_height);
+               }
 
                ret = _mmcamcorder_gst_set_state(handle, sc->element[_MMCAMCORDER_MAIN_PIPE].gst, GST_STATE_PLAYING);
                /* Do not return when error is occurred.
@@ -1360,10 +1336,8 @@ int _mmcamcorder_video_handle_eos(MMHandleType handle)
        info->filesize = 0;
        info->b_commiting = FALSE;
 
-       if (hcamcorder->state_change_by_system != _MMCAMCORDER_STATE_CHANGE_BY_FOCUS) {
-               /* check recording stop sound */
-               _mmcamcorder_sound_solo_play_wait(handle);
-       }
+       /* check recording stop sound */
+       _mmcamcorder_sound_solo_play_wait(handle);
 
        _mmcam_dbg_err("_MMCamcorder_CMD_COMMIT : end");
 
@@ -2029,7 +2003,7 @@ static gboolean __mmcamcorder_add_metadata_mp4(MMHandleType handle)
 
                /* add orientation info */
                if (fseeko(f, internal_pos, SEEK_SET) < 0) {
-                       _mmcam_dbg_err("fseek failed : errno %d", errno);
+                       _mmcam_dbg_err("fseeko failed : errno %d", errno);
                        goto fail;
                }
 
@@ -2046,10 +2020,13 @@ static gboolean __mmcamcorder_add_metadata_mp4(MMHandleType handle)
                _mmcam_dbg_log("found [tkhd] tag");
 
                /* seek to start position of composition matrix */
-               fseek(f, _OFFSET_COMPOSITION_MATRIX, SEEK_CUR);
-
-               /* update composition matrix for orientation */
-               _mmcamcorder_update_composition_matrix(f, orientation);
+               if (fseek(f, _OFFSET_COMPOSITION_MATRIX, SEEK_CUR) == 0) {
+                       /* update composition matrix for orientation */
+                       _mmcamcorder_update_composition_matrix(f, orientation);
+               } else {
+                       _mmcam_dbg_err("fseek failed : errno %d", errno);
+                       goto fail;
+               }
        } else {
                _mmcam_dbg_err("No 'moov' container");
                goto fail;