HEIF-Bildverarbeitung

Auf Geräten mit Android 10 wird das komprimierte Bildformat HEIC unterstützt. Dabei handelt es sich um eine Marke der High Efficiency Video Encoding (HEVC) des High Efficiency Image File Format (HEIF) gemäß ISO/IEC 23008-12. HEIC-codierte Bilder bieten im Vergleich zu JPEG-Dateien eine bessere Bildqualität bei kleineren Dateigrößen.

HEIC-Bilder werden vom Kamera-Framework generiert, indem ein unkomprimiertes Bild von der Kamera-HAL angefordert und an das Media-Subsystem gesendet wird, um von einem HEIC- oder HEVC-Encoder codiert zu werden.

Voraussetzungen

Damit das HEIC-Bildformat unterstützt wird, muss Ihr Gerät einen Hardware-Encoder haben, der MIMETYPE_IMAGE_ANDROID_HEIC oder MIMETYPE_VIDEO_HEVC mit dem Modus für konstante Qualitätunterstützt.

Implementierung

Wenn Sie das HEIC-Bildformat auf Ihrem Gerät unterstützen möchten, implementieren Sie einen HEIC/HEVC-Codec und bieten Sie Unterstützung für die erforderlichen Streamkonfigurationen, nämlich die Streams IMPLEMENTATION_DEFINED/YUV und JPEG-App-Segment-Streams.

Medien

Implementieren Sie den HEIC/HEVC-Codec im Modus für konstante Qualität (Constant Quality, CQ) für die entsprechende Hardware so:

  • Der HEVC-Codec verwendet je nach Bildgröße entweder das Format IMPLEMENTATION_DEFINED mit der Verwendung GRALLOC_USAGE_HW_VIDEO_ENCODER oder das Format HAL_PIXEL_FORMAT_YCBCR_420_888.
  • Der HEIC-Codec verwendet das Format IMPLEMENTATION_DEFINED mit der Verwendung GRALLOC_USAGE_HW_IMAGE_ENCODER.

Kamera

Legen Sie in den statischen Metadaten ANDROID_HEIC_INFO_SUPPORTED auf „true“ und ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT auf einen Wert zwischen [1, 16] fest, der die Anzahl der JPEG-App-Segmente angibt.

Für jede obligatorische Streamkombination muss Ihr Kameragerät das Ersetzen eines JPEG-Streams durch einen HEIC-Stream derselben Größe unterstützen.

Für einen HEIC-Ausgabestream in der öffentlichen API erstellt der Kameradienst zwei HAL-interne Streams:

  • Einen BLOB-Stream mit dem Nutzungsflag JPEG_APPS_SEGMENT zum Speichern von App-Segmenten, einschließlich EXIF- und Miniatursegmenten
  • Einen IMPLEMENTATION_DEFINED- oder YCBCR_420_888-Stream in der Größe des HEIC-Streams, je nach Zielcodec und HEIC-Streamgröße

Basierend auf ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT weist das Kamera-Framework Puffer zu, die groß genug sind, damit die Kamera-HAL die JPEG-App-Segmente füllen kann. Das APP1-Segment ist erforderlich, Segmente nach dem APP1-Segment (APP2 und höher) sind optional. Das Kamera-Framework überschreibt die EXIF-Tags im APP1-Segment, die aus den Metadaten des Aufnahmeergebnisses abgeleitet werden können oder sich auf den Hauptbild-Bitstream beziehen, und sendet sie an MediaMuxer.

Da der Media-Encoder die Ausrichtung in die Metadaten der Ausgabebilder einbettet, muss die Kamera-HAL das Miniaturbild nicht basierend auf drehen, um eine einheitliche Ausrichtung zwischen dem Hauptbild und dem Miniaturbild zu gewährleisten. Das Framework schreibt die Ausrichtung in die EXIF-Metadaten und den HEIC-Container.android.jpeg.orientation.

Die statischen, Steuerungs- und dynamischen Metadaten-Tags, die sich auf das JPEG-Format beziehen, gelten auch für das HEIC-Format. Beispielsweise werden die Metadaten-Tags android.jpeg.orientation und android.jpeg.quality in der Aufnahmeanfrage verwendet, um die Ausrichtung und Qualität von HEIC-Bildern zu steuern.

Wenn Sie das HEIC-Format in einer App verwenden möchten, verwenden Sie die öffentliche HEIC-API.

Weitere Informationen finden Sie in den folgenden Quellen.

Kamera-HAL

Datenbereich für Grafikpuffer

Verwendungsbereich für Grafikpuffer

Validierung

Wenn Sie prüfen möchten, ob Ihre Implementierung HEIC-Bilder unterstützt, verwenden Sie die TestingCamera2 Test-App und führen Sie die folgenden CTS- und VTS-Tests für die Kamera aus.

CTS-Tests für die Kamera

VTS-Tests für die Kamera