本讲是Android Camera Native Framework专题的第38讲,我们介绍Camera Native FW的Camera3Device架构概述。
更多资源:
资源 | 描述 |
---|---|
在线课程 | 极客笔记在线课程 |
知识星球 | 星球名称:深入浅出Android Camera 星球ID: 17296815 |
极客笔记圈 |
Camera3Device架构概述
Camera3Device核心内部类
核心内部类 | 功能职责 |
---|---|
Camera3Device::RequestThread | 该线程用于维护送给Camera HAL的CaptureRequest |
Camera3Device::HalInterface | Camera HAL ICameraDeviceSession类的封装 |
Camera3Device::Camera3DeviceInjectionMethods | Inject Camera使用,会替换HalInterface对象为mInjectedCamHalInterface从而调用ICameraInjectionSession。 ICameraInjectionSession 提供了一种机制,允许外部Camera设备无缝地替代内部Camera,同时保持与原有Camera配置的兼容性。这对于需要临时使用外部Camera(如USB Camera)替代内置Camera的场景非常有用。 |
CameraDeviceBase成员变量详解
成员变量类型 | 成员变量 | 描述 |
---|---|---|
bool | mImageDumpMask | dumpsys media.camera使用,设置给Output Stream,用于标识是否打开Jpeg Image Dump功能 |
vector |
mStreamUseCaseOverrides | dumpsys media.camera使用,设置给Output Stream,用于记录Stream的Usecase 覆盖列表 |
ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES如下:
Camera3Device成员变量详解
成员变量类型 | 成员变量 | 描述 |
---|---|---|
CameraServiceProxyWrapper | mCameraServiceProxyWrapper | 在Camer3Device中 1. 用于产生唯一的logId,调用AIDL HAL configureStreams 时使用 2. 用于记录reconfigureCamera的耗时 |
String8 | mId | 当前Camera3Device的ID |
bool | mLegacyClient | 表示是否是Camera API1的Client |
int | mOperatingMode | Configure streams带下来的Operation Mode |
CameraMetadataNative | mSessionParams | Configure streams带下来的Session Parameter |
bool | mIsConstrainedHighSpeedConfiguration | 标识是否是High Speed Configuration,有一些逻辑需要特殊处理 |
HalInterface | mInterface | Camera HAL ICameraDeviceSession类的封装 |
CameraMetadata | mDeviceInfo | 存放当前Camera的静态信息 |
std::unordered_map<std::string, CameraMetadata> | mPhysicalDeviceInfoMap | 如果是Logical multi-cam,这里存放每个Physical Camera的静态信息 |
bool | mSupportNativeZoomRatio | 是否支持通过Zoom Ratio来控制Zoom |
bool | mIsCompositeJpegRDisabled | 是否支持JPEG_R的Stream。 JPEG_R结合了传统的 JPEG 压缩图像和嵌入式恢复映射(recovery map)。这种格式主要用于支持 Ultra HDR(高动态范围)图像。 |
CameraMetadata | mRequestTemplateCache | 缓存默认的CaptureRequest,可存放不同Template的CaptureRequest |
enum Status | mStatus | 记录当前CameraDevice的状态 |
Vector |
mRecentStatusUpdates | 记录最近更新的Status,在waitUntilStateThenRelock使用 |
StreamSet | mOutputStreams | 当前CameraDevice配置的输出流 |
Camera3Stream | mInputStream | 当前CameraDevice配置的输入流 |
SessionStatsBuilder | mSessionStatsBuilder | 统计Stream的Stats,产生直方图 |
std::map<int32_t, std::set |
mGroupIdPhysicalCameraMap | Stream GroupID与Physical Camera ID的映射关系 针对Multi Resolution的Stream才有GroupID,请求Physical Camera Stream时使用 |
int | mNextStreamId | 单调递增,用于产生Stream ID |
bool | mNeedConfig | 标识是否需要执行config stream,如果条件未变,不重复configure |
int | mFakeStreamId | 针对configure stream时mOutputStreams size为0的规避解法 |
bool | mPauseStateNotify | 用于内部做reconfiguration时,skip掉state 更新通知 |
Vector<sp<camera3::Camera3StreamInterface> > |
mDeletedStreams | 持有待删除的Stream,直到configure结束。有可能在configure的过程中发生Flush操作,这种情况也需要对被即将Delete的Stream做Flash。 |
bool | mUsePartialResult | 标识HAL是否使用Partial Result(也就是Result会拆成多包上来) |
uint32_t | mNumPartialResults | 有多少包Partial Result,默认值是1 |
bool | mDeviceTimeBaseIsRealtime | Timestamp Source是否是Realtime,是的话要对timestamp进行矫正 |
nsecs_t | mTimestampOffset | Monotonic time到Boottime的偏移值 |
sp |
mRequestThread | 处理下发Request的线程 |
InFlightRequestMap | mInFlightMap | 送给HAL,正在被HAL处理的Request list |
nsecs_t | mExpectedInflightDuration | 用于判断HAL处理request是否发生Timeout,最小5秒 |
wp |
mStatusTracker | 跟踪Camera3Device的状态切换 |
sp |
mBufferManager | 管理Output Stream的Graphic Buffer,一个Camera3Device只有一个Buffer Manager。为了优化内存用量而使用。 |
sp |
mPreparerThread | 用于执行stream prepare的线程 |
std::list |
mResultQueue | 用于存放HAL送上来的CaptureResult |
wp |
mListener | 用于Camera3Device回调Client |
std::unordered_map<std::string, camera3::DistortionMapper> | mDistortionMappers | 对于支持畸变矫正的Camera,对CaptureRequest和CaptureResult进行修正 |
std::unordered_map<std::string, camera3::ZoomRatioMapper> | mZoomRatioMappers | 处理Zoom Ration与Crop Region之间的转换,对CaptureRequest和CaptureResult进行修正 |
std::unordered_map<std::string, camera3::UHRCropAndMeteringRegionMapper> | mUHRCropAndMeteringRegionMappers | 对于支持ULTRA HIGH RESOLUTION的Camera,对CaptureRequest进行修正 |
std::unordered_map<std::string, camera3::RotateAndCropMapper> | mRotateAndCropMappers | 对于支持Auto rotate-and-crop的Camera,对CaptureRequest和CaptureResult进行修正 |
camera_metadata_enum_android_scaler_rotate_and_crop_t | mRotateAndCropOverride | dumpsys media.camera Debug使用,强制设置RotateAndCrop Mode |
TagMonitor | mTagMonitor | Debug使用,用于跟踪CaptureRequest/CaptureResult中的Metadata变化情况 |
metadata_vendor_id_t | mVendorTagId | 标识Vendor Tag的ID,不同Camera可以有不同的Vendor Tag ID,用于操作Vendor Tag |
int | mLastTemplateId | 存放最后一次获取默认CaptureRequest的Template ID,如果configure streams没有带session parameters,则以这包参数为session parameters |
camera_metadata_enum_android_control_autoframing | mAutoframingOverride | dumpsys media.camera Debug使用,强制设置Autoframing Mode |
std::string | mActivePhysicalId | Logical Multicam的情况,记录目前正在使用的Physical Camera ID |
sp<Camera3DeviceInjectionMethods> |
mInjectionMethods | Inject Camera时使用 |