/* connect handoff signal to get capture data */
MMCAMCORDER_SIGNAL_CONNECT(sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst,
_MMCAMCORDER_HANDLER_STILLSHOT, "handoff",
- G_CALLBACK(__mmcamcorder_handoff_callback),
+ G_CALLBACK(__mmcamcorder_handoff_callback_capture),
hcamcorder);
return MM_ERROR_NONE;
/* connect handoff signal to get capture data */
MMCAMCORDER_SIGNAL_CONNECT(sc->element[_MMCAMCORDER_VIDEOSRC_CAP_SINK].gst,
_MMCAMCORDER_HANDLER_STILLSHOT, "handoff",
- G_CALLBACK(__mmcamcorder_handoff_callback),
+ G_CALLBACK(__mmcamcorder_handoff_callback_capture),
hcamcorder);
return MM_ERROR_NONE;
}
-int _mmcamcorder_initialize_extra_preview_stream(MMHandleType handle)
+static int __mmcamcorder_extra_preview_camera_control(mmf_camcorder_t *hcamcorder)
{
int i = 0;
- mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
_MMCamcorderSubContext *sc = NULL;
GstCameraControl *control = NULL;
- _MMCamcorderExtraPreviewStreamFormat *e_fmt = NULL;
+ _MMCamcorderExtraPreviewFormat *e_fmt = NULL;
mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
- sc = MMF_CAMCORDER_SUBCONTEXT(handle);
+ 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);
}
for (i = 0 ; i < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM ; i++) {
- e_fmt = &hcamcorder->extra_preview_format[i];
+ e_fmt = &hcamcorder->extra_preview.format[i];
if (e_fmt->need_to_set_format) {
if (!gst_camera_control_set_extra_preview_stream_format(control,
}
+static int __mmcamcorder_extra_preview_video_pad(mmf_camcorder_t *hcamcorder)
+{
+ int err = MM_ERROR_NONE;
+ int extra_preview_enable = 0;
+ int width = 0;
+ int height = 0;
+ int fps = 0;
+ gchar *caps_string = NULL;
+ GstCaps *caps = NULL;
+ GList *element_list = NULL;
+ _MMCamcorderSubContext *sc = 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);
+
+ err = mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL,
+ MMCAM_EXTRA_PREVIEW_ENABLE, &extra_preview_enable,
+ NULL);
+
+ width = hcamcorder->extra_preview.format[0].width;
+ height = hcamcorder->extra_preview.format[0].height;
+ fps = hcamcorder->extra_preview.format[0].fps;
+
+ if (!extra_preview_enable || width <= 0 || height <= 0 || fps <= 0) {
+ MMCAM_LOG_WARNING("extra preview disabled[enable:%d,res:%dx%d,fps:%d]",
+ extra_preview_enable, width, height, fps);
+ return MM_ERROR_NONE;
+ }
+
+ _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_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);
+ MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_EXT_SINK].gst, "enable-last-sample", FALSE);
+ MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_EXT_SINK].gst, "signal-handoffs", TRUE);
+
+ caps = gst_caps_new_simple("video/x-h264",
+ "width", G_TYPE_INT, width,
+ "height", G_TYPE_INT, height,
+ "framerate", GST_TYPE_FRACTION, fps, 1,
+ NULL);
+ if (!caps) {
+ MMCAM_LOG_ERROR("caps for extra preview failed");
+ err = MM_ERROR_CAMCORDER_GST_LINK;
+ goto pipeline_creation_error;
+ }
+
+ caps_string = gst_caps_to_string(caps);
+ if (caps_string) {
+ MMCAM_LOG_INFO("set caps for capture[%s]", caps_string);
+ g_free(caps_string);
+ caps_string = NULL;
+ }
+
+ MMCAMCORDER_G_OBJECT_SET_POINTER(sc->element[_MMCAMCORDER_VIDEOSRC_EXT_FILT].gst, "caps", caps);
+ gst_caps_unref(caps);
+
+ /* add elements to main pipeline */
+ if (!_mmcamcorder_add_elements_to_bin(GST_BIN(sc->element[_MMCAMCORDER_MAIN_PIPE].gst), element_list)) {
+ MMCAM_LOG_ERROR("element_list add error.");
+ err = MM_ERROR_CAMCORDER_RESOURCE_CREATION;
+ goto pipeline_creation_error;
+ }
+
+ /* link elements */
+ if (!gst_element_link_pads(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "video_%u",
+ sc->element[_MMCAMCORDER_VIDEOSRC_EXT_FILT].gst, "sink")) {
+ MMCAM_LOG_ERROR("pad for extra preview link failed");
+ err = MM_ERROR_CAMCORDER_GST_LINK;
+ goto pipeline_creation_error;
+ }
+
+ if (!_mmcamcorder_link_elements(element_list)) {
+ MMCAM_LOG_ERROR("element link error.");
+ err = MM_ERROR_CAMCORDER_GST_LINK;
+ goto pipeline_creation_error;
+ }
+
+ g_list_free(element_list);
+
+ /* connect handoff signal to get capture data */
+ MMCAMCORDER_SIGNAL_CONNECT(sc->element[_MMCAMCORDER_VIDEOSRC_EXT_SINK].gst,
+ _MMCAMCORDER_HANDLER_STILLSHOT, "handoff",
+ G_CALLBACK(__mmcamcorder_handoff_callback_extra_preview),
+ hcamcorder);
+
+ return MM_ERROR_NONE;
+
+pipeline_creation_error:
+ _MMCAMCORDER_ELEMENT_REMOVE(sc->element, _MMCAMCORDER_VIDEOSRC_EXT_FILT);
+ _MMCAMCORDER_ELEMENT_REMOVE(sc->element, _MMCAMCORDER_VIDEOSRC_EXT_SINK);
+
+ if (element_list) {
+ g_list_free(element_list);
+ element_list = NULL;
+ }
+
+ return err;
+}
+
+
+int _mmcamcorder_initialize_extra_preview(MMHandleType handle)
+{
+ mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+
+ mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+
+ switch (hcamcorder->extra_preview.mode) {
+ case MM_CAMCORDER_EXTRA_PREVIEW_MODE_CAMERA_CONTROL:
+ return __mmcamcorder_extra_preview_camera_control(hcamcorder);
+ case MM_CAMCORDER_EXTRA_PREVIEW_MODE_VIDEO_PAD:
+ return __mmcamcorder_extra_preview_video_pad(hcamcorder);
+ default:
+ MMCAM_LOG_ERROR("unknown extra preview mode[%d]", hcamcorder->extra_preview.mode);
+ return MM_ERROR_CAMCORDER_INTERNAL;
+ }
+}
+
+
int _mmcamcorder_unprepare_capture_mode_encodebin(MMHandleType handle)
{
int ret = MM_ERROR_NONE;
}
-gboolean __mmcamcorder_handoff_callback(GstElement *fakesink, GstBuffer *buffer, GstPad *pad, gpointer u_data)
+gboolean __mmcamcorder_handoff_callback_extra_preview(GstElement *fakesink, GstBuffer *buffer, GstPad *pad, gpointer u_data)
+{
+ mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(u_data);
+ _MMCamcorderSubContext *sc = NULL;
+
+ GstCaps *caps = NULL;
+ GstSample *sample = NULL;
+
+ mmf_return_val_if_fail(hcamcorder, FALSE);
+
+ sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
+ mmf_return_val_if_fail(sc && sc->element, FALSE);
+
+ /* make sample with buffer and caps */
+ caps = gst_pad_get_allowed_caps(pad);
+ mmf_return_val_if_fail(caps, TRUE);
+
+ sample = gst_sample_new(buffer, caps, NULL, NULL);
+ gst_caps_unref(caps);
+ mmf_return_val_if_fail(sample, TRUE);
+
+ _mmcamcorder_invoke_video_stream_cb((MMHandleType)u_data, sample, TRUE, 0);
+
+ gst_sample_unref(sample);
+
+ return TRUE;
+}
+
+
+gboolean __mmcamcorder_handoff_callback_capture(GstElement *fakesink, GstBuffer *buffer, GstPad *pad, gpointer u_data)
{
mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(u_data);
_MMCamcorderSubContext *sc = NULL;
_MMCamcorderSubContext *sc = NULL;
mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
- mmf_return_val_if_fail(hcamcorder->support_extra_preview, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
+ 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,
MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
mmf_return_val_if_fail(pixel_format > MM_PIXEL_FORMAT_INVALID && pixel_format < MM_PIXEL_FORMAT_NUM,
}
} else {
MMCAM_LOG_INFO("It will be set when start preview");
- hcamcorder->extra_preview_format[stream_id].need_to_set_format = TRUE;
+ hcamcorder->extra_preview.format[stream_id].need_to_set_format = TRUE;
}
- hcamcorder->extra_preview_format[stream_id].pixel_format = pixel_format;
- hcamcorder->extra_preview_format[stream_id].width = width;
- hcamcorder->extra_preview_format[stream_id].height = height;
- hcamcorder->extra_preview_format[stream_id].fps = fps;
+ hcamcorder->extra_preview.format[stream_id].pixel_format = pixel_format;
+ hcamcorder->extra_preview.format[stream_id].width = width;
+ hcamcorder->extra_preview.format[stream_id].height = height;
+ hcamcorder->extra_preview.format[stream_id].fps = fps;
return MM_ERROR_NONE;
}
_MMCamcorderSubContext *sc = NULL;
mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
- mmf_return_val_if_fail(hcamcorder->support_extra_preview, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
+ mmf_return_val_if_fail(hcamcorder->extra_preview.is_supported, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
mmf_return_val_if_fail(pixel_format && width && height && fps, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
mm_camcorder_get_state(camcorder, ¤t_state);
*height = _height;
*fps = _fps;
} else {
- *pixel_format = hcamcorder->extra_preview_format[stream_id].pixel_format;
- *width = hcamcorder->extra_preview_format[stream_id].width;
- *height = hcamcorder->extra_preview_format[stream_id].height;
- *fps = hcamcorder->extra_preview_format[stream_id].fps;
+ *pixel_format = hcamcorder->extra_preview.format[stream_id].pixel_format;
+ *width = hcamcorder->extra_preview.format[stream_id].width;
+ *height = hcamcorder->extra_preview.format[stream_id].height;
+ *fps = hcamcorder->extra_preview.format[stream_id].fps;
}
MMCAM_LOG_INFO("get result[fmt:%d(%d),res:%dx%d,fps:%d][state:%d]",
_MMCamcorderSubContext *sc = NULL;
mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
- mmf_return_val_if_fail(hcamcorder->support_extra_preview, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
+ 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,
MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
mmf_return_val_if_fail(bitrate > 0, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
}
} else {
MMCAM_LOG_INFO("It will be set when start preview");
- hcamcorder->extra_preview_format[stream_id].need_to_set_bitrate = TRUE;
+ hcamcorder->extra_preview.format[stream_id].need_to_set_bitrate = TRUE;
}
- hcamcorder->extra_preview_format[stream_id].bitrate = bitrate;
+ hcamcorder->extra_preview.format[stream_id].bitrate = bitrate;
return MM_ERROR_NONE;
}
_MMCamcorderSubContext *sc = NULL;
mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
- mmf_return_val_if_fail(hcamcorder->support_extra_preview, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
+ 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,
MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
mmf_return_val_if_fail(bitrate, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
*bitrate = _bitrate;
} else {
- *bitrate = hcamcorder->extra_preview_format[stream_id].bitrate;
+ *bitrate = hcamcorder->extra_preview.format[stream_id].bitrate;
}
MMCAM_LOG_INFO("get bitrate[%d] for stream[%d][state:%d]",
_MMCamcorderSubContext *sc = NULL;
mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
- mmf_return_val_if_fail(hcamcorder->support_extra_preview, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
+ 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,
MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
}
} else {
MMCAM_LOG_INFO("It will be set when start preview");
- hcamcorder->extra_preview_format[stream_id].need_to_set_gop_interval = TRUE;
+ hcamcorder->extra_preview.format[stream_id].need_to_set_gop_interval = TRUE;
}
- hcamcorder->extra_preview_format[stream_id].gop_interval = interval;
+ hcamcorder->extra_preview.format[stream_id].gop_interval = interval;
return MM_ERROR_NONE;
}
_MMCamcorderSubContext *sc = NULL;
mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
- mmf_return_val_if_fail(hcamcorder->support_extra_preview, MM_ERROR_CAMCORDER_NOT_SUPPORTED);
+ 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,
MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
mmf_return_val_if_fail(interval, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
*interval = _interval;
} else {
- *interval = hcamcorder->extra_preview_format[stream_id].gop_interval;
+ *interval = hcamcorder->extra_preview.format[stream_id].gop_interval;
}
MMCAM_LOG_INFO("get GOP interval[%d] for stream[%d][state:%d]",