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

<!-- Copyright 2018 مشروع مفتوح المصدر لنظام Android

تم الترخيص بموجب ترخيص 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 ويعدّد أجهزة الكاميرا الخارجية وفقًا لذلك. تتضمّن العملية أذونات وسياسة SE مشابهة لعملية 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>
    
  • اربط مثيل مزوّد الكاميرا external/0 AIDL بـ hal_camera_service في ملف sepolicy/service_contexts على الجهاز. لمزيد من المعلومات، يُرجى الاطّلاع على سياسة SEPolicy لطبقات HAL في AIDL.

    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

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

تنسيق ناتج HAL

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

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

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

التحقق من صحة البيانات

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