Lập trình các tham số điều khiển camera

Trong bản phát hành Hệ thống khung nhìn mở rộng (EVS) 1.0 trước đây, các thiết bị máy ảnh được được coi là thiết bị chỉ đọc và do đó không tồn tại phương pháp nào cho phép ứng dụng để thay đổi các tham 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 các ứng dụng EVS, nên EVS 1.1 mới giới thiệu các phương thức mới và cho phép ứng dụng lập trình một số máy ảnh tham số kiểm soát, 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 như sau:

/**
 * 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ột ứng dụng có thể đọc và ghi (nếu ứng dụng đó là một bậc thầy), và getIntParameterRange() chuyển tiếp phạm vi giá trị và độ phân giải hợp lệ. Khi ứng dụng chính thay đổi một tham số của camera, tất cả các ứng dụng khác trên cùng một camera phần cứng sẽ nhận được thông báo bằng cách nhận sự kiện PARAMETER_CHANGED kèm theo mã thông số và giá trị mới.

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

Yêu cầu phân xử bằng trọng tài giữa nhiều ứng dụng sử dụng camera

Bởi vì thiết kế EVS trước đây cho phép nhiều ứng dụng truy cập cùng lúc đăng ký một phần cứng máy ảnh, nhưng một ứng dụng vẫn có thể làm phiền hoạt động của các ứng dụng khác bằng cách thay đổi tham số của máy ảnh. Ngoài ra, nhiều khách hàng có thể muốn điều chỉnh cùng một thông số theo cách khác nhau và do đó gây ra 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 chính để lập trình một tham số camera. Trước khi cố gắng điều chỉnh bất kỳ tham số camera nào, ứng dụng PHẢI trở thành khách hàng chính bằng cách gọi setMaster() . Nếu thao tác này không thành công thì tức là hiện đã có một ứng dụng chính đang hoạt động trên phần cứng máy ảnh đó. Cho đến khi ứng dụng chính hiện tại ngừng hoạt động hoặc một cách rõ ràng từ bỏ vai trò chính thông qua unsetMaster(), không có khách hàng nào khác được phép thay đổi thông số camera. Khi máy khách chính trả lại đặc quyền, tất cả các ứng dụng khác sẽ được thông báo qua sự kiện MASTER_RELEASED.

Ứng dụng có mức độ ưu tiên cao

Người quản lý EVS xử lý khách hàng sở hữu màn hình với mức độ ưu tiên và cho phép ứng dụng này lấy cắp vai trò chính của chủ sở hữu hiện tại. Vì EVS quyền sở hữu quảng cáo hiển thị dựa trên thời gian gần đây, ứng dụng mới thậm chí có thể giành quyền kiểm soát máy khách hiện tại với màn hình.

Ứng dụng có mức độ ưu tiên cao phải gọi IEvsCamera::forceMaster(sp<IEvsDisplay>& display) để đạt được vai trò bậc thầy. Trình quản lý EVS kiểm tra trạng thái của một màn hình cụ thể tên người dùng và, nếu (và chỉ khi), trạng thái của tên này là hợp lệ và không thuộc loại nào DisplayState::NOT_OPEN hoặc DisplayState::DEAD sẽ thay thế một trang cái. Khách hàng vừa mất vai trò chủ thông báo bởi sự kiện MASTER_RELEASEDPHẢI tên người dùng điều này đúng cách.