自 2025 年 3 月 27 日起,我们建议您使用 android-latest-release
而非 aosp-main
构建 AOSP 并为其做出贡献。如需了解详情,请参阅 AOSP 的变更。
用程序编写摄像头控制参数
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
在之前的增强型视觉系统 (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
事件获得通知,并且必须正确处理这一情况。
本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-07-27。
[null,null,["最后更新时间 (UTC):2025-07-27。"],[],[],null,["# Program camera control parameters\n\nIn the previous Extended View System (EVS) 1.0 release, camera devices were\nconsidered read-only devices and, therefore, no method existed that would enable\nthe app to change camera control parameters such as zoom or brightness.\n\nAs this could constrain the capability of EVS apps, the new EVS 1.1\nintroduces new methods and enables the app to program several camera\ncontrol parameters, all of which are defined in `enum CameraParam`: \n\n```gdscript\n/**\n * EVS Camera Parameter\n */\nenum CameraParam : uint32_t {\n /**\n * The brightness of image frames\n */\n BRIGHTNESS,\n /**\n * The contrast of image frames\n */\n CONTRAST,\n /**\n * Automatic gain/exposure control\n */\n AUTOGAIN,\n /**\n * Gain control\n */\n GAIN,\n /**\n * Automatic Whitebalance\n */\n AUTO_WHITE_BALANCE,\n /**\n * Manual white balance setting as a color temperature in Kelvin.\n */\n WHITE_BALANCE_TEMPERATURE,\n /**\n * Image sharpness adjustment\n */\n SHARPNESS,\n /**\n * Auto Exposure Control modes; auto, manual, shutter priority, or\n * aperture priority.\n */\n AUTO_EXPOSURE,\n /**\n * Manual exposure time of the camera\n */\n ABSOLUTE_EXPOSURE,\n /**\n * Set the focal point of the camera to the specified position. This\n * parameter may not be effective when auto focus is enabled.\n */\n ABSOLUTE_FOCUS,\n /**\n * Enables continuous automatic focus adjustments.\n */\n AUTO_FOCUS,\n /**\n * Specify the objective lens focal length as an absolute value.\n */\n ABSOLUTE_ZOOM,\n};\n```\n\nMethods are defined as: \n\n```gdscript\n/**\n * Requests to be a master client.\n *\n * When multiple clients subscribe to a single camera hardware and one of\n * them adjusts a camera parameter such as the contrast, it may disturb\n * other clients' operations. Therefore, the client must call this method\n * to be a master client. When it becomes a master, it can\n * change camera parameters until either it dies or explicitly gives up the\n * role.\n *\n * @return result EvsResult::OK if a master role is granted.\n * EvsResult::OWNERSHIP_LOST if there is already a\n * master client.\n */\nsetMaster() generates (EvsResult result);\n\n/**\n * Sets to be a master client forcibly.\n *\n * The client, which owns the display, has a high priority and can take over\n * a master role from other clients without the display.\n *\n * @param display IEvsDisplay handle. If this is valid, the calling client\n * is considered as the high priority client and therefore\n * it would take over a master role.\n *\n * @return result EvsResult::OK if a master role is granted.\n * EvsResult::OWNERSHIP_LOST if there is already a\n * master client with the display.\n */\nforceMaster(IEvsDisplay display) generates (EvsResult result);\n\n/**\n * Retires from a master client role.\n *\n * @return result EvsResult::OK if this call is successful.\n * EvsResult::INVALID_ARG if the caller client is not a\n * master client.\n */\nunsetMaster() generates (EvsResult result);\n\n/**\n * Retrieves a list of parameters this camera supports.\n *\n * @return params A list of CameraParam that this camera supports.\n */\ngetParameterList() generates (vec\u003cCameraParam\u003e params);\n\n/**\n * Requests a valid value range of a camera parameter\n *\n * @param id The identifier of camera parameter, CameraParam enum.\n *\n * @return min The lower bound of the valid parameter value range.\n * @return max The upper bound of the valid parameter value range.\n * @return step The resolution of values in valid range.\n */\ngetIntParameterRange(CameraParam id)\n generates (int32_t min, int32_t max, int32_t step);\n\n/**\n * Requests to set a camera parameter.\n *\n * @param id The identifier of camera parameter,\n * CameraParam enum.\n * value A desired parameter value.\n * @return result EvsResult::OK if it succeeds to set a parameter.\n * EvsResult::INVALID_ARG if either a requested\n * parameter is not supported or a given value is out\n * of bounds.\n * effectiveValue A programmed parameter value. This may differ\n * from what the client gives if, for example, the\n * driver does not support a target parameter.\n */\nsetIntParameter(CameraParam id, int32_t value)\n generates (EvsResult result, int32_t effectiveValue);\n\n/**\n * Retrieves a value of given camera parameter.\n *\n * @param id The identifier of camera parameter, CameraParam enum.\n * @return result EvsResult::OK if it succeeds to read a parameter.\n * EvsResult::INVALID_ARG if either a requested parameter is\n * not supported.\n * value A value of requested camera parameter.\n */\ngetIntParameter(CameraParam id) generates(EvsResult result, int32_t value);\n```\n\n`getParameterList()` returns a list of parameters\n(`CameraParam` enum) a client can read and write (if the client is a master),\nand `getIntParameterRange()` relays the valid value range and resolution.\nWhen a master client changes a camera parameter, all other clients on the same camera\nhardware are notified by getting a `PARAMETER_CHANGED` event with a\nparameter ID and new value.\n\n**Note:** The sensor driver may handle invalid parameter\nvalues differently. It may simply return an error code or clip the value in the\nvalid range and apply. Therefore, the `setIntParameter()` method returns\nan effective value and the client can use this value to confirm how the request was\nhandled.\n\nRequest arbitration between multiple camera clients\n---------------------------------------------------\n\nBecause the previous EVS design allowed multiple apps to simultaneously\nsubscribe to a single camera hardware, it is possible that one app can\ndisturb the operations of other apps by changing a camera parameter. Also,\nmultiple clients may want to adjust the same parameter differently and thereby\ncause unexpected behaviors in running camera services.\n\nTo avoid such problems, the EVS manager allows that only *master* client\nto program a camera parameter. Before trying to adjust any camera parameter, the client\n**MUST** become a master client by calling the `setMaster()`\nmethod. If this fails, then it means there is already an active master client\non that camera hardware. Until the current master client dies, or explicitly\ngives up a master role through `unsetMaster()`, no other client is\npermitted to change a camera parameter. When a master client returns its privilege,\nall other apps are notified by a `MASTER_RELEASED` event.\n\n### Clients with high priority\n\nThe EVS manager handles the client that owns the display with the high\npriority and allows it to steal a master role from a current master. Because EVS\ndisplay ownership is based on recency, the new client can even take over from the\ncurrent client with the display.\n\nHigh priority clients must call `IEvsCamera::forceMaster(sp\u003cIEvsDisplay\u003e& display)`\nto attain a master role. The EVS manager examines the state of a given display\nhandle and, if (*and only if* ) its state is valid and neither\n`DisplayState::NOT_OPEN` nor `DisplayState::DEAD`\nreplaces a master. The client, which just loses the master role, is\nnotified by a `MASTER_RELEASED` event and **MUST** handle\nthis properly."]]