Zewnętrzne kamery USB

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

Platforma Androida obsługuje kamery USB typu plug-and-play (czyli kamery internetowe) za pomocą standardowego interfejsu Android Camera2 API i interfejsu HAL aparatu. Kamery internetowe zwykle obsługują sterowniki USB Video Class (UVC), a w systemie Linux do sterowania kamerami UVC używany jest standardowy sterownik Video4Linux (V4L).

Dzięki obsłudze kamer internetowych urządzenia mogą być używane w prostych zastosowaniach, takich jak czat wideo czy kioski fotograficzne. Ta funkcja nie zastępuje typowych wewnętrznych warstw 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 czy ręczne sterowanie procesorem ISP, czujnikiem lub obiektywem.

Proces HAL kamery USB jest częścią dostawcy kamery zewnętrznej, który nasłuchuje dostępności urządzenia USB i odpowiednio wylicza zewnętrzne urządzenia kamer. Proces ma uprawnienia i zasady SE podobne do wbudowanego procesu HAL aparatu. Aplikacje innych firm do obsługi kamer internetowych, które komunikują się bezpośrednio z urządzeniami USB, wymagają takich samych uprawnień dostępu do aparatu, aby uzyskać dostęp do urządzeń UVC, jak każda zwykła aplikacja do obsługi aparatu.

Przykłady i źródła

Więcej informacji o implementowaniu kamer USB znajdziesz w referencyjnej implementacji dostawcy kamery zewnętrznej na stronie ExternalCameraProvider. Implementacje urządzenia i sesji kamery zewnętrznej są zawarte w ExternalCameraDevice i ExternalCameraDeviceSession. Od poziomu API 28 interfejs API klienta Java obejmuje poziom sprzętowy EXTERNAL.

Implementacja

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

Musi być też włączona obsługa urządzeń UVC przez jądro. Możesz to włączyć, dodając te informacje do odpowiednich plików defconfig jądra.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

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

  • Dodaj plik konfiguracji kamery zewnętrznej i bibliotekę kamery zewnętrznej do 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ę dostawcy kamery zewnętrznej do pliku manifestu Treble HAL urządzenia.

    <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>
    
  • Powiąż instancję dostawcy aparatu AIDL external/0 z hal_camera_service w pliku sepolicy/service_contexts urządzenia. Więcej informacji znajdziesz w artykule SEPolicy dla AIDL HAL.

    android.hardware.camera.provider.ICameraProvider/external/0 u:object_r:hal_camera_service:s0
    
  • (Opcjonalnie) Jeśli urządzenie działa w trybie przekazywania 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 pliku external_camera_config.xml (pominięto wiersze dotyczące praw autorskich).

<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ć aparat na Androidzie, korzystając z ogólnych opcji dostosowywania lub optymalizacji pod kątem konkretnego urządzenia.

Dostosowania ogólne

Możesz dostosować dostawcę kamery zewnętrznej, modyfikując plik external_camera_config.xml. Klienci mogą dostosować te parametry:

  • Z wyjątkiem węzłów wideo kamer wewnętrznych
  • Obsługiwany rozmiar obrazu i górna granica liczby klatek
  • Liczba buforów w trakcie przesyłania (kompromis między zacinaniem się a pamięcią)

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

Optymalizacje pod kątem konkretnych urządzeń

Możesz też zwiększyć skuteczność, dodając optymalizacje pod kątem konkretnych urządzeń.

Kopiowanie/skalowanie bufora i dekodowanie/kodowanie JPEG

Implementacje ogólne używają procesora (libyuv/libjpeg), ale możesz je zastąpić optymalizacjami pod kątem konkretnego urządzenia.

Format wyjściowy HAL

Ogólne implementacje używają tych formatów wyjściowych:

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

Aby zwiększyć wydajność, możesz zastąpić formaty wyjściowe wydajnymi formatami dostosowanymi do konkretnych urządzeń. Możesz też obsługiwać dodatkowe formaty w niestandardowej implementacji.

Walidacja

Urządzenia z obsługą aparatu zewnętrznego muszą przejść testy CTS aparatu. Zewnętrzna kamera internetowa USB musi być podłączona do określonego urządzenia przez cały czas trwania testu, w przeciwnym razie niektóre elementy testowania nie zostaną zaliczone.