Paramètres de contrôle de la caméra du programme, paramètres de contrôle de la caméra du programme

Dans la version précédente du Extended View System (EVS) 1.0, les caméras étaient considérées comme des périphériques en lecture seule et, par conséquent, il n'existait aucune méthode permettant à l'application de modifier les paramètres de contrôle de la caméra tels que le zoom ou la luminosité.

Comme cela pourrait limiter les capacités des applications EVS, le nouvel EVS 1.1 introduit de nouvelles méthodes et permet à l'application de programmer plusieurs paramètres de contrôle de la caméra, qui sont tous définis dans 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,
};

Les méthodes sont définies comme :

/**
 * 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() renvoie une liste de paramètres ( CameraParam enum) qu'un client peut lire et écrire (si le client est un maître), et getIntParameterRange() relaie la plage de valeurs et la résolution valides. Lorsqu'un client maître modifie un paramètre de caméra, tous les autres clients sur le même matériel de caméra sont avertis en recevant un événement PARAMETER_CHANGED avec un ID de paramètre et une nouvelle valeur.

Remarque : Le pilote du capteur peut gérer différemment les valeurs de paramètres non valides. Il peut simplement renvoyer un code d'erreur ou couper la valeur dans la plage valide et l'appliquer. Par conséquent, la méthode setIntParameter() renvoie une valeur effective et le client peut utiliser cette valeur pour confirmer comment la demande a été traitée.

Demander un arbitrage entre plusieurs clients de caméra

Étant donné que la conception EVS précédente permettait à plusieurs applications de s'abonner simultanément à un seul matériel de caméra, il est possible qu'une application perturbe le fonctionnement d'autres applications en modifiant un paramètre de caméra. En outre, plusieurs clients peuvent souhaiter ajuster le même paramètre différemment et ainsi provoquer des comportements inattendus lors de l'exécution des services de caméra.

Pour éviter de tels problèmes, le gestionnaire EVS permet uniquement au client maître de programmer un paramètre de caméra. Avant d'essayer d'ajuster un paramètre de caméra, le client DOIT devenir client maître en appelant la méthode setMaster() . Si cela échoue, cela signifie qu'il existe déjà un client maître actif sur le matériel de cette caméra. Jusqu'à ce que le client maître actuel meure ou abandonne explicitement un rôle de maître via unsetMaster() , aucun autre client n'est autorisé à modifier un paramètre de caméra. Lorsqu'un client principal rend son privilège, toutes les autres applications sont averties par un événement MASTER_RELEASED .

Clients hautement prioritaires

Le gestionnaire EVS gère le client propriétaire de l'écran avec une priorité élevée et lui permet de voler un rôle de maître à un maître actuel. Étant donné que la propriété de l'écran EVS est basée sur la récence, le nouveau client peut même prendre le relais du client actuel avec l'écran.

Les clients hautement prioritaires doivent appeler IEvsCamera::forceMaster(sp<IEvsDisplay>& display) pour obtenir un rôle de maître. Le gestionnaire EVS examine l'état d'un handle d'affichage donné et, si ( et seulement si ) son état est valide et que ni DisplayState::NOT_OPEN ni DisplayState::DEAD ne remplacent un maître. Le client, qui perd simplement le rôle de maître, est averti par un événement MASTER_RELEASED et DOIT gérer cela correctement.

,

Dans la version précédente du Extended View System (EVS) 1.0, les caméras étaient considérées comme des périphériques en lecture seule et, par conséquent, il n'existait aucune méthode permettant à l'application de modifier les paramètres de contrôle de la caméra tels que le zoom ou la luminosité.

Comme cela pourrait limiter les capacités des applications EVS, le nouvel EVS 1.1 introduit de nouvelles méthodes et permet à l'application de programmer plusieurs paramètres de contrôle de la caméra, qui sont tous définis dans 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,
};

Les méthodes sont définies comme :

/**
 * 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() renvoie une liste de paramètres ( CameraParam enum) qu'un client peut lire et écrire (si le client est un maître), et getIntParameterRange() relaie la plage de valeurs et la résolution valides. Lorsqu'un client maître modifie un paramètre de caméra, tous les autres clients sur le même matériel de caméra sont avertis en recevant un événement PARAMETER_CHANGED avec un ID de paramètre et une nouvelle valeur.

Remarque : Le pilote du capteur peut gérer différemment les valeurs de paramètres non valides. Il peut simplement renvoyer un code d'erreur ou couper la valeur dans la plage valide et l'appliquer. Par conséquent, la méthode setIntParameter() renvoie une valeur effective et le client peut utiliser cette valeur pour confirmer comment la demande a été traitée.

Demander un arbitrage entre plusieurs clients de caméra

Étant donné que la conception EVS précédente permettait à plusieurs applications de s'abonner simultanément à un seul matériel de caméra, il est possible qu'une application perturbe le fonctionnement d'autres applications en modifiant un paramètre de caméra. En outre, plusieurs clients peuvent souhaiter ajuster le même paramètre différemment et ainsi provoquer des comportements inattendus lors de l'exécution des services de caméra.

Pour éviter de tels problèmes, le gestionnaire EVS permet uniquement au client maître de programmer un paramètre de caméra. Avant d'essayer d'ajuster un paramètre de caméra, le client DOIT devenir client maître en appelant la méthode setMaster() . Si cela échoue, cela signifie qu'il existe déjà un client maître actif sur le matériel de cette caméra. Jusqu'à ce que le client maître actuel meure ou abandonne explicitement un rôle de maître via unsetMaster() , aucun autre client n'est autorisé à modifier un paramètre de caméra. Lorsqu'un client principal rend son privilège, toutes les autres applications sont averties par un événement MASTER_RELEASED .

Clients hautement prioritaires

Le gestionnaire EVS gère le client propriétaire de l'écran avec une priorité élevée et lui permet de voler un rôle de maître à un maître actuel. Étant donné que la propriété de l'écran EVS est basée sur la récence, le nouveau client peut même prendre le relais du client actuel avec l'écran.

Les clients hautement prioritaires doivent appeler IEvsCamera::forceMaster(sp<IEvsDisplay>& display) pour obtenir un rôle de maître. Le gestionnaire EVS examine l'état d'un handle d'affichage donné et, si ( et seulement si ) son état est valide et que ni DisplayState::NOT_OPEN ni DisplayState::DEAD ne remplacent un maître. Le client, qui perd simplement le rôle de maître, est averti par un événement MASTER_RELEASED et DOIT gérer cela correctement.