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 VerwendungGRALLOC_USAGE_HW_VIDEO_ENCODER
oder das FormatHAL_PIXEL_FORMAT_YCBCR_420_888
. - Der Codec vom Typ HEIC nutzt das Format
IMPLEMENTATION_DEFINED
mit der Verwendung vonGRALLOC_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
oderYCBCR_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
-
NativeImageReaderTest#testHeic
-
ImageReaderTest#testHeic
-
ImageReaderTest#testRepeatingHeic
-
ReprocessCaptureTest#testBasicYuvToHeicReprocessing
-
ReprocessCaptureTest#testBasicOpaqueToHeicReprocessing
-
RobustnessTest#testMandatoryOutputCombinations
-
StillCaptureTest#testHeicExif
Kamera-VTS-Tests