#include <libexif/exif-utils.h>
#include <libexif/exif-data.h>
+#ifdef _MMCAMCORDER_CAMERA_BOOST_SUPPORT
+#include "mm_camcorder_boost.h"
+#endif /* _MMCAMCORDER_CAMERA_BOOST_SUPPORT */
+
+
/*---------------------------------------------------------------------------------------
| GLOBAL VARIABLE DEFINITIONS for internal |
---------------------------------------------------------------------------------------*/
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);
/* add element and encodesink bin to encode main pipeline */
gst_bin_add_many(GST_BIN(sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst),
sc->encode_element[_MMCAMCORDER_ENCSINK_SRC].gst,
- sc->encode_element[_MMCAMCORDER_ENCSINK_FILT].gst,
+ sc->encode_element[_MMCAMCORDER_ENCSINK_CAPS].gst,
sc->encode_element[_MMCAMCORDER_ENCSINK_BIN].gst,
NULL);
/* Link each element : appsrc - capsfilter - encodesink bin */
srcpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_SRC].gst, "src");
- sinkpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_FILT].gst, "sink");
+ sinkpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_CAPS].gst, "sink");
_MM_GST_PAD_LINK_UNREF(srcpad, sinkpad, err, pipeline_creation_error);
- srcpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_FILT].gst, "src");
+ srcpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_CAPS].gst, "src");
sinkpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_BIN].gst, "image_sink0");
_MM_GST_PAD_LINK_UNREF(srcpad, sinkpad, err, pipeline_creation_error);
return err;
}
- _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSRC_CAP_FILT, "capsfilter", "videosrc_cap_filt", element_list, err);
- _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSRC_CAP_SINK, "fakesink", "videosrc_cap_sink", element_list, err);
+ _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSRC_CAP_CAPS, "capsfilter", "vsrc_c_c", element_list, err);
+ _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSRC_CAP_SINK, "fakesink", "vsrc_c_s", element_list, err);
MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_CAP_SINK].gst, "sync", TRUE);
MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_CAP_SINK].gst, "async", FALSE);
caps_string = NULL;
}
- MMCAMCORDER_G_OBJECT_SET_POINTER(sc->element[_MMCAMCORDER_VIDEOSRC_CAP_FILT].gst, "caps", caps);
+ MMCAMCORDER_G_OBJECT_SET_POINTER(sc->element[_MMCAMCORDER_VIDEOSRC_CAP_CAPS].gst, "caps", caps);
gst_caps_unref(caps);
/* add elements to main pipeline */
/* link elements */
if (!gst_element_link_pads(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "image_%u",
- sc->element[_MMCAMCORDER_VIDEOSRC_CAP_FILT].gst, "sink")) {
+ sc->element[_MMCAMCORDER_VIDEOSRC_CAP_CAPS].gst, "sink")) {
MMCAM_LOG_ERROR("capture pad link failed");
err = MM_ERROR_CAMCORDER_GST_LINK;
goto pipeline_creation_error;
return MM_ERROR_NONE;
pipeline_creation_error:
- _MMCAMCORDER_ELEMENT_REMOVE(sc->element, _MMCAMCORDER_VIDEOSRC_CAP_FILT);
+ _MMCAMCORDER_ELEMENT_REMOVE(sc->element, _MMCAMCORDER_VIDEOSRC_CAP_CAPS);
_MMCAMCORDER_ELEMENT_REMOVE(sc->element, _MMCAMCORDER_VIDEOSRC_CAP_SINK);
if (element_list) {
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;
}
- for (i = 0 ; i < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM ; i++) {
+ MMCAM_LOG_INFO("connect extra preview stream signal and enable extra preview");
+
+ for (i = 0 ; i < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_MAX ; i++) {
e_fmt = &hcamcorder->extra_preview.format[i];
if (e_fmt->need_to_set_format) {
}
}
+ 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;
}
if (mode == MM_CAMCORDER_EXTRA_PREVIEW_MODE_PIPELINE_ELEMENT) {
_mmcamcorder_conf_get_element_and_name(handle,
- CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT, "VideosrcElement",
+ hcamcorder->conf_main, CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT, "VideosrcElement",
&videosrc_element, &videosrc_name);
- _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSRC_EXT_SRC, videosrc_name, "videosrc_ext_src", element_list, err);
+ _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSRC_EXT_SRC, videosrc_name, "vsrc_e_src", element_list, err);
+ MMCAMCORDER_G_OBJECT_SET_POINTER(sc->element[_MMCAMCORDER_VIDEOSRC_EXT_SRC].gst, "hal-name", NULL);
MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_EXT_SRC].gst, "camera-id", hcamcorder->extra_preview.camera_id[0]);
_mmcamcorder_conf_set_value_element_property(sc->element[_MMCAMCORDER_VIDEOSRC_EXT_SRC].gst, videosrc_element);
}
- _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSRC_EXT_FILT, "capsfilter", "videosrc_ext_filt", element_list, err);
- _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSRC_EXT_SINK, "fakesink", "videosrc_ext_sink", element_list, err);
+ _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSRC_EXT_CAPS, "capsfilter", "vsrc_e_c", element_list, err);
+ _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSRC_EXT_SINK, "fakesink", "vsrc_e_sink", element_list, err);
MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_EXT_SINK].gst, "sync", TRUE);
MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_EXT_SINK].gst, "async", FALSE);
goto pipeline_creation_error;
}
- MMCAMCORDER_G_OBJECT_SET_POINTER(sc->element[_MMCAMCORDER_VIDEOSRC_EXT_FILT].gst, "caps", caps);
+ MMCAMCORDER_G_OBJECT_SET_POINTER(sc->element[_MMCAMCORDER_VIDEOSRC_EXT_CAPS].gst, "caps", caps);
gst_caps_unref(caps);
/* add elements to main pipeline */
/* link elements */
if (mode == MM_CAMCORDER_EXTRA_PREVIEW_MODE_PIPELINE_SRCPAD) {
if (!gst_element_link_pads(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "video_%u",
- sc->element[_MMCAMCORDER_VIDEOSRC_EXT_FILT].gst, "sink")) {
+ sc->element[_MMCAMCORDER_VIDEOSRC_EXT_CAPS].gst, "sink")) {
MMCAM_LOG_ERROR("pad for extra preview link failed");
err = MM_ERROR_CAMCORDER_GST_LINK;
goto pipeline_creation_error;
return MM_ERROR_NONE;
pipeline_creation_error:
- _MMCAMCORDER_ELEMENT_REMOVE(sc->element, _MMCAMCORDER_VIDEOSRC_EXT_FILT);
+ _MMCAMCORDER_ELEMENT_REMOVE(sc->element, _MMCAMCORDER_VIDEOSRC_EXT_CAPS);
_MMCAMCORDER_ELEMENT_REMOVE(sc->element, _MMCAMCORDER_VIDEOSRC_EXT_SINK);
if (element_list) {
}
+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:
}
+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;
MMCAM_LOG_INFO("sound status %d", info->sound_status);
}
+
+#ifdef _MMCAMCORDER_CAMERA_BOOST_SUPPORT
+ _mmcamcorder_start_boosting();
+#endif /* _MMCAMCORDER_CAMERA_BOOST_SUPPORT */
}
cmd_error:
break;
case _MMCamcorder_CMD_PREVIEW_STOP:
ret = __mmcamcorder_image_cmd_preview_stop(handle);
+
+#ifdef _MMCAMCORDER_CAMERA_BOOST_SUPPORT
+ _mmcamcorder_stop_boosting();
+#endif /*_MMCAMCORDER_CAMERA_BOOST_SUPPORT */
+
break;
case _MMCamcorder_CMD_RECORD:
case _MMCamcorder_CMD_PAUSE:
memset(&mapinfo, 0x0, sizeof(GstMapInfo));
- gst_buffer_map(gst_sample_get_buffer(sample), &mapinfo, GST_MAP_READ);
+ if (!gst_buffer_map(gst_sample_get_buffer(sample), &mapinfo, GST_MAP_READ)) {
+ MMCAM_LOG_ERROR("map failed : buffer[%p]", gst_sample_get_buffer(sample));
+ goto GET_FAILED;
+ }
+
capture_data->data = mapinfo.data;
capture_data->format = pixtype;
gst_structure_get(structure,
ret = __mmcamcorder_update_exif_info((MMHandleType)hcamcorder, dest.data, dest.length);
}
- if (ret != MM_ERROR_NONE) {
+ if (ret != MM_ERROR_NONE)
MMCAM_LOG_WARNING("Failed set_exif_basic_info [%x], but keep going...", ret);
- ret = MM_ERROR_NONE;
- }
}
/* get attribute item for EXIF data */
/* Set capture count */
count = ++(info->capture_send_count);
+ info->next_shot_time = GST_BUFFER_PTS(gst_sample_get_buffer(sample1)) + (GST_MSECOND * info->interval);
send_captured_message = TRUE;
err_release_exif:
{
mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(u_data);
_MMCamcorderSubContext *sc = NULL;
+ _MMCamcorderImageInfo *info = NULL;
mmf_return_val_if_fail(hcamcorder, FALSE);
+ mmf_return_val_if_fail(buffer, FALSE);
sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
mmf_return_val_if_fail(sc && sc->element, FALSE);
MMCAM_LOG_INFO("");
+ info = sc->info_image;
+
+ if (info->capture_send_count > 0 && info->next_shot_time > GST_BUFFER_PTS(buffer)) {
+ MMCAM_LOG_INFO("next capture time[%"GST_TIME_FORMAT"], but buffer[%"GST_TIME_FORMAT"]",
+ GST_TIME_ARGS(info->next_shot_time), GST_TIME_ARGS(GST_BUFFER_PTS(buffer)));
+ return TRUE;
+ }
+
/* FIXME. How could you get a thumbnail? */
__mmcamcorder_image_capture_cb(fakesink, gst_sample_new(buffer, gst_pad_get_current_caps(pad), NULL, NULL), NULL, NULL, u_data);
- if (sc->encode_element[_MMCAMCORDER_ENCSINK_ENCBIN].gst) {
+ if ((info->capture_send_count == info->count || info->capturing == FALSE) &&
+ sc->encode_element[_MMCAMCORDER_ENCSINK_ENCBIN].gst) {
MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst, "signal-handoffs", FALSE);
MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", TRUE);
sc->info_video->push_encoding_buffer = PUSH_ENCODING_BUFFER_STOP;
mmf_return_val_if_fail(hcamcorder->extra_preview.is_supported, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
mmf_return_val_if_fail(hcamcorder->extra_preview.mode == MM_CAMCORDER_EXTRA_PREVIEW_MODE_PIPELINE_ELEMENT,
MM_ERROR_CAMCORDER_NOT_SUPPORTED);
- mmf_return_val_if_fail(stream_id >= 0 && stream_id < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM,
+ mmf_return_val_if_fail(stream_id >= 0 && stream_id < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_MAX,
MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
mmf_return_val_if_fail(device_type > MM_VIDEO_DEVICE_NONE && device_type < MM_VIDEO_DEVICE_NUM
, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
mmf_return_val_if_fail(hcamcorder->extra_preview.is_supported, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
- mmf_return_val_if_fail(stream_id >= 0 && stream_id < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM,
+ mmf_return_val_if_fail(stream_id >= 0 && stream_id < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_MAX,
MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
mmf_return_val_if_fail(pixel_format > MM_PIXEL_FORMAT_INVALID && pixel_format < MM_PIXEL_FORMAT_NUM,
MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
mmf_return_val_if_fail(hcamcorder->extra_preview.is_supported, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
- mmf_return_val_if_fail(stream_id >= 0 && stream_id < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM,
+ mmf_return_val_if_fail(stream_id >= 0 && stream_id < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_MAX,
MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
mmf_return_val_if_fail(bitrate > 0, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
mmf_return_val_if_fail(hcamcorder->extra_preview.is_supported, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
- mmf_return_val_if_fail(stream_id >= 0 && stream_id < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM,
+ mmf_return_val_if_fail(stream_id >= 0 && stream_id < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_MAX,
MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
mmf_return_val_if_fail(bitrate, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
mmf_return_val_if_fail(hcamcorder->extra_preview.is_supported, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
- mmf_return_val_if_fail(stream_id >= 0 && stream_id < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM,
+ mmf_return_val_if_fail(stream_id >= 0 && stream_id < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_MAX,
MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
mm_camcorder_get_state(handle, ¤t_state);
mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
mmf_return_val_if_fail(hcamcorder->extra_preview.is_supported, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
- mmf_return_val_if_fail(stream_id >= 0 && stream_id < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM,
+ mmf_return_val_if_fail(stream_id >= 0 && stream_id < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_MAX,
MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
mmf_return_val_if_fail(interval, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);