كاميرات USB الخارجية

<!-- Copyright 2018 The Android Open Source Project

تم الترخيص بموجب ترخيص Apache، الإصدار 2.0 (المشار إليه لاحقًا باسم "الترخيص")؛ ولا يحق لك استخدام هذا الملف إلا بما يتوافق مع الترخيص. يمكنك الحصول على نسخة من الترخيص على الصفحة

  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 ويسرد أجهزة الكاميرا الخارجية وفقًا لذلك. تتضمّن العملية أذونات وسياسة أمان مشابهة لعملية HAL الخاصة بالكاميرا المضمّنة. تتطلّب تطبيقات كاميرا الويب التابعة لجهات خارجية التي تتواصل مباشرةً مع أجهزة USB أذونات الكاميرا نفسها للوصول إلى أجهزة UVC، كما هو الحال مع أي تطبيق كاميرا عادي.

أمثلة ومصادر

لمزيد من المعلومات حول كيفية استخدام كاميرات USB، يُرجى الاطّلاع على التنفيذ المرجعي لموفّر الكاميرا الخارجية على ExternalCameraProvider. يتم تضمين عمليات تنفيذ جهاز الكاميرا الخارجية والجلسة في ExternalCameraDevice و ExternalCameraDeviceSession. بدءًا من المستوى 28 لواجهة برمجة التطبيقات، تتضمّن واجهة برمجة التطبيقات الخاصة بعميل 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>
    
  • (اختياري) إذا كان الجهاز يعمل في وضع تمرير بيانات 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

تستخدم عمليات التنفيذ العامة وحدة المعالجة المركزية (libyuv/libjpeg)، ولكن يمكنك استبدالها بتحسينات خاصة بالجهاز.

تنسيق إخراج HAL

تستخدم عمليات التنفيذ العامة تنسيقات الإخراج التالية:

  • YUV_420_888 لمخازن الفيديو المؤقتة IMPLEMENTATION_DEFINED
  • YUV12 لجميع مخازن IMPLEMENTATION_DEFINED المؤقتة الأخرى

لتحسين الأداء، يمكنك استبدال تنسيقات الإخراج بتنسيقات فعّالة خاصة بالجهاز. يمكنك أيضًا توفير أشكال إضافية في عملية تنفيذ مخصّصة.

التحقُّق

يجب أن تجتاز الأجهزة التي تتوافق مع الكاميرات الخارجية اختبار توافق الكاميرا (CTS). يجب أن تظل كاميرا الويب الخارجية المتصلة بمنفذ USB موصولة بالجهاز المحدّد طوال مدة تشغيل الاختبار، وإلا ستتعذّر بعض حالات الاختبار.