搭载 Android 10 的设备支持 HEIC 压缩图片格式,它是 ISO/IEC 23008-12 中规定的高效图片文件格式 (HEIF) 的高效视频编码 (HEVC) 特定品牌。与 JPEG 文件相比,HEIC 编码的图片质量更好且文件更小。
HEIC 图片由相机框架生成,请求来自相机 HAL 的未压缩图片并将其发送到媒体子系统,以便由 HEIC 或 HEVC 编码器进行编码。
要求
如需支持 HEIC 图片格式,您的设备必须拥有支持 MIMETYPE_IMAGE_ANDROID_HEIC 或 MIMETYPE_VIDEO_HEVC(具有恒定质量模式)的硬件编码器。
实现
如需在您的设备上支持 HEIC 图片格式,请实现 HEIC/HEVC 编解码器,并为所需的流配置(即 IMPLEMENTATION_DEFINED/YUV 流和 JPEG 应用细分流)提供支持。
媒体
对于相应的硬件,以恒定质量 (CQ) 模式实现 HEIC/HEVC 编解码器,如下所示:
HEVC 类型编解码器使用具有 GRALLOC_USAGE_HW_VIDEO_ENCODER 用法的 IMPLEMENTATION_DEFINED 格式或 HAL_PIXEL_FORMAT_YCBCR_420_888 格式,具体取决于图片大小。
HEIC 类型编解码器使用具有 GRALLOC_USAGE_HW_IMAGE_ENCODER 用法的 IMPLEMENTATION_DEFINED 格式。
相机
在静态元数据中,将 ANDROID_HEIC_INFO_SUPPORTED 设置为 true,并将 ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT 设置为介于 [1, 16] 之间的值,以表明 JPEG 应用细分的数量。
对于每个必要的流组合,您的摄像头设备必须支持使用相同大小的 HEIC 流替换 JPEG 流。
对于公共 API 上的 HEIC 输出流,摄像头服务会创建两个 HAL 内部流:
具有 JPEG_APPS_SEGMENT 使用标志的 BLOB 流,可存储应用细分(包括 EXIF 和缩略图细分)
IMPLEMENTATION_DEFINED 和 YCBCR_420_888 会根据目标编解码器和 HEIC 流的大小流式传输 HEIC 流的大小
相机框架根据 ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT 为相机 HAL 分配足够大的缓冲区,以便填充 JPEG 应用细分。APP1 细分为必填项,但 APP1 之后(APP2 及以上)的细分为可选项。相机框架可以覆盖 APP1 细分中的 EXIF 标记(这些标记可以派生自捕获结果元数据或者与主图片比特流相关),并将它们发送至 MediaMuxer。
由于媒体编码器将屏幕方向嵌入到输出图片的元数据中,以确保主图片和缩略图的屏幕方向一致,因此相机 HAL 不得根据 android.jpeg.orientation. 旋转缩略图。该框架将屏幕方向写入到 EXIF 元数据和 HEIC 容器中。
与 JPEG 格式相关的静态、控制和动态元数据标记也适用于 HEIC 格式。例如,捕获请求中的 android.jpeg.orientation 和 android.jpeg.quality 元数据标记用于控制 HEIC 图片的屏幕方向和质量。
注意:无法同时配置 JPEG 和 HEIC 流。
如需在应用中使用 HEIC 格式,请使用 HEIC 公共 API。
如需了解详情,请参阅以下来源。
相机 HAL
docs.html
CameraBlob
ANDROID_HEIC_INFO_SUPPORTED
ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT
图形缓冲区数据空间
JPEG_APP_SEGMENTS
HEIF
图形缓冲区使用空间
HW_IMAGE_ENCODER
验证
如需验证您的实现是否支持 HEIC 图片,请使用 TestingCamera2 测试应用,并运行以下摄像头 CTS 和 VTS 测试。
摄像头 CTS 测试
NativeImageReaderTest#testHeic
ImageReaderTest#testHeic
ImageReaderTest#testRepeatingHeic
ReprocessCaptureTest#testBasicYuvToHeicReprocessing
ReprocessCaptureTest#testBasicOpaqueToHeicReprocessing
RobustnessTest#testMandatoryOutputCombinations
StillCaptureTest#testHeicExif
摄像头 VTS 测试
VtsHalCameraProviderV2_4TargetTest.cpp