[Release version 0.2.54] Add New APIs - Pan, Tilt, Display ROI Area. 70/66270/19
authorHaesu Gwon <haesu.gwon@samsung.com>
Mon, 18 Apr 2016 06:50:22 +0000 (15:50 +0900)
committerHaesu Gwon <haesu.gwon@samsung.com>
Thu, 28 Apr 2016 08:08:15 +0000 (17:08 +0900)
Change-Id: I1b785cb490bdca267e9a9117048f786b6960c74e
Signed-off-by: Haesu Gwon <haesu.gwon@samsung.com>
include/camera.h
packaging/capi-media-camera.spec
src/camera.c
test/camera_test.c

index a702ff4..4d76985 100644 (file)
@@ -282,10 +282,12 @@ typedef void *camera_display_h;
  * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef enum {
-       CAMERA_DISPLAY_MODE_LETTER_BOX = 0,    /**< Letter box */
-       CAMERA_DISPLAY_MODE_ORIGIN_SIZE,       /**< Origin size */
-       CAMERA_DISPLAY_MODE_FULL,              /**< Full screen */
-       CAMERA_DISPLAY_MODE_CROPPED_FULL,      /**< Cropped full screen */
+       CAMERA_DISPLAY_MODE_LETTER_BOX = 0,       /**< Letter box */
+       CAMERA_DISPLAY_MODE_ORIGIN_SIZE,          /**< Origin size */
+       CAMERA_DISPLAY_MODE_FULL,                 /**< Full screen */
+       CAMERA_DISPLAY_MODE_CROPPED_FULL,         /**< Cropped full screen */
+       CAMERA_DISPLAY_MODE_ORIGIN_OR_LETTER_BOX, /**< Original size or letter box (Since 3.0) */
+       CAMERA_DISPLAY_MODE_CUSTOM_ROI,           /**< Custom ROI (Since 3.0) */
 } camera_display_mode_e;
 
 /**
@@ -482,6 +484,24 @@ typedef enum {
        CAMERA_ATTR_HDR_MODE_KEEP_ORIGINAL /**< Enable HDR capture and keep original image data */
 } camera_attr_hdr_mode_e;
 
