دوربین‌های 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
    
  • نام ارائه‌دهنده دوربین خارجی را به مانیفست 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>
    
  • نمونه ارائه‌دهنده دوربین external/0 AIDL را به hal_camera_service در فایل sepolicy/service_contexts دستگاه متصل کنید. برای اطلاعات بیشتر، SEPolicy برای AIDL HAL را ببینید.

    android.hardware.camera.provider.ICameraProvider/external/0 u:object_r:hal_camera_service:s0
    
  • (اختیاری) اگر دستگاه در حالت Treble passthrough اجرا می‌شود، 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 دیگر

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

اعتبارسنجی

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