*/
int legacy_camera_stop_face_detection(camera_h camera);
+/**
+ * @brief Sets the buffer fd allocated by user to use as preview buffer.
+ * @param[in] camera The handle to the camera
+ * @param[in] fds The buffer fd
+ * @param[in] number The number of buffer
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #CAMERA_ERROR_NONE Successful
+ * @retval #CAMERA_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #CAMERA_ERROR_INVALID_STATE Invalid state
+ * @retval #CAMERA_ERROR_NOT_SUPPORTED The feature is not supported
+ * @pre The camera state must be set to #CAMERA_STATE_CREATED.
+ */
+int legacy_camera_set_user_buffer(camera_h camera, int *fds, int number);
+
/**
* @}
*/
*/
bool legacy_camera_attr_is_supported_auto_contrast(camera_h camera);
+/**
+ * @brief Gets state of support of user buffer.
+ * @ingroup CAPI_MEDIA_CAMERA_CAPABILITY_MODULE
+ * @remarks The specific error code can be obtained using the get_last_result() method. Error codes are described in Exception section.
+ * @param[in] camera The handle to the camera
+ * @return true on supported, otherwise false
+ * @exception #CAMERA_ERROR_NONE Successful
+ * @exception #CAMERA_ERROR_INVALID_PARAMETER Invalid parameter
+ */
+bool legacy_camera_attr_is_supported_user_buffer(camera_h camera);
+
/**
* @}
*/
}
+bool legacy_camera_attr_is_supported_user_buffer(camera_h camera)
+{
+ if (camera == NULL) {
+ LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+ return false;
+ }
+
+ int is_supported;
+ int ret = MM_ERROR_NONE;
+ camera_s *handle = (camera_s *)camera;
+
+ ret = mm_camcorder_get_attributes(handle->mm_handle, NULL,
+ MMCAM_SUPPORT_USER_BUFFER, &is_supported,
+ NULL);
+ set_last_result(__convert_camera_error_code(__func__, ret));
+ if (ret != MM_ERROR_NONE) {
+ LOGE("MMCAM_SUPPORT_USER_BUFFER get attr failed");
+ return false;
+ }
+
+ return (bool)is_supported;
+}
+
+
int legacy_camera_attr_disable_shutter_sound(camera_h camera, bool disable)
{
if (camera == NULL) {
return;
}
+
+
+int legacy_camera_set_user_buffer(camera_h camera, int *fds, int number)
+{
+ int ret = MM_ERROR_NONE;
+ camera_s *handle = NULL;
+
+ if (camera == NULL) {
+ LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+ return CAMERA_ERROR_INVALID_PARAMETER;
+ }
+
+ if (!fds || number < 1) {
+ LOGE("invalid fds %p or number %d", fds, number);
+ return CAMERA_ERROR_INVALID_PARAMETER;
+ }
+
+ handle = (camera_s *)camera;
+
+ LOGD("number - %d", number);
+
+ ret = mm_camcorder_set_attributes(handle->mm_handle, NULL,
+ MMCAM_USER_BUFFER_FD, (void *)fds, number,
+ NULL);
+
+ return __convert_camera_error_code(__func__, ret);
+}
+
static void __camera_task_process_job(muse_camera_handle_s *muse_camera, muse_camera_task_job_s *job)
{
+ int i = 0;
int ret = CAMERA_ERROR_NONE;
if (!muse_camera) {
switch (job->api) {
case MUSE_CAMERA_API_STOP_PREVIEW:
ret = legacy_camera_stop_preview(muse_camera->camera_handle);
+
+ if (ret == CAMERA_ERROR_NONE && muse_camera->fd_number > 0) {
+ for (i = 0 ; i < muse_camera->fd_number ; i++) {
+ LOGD("close user buffer fd[%d] %d", i, muse_camera->fds[i]);
+ close(muse_camera->fds[i]);
+ muse_camera->fds[i] = -1;
+ }
+ muse_camera->fd_number = 0;
+ }
break;
case MUSE_CAMERA_API_START_CAPTURE:
ret = legacy_camera_start_capture(muse_camera->camera_handle,
int camera_dispatcher_create(muse_module_h module)
{
int ret = CAMERA_ERROR_NONE;
- int device_type;
+ int device_type = 0;
+ int preview_format = CAMERA_PIXEL_FORMAT_INVALID;
+ int user_buffer_supported = 0;
int pid = 0;
bool camera_feature_supported = false;
+ char *send_msg = NULL;
void *gdbus_connection = NULL;
muse_camera_handle_s *muse_camera = NULL;
muse_camera_api_e api = MUSE_CAMERA_API_CREATE;
goto _CREATE_ERROR;
}
+ ret = legacy_camera_get_preview_format(muse_camera->camera_handle, &preview_format);
+ if (ret != CAMERA_ERROR_NONE) {
+ LOGE("legacy_camera_get_preview_format failed : 0x%x", ret);
+ goto _CREATE_ERROR;
+ }
+
+ user_buffer_supported = legacy_camera_attr_is_supported_user_buffer(muse_camera->camera_handle);
+
g_mutex_init(&muse_camera->list_lock);
g_cond_init(&muse_camera->list_cond);
g_mutex_init(&muse_camera->preview_cb_lock);
muse_camera->preview_cb_flag = 0;
muse_camera->module = module;
- LOGD("handle : %p", muse_camera);
+ LOGD("handle : %p, user buffer %d", muse_camera, user_buffer_supported);
muse_server_ipc_set_handle(module, (intptr_t)muse_camera);
- muse_camera_msg_return1(api, class, ret, module, MUSE_CAMERA_GET_TYPE_POINTER, -1, "handle", 0, muse_camera);
+
+ send_msg = muse_core_msg_new(api,
+ MUSE_TYPE_INT, PARAM_API_CLASS, class,
+ MUSE_TYPE_INT, PARAM_RET, ret,
+ MUSE_TYPE_INT, "preview_format", preview_format,
+ MUSE_TYPE_INT, "user_buffer_supported", user_buffer_supported,
+ MUSE_TYPE_POINTER, "handle", muse_camera,
+ 0);
+
+ __camera_dispatcher_send_msg(module, send_msg, NULL);
return MUSE_CAMERA_ERROR_NONE;
int camera_dispatcher_start_preview(muse_module_h module)
{
+ int i = 0;
int ret = CAMERA_ERROR_NONE;
int client_fd = -1;
+ int fds[MUSE_NUM_FD] = {-1, -1, -1, -1};
+ int fd_number = 0;
muse_camera_handle_s *muse_camera = NULL;
muse_camera_api_e api = MUSE_CAMERA_API_START_PREVIEW;
muse_camera_api_class_e class = MUSE_CAMERA_API_CLASS_IMMEDIATE;
return MUSE_CAMERA_ERROR_INVALID;
}
- ret = legacy_camera_start_preview(muse_camera->camera_handle);
+ /* get user buffer fd */
+ if (muse_server_ipc_get_fds(module, fds, &fd_number) == MM_ERROR_NONE) {
+ /* set user buffer */
+ if (fd_number > 0) {
+ ret = legacy_camera_set_user_buffer(muse_camera->camera_handle, fds, fd_number);
+ LOGD("fd number %d, ret 0x%x", fd_number, ret);
+ }
+ }
+
+ ret |= legacy_camera_start_preview(muse_camera->camera_handle);
muse_camera_msg_return(api, class, ret, module);
+ /* fd handling */
+ if (fd_number > 0) {
+ if (ret == CAMERA_ERROR_NONE) {
+ /* set fd and number */
+ for (i = 0 ; i < fd_number ; i++)
+ muse_camera->fds[i] = fds[i];
+
+ muse_camera->fd_number = fd_number;
+ } else {
+ /* close exported fd */
+ for (i = 0 ; i < fd_number ; i++) {
+ LOGE("[PREVIEW FAILED] close exported fds[%d] %d", i, fds[i]);
+ close(fds[i]);
+ }
+
+ muse_camera->fd_number = 0;
+ }
+ }
+
return MUSE_CAMERA_ERROR_NONE;
}