HEIF-Bildgebung

Geräte mit Android 10 unterstützen das komprimierte Bildformat HEIC, eine HEVC-spezifische Marke (High Efficiency Video Encoding) des HEIF (High Efficiency Image File Format), wie in ISO/IEC 23008-12 spezifiziert. HEIC-kodierte Bilder bieten im Vergleich zu JPEG-Dateien eine bessere Bildqualität bei kleineren Dateigrößen.

HEIC-Bilder werden vom Kamera-Framework generiert, indem es ein unkomprimiertes Bild von der Kamera-HAL anfordert und es an das Mediensubsystem sendet, um es von einem HEIC- oder HEVC-Encoder kodieren zu lassen.

Anforderungen

Um das HEIC-Bildformat zu unterstützen, muss Ihr Gerät über einen Hardware-Encoder verfügen, MIMETYPE_IMAGE_ANDROID_HEIC oder MIMETYPE_VIDEO_HEVC mit dem konstanten Qualitätsmodus unterstützt.

Implementierung

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

Medien

Implementieren Sie den HEIC/HEVC-Codec im CQ-Modus (Constant Quality) für die entsprechende Hardware wie folgt:

  • Der Codec vom Typ HEVC 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 Codec vom Typ HEIC verwendet das Format IMPLEMENTATION_DEFINED mit der Verwendung von GRALLOC_USAGE_HW_IMAGE_ENCODER .

Kamera

Setzen 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] , der die Anzahl der JPEG-App-Segmente angibt.

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

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

  • Ein BLOB-Stream mit dem Verwendungsflag JPEG_APPS_SEGMENT zum Speichern von App-Segmenten, einschließlich EXIF- und Miniaturbildsegmenten
  • Ein IMPLEMENTATION_DEFINED oder YCBCR_420_888 Stream mit der Größe des HEIC-Streams, abhängig vom Zielcodec und der 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, aber Segmente, die dem APP1 Segment folgen ( APP2 und höher), sind optional. Das Kamera-Framework überschreibt die EXIF-Tags im APP1 Segment, die aus den Metadaten des Erfassungsergebnisses abgeleitet werden können oder sich auf den Hauptbild-Bitstream beziehen, und sendet sie an MediaMuxer .

Da der Medienencoder die Ausrichtung in die Metadaten der Ausgabebilder einbettet, darf die Kamera-HAL das Miniaturbild nicht basierend auf android.jpeg.orientation. Das Framework schreibt die Ausrichtung in die EXIF-Metadaten und den HEIC-Container.

Die mit dem JPEG-Format verbundenen statischen, Kontroll- und dynamischen Metadaten-Tags gelten auch für das HEIC-Format. Beispielsweise werden die Metadaten-Tags android.jpeg.orientation und android.jpeg.quality in der Erfassungsanforderung verwendet, um die Ausrichtung und Qualität von HEIC-Bildern zu steuern.

Um das HEIC-Format in einer Anwendung zu verwenden, verwenden Sie die öffentliche HEIC-API .

Weitere Informationen finden Sie in den folgenden Quellen.

Kamera HAL

Grafischer Pufferdatenraum

Grafikpuffer-Nutzungsraum

Validierung

Um zu überprüfen, ob Ihre Implementierung HEIC-Bilder unterstützt, verwenden Sie die Testanwendung TestingCamera2 und führen Sie die folgenden Kamera-CTS- und VTS-Tests aus.

Kamera-CTS-Tests

Kamera-VTS-Tests