Programma i parametri di controllo della videocamera

Nella precedente release 1.0 del sistema Extended View System (EVS), i dispositivi con fotocamera erano considerati dispositivi di sola lettura e, pertanto, non esisteva alcun metodo che consentisse all'app di modificare i parametri di controllo della fotocamera, come lo zoom o la luminosità.

Poiché ciò potrebbe limitare le funzionalità delle app EVS, la nuova EVS 1.1 introduce nuovi metodi e consente all'app di programmare diversi parametri di controllo della videocamera, 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,
};

I metodi sono definiti come:

/**
 * 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 è un master), e getIntParameterRange() trasmette l'intervallo di valori validi e la risoluzione. Quando un client principale modifica un parametro della videocamera, tutti gli altri client sullo stesso hardware della videocamera vengono avvisati ricevendo un evento PARAMETER_CHANGED con un ID parametro e un nuovo valore.

Nota: il driver del sensore potrebbe gestire i valori dei parametri non validi in modo diverso. Potrebbe semplicemente restituire un codice di errore o tagliare il valore nell'intervallo valido e applicarlo. Pertanto, il metodo setIntParameter() restituisce un valore effettivo e il client può utilizzarlo per confermare la modalità di gestione della richiesta.

Richiedere l'arbitrato tra più client della videocamera

Poiché il precedente design EVS consentiva a più app di abbonarsi contemporaneamente a un singolo hardware della videocamera, è possibile che un'app possa disturbare le operazioni di altre app modificando un parametro della videocamera. Inoltre, più client potrebbero voler modificare lo stesso parametro in modo diverso e causare comportamenti imprevisti nei servizi della videocamera in esecuzione.

Per evitare questi problemi, il gestore EVS consente solo al client master di programmare un parametro della videocamera. Prima di provare a regolare un parametro della videocamera, il client DEVE diventare un client principale chiamando il metodo setMaster(). Se l'operazione non va a buon fine, significa che esiste già un client principale attivo sull'hardware della videocamera. Fino a quando l'attuale client principale non viene interrotto o non rinuncia esplicitamente a un ruolo principale tramite unsetMaster(), nessun altro client è autorizzato a modificare un parametro della videocamera. Quando un client principale restituisce il proprio privilegio, tutte le altre app vengono avvisate da un evento MASTER_RELEASED.

Clienti con priorità elevata

Il gestore EVS gestisce il client proprietario della visualizzazione con priorità elevata e gli consente di rubare un ruolo principale da un ruolo principale attuale. Poiché la proprietà del display EVS si basa sulla pertinenza, il nuovo cliente può persino sostituire il cliente attuale con il display.

I client con priorità elevata devono chiamare IEvsCamera::forceMaster(sp<IEvsDisplay>& display) per ottenere un ruolo principale. Il gestore EVS esamina lo stato di un determinato handle di visualizzazione e, se (e solo se) lo stato è valido e né DisplayState::NOT_OPENDisplayState::DEAD sostituiscono un master. Il client, che perde solo il ruolo principale, viene informato da un evento MASTER_RELEASED e DEVE gestire correttamente la situazione.