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

<!-- حق نشر 2018 پروژه متن‌باز اندروید

تحت مجوز آپاچی، نسخه ۲.۰ ("مجوز")؛ شما مجاز به استفاده از این فایل نیستید، مگر با رعایت این مجوز. می‌توانید یک نسخه از مجوز را از اینجا دریافت کنید

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

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

پلتفرم اندروید با استفاده از رابط برنامه‌نویسی کاربردی استاندارد اندروید Camera2 و رابط کاربری دوربین HAL ، از دوربین‌های USB (که به آنها وب‌کم می‌گویند) که به صورت plug-and-play هستند، پشتیبانی می‌کند. وب‌کم‌ها معمولاً از درایورهای کلاس ویدیوی USB (UVC) پشتیبانی می‌کنند و در لینوکس، از درایور استاندارد Video4Linux (V4L) برای کنترل دوربین‌های UVC استفاده می‌شود.

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

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

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

برای اطلاعات بیشتر در مورد نحوه پیاده‌سازی دوربین‌های USB، به پیاده‌سازی مرجع ارائه‌دهنده دوربین خارجی در ExternalCameraProvider مراجعه کنید. پیاده‌سازی‌های دستگاه دوربین خارجی و جلسه در ExternalCameraDevice و ExternalCameraDeviceSession گنجانده شده‌اند. از سطح API 28، API کلاینت جاوا شامل سطح سخت‌افزار 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>
    
  • (اختیاری) اگر دستگاه در حالت عبور 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>

سفارشی‌سازی

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

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

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

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

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

بهینه‌سازی‌های مختص دستگاه

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

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

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

فرمت خروجی HAL

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

  • YUV_420_888 برای بافرهای IMPLEMENTATION_DEFINED ویدیو
  • YUV12 برای سایر بافرهای IMPLEMENTATION_DEFINED

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

اعتبارسنجی

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