Bug fix - The extra preview callback is not invoked
[platform/core/multimedia/libmm-camcorder.git] / src / mm_camcorder_stillshot.c
index 4eb331f..73fafe5 100644 (file)
@@ -69,7 +69,9 @@ static int __mmcamcorder_capture_mode_init_image_pad(MMHandleType handle);
 static int __mmcamcorder_capture_mode_deinit_encodebin(MMHandleType handle);
 
 static int __mmcamcorder_extra_preview_mode_init_camera_control(mmf_camcorder_t *hcamcorder);
+static int __mmcamcorder_extra_preview_mode_deinit_camera_control(mmf_camcorder_t *hcamcorder);
 static int __mmcamcorder_extra_preview_mode_init_pipeline(MMHandleType handle, MMCamcorderExtraPreviewMode mode);
+static int __mmcamcorder_extra_preview_mode_deinit_pipeline(MMHandleType handle, MMCamcorderExtraPreviewMode mode);
 
 static int __mmcamcorder_set_exif_basic_info(MMHandleType handle, int image_width, int image_height);
 static int __mmcamcorder_update_exif_info(MMHandleType handle, void *imagedata, int imgln);
@@ -306,19 +308,14 @@ static int __mmcamcorder_extra_preview_mode_init_camera_control(mmf_camcorder_t
 
        mmf_return_val_if_fail(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
-       MMCAM_LOG_INFO("connect extra preview stream signal to _MMCAMCORDER_VIDEOSRC_SRC");
-
-       MMCAMCORDER_SIGNAL_CONNECT(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst,
-               _MMCAMCORDER_HANDLER_EXTRA_PREVIEW, "extra-preview-stream-cb",
-               G_CALLBACK(__mmcamcorder_extra_preview_stream_cb),
-               hcamcorder);
-
        control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
        if (!control) {
                MMCAM_LOG_ERROR("no camera control");
                return MM_ERROR_CAMCORDER_NOT_SUPPORTED;
        }
 
+       MMCAM_LOG_INFO("connect extra preview stream signal and enable extra preview");
+
        for (i = 0 ; i < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM ; i++) {
                e_fmt = &hcamcorder->extra_preview.format[i];
 
@@ -347,6 +344,45 @@ static int __mmcamcorder_extra_preview_mode_init_camera_control(mmf_camcorder_t
                }
        }
 
+       MMCAMCORDER_SIGNAL_CONNECT(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst,
+               _MMCAMCORDER_HANDLER_EXTRA_PREVIEW, "extra-preview-stream-cb",
+               G_CALLBACK(__mmcamcorder_extra_preview_stream_cb),
+               hcamcorder);
+
+       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "extra-preview", TRUE);
+
+       MMCAM_LOG_INFO("done");
+
+       return MM_ERROR_NONE;
+}
+
+
+static int __mmcamcorder_extra_preview_mode_deinit_camera_control(mmf_camcorder_t *hcamcorder)
+{
+       _MMCamcorderSubContext *sc = NULL;
+       GstCameraControl *control = NULL;
+
+       mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+
+       sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
+       mmf_return_val_if_fail(sc && sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+
+       mmf_return_val_if_fail(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+
+       control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
+       if (!control) {
+               MMCAM_LOG_ERROR("no camera control");
+               return MM_ERROR_CAMCORDER_NOT_SUPPORTED;
+       }
+
+       MMCAM_LOG_INFO("disable extra preview and disconnect extra preview stream signal");
+
+       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "extra-preview", FALSE);
+
+       _mmcamcorder_disconnect_signal((MMHandleType)hcamcorder, _MMCAMCORDER_HANDLER_EXTRA_PREVIEW);
+
+       MMCAM_LOG_INFO("done");
+
        return MM_ERROR_NONE;
 }
 
@@ -463,13 +499,19 @@ pipeline_creation_error:
 }
 
 
+static int __mmcamcorder_extra_preview_mode_deinit_pipeline(MMHandleType handle, MMCamcorderExtraPreviewMode mode)
+{
+       /* TODO */
+       return MM_ERROR_NONE;
+}
+
+
 int _mmcamcorder_initialize_extra_preview_mode(MMHandleType handle)
 {
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
 
        mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
-       mmf_return_val_if_fail(hcamcorder->extra_preview.is_supported, MM_ERROR_NONE);
-       mmf_return_val_if_fail(hcamcorder->extra_preview.is_enabled, MM_ERROR_NONE);
+       mmf_return_val_if_fail(hcamcorder->extra_preview.is_supported, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
 
        switch (hcamcorder->extra_preview.mode) {
        case MM_CAMCORDER_EXTRA_PREVIEW_MODE_CAMERA_CONTROL:
@@ -484,6 +526,26 @@ int _mmcamcorder_initialize_extra_preview_mode(MMHandleType handle)
 }
 
 
+int _mmcamcorder_deinitialize_extra_preview_mode(MMHandleType handle)
+{
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+
+       mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+       mmf_return_val_if_fail(hcamcorder->extra_preview.is_supported, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
+
+       switch (hcamcorder->extra_preview.mode) {
+       case MM_CAMCORDER_EXTRA_PREVIEW_MODE_CAMERA_CONTROL:
+               return __mmcamcorder_extra_preview_mode_deinit_camera_control(handle);
+       case MM_CAMCORDER_EXTRA_PREVIEW_MODE_PIPELINE_SRCPAD:
+       case MM_CAMCORDER_EXTRA_PREVIEW_MODE_PIPELINE_ELEMENT:
+               return __mmcamcorder_extra_preview_mode_deinit_pipeline(handle, hcamcorder->extra_preview.mode);
+       default:
+               MMCAM_LOG_ERROR("unknown extra preview mode[%d]", hcamcorder->extra_preview.mode);
+               return MM_ERROR_CAMCORDER_INTERNAL;
+       }
+}
+
+
 static int __mmcamcorder_capture_mode_deinit_encodebin(MMHandleType handle)
 {
        int ret = MM_ERROR_NONE;