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. Kopię licencji możesz uzyskać na stronie

  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 Android obsługuje kamery USB typu plug-and-play (czyli kamery internetowe) za pomocą standardowego interfejsu API Camera2 na Androidzie i interfejsu HAL kamery. 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 przypadkach, takich jak czaty wideo i kioski fotograficzne. 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 przesyłanie strumieniowe w wysokiej rozdzielczości i z dużą szybkością, AR oraz ręczne sterowanie ISP, czujnikiem i obiektywem.

Proces HAL kamery USB jest częścią zewnętrznego dostawcy kamer, który nasłuchuje dostępności urządzeń USB i odpowiednio wylicza zewnętrzne urządzenia kamery. Proces ten ma uprawnienia i zasady SE podobne do procesu wbudowanego interfejsu HAL aparatu. Aplikacje innych firm do obsługi kamer internetowych, które komunikują się bezpośrednio z urządzeniami USB, wymagają tych samych uprawnień do aparatu, aby uzyskać dostęp do urządzeń UVC, co zwykłe aplikacje do obsługi aparatu.

Przykłady i źródła

Więcej informacji o wdrażaniu kamer USB znajdziesz w referencyjnej implementacji dostawcy kamer zewnętrznych na stronie ExternalCameraProvider. Implementacje urządzenia z zewnętrznym aparatem i sesji są zawarte w ExternalCameraDeviceExternalCameraDeviceSession. Od poziomu API 28 interfejs Java Client API zawiera EXTERNAL poziom sprzętowy.

Implementacja

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

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

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Aby włączyć zewnętrznego dostawcę aparatu w odpowiedniej kompilacji urządzenia, co dodaje niezbędne uprawnienia SELinux, konfigurację zewnętrznego aparatu i zależność zewnętrznego dostawcy aparatu, wykonaj te czynności:

  • Dodaj plik konfiguracyjny kamery zewnętrznej i bibliotekę kamery zewnętrznej 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 HAL Treble 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>
    
  • (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 właściwości external_camera_config.xml (bez wierszy dotyczących 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 specyficznych dla urządzenia.

Ogólne dostosowania

Dostawcę zewnętrznego aparatu możesz dostosować, modyfikując plik external_camera_config.xml. Klienci mogą dostosowywać te parametry:

  • Wykluczanie węzłów wideo kamer wewnętrznych
  • Górna granica obsługiwanego rozmiaru obrazu i liczby klatek na sekundę
  • 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 lub tworzyć własne konfiguracje.

Optymalizacje pod kątem konkretnych urządzeń

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

Kopiowanie/skalowanie bufora oraz dekodowanie/kodowanie JPEG

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

Format wyjściowy HAL

Ogólne implementacje korzystają z tych formatów wyjściowych:

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

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

Weryfikacja

Urządzenia obsługujące zewnętrzne kamery muszą przejść testy CTS kamery. Zewnętrzna kamera internetowa USB musi być podłączona do konkretnego urządzenia przez cały czas trwania testu, w przeciwnym razie niektóre przypadki testowe zakończą się niepowodzeniem.