[Release version 0.10.48] Change some global function/variable names to avoid invalid...
[platform/core/multimedia/libmm-camcorder.git] / src / mm_camcorder_stillshot.c
index fb5fb8c..fe750c9 100644 (file)
@@ -223,12 +223,20 @@ 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 */
        }
 
@@ -308,8 +316,7 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
                                    NULL);
        if (err_name) {
                _mmcam_dbg_warn("get_attributes err %s, ret 0x%x", err_name, ret);
-               free(err_name);
-               err_name = NULL;
+               SAFE_FREE(err_name);
        }
 
        ret = MM_ERROR_NONE;
@@ -327,11 +334,7 @@ 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)",
@@ -372,8 +375,7 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
                /* Check encoding method */
                if (cap_format == MM_PIXEL_FORMAT_ENCODED) {
                        if ((sc->SensorEncodedCapture && info->type == _MMCamcorder_SINGLE_SHOT) ||
-                           (sc->SensorEncodedCapture && sc->info_video->support_dual_stream) ||
-                           is_modified_size) {
+                           hcamcorder->support_zsl_capture || is_modified_size) {
                                cap_fourcc = _mmcamcorder_get_fourcc(cap_format, image_encoder, hcamcorder->use_zero_copy_format);
                                _mmcam_dbg_log("Sensor JPEG Capture [is_modified_size:%d]", is_modified_size);
                        } else {
@@ -459,8 +461,7 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
                                                    NULL);
                        if (err_name) {
                                _mmcam_dbg_warn("get_attributes err %s", err_name);
-                               free(err_name);
-                               err_name = NULL;
+                               SAFE_FREE(err_name);
                        }
 
                        /* set new caps */
@@ -498,8 +499,7 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
                                                  NULL);
                if (err_name) {
                        _mmcam_dbg_warn("get_attributes err %s, ret 0x%x", err_name, ret);
-                       free(err_name);
-                       err_name = NULL;
+                       SAFE_FREE(err_name);
                }
 
                /* set JPEG quality */
@@ -531,7 +531,7 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
                if (current_state < MM_CAMCORDER_STATE_RECORDING &&
                    hcamcorder->support_zsl_capture == TRUE &&
                    !info->hdr_capture_mode) {
-                       _mmcamcorder_sound_solo_play((MMHandleType)hcamcorder, _MMCAMCORDER_FILEPATH_CAPTURE_SND, FALSE);
+                       _mmcamcorder_sound_solo_play((MMHandleType)hcamcorder, _MMCAMCORDER_SAMPLE_SOUND_NAME_CAPTURE01, FALSE);
                }
 
                /* set flag */
@@ -713,6 +713,10 @@ int _mmcamcorder_image_cmd_preview_start(MMHandleType handle)
                                                            MMCAM_CAMERA_FPS, &fps,
                                                            MMCAM_CAMERA_ROTATION, &rotation,
                                                            NULL);
+                               if (err_name) {
+                                       _mmcam_dbg_warn("get_attributes err %s, ret 0x%x", err_name, ret);
+                                       SAFE_FREE(err_name);
+                               }
 
                                /* set new caps */
                                ret = _mmcamcorder_set_videosrc_caps(handle, sc->fourcc, width, height, fps, rotation);
@@ -742,8 +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;
                }
@@ -751,15 +759,15 @@ int _mmcamcorder_image_cmd_preview_start(MMHandleType handle)
                /* get sound status/volume level and register changed_cb */
                if (hcamcorder->shutter_sound_policy == VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY_OFF &&
                    info->sound_status == _SOUND_STATUS_INIT) {
-                       _mmcam_dbg_log("get sound status/volume level and register vconf changed_cb");
+                       _mmcam_dbg_log("register vconf changed_cb and get sound status");
+
+                       /* register changed_cb */
+                       vconf_notify_key_changed(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, __sound_status_changed_cb, hcamcorder);
 
                        /* get sound status */
                        vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &(info->sound_status));
 
                        _mmcam_dbg_log("sound status %d", info->sound_status);
-
-                       /* register changed_cb */
-                       vconf_notify_key_changed(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, __sound_status_changed_cb, hcamcorder);
                }
        }
 
@@ -823,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);
 
@@ -836,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;
        }
@@ -917,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);
 
@@ -944,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",
@@ -1024,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;
@@ -1039,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;
 
