دوربین‌های USB خارجی

<!-- Copyright 2018 The Android Open Source Project

تحت پروانه آپاچی، نسخه ۲.۰ («پروانه»)؛ به‌غیراز مواردی که با «پروانه» مطابقت داشته باشد، مجاز به استفاده از این فایل نیستید. می‌توانید نسخه‌ای از «پروانه» را در نشانی زیر دریافت کنید:

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

مگر اینکه قانون ذی‌ربط الزامی کرده باشد یا به‌صورت کتبی توافق شده باشد، نرم‌افزار توزیع‌شده تحت «پروانه» به‌صورت «همان‌طور که هست» و بدون هیچ‌گونه ضمانت یا شرطی، اعم از صریح یا ضمنی، توزیع می‌شود. برای مشاهده متن به‌خصوصی که اجازه‌ها و محدودیت‌ها را تحت «پروانه» کنترل می‌کند، به «پروانه» مراجعه کنید. -->

پلاتفرم Android از استفاده از دوربین‌های USB آماده استفاده (یعنی وب‌کم‌ها) بااستفاده از استاندارد Android Camera2 API و رابط HAL دوربین پشتیبانی می‌کند. وب‌کم‌ها معمولاً از درایورهای کلاس ویدیو USB (UVC) پشتیبانی می‌کنند و در Linux، از درایور استاندارد Video4Linux (V4L) برای کنترل دوربین‌های UVC استفاده می‌شود.

با پشتیبانی از وب‌کم‌ها، می‌توان از دستگاه‌ها در موارد استفاده سبک مانند گپ تصویری و کیوسک‌های عکس استفاده کرد. این ویژگی جایگزین HALهای دوربین داخلی معمولی در تلفن‌های Android نمی‌شود و برای پشتیبانی از وظایف پیچیده و با عملکرد فشرده که شامل جاری‌سازی با وضوح بالا و سرعت بالا، واقعیت افزوده، و کنترل دستی ISP/حسگر/لنز است طراحی نشده است.

فرایند HAL دوربین USB بخشی از ارائه‌دهنده دوربین خارجی است که به دردسترس بودن دستگاه USB گوش می‌دهد و دستگاه‌های دوربین خارجی را بر همین اساس فهرست می‌کند. این فرایند دارای اجازه‌ها و خط‌مشی SE مشابه با فرایند HAL دوربین داخلی است. برنامه‌های وب‌بین شخص ثالث که مستقیماً با دستگاه‌های USB ارتباط برقرار می‌کنند، برای دسترسی به دستگاه‌های UVC به همان اجازه‌های دوربین نیاز دارند که هر برنامه دوربین معمولی نیاز دارد.

مثال‌ها و منابع

برای اطلاعات بیشتر درباره نحوه پیاده‌سازی دوربین‌های USB، به پیاده‌سازی مرجع ارائه‌دهنده دوربین خارجی در ExternalCameraProvider مراجعه کنید. پیاده‌سازی‌های جلسه و دستگاه دوربین خارجی در ExternalCameraDevice و ExternalCameraDeviceSession گنجانده شده است. از سطح میانای برنامه‌سازی کاربردی ۲۸، میانای برنامه‌سازی کاربردی کلاینت Java شامل سطح سخت‌افزار EXTERNAL است.

پیاده‌سازی

پیاده‌سازی باید از ویژگی سیستم android.hardware.usb.host پشتیبانی کند.

پشتیبانی هسته برای دستگاه‌های UVC نیز باید فعال باشد. با افزودن موارد زیر به فایل‌های defconfig هسته مربوطه می‌توانید این ویژگی را فعال کنید.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

برای فعال کردن ارائه‌دهنده دوربین خارجی در ساخت دستگاه مربوطه، که مجوزهای SELinux لازم، پیکربندی دوربین خارجی، و وابستگی ارائه‌دهنده دوربین خارجی را اضافه می‌کند، مراحل زیر را تکمیل کنید:

  • فایل پیکربندی دوربین خارجی و کتابخانه دوربین خارجی را به 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
    
  • نام ارائه‌دهنده دوربین خارجی را به مانیفست HAL دستگاه Treble اضافه کنید.

    <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>
    
  • (اختیاری) اگر دستگاه در حالت عبوردهی Treble اجرا می‌شود، sepolicy را به‌روزرسانی کنید تا cameraserver بتواند به دوربین 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;
    

در اینجا نمونه‌ای از external_camera_config.xml (خطوط حق نشر حذف شده است) آورده شده است.

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

سفارشی‌سازی

می‌توانید دوربین Android را ازطریق گزینه‌های سفارشی‌سازی عمومی یا بهینه‌سازی‌های مختص دستگاه بهبود دهید.

سفارشی‌سازی‌های عمومی

با اصلاح فایل external_camera_config.xml می‌توانید ارائه‌دهنده دوربین خارجی را سفارشی‌سازی کنید. به‌طور دقیق، کارخواه‌ها می‌توانند پارامترهای زیر را سفارشی‌سازی کنند:

  • به‌جز گره‌های ویدیویی دوربین‌های داخلی
  • اندازه تصویر پشتیبانی‌شده و حد بالای نرخ فریم
  • تعداد میان‌گیرهای درحال پرواز (مبادله بین پرش و حافظه)

علاوه‌بر این پارامترها، می‌توانید پارامترهای خودتان را اضافه کنید یا پیکربندی‌های خودتان را توسعه دهید.

بهینه‌سازی‌های ویژه دستگاه

همچنین می‌توانید با افزودن بهینه‌سازی‌های مختص دستگاه، عملکرد را بهبود دهید.

کپی/مقیاس‌بندی بافر و کدبندی/کدگشایی JPEG

پیاده‌سازی‌های عمومی از CPU (libyuv/libjpeg) استفاده می‌کنند اما می‌توانید این را با بهینه‌سازی‌های مختص دستگاه جایگزین کنید.

قالب خروجی HAL

پیاده‌سازی‌های عمومی از قالب‌های برونداد زیر استفاده می‌کنند:

  • ‫YUV_420_888 برای میان‌گیری‌های ویدیو IMPLEMENTATION_DEFINED
  • YUV12 برای همه میانگیرهای IMPLEMENTATION_DEFINED دیگر

برای بهبود عملکرد، می‌توانید قالب‌های برونداد را با قالب‌های کارآمد مختص دستگاه جایگزین کنید. همچنین می‌توانید از قالب‌های اضافی در پیاده‌سازی سفارشی‌شده پشتیبانی کنید

اعتبارسنجی

دستگاه‌های دارای پشتیبانی از دوربین خارجی باید دوربین CTS را بگذرانند. وب‌کم USB خارجی باید درطول اجرای آزمایش به دستگاه موردنظر متصل بماند، درغیراین‌صورت برخی‌از موارد آزمایشی ناموفق خواهند بود.