Parâmetros de controle da câmera do programa,Parâmetros de controle da câmera do programa

Na versão anterior do Extended View System (EVS) 1.0, os dispositivos de câmera eram considerados dispositivos somente leitura e, portanto, não existia nenhum método que permitisse ao aplicativo alterar os parâmetros de controle da câmera, como zoom ou brilho.

Como isso pode restringir a capacidade dos aplicativos EVS, o novo EVS 1.1 introduz novos métodos e permite que o aplicativo programe vários parâmetros de controle de câmera, todos definidos no 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,
};

Os métodos são definidos 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. 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() retorna uma lista de parâmetros ( CameraParam enum) que um cliente pode ler e escrever (se o cliente for um mestre) e getIntParameterRange() retransmite o intervalo de valores válidos e a resolução. Quando um cliente mestre altera um parâmetro de câmera, todos os outros clientes no mesmo hardware de câmera são notificados obtendo um evento PARAMETER_CHANGED com um ID de parâmetro e um novo valor.

Nota: O driver do sensor pode tratar valores de parâmetros inválidos de maneira diferente. Ele pode simplesmente retornar um código de erro ou cortar o valor no intervalo válido e aplicar. Portanto, o método setIntParameter() retorna um valor efetivo e o cliente pode utilizar esse valor para confirmar como a solicitação foi tratada.

Solicitar arbitragem entre vários clientes de câmeras

Como o design anterior do EVS permitia que vários aplicativos assinassem simultaneamente um único hardware de câmera, é possível que um aplicativo possa atrapalhar as operações de outros aplicativos alterando um parâmetro da câmera. Além disso, vários clientes podem querer ajustar o mesmo parâmetro de maneira diferente e, assim, causar comportamentos inesperados na execução de serviços de câmera.

Para evitar tais problemas, o gerenciador EVS permite que apenas o cliente mestre programe um parâmetro da câmera. Antes de tentar ajustar qualquer parâmetro da câmera, o cliente DEVE se tornar um cliente mestre chamando o método setMaster() . Se isso falhar, significa que já existe um cliente mestre ativo no hardware da câmera. Até que o cliente mestre atual morra ou desista explicitamente de uma função de mestre por meio unsetMaster() , nenhum outro cliente terá permissão para alterar um parâmetro de câmera. Quando um cliente master retorna seu privilégio, todos os outros aplicativos são notificados por um evento MASTER_RELEASED .

Clientes com alta prioridade

O gerenciador EVS trata o cliente que possui o display com alta prioridade e permite que ele roube uma função de mestre de um mestre atual. Como a propriedade do monitor EVS é baseada na atualidade, o novo cliente pode até mesmo substituir o cliente atual com o monitor.

Clientes de alta prioridade devem chamar IEvsCamera::forceMaster(sp<IEvsDisplay>& display) para obter uma função mestre. O gerenciador EVS examina o estado de um determinado identificador de exibição e, se ( e somente se ) seu estado for válido e nem DisplayState::NOT_OPEN nem DisplayState::DEAD substituirem um mestre. O cliente, que apenas perde a função de mestre, é notificado por um evento MASTER_RELEASED e DEVE tratar isso corretamente.

,

Na versão anterior do Extended View System (EVS) 1.0, os dispositivos de câmera eram considerados dispositivos somente leitura e, portanto, não existia nenhum método que permitisse ao aplicativo alterar os parâmetros de controle da câmera, como zoom ou brilho.

Como isso pode restringir a capacidade dos aplicativos EVS, o novo EVS 1.1 introduz novos métodos e permite que o aplicativo programe vários parâmetros de controle de câmera, todos definidos no 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,
};

Os métodos são definidos 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. 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() retorna uma lista de parâmetros ( CameraParam enum) que um cliente pode ler e escrever (se o cliente for um mestre) e getIntParameterRange() retransmite o intervalo de valores válidos e a resolução. Quando um cliente mestre altera um parâmetro de câmera, todos os outros clientes no mesmo hardware de câmera são notificados obtendo um evento PARAMETER_CHANGED com um ID de parâmetro e um novo valor.

Nota: O driver do sensor pode tratar valores de parâmetros inválidos de maneira diferente. Ele pode simplesmente retornar um código de erro ou cortar o valor no intervalo válido e aplicar. Portanto, o método setIntParameter() retorna um valor efetivo e o cliente pode utilizar esse valor para confirmar como a solicitação foi tratada.

Solicitar arbitragem entre vários clientes de câmeras

Como o design anterior do EVS permitia que vários aplicativos assinassem simultaneamente um único hardware de câmera, é possível que um aplicativo possa atrapalhar as operações de outros aplicativos alterando um parâmetro da câmera. Além disso, vários clientes podem querer ajustar o mesmo parâmetro de maneira diferente e, assim, causar comportamentos inesperados na execução de serviços de câmera.

Para evitar tais problemas, o gerenciador EVS permite que apenas o cliente mestre programe um parâmetro da câmera. Antes de tentar ajustar qualquer parâmetro da câmera, o cliente DEVE se tornar um cliente mestre chamando o método setMaster() . Se isso falhar, significa que já existe um cliente mestre ativo no hardware da câmera. Até que o cliente mestre atual morra ou desista explicitamente de uma função de mestre por meio unsetMaster() , nenhum outro cliente terá permissão para alterar um parâmetro de câmera. Quando um cliente master retorna seu privilégio, todos os outros aplicativos são notificados por um evento MASTER_RELEASED .

Clientes com alta prioridade

O gerenciador EVS trata o cliente que possui o display com alta prioridade e permite que ele roube uma função de mestre de um mestre atual. Como a propriedade do monitor EVS é baseada na atualidade, o novo cliente pode até mesmo substituir o cliente atual com o monitor.

Clientes de alta prioridade devem chamar IEvsCamera::forceMaster(sp<IEvsDisplay>& display) para obter uma função mestre. O gerenciador EVS examina o estado de um determinado identificador de exibição e, se ( e somente se ) seu estado for válido e nem DisplayState::NOT_OPEN nem DisplayState::DEAD substituirem um mestre. O cliente, que apenas perde a função de mestre, é notificado por um evento MASTER_RELEASED e DEVE tratar isso corretamente.