Os dispositivos com o Android 10 oferecem suporte ao formato de imagem compactado HEIC, uma marca específica de codificação de vídeo de alta eficiência (HEVC) do formato de arquivo de imagem de alta eficiência (HEIF), conforme especificado na ISO/IEC 23008-12. As imagens codificadas em HEIC oferecem melhor qualidade de imagem com tamanhos de arquivo menores em comparação com arquivos JPEG.
Imagens HEIC são geradas pelo framework da câmera solicitando uma imagem descompactada da HAL da câmera e enviando-a ao subsistema de mídia para ser codificada por um codificador HEIC ou HEVC.
Requisitos
Para oferecer suporte ao formato de imagem HEIC, o dispositivo precisa ter um codificador de hardware
com suporte a
MIMETYPE_IMAGE_ANDROID_HEIC
ou
MIMETYPE_VIDEO_HEVC
com o
modo de qualidade constante.
Implementação
Para oferecer suporte ao formato de imagem HEIC no seu dispositivo, implemente um codec HEIC/HEVC
e ofereça suporte às configurações de stream necessárias, que são os
fluxos IMPLEMENTATION_DEFINED
/YUV
e de segmento de app JPEG.
Mídia
Implemente o codec HEIC/HEVC no modo de qualidade constante (CQ) para o hardware correspondente da seguinte maneira:
- O codec do tipo HEVC consome o formato
IMPLEMENTATION_DEFINED
com o uso deGRALLOC_USAGE_HW_VIDEO_ENCODER
ou o formatoHAL_PIXEL_FORMAT_YCBCR_420_888
, dependendo do tamanho da imagem. - O codec de tipo HEIC consome o formato
IMPLEMENTATION_DEFINED
com o uso deGRALLOC_USAGE_HW_IMAGE_ENCODER
.
Câmera
Nos metadados estáticos, defina ANDROID_HEIC_INFO_SUPPORTED
como verdadeiro e ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT
como um valor entre [1, 16]
, indicando o número de segmentos de app JPEG.
Para cada combinação de streaming obrigatória, o dispositivo de câmera precisa oferecer suporte à troca de um fluxo JPEG por um fluxo HEIC do mesmo tamanho.
Para um stream de saída HEIC na API pública, o serviço da câmera cria dois streams internos da HAL:
- Um stream BLOB com a sinalização de uso
JPEG_APPS_SEGMENT
para armazenar segmentos de apps, incluindo EXIF e segmentos de miniatura - Um fluxo
IMPLEMENTATION_DEFINED
ouYCBCR_420_888
transmite o tamanho do fluxo HEIC dependendo do codec de destino e do tamanho do fluxo HEIC
Com base em ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT
, o framework da câmera
alocou buffers grandes o suficiente para que o HAL da câmera preencha os segmentos
do app JPEG. O segmento APP1
é obrigatório, mas os segmentos que seguem o APP1
(APP2
e acima) são opcionais. O framework da câmera substitui as tags EXIF
no segmento APP1
que podem ser derivadas dos metadados do resultado da captura
ou estão relacionadas ao fluxo de bits da imagem principal e as envia para MediaMuxer
.
Como o codificador de mídia incorpora a orientação nos metadados das imagens
de saída, para garantir uma orientação consistente entre a imagem principal e a miniatura,
o HAL da câmera não pode girar a imagem da miniatura com base em
android.jpeg.orientation.
. O framework grava a orientação nos metadados
EXIF e no contêiner HEIC.
As tags de metadados estáticas, de controle e dinâmicas relacionadas ao formato JPEG também
se aplicam ao formato HEIC. Por exemplo, as tags de metadados android.jpeg.orientation
e
android.jpeg.quality
na solicitação de captura são usadas para controlar
a orientação e a qualidade das imagens HEIC.
Para usar o formato HEIC em um app, use a API pública HEIC.
Para mais informações, consulte as seguintes fontes.
HAL da câmera
Espaço de dados do buffer gráfico
Espaço de uso do buffer gráfico
Validação
Para validar se a implementação oferece suporte a imagens HEIC, use o
app de teste TestingCamera2
e execute os seguintes testes de CTS e VTS da câmera.
Testes do CTS da câmera
NativeImageReaderTest#testHeic
ImageReaderTest#testHeic
ImageReaderTest#testRepeatingHeic
ReprocessCaptureTest#testBasicYuvToHeicReprocessing
ReprocessCaptureTest#testBasicOpaqueToHeicReprocessing
RobustnessTest#testMandatoryOutputCombinations
StillCaptureTest#testHeicExif
Testes VTS de câmera