Name: libmm-camcorder
Summary: Camera and recorder library
-Version: 0.10.15
-Release: 1
+Version: 0.10.16
+Release: 0
Group: Multimedia/Libraries
License: Apache-2.0
Source0: %{name}-%{version}.tar.gz
BuildRequires: pkgconfig(storage)
%description
-Camera and recorder library.
+Camera and recorder function supported library.
%package devel
-Summary: Camera and recorder development library
+Summary: Camera and recorder library for development
Group: libdevel
Version: %{version}
Requires: %{name} = %{version}-%{release}
%description devel
-Camera and recorder development library.
+Camera and recorder function supported library for development.
%prep
GList *buffer_probes; /**< a list of buffer probe handle */
GList *event_probes; /**< a list of event probe handle */
GList *signals; /**< a list of signal handle */
+#ifdef _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK
GList *msg_data; /**< a list of msg data */
+#endif /* _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK */
camera_conf *conf_main; /**< Camera configure Main structure */
camera_conf *conf_ctrl; /**< Camera configure Control structure */
guint pipeline_cb_event_id; /**< Event source ID of pipeline message callback */
/*=======================================================================================
| GLOBAL DEFINITIONS AND DECLARATIONS FOR CAMCORDER |
========================================================================================*/
+#define MM_CAMCORDER_ATTR_NONE -1
+
/*=======================================================================================
| MACRO DEFINITIONS |
ENUM_CONVERT_NUM
} MMCamConvertingEnum;
+typedef enum {
+ MM_CAMCONVERT_CATEGORY_CAMERA = 1 << 0,
+ MM_CAMCONVERT_CATEGORY_DISPLAY = 1 << 1,
+ MM_CAMCONVERT_CATEGORY_AUDIO = 1 << 2
+} MMCamConvertingCategory;
+
/*=======================================================================================
| STRUCTURE DEFINITIONS |
========================================================================================*/
int _mmcamcorder_set_converted_value(MMHandleType handle, _MMCamcorderEnumConvert *convert);
int _mmcamcorder_init_convert_table(MMHandleType handle);
-int _mmcamcorder_init_attr_from_configure(MMHandleType handle, int type);
+int _mmcamcorder_init_attr_from_configure(MMHandleType handle, MMCamConvertingCategory category);
int _mmcamcorder_convert_brightness(int mslVal);
int _mmcamcorder_convert_whitebalance(int mslVal);
int _mmcamcorder_convert_colortone(int mslVal);
double _mmcamcorder_convert_volume(int mslVal);
+int __mmcamcorder_set_info_to_attr(MMHandleType handle, _MMCamcorderInfoConverting *info, int table_size);
#ifdef __cplusplus
}
gboolean _mmcamcorder_filtered_link_elements(GList *element_list, GstCaps *caps);
/* Message */
+#ifdef _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK
gboolean _mmcamcorder_msg_callback(void *data);
+#endif /* _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK */
gboolean _mmcamcorder_send_message(MMHandleType handle, _MMCamcorderMsgItem *data);
void _mmcamcorder_remove_message_all(MMHandleType handle);
#include <storage.h>
+static _MMCamcorderInfoConverting g_client_display_info[] = {
+ {
+ CONFIGURE_TYPE_MAIN,
+ CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
+ MM_CAM_CLIENT_DISPLAY_DEVICE,
+ MM_CAMCORDER_ATTR_NONE,
+ "DisplayDevice",
+ MM_CAMCONVERT_TYPE_INT_ARRAY,
+ NULL,
+ },
+ {
+ CONFIGURE_TYPE_MAIN,
+ CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
+ MM_CAM_CLIENT_DISPLAY_MODE,
+ MM_CAMCORDER_ATTR_NONE,
+ "DisplayMode",
+ MM_CAMCONVERT_TYPE_INT_ARRAY,
+ NULL,
+ },
+ {
+ CONFIGURE_TYPE_MAIN,
+ CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
+ MM_CAM_CLIENT_DISPLAY_SURFACE,
+ MM_CAMCORDER_ATTR_NONE,
+ "Videosink",
+ MM_CAMCONVERT_TYPE_INT_ARRAY,
+ NULL,
+ },
+};
+
+
static int _storage_device_supported_cb(int storage_id, storage_type_e type, storage_state_e state, const char *path, void *user_data)
{
char **root_directory = (char **)user_data;
return MM_ERROR_NONE;
}
-MMHandleType
-_mmcamcorder_client_alloc_attribute(MMHandleType handle)
+int _mmcamcorder_client_init_attr_from_configure(MMHandleType handle)
+{
+ mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+ _MMCamcorderInfoConverting *info = NULL;
+
+ int table_size = 0;
+ int ret = MM_ERROR_NONE;
+
+ mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+
+ /* Initialize attribute related to display */
+ info = g_client_display_info;
+ table_size = sizeof(g_client_display_info) / sizeof(_MMCamcorderInfoConverting);
+ ret = __mmcamcorder_set_info_to_attr(handle, info, table_size);
+ if (ret != MM_ERROR_NONE) {
+ _mmcam_dbg_err("display info set error : 0x%x", ret);
+ return ret;
+ }
+
+ _mmcam_dbg_log("done");
+
+ return ret;
+}
+
+MMHandleType _mmcamcorder_client_alloc_attribute(MMHandleType handle)
{
_mmcam_dbg_log( "" );
_mmcam_dbg_err("shm src socket path : %s", socket_path);
g_object_set(sc->element[_MMCAMCORDER_CLIENT_VIDEOSRC_SRC].gst,
- "socket-path", socket_path,
- "is-live", TRUE,
- NULL);
+ "socket-path", socket_path,
+ "is-live", TRUE,
+ NULL);
/* Making Video sink from here */
_MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_CLIENT_VIDEOSINK_QUE, "queue", "videosink_queue", element_list, ret);
goto _ERR_DEFAULT_VALUE_INIT;
}
+ ret = _mmcamcorder_client_init_attr_from_configure((MMHandleType)hcamcorder);
+ if (ret != MM_ERROR_NONE) {
+ _mmcam_dbg_warn("client_init_attr_from_configure error!!");
+ ret = MM_ERROR_CAMCORDER_INTERNAL;
+ goto _ERR_DEFAULT_VALUE_INIT;
+ }
+
/* Set initial state */
_mmcamcorder_set_state((MMHandleType)hcamcorder, MM_CAMCORDER_STATE_NULL);
__videosink_default_string_array,
sizeof( __videosink_default_string_array ) / sizeof( type_string* ),
};
+ static type_element _videosink_element_remote_default = {
+ "VideosinkElementRemote",
+ "shmsink",
+ __videosink_default_int_array,
+ sizeof( __videosink_default_int_array ) / sizeof( type_int* ),
+ __videosink_default_string_array,
+ sizeof( __videosink_default_string_array ) / sizeof( type_string* ),
+ };
static type_element _videosink_element_null_default = {
"VideosinkElementNull",
"fakesink",
{ "VideosinkElementX", CONFIGURE_VALUE_ELEMENT, {&_videosink_element_x_default} },
{ "VideosinkElementEvas", CONFIGURE_VALUE_ELEMENT, {&_videosink_element_evas_default} },
{ "VideosinkElementGL", CONFIGURE_VALUE_ELEMENT, {&_videosink_element_gl_default} },
+ { "VideosinkElementRemote",CONFIGURE_VALUE_ELEMENT, {&_videosink_element_remote_default} },
{ "VideosinkElementNull", CONFIGURE_VALUE_ELEMENT, {&_videosink_element_null_default} },
{ "UseVideoscale", CONFIGURE_VALUE_INT, {.value_int = 0} },
{ "VideoscaleElement", CONFIGURE_VALUE_ELEMENT, {&_videoscale_element_default} },
(*configure_info)->info = (conf_detail**)g_malloc0( sizeof( conf_detail* ) * CONFIGURE_CATEGORY_MAIN_NUM );
for (i = 0 ; i < CONFIGURE_CATEGORY_MAIN_NUM ; i++) {
- (*configure_info)->info[i] = NULL;
+ (*configure_info)->info[i] = NULL;
}
} else {
hcamcorder->conf_ctrl_info_table[CONFIGURE_CATEGORY_CTRL_CAMERA] = conf_ctrl_camera_table;
int capture_jpg_quality = 100;
int video_stabilization = 0;
int anti_shake = 0;
+ int display_surface_type = MM_DISPLAY_SURFACE_NULL;
const char *videosrc_name = NULL;
const char *videosink_name = NULL;
char *err_name = NULL;
MMCAM_IMAGE_ENCODER, &codectype,
MMCAM_IMAGE_ENCODER_QUALITY, &capture_jpg_quality,
MMCAM_DISPLAY_SHM_SOCKET_PATH, &socket_path, &socket_path_len,
+ MMCAM_DISPLAY_SURFACE, &display_surface_type,
NULL);
if (err != MM_ERROR_NONE) {
_mmcam_dbg_warn("Get attrs fail. (%s:%x)", err_name, err);
_MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSINK_QUE, "queue", "videosink_queue", element_list, err);
_mmcam_dbg_log("videosink_name: %s", videosink_name);
- if (strcmp(videosink_name, "fakesink") == 0) {
- _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 (display_surface_type == MM_DISPLAY_SURFACE_REMOTE) {
+ _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSINK_SINK, videosink_name, "ipc_sink", element_list, err);
+
+ err = mm_camcorder_get_attributes(handle, &err_name,
+ MMCAM_DISPLAY_SHM_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);
+ return err;
+ }
+
+ g_object_set(G_OBJECT(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst), "socket-path", socket_path, NULL);
} else {
- _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSINK_SINK, "shmsink", "ipc_sink", element_list, err);
- _mmcam_dbg_log("socket_path : %s", socket_path);
- g_object_set(G_OBJECT(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst),
- "socket-path", socket_path,
- "wait-for-connection", FALSE,
- "perms", 0777,
- "sync", TRUE,
- NULL);
+ _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);
+
/* Set caps by rotation */
_mmcamcorder_set_videosrc_rotation(handle, camera_rotate);
goto _ERR_DEFAULT_VALUE_INIT;
}
- ret = _mmcamcorder_init_attr_from_configure((MMHandleType)hcamcorder, info->videodev_type);
+ ret = _mmcamcorder_init_attr_from_configure((MMHandleType)hcamcorder, MM_CAMCONVERT_CATEGORY_CAMERA|MM_CAMCONVERT_CATEGORY_DISPLAY);
if (ret != MM_ERROR_NONE) {
_mmcam_dbg_warn("converting table initialize error!!");
ret = MM_ERROR_CAMCORDER_INTERNAL;
goto _ERR_DEFAULT_VALUE_INIT;
}
- ret = _mmcamcorder_init_attr_from_configure((MMHandleType)hcamcorder, info->videodev_type);
+ ret = _mmcamcorder_init_attr_from_configure((MMHandleType)hcamcorder, MM_CAMCONVERT_CATEGORY_AUDIO);
if (ret != MM_ERROR_NONE) {
_mmcam_dbg_warn("init attribute from configure error : 0x%x", ret);
ret = MM_ERROR_CAMCORDER_INTERNAL;
case MM_DISPLAY_SURFACE_NULL:
videosink_element_type = strdup("VideosinkElementNull");
break;
+ case MM_DISPLAY_SURFACE_REMOTE:
+ videosink_element_type = strdup("VideosinkElementRemote");
+ break;
default:
videosink_element_type = strdup("VideosinkElementX");
break;
/*---------------------------------------------------------------------------
| LOCAL VARIABLE DEFINITIONS for internal |
---------------------------------------------------------------------------*/
-#define MM_CAMCORDER_ATTR_NONE -1
// Rule 1. 1:1 match except NONE.
| LOCAL FUNCTION PROTOTYPES: |
---------------------------------------------------------------------------*/
/* STATIC INTERNAL FUNCTION */
-static int __mmcamcorder_set_info_to_attr( MMHandleType handle, _MMCamcorderInfoConverting *info, int table_size );
static int __mmcamcorder_get_valid_array(int * original_array, int original_count, int ** valid_array, int * valid_default );
/*===========================================================================================
}
-int _mmcamcorder_init_attr_from_configure(MMHandleType handle, int type)
+int _mmcamcorder_init_attr_from_configure(MMHandleType handle, MMCamConvertingCategory category)
{
mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
_MMCamcorderInfoConverting *info = NULL;
mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
- _mmcam_dbg_log("type : %d", type);
+ _mmcam_dbg_log("category : %d", category);
- if (type != MM_VIDEO_DEVICE_NONE) {
+ if (category & MM_CAMCONVERT_CATEGORY_CAMERA) {
/* Initialize attribute related to camera control */
info = hcamcorder->caminfo_convert;
table_size = sizeof(g_caminfo_convert) / sizeof(_MMCamcorderInfoConverting);
_mmcam_dbg_err("camera info set error : 0x%x", ret);
return ret;
}
+ }
+ if (category & MM_CAMCONVERT_CATEGORY_DISPLAY) {
/* Initialize attribute related to display */
info = g_display_info;
table_size = sizeof(g_display_info) / sizeof(_MMCamcorderInfoConverting);
}
}
- /* Initialize attribute related to audio */
- info = g_audio_info;
- table_size = sizeof(g_audio_info) / sizeof(_MMCamcorderInfoConverting);
- ret = __mmcamcorder_set_info_to_attr(handle, info, table_size);
- if (ret != MM_ERROR_NONE) {
- _mmcam_dbg_err("audio info set error : 0x%x", ret);
- return ret;
+ if (category & MM_CAMCONVERT_CATEGORY_AUDIO) {
+ /* Initialize attribute related to audio */
+ info = g_audio_info;
+ table_size = sizeof(g_audio_info) / sizeof(_MMCamcorderInfoConverting);
+ ret = __mmcamcorder_set_info_to_attr(handle, info, table_size);
+ if (ret != MM_ERROR_NONE) {
+ _mmcam_dbg_err("audio info set error : 0x%x", ret);
+ return ret;
+ }
}
_mmcam_dbg_log("done");
}
-static int
-__mmcamcorder_set_info_to_attr( MMHandleType handle, _MMCamcorderInfoConverting *info, int table_size )
+int __mmcamcorder_set_info_to_attr(MMHandleType handle, _MMCamcorderInfoConverting *info, int table_size)
{
mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
MMHandleType attrs = 0;
info[i].type,
info[i].category,
info[i].attr_idx,
- info[i].attr_idx_sub,
+ info[i].attr_idx_pair,
info[i].keyword,
info[i].conv_type );
*/
}
+#ifdef _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK
gboolean _mmcamcorder_msg_callback(void *data)
{
_MMCamcorderMsgItem *item = (_MMCamcorderMsgItem*)data;
/* For not being called again */
return FALSE;
}
+#endif /* _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK */
gboolean _mmcamcorder_send_message(MMHandleType handle, _MMCamcorderMsgItem *data)
{
mmf_camcorder_t* hcamcorder = MMF_CAMCORDER(handle);
+#ifdef _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK
_MMCamcorderMsgItem *item = NULL;
+#endif /* _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK */
mmf_return_val_if_fail(hcamcorder, FALSE);
mmf_return_val_if_fail(data, FALSE);
break;
}
+#ifdef _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK
item = g_malloc(sizeof(_MMCamcorderMsgItem));
if (item) {
memcpy(item, data, sizeof(_MMCamcorderMsgItem));
_MMCAMCORDER_LOCK(handle);
hcamcorder->msg_data = g_list_append(hcamcorder->msg_data, item);
-// _mmcam_dbg_log("item[%p]", item);
+ /*_mmcam_dbg_log("item[%p]", item);*/
/* Use DEFAULT priority */
g_idle_add_full(G_PRIORITY_DEFAULT, _mmcamcorder_msg_callback, item, NULL);
} else {
_mmcam_dbg_err("item[id:0x%x] malloc failed : %d", data->id, sizeof(_MMCamcorderMsgItem));
}
+#else /* _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK */
+ _MMCAMCORDER_LOCK_MESSAGE_CALLBACK(hcamcorder);
+
+ if (hcamcorder->msg_cb) {
+ hcamcorder->msg_cb(data->id, (MMMessageParamType*)(&(data->param)), hcamcorder->msg_cb_param);
+ } else {
+ _mmcam_dbg_log("message callback is NULL. message id %d", data->id);
+ }
+
+ _MMCAMCORDER_UNLOCK_MESSAGE_CALLBACK(hcamcorder);
+
+ /* release allocated memory */
+ if (data->id == MM_MESSAGE_CAMCORDER_FACE_DETECT_INFO) {
+ MMCamFaceDetectInfo *cam_fd_info = (MMCamFaceDetectInfo *)data->param.data;
+ if (cam_fd_info) {
+ SAFE_FREE(cam_fd_info->face_info);
+ free(cam_fd_info);
+ cam_fd_info = NULL;
+
+ data->param.data = NULL;
+ data->param.size = 0;
+ }
+ } else if (data->id == MM_MESSAGE_CAMCORDER_VIDEO_CAPTURED ||
+ data->id == MM_MESSAGE_CAMCORDER_AUDIO_CAPTURED) {
+ MMCamRecordingReport *report = (MMCamRecordingReport *)data->param.data;
+ if (report) {
+ if (report->recording_filename) {
+ free(report->recording_filename);
+ report->recording_filename = NULL;
+ }
+ free(report);
+ report = NULL;
+
+ data->param.data = NULL;
+ }
+ }
+#endif /* _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK */
return TRUE;
}
void _mmcamcorder_remove_message_all(MMHandleType handle)
{
mmf_camcorder_t* hcamcorder = MMF_CAMCORDER(handle);
- _MMCamcorderMsgItem *item = NULL;
gboolean ret = TRUE;
+#ifdef _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK
+ _MMCamcorderMsgItem *item = NULL;
GList *list = NULL;
struct timespec timeout;
struct timeval tv;
struct timeval tv_to_add;
struct timeval tv_result;
+#endif /* _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK */
mmf_return_if_fail(hcamcorder);
_MMCAMCORDER_LOCK(handle);
+#ifdef _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK
if (!hcamcorder->msg_data) {
_mmcam_dbg_log("No message data is remained.");
} else {
g_list_free(hcamcorder->msg_data);
hcamcorder->msg_data = NULL;
}
+#endif /* _MMCAMCORDER_ENABLE_IDLE_MESSAGE_CALLBACK */
/* remove idle function for playing capture sound */
do {