Programación de parámetros de control de cámara,Programación de parámetros de control de cámara

En la versión anterior de Extended View System (EVS) 1.0, los dispositivos de cámara se consideraban dispositivos de solo lectura y, por lo tanto, no existía ningún método que permitiera a la aplicación cambiar los parámetros de control de la cámara, como el zoom o el brillo.

Como esto podría limitar la capacidad de las aplicaciones EVS, el nuevo EVS 1.1 introduce nuevos métodos y permite que la aplicación programe varios parámetros de control de la cámara, todos los cuales están definidos en 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,
};

Los métodos se definen como:

/**
 * 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() devuelve una lista de parámetros ( CameraParam enum) que un cliente puede leer y escribir (si el cliente es un maestro), y getIntParameterRange() transmite el rango de valores y la resolución válidos. Cuando un cliente maestro cambia un parámetro de la cámara, todos los demás clientes en el mismo hardware de la cámara recibirán una notificación mediante un evento PARAMETER_CHANGED con una ID de parámetro y un valor nuevo.

Nota: El controlador del sensor puede manejar valores de parámetros no válidos de manera diferente. Simplemente puede devolver un código de error o recortar el valor en el rango válido y aplicar. Por lo tanto, el método setIntParameter() devuelve un valor efectivo y el cliente puede usar este valor para confirmar cómo se manejó la solicitud.

Solicitar arbitraje entre varios clientes de cámaras

Debido a que el diseño anterior de EVS permitía que múltiples aplicaciones se suscribieran simultáneamente a un solo hardware de cámara, es posible que una aplicación pueda perturbar las operaciones de otras aplicaciones al cambiar un parámetro de la cámara. Además, es posible que varios clientes deseen ajustar el mismo parámetro de manera diferente y, por lo tanto, provoquen comportamientos inesperados al ejecutar los servicios de la cámara.

Para evitar tales problemas, el administrador de EVS permite que solo el cliente maestro programe un parámetro de cámara. Antes de intentar ajustar cualquier parámetro de la cámara, el cliente DEBE convertirse en un cliente maestro llamando al método setMaster() . Si esto falla, significa que ya hay un cliente maestro activo en el hardware de esa cámara. Hasta que el cliente maestro actual muera, o renuncie explícitamente a un rol maestro a través unsetMaster() , ningún otro cliente podrá cambiar un parámetro de cámara. Cuando un cliente maestro devuelve su privilegio, todas las demás aplicaciones serán notificadas por un evento MASTER_RELEASED .

Clientes con Alta Prioridad

El administrador de EVS maneja al cliente que posee la pantalla con alta prioridad y le permite robar una función de maestro de un maestro actual. Debido a que la propiedad de la pantalla de EVS se basa en la antigüedad, el nuevo cliente puede incluso reemplazar al cliente actual con la pantalla.

Los clientes de alta prioridad deben llamar a IEvsCamera::forceMaster(sp<IEvsDisplay>& display) para obtener una función maestra. El administrador de EVS examina el estado de un identificador de pantalla dado y, si ( y solo si ) su estado es válido y ni DisplayState::NOT_OPEN ni DisplayState::DEAD reemplazan a un maestro. El cliente, que simplemente pierde el rol de maestro, será notificado por un evento MASTER_RELEASED y DEBE manejar esto correctamente.

,

En la versión anterior de Extended View System (EVS) 1.0, los dispositivos de cámara se consideraban dispositivos de solo lectura y, por lo tanto, no existía ningún método que permitiera a la aplicación cambiar los parámetros de control de la cámara, como el zoom o el brillo.

Como esto podría limitar la capacidad de las aplicaciones EVS, el nuevo EVS 1.1 introduce nuevos métodos y permite que la aplicación programe varios parámetros de control de la cámara, todos los cuales están definidos en 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,
};

Los métodos se definen como:

/**
 * 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() devuelve una lista de parámetros ( CameraParam enum) que un cliente puede leer y escribir (si el cliente es un maestro), y getIntParameterRange() transmite el rango de valores y la resolución válidos. Cuando un cliente maestro cambia un parámetro de la cámara, todos los demás clientes en el mismo hardware de la cámara recibirán una notificación mediante un evento PARAMETER_CHANGED con una ID de parámetro y un valor nuevo.

Nota: El controlador del sensor puede manejar valores de parámetros no válidos de manera diferente. Simplemente puede devolver un código de error o recortar el valor en el rango válido y aplicar. Por lo tanto, el método setIntParameter() devuelve un valor efectivo y el cliente puede usar este valor para confirmar cómo se manejó la solicitud.

Solicitar arbitraje entre varios clientes de cámaras

Debido a que el diseño anterior de EVS permitía que múltiples aplicaciones se suscribieran simultáneamente a un solo hardware de cámara, es posible que una aplicación pueda perturbar las operaciones de otras aplicaciones al cambiar un parámetro de la cámara. Además, es posible que varios clientes deseen ajustar el mismo parámetro de manera diferente y, por lo tanto, provoquen comportamientos inesperados al ejecutar los servicios de la cámara.

Para evitar tales problemas, el administrador de EVS permite que solo el cliente maestro programe un parámetro de cámara. Antes de intentar ajustar cualquier parámetro de la cámara, el cliente DEBE convertirse en un cliente maestro llamando al método setMaster() . Si esto falla, significa que ya hay un cliente maestro activo en el hardware de esa cámara. Hasta que el cliente maestro actual muera, o renuncie explícitamente a un rol maestro a través unsetMaster() , ningún otro cliente podrá cambiar un parámetro de cámara. Cuando un cliente maestro devuelve su privilegio, todas las demás aplicaciones serán notificadas por un evento MASTER_RELEASED .

Clientes con Alta Prioridad

El administrador de EVS maneja al cliente que posee la pantalla con alta prioridad y le permite robar una función de maestro de un maestro actual. Debido a que la propiedad de la pantalla de EVS se basa en la antigüedad, el nuevo cliente puede incluso reemplazar al cliente actual con la pantalla.

Los clientes de alta prioridad deben llamar a IEvsCamera::forceMaster(sp<IEvsDisplay>& display) para obtener una función maestra. El administrador de EVS examina el estado de un identificador de pantalla dado y, si ( y solo si ) su estado es válido y ni DisplayState::NOT_OPEN ni DisplayState::DEAD reemplazan a un maestro. El cliente, que simplemente pierde el rol de maestro, será notificado por un evento MASTER_RELEASED y DEBE manejar esto correctamente.