Thông số điều khiển camera chương trình,Thông số điều khiển camera chương trình

Trong bản phát hành Hệ thống xem mở rộng (EVS) 1.0 trước đó, các thiết bị máy ảnh được coi là thiết bị chỉ đọc và do đó, không có phương pháp nào cho phép ứng dụng thay đổi các thông số điều khiển máy ảnh như thu phóng hoặc độ sáng.

Vì điều này có thể hạn chế khả năng của ứng dụng EVS, EVS 1.1 mới giới thiệu các phương pháp mới và cho phép ứng dụng lập trình một số thông số điều khiển máy ảnh, tất cả đều được xác định trong enum CameraParam :

/**
 * EVS Camera Parameter
 */
enum CameraParam : uint32_t {
    /**
     * The brightness of image frames
     */
    BRIGHTNESS,
    /**
     * The contrast of image frames
     */
    CONTRAST,
    /**
     * Automatic gain/exposure control
     */
    AUTOGAIN,
    /**
     * Gain control
     */
    GAIN,
    /**
     * Automatic Whitebalance
     */
    AUTO_WHITE_BALANCE,
    /**
     * Manual white balance setting as a color temperature in Kelvin.
     */
    WHITE_BALANCE_TEMPERATURE,
    /**
     * Image sharpness adjustment
     */
    SHARPNESS,
    /**
     * Auto Exposure Control modes; auto, manual, shutter priority, or
     * aperture priority.
     */
    AUTO_EXPOSURE,
    /**
     * Manual exposure time of the camera
     */
    ABSOLUTE_EXPOSURE,
    /**
     * Set the focal point of the camera to the specified position. This
     * parameter may not be effective when auto focus is enabled.
     */
    ABSOLUTE_FOCUS,
    /**
     * Enables continuous automatic focus adjustments.
     */
    AUTO_FOCUS,
    /**
     * Specify the objective lens focal length as an absolute value.
     */
    ABSOLUTE_ZOOM,
};

Các phương thức được định nghĩa là:

/**
 * Requests to be a master client.
 *
 * When multiple clients subscribe to a single camera hardware and one of
 * them adjusts a camera parameter such as the contrast, it may disturb
 * other clients' operations. Therefore, the client must call this method
 * to be a master client. When it becomes a master, it can
 * change camera parameters until either it dies or explicitly gives up the
 * role.
 *
 * @return result EvsResult::OK if a master role is granted.
 *                EvsResult::OWNERSHIP_LOST if there is already a
 *                master client.
 */
setMaster() generates (EvsResult result);

/**
 * Sets to be a master client forcibly.
 *
 * The client, which owns the display, has a high priority and can take over
 * a master role from other clients without the display.
 *
 * @param  display IEvsDisplay handle. If this is valid, the calling client
 *                 is considered as the high priority client and therefore
 *                 it would take over a master role.
 *
 * @return result  EvsResult::OK if a master role is granted.
 *                 EvsResult::OWNERSHIP_LOST if there is already a
 *                 master client with the display.
 */
forceMaster(IEvsDisplay display) generates (EvsResult result);

/**
 * Retires from a master client role.
 *
 * @return result EvsResult::OK if this call is successful.
 *                EvsResult::INVALID_ARG if the caller client is not a
 *                master client.
 */
unsetMaster() generates (EvsResult result);

/**
 * Retrieves a list of parameters this camera supports.
 *
 * @return params A list of CameraParam that this camera supports.
 */
getParameterList() generates (vec<CameraParam> params);

/**
 * Requests a valid value range of a camera parameter
 *
 * @param  id    The identifier of camera parameter, CameraParam enum.
 *
 * @return min   The lower bound of the valid parameter value range.
 * @return max   The upper bound of the valid parameter value range.
 * @return step  The resolution of values in valid range.
 */
getIntParameterRange(CameraParam id)
    generates (int32_t min, int32_t max, int32_t step);

