[Release version 0.10.27] Remove unused code and dependency
[platform/core/multimedia/libmm-camcorder.git] / src / mm_camcorder_stillshot.c
index b352337..da9edc3 100644 (file)
@@ -22,6 +22,7 @@
 /*=======================================================================================
 |  INCLUDE FILES                                                                       |
 =======================================================================================*/
+#include <stdlib.h>
 #include <sys/time.h>
 #include <sys/times.h>
 #include <gst/video/cameracontrol.h>
@@ -68,7 +69,6 @@ static void __mmcamcorder_image_capture_cb(GstElement *element, GstSample *sampl
 
 /* sound status changed callback */
 static void __sound_status_changed_cb(keynode_t* node, void *data);
-static void __volume_level_changed_cb(void* user_data);
 
 /*=======================================================================================
 |  FUNCTION DEFINITIONS                                                                        |
@@ -183,7 +183,7 @@ int _mmcamcorder_remove_stillshot_pipeline(MMHandleType handle)
                        return ret;
                }
 
-               _mmcamcorder_remove_all_handlers(handle, _MMCAMCORDER_HANDLER_STILLSHOT);
+               _mmcamcorder_remove_all_handlers(handle, _MMCAMCORDER_HANDLER_STILLSHOT | _MMCAMCORDER_HANDLER_VIDEOREC);
 
                GstPad *reqpad = NULL;
 
@@ -223,13 +223,24 @@ void _mmcamcorder_destroy_video_capture_pipeline(MMHandleType handle)
                MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_QUE].gst, "empty-buffers", TRUE);
                MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", TRUE);
 
+               traceBegin(TTRACE_TAG_CAMERA, "MMCAMCORDER:UNREALIZE:SET_NULL_TO_PIPELINE");
+
                _mmcamcorder_gst_set_state(handle, sc->element[_MMCAMCORDER_MAIN_PIPE].gst, GST_STATE_NULL);
 
+               traceEnd(TTRACE_TAG_CAMERA);
+
                _mmcamcorder_remove_all_handlers(handle, _MMCAMCORDER_HANDLER_CATEGORY_ALL);
 
+               traceBegin(TTRACE_TAG_CAMERA, "MMCAMCORDER:UNREALIZE:UNREF_PIPELINE");
+
                gst_object_unref(sc->element[_MMCAMCORDER_MAIN_PIPE].gst);
+
+               traceEnd(TTRACE_TAG_CAMERA);
+
                /* NULL initialization will be done in _mmcamcorder_element_release_noti */
        }
+
+       return;
 }
 
 
@@ -267,6 +278,11 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
 
        info = sc->info_image;
 
+       if (info->capturing) {
+               _mmcam_dbg_err("already capturing");
+               return MM_ERROR_CAMCORDER_DEVICE_BUSY;
+       }
+
        _mmcamcorder_conf_get_value_int(handle, hcamcorder->conf_main,
                                        CONFIGURE_CATEGORY_MAIN_CAPTURE,
                                        "UseCaptureMode",
@@ -279,11 +295,6 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
 
        _mmcamcorder_conf_get_value_element_name(VideosrcElement, &videosrc_name);
 
-       if (info->capturing) {
-               ret = MM_ERROR_CAMCORDER_DEVICE_BUSY;
-               goto cmd_error;
-       }
-
        /* get current state */
        mm_camcorder_get_state(handle, &current_state);
 
@@ -309,11 +320,13 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
                err_name = NULL;
        }
 
+       ret = MM_ERROR_NONE;
+
        /* check capture count */
        if (info->count < 1) {
                _mmcam_dbg_err("capture count[%d] is invalid", info->count);
                ret = MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
-               goto cmd_error;
+               goto cmd_done;
        } else if (info->count == 1) {
                info->type = _MMCamcorder_SINGLE_SHOT;
        } else {
@@ -322,16 +335,11 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
                info->multi_shot_stop = FALSE;
 
                /* sound init to pause other session */
-#ifdef _MMCAMCORDER_UPLOAD_SAMPLE
-               _mmcamcorder_sound_init(handle, _MMCAMCORDER_FILEPATH_CAPTURE2_SND);
-#else /* _MMCAMCORDER_UPLOAD_SAMPLE */
                _mmcamcorder_sound_init(handle);
-#endif /* _MMCAMCORDER_UPLOAD_SAMPLE */
        }
 
        _mmcam_dbg_log("preview(%dx%d,fmt:%d), capture(%dx%d,fmt:%d), count(%d), hdr mode(%d), interval (%d)",
-                      width, height, info->preview_format,
-                      info->width, info->height, cap_format,
+                      width, height, info->preview_format, info->width, info->height, cap_format,
                       info->count, info->hdr_capture_mode, info->interval);
 
        /* check state */
