Программирование параметров управления камерой, Программирование параметров управления камерой

В предыдущей версии Extended View System (EVS) 1.0 устройства с камерами считались устройствами только для чтения, и поэтому не существовало метода, позволяющего приложению изменять параметры управления камерой, такие как масштабирование или яркость.

Поскольку это может ограничивать возможности приложений EVS, новый EVS 1.1 представляет новые методы и позволяет приложению программировать несколько параметров управления камерой, все из которых определены в 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,
};

Методы определяются как:

/**
 * 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. Once it becomes a master, it will be able to
 * 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() возвращает список параметров (перечисление CameraParam ), которые клиент может читать и записывать (если клиент является мастером), а getIntParameterRange() передает допустимый диапазон значений и разрешение. Когда главный клиент изменяет параметр камеры, все другие клиенты на том же аппаратном обеспечении камеры будут уведомлены путем получения события PARAMETER_CHANGED с идентификатором параметра и новым значением.

Примечание. Драйвер датчика может по-разному обрабатывать недопустимые значения параметров. Он может просто вернуть код ошибки или обрезать значение в допустимом диапазоне и применить. Таким образом, метод setIntParameter() возвращает эффективное значение, и клиент может использовать это значение для подтверждения того, как был обработан запрос.

Запрос арбитража между клиентами с несколькими камерами

Поскольку предыдущая конструкция EVS позволяла нескольким приложениям одновременно подписываться на аппаратное обеспечение одной камеры, возможно, что одно приложение может нарушить работу других приложений, изменив параметр камеры. Кроме того, несколько клиентов могут захотеть по-разному настроить один и тот же параметр, что приведет к непредвиденному поведению при запуске служб камеры.

Чтобы избежать таких проблем, менеджер EVS позволяет программировать параметры камеры только главному клиенту. Прежде чем пытаться настроить какой-либо параметр камеры, клиент ДОЛЖЕН стать главным клиентом, вызвав метод setMaster() . Если это не удается, это означает, что на аппаратном обеспечении этой камеры уже есть активный главный клиент. Пока текущий главный клиент не умрет или явно не откажется от главной роли через unsetMaster() , никакому другому клиенту не будет разрешено изменять параметр камеры. Когда главный клиент возвращает свою привилегию, все остальные приложения будут уведомлены событием MASTER_RELEASED .

Клиенты с высоким приоритетом

Диспетчер EVS обрабатывает клиента, владеющего дисплеем, с высоким приоритетом и позволяет ему украсть роль мастера у текущего мастера. Поскольку владение дисплеем EVS основано на давности, новый клиент может даже взять на себя управление текущим клиентом с дисплеем.

Клиенты с высоким приоритетом должны вызывать IEvsCamera::forceMaster(sp<IEvsDisplay>& display) , чтобы получить главную роль. Диспетчер EVS проверяет состояние данного дескриптора дисплея и, если ( и только если ) его состояние допустимо и ни DisplayState::NOT_OPEN ни DisplayState::DEAD не заменяют мастер. Клиент, который только что потерял главную роль, будет уведомлен событием MASTER_RELEASED и ДОЛЖЕН обработать это должным образом.

,

В предыдущей версии Extended View System (EVS) 1.0 устройства с камерами считались устройствами только для чтения, и поэтому не существовало метода, позволяющего приложению изменять параметры управления камерой, такие как масштабирование или яркость.

Поскольку это может ограничивать возможности приложений EVS, новый EVS 1.1 представляет новые методы и позволяет приложению программировать несколько параметров управления камерой, все из которых определены в 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,
};

Методы определяются как:

/**
 * 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. Once it becomes a master, it will be able to
 * 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() возвращает список параметров (перечисление CameraParam ), которые клиент может читать и записывать (если клиент является мастером), а getIntParameterRange() передает допустимый диапазон значений и разрешение. Когда главный клиент изменяет параметр камеры, все другие клиенты на том же аппаратном обеспечении камеры будут уведомлены путем получения события PARAMETER_CHANGED с идентификатором параметра и новым значением.

Примечание. Драйвер датчика может по-разному обрабатывать недопустимые значения параметров. Он может просто вернуть код ошибки или обрезать значение в допустимом диапазоне и применить. Таким образом, метод setIntParameter() возвращает эффективное значение, и клиент может использовать это значение для подтверждения того, как был обработан запрос.

Запрос арбитража между клиентами с несколькими камерами

Поскольку предыдущая конструкция EVS позволяла нескольким приложениям одновременно подписываться на аппаратное обеспечение одной камеры, возможно, что одно приложение может нарушить работу других приложений, изменив параметр камеры. Кроме того, несколько клиентов могут захотеть по-разному настроить один и тот же параметр, что приведет к непредвиденному поведению при запуске служб камеры.

Чтобы избежать таких проблем, менеджер EVS позволяет программировать параметры камеры только главному клиенту. Прежде чем пытаться настроить какой-либо параметр камеры, клиент ДОЛЖЕН стать главным клиентом, вызвав метод setMaster() . Если это не удается, это означает, что на аппаратном обеспечении этой камеры уже есть активный главный клиент. Пока текущий главный клиент не умрет или явно не откажется от главной роли через unsetMaster() , никакому другому клиенту не будет разрешено изменять параметр камеры. Когда главный клиент возвращает свою привилегию, все остальные приложения будут уведомлены событием MASTER_RELEASED .

Клиенты с высоким приоритетом

Диспетчер EVS обрабатывает клиента, владеющего дисплеем, с высоким приоритетом и позволяет ему украсть роль мастера у текущего мастера. Поскольку владение дисплеем EVS основано на давности, новый клиент может даже взять на себя управление текущим клиентом с дисплеем.

Клиенты с высоким приоритетом должны вызывать IEvsCamera::forceMaster(sp<IEvsDisplay>& display) , чтобы получить главную роль. Диспетчер EVS проверяет состояние данного дескриптора дисплея и, если ( и только если ) его состояние допустимо и ни DisplayState::NOT_OPEN ни DisplayState::DEAD не заменяют мастер. Клиент, который только что потерял главную роль, будет уведомлен событием MASTER_RELEASED и ДОЛЖЕН обработать это должным образом.