/**
 * Requests to set a camera parameter.
 *
 * @param  id             The identifier of camera parameter,
 *                        CameraParam enum.
 *         value          A desired parameter value.
 * @return result         EvsResult::OK if it succeeds to set a parameter.
 *                        EvsResult::INVALID_ARG if either a requested
 *                        parameter is not supported or a given value is out
 *                        of bounds.
 *         effectiveValue A programmed parameter value. This may differ
 *                        from what the client gives if, for example, the
 *                        driver does not support a target parameter.
 */
setIntParameter(CameraParam id, int32_t value)
    generates (EvsResult result, int32_t effectiveValue);

/**
 * Retrieves a value of given camera parameter.
 *
 * @param  id     The identifier of camera parameter, CameraParam enum.
 * @return result EvsResult::OK if it succeeds to read a parameter.
 *                EvsResult::INVALID_ARG if either a requested parameter is
 *                not supported.
 *         value  A value of requested camera parameter.
 */
getIntParameter(CameraParam id) generates(EvsResult result, int32_t value);

getParameterList() trả về danh sách các tham số ( CameraParam enum) mà khách hàng có thể đọc và ghi (nếu khách hàng là chính) và getIntParameterRange() chuyển tiếp phạm vi giá trị hợp lệ và độ phân giải. Khi máy khách chính thay đổi thông số camera, tất cả các máy khách khác trên cùng phần cứng máy ảnh sẽ được thông báo bằng cách nhận sự kiện PARAMETER_CHANGED với ID thông số và giá trị mới.

Lưu ý: Trình điều khiển cảm biến có thể xử lý các giá trị tham số không hợp lệ theo cách khác. Nó có thể chỉ trả về mã lỗi hoặc cắt giá trị trong phạm vi hợp lệ và áp dụng. Do đó, phương thức setIntParameter() trả về giá trị hiệu dụng và máy khách có thể sử dụng giá trị này để xác nhận cách xử lý yêu cầu.

Yêu cầu phân xử giữa nhiều máy khách

Vì thiết kế EVS trước đây cho phép nhiều ứng dụng đăng ký đồng thời vào một phần cứng máy ảnh nên có thể một ứng dụng có thể làm gián đoạn hoạt động của các ứng dụng khác bằng cách thay đổi thông số máy ảnh. Ngoài ra, nhiều khách hàng có thể muốn điều chỉnh cùng một tham số theo cách khác nhau và do đó gây ra các hành vi không mong muốn khi chạy dịch vụ camera.

Để tránh những vấn đề như vậy, trình quản lý EVS chỉ cho phép ứng dụng khách chính đó lập trình thông số camera. Trước khi cố gắng điều chỉnh bất kỳ thông số camera nào, máy khách PHẢI trở thành máy khách chính bằng cách gọi phương thức setMaster() . Nếu điều này không thành công thì có nghĩa là đã có một ứng dụng khách chính đang hoạt động trên phần cứng máy ảnh đó. Cho đến khi máy khách chính hiện tại chết hoặc từ bỏ vai trò chính một cách rõ ràng thông qua unsetMaster() , không máy khách nào khác được phép thay đổi thông số máy ảnh. Khi máy khách chính trả lại đặc quyền của mình, tất cả các ứng dụng khác sẽ được thông báo bằng sự kiện MASTER_RELEASED .

Khách hàng có mức độ ưu tiên cao

Trình quản lý EVS xử lý ứng dụng khách sở hữu màn hình với mức độ ưu tiên cao và cho phép nó chiếm lấy vai trò chính từ ứng dụng chính hiện tại. Vì quyền sở hữu màn hình EVS dựa trên mức độ gần đây nên ứng dụng khách mới thậm chí có thể tiếp quản màn hình từ ứng dụng khách hiện tại.

Các máy khách có mức độ ưu tiên cao phải gọi IEvsCamera::forceMaster(sp<IEvsDisplay>& display) để đạt được vai trò chính. Trình quản lý EVS kiểm tra trạng thái của một bộ điều khiển hiển thị nhất định và nếu ( và chỉ khi ) trạng thái của nó hợp lệ và cả DisplayState::NOT_OPEN hay DisplayState::DEAD không thay thế chính. Máy khách vừa mất vai trò chính sẽ được thông báo bởi sự kiện MASTER_RELEASEDPHẢI xử lý việc này đúng cách.