@@ -340,7 +348,7 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
                    info->hdr_capture_mode != MM_CAMCORDER_HDR_OFF) {
                        _mmcam_dbg_err("does not support multi/HDR capture while recording");
                        ret = MM_ERROR_CAMCORDER_INVALID_STATE;
-                       goto cmd_error;
+                       goto cmd_done;
                }
 
                /* check capture size if ZSL is not supported*/
@@ -395,7 +403,8 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
 
                if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
                        _mmcam_dbg_err("Can't cast Video source into camera control.");
-                       return MM_ERROR_CAMCORDER_NOT_SUPPORTED;
+                       ret = MM_ERROR_CAMCORDER_NOT_SUPPORTED;
+                       goto cmd_done;
                }
 
                control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
@@ -409,7 +418,7 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
                if (current_state >= MM_CAMCORDER_STATE_RECORDING) {
                        _mmcam_dbg_err("could not capture in this target while recording");
                        ret = MM_ERROR_CAMCORDER_INVALID_STATE;
-                       goto cmd_error;
+                       goto cmd_done;
                }
 
                if (UseCaptureMode) {
@@ -438,7 +447,7 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
 
                        if (ret != MM_ERROR_NONE) {
                                _mmcam_dbg_err("failed to set state PAUSED %x", ret);
-                               return ret;
+                               goto cmd_done;
                        }
 
                        if (UseCaptureMode) {
@@ -462,7 +471,8 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
                        ret = _mmcamcorder_set_videosrc_caps(handle, sc->fourcc, set_width, set_height, fps, rotation);
                        if (!ret) {
                                _mmcam_dbg_err("_mmcamcorder_set_videosrc_caps failed");
-                               return MM_ERROR_CAMCORDER_INTERNAL;
+                               ret = MM_ERROR_CAMCORDER_INTERNAL;
+                               goto cmd_done;
                        }
 
                        info->resolution_change = TRUE;
@@ -470,8 +480,8 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
                        /* make pipeline state as PLAYING */
                        ret = _mmcamcorder_gst_set_state(handle, sc->element[_MMCAMCORDER_MAIN_PIPE].gst, GST_STATE_PLAYING);
                        if (ret != MM_ERROR_NONE) {
-                               _mmcam_dbg_err("failed to set state PAUSED %x", ret);
-                               return ret;
+                               _mmcam_dbg_err("failed to set state PLAYING %x", ret);
+                               goto cmd_done;
                        }
 
                        _mmcam_dbg_log("Change to target resolution(%d, %d)", set_width, set_height);
@@ -484,7 +494,7 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
                ret = _mmcamcorder_create_stillshot_pipeline((MMHandleType)hcamcorder);
                if (ret != MM_ERROR_NONE) {
                        _mmcam_dbg_err("failed to create encodesinkbin %x", ret);
-                       return ret;
+                       goto cmd_done;
                }
 
                ret = mm_camcorder_get_attributes(handle, &err_name,
@@ -503,6 +513,9 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
                MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst,"signal-handoffs", TRUE);
                MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", FALSE);
 
+               /* Prepare for the shutter sound when it's the bencbin mode capture */
+               sc->info_video->is_firstframe = TRUE;
+
                /* set push encoding buffer as TRUE */
                sc->info_video->push_encoding_buffer = PUSH_ENCODING_BUFFER_INIT;
 
@@ -510,7 +523,7 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
                ret = _mmcamcorder_gst_set_state(handle, sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst, GST_STATE_PLAYING);
                if (ret != MM_ERROR_NONE) {
                        _mmcam_dbg_err("failed to set state PLAYING %x", ret);
-                       return ret;
+                       goto cmd_done;
                }
        }
 
@@ -532,10 +545,11 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
                info->played_capture_sound = FALSE;
        }
 
-       return ret;
+cmd_done:
+       if (ret != MM_ERROR_NONE) {
+               info->capturing = FALSE;
+       }
 
-cmd_error:
-       info->capturing = FALSE;
        return ret;
 }
 
