Externe USB-Kameras

<!-- Copyright 2018 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -->

Die Android-Plattform unterstützt die Verwendung von Plug-and-Play-USB-Kameras (d. h., Webcams) über die standardmäßige Android Camera2 API und die Kamera HAL Schnittstelle. Webcams unterstützen in der Regel USB Video Class-Treiber (UVC) . Unter Linux wird der standardmäßige Video4Linux-Treiber (V4L) verwendet, um UVC-Kameras zu steuern.

Durch die Unterstützung von Webcams können Geräte in einfachen Anwendungsfällen wie Videochats und Fotokiosks verwendet werden. Diese Funktion ersetzt nicht die typischen internen Kamera-HALs auf Android-Smartphones und ist nicht für leistungsorientierte, komplexe Aufgaben mit hochauflösendem und schnellem Streaming, AR und manueller ISP-/Sensor-/Objektivsteuerung konzipiert.

Der USB-Kamera-HAL-Prozess ist Teil des externen Kameraanbieters, der die Verfügbarkeit von USB-Geräten überwacht und externe Kamerageräte entsprechend auflistet. Der Prozess hat Berechtigungen und eine SE-Richtlinie, die dem integrierten Kamera-HAL-Prozess ähneln. Webcam-Apps von Drittanbietern, die direkt mit USB-Geräten kommunizieren, benötigen dieselben Kameraberechtigungen für den Zugriff auf UVC-Geräte wie jede andere Kamera-App.

Beispiele und Quellen

Weitere Informationen zur Implementierung von USB-Kameras finden Sie in der Referenzimplementierung des externen Kamera anbieters unter ExternalCameraProvider. Die Implementierungen für externe Kameragerätesitzungen sind in ExternalCameraDevice und ExternalCameraDeviceSessionenthalten. Ab API-Level 28 enthält die Java-Client-API die EXTERNAL Hardwareebene.

Implementierung

Die Implementierung muss das android.hardware.usb.host Systemfeature unterstützen.

Außerdem muss die Kernelunterstützung für UVC-Geräte aktiviert sein. Sie können diese aktivieren, indem Sie den entsprechenden defconfig-Kerneldateien Folgendes hinzufügen.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

So aktivieren Sie den externen Kameraanbieter im entsprechenden Geräte-Build, wodurch die erforderlichen SELinux-Berechtigungen, die Konfiguration der externen Kamera und die Abhängigkeit des externen Kameraanbieters hinzugefügt werden:

  • Fügen Sie die Konfigurationsdatei der externen Kamera und die Bibliothek der externen Kamera zu device.mk hinzu.

    +PRODUCT_PACKAGES += android.hardware.camera.provider-V1-external-service
    
    +PRODUCT_COPY_FILES += \
    +device/manufacturerX/productY/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xml
    
  • Fügen Sie den Namen des externen Kameraanbieters dem Treble-HAL-Manifest des Geräts hinzu.

    <hal format="aidl">
        <name>android.hardware.camera.provider</name>
        <version>1</version>
        <interface>
            <name>ICameraProvider</name>
            <instance>internal/0</instance>
    +       <instance>external/0</instance>
        </interface>
    </hal>
    
  • (Optional) Wenn das Gerät im Treble-Passthrough-Modus ausgeführt wird, aktualisieren Sie sepolicy, damit cameraserver auf die UVC-Kamera zugreifen kann.

    +# for external camera
    +allow cameraserver device:dir r_dir_perms;
    +allow cameraserver video_device:dir r_dir_perms;
    +allow cameraserver video_device:chr_file rw_file_perms;
    

Hier ist ein Beispiel für external_camera_config.xml (Copyright-Zeilen wurden entfernt).

<ExternalCamera>
    <Provider>
        <ignore> <!-- Internal video devices to be ignored by external camera HAL -->
            <id>0</id> <!-- No leading/trailing spaces -->
            <id>1</id>
        </ignore>
    </Provider>
    <!-- See ExternalCameraUtils.cpp for default values of Device configurations below -->
    <Device>
        <!-- Max JPEG buffer size in bytes-->
        <MaxJpegBufferSize bytes="3145728"/> <!-- 3MB (~= 1080p YUV420) -->
        <!-- Size of v4l2 buffer queue when streaming >= 30fps -->
        <!-- Larger value: more request can be cached pipeline (less janky)  -->
        <!-- Smaller value: use less memory -->
        <NumVideoBuffers count="4"/>
        <!-- Size of v4l2 buffer queue when streaming < 30fps -->
        <NumStillBuffers count="2"/>

        <!-- List of maximum fps for various output sizes -->
        <!-- Any image size smaller than the size listed in Limit row will report
            fps (as minimum frame duration) up to the fpsBound value. -->
        <FpsList>
            <!-- width/height must be increasing, fpsBound must be decreasing-->
            <Limit width="640" height="480" fpsBound="30.0"/>
            <Limit width="1280" height="720" fpsBound="15.0"/>
            <Limit width="1920" height="1080" fpsBound="10.0"/>
            <!-- image size larger than the last entry will not be supported-->
        </FpsList>
    </Device>
</ExternalCamera>

Anpassung

Sie können die Android-Kamera entweder über allgemeine Anpassungsoptionen oder gerätespezifische Optimierungen verbessern.

Allgemeine Anpassungen

Sie können den externen Kameraanbieter anpassen, indem Sie die Datei external_camera_config.xml ändern. Insbesondere können Clients die folgenden Parameter anpassen:

  • Video-Nodes interner Kameras ausschließen
  • Obergrenze für unterstützte Bildgröße und Framerate
  • Anzahl der Puffer in der Warteschlange (Kompromiss zwischen Ruckeln und Arbeitsspeicher)

Zusätzlich zu diesen Parametern können Sie eigene Parameter hinzufügen oder eigene Konfigurationen entwickeln.

Gerätespezifische Optimierungen

Sie können die Leistung auch verbessern, indem Sie gerätespezifische Optimierungen hinzufügen.

Pufferkopie/-skalierung und JPEG-Decodierung/-Codierung

Bei generischen Implementierungen wird die CPU verwendet (libyuv/libjpeg). Sie können dies jedoch durch gerätespezifische Optimierungen ersetzen.

HAL-Ausgabeformat

Bei generischen Implementierungen werden die folgenden Ausgabeformate verwendet:

  • YUV_420_888 für IMPLEMENTATION_DEFINED-Videopuffer
  • YUV12 für alle anderen IMPLEMENTATION_DEFINED-Puffer

Um die Leistung zu verbessern, können Sie Ausgabeformate durch gerätespezifische, effiziente Formate ersetzen. In einer angepassten Implementierung können Sie auch zusätzliche Formate unterstützen.

Validierung

Geräte mit Unterstützung für externe Kameras müssen den Kamera-CTS bestehen. Die externe USB-Webcam muss während des gesamten Tests an das jeweilige Gerät angeschlossen bleiben, andernfalls schlagen einige Testfälle fehl.