const char *gst_element_ienc_name = NULL;
const char *gst_element_mux_name = NULL;
const char *gst_element_rsink_name = NULL;
+ const char *gst_element_vscale_name = NULL;
const char *str_profile = NULL;
const char *str_aac = NULL;
const char *str_aar = NULL;
const char *videoconvert_name = NULL;
GstCaps *audio_caps = NULL;
GstCaps *video_caps = NULL;
+ GstCaps *videoscale_caps = NULL;
GstPad *pad = NULL;
GList *element_list = NULL;
type_element *ImageencElement = NULL;
type_element *MuxElement = NULL;
type_element *RecordsinkElement = NULL;
+ type_element *VideoscaleElement = NULL;
mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
/* Create child element */
if (profile != MM_CAMCORDER_ENCBIN_PROFILE_AUDIO) {
GstCaps *caps_from_pad = NULL;
+ char *caps_str = NULL;
/* create appsrc and capsfilter */
_MMCAMCORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMCAMCORDER_ENCSINK_SRC, "appsrc", "encodesink_src", element_list, err);
_MMCAMCORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMCAMCORDER_ENCSINK_FILT, "capsfilter", "encodesink_filter", element_list, err);
- /* release element_list, they will be placed out of encodesink bin */
- if (element_list) {
- g_list_free(element_list);
- element_list = NULL;
- }
-
/* set appsrc as live source */
MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_SRC].gst, "is-live", TRUE);
MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_SRC].gst, "format", 3); /* GST_FORMAT_TIME */
MMCAMCORDER_G_OBJECT_GET(sc->element[_MMCAMCORDER_VIDEOSRC_FILT].gst, "caps", &video_caps);
}
- if (video_caps) {
- char *caps_str = NULL;
+ if (!video_caps) {
+ _mmcam_dbg_err("create recording pipeline caps failed");
+ err = MM_ERROR_CAMCORDER_RESOURCE_CREATION;
+ goto pipeline_creation_error;
+ }
- if (profile == MM_CAMCORDER_ENCBIN_PROFILE_VIDEO) {
+ if (profile == MM_CAMCORDER_ENCBIN_PROFILE_VIDEO) {
+ if (sc->info_video->use_videoscale) {
+ gst_caps_set_simple(video_caps,
+ "width", G_TYPE_INT, sc->info_video->preview_width,
+ "height", G_TYPE_INT, sc->info_video->preview_height,
+ NULL);
+ videoscale_caps = gst_caps_copy(video_caps);
+ } else {
gst_caps_set_simple(video_caps,
"width", G_TYPE_INT, sc->info_video->video_width,
"height", G_TYPE_INT, sc->info_video->video_height,
NULL);
}
+ }
+
+ caps_str = gst_caps_to_string(video_caps);
+
+ _mmcam_dbg_log("encodebin caps [%s]", caps_str);
+
+ g_free(caps_str);
+ caps_str = NULL;
+
+ MMCAMCORDER_G_OBJECT_SET_POINTER(sc->encode_element[_MMCAMCORDER_ENCSINK_FILT].gst, "caps", video_caps);
+
+ gst_caps_unref(video_caps);
+ video_caps = NULL;
+
+ /* video scale */
+ if (profile == MM_CAMCORDER_ENCBIN_PROFILE_VIDEO &&
+ sc->info_video->use_videoscale) {
+ if (!videoscale_caps) {
+ _mmcam_dbg_err("no videoscale caps");
+ err = MM_ERROR_CAMCORDER_RESOURCE_CREATION;
+ goto pipeline_creation_error;
+ }
+
+ gst_caps_set_simple(videoscale_caps,
+ "width", G_TYPE_INT, sc->info_video->video_width,
+ "height", G_TYPE_INT, sc->info_video->video_height,
+ NULL);
+
+ _mmcamcorder_conf_get_element(handle, hcamcorder->conf_main,
+ CONFIGURE_CATEGORY_MAIN_RECORD,
+ "VideoscaleElement",
+ &VideoscaleElement);
+
+ if (!_mmcamcorder_conf_get_value_element_name(VideoscaleElement, &gst_element_vscale_name)) {
+ _mmcam_dbg_err("failed to get videoscale element name");
+ err = MM_ERROR_CAMCORDER_RESOURCE_CREATION;
+ goto pipeline_creation_error;
+ }
+
+ caps_str = gst_caps_to_string(videoscale_caps);
+
+ _mmcam_dbg_log("encodebin videocale [%s][%s]", gst_element_vscale_name, caps_str);
- caps_str = gst_caps_to_string(video_caps);
- _mmcam_dbg_log("encodebin caps [%s]", caps_str);
g_free(caps_str);
caps_str = NULL;
- MMCAMCORDER_G_OBJECT_SET_POINTER(sc->encode_element[_MMCAMCORDER_ENCSINK_FILT].gst, "caps", video_caps);
- gst_caps_unref(video_caps);
- video_caps = NULL;
- } else {
- _mmcam_dbg_err("create recording pipeline caps failed");
- err = MM_ERROR_CAMCORDER_RESOURCE_CREATION;
- goto pipeline_creation_error;
+ _MMCAMCORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMCAMCORDER_ENCSINK_VSCALE, gst_element_vscale_name, "encodesink_vscale", element_list, err);
+ _MMCAMCORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMCAMCORDER_ENCSINK_VSCALE_FILT, "capsfilter", "encodesink_vscale_filter", element_list, err);
+
+ MMCAMCORDER_G_OBJECT_SET_POINTER((sc->encode_element[_MMCAMCORDER_ENCSINK_VSCALE_FILT].gst), "caps", videoscale_caps);
+
+ gst_caps_unref(videoscale_caps);
+ videoscale_caps = NULL;
+ }
+
+ /* release element_list, they will be placed out of encodesink bin */
+ if (element_list) {
+ g_list_free(element_list);
+ element_list = NULL;
}
/* connect signal for ready to push buffer */
goto pipeline_creation_error;
}
- if (element_list) {
+ if (element_list)
g_list_free(element_list);
- element_list = NULL;
- }
_mmcam_dbg_log("done");
_MMCAMCORDER_ELEMENT_REMOVE(sc->encode_element, _MMCAMCORDER_ENCSINK_ENCBIN);
_MMCAMCORDER_ELEMENT_REMOVE(sc->encode_element, _MMCAMCORDER_ENCSINK_SRC);
_MMCAMCORDER_ELEMENT_REMOVE(sc->encode_element, _MMCAMCORDER_ENCSINK_FILT);
+ _MMCAMCORDER_ELEMENT_REMOVE(sc->encode_element, _MMCAMCORDER_ENCSINK_VSCALE);
+ _MMCAMCORDER_ELEMENT_REMOVE(sc->encode_element, _MMCAMCORDER_ENCSINK_VSCALE_FILT);
_MMCAMCORDER_ELEMENT_REMOVE(sc->encode_element, _MMCAMCORDER_ENCSINK_VENC);
_MMCAMCORDER_ELEMENT_REMOVE(sc->encode_element, _MMCAMCORDER_ENCSINK_AENC);
_MMCAMCORDER_ELEMENT_REMOVE(sc->encode_element, _MMCAMCORDER_ENCSINK_IENC);
_MMCAMCORDER_ELEMENT_REMOVE(sc->encode_element, _MMCAMCORDER_ENCSINK_SINK);
_MMCAMCORDER_ELEMENT_REMOVE(sc->encode_element, _MMCAMCORDER_ENCSINK_BIN);
- if (element_list) {
+ if (element_list)
g_list_free(element_list);
- element_list = NULL;
- }
+
+ if (video_caps)
+ gst_caps_unref(video_caps);
+
+ if (videoscale_caps)
+ gst_caps_unref(videoscale_caps);
return err;
}
sc->encode_element[_MMCAMCORDER_AUDIOSRC_BIN].gst);
}
- /* 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_BIN].gst,
- NULL);
+ /* add elements and encodesink bin to encode main pipeline */
+ if (sc->info_video->use_videoscale) {
+ 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_VSCALE].gst,
+ sc->encode_element[_MMCAMCORDER_ENCSINK_VSCALE_FILT].gst,
+ sc->encode_element[_MMCAMCORDER_ENCSINK_BIN].gst,
+ NULL);
+ } else {
+ 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_BIN].gst,
+ NULL);
+ }
/* Link each element : appsrc - capsfilter - encodesink bin */
srcpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_SRC].gst, "src");
_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");
+ if (sc->info_video->use_videoscale) {
+ sinkpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_VSCALE].gst, "sink");
+ _MM_GST_PAD_LINK_UNREF(srcpad, sinkpad, err, pipeline_creation_error);
+
+ srcpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_VSCALE].gst, "src");
+ sinkpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_VSCALE_FILT].gst, "sink");
+ _MM_GST_PAD_LINK_UNREF(srcpad, sinkpad, err, pipeline_creation_error);
+
+ srcpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_VSCALE_FILT].gst, "src");
+ }
sinkpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_BIN].gst, "video_sink0");
_MM_GST_PAD_LINK_UNREF(srcpad, sinkpad, err, pipeline_creation_error);
/* No need to restart preview */
info->restart_preview = FALSE;
+ } else if (info->use_videoscale &&
+ info->preview_width >= info->video_width &&
+ info->preview_height >= info->video_height) {
+ info->restart_preview = FALSE;
} else {
- /* always need to restart preview */
info->restart_preview = TRUE;
+ /* reset use_videoscale */
+ info->use_videoscale = FALSE;
}
/* set recording hint */