Name: libmm-camcorder
Summary: Camera and recorder library
-Version: 0.10.33
+Version: 0.10.34
Release: 0
Group: Multimedia/Libraries
License: Apache-2.0
* Attribute @n
Attribute system is an interface to operate camcorder. Depending on each attribute, camcorder behaves differently.
Attribute system provides get/set functions. Setting proper attributes, a user can control camcorder as he want. (mm_camcorder_set_attributes())
- Also, a user can comprehend current status of the camcorder, calling getter function(mm_camcorder_get_attributes()).
+ Also, a user can comprehend current status of the camcorder, calling getter function(mm_camcorder_get_attributes()).
Beware, arguments of mm_camcorder_set_attributes() and mm_camcorder_get_attributes() should be finished with 'NULL'.
This is a rule for the variable argument.
@par
#define MMCAM_FILTER_SHARPNESS "filter-sharpness"
/**
- * Pixel format that you want to capture. If you set MM_PIXEL_FORMAT_ENCODED,
+ * Pixel format that you want to capture. If you set MM_PIXEL_FORMAT_ENCODED,
* the result will be encoded by image codec specified in #MMCAM_IMAGE_ENCODER.
* If not, the result will be raw data.
*
#define MMCAM_TARGET_MAX_SIZE "target-max-size"
/**
- * Time limit(Second) of recording file. If the elapsed time of recording reaches this value,
+ * Time limit(Second) of recording file. If the elapsed time of recording reaches this value,
* camcorder will send 'MM_MESSAGE_CAMCORDER_TIME_LIMIT' message.
*/
#define MMCAM_TARGET_TIME_LIMIT "target-time-limit"
* Wayland information
*/
typedef struct _MMCamWaylandInfo {
- void *evas_obj;
- void *window;
- void *surface;
- void *display;
+ int parent_id;
int window_x;
int window_y;
int window_width;
int window_height;
+ void *evas_obj;
} MMCamWaylandInfo;
#endif /* HAVE_WAYLAND */
========================================================================================*/
/**
* Function definition for video stream callback.
- * Be careful! In this function, you can't call functions that change the state of camcorder such as mm_camcorder_stop(),
+ * Be careful! In this function, you can't call functions that change the state of camcorder such as mm_camcorder_stop(),
* mm_camcorder_unrealize(), mm_camcorder_record(), mm_camcorder_commit(), and mm_camcorder_cancel(), etc.
- * Please don't hang this function long. It may cause low performance of preview or occur timeout error from video source.
- * Also, you're not allowed to call mm_camcorder_stop() even in other context, while you're hanging this function.
+ * Please don't hang this function long. It may cause low performance of preview or occur timeout error from video source.
+ * Also, you're not allowed to call mm_camcorder_stop() even in other context, while you're hanging this function.
* I recommend to you releasing this function ASAP.
*
* @param[in] stream Reference pointer to video stream data
========================================================================================*/
/**
* mm_camcorder_create:\n
- * Create camcorder object. This is the function that an user who wants to use mm_camcorder calls first.
+ * Create camcorder object. This is the function that an user who wants to use mm_camcorder calls first.
* This function creates handle structure and initialize mutex, attributes, gstreamer.
- * When this function success, it will return a handle of newly created object.
+ * When this function success, it will return a handle of newly created object.
* A user have to put the handle when he calls every function of mm_camcorder. \n
* Second argument of this function is the field to decribe pre-setting information of mm_camcorder such as which camera device it will use.
- * Normally, MM_VIDEO_DEVICE_CAMERA0 is for Main camera(or Mega camera, Back camera),
+ * Normally, MM_VIDEO_DEVICE_CAMERA0 is for Main camera(or Mega camera, Back camera),
* and MM_VIDEO_DEVICE_CAMERA1 is for VGA camera (or Front camera). If you want audio recording,
* please set MM_VIDEO_DEVICE_NONE. (No camera device is needed.)
*
* mm_camcorder_unrealize:\n
* Uninitialize camcoder resources and free allocated memory.
* Most important resource that is released here is gstreamer pipeline of mm_camcorder.
- * Because most of resources, such as camera device, video display device, and audio I/O device, are operating on the gstreamer pipeline,
+ * Because most of resources, such as camera device, video display device, and audio I/O device, are operating on the gstreamer pipeline,
* this function should be called to release its resources.
* Moreover, mm_camcorder is controlled by audio session manager. If an user doesn't call this function when he want to release mm_camcorder,
* other multimedia frameworks may face session problem. For more detail information, please refer mm_session module.
* Some encoder or muxer require a certain type of finalizing such as adding some information to header.
* This function takes that roll. So if you don't call this function after recording, the result file may not be playable.\n
* After committing successfully, camcorder resumes displaying preview (video recording case).
- * Because this is the function for saving the recording result, the operation is available
- * only when the mode of camcorder is MM_CAMCORDER_MODE_AUDIO or MM_CAMCORDER_MODE_VIDEO.
+ * Because this is the function for saving the recording result, the operation is available
+ * only when the mode of camcorder is MM_CAMCORDER_MODE_AUDIO or MM_CAMCORDER_MODE_VIDEO.
*
* @param[in] camcorder A handle of camcorder.
* @return This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
* When a user want to finish recording without saving the result file, this function can be used.
* Like mm_camcorder_commit(), this function also stops recording, release related resources(like codec) ,and goes back to preview status.
* However, instead of saving file, this function unlinks(delete) the result.\n
- * Because this is the function for canceling recording, the operation is available
- * only when mode is MM_CAMCORDER_MODE_AUDIO or MM_CAMCORDER_MODE_VIDEO.
+ * Because this is the function for canceling recording, the operation is available
+ * only when mode is MM_CAMCORDER_MODE_AUDIO or MM_CAMCORDER_MODE_VIDEO.
*
* @param[in] camcorder A handle of camcorder.
* @return This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
/**
* mm_camcorder_set_video_stream_callback:\n
* Set callback for user defined video stream callback function.
- * Users can retrieve video frame using registered callback.
+ * Users can retrieve video frame using registered callback.
* The callback function holds the same buffer that will be drawed on the display device.
* So if an user change the buffer, it will be displayed on the device.
*
* mm_camcorder deliever captured image through the callback.\n
* Normally, this function provides main captured image and thumnail image. But depending on the environment,
* thumnail would not be available. Information related with main captured image and thumnail image is also included
- * in the argument of the callback function.
+ * in the argument of the callback function.
* For more detail information of callback, please refer 'mm_camcorder_video_capture_callback'.
*
* @param[in] camcorder A handle of camcorder.
/**
* mm_camcorder_get_attributes:\n
* Get attributes of camcorder with given attribute names. This function can get multiple attributes
- * simultaneously. If one of attribute fails, this function will stop at the point.
+ * simultaneously. If one of attribute fails, this function will stop at the point.
* 'err_attr_name' let you know the name of the attribute.
*
* @param[in] camcorder Specifies the camcorder handle.
/**
* mm_camcorder_set_attributes:\n
* Set attributes of camcorder with given attribute names. This function can set multiple attributes
- * simultaneously. If one of attribute fails, this function will stop at the point.
+ * simultaneously. If one of attribute fails, this function will stop at the point.
* 'err_attr_name' let you know the name of the attribute.
*
* @param[in] camcorder Specifies the camcorder handle.
* Start focusing. \n
* This function command to start focusing opeartion. Because focusing operation depends on mechanic or electric module,
* it may take small amount of time. (For ex, 500ms ~ 3sec). \n
- * This function works asynchronously. When an user call this function, it will return immediately.
- * However, focusing operation will continue until it gets results.
+ * This function works asynchronously. When an user call this function, it will return immediately.
+ * However, focusing operation will continue until it gets results.
* After finishing operation, you can get 'MM_MESSAGE_CAMCORDER_FOCUS_CHANGED' message.
* 'param.code' of the message structure describes the fucusing was success or not.
*
* @return This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
* Please refer 'mm_error.h' to know the exact meaning of the error.
* @see mm_camcorder_init_focusing, mm_camcorder_start_focusing
- * @pre mm_camcorder_start_focusing() should be called before calling this function.
+ * @pre mm_camcorder_start_focusing() should be called before calling this function.
* @post None
* @remarks None
* @par example
#ifdef HAVE_WAYLAND
} else if (!strcmp(videosink_name, "waylandsink")) {
MMCamWaylandInfo *wl_info = (MMCamWaylandInfo *)p_handle;
- GstContext *context = NULL;
- context = gst_wayland_display_handle_context_new((struct wl_display *)wl_info->display);
- if (context) {
- gst_element_set_context(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, context);
- } else {
- _mmcam_dbg_warn("gst_wayland_display_handle_context_new failed");
- }
+ _mmcam_dbg_log("parent id : %d", wl_info->parent_id);
- gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst), (guintptr)wl_info->surface);
+ gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst), (guintptr)wl_info->parent_id);
gst_video_overlay_set_render_rectangle(GST_VIDEO_OVERLAY(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst),
- wl_info->window_x,
- wl_info->window_y,
- wl_info->window_width,
- wl_info->window_height);
+ wl_info->window_x, wl_info->window_y, wl_info->window_width, wl_info->window_height);
#endif /* HAVE_WAYLAND */
} else {
_mmcam_dbg_warn("Commit : Nothing to commit with this element[%s]", videosink_name);
_mmcam_dbg_log("Commit : videosinkname[%s]", videosink_name);
- if (!strcmp(videosink_name, "xvimagesink")) {
+ if (!strcmp(videosink_name, "xvimagesink") || !strcmp(videosink_name, "waylandsink")) {
_mmcam_dbg_log("Commit : display mode [%d]", value->value.i_val);
MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "display-mode", value->value.i_val);
return TRUE;
return FALSE;
}
- if (!strcmp(videosink_name, "xvimagesink") || !strcmp(videosink_name, "evasimagesink") ||
- !strcmp(videosink_name, "evaspixmapsink")) {
+ if (!strcmp(videosink_name, "xvimagesink") || !strcmp(videosink_name, "waylandsink") ||
+ !strcmp(videosink_name, "evaspixmapsink") || !strcmp(videosink_name, "evasimagesink")) {
MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "visible", value->value.i_val);
_mmcam_dbg_log("Set visible [%d] done.", value->value.i_val);
return TRUE;
return FALSE;
}
- if (!strcmp(videosink_name, "xvimagesink") || !strcmp(videosink_name, "evasimagesink") ||
- !strcmp(videosink_name, "evaspixmapsink")) {
+ if (!strcmp(videosink_name, "xvimagesink") || !strcmp(videosink_name, "waylandsink") ||
+ !strcmp(videosink_name, "evaspixmapsink") || !strcmp(videosink_name, "evasimagesink")) {
method = value->value.i_val;
MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "display-geometry-method", method);
return TRUE;
return FALSE;
}
- if (!strcmp(videosink_name, "xvimagesink") ||
+ if (!strcmp(videosink_name, "xvimagesink") || !strcmp(videosink_name, "waylandsink") ||
!strcmp(videosink_name, "evaspixmapsink")) {
int rect_x = 0;
int rect_y = 0;
}
zoom = value->value.i_val;
- if (!strcmp(videosink_name, "xvimagesink")) {
+ if (!strcmp(videosink_name, "xvimagesink") || !strcmp(videosink_name, "waylandsink")) {
vs_element = sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst;
MMCAMCORDER_G_OBJECT_SET(vs_element, "zoom", (float)(zoom + 1));
#ifdef HAVE_WAYLAND
} else if (!strcmp(videosink_name, "waylandsink")) {
MMCamWaylandInfo *wl_info = (MMCamWaylandInfo *)p_handle;
- GstContext *context = NULL;
- context = gst_wayland_display_handle_context_new((struct wl_display *)wl_info->display);
- if (context) {
- gst_element_set_context(sc->element[_MMCAMCORDER_CLIENT_VIDEOSINK_SINK].gst, context);
- } else {
- _mmcam_dbg_warn("gst_wayland_display_handle_context_new failed");
- }
+ _mmcam_dbg_log("parent id : %d", wl_info->parent_id);
- gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(sc->element[_MMCAMCORDER_CLIENT_VIDEOSINK_SINK].gst), (guintptr)wl_info->surface);
+ gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(sc->element[_MMCAMCORDER_CLIENT_VIDEOSINK_SINK].gst), (guintptr)wl_info->parent_id);
gst_video_overlay_set_render_rectangle(GST_VIDEO_OVERLAY(sc->element[_MMCAMCORDER_CLIENT_VIDEOSINK_SINK].gst),
- wl_info->window_x,
- wl_info->window_y,
- wl_info->window_width,
- wl_info->window_height);
+ wl_info->window_x, wl_info->window_y, wl_info->window_width, wl_info->window_height);
#endif /* HAVE_WAYLAND */
} else {
_mmcam_dbg_warn("Commit : Nothing to commit with this element[%s]", videosink_name);
} else if (!strcmp(videosink_name, "waylandsink")) {
MMCamWaylandInfo *wl_info = (MMCamWaylandInfo *)overlay;
if (wl_info) {
- GstContext *context = NULL;
-
- context = gst_wayland_display_handle_context_new((struct wl_display *)wl_info->display);
- if (context) {
- gst_element_set_context(vsink, context);
- } else {
- _mmcam_dbg_warn("gst_wayland_display_handle_context_new failed");
- }
-
- gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(vsink), (guintptr)wl_info->surface);
+ _mmcam_dbg_log("parent id : %d", wl_info->parent_id);
+ gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(vsink), (guintptr)wl_info->parent_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);
+ wl_info->window_x, wl_info->window_y, wl_info->window_width, wl_info->window_height);
} else {
_mmcam_dbg_warn("Handle is NULL. skip setting.");
}
for (idx = 0; idx < attr_count; idx++)
{
- _mmcam_dbg_log("Valid type [%s]", hcamcorder->cam_attrs_const_info[idx].name);
+ /*_mmcam_dbg_log("Valid type [%s]", hcamcorder->cam_attrs_const_info[idx].name);*/
mmf_attrs_set_valid_type (attrs, idx, hcamcorder->cam_attrs_const_info[idx].validity_type);
}
break;
case MM_ATTRS_VALID_TYPE_INT_RANGE:
- _mmcam_dbg_err("MM_ATTRS_VALID_TYPE_INT_RANGE");
mmf_attrs_set_valid_range(attrs, idx,
hcamcorder->cam_attrs_const_info[idx].validity_value_1.int_min,
hcamcorder->cam_attrs_const_info[idx].validity_value_2.int_max,
} else {
_mmcam_dbg_err("allocation failed");
}
- }
- else
- {
- _mmcam_dbg_err("invalid count - %d", new_element->count_int);
+ } else {
+ /*_mmcam_dbg_err("invalid count - %d", new_element->count_int);*/
new_element->value_int = NULL;
}
_mmcam_dbg_err("malloc failed : %d", sizeof(type_string2*)*(new_element->count_string));
}
} else {
- _mmcam_dbg_err("invalid count - %d", new_element->count_string);
+ /*_mmcam_dbg_err("invalid count - %d", new_element->count_string);*/
new_element->value_string = NULL;
}
} else if (!strcmp(videosink_name, "waylandsink")) {
MMCamWaylandInfo *wl_info = (MMCamWaylandInfo *)overlay;
if (wl_info) {
- GstContext *context = NULL;
-
- context = gst_wayland_display_handle_context_new((struct wl_display *)wl_info->display);
- if (context) {
- gst_element_set_context(vsink, context);
- } else {
- _mmcam_dbg_warn("gst_wayland_display_handle_context_new failed");
- }
-
- gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(vsink), (guintptr)wl_info->surface);
+ _mmcam_dbg_log("parent id : %d", wl_info->parent_id);
+ gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(vsink), (guintptr)wl_info->parent_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);
+ wl_info->window_x, wl_info->window_y, wl_info->window_width, wl_info->window_height);
} else {
_mmcam_dbg_warn("Handle is NULL. skip setting.");
}
videosink_name, display_geometry_method, origin_size, visible, rotation, flip);
/* Set attribute */
- if (!strcmp(videosink_name, "xvimagesink") ||
+ if (!strcmp(videosink_name, "xvimagesink") || !strcmp(videosink_name, "waylandsink") ||
!strcmp(videosink_name, "evaspixmapsink")) {
/* set rotation */
MMCAMCORDER_G_OBJECT_SET(vsink, "rotate", rotation);
_mmcam_dbg_log("Profile mode [%d]", hcamcorder->type);
mm_camcorder_get_attributes(handle, NULL,
- MMCAM_DISPLAY_SURFACE, &display_surface_type,
- MMCAM_CAMERA_RECORDING_MOTION_RATE, &motion_rate,
- MMCAM_DISPLAY_SOCKET_PATH, &socket_path, &socket_path_len,
- NULL);
+ MMCAM_DISPLAY_SURFACE, &display_surface_type,
+ MMCAM_CAMERA_RECORDING_MOTION_RATE, &motion_rate,
+ NULL);
/* sound focus */
if (hcamcorder->sound_focus_register) {
_mmcam_dbg_warn("SupportDualStream [%d]", hcamcorder->sub_context->info_video->support_dual_stream);
}
- if (socket_path == NULL) {
- _mmcam_dbg_warn("Socket Path is not properly set, -> to NullSink.");
+ switch (display_surface_type) {
+ case MM_DISPLAY_SURFACE_OVERLAY:
+ videosink_element_type = strdup("VideosinkElementOverlay");
+ break;
+ case MM_DISPLAY_SURFACE_EVAS:
+ videosink_element_type = strdup("VideosinkElementEvas");
+ break;
+ case MM_DISPLAY_SURFACE_GL:
+ videosink_element_type = strdup("VideosinkElementGL");
+ break;
+ case MM_DISPLAY_SURFACE_NULL:
videosink_element_type = strdup("VideosinkElementNull");
- } else {
- switch (display_surface_type) {
- case MM_DISPLAY_SURFACE_OVERLAY:
- videosink_element_type = strdup("VideosinkElementOverlay");
- break;
- case MM_DISPLAY_SURFACE_EVAS:
- videosink_element_type = strdup("VideosinkElementEvas");
- break;
- case MM_DISPLAY_SURFACE_GL:
- videosink_element_type = strdup("VideosinkElementGL");
- break;
- case MM_DISPLAY_SURFACE_NULL:
+ break;
+ case MM_DISPLAY_SURFACE_REMOTE:
+ mm_camcorder_get_attributes(handle, NULL,
+ MMCAM_DISPLAY_SOCKET_PATH, &socket_path, &socket_path_len,
+ NULL);
+ if (socket_path == NULL) {
+ _mmcam_dbg_warn("REMOTE surface, but socket path is NULL -> to NullSink");
videosink_element_type = strdup("VideosinkElementNull");
- break;
- case MM_DISPLAY_SURFACE_REMOTE:
+ } else
videosink_element_type = strdup("VideosinkElementRemote");
- break;
- default:
- videosink_element_type = strdup("VideosinkElementOverlay");
- break;
- }
+ break;
+ default:
+ videosink_element_type = strdup("VideosinkElementOverlay");
+ break;
}
/* check string of videosink element */