在先前的 Extended View System (EVS) 1.0 版本中,攝影機裝置被視為唯讀裝置,因此沒有任何方法可讓應用程式變更攝影機控制參數,例如變焦或亮度。
這可能會限制 EVS 應用程式的功能,因此新版 EVS 1.1 推出了新方法,讓應用程式能夠編寫多個相機控制參數,這些參數皆在 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, };
方法的定義如下:
/** * 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()
會傳回可供用戶端讀取及寫入的參數清單 (CameraParam
列舉) (如果用戶端是主機),而 getIntParameterRange()
會轉送有效值範圍和解析度。當主用戶端變更攝影機參數時,同一部攝影機硬體上的所有其他用戶端都會收到通知,並取得含有參數 ID 和新值的 PARAMETER_CHANGED
事件。
注意: 感應器驅動程式可能會以不同方式處理無效的參數值。它可能只會傳回錯誤代碼,或將值截斷在有效範圍內並套用。因此,setIntParameter()
方法會傳回有效值,用戶端可以使用這個值確認要求的處理方式。
要求在多個攝影機用戶端之間進行仲裁
由於先前的 EVS 設計允許多個應用程式同時訂閱單一相機硬體,因此一個應用程式可能會透過變更相機參數,干擾其他應用程式的運作。此外,多個用戶端可能會以不同方式調整相同的參數,進而導致執行中攝影機服務出現非預期的行為。
為避免發生這類問題,EVS 管理員只允許主控用戶端編寫攝影機參數。在嘗試調整任何攝影機參數之前,用戶端必須透過呼叫 setMaster()
方法成為主用戶端。如果失敗,表示該攝影機硬體上已存在有效的主控端。在目前的主用戶端停止運作,或明確透過 unsetMaster()
放棄主用戶端角色之前,其他用戶端都無法變更攝影機參數。主用戶端傳回其權限時,所有其他應用程式都會收到 MASTER_RELEASED
事件的通知。
優先順序較高的用戶端
EVS 管理員會處理擁有高優先順序的顯示器的用戶端,並允許該用戶端從目前的主控台竊取主控台角色。由於 EVS 顯示擁有權是根據最近一次使用決定,因此新客戶甚至可以透過顯示器接管現有客戶。
高優先順序的用戶端必須呼叫 IEvsCamera::forceMaster(sp<IEvsDisplay>& display)
才能取得主控角色。EVS 管理員會檢查指定顯示器句柄的狀態,如果 (且僅當) 其狀態有效,且 DisplayState::NOT_OPEN
和 DisplayState::DEAD
都未取代主控台。剛失去主控角色的用戶端會收到 MASTER_RELEASED
事件通知,且必須妥善處理這項事件。