Zewnętrzne kamery USB

Platforma Android obsługuje kamery USB typu „podłącz i używaj” (czyli kamery internetowe) za pomocą standardowego interfejsu Camera2 API w Androidzie oraz interfejsu HAL kamery. Kamery internetowe zwykle obsługują sterowniki USB Video Class (UVC), a w systemie Linux do sterowania kamerami UVC służy standardowy sterownik Video4Linux (V4L).

Dzięki obsłudze kamer internetowych urządzenia mogą być używane w przypadkach, w których nie jest wymagana wysoka wydajność, np. do czatu wideo i kiosków fotograficznych. Ta funkcja nie zastępuje typowych wewnętrznych interfejsów HAL aparatu na telefonach z Androidem i nie jest przeznaczona do obsługi złożonych zadań wymagających dużej wydajności, takich jak strumieniowanie w wysokiej rozdzielczości i z dużą szybkością, AR oraz ręczne sterowanie procesorem ISP, czujnikiem i obiektywem.

Proces HAL kamery USB jest częścią dostawcy kamery zewnętrznej, który sprawdza dostępność urządzenia USB i odpowiednio wylicza urządzenia kamer zewnętrznych. Proces ten ma uprawnienia i zasady SE podobne do tych, które obowiązują w przypadku wbudowanego interfejsu HAL aparatu. Aplikacje do kamer internetowych innych firm, które komunikują się bezpośrednio z urządzeniami USB, wymagają tych samych uprawnień do dostępu do urządzeń UVC co zwykłe aplikacje do aparatu.

Przykłady i źródła

Więcej informacji o wdrażaniu kamer USB znajdziesz w implementacji referencyjnej dostawcy kamer zewnętrznych na stronie ExternalCameraProvider. Implementacje aparatu zewnętrznego i sesji są dostępne w ExternalCameraDeviceExternalCameraDeviceSession. Od poziomu API 28 interfejs API klienta Java obejmuje poziom sprzętowy EXTERNAL.

Implementacja

Implementacja musi obsługiwać funkcję systemową android.hardware.usb.host.

Musisz też włączyć obsługę urządzeń UVC w jądrze. Możesz to włączyć, dodając do odpowiednich plików jądra defconfig następujące informacje.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Aby włączyć zewnętrznego dostawcę kamery w odpowiedniej kompilacji urządzenia, co spowoduje dodanie niezbędnych uprawnień SELinux, konfiguracji zewnętrznej kamery i zależności od zewnętrznego dostawcy kamery, wykonaj te czynności:

  • Dodaj plik konfiguracji i bibliotekę zewnętrznej kamery do folderu device.mk.

    +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
    
  • Dodaj nazwę zewnętrznego dostawcy kamery do pliku manifestu Treble HAL.

    <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>
    
  • (Opcjonalnie) Jeśli urządzenie działa w trybie przepuszczania Treble, zaktualizuj sepolicy, aby cameraserver mogło uzyskać dostęp do kamery UVC.

    +# 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;
    

Oto przykład external_camera_config.xml (linii z prawami autorskimi pominięto).

<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>

Dostosowywanie

Możesz ulepszyć działanie kamery w Androidzie, korzystając z ogólnych opcji dostosowywania lub optymalizacji dla konkretnego urządzenia.

Ustawienia ogólne

Dostawcę zewnętrznej kamery możesz dostosować, modyfikując plik external_camera_config.xml. W szczególności klienci mogą dostosowywać te parametry:

  • Wykluczanie węzłów wideo kamer wewnętrznych
  • Górna granica obsługiwanego rozmiaru obrazu i liczby klatek
  • Liczba buforów w trakcie przetwarzania (wybór między jankiem a pamięcią)

Oprócz tych parametrów możesz dodawać własne parametry lub tworzyć własne konfiguracje.

Optymalizacje dotyczące konkretnych urządzeń

Możesz też zwiększyć skuteczność, dodając optymalizacje dla poszczególnych urządzeń.

kopiowanie/skalowanie bufora i dekodowanie/kodowanie JPEG

Ogólne implementacje korzystają z procesora (libyuv/libjpeg), ale możesz je zastąpić optymalizacjami zależnymi od urządzenia.

Format wyjściowy HAL

W implementacjach ogólnych używane są te formaty danych wyjściowych:

  • YUV_420_888 dla buforów filmów IMPLEMENTATION_DEFINED
  • YUV12 w przypadku wszystkich pozostałych IMPLEMENTATION_DEFINED buforów

Aby zwiększyć wydajność, możesz zastąpić formaty wyjściowe wydajnymi formatami zależnymi od urządzenia. Możesz też obsługiwać dodatkowe formaty w ramach niestandardowej implementacji.

Weryfikacja

Urządzenia z obsługą zewnętrznych kamer muszą przejść testy CTS kamery. Podczas całego testu zewnętrzna kamera internetowa USB musi być podłączona do określonego urządzenia. W przeciwnym razie niektóre przypadki testowe nie przejdą.