@@ -1060,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) {
@@ -1182,14 +1186,28 @@ static void __mmcamcorder_image_capture_cb(GstElement *element, GstSample *sampl
                /* play capture sound here if multi capture
                   or preview format is ITLV(because of AF and flash control in plugin) */
                if (info->type == _MMCamcorder_MULTI_SHOT) {
-                       pthread_mutex_lock(&(hcamcorder->task_thread_lock));
+                       g_mutex_lock(&hcamcorder->task_thread_lock);
                        _mmcam_dbg_log("send signal for sound play");
                        hcamcorder->task_thread_state = _MMCAMCORDER_TASK_THREAD_STATE_SOUND_PLAY_START;
-                       pthread_cond_signal(&(hcamcorder->task_thread_cond));
-                       pthread_mutex_unlock(&(hcamcorder->task_thread_lock));
+                       g_cond_signal(&hcamcorder->task_thread_cond);
+                       g_mutex_unlock(&hcamcorder->task_thread_lock);
                } else if (!info->played_capture_sound) {
-                       _mmcamcorder_sound_solo_play((MMHandleType)hcamcorder, _MMCAMCORDER_FILEPATH_CAPTURE_SND, FALSE);
+                       _mmcamcorder_sound_solo_play((MMHandleType)hcamcorder, _MMCAMCORDER_SAMPLE_SOUND_NAME_CAPTURE01, FALSE);
                }
+       } else {
+               /* Handle capture in recording case */
+               hcamcorder->capture_in_recording = FALSE;
+
+               g_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");
+                       g_cond_signal(&hcamcorder->task_thread_cond);
+               } else {
+                       _mmcam_dbg_warn("unexpected task thread state : %d", hcamcorder->task_thread_state);
+               }
+
+               g_mutex_unlock(&hcamcorder->task_thread_lock);
        }
 
        /* init capture data */
@@ -1297,14 +1315,6 @@ static void __mmcamcorder_image_capture_cb(GstElement *element, GstSample *sampl
                                                thumb.data = malloc(ed->size);
                                                memcpy(thumb.data,ed->data,ed->size);
                                                thumb.length = ed->size;
-                                               #if 0
-                                               {
-                                                   FILE *fp = NULL;
-                                                   fp = fopen ("/opt/usr/media/thumbnail_test.jpg", "a+");
-                                                   fwrite (thumb.data, 1, thumb.length, fp);
-                                                   fclose (fp);
-                                               }
-                                               #endif
                                                thumb.format = MM_PIXEL_FORMAT_ENCODED;
                                                thumb.width = atoi(width);
                                                thumb.height = atoi(height);
@@ -1357,14 +1367,14 @@ static void __mmcamcorder_image_capture_cb(GstElement *element, GstSample *sampl
                                     encode_src.width % thumb_width == 0 &&
                                     encode_src.height % thumb_height == 0) {
                                        if (!_mmcamcorder_downscale_UYVYorYUYV(encode_src.data, encode_src.width, encode_src.height,
-                                                                             &thumb_raw_data, thumb_width, thumb_height)) {
+                                               &thumb_raw_data, thumb_width, thumb_height)) {
                                                thumb_raw_data = NULL;
                                                _mmcam_dbg_warn("_mmcamcorder_downscale_UYVYorYUYV failed. skip thumbnail making...");
                                        }
                                } else {
                                        if (!_mmcamcorder_resize_frame(encode_src.data, encode_src.width, encode_src.height,
-                                                                          encode_src.length, encode_src.format,
-                                                                          &thumb_raw_data, &thumb_width, &thumb_height, &thumb_length)) {
+                                               encode_src.length, encode_src.format,
+                                               &thumb_raw_data, &thumb_width, &thumb_height, &thumb_length)) {
                                                thumb_raw_data = NULL;
                                                _mmcam_dbg_warn("_mmcamcorder_resize_frame failed. skip thumbnail making...");
                                        }
@@ -1381,8 +1391,8 @@ 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);
+                                       encode_src.format, thumb_length, THUMBNAIL_JPEG_QUALITY,
+                                       (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);
@@ -1419,8 +1429,8 @@ static void __mmcamcorder_image_capture_cb(GstElement *element, GstSample *sampl
                _mmcam_dbg_log("Start Internal Encode - capture_quality %d", capture_quality);
 
                ret = _mmcamcorder_encode_jpeg(mapinfo1.data, dest.width, dest.height,
-                                              pixtype_main, dest.length, capture_quality,
-                                              (void **)&internal_main_data, &internal_main_length);
+                       pixtype_main, dest.length, capture_quality,
+                       (void **)&internal_main_data, &internal_main_length);
                if (!ret) {
                        _mmcam_dbg_err("_mmcamcorder_encode_jpeg failed");
 
@@ -1503,7 +1513,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);
@@ -1557,7 +1567,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:
@@ -1627,11 +1637,6 @@ error:
                }
        }
 
-       /* Handle capture in recording case */
-       if (hcamcorder->capture_in_recording) {
-               hcamcorder->capture_in_recording = FALSE;
-       }
-
        _mmcam_dbg_err("END");
 
        return;
@@ -2086,8 +2091,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;
        }
 
@@ -2202,16 +2207,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");