Устройства с Android 10 поддерживают сжатый графический формат HEIC, который представляет собой фирменную версию высокоэффективного кодирования видео (HEVC) в высокоэффективном формате файлов изображений (HEIF), как указано в ISO/IEC 23008-12. Изображения в формате HEIC имеют более высокое качество изображения и меньший размер по сравнению с файлами JPEG.
Изображения HEIC генерируются фреймворком камеры, который запрашивает несжатое изображение у HAL камеры и отправляет его в медиаподсистему для кодирования с помощью кодировщика HEIC или HEVC.
Требования
Чтобы поддерживать графический формат HEIC, на устройстве должен быть аппаратный кодировщик, поддерживающий MIMETYPE_IMAGE_ANDROID_HEIC или MIMETYPE_VIDEO_HEVC с режимом постоянного качества.
Реализация
Чтобы устройство поддерживало графический формат HEIC, реализуйте кодек HEIC/HEVC и обеспечьте поддержку необходимых конфигураций потока, а именно потоков IMPLEMENTATION_DEFINED/YUV и потоков сегментов приложений JPEG.
Мультимедиа
Реализуйте кодек HEIC/HEVC в режиме постоянного качества (CQ) для соответствующего оборудования следующим образом:
- Кодек типа HEVC использует формат
IMPLEMENTATION_DEFINEDс использованиемGRALLOC_USAGE_HW_VIDEO_ENCODERили форматHAL_PIXEL_FORMAT_YCBCR_420_888в зависимости от размера изображения. - Кодек типа HEIC использует формат
IMPLEMENTATION_DEFINEDс использованиемGRALLOC_USAGE_HW_IMAGE_ENCODER.
Камера
В статических метаданных задайте для ANDROID_HEIC_INFO_SUPPORTED значение true, а для ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT – значение в диапазоне [1, 16], указывающее количество сегментов приложения JPEG.
Для каждой обязательной комбинации потоков камера должна поддерживать замену потока JPEG на поток HEIC того же размера.
Для выходного потока HEIC в общедоступном API сервис камеры создает два внутренних потока HAL:
- Поток BLOB с флагом использования
JPEG_APPS_SEGMENTдля хранения сегментов приложения, включая сегменты EXIF и значков. - Поток
IMPLEMENTATION_DEFINEDилиYCBCR_420_888размером с поток HEIC в зависимости от целевого кодека и размера потока HEIC
На основе ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT фреймворк камеры выделяет буферы, достаточно большие для того, чтобы HAL камеры мог заполнить сегменты приложения JPEG. Сегмент APP1 является обязательным, а сегменты, следующие за APP1
ним (APP2 и далее), – необязательными. Фреймворк камеры переопределяет теги EXIF в сегменте APP1, которые можно получить из метаданных результата съемки или которые относятся к основному битовому потоку изображения, и отправляет их в MediaMuxer.
Поскольку медиакодер встраивает ориентацию в метаданные выходных изображений, чтобы обеспечить согласованную ориентацию между основным изображением и уменьшенным изображением, HAL камеры не должен поворачивать уменьшенное изображение на основе android.jpeg.orientation.. Фреймворк записывает ориентацию в метаданные EXIF и контейнер HEIC.
Статические, контрольные и динамические теги метаданных, связанные с форматом JPEG, также применяются к формату HEIC. Например, теги метаданных android.jpeg.orientation и android.jpeg.quality в запросе на съемку используются для управления ориентацией и качеством изображений HEIC.
Чтобы использовать формат HEIC в приложении, воспользуйтесь общедоступным API HEIC.
Дополнительную информацию можно найти в следующих источниках:
HAL камеры
Пространство данных графического буфера
Объем памяти, используемый графическим буфером;
Проверка
Чтобы убедиться, что ваша реализация поддерживает изображения HEIC, используйте TestingCamera2тестовое приложение и запустите следующие тесты CTS и VTS для камеры.
Тесты CTS для камеры
NativeImageReaderTest#testHeicImageReaderTest#testHeicImageReaderTest#testRepeatingHeicReprocessCaptureTest#testBasicYuvToHeicReprocessingReprocessCaptureTest#testBasicOpaqueToHeicReprocessingRobustnessTest#testMandatoryOutputCombinationsStillCaptureTest#testHeicExif
Тесты VTS для камеры