Set strobe mode after start preview
[platform/core/multimedia/libmm-camcorder.git] / src / mm_camcorder_attribute.c
index af6ba6e..19c06b3 100644 (file)
@@ -29,7 +29,6 @@
 #include <gst/video/colorbalance.h>
 #include <gst/video/cameracontrol.h>
 #include <gst/video/videooverlay.h>
-#include <gst/wayland/wayland.h>
 
 /*-----------------------------------------------------------------------
 |    MACRO DEFINITIONS:                                                        |
@@ -3390,9 +3389,13 @@ bool _mmcamcorder_commit_image_encoder_quality(MMHandleType handle, int attr_idx
 
 bool _mmcamcorder_commit_target_filename(MMHandleType handle, int attr_idx, const mmf_value_t *value)
 {
-       _MMCamcorderSubContext *sc = NULL;
-       const char *filename = NULL;
+       int ret = MM_ERROR_NONE;
        int size = 0;
+       const char *filename = NULL;
+       _MMCamcorderSubContext *sc = NULL;
+       GstElement *encode_link = NULL;
+       GstElement *encode_sink = NULL;
+       GstElement *encode_pipeline = NULL;
 
        mmf_return_val_if_fail(handle && value, FALSE);
 
@@ -3417,9 +3420,71 @@ bool _mmcamcorder_commit_target_filename(MMHandleType handle, int attr_idx, cons
        }
 
        if (sc->encode_element && sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst) {
-               _mmcam_dbg_log("new file location set.[%s] filesink %p", filename, sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst);
-               MMCAMCORDER_G_OBJECT_SET_POINTER(sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst, "location", filename);
-               _mmcam_dbg_log("new file location set.(%s)", filename);
+               encode_sink = sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst;
+               encode_pipeline = sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst;
+
+               _mmcam_dbg_log("file location set.[%s], current encode sink [%s]",
+                       filename, GST_OBJECT_NAME(gst_element_get_factory(encode_sink)));
+
+               /* check whether it's filesink or not */
+               if (strncmp(GST_OBJECT_NAME(gst_element_get_factory(encode_sink)), "filesink", strlen("filesink"))) {
+                       _mmcam_dbg_log("remove current sink and create filesink");
+
+                       /* remove fakesink and create/add filesink to encode pipeline */
+                       /* set NULL state */
+                       ret = _mmcamcorder_gst_set_state(handle, encode_sink, GST_STATE_NULL);
+                       if (ret != MM_ERROR_NONE) {
+                               _mmcam_dbg_err("failed to set NULL encoder sink");
+                               return FALSE;
+                       }
+
+                       /* remove encode sink - pads will be unlinked automatically in remove function */
+                       if (!gst_bin_remove(GST_BIN(encode_pipeline), encode_sink)) {
+                               _mmcam_dbg_err("failed to remove encode sink from pipeline");
+                               return FALSE;
+                       }
+
+                       _mmcam_dbg_log("remove done");
+
+                       /* create filesink */
+                       encode_sink = gst_element_factory_make("filesink", NULL);
+                       if (!encode_sink) {
+                               _mmcam_dbg_err("filesink creation failed");
+                               return FALSE;
+                       }
+
+                       sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst = encode_sink;
+
+                       /* set release notification callback */
+                       g_object_weak_ref(G_OBJECT(encode_sink), (GWeakNotify)_mmcamcorder_element_release_noti, sc);
+
+                       /* add to pipeline */
+                       if (!gst_bin_add(GST_BIN(encode_pipeline), encode_sink)) {
+                               _mmcam_dbg_err("failed to add filesink to encode pipeline");
+                               gst_object_unref(encode_sink);
+                               return FALSE;
+                       }
+
+                       /* link filesink */
+                       if (sc->encode_element[_MMCAMCORDER_ENCSINK_MUX].gst) {
+                               /* mux element is used */
+                               _mmcam_dbg_log("Link mux to encode_sink");
+                               encode_link = sc->encode_element[_MMCAMCORDER_ENCSINK_MUX].gst;
+                       } else {
+                               /* no mux element */
+                               _mmcam_dbg_log("Link audio encoder to encode_sink");
+                               encode_link = sc->encode_element[_MMCAMCORDER_ENCSINK_AENC].gst;
+                       }
+
+                       if (!_MM_GST_ELEMENT_LINK(encode_link, encode_sink)) {
+                               _mmcam_dbg_err("Link FAILED");
+                               return FALSE;
+                       }
+
+                       _mmcam_dbg_log("Link OK");
+               }
+
+               MMCAMCORDER_G_OBJECT_SET_POINTER(encode_sink, "location", filename);
        } else {
                _mmcam_dbg_log("element is not created yet. [%s] will be set later...", filename);
        }
@@ -4701,7 +4766,6 @@ bool _mmcamcorder_set_attribute_to_camsensor(MMHandleType handle)
                MM_CAM_CAMERA_WDR,
                MM_CAM_FILTER_CONTRAST,
                MM_CAM_FILTER_HUE,
-               MM_CAM_STROBE_MODE,
                MM_CAM_DETECT_MODE
        };
 
@@ -4717,7 +4781,7 @@ bool _mmcamcorder_set_attribute_to_camsensor(MMHandleType handle)
 
        mmf_return_val_if_fail(hcamcorder, FALSE);
 
-       _mmcam_dbg_log("Set all attribute again.");
+       _mmcam_dbg_log("commit some attributes again");
 
        attr = (mmf_attrs_t *)MMF_CAMCORDER_ATTRS(handle);
        if (attr == NULL) {
@@ -4758,6 +4822,45 @@ bool _mmcamcorder_set_attribute_to_camsensor(MMHandleType handle)
 }
 
 
+bool _mmcamcorder_set_attribute_to_camsensor2(MMHandleType handle)
+{
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+       mmf_attrs_t *attr = NULL;
+
+       unsigned int i = 0;
+       int ret = TRUE;
+       int attr_idxs[] = {
+               MM_CAM_STROBE_MODE
+       };
+
+       mmf_return_val_if_fail(hcamcorder, FALSE);
+
+       _mmcam_dbg_log("commit some attribute again[2]");
+
+       attr = (mmf_attrs_t *)MMF_CAMCORDER_ATTRS(handle);
+       if (attr == NULL) {
+               _mmcam_dbg_err("Get attribute handle failed.");
+               return FALSE;
+       } else {
+               _mmcam_dbg_log("attribute count(%d)", attr->count);
+
+               for (i = 0 ; i < ARRAY_SIZE(attr_idxs) ; i++) {
+                       if (__mmcamcorder_attrs_is_supported((MMHandleType)attr, attr_idxs[i]))
+                               mmf_attribute_set_modified(&(attr->items[attr_idxs[i]]));
+               }
+
+               if (mmf_attrs_commit((MMHandleType)attr) == -1)
+                       ret = FALSE;
+               else
+                       ret = TRUE;
+       }
+
+       _mmcam_dbg_log("Done.");
+
+       return ret;
+}
+
+
 int _mmcamcorder_lock_readonly_attributes(MMHandleType handle)
 {
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);