int display_surface_type = MM_DISPLAY_SURFACE_NULL;
const char *videosrc_name = NULL;
const char *videosink_name = NULL;
+ const char *videoconvert_name = NULL;
char *err_name = NULL;
char *socket_path = NULL;
int socket_path_len;
+#ifdef _MMCAMCORDER_RM_SUPPORT
+ int decoder_index = 0;
+ char decoder_name[20] = {'\0',};
+#endif /* _MMCAMCORDER_RM_SUPPORT */
GList *element_list = NULL;
if (videodecoder_name) {
_mmcam_dbg_log("video decoder element [%s], recreate decoder %d",
videodecoder_name, hcamcorder->recreate_decoder);
+#ifdef _MMCAMCORDER_RM_SUPPORT
+ if (hcamcorder->request_resources.category_id[0] == RM_CATEGORY_VIDEO_DECODER_SUB)
+ decoder_index = 1;
+ snprintf(decoder_name, sizeof(decoder_name)-1, "%s%d", videodecoder_name, decoder_index);
+ _mmcam_dbg_log("encoded preview decoder_name %s", decoder_name);
+ /* create decoder element */
+ _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSRC_DECODE, decoder_name, "videosrc_decode", element_list, err);
+#else /* _MMCAMCORDER_RM_SUPPORT */
/* create decoder element */
_MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSRC_DECODE, videodecoder_name, "videosrc_decode", element_list, err);
-
+#endif /* _MMCAMCORDER_RM_SUPPORT */
_mmcamcorder_conf_set_value_element_property(sc->element[_MMCAMCORDER_VIDEOSRC_DECODE].gst, sc->VideodecoderElementH264);
} else {
_mmcam_dbg_err("failed to get video decoder element name from %p", sc->VideodecoderElementH264);
if (display_surface_type == MM_DISPLAY_SURFACE_REMOTE) {
_MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSINK_SINK, videosink_name, "ipc_sink", element_list, err);
+ _mmcamcorder_conf_set_value_element_property(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, sc->VideosinkElement);
+
err = mm_camcorder_get_attributes(handle, &err_name,
- MMCAM_DISPLAY_SOCKET_PATH, &socket_path, &socket_path_len,
- NULL);
+ MMCAM_DISPLAY_SOCKET_PATH, &socket_path, &socket_path_len,
+ NULL);
if (err != MM_ERROR_NONE) {
_mmcam_dbg_warn("Get socket path failed 0x%x", err);
SAFE_FREE(err_name);
g_object_set(G_OBJECT(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst), "socket-path", socket_path, NULL);
} else {
+
+ if (hcamcorder->use_videoconvert && !strcmp(videosink_name, "waylandsink")) {
+ /* get video convert name */
+ _mmcamcorder_conf_get_value_element_name(sc->VideoconvertElement, &videoconvert_name);
+
+ if (videoconvert_name) {
+ _mmcam_dbg_log("videoconvert element name : %s", videoconvert_name);
+ _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSINK_CLS, videoconvert_name, "videosink_cls", element_list, err);
+ } else
+ _mmcam_dbg_err("failed to get videoconvert element name");
+ }
+
_MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSINK_SINK, videosink_name, "videosink_sink", element_list, err);
+
+ _mmcamcorder_conf_set_value_element_property(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, sc->VideosinkElement);
+
if (_mmcamcorder_videosink_window_set(handle, sc->VideosinkElement) != MM_ERROR_NONE) {
_mmcam_dbg_err("_mmcamcorder_videosink_window_set error");
err = MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
}
}
- _mmcamcorder_conf_set_value_element_property(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, sc->VideosinkElement);
-
/* Set caps by rotation */
_mmcamcorder_set_videosrc_rotation(handle, camera_rotate);
int zoom_attr = 0;
int zoom_level = 0;
int do_scaling = FALSE;
+#ifdef _MMCAMCORDER_RM_SUPPORT
+ int display_scaler = 0;
+#endif /* _MMCAMCORDER_RM_SUPPORT */
int *overlay = NULL;
gulong xid;
char *err_name = NULL;
_mmcam_dbg_warn("Handle is NULL. Set xid as 0.. but, it's not recommended.");
gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(vsink), 0);
}
+#ifdef _MMCAMCORDER_RM_SUPPORT
+ if (hcamcorder->request_resources.category_id[0] == RM_CATEGORY_VIDEO_DECODER_SUB)
+ display_scaler = 1;
+
+ MMCAMCORDER_G_OBJECT_SET(vsink, "device-scaler", display_scaler);
+#endif /* _MMCAMCORDER_RM_SUPPORT */
} else if (!strcmp(videosink_name, "evasimagesink") ||
!strcmp(videosink_name, "evaspixmapsink")) {
_mmcam_dbg_log("videosink : %s, handle : %p", videosink_name, overlay);
gst_video_overlay_set_wl_window_wl_surface_id(GST_VIDEO_OVERLAY(vsink), (guintptr)wl_info->global_surface_id);
gst_video_overlay_set_render_rectangle(GST_VIDEO_OVERLAY(vsink),
wl_info->window_x, wl_info->window_y, wl_info->window_width, wl_info->window_height);
+#ifdef _MMCAMCORDER_RM_SUPPORT
+ if (hcamcorder->request_resources.category_id[0] == RM_CATEGORY_VIDEO_DECODER_SUB)
+ display_scaler = 1;
+
+ MMCAMCORDER_G_OBJECT_SET(vsink, "device-scaler", display_scaler);
+#endif /* _MMCAMCORDER_RM_SUPPORT */
} else {
_mmcam_dbg_warn("Handle is NULL. skip setting.");
}
int _mmcamcorder_get_eos_message(MMHandleType handle)
{
- double elapsed = 0.0;
-
- GstMessage *gMessage = NULL;
- GstBus *bus = NULL;
- GstClockTime timeout = 1 * GST_SECOND; /* maximum waiting time */
- GTimer *timer = NULL;
+ int64_t end_time;
int ret = MM_ERROR_NONE;
mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
sc = MMF_CAMCORDER_SUBCONTEXT(handle);
mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
- _mmcam_dbg_log("");
+ _mmcam_dbg_log("START");
- bus = gst_pipeline_get_bus(GST_PIPELINE(sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst));
- timer = g_timer_new();
+ _MMCAMCORDER_LOCK(handle);
- if (sc && !(sc->bget_eos)) {
- while (TRUE) {
- elapsed = g_timer_elapsed(timer, NULL);
+ if (sc->bget_eos == FALSE) {
+ end_time = g_get_monotonic_time() + 3 * G_TIME_SPAN_SECOND;
+ if (_MMCAMCORDER_WAIT_UNTIL(handle, end_time)) {
+ _mmcam_dbg_log("EOS signal received");
+ } else {
+ _mmcam_dbg_err("EOS wait time out");
+ }
+ } else {
+ _mmcam_dbg_log("already got EOS");
+ }
- /*_mmcam_dbg_log("elapsed:%f sec", elapsed);*/
+ _MMCAMCORDER_UNLOCK(handle);
- if (elapsed > _MMCAMCORDER_WAIT_EOS_TIME) {
- _mmcam_dbg_warn("Timeout. EOS isn't received.");
- ret = MM_ERROR_CAMCORDER_RESPONSE_TIMEOUT;
- break;
+ if (hcamcorder->error_code == MM_ERROR_NONE) {
+ if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
+ mmf_return_val_if_fail(sc->info_video, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+ if (sc->info_video->b_commiting) {
+ _mmcamcorder_video_handle_eos((MMHandleType)hcamcorder);
}
-
- gMessage = gst_bus_timed_pop(bus, timeout);
- if (gMessage != NULL) {
- _mmcam_dbg_log("Get message(%x).", GST_MESSAGE_TYPE(gMessage));
-
- if (GST_MESSAGE_TYPE(gMessage) == GST_MESSAGE_ERROR) {
- GError *err;
- gchar *debug;
- gst_message_parse_error(gMessage, &err, &debug);
-
- switch (err->code) {
- case GST_RESOURCE_ERROR_WRITE:
- _mmcam_dbg_err("File write error");
- ret = MM_ERROR_FILE_WRITE;
- break;
- case GST_RESOURCE_ERROR_NO_SPACE_LEFT:
- _mmcam_dbg_err("No left space");
- ret = MM_MESSAGE_CAMCORDER_NO_FREE_SPACE;
- break;
- case GST_RESOURCE_ERROR_OPEN_WRITE:
- _mmcam_dbg_err("Out of storage");
- ret = MM_ERROR_OUT_OF_STORAGE;
- break;
- case GST_RESOURCE_ERROR_SEEK:
- _mmcam_dbg_err("File read(seek)");
- ret = MM_ERROR_FILE_READ;
- break;
- default:
- _mmcam_dbg_err("Resource error(%d)", err->code);
- ret = MM_ERROR_CAMCORDER_GST_RESOURCE;
- break;
- }
-
- g_error_free (err);
- g_free (debug);
-
- gst_message_unref(gMessage);
- break;
- }
-
- _mmcamcorder_pipeline_cb_message(bus, gMessage, (void*)hcamcorder);
-
- if (GST_MESSAGE_TYPE(gMessage) == GST_MESSAGE_EOS || sc->bget_eos) {
- gst_message_unref(gMessage);
- break;
- }
- gst_message_unref(gMessage);
- } else {
- _mmcam_dbg_log("timeout of gst_bus_timed_pop()");
- if (sc->bget_eos) {
- _mmcam_dbg_log("Get EOS in another thread.");
- break;
- }
+ } else {
+ mmf_return_val_if_fail(sc->info_audio, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+ if (sc->info_audio->b_commiting) {
+ _mmcamcorder_audio_handle_eos((MMHandleType)hcamcorder);
}
}
+ } else {
+ ret = hcamcorder->error_code;
+ _mmcam_dbg_err("error 0x%x", ret);
}
- g_timer_destroy(timer);
- timer = NULL;
- gst_object_unref(bus);
- bus = NULL;
-
_mmcam_dbg_log("END");
return ret;
gboolean do_set_caps = FALSE;
GstCaps *caps = NULL;
+#ifdef _MMCAMCORDER_PRODUCT_TV
+ GstPad *sinkpad;
+ GstCaps *decsink_caps = NULL;
+ GstStructure *decsink_struct = NULL;
+ int maxwidth = 0;
+ int maxheight = 0;
+#endif /*_MMCAMCORDER_PRODUCT_TV */
mmf_camcorder_t *hcamcorder = NULL;
_MMCamcorderSubContext *sc = NULL;
gst_structure_get_int(structure, "fps", &caps_fps);
gst_structure_get_int(structure, "rotate", &caps_rotate);
+#ifdef _MMCAMCORDER_PRODUCT_TV
+ if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_H264) {
+ if (set_width == caps_width && set_height == caps_height && set_rotate == caps_rotate && fps == caps_fps) {
+ _mmcam_dbg_log("No need to replace caps.");
+ } else {
+ _mmcam_dbg_log("current [%c%c%c%c %dx%d, fps %d, rot %d], new [%c%c%c%c %dx%d, fps %d, rot %d]",
+ caps_fourcc, caps_fourcc>>8, caps_fourcc>>16, caps_fourcc>>24,
+ caps_width, caps_height, caps_fps, caps_rotate,
+ fourcc, fourcc>>8, fourcc>>16, fourcc>>24,
+ set_width, set_height, fps, set_rotate);
+ do_set_caps = TRUE;
+ }
+ } else {
+ if (set_width == caps_width && set_height == caps_height &&
+ fourcc == caps_fourcc && set_rotate == caps_rotate && fps == caps_fps) {
+ _mmcam_dbg_log("No need to replace caps.");
+ } else {
+ _mmcam_dbg_log("current [%c%c%c%c %dx%d, fps %d, rot %d], new [%c%c%c%c %dx%d, fps %d, rot %d]",
+ caps_fourcc, caps_fourcc>>8, caps_fourcc>>16, caps_fourcc>>24,
+ caps_width, caps_height, caps_fps, caps_rotate,
+ fourcc, fourcc>>8, fourcc>>16, fourcc>>24,
+ set_width, set_height, fps, set_rotate);
+ do_set_caps = TRUE;
+ }
+ }
+#else /*_MMCAMCORDER_PRODUCT_TV */
if (set_width == caps_width && set_height == caps_height &&
fourcc == caps_fourcc && set_rotate == caps_rotate && fps == caps_fps) {
_mmcam_dbg_log("No need to replace caps.");
set_width, set_height, fps, set_rotate);
do_set_caps = TRUE;
}
+#endif /*_MMCAMCORDER_PRODUCT_TV */
} else {
_mmcam_dbg_log("can not get structure of caps. set new one...");
do_set_caps = TRUE;
if (do_set_caps) {
if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_H264) {
+#ifdef _MMCAMCORDER_PRODUCT_TV
+ sinkpad = gst_element_get_static_pad(sc->element[_MMCAMCORDER_VIDEOSRC_DECODE].gst, "sink");
+ if (!sinkpad) {
+ _mmcam_dbg_err("There are no decoder caps");
+ return FALSE;
+ }
+
+ decsink_caps = gst_pad_get_pad_template_caps(sinkpad);
+ if (!decsink_caps) {
+ gst_object_unref(sinkpad);
+ _mmcam_dbg_err("There is no decoder sink caps");
+ return FALSE;
+ }
+
+ decsink_struct = gst_caps_get_structure(decsink_caps,0);
+ if (!decsink_struct) {
+ _mmcam_dbg_err("There are no structure from caps");
+ gst_object_unref(decsink_caps);
+ gst_object_unref(sinkpad);
+ return FALSE;
+ }
+
+ if(gst_structure_has_field(decsink_struct, "maxwidth")){
+ gst_structure_get_int(decsink_struct, "maxwidth", &maxwidth);
+ }
+ if(gst_structure_has_field(decsink_struct, "maxheight")){
+ gst_structure_get_int(decsink_struct, "maxheight", &maxheight);
+ }
+#endif /* _MMCAMCORDER_PRODUCT_TV */
caps = gst_caps_new_simple("video/x-h264",
"width", G_TYPE_INT, set_width,
"height", G_TYPE_INT, set_height,
"framerate", GST_TYPE_FRACTION, fps, 1,
"stream-format", G_TYPE_STRING, "byte-stream",
+#ifdef _MMCAMCORDER_PRODUCT_TV
+ "maxwidth", G_TYPE_INT, maxwidth,
+ "maxheight", G_TYPE_INT, maxheight,
+ "alignment", G_TYPE_STRING, "au",
+#endif /* _MMCAMCORDER_PRODUCT_TV */
NULL);
+
+#ifdef _MMCAMCORDER_PRODUCT_TV
+ gst_object_unref(decsink_caps);
+ gst_object_unref(sinkpad);
+#endif /* _MMCAMCORDER_PRODUCT_TV */
} else {
char fourcc_string[sizeof(fourcc)+1];
strncpy(fourcc_string, (char*)&fourcc, sizeof(fourcc));
_MMCamcorderSubContext *sc = NULL;
mmf_camcorder_t *hcamcorder = NULL;
const char *videodecoder_name = NULL;
+#ifdef _MMCAMCORDER_RM_SUPPORT
+ char decoder_name[20] = {'\0',};
+ int decoder_index = 0;
+#endif /* _MMCAMCORDER_RM_SUPPORT */
if ((void *)handle == NULL) {
_mmcam_dbg_warn("handle is NULL");
((GObject *)sc->element[_MMCAMCORDER_VIDEOSRC_DECODE].gst)->ref_count);
}
+#ifdef _MMCAMCORDER_RM_SUPPORT
+ if (hcamcorder->request_resources.category_id[0] == RM_CATEGORY_VIDEO_DECODER_SUB)
+ decoder_index = 1;
+
+ snprintf(decoder_name, sizeof(decoder_name)-1, "%s%d", videodecoder_name, decoder_index);
+ _mmcam_dbg_log("encoded preview decoder_name %s", decoder_name);
+ /* create decoder */
+ sc->element[_MMCAMCORDER_VIDEOSRC_DECODE].gst = gst_element_factory_make(decoder_name, "videosrc_decode");
+ if (sc->element[_MMCAMCORDER_VIDEOSRC_DECODE].gst == NULL) {
+ _mmcam_dbg_err("Decoder[%s] creation fail", decoder_name);
+ return FALSE;
+ }
+#else /* _MMCAMCORDER_RM_SUPPORT */
/* create new decoder */
sc->element[_MMCAMCORDER_VIDEOSRC_DECODE].gst = gst_element_factory_make(videodecoder_name, "videosrc_decode");
if (sc->element[_MMCAMCORDER_VIDEOSRC_DECODE].gst == NULL) {
_mmcam_dbg_err("Decoder [%s] creation fail", videodecoder_name);
return FALSE;
}
+#endif /* _MMCAMCORDER_RM_SUPPORT */
+ _mmcamcorder_conf_set_value_element_property(sc->element[_MMCAMCORDER_VIDEOSRC_DECODE].gst, sc->VideodecoderElementH264);
sc->element[_MMCAMCORDER_VIDEOSRC_DECODE].id = _MMCAMCORDER_VIDEOSRC_DECODE;
g_object_weak_ref(G_OBJECT(sc->element[_MMCAMCORDER_VIDEOSRC_DECODE].gst),