,

Trong bản phát hành Hệ thống xem mở rộng (EVS) 1.0 trước đó, các thiết bị máy ảnh được coi là thiết bị chỉ đọc và do đó, không có phương pháp nào cho phép ứng dụng thay đổi các thông số điều khiển máy ảnh như thu phóng hoặc độ sáng.

Vì điều này có thể hạn chế khả năng của ứng dụng EVS, EVS 1.1 mới giới thiệu các phương pháp mới và cho phép ứng dụng lập trình một số thông số điều khiển máy ảnh, tất cả đều được xác định trong enum CameraParam :

/**
 * EVS Camera Parameter
 */
enum CameraParam : uint32_t {
    /**
     * The brightness of image frames
     */
    BRIGHTNESS,
    /**
     * The contrast of image frames
     */
    CONTRAST,
    /**
     * Automatic gain/exposure control
     */
    AUTOGAIN,
    /**
     * Gain control
     */
    GAIN,
    /**
     * Automatic Whitebalance
     */
    AUTO_WHITE_BALANCE,
    /**
     * Manual white balance setting as a color temperature in Kelvin.
     */
    WHITE_BALANCE_TEMPERATURE,
    /**
     * Image sharpness adjustment
     */
    SHARPNESS,
    /**
     * Auto Exposure Control modes; auto, manual, shutter priority, or
     * aperture priority.
     */
    AUTO_EXPOSURE,
    /**
     * Manual exposure time of the camera
     */
    ABSOLUTE_EXPOSURE,
    /**
     * Set the focal point of the camera to the specified position. This
     * parameter may not be effective when auto focus is enabled.
     */
    ABSOLUTE_FOCUS,
    /**
     * Enables continuous automatic focus adjustments.
     */
    AUTO_FOCUS,
    /**
     * Specify the objective lens focal length as an absolute value.
     */
    ABSOLUTE_ZOOM,
};

Các phương thức được định nghĩa là:

/**
 * Requests to be a master client.
 *
 * When multiple clients subscribe to a single camera hardware and one of
 * them adjusts a camera parameter such as the contrast, it may disturb
 * other clients' operations. Therefore, the client must call this method
 * to be a master client. When it becomes a master, it can
 * change camera parameters until either it dies or explicitly gives up the
 * role.
 *
 * @return result EvsResult::OK if a master role is granted.
 *                EvsResult::OWNERSHIP_LOST if there is already a
 *                master client.
 */
setMaster() generates (EvsResult result);

/**
 * Sets to be a master client forcibly.
 *
 * The client, which owns the display, has a high priority and can take over
 * a master role from other clients without the display.
 *
 * @param  display IEvsDisplay handle. If this is valid, the calling client
 *                 is considered as the high priority client and therefore
 *                 it would take over a master role.
 *
 * @return result  EvsResult::OK if a master role is granted.
 *                 EvsResult::OWNERSHIP_LOST if there is already a
 *                 master client with the display.
 */
forceMaster(IEvsDisplay display) generates (EvsResult result);

/**
 * Retires from a master client role.
 *
 * @return result EvsResult::OK if this call is successful.
 *                EvsResult::INVALID_ARG if the caller client is not a
 *                master client.
 */
unsetMaster() generates (EvsResult result);

/**
 * Retrieves a list of parameters this camera supports.
 *
 * @return params A list of CameraParam that this camera supports.
 */
getParameterList() generates (vec<CameraParam> params);

/**
 * Requests a valid value range of a camera parameter
 *
 * @param  id    The identifier of camera parameter, CameraParam enum.
 *
 * @return min   The lower bound of the valid parameter value range.
 * @return max   The upper bound of the valid parameter value range.
 * @return step  The resolution of values in valid range.
 */
getIntParameterRange(CameraParam id)
    generates (int32_t min, int32_t max, int32_t step);