+/**
+ * @brief Enumeration for PTZ(Pan Tilt Zoom) type.
+ * @since_tizen 3.0
+ */
+typedef enum {
+       CAMERA_ATTR_PTZ_TYPE_MECHANICAL = 0,  /**< Move the camera device physically */
+       CAMERA_ATTR_PTZ_TYPE_ELECTRONIC       /**< Zoom digitally and move into portion of the image */
+} camera_attr_ptz_type_e;
+
+/**
+ * @brief Enumeration for PTZ(Pan Tilt Zoom) movement type.
+ * @since_tizen 3.0
+ */
+typedef enum {
+       CAMERA_ATTR_PTZ_MOVE_ABSOLUTE = 0,  /**< Move to a specific coordinate position */
+       CAMERA_ATTR_PTZ_MOVE_RELATIVE       /**< Move a specific distance from the current position */
+} camera_attr_ptz_move_type_e;
+
 
 /**
  * @}
@@ -1517,7 +1537,7 @@ int camera_get_flash_state(camera_device_e device, camera_flash_state_e *state);
  * @retval #CAMERA_ERROR_INVALID_PARAMETER Invalid parameter
  * @retval #CAMERA_ERROR_PERMISSION_DENIED The access to the resources can not be granted
  * @retval #CAMERA_ERROR_NOT_SUPPORTED The feature is not supported
- * @post This function invokes camera_supported_preview_format_cb() repeatly to retrieve each supported preview format.
+ * @post This function invokes camera_supported_preview_format_cb() repeatedly to retrieve each supported preview format.
  * @see        camera_set_preview_format()
  * @see        camera_get_preview_format()
  * @see        camera_supported_preview_format_cb()
@@ -1603,7 +1623,7 @@ bool camera_is_supported_media_packet_preview_cb(camera_h camera);
  *          This function should be called before previewing (see camera_start_preview()).\n
  *          A registered callback is called on the internal thread of the camera.\n
  *          A video frame can be retrieved using a registered callback,\n
- *          and the buffer is only available in a registerd callback.\n
+ *          and the buffer is only available in a registered callback.\n
  *          Since tizen 3.0, if you change the buffer in a registered callback,\n
  *          it could not be displayed on the device in case of copied buffer.\n
  *          and if camera_is_supported_media_packet_preview_cb() returns false,\n
@@ -1644,7 +1664,7 @@ int camera_unset_preview_cb(camera_h camera);
  *          A registered callback is called on the internal thread of the camera.\n
  *          A video frame can be retrieved using a registered callback as a media packet.\n
  *          The callback function holds the same buffer that will be drawn on the display device.\n
- *          So if you change the media packet in a registerd callback, it will be displayed on the device\n
+ *          So if you change the media packet in a registered callback, it will be displayed on the device\n
  *          and the media packet is available until it's destroyed by media_packet_destroy().
  * @param[in] camera The handle to the camera
  * @param[in] callback The callback function to be registered
@@ -1937,6 +1957,18 @@ typedef bool (*camera_attr_supported_stream_rotation_cb)(camera_rotation_e rotat
 typedef bool (*camera_attr_supported_theater_mode_cb)(camera_attr_theater_mode_e mode, void *user_data);
 
 /**
+ * @brief Called to get each supported PTZ(Pan Tilt Zoom) type.
+ * @since_tizen 3.0
+ * @param[in] type The supported ptz type
+ * @param[in] user_data The user data passed from the foreach function
+ * @return @c true to continue with the next iteration of the loop, \n @c false to break out of the loop
+ * @pre        camera_attr_foreach_supported_ptz_mode() will invoke this callback.
+ * @see        camera_attr_foreach_supported_ptz_mode()
+ */
+typedef bool (*camera_attr_supported_ptz_type_cb)(camera_attr_ptz_type_e type, void *user_data);
+
+
+/**
  * @}
  */
 
@@ -1998,7 +2030,7 @@ int camera_attr_get_preview_fps(camera_h camera, camera_attr_fps_e *fps);
  * @retval #CAMERA_ERROR_INVALID_PARAMETER Invalid parameter
  * @retval #CAMERA_ERROR_PERMISSION_DENIED The access to the resources can not be granted
  * @retval #CAMERA_ERROR_NOT_SUPPORTED The feature is not supported
- * @post This function invokes camera_attr_supported_fps_cb() repeatly to get each supported FPS mode.
+ * @post This function invokes camera_attr_supported_fps_cb() repeatedly to get each supported FPS mode.
  * @see        camera_attr_set_preview_fps()
  * @see        camera_attr_get_preview_fps()
  * @see        camera_attr_supported_fps_cb()
