Kamera USB Eksternal

Platform Android mendukung penggunaan kamera USB plug-and-play (yaitu webcam) menggunakan API Android Camera2 standar dan antarmuka kamera HAL . Webcam umumnya mendukung driver kelas video USB (UVC) dan di Linux, driver Video4Linux (V4L) standar digunakan untuk mengontrol kamera UVC.

Dengan dukungan webcam, perangkat dapat digunakan dalam kasus penggunaan ringan seperti obrolan video dan kios foto. Fitur ini tidak menggantikan HAL kamera internal pada ponsel Android dan tidak dirancang untuk mendukung tugas kompleks dan intensif kinerja yang melibatkan streaming resolusi tinggi dan kecepatan tinggi, AR, dan kontrol ISP/sensor/lensa manual.

Proses HAL kamera USB adalah bagian dari penyedia kamera eksternal yang mendengarkan ketersediaan perangkat USB dan menghitung perangkat kamera eksternal yang sesuai. Proses ini memiliki izin dan kebijakan SE yang mirip dengan proses HAL kamera internal. Aplikasi webcam pihak ketiga yang berkomunikasi langsung dengan perangkat USB memerlukan izin kamera yang sama untuk mengakses perangkat UVC seperti halnya aplikasi kamera biasa.

Contoh dan sumber

Untuk informasi selengkapnya tentang cara mengimplementasikan kamera USB, lihat implementasi referensi penyedia kamera eksternal di ExternalCameraProvider . Perangkat kamera eksternal dan implementasi sesi disertakan dalam ExternalCameraDevice dan ExternalCameraDeviceSession . Mulai API level 28, API klien Java menyertakan level perangkat keras EXTERNAL .

Penerapan

Implementasinya harus mendukung fitur sistem android.hardware.usb.host .

Dukungan kernel untuk perangkat UVC juga harus diaktifkan. Anda dapat mengaktifkannya dengan menambahkan yang berikut ini ke file defconfig kernel masing-masing.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Untuk mengaktifkan penyedia kamera eksternal di masing-masing perangkat, yang menambahkan izin SELinux yang diperlukan, konfigurasi kamera eksternal, dan ketergantungan penyedia kamera eksternal, selesaikan langkah-langkah berikut:

  • Tambahkan file konfigurasi kamera eksternal dan perpustakaan kamera eksternal ke 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
    
  • Tambahkan nama penyedia kamera eksternal ke manifes Treble HAL perangkat.

    <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>
    
  • (Opsional) Jika perangkat berjalan dalam mode passthrough Treble, perbarui sepolicy sehingga cameraserver dapat mengakses kamera 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;
    

Berikut ini contoh external_camera_config.xml (baris hak cipta dihilangkan).

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

Kustomisasi

Anda dapat menyempurnakan kamera Android melalui opsi penyesuaian umum atau pengoptimalan khusus perangkat.

Kustomisasi umum

Anda dapat menyesuaikan penyedia kamera eksternal dengan memodifikasi file external_camera_config.xml . Secara khusus, klien dapat menyesuaikan parameter berikut:

  • Tidak termasuk node video kamera internal
  • Ukuran gambar dan batas atas kecepatan bingkai yang didukung
  • Jumlah buffer dalam penerbangan (pengorbanan jank vs memori)

Selain parameter ini, Anda dapat menambahkan parameter Anda sendiri atau mengembangkan konfigurasi Anda sendiri.

Pengoptimalan khusus perangkat

Anda juga dapat meningkatkan kinerja dengan menambahkan pengoptimalan khusus perangkat.

Penyalinan/penskalaan buffer dan decode/encode JPEG

Implementasi umum menggunakan CPU (libyuv/libjpeg) tetapi Anda dapat menggantinya dengan pengoptimalan khusus perangkat.

Format keluaran HAL

Implementasi umum menggunakan format keluaran berikut:

  • YUV_420_888 untuk buffer video IMPLEMENTATION_DEFINED
  • YUV12 untuk semua buffer IMPLEMENTATION_DEFINED lainnya

Untuk meningkatkan kinerja, Anda dapat mengganti format keluaran dengan format efisien khusus perangkat. Anda juga dapat mendukung format tambahan dalam implementasi yang disesuaikan

Validasi

Perangkat dengan dukungan kamera eksternal harus lulus CTS kamera . Webcam USB eksternal harus tetap terhubung ke perangkat tertentu selama keseluruhan pengujian dijalankan, jika tidak, beberapa kasus pengujian akan gagal.