/**
 * Requests to set a camera parameter.
 *
 * @param  id             The identifier of camera parameter,
 *                        CameraParam enum.
 *         value          A desired parameter value.
 * @return result         EvsResult::OK if it succeeds to set a parameter.
 *                        EvsResult::INVALID_ARG if either a requested
 *                        parameter is not supported or a given value is out
 *                        of bounds.
 *         effectiveValue A programmed parameter value. This may differ
 *                        from what the client gives if, for example, the
 *                        driver does not support a target parameter.
 */
setIntParameter(CameraParam id, int32_t value)
    generates (EvsResult result, int32_t effectiveValue);

/**
 * Retrieves a value of given camera parameter.
 *
 * @param  id     The identifier of camera parameter, CameraParam enum.
 * @return result EvsResult::OK if it succeeds to read a parameter.
 *                EvsResult::INVALID_ARG if either a requested parameter is
 *                not supported.
 *         value  A value of requested camera parameter.
 */
getIntParameter(CameraParam id) generates(EvsResult result, int32_t value);

getParameterList() trả về danh sách các tham số ( CameraParam enum) mà khách hàng có thể đọc và ghi (nếu khách hàng là chính) và getIntParameterRange() chuyển tiếp phạm vi giá trị hợp lệ và độ phân giải. Khi máy khách chính thay đổi thông số camera, tất cả các máy khách khác trên cùng phần cứng máy ảnh sẽ được thông báo bằng cách nhận sự kiện PARAMETER_CHANGED với ID thông số và giá trị mới.

Lưu ý: Trình điều khiển cảm biến có thể xử lý các giá trị tham số không hợp lệ theo cách khác. Nó có thể chỉ trả về mã lỗi hoặc cắt giá trị trong phạm vi hợp lệ và áp dụng. Do đó, phương thức setIntParameter() trả về giá trị hiệu dụng và máy khách có thể sử dụng giá trị này để xác nhận cách xử lý yêu cầu.

Yêu cầu phân xử giữa nhiều máy khách

Vì thiết kế EVS trước đây cho phép nhiều ứng dụng đăng ký đồng thời vào một phần cứng máy ảnh nên có thể một ứng dụng có thể làm gián đoạn hoạt động của các ứng dụng khác bằng cách thay đổi thông số máy ảnh. Ngoài ra, nhiều khách hàng có thể muốn điều chỉnh cùng một tham số theo cách khác nhau và do đó gây ra các hành vi không mong muốn khi chạy dịch vụ camera.

Để tránh những vấn đề như vậy, trình quản lý EVS chỉ cho phép ứng dụng khách chính đó lập trình thông số camera. Trước khi cố gắng điều chỉnh bất kỳ thông số camera nào, máy khách PHẢI trở thành máy khách chính bằng cách gọi phương thức setMaster() . Nếu điều này không thành công thì có nghĩa là đã có một ứng dụng khách chính đang hoạt động trên phần cứng máy ảnh đó. Cho đến khi máy khách chính hiện tại chết hoặc từ bỏ vai trò chính một cách rõ ràng thông qua unsetMaster() , không máy khách nào khác được phép thay đổi thông số máy ảnh. Khi máy khách chính trả lại đặc quyền của mình, tất cả các ứng dụng khác sẽ được thông báo bằng sự kiện MASTER_RELEASED .

Khách hàng có mức độ ưu tiên cao

Trình quản lý EVS xử lý ứng dụng khách sở hữu màn hình với mức độ ưu tiên cao và cho phép nó chiếm lấy vai trò chính từ ứng dụng chính hiện tại. Vì quyền sở hữu màn hình EVS dựa trên mức độ gần đây nên ứng dụng khách mới thậm chí có thể tiếp quản màn hình từ ứng dụng khách hiện tại.

Các máy khách có mức độ ưu tiên cao phải gọi IEvsCamera::forceMaster(sp<IEvsDisplay>& display) để đạt được vai trò chính. Trình quản lý EVS kiểm tra trạng thái của một bộ điều khiển hiển thị nhất định và nếu ( và chỉ khi ) trạng thái của nó hợp lệ và cả DisplayState::NOT_OPEN hay DisplayState::DEAD không thay thế chính. Máy khách vừa mất vai trò chính sẽ được thông báo bởi sự kiện MASTER_RELEASEDPHẢI xử lý việc này đúng cách.