Programma i parametri di controllo della videocamera

Nella precedente release Extended View System (EVS) 1.0, i dispositivi con fotocamera erano considerati dispositivi di sola lettura e, pertanto, non esisteva alcun metodo che consentirebbe l'app per modificare i parametri di controllo della videocamera come zoom o luminosità.

Poiché ciò potrebbe limitare la capacità delle app EVS, il nuovo EVS 1.1 introduce nuovi metodi e consente all'app di programmare diverse videocamere parametri di controllo, tutti definiti in 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,
};

Per metodi si intende:

/**
 * 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() restituisce un elenco di parametri (enum CameraParam) che un client può leggere e scrivere (se il client è master), e getIntParameterRange() inoltra l'intervallo di valori e la risoluzione validi. Quando un client master modifica un parametro fotocamera, tutti gli altri client sulla stessa videocamera hardware ricevono una notifica tramite la ricezione di un evento PARAMETER_CHANGED con un l'ID parametro e il nuovo valore.

Nota: il driver del sensore potrebbe gestire un parametro non valido valori in modo diverso. Potrebbe semplicemente restituire un codice di errore o ritagliare il valore nella cella intervallo valido e applica. Di conseguenza, il metodo setIntParameter() restituisce un valore effettivo e il cliente può utilizzarlo per confermare in che modo la richiesta è stata gestiti.

Richiedere l'arbitrato tra più client di videocamere

Perché il precedente design EVS consentiva a più app di accedere contemporaneamente acquistare un abbonamento a un'unica videocamera, è possibile che un'app possa disturbare il funzionamento di altre app modificando un parametro della fotocamera. Inoltre, È possibile che più clienti vogliano modificare lo stesso parametro in modo diverso e, di conseguenza, causare comportamenti imprevisti nell'esecuzione dei servizi di videocamera.

Per evitare questi problemi, il gestore EVS consente al cliente solo principale per programmare un parametro della fotocamera. Prima di provare a regolare qualsiasi parametro della videocamera, il client DEVE diventare un client master chiamando il setMaster() . Se non riesce, significa che esiste già un client master attivo sull'hardware della videocamera. Fino a quando il client master attuale muore o rinuncia a un ruolo principale tramite unsetMaster(), nessun altro client autorizzati a modificare un parametro fotocamera. Quando un client master restituisce il privilegio, tutte le altre app ricevono una notifica da un evento MASTER_RELEASED.

Clienti con priorità elevata

Il gestore EVS gestisce il cliente proprietario del display con l'alta e gli consente di sottrarre un ruolo principale da un master attuale. Poiché EVS la proprietà della pubblicità display si basa sulla data più recente, il nuovo cliente può persino assumere il controllo cliente attuale con il display.

I clienti ad alta priorità devono chiamare IEvsCamera::forceMaster(sp<IEvsDisplay>& display) per acquisire un ruolo master. Il gestore EVS esamina lo stato di un determinato display gestire e, se (e solo se) il suo stato è valido e nessuno dei due DisplayState::NOT_OPEN o DisplayState::DEAD sostituisce uno principale. Il client, che perde semplicemente il ruolo principale, inviata da un evento MASTER_RELEASED e DEVE gestire per eseguire questa operazione correttamente.