Na versão anterior do Extended View System (EVS) 1.0, os dispositivos de câmera eram considerados dispositivos somente leitura, portanto, não existia nenhum método que permitisse o app alterar os parâmetros de controle da câmera, como zoom ou brilho.
Como isso pode limitar a capacidade dos apps de EVS, o novo EVS 1.1
apresenta novos métodos e permite que o app programe vários métodos de
Parâmetros de controle, todos definidos em 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 da seguinte maneira:
/**
* 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.
(enumeração CameraParam
) que um cliente pode ler e gravar (se for um cliente mestre);
e getIntParameterRange()
redireciona o intervalo de valores e a resolução válidos.
Quando um cliente mestre altera um parâmetro de câmera, todos os outros clientes na mesma câmera
são notificados ao receber um evento PARAMETER_CHANGED
com
o ID do parâmetro e o novo valor.
Observação : o driver do sensor pode processar parâmetros inválidos.
valores de maneira diferente. Ele pode simplesmente retornar um código de erro ou cortar o valor na
um intervalo válido e aplicar. Portanto, o método setIntParameter()
retorna
um valor efetivo, e o cliente pode usar esse valor para confirmar como a solicitação foi
manuseados.
Solicitar arbitragem entre vários clientes de câmera
Como o design anterior de EVS permitia que vários apps tivessem assinar em apenas um hardware de câmera, é possível que um app atrapalhar as operações de outros apps alterando um parâmetro da câmera. Além disso, vários clientes podem querer ajustar o mesmo parâmetro de forma diferente e, assim, causar comportamentos inesperados na execução dos serviços de câmera.
Para evitar esses problemas, o gerenciador de EVS permite que apenas o cliente master
para programar um parâmetro de câmera. Antes de tentar ajustar qualquer parâmetro da câmera, o cliente
PRECISA se tornar um cliente principal chamando 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 explicitamente
desiste de um papel mestre por unsetMaster()
, nenhum outro cliente
permissão para alterar um parâmetro de câmera. Quando um cliente mestre retorna seu privilégio,
todos os outros apps são notificados por um evento MASTER_RELEASED
.
Clientes com alta prioridade
O gerente de EVS lida com o cliente que é proprietário da tela com a alta prioridade e permite que ele roube um papel mestre de um mestre atual. Como os EVS propriedade de exibição é baseada no tempo para retorno, o novo cliente pode até mesmo assumir o controle cliente atual com a tela.
Os clientes de alta prioridade precisam ligar para IEvsCamera::forceMaster(sp<IEvsDisplay>& display)
para conquistar uma função principal. O gerenciador de EVS examina o estado de uma tela específica
identificador e, se (e somente se) o estado for válido e nenhuma dessas opções
DisplayState::NOT_OPEN
ou DisplayState::DEAD
substitui um mestre. O cliente, que só perde o papel de mestre, é
notificado por um evento MASTER_RELEASED
e PRECISA lidar com isso
isso corretamente.