поддержка [изображений] HEIF

Устройства с 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 для камеры

Тесты VTS для камеры