@@ -2020,7 +2052,7 @@ int camera_attr_foreach_supported_fps(camera_h camera, camera_attr_supported_fps
  * @retval #CAMERA_ERROR_INVALID_PARAMETER Invalid parameter
  * @retval #CAMERA_ERROR_PERMISSION_DENIED The access to the resources can not be granted
  * @retval #CAMERA_ERROR_NOT_SUPPORTED The feature is not supported
- * @post This function invokes camera_attr_supported_fps_cb() repeatly to get each supported FPS mode.
+ * @post This function invokes camera_attr_supported_fps_cb() repeatedly to get each supported FPS mode.
  * @see        camera_attr_set_preview_fps()
  * @see        camera_attr_get_preview_fps()
  * @see        camera_attr_supported_fps_cb()
@@ -2492,7 +2524,7 @@ int camera_attr_set_theater_mode(camera_h camera, camera_attr_theater_mode_e mod
  * @brief Gets the theater mode.
  * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  * @param[in] camera The handle to the camera
- * @param[in] mode Currnet theater mode
+ * @param[in] mode Current theater mode
  * @return @c 0 on success, otherwise a negative error value
  * @retval #CAMERA_ERROR_NONE Successful
  * @retval #CAMERA_ERROR_INVALID_PARAMETER Invalid parameter
@@ -3508,6 +3540,191 @@ bool camera_attr_is_supported_auto_contrast(camera_h camera);
 int camera_attr_disable_shutter_sound(camera_h camera, bool disable);
 
 /**
+ * @brief Sets the position to move horizontally.
+ * @since_tizen 3.0
+ * @param[in] camera The handle to the camera
+ * @param[in] move_type The PTZ(Pan Tilt Zoom) move type
+ * @param[in] pan_step The step to move the camera
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #CAMERA_ERROR_NONE Successful
+ * @retval #CAMERA_ERROR_INVALID_OPERATION Internal error
+ * @retval #CAMERA_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #CAMERA_ERROR_NOT_SUPPORTED The feature is not supported
+ * @see camera_attr_get_pan()
+ * @see camera_attr_get_pan_range()
+ */
+int camera_attr_set_pan(camera_h camera, camera_attr_ptz_move_type_e move_type, int pan_step);
+
+/**
+ * @brief Gets the current position of the camera.
+ * @since_tizen 3.0
+ * @param[in] camera The handle to the camera
+ * @param[out] pan_step The current horizontal distance from the starting point.
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #CAMERA_ERROR_NONE Successful
+ * @retval #CAMERA_ERROR_INVALID_OPERATION Internal error
+ * @retval #CAMERA_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #CAMERA_ERROR_NOT_SUPPORTED The feature is not supported
+ * @see camera_attr_set_pan()
+ * @see camera_attr_get_pan_range()
+ */
+int camera_attr_get_pan(camera_h camera, int *pan_step);
+
+/**
+ * @brief Gets lower limit and upper limit for pan position.
+ * @since_tizen 3.0
+ * @remarks If the min value is greater than the max value, it means that this feature is not supported.
+ * @param[in] camera The handle to the camera
+ * @param[out] min The lower limit for pan
+ * @param[out] max The upper limit for pan
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #CAMERA_ERROR_NONE Successful
+ * @retval #CAMERA_ERROR_INVALID_OPERATION Internal error
+ * @retval #CAMERA_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #CAMERA_ERROR_NOT_SUPPORTED The feature is not supported
+ * @see camera_attr_set_pan()
+ * @see camera_attr_get_pan()
+ */
+int camera_attr_get_pan_range(camera_h camera, int *min, int *max);
+
+/**
+ * @brief Sets the position to move vertically.
+ * @since_tizen 3.0
+ * @param[in] camera The handle to the camera
+ * @param[in] move_type The PTZ(Pan Tilt Zoom) move type
+ * @param[in] tilt_step The step to move the camera
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #CAMERA_ERROR_NONE Successful
+ * @retval #CAMERA_ERROR_INVALID_OPERATION Internal error
+ * @retval #CAMERA_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #CAMERA_ERROR_NOT_SUPPORTED The feature is not supported
+ * @see camera_attr_get_tilt()
+ * @see camera_attr_get_tilt_range()
+ */
+int camera_attr_set_tilt(camera_h camera, camera_attr_ptz_move_type_e move_type, int tilt_step);
+
+/**
+ * @brief Gets the current position of the camera.
+ * @since_tizen 3.0
+ * @param[in] camera The handle to the camera
+ * @param[out] tilt_step The current vertical distance from the starting point.
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #CAMERA_ERROR_NONE Successful
+ * @retval #CAMERA_ERROR_INVALID_OPERATION Internal error
+ * @retval #CAMERA_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #CAMERA_ERROR_NOT_SUPPORTED The feature is not supported
+ * @see camera_attr_set_tilt()
+ * @see camera_attr_get_tilt_range()
+ */
+int camera_attr_get_tilt(camera_h camera, int *tilt_step);
+
+/**
+ * @brief Gets lower limit and upper limit for tilt position.
+ * @since_tizen 3.0
+ * @remarks If the min value is greater than the max value, it means that this feature is not supported.
+ * @param[in] camera The handle to the camera
+ * @param[out] min The lower limit for tilt
+ * @param[out] max The upper limit for tilt
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #CAMERA_ERROR_NONE Successful
+ * @retval #CAMERA_ERROR_INVALID_OPERATION Internal error
+ * @retval #CAMERA_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #CAMERA_ERROR_NOT_SUPPORTED The feature is not supported
+ * @see camera_attr_set_tilt()
+ * @see camera_attr_get_tilt()
+ */
+int camera_attr_get_tilt_range(camera_h camera, int *min, int *max);
+
+/**
+ * @brief Sets the type of PTZ(Pan Tilt Zoom).
+ * @since_tizen 3.0
+ * @param[in] camera The handle to the camera
+ * @param[in] ptz_type PTZ type
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #CAMERA_ERROR_NONE Successful
+ * @retval #CAMERA_ERROR_INVALID_OPERATION Internal error
+ * @retval #CAMERA_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #CAMERA_ERROR_NOT_SUPPORTED The feature is not supported
+ * @see camera_attr_get_pan()
+ * @see camera_attr_set_pan()
+ * @see camera_attr_get_pan_range()
+ * @see camera_attr_get_tilt()
+ * @see camera_attr_set_tilt()
+ * @see camera_attr_get_tilt_range()
+ * @see camera_attr_foreach_supported_ptz_type()
+ */
+int camera_attr_set_ptz_type(camera_h camera, camera_attr_ptz_type_e ptz_type);
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup CAPI_MEDIA_CAMERA_CAPABILITY_MODULE
+ * @{
+ */
+
+/**
+ * @brief Retrieves all supported PTZ(Pan Tilt Zoom) types by invoking callback function once for each supported ptz type.
+ * @since_tizen 3.0
+ * @param[in] camera The handle to the camera
+ * @param[in] callback The callback function to invoke
+ * @param[in] user_data The user data to be passed to the callback function
+ * @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_PERMISSION_DENIED The access to the resources can not be granted
+ * @retval #CAMERA_ERROR_NOT_SUPPORTED The feature is not supported
+ * @post This function invokes camera_attr_supported_ptz_type_cb() to get all supported ptz type.
+ * @see camera_attr_set_ptz_type()
+ */
+int camera_attr_foreach_supported_ptz_type(camera_h camera, camera_attr_supported_ptz_type_cb callback, void *user_data);
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup CAPI_MEDIA_CAMERA_ATTRIBUTES_MODULE
+ * @{
+ */
+
+/**
+ * @brief Sets the ROI(Region Of Interest) area of display.
+ * @since_tizen 3.0
+ * @remarks Before set display ROI area, #CAMERA_DISPLAY_MODE_CUSTOM_ROI should be set with camera_set_display_mode().
+ * @param[in] camera The handle to the camera
+ * @param[in] x X coordinate of area
+ * @param[in] y Y coordinate of area
+ * @param[in] width Width of area
+ * @param[in] height Height of area
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #CAMERA_ERROR_NONE Successful
+ * @retval #CAMERA_ERROR_INVALID_OPERATION Internal error
+ * @retval #CAMERA_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #CAMERA_ERROR_NOT_SUPPORTED The feature is not supported
+ * @see camera_attr_get_display_roi_area()
+ */
+int camera_attr_set_display_roi_area(camera_h camera, int x, int y, int width, int height);
+
+/**
+ * @brief Gets the ROI(Region Of Interest) area of display.
+ * @since_tizen 3.0
+ * @param[in] camera The handle to the camera
+ * @param[out] x X coordinate of area
+ * @param[out] y Y coordinate of area
+ * @param[out] width Width of area
+ * @param[out] height Height of area
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #CAMERA_ERROR_NONE Successful
+ * @retval #CAMERA_ERROR_INVALID_OPERATION Internal error
+ * @retval #CAMERA_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #CAMERA_ERROR_NOT_SUPPORTED The feature is not supported
+ * @see camera_attr_set_display_roi_area()
+ */
+int camera_attr_get_display_roi_area(camera_h camera, int *x, int *y, int *width, int *height);
+
+/**
  * @}
  */
 #ifdef __cplusplus
index d446b7b..68df13c 100644 (file)
@@ -3,7 +3,7 @@
 
 Name:       capi-media-camera
 Summary:    A Camera API
-Version:    0.2.53
+Version:    0.2.54
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 26cfc1b..c63561d 100644 (file)
@@ -1235,6 +1235,17 @@ static void _client_user_callback(camera_cb_info_s *cb_info, char *recv_msg, mus
                        LOGD("stop foreach callback for SUPPORTED_THEATER_MODE");
                }
                break;
+       case MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_PTZ_TYPE:
+               muse_camera_msg_get(param1, recv_msg);
+
+               LOGD("SUPPORTED_PTZ_TYPE - %d ", param1);
+
+               if (((camera_attr_supported_ptz_type_cb)cb_info->user_cb[event])((camera_attr_ptz_type_e)param1, cb_info->user_data[event]) == false) {
+                       cb_info->user_cb[event] = NULL;
+                       cb_info->user_data[event] = NULL;
+                       LOGD("stop foreach callback for SUPPORTED_PTZ_TYPE");
+               }
+               break;
        case MUSE_CAMERA_EVENT_TYPE_CAPTURE:
                {
                        camera_image_data_s *rImage = NULL;
@@ -3109,7 +3120,7 @@ int camera_set_display_mode(camera_h camera, camera_display_mode_e mode)
                return CAMERA_ERROR_INVALID_PARAMETER;
        }
 
-       if (mode < CAMERA_DISPLAY_MODE_LETTER_BOX || mode > CAMERA_DISPLAY_MODE_CROPPED_FULL) {
+       if (mode < CAMERA_DISPLAY_MODE_LETTER_BOX || mode > CAMERA_DISPLAY_MODE_CUSTOM_ROI) {
                LOGE("Invalid mode %d", mode);
                return CAMERA_ERROR_INVALID_PARAMETER;
        }
@@ -5177,6 +5188,7 @@ int camera_attr_get_flash_mode(camera_h camera,  camera_attr_flash_mode_e *mode)
        return ret;
 }
 
+
 int camera_get_flash_state(camera_device_e device, camera_flash_state_e *state)
 {
        int sock_fd = -1;
@@ -5247,6 +5259,7 @@ Exit:
        return ret;
 }
 
+
 int camera_attr_foreach_supported_af_mode(camera_h camera, camera_attr_supported_af_mode_cb foreach_cb, void *user_data)
 {
        if (camera == NULL || foreach_cb == NULL) {
@@ -6069,3 +6082,322 @@ int camera_attr_disable_shutter_sound(camera_h camera, bool disable)
        LOGD("ret : 0x%x", ret);
        return ret;
 }
+
+
+int camera_attr_set_pan(camera_h camera, camera_attr_ptz_move_type_e move_type, int pan_step)
+{
+       if (camera == NULL) {
+               LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       camera_cli_s *pc = (camera_cli_s *)camera;
+       if (pc->cb_info == NULL) {
+               LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       int ret = CAMERA_ERROR_NONE;
+       int sock_fd = pc->cb_info->fd;
+       int set_move_type = (int)move_type;
+       int set_pan_step = pan_step;
+       muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_PAN;
+
+       LOGD("Enter, remote_handle : %x", pc->remote_handle);
+       muse_camera_msg_send2(api, sock_fd, pc->cb_info, ret, INT, set_move_type, INT, set_pan_step);
+       LOGD("ret : 0x%x", ret);
+       return ret;
+}
+
+
+int camera_attr_get_pan(camera_h camera, int *pan_step)
+{
+       if (camera == NULL || pan_step == NULL) {
+               LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       camera_cli_s *pc = (camera_cli_s *)camera;
+       if (pc->cb_info == NULL) {
+               LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       int ret = CAMERA_ERROR_NONE;
+       int sock_fd = pc->cb_info->fd;
+       int get_pan_step;
+       muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_PAN;
+
+       LOGD("Enter, remote_handle : %x", pc->remote_handle);
+       muse_camera_msg_send(api, sock_fd, pc->cb_info, ret);
+
+       if (ret == CAMERA_ERROR_NONE) {
+               muse_camera_msg_get(get_pan_step, pc->cb_info->recv_msg);
+               *pan_step = get_pan_step;
+       }
+       LOGD("ret : 0x%x", ret);
+       return ret;
+}
+
+
+int camera_attr_get_pan_range(camera_h camera, int *min, int *max)
+{
+       if (camera == NULL || min == NULL || max == NULL) {
+               LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       camera_cli_s *pc = (camera_cli_s *)camera;
+       if (pc->cb_info == NULL) {
+               LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       int ret = CAMERA_ERROR_NONE;
+       int sock_fd = pc->cb_info->fd;
+       int get_min;
+       int get_max;
+       muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_PAN_RANGE;
+
+       LOGD("Enter, remote_handle : %x", pc->remote_handle);
+       muse_camera_msg_send(api, sock_fd, pc->cb_info, ret);
+
+       if (ret == CAMERA_ERROR_NONE) {
+               muse_camera_msg_get(get_min, pc->cb_info->recv_msg);
+               muse_camera_msg_get(get_max, pc->cb_info->recv_msg);
+               *min = get_min;
+               *max = get_max;
+       }
+       LOGD("ret : 0x%x", ret);
+       return ret;
+}
+
+
+int camera_attr_set_tilt(camera_h camera, camera_attr_ptz_move_type_e move_type, int tilt_step)
+{
+       if (camera == NULL) {
+               LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       camera_cli_s *pc = (camera_cli_s *)camera;
+       if (pc->cb_info == NULL) {
+               LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       int ret = CAMERA_ERROR_NONE;
+       int sock_fd = pc->cb_info->fd;
+       int set_move_type = (int)move_type;
+       int set_tilt_step = tilt_step;
+       muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_TILT;
+
+       LOGD("Enter, remote_handle : %x", pc->remote_handle);
+       muse_camera_msg_send2(api, sock_fd, pc->cb_info, ret, INT, set_move_type, INT, set_tilt_step);
+       LOGD("ret : 0x%x", ret);
+       return ret;
+}
+
+
+int camera_attr_get_tilt(camera_h camera, int *tilt_step)
+{
+       if (camera == NULL || tilt_step == NULL) {
+               LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       camera_cli_s *pc = (camera_cli_s *)camera;
+       if (pc->cb_info == NULL) {
+               LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       int ret = CAMERA_ERROR_NONE;
+       int sock_fd = pc->cb_info->fd;
+       int get_tilt_step;
+       muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_TILT;
+
+       LOGD("Enter, remote_handle : %x", pc->remote_handle);
+       muse_camera_msg_send(api, sock_fd, pc->cb_info, ret);
+
+       if (ret == CAMERA_ERROR_NONE) {
+               muse_camera_msg_get(get_tilt_step, pc->cb_info->recv_msg);
+               *tilt_step = get_tilt_step;
+       }
+       LOGD("ret : 0x%x", ret);
+       return ret;
+}
+
+
+int camera_attr_get_tilt_range(camera_h camera, int *min, int *max)
+{
+       if (camera == NULL || min == NULL || max == NULL) {
+               LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       camera_cli_s *pc = (camera_cli_s *)camera;
+       if (pc->cb_info == NULL) {
+               LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       int ret = CAMERA_ERROR_NONE;
+       int sock_fd = pc->cb_info->fd;
+       int get_min;
+       int get_max;
+       muse_camera_api_e api = MUSE_CAMERA_API_ATTR_GET_TILT_RANGE;
+
+       LOGD("Enter, remote_handle : %x", pc->remote_handle);
+       muse_camera_msg_send(api, sock_fd, pc->cb_info, ret);
+
+       if (ret == CAMERA_ERROR_NONE) {
+               muse_camera_msg_get(get_min, pc->cb_info->recv_msg);
+               muse_camera_msg_get(get_max, pc->cb_info->recv_msg);
+               *min = get_min;
+               *max = get_max;
+       }
+       LOGD("ret : 0x%x", ret);
+       return ret;
+}
+
+
+int camera_attr_set_ptz_type(camera_h camera, camera_attr_ptz_type_e ptz_type)
+{
+       if (camera == NULL) {
+               LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       camera_cli_s *pc = (camera_cli_s *)camera;
+       if (pc->cb_info == NULL) {
+               LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       int ret = CAMERA_ERROR_NONE;
+       int sock_fd = pc->cb_info->fd;
+       int set_ptz_type = (int)ptz_type;
+       muse_camera_api_e api = MUSE_CAMERA_API_ATTR_SET_PTZ_TYPE;
+
+       LOGD("Enter, remote_handle : %x", pc->remote_handle);
+       muse_camera_msg_send1(api, sock_fd, pc->cb_info, ret, INT, set_ptz_type);
+       LOGD("ret : 0x%x", ret);
+       return ret;
+}
+
+
+int camera_attr_foreach_supported_ptz_type(camera_h camera, camera_attr_supported_ptz_type_cb foreach_cb, void *user_data)
+{
+       if (camera == NULL || foreach_cb == NULL) {
+               LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+       int ret = CAMERA_ERROR_NONE;
+
+       camera_cli_s *pc = (camera_cli_s *)camera;
+       muse_camera_api_e api = MUSE_CAMERA_API_ATTR_FOREACH_SUPPORTED_PTZ_TYPE;
+       int sock_fd;
+       if (pc->cb_info == NULL) {
+               LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+       sock_fd = pc->cb_info->fd;
+       LOGD("Enter, handle :%x", pc->remote_handle);
+       pc->cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_PTZ_TYPE] = foreach_cb;
+       pc->cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_FOREACH_SUPPORTED_PTZ_TYPE] = user_data;
+
+       muse_camera_msg_send(api, sock_fd, pc->cb_info, ret);
+       LOGD("ret : 0x%x", ret);
+       return ret;
+}
+
+
+int camera_attr_set_display_roi_area(camera_h camera, int x, int y, int width, int height)
+{
+       if (camera == NULL) {
+               LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       camera_cli_s *pc = (camera_cli_s *)camera;
+       if (pc->cb_info == NULL) {
+               LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       int ret = CAMERA_ERROR_NONE;
+       int sock_fd = pc->cb_info->fd;
+       int set_display_roi_area[4] = {x, y, width, height};
+       muse_camera_api_e api = MUSE_CAMERA_API_SET_DISPLAY_ROI_AREA;
+
+       if(CHECK_PREVIEW_CB(pc->cb_info, PREVIEW_CB_TYPE_EVAS)) {
+               g_mutex_lock(&pc->cb_info->evas_mutex);
+
+               ret = mm_evas_renderer_set_roi_area(pc->cb_info->evas_info, x, y, width, height);
+
+               g_mutex_unlock(&pc->cb_info->evas_mutex);
+
+               if (ret != MM_ERROR_NONE) {
+                       LOGE("mm_evas_renderer_set_roi_area error 0x%x", ret);
+                       return CAMERA_ERROR_INVALID_OPERATION;
+               }
+       } else {
+               LOGD("Enter, remote_handle : %x", pc->remote_handle);
+               muse_camera_msg_send_array(api, sock_fd, pc->cb_info, ret,
+                       set_display_roi_area, sizeof(set_display_roi_area), sizeof(int));
+               LOGD("ret : 0x%x", ret);
+       }
+
+       return ret;
+}
+
+
+int camera_attr_get_display_roi_area(camera_h camera, int *x, int *y, int *width, int *height)
+{
+       if (camera == NULL || x == NULL || y == NULL || width == NULL || height == NULL) {
+               LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       camera_cli_s *pc = (camera_cli_s *)camera;
+       if (pc->cb_info == NULL) {
+               LOGE("INVALID_PARAMETER(0x%08x)", CAMERA_ERROR_INVALID_PARAMETER);
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       int ret = CAMERA_ERROR_NONE;
+       int sock_fd = pc->cb_info->fd;
+       int get_display_roi_area[4] = {0,};
+       muse_camera_api_e api = MUSE_CAMERA_API_GET_DISPLAY_ROI_AREA;
+
+       if(CHECK_PREVIEW_CB(pc->cb_info, PREVIEW_CB_TYPE_EVAS)) {
+               g_mutex_lock(&pc->cb_info->evas_mutex);
+
+               ret = mm_evas_renderer_get_roi_area(pc->cb_info->evas_info, x, y, width, height);
+
+               g_mutex_unlock(&pc->cb_info->evas_mutex);
+
+               if (ret != MM_ERROR_NONE) {
+                       LOGE("mm_evas_renderer_get_roi_area error 0x%x", ret);
+                       return CAMERA_ERROR_INVALID_OPERATION;
+               }
+       } else {
+               LOGD("Enter, remote_handle : %x", pc->remote_handle);
+               muse_camera_msg_send(api, sock_fd, pc->cb_info, ret);
+
+               if (ret == CAMERA_ERROR_NONE) {
+                       muse_camera_msg_get_array(get_display_roi_area, pc->cb_info->recv_msg);
+                       *x = get_display_roi_area[0];
+                       *y = get_display_roi_area[1];
+                       *width = get_display_roi_area[2];
+                       *height = get_display_roi_area[3];
+
+                       LOGD("ret : 0x%x", ret);
+               } else {
+                       LOGE("Returned value is not valid : 0x%x", ret);
+               }
+       }
+
+       return ret;
+}
index a4d0d3e..c9ec498 100644 (file)
@@ -712,6 +712,7 @@ static void print_menu()
                g_print("\t     't' Color tone \n");
                g_print("\t     'd' WDR \n");
                g_print("\t     'e' EV program mode \n");
+               g_print("\t     'R' Display ROI area \n");
                g_print("\t  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [etc.]\n");
                g_print("\t     'z' Strobe (Flash) \n");
                g_print("\t     'S' Strobe (Flash) state\n");
@@ -720,6 +721,7 @@ static void print_menu()
                g_print("\t     'k' Anti-handshake \n");
                g_print("\t     'K' Video-stabilization \n");
                g_print("\t     'u' Touch AF area \n");
+
                g_print("\t     'b' back\n");
                g_print("\t=======================================\n");
                break;
@@ -1068,6 +1070,21 @@ static void setting_menu(gchar buf)
                        err = scanf("%d", &idx);
                        bret = camera_attr_set_scene_mode(hcamcorder->camera, idx);
                        break;
+               case 'R': /* Setting > Display ROI area */
+                       g_print("* Set display roi area. Select x y width height \n");
+                       flush_stdin();
+                       err = scanf("%d %d %d %d", &x, &y, &width, &height);
+                       camera_set_display_mode(hcamcorder->camera, CAMERA_DISPLAY_MODE_CUSTOM_ROI);
+                       err = camera_attr_set_display_roi_area(hcamcorder->camera, x, y, width, height);
+                       if (CAMERA_ERROR_NONE != err)
+                               g_print("* Error : %d\n", err);
+
+                       err = camera_attr_get_display_roi_area(hcamcorder->camera, &x, &y, &width, &height);
+                       if (CAMERA_ERROR_NONE == err)
+                               g_print("Current display roi area : x %d, y %d, width %d, height %d\n", x, y, width, height);
+                       else
+                               g_print("* Error : %d\n", err);
+                       break;
 
                        /* ext. setting */
                case 'z': /* Setting > Strobe setting */