बाहरी यूएसबी कैमरा

एंड्रॉइड प्लेटफ़ॉर्म मानक एंड्रॉइड कैमरा 2 एपीआई और कैमरा एचएएल इंटरफ़ेस का उपयोग करके प्लग-एंड-प्ले यूएसबी कैमरे (यानी, वेबकैम) के उपयोग का समर्थन करता है। वेबकैम आम तौर पर यूएसबी वीडियो क्लास (यूवीसी) ड्राइवरों का समर्थन करते हैं और लिनक्स पर, मानक वीडियो4लिनक्स (वी4एल) ड्राइवर का उपयोग यूवीसी कैमरों को नियंत्रित करने के लिए किया जाता है।

वेबकैम के समर्थन के साथ, उपकरणों का उपयोग हल्के उपयोग के मामलों जैसे वीडियो चैटिंग और फोटो कियोस्क में किया जा सकता है। यह सुविधा एंड्रॉइड फोन पर विशिष्ट आंतरिक कैमरा एचएएल को प्रतिस्थापित नहीं करती है और इसे उच्च-रिज़ॉल्यूशन और हाई-स्पीड स्ट्रीमिंग, एआर और मैन्युअल आईएसपी/सेंसर/लेंस नियंत्रण से जुड़े प्रदर्शन-गहन, जटिल कार्यों का समर्थन करने के लिए डिज़ाइन नहीं किया गया है।

यूएसबी कैमरा एचएएल प्रक्रिया बाहरी कैमरा प्रदाता का हिस्सा है जो यूएसबी डिवाइस की उपलब्धता को सुनती है और तदनुसार बाहरी कैमरा उपकरणों की गणना करती है। इस प्रक्रिया में अंतर्निहित कैमरा HAL प्रक्रिया के समान अनुमतियाँ और SE नीति है। तीसरे पक्ष के वेबकैम ऐप जो सीधे यूएसबी उपकरणों के साथ संचार करते हैं, उन्हें यूवीसी उपकरणों तक पहुंचने के लिए किसी भी नियमित कैमरा ऐप की तरह समान कैमरा अनुमतियों की आवश्यकता होती है।

उदाहरण और स्रोत

यूएसबी कैमरे को लागू करने के तरीके के बारे में अधिक जानकारी के लिए, ExternalCameraProvider पर बाहरी कैमरा प्रदाता संदर्भ कार्यान्वयन देखें। बाहरी कैमरा डिवाइस और सत्र कार्यान्वयन ExternalCameraDevice और ExternalCameraDeviceSession में शामिल हैं। एपीआई स्तर 28 से शुरू होकर, जावा क्लाइंट एपीआई में EXTERNAL हार्डवेयर स्तर शामिल है।

कार्यान्वयन

कार्यान्वयन को android.hardware.usb.host सिस्टम सुविधा का समर्थन करना चाहिए।

यूवीसी उपकरणों के लिए कर्नेल समर्थन भी सक्षम होना चाहिए। आप संबंधित कर्नेल 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 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>
    
  • (वैकल्पिक) यदि डिवाइस ट्रेबल पासथ्रू मोड में चलता है, sepolicy अपडेट करें ताकि cameraserver यूवीसी कैमरे तक पहुंच सके।

    +# 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 फ़ाइल को संशोधित करके बाहरी कैमरा प्रदाता को अनुकूलित कर सकते हैं। विशेष रूप से, ग्राहक निम्नलिखित मापदंडों को अनुकूलित कर सकते हैं:

  • आंतरिक कैमरों के वीडियो नोड्स को छोड़कर
  • समर्थित छवि आकार और फ़्रेम दर ऊपरी सीमा
  • इनफ़्लाइट बफ़र्स की संख्या (जैंक बनाम मेमोरी ट्रेडऑफ़)

इन पैरामीटरों के अतिरिक्त, आप अपने स्वयं के पैरामीटर जोड़ सकते हैं या अपनी स्वयं की कॉन्फ़िगरेशन विकसित कर सकते हैं।

डिवाइस-विशिष्ट अनुकूलन

आप डिवाइस-विशिष्ट अनुकूलन जोड़कर भी प्रदर्शन में सुधार कर सकते हैं।

बफर कॉपी/स्केलिंग और जेपीईजी डिकोड/एनकोड

सामान्य कार्यान्वयन CPU (libyuv/libjpeg) का उपयोग करते हैं लेकिन आप इसे डिवाइस-विशिष्ट अनुकूलन के साथ बदल सकते हैं।

एचएएल आउटपुट स्वरूप

सामान्य कार्यान्वयन निम्नलिखित आउटपुट स्वरूपों का उपयोग करते हैं:

  • वीडियो IMPLEMENTATION_DEFINED बफ़र्स के लिए YUV_420_888
  • अन्य सभी IMPLEMENTATION_DEFINED बफ़र्स के लिए YUV12

प्रदर्शन को बेहतर बनाने के लिए, आप आउटपुट स्वरूपों को डिवाइस-विशिष्ट कुशल प्रारूपों से बदल सकते हैं। आप अनुकूलित कार्यान्वयन में अतिरिक्त प्रारूपों का भी समर्थन कर सकते हैं

मान्यकरण

बाहरी कैमरा समर्थन वाले उपकरणों को कैमरा सीटीएस पास करना होगा। पूरे परीक्षण के दौरान बाहरी यूएसबी वेबकैम को विशिष्ट डिवाइस में प्लग किया जाना चाहिए, अन्यथा कुछ परीक्षण मामले विफल हो जाएंगे।