@@ -732,7 +746,12 @@ int _mmcamcorder_image_cmd_preview_start(MMHandleType handle)
                MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_QUE].gst, "empty-buffers", FALSE);
                MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", FALSE);
 
+               traceBegin(TTRACE_TAG_CAMERA, "MMCAMCORDER:START:SET_PLAYING_TO_PIPELINE");
+
                ret = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_PLAYING);
+
+               traceEnd(TTRACE_TAG_CAMERA);
+
                if (ret != MM_ERROR_NONE) {
                        goto cmd_error;
                }
@@ -747,14 +766,8 @@ int _mmcamcorder_image_cmd_preview_start(MMHandleType handle)
 
                        _mmcam_dbg_log("sound status %d", info->sound_status);
 
-                       /* get volume level */
-                       mm_sound_volume_get_value(VOLUME_TYPE_SYSTEM, &info->volume_level);
-
-                       _mmcam_dbg_log("volume level %d", info->volume_level);
-
                        /* register changed_cb */
                        vconf_notify_key_changed(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, __sound_status_changed_cb, hcamcorder);
-                       mm_sound_volume_add_callback(VOLUME_TYPE_SYSTEM, __volume_level_changed_cb, hcamcorder);
                }
        }
 
@@ -792,14 +805,17 @@ int _mmcamcorder_image_cmd_preview_stop(MMHandleType handle)
 
                /* get camera control */
                control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
+               if (control) {
+                       /* convert MSL to sensor value */
+                       set_strobe = _mmcamcorder_convert_msl_to_sensor(handle, MM_CAM_STROBE_MODE, MM_CAMCORDER_STROBE_MODE_OFF);
 
-               /* convert MSL to sensor value */
-               set_strobe = _mmcamcorder_convert_msl_to_sensor(handle, MM_CAM_STROBE_MODE, MM_CAMCORDER_STROBE_MODE_OFF);
-
-               /* set strobe OFF */
-               gst_camera_control_set_strobe(control, GST_CAMERA_CONTROL_STROBE_MODE, set_strobe);
+                       /* set strobe OFF */
+                       gst_camera_control_set_strobe(control, GST_CAMERA_CONTROL_STROBE_MODE, set_strobe);
 
-               _mmcam_dbg_log("set strobe OFF done - value: %d", set_strobe);
+                       _mmcam_dbg_log("set strobe OFF done - value: %d", set_strobe);
+               } else {
+                       _mmcam_dbg_warn("cast CAMERA_CONTROL failed");
+               }
        }
 
        pipeline = sc->element[_MMCAMCORDER_MAIN_PIPE].gst;
@@ -815,8 +831,12 @@ int _mmcamcorder_image_cmd_preview_stop(MMHandleType handle)
        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_QUE].gst, "empty-buffers", TRUE);
        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", TRUE);
 
+       traceBegin(TTRACE_TAG_CAMERA, "MMCAMCORDER:STOP:SET_READY_TO_PIPELINE");
+
        ret = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_READY);
 
+       traceEnd(TTRACE_TAG_CAMERA);
+
        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", FALSE);
        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_QUE].gst, "empty-buffers", FALSE);
 
@@ -828,7 +848,6 @@ int _mmcamcorder_image_cmd_preview_stop(MMHandleType handle)
                _mmcam_dbg_log("deregister sound status callback");
 
                vconf_ignore_key_changed(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, __sound_status_changed_cb);
-               mm_sound_volume_remove_callback(VOLUME_TYPE_SYSTEM);
 
                sc->info_image->sound_status = _SOUND_STATUS_INIT;
        }
@@ -909,12 +928,11 @@ void __mmcamcorder_init_stillshot_info (MMHandleType handle)
 }
 
 
-int __mmcamcorder_capture_save_exifinfo(MMHandleType handle, MMCamcorderCaptureDataType *original, MMCamcorderCaptureDataType *thumbnail)
+int __mmcamcorder_capture_save_exifinfo(MMHandleType handle, MMCamcorderCaptureDataType *original, MMCamcorderCaptureDataType *thumbnail, int provide_exif)
 {
        int ret = MM_ERROR_NONE;
        unsigned char *data = NULL;
        unsigned int datalen = 0;
-       int provide_exif = FALSE;
        _MMCamcorderSubContext *sc = NULL;
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
 
@@ -936,8 +954,8 @@ int __mmcamcorder_capture_save_exifinfo(MMHandleType handle, MMCamcorderCaptureD
                data = original->data;
                datalen = original->length;
        }
-       MMCAMCORDER_G_OBJECT_GET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "provide-exif", &provide_exif);
-       if(provide_exif == 0){
+
+       if (provide_exif == FALSE) {
                if (thumbnail) {
                        if (thumbnail->data && thumbnail->length > 0) {
                                _mmcam_dbg_log("thumbnail is added!thumbnail->data=%p thumbnail->width=%d ,thumbnail->height=%d",
@@ -975,7 +993,7 @@ int __mmcamcorder_capture_save_exifinfo(MMHandleType handle, MMCamcorderCaptureD
 void __mmcamcorder_get_capture_data_from_buffer(MMCamcorderCaptureDataType *capture_data, int pixtype, GstSample *sample)
 {
        GstCaps *caps = NULL;
-       GstMapInfo mapinfo = GST_MAP_INFO_INIT;
+       GstMapInfo mapinfo;
        const GstStructure *structure;
 
        mmf_return_if_fail(capture_data && sample);
@@ -992,6 +1010,8 @@ void __mmcamcorder_get_capture_data_from_buffer(MMCamcorderCaptureDataType *capt
                goto GET_FAILED;
        }
 
+       memset(&mapinfo, 0x0, sizeof(GstMapInfo));
+
        gst_buffer_map(gst_sample_get_buffer(sample), &mapinfo, GST_MAP_READ);
        capture_data->data = mapinfo.data;
        capture_data->format = pixtype;
@@ -1014,7 +1034,7 @@ GET_FAILED:
 }
 
 
-int __mmcamcorder_set_jpeg_data(MMHandleType handle, MMCamcorderCaptureDataType *dest, MMCamcorderCaptureDataType *thumbnail)
+int __mmcamcorder_set_jpeg_data(MMHandleType handle, MMCamcorderCaptureDataType *dest, MMCamcorderCaptureDataType *thumbnail, int provide_exif)
 {
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        _MMCamcorderSubContext *sc = NULL;
@@ -1029,18 +1049,15 @@ int __mmcamcorder_set_jpeg_data(MMHandleType handle, MMCamcorderCaptureDataType
        /* if tag enable and doesn't provide exif, we make it */
        _mmcam_dbg_log("Add exif information if existed(thumbnail[%p])", thumbnail);
        if (thumbnail && thumbnail->data) {
-               return __mmcamcorder_capture_save_exifinfo(handle, dest, thumbnail);
+               return __mmcamcorder_capture_save_exifinfo(handle, dest, thumbnail, provide_exif);
        } else {
-               return __mmcamcorder_capture_save_exifinfo(handle, dest, NULL);
+               return __mmcamcorder_capture_save_exifinfo(handle, dest, NULL, provide_exif);
        }
 }
 
 
-void __mmcamcorder_release_jpeg_data(MMHandleType handle, MMCamcorderCaptureDataType *dest)
+void __mmcamcorder_release_jpeg_data(MMHandleType handle, MMCamcorderCaptureDataType *dest, int tag_enable, int provide_exif)
 {
-       int tag_enable = 0;
-       int provide_exif = FALSE;
-
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        _MMCamcorderSubContext *sc = NULL;
 
@@ -1050,10 +1067,7 @@ void __mmcamcorder_release_jpeg_data(MMHandleType handle, MMCamcorderCaptureData
        sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
        mmf_return_if_fail(sc);
 
-       _mmcam_dbg_log("");
-
-       mm_camcorder_get_attributes(handle, NULL, MMCAM_TAG_ENABLE, &tag_enable, NULL);
-       MMCAMCORDER_G_OBJECT_GET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "provide-exif", &provide_exif);
+       _mmcam_dbg_log("tag : %d, provide exif : %d", tag_enable, provide_exif);
 
        /* if dest->data is allocated in MSL, release it */
        if (tag_enable && !provide_exif) {
@@ -1101,9 +1115,9 @@ static void __mmcamcorder_image_capture_cb(GstElement *element, GstSample *sampl
        MMCamcorderCaptureDataType thumb = {0,};
        MMCamcorderCaptureDataType scrnail = {0,};
        MMCamcorderCaptureDataType encode_src = {0,};
-       GstMapInfo mapinfo1 = GST_MAP_INFO_INIT;
-       GstMapInfo mapinfo2 = GST_MAP_INFO_INIT;
-       GstMapInfo mapinfo3 = GST_MAP_INFO_INIT;
+       GstMapInfo mapinfo1;
+       GstMapInfo mapinfo2;
+       GstMapInfo mapinfo3;
 
        mmf_attrs_t *attrs = NULL;
        mmf_attribute_t *item_screennail = NULL;
@@ -1116,6 +1130,10 @@ static void __mmcamcorder_image_capture_cb(GstElement *element, GstSample *sampl
 
        info = sc->info_image;
 
+       memset(&mapinfo1, 0x0, sizeof(GstMapInfo));
+       memset(&mapinfo2, 0x0, sizeof(GstMapInfo));
+       memset(&mapinfo3, 0x0, sizeof(GstMapInfo));
+
        /* get current state */
        current_state = _mmcamcorder_get_state((MMHandleType)hcamcorder);
 
@@ -1176,6 +1194,20 @@ static void __mmcamcorder_image_capture_cb(GstElement *element, GstSample *sampl
                } else if (!info->played_capture_sound) {
                        _mmcamcorder_sound_solo_play((MMHandleType)hcamcorder, _MMCAMCORDER_FILEPATH_CAPTURE_SND, FALSE);
                }
+       } else {
+               /* Handle capture in recording case */
+               hcamcorder->capture_in_recording = FALSE;
+
+               pthread_mutex_lock(&(hcamcorder->task_thread_lock));
+
+               if (hcamcorder->task_thread_state == _MMCAMCORDER_TASK_THREAD_STATE_CHECK_CAPTURE_IN_RECORDING) {
+                       _mmcam_dbg_log("send signal for capture in recording");
+                       pthread_cond_signal(&(hcamcorder->task_thread_cond));
+               } else {
+                       _mmcam_dbg_warn("unexpected task thread state : %d", hcamcorder->task_thread_state);
+               }
+
+               pthread_mutex_unlock(&(hcamcorder->task_thread_lock));
        }
 
        /* init capture data */
@@ -1368,7 +1400,7 @@ static void __mmcamcorder_image_capture_cb(GstElement *element, GstSample *sampl
                        if (thumb_raw_data) {
                                ret = _mmcamcorder_encode_jpeg(thumb_raw_data, thumb_width, thumb_height,
                                                               encode_src.format, thumb_length, THUMBNAIL_JPEG_QUALITY,
-                                                              (void **)&internal_thumb_data, &internal_thumb_length, JPEG_ENCODER_SOFTWARE);
+                                                              (void **)&internal_thumb_data, &internal_thumb_length);
                                if (ret) {
                                        _mmcam_dbg_log("encode THUMBNAIL done - data %p, length %d",
                                                       internal_thumb_data, internal_thumb_length);
@@ -1406,7 +1438,7 @@ static void __mmcamcorder_image_capture_cb(GstElement *element, GstSample *sampl
 
                ret = _mmcamcorder_encode_jpeg(mapinfo1.data, dest.width, dest.height,
                                               pixtype_main, dest.length, capture_quality,
-                                              (void **)&internal_main_data, &internal_main_length, JPEG_ENCODER_HARDWARE);
+                                              (void **)&internal_main_data, &internal_main_length);
                if (!ret) {
                        _mmcam_dbg_err("_mmcamcorder_encode_jpeg failed");
 
@@ -1489,7 +1521,7 @@ static void __mmcamcorder_image_capture_cb(GstElement *element, GstSample *sampl
                        case MM_IMAGE_CODEC_JPEG:
                        case MM_IMAGE_CODEC_SRW:
                        case MM_IMAGE_CODEC_JPEG_SRW:
-                               ret = __mmcamcorder_set_jpeg_data((MMHandleType)hcamcorder, &dest, &thumb);
+                               ret = __mmcamcorder_set_jpeg_data((MMHandleType)hcamcorder, &dest, &thumb, provide_exif);
                                if (ret != MM_ERROR_NONE) {
                                        _mmcam_dbg_err("Error on setting extra data to jpeg");
                                        MMCAM_SEND_MESSAGE(hcamcorder, MM_MESSAGE_CAMCORDER_ERROR, ret);
@@ -1543,7 +1575,7 @@ err_release_exif:
 
        /* Release jpeg data */
        if (pixtype_main == MM_PIXEL_FORMAT_ENCODED) {
-               __mmcamcorder_release_jpeg_data((MMHandleType)hcamcorder, &dest);
+               __mmcamcorder_release_jpeg_data((MMHandleType)hcamcorder, &dest, tag_enable, provide_exif);
        }
 
 error:
@@ -1613,11 +1645,6 @@ error:
                }
        }
 
-       /* Handle capture in recording case */
-       if (hcamcorder->capture_in_recording) {
-               hcamcorder->capture_in_recording = FALSE;
-       }
-
        _mmcam_dbg_err("END");
 
        return;
@@ -2010,8 +2037,8 @@ int __mmcamcorder_update_exif_info(MMHandleType handle, void* imagedata, int img
        ed = exif_data_new_from_data(imagedata, imgln);
        //ed = mm_exif_get_exif_from_info(hcamcorder->exif_info);
 
-       if (ed == NULL || ed->ifd == NULL) {
-               _mmcam_dbg_err("get exif data error!!(%p, %p)", ed, (ed ? ed->ifd : NULL));
+       if (ed == NULL) {
+               _mmcam_dbg_err("get exif data error!!");
                return MM_ERROR_INVALID_HANDLE;
        }
 
@@ -2072,8 +2099,8 @@ int __mmcamcorder_set_exif_basic_info(MMHandleType handle, int image_width, int
 
        /* get ExifData from exif info */
        ed = mm_exif_get_exif_from_info(hcamcorder->exif_info);
-       if (ed == NULL || ed->ifd == NULL) {
-               _mmcam_dbg_err("get exif data error!!(%p, %p)", ed, (ed ? ed->ifd : NULL));
+       if (ed == NULL) {
+               _mmcam_dbg_err("get exif data error!!");
                return MM_ERROR_INVALID_HANDLE;
        }
 
@@ -2188,16 +2215,22 @@ int __mmcamcorder_set_exif_basic_info(MMHandleType handle, int image_width, int
 #endif
        /*6. EXIF_TAG_IMAGE_DESCRIPTION */
        mm_camcorder_get_attributes(handle, NULL, MMCAM_TAG_IMAGE_DESCRIPTION, &str_value, &str_val_len, NULL);
-       _mmcam_dbg_log("desctiption [%s]", str_value);
        if (str_value && str_val_len > 0) {
                char *description = strdup(str_value);
-               ret = mm_exif_set_add_entry(ed, EXIF_IFD_0, EXIF_TAG_IMAGE_DESCRIPTION,
-                                           EXIF_FORMAT_ASCII, strlen(description), (const char *)description);
-               free(description);
-               str_value = NULL;
-               str_val_len = 0;
-               if (ret != MM_ERROR_NONE) {
-                       EXIF_SET_ERR(ret, EXIF_TAG_IMAGE_DESCRIPTION);
+
+               _mmcam_dbg_log("desctiption [%s]", str_value);
+
+               if (description) {
+                       ret = mm_exif_set_add_entry(ed, EXIF_IFD_0, EXIF_TAG_IMAGE_DESCRIPTION,
+                                                   EXIF_FORMAT_ASCII, strlen(description), (const char *)description);
+                       free(description);
+                       str_value = NULL;
+                       str_val_len = 0;
+                       if (ret != MM_ERROR_NONE) {
+                               EXIF_SET_ERR(ret, EXIF_TAG_IMAGE_DESCRIPTION);
+                       }
+               } else {
+                       _mmcam_dbg_err("strdup failed for [%s]", str_value);
                }
        } else {
                _mmcam_dbg_warn("failed to get description");
@@ -2821,22 +2854,3 @@ static void __sound_status_changed_cb(keynode_t* node, void *data)
 
        return;
 }
-
-
-static void __volume_level_changed_cb(void *data)
-{
-       mmf_camcorder_t *hcamcorder = (mmf_camcorder_t *)data;
-       _MMCamcorderImageInfo *info = NULL;
-
-       mmf_return_if_fail(hcamcorder && hcamcorder->sub_context && hcamcorder->sub_context->info_image);
-
-       _mmcam_dbg_log("START");
-
-       info = hcamcorder->sub_context->info_image;
-
-       mm_sound_volume_get_value(VOLUME_TYPE_SYSTEM, &info->volume_level);
-
-       _mmcam_dbg_log("DONE : volume level %d", info->volume_level);
-
-       return;
-}