कैमरा

Android Camera HAL का आइकॉन

Android का कैमरा हार्डवेयर ऐब्स्ट्रक्शन लेयर (HAL), हाई लेवल पर कनेक्ट होता है में Camera फ़्रेमवर्क एपीआई कैमरा 2 को, पहले से मौजूद कैमरा ड्राइवर और हार्डवेयर के साथ जोड़ा जा सकता है. कैमरा सबसिस्टम इसमें कैमरा पाइपलाइन के कॉम्पोनेंट को लागू किया जाता है, जबकि कैमरा एचएएल में इन सुविधाओं के आपके वर्शन को लागू करने के लिए इंटरफ़ेस उपलब्ध कराता है कॉम्पोनेंट.

भवन निर्माण

नीचे दिए गए डायग्राम और सूची में, HAL के कॉम्पोनेंट के बारे में बताया गया है.

Android कैमरा आर्किटेक्चर

पहला डायग्राम. कैमरा आर्किटेक्चर

ऐप्लिकेशन का फ़्रेमवर्क
ऐप्लिकेशन फ़्रेमवर्क लेवल पर ऐप्लिकेशन का कोड होता है, जो कैमरा हार्डवेयर के साथ इंटरैक्ट करने के लिए, Camera 2 एपीआई. आंतरिक रूप से, यह कोड संबंधित कॉल बाइंडर इंटरफ़ेस, कैमरा.
एआईडीएल
CameraService से जुड़ा बाइंडर इंटरफ़ेस ऐसा हो सकता है यहां मिला फ़्रेमवर्क/av/camera/aiDL/android/hardware पर पोस्ट किए जाते हैं. जनरेट किया गया कोड, नीचे दिए गए लेवल के नेटिव कोड को कॉल करता है, ताकि फ़िज़िकल कैमरा और वह डेटा वापस करता है जिसका इस्तेमाल इमेज बनाने के लिए किया जाता है CameraDevice और आखिर में CameraCaptureSession ऑब्जेक्ट को फ़्रेमवर्क लेवल पर सबमिट करें.
नेटिव फ़्रेमवर्क
frameworks/av/ में मौजूद यह फ़्रेमवर्क, नेटिव, CameraDevice और CameraCaptureSession क्लास. इन्हें भी देखें NDK Camera2 रेफ़रंस.
बाइंडर आईपीसी इंटरफ़ेस
आईपीसी बाइंडर इंटरफ़ेस, प्रोसेस की सीमाओं के अंदर बातचीत की सुविधा देता है. में कई कैमरा बाइंडर क्लास हैं frameworks/av/camera/camera/aidl/android/hardware डायरेक्ट्री, जिसमें कॉल किया जा सकता है. ICameraService, कैमरा सेवा का इंटरफ़ेस है; ICameraDeviceUser किसी एक ओपन विंडो का इंटरफ़ेस है कैमरा डिवाइस; और ICameraServiceListener और ICameraDeviceCallbacks उनसे जुड़े CameraService और CameraDevice कॉलबैक ऐप्लिकेशन फ़्रेमवर्क.
कैमरा सर्विस
कैमरा सेवा, आपकी जगह पर मौजूद है frameworks/av/services/camera/libcameraservice/CameraService.cpp, वह असल कोड है जो एचएएल के साथ इंटरैक्ट करता है.
HAL
हार्डवेयर ऐब्स्ट्रक्शन लेयर, स्टैंडर्ड इंटरफ़ेस के बारे में बताती है के साथ आने वाली हैं और जिसे आपको अपने कैमरे के लिए लागू करना होगा. हार्डवेयर सही तरीके से काम कर रहा है.

एचएएल को लागू करना

एचएएल, कैमरा ड्राइवर और हाई-लेवल Android फ़्रेमवर्क के बीच में होता है और ऐसा इंटरफ़ेस तय करता है जिसे आपको लागू करना होगा, ताकि ऐप्लिकेशन सही तरीके से काम कर सकें कैमरा हार्डवेयर. एचआईडीएल कैमरा एचएएल के इंटरफ़ेस के बारे में इसमें बताया गया है हार्डवेयर/इंटरफ़ेस/कैमरा.

एक सामान्य बाइंडरेड HAL को ये HIDL इंटरफ़ेस लागू करने होंगे:

  • ICameraProvider: अलग-अलग डिवाइसों की गिनती करने और उनका स्टेटस मैनेज करने के लिए.
  • ICameraDevice: कैमरा डिवाइस का इंटरफ़ेस.
  • ICameraDeviceSession: ऐक्टिव कैमरा डिवाइस सेशन का इंटरफ़ेस.

रेफ़रंस HIDL को लागू करने की सुविधा इनके लिए उपलब्ध है CameraProvider.cpp CameraDevice.cpp, और CameraDeviceSession.cpp. लागू करने की प्रोसेस में ऐसे पुराने एचएएल शामिल हैं जो अब भी लेगसी एपीआई. Android 8.0 और उसके बाद के वर्शन में, कैमरा एचएएल को लागू करने के लिए HIDL API का इस्तेमाल किया जाना चाहिए; इस्तेमाल काम नहीं करता.

इनपुट की पुष्टि करना

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

लेगसी एचएएल कॉम्पोनेंट

इस सेक्शन में, लेगसी एचएएल कॉम्पोनेंट के स्ट्रक्चर के बारे में बताया गया है. साथ ही, यह भी बताया गया है कि एचएएल को लागू करना चाहिए. Android 8.0 और उसके बाद के वर्शन पर कैमरा एचएएल लागू करने की सुविधा का इस्तेमाल करना ज़रूरी है का उपयोग करें, जैसा ऊपर बताया गया है.

आर्किटेक्चर (लेगसी)

नीचे दिए गए डायग्राम और सूची में, लेगसी कैमरा एचएएल कॉम्पोनेंट के बारे में बताया गया है.

Android कैमरा आर्किटेक्चर

दूसरा डायग्राम. लेगसी कैमरा आर्किटेक्चर

ऐप्लिकेशन का फ़्रेमवर्क
ऐप्लिकेशन फ़्रेमवर्क लेवल पर ऐप्लिकेशन का कोड होता है, जो android.hardware.Camera कैमरा हार्डवेयर के साथ इंटरैक्ट करने के लिए एपीआई. आंतरिक रूप से, यह कोड एक इससे इंटरैक्ट करने वाले नेटिव कोड को ऐक्सेस करने के लिए, JNI glue class कैमरा.
JNI
इससे जुड़ा जेएनआई कोड android.hardware.Camera यहां है frameworks/base/core/jni/android_hardware_Camera.cpp. यह कोड फ़िज़िकल कैमरे का ऐक्सेस पाने के लिए, निचले लेवल के नेटिव कोड को कॉल करता है और वह डेटा लौटाता है जिसका इस्तेमाल फ़्रेमवर्क लेवल पर android.hardware.Camera ऑब्जेक्ट.
नेटिव फ़्रेमवर्क
frameworks/av/camera/Camera.cpp में तय किया गया नेटिव फ़्रेमवर्क नेटिव, android.hardware.Camera क्लास. इस क्लास में आईपीसी को कैमरा सर्विस का ऐक्सेस पाने के लिए प्रॉक्सी को बाइंड करें.
बाइंडर आईपीसी प्रॉक्सी
आईपीसी बाइंडर प्रॉक्सी की मदद से, प्रोसेस की सीमाओं को पार किया जा सकता है. ये तीन कैमरा बाइंडर क्लास हैं frameworks/av/camera डायरेक्ट्री, जिसे कैमरा सेवा में कॉल किया जाता है. ICameraService, कैमरा सेवा का इंटरफ़ेस है. ICamera, खुले हुए किसी खास कैमरा डिवाइस का इंटरफ़ेस है. और ICameraClient, डिवाइस का इंटरफ़ेस है और ऐप्लिकेशन फ़्रेमवर्क.
कैमरा सर्विस
कैमरा सेवा, आपकी जगह पर मौजूद है frameworks/av/services/camera/libcameraservice/CameraService.cpp, वह असल कोड है जो एचएएल के साथ इंटरैक्ट करता है.
HAL
हार्डवेयर ऐब्स्ट्रक्शन लेयर, स्टैंडर्ड इंटरफ़ेस के बारे में बताती है के साथ आने वाली हैं और जिसे आपको अपने कैमरे के लिए लागू करना होगा. हार्डवेयर सही तरीके से काम कर रहा है.
कर्नेल ड्राइवर
कैमरे का ड्राइवर, कैमरे के हार्डवेयर और आपके डिवाइस के साथ इंटरैक्ट करता है एचएएल को लागू करना होगा. कैमरे और ड्राइवर को YV12 और NV21 पर काम करना चाहिए पर क्लिक करने के लिए डिसप्ले और वीडियो रिकॉर्डिंग की सुविधा मिलती है.

HAL (लेगसी) लागू करना

एचएएल, कैमरा ड्राइवर और हाई-लेवल Android फ़्रेमवर्क के बीच में होता है और ऐसा इंटरफ़ेस तय करता है जिसे आपको लागू करना होगा, ताकि ऐप्लिकेशन सही तरीके से काम कर सकें कैमरा हार्डवेयर. HAL इंटरफ़ेस की जानकारी hardware/libhardware/include/hardware/camera.h और hardware/libhardware/include/hardware/camera_common.h हेडर फ़ाइलें.

camera_common.h, camera_module के बारे में बताता है, जो कि एक स्टैंडर्ड है कैमरे के बारे में सामान्य जानकारी पाने के लिए, जैसे कि कैमरा आईडी और वे सभी कैमरों के लिए आम तौर पर इस्तेमाल किए जाते हैं. पीछे का कैमरा).

camera.h में ऐसा कोड है जो इससे जुड़ा है android.hardware.Camera. यह हेडर फ़ाइल camera_device निर्देश के मुताबिक camera_device_ops लागू करने वाले फ़ंक्शन के लिए पॉइंटर के साथ स्ट्रक्चर HAL इंटरफ़ेस में कॉपी करने की ज़रूरत नहीं है. कैमरा पैरामीटर से जुड़े दस्तावेज़ों के लिए, डेवलपर ये काम कर सकते हैं सेट है, तो frameworks/av/include/camera/CameraParameters.h देखें. ये पैरामीटर, HAL में int (*set_parameters)(struct camera_device *, const char *parms) के बताए गए फ़ंक्शन के साथ सेट किए जाते हैं.

एचएएल को लागू करने के उदाहरण के लिए, लागू करने के तरीके को देखें hardware/ti/omap4xxx/camera में Galaxy Nexus HAL.

शेयर की गई लाइब्रेरी कॉन्फ़िगर करें

एचएएल को लागू करने के तरीके को सही तरीके से पैकेज करने के लिए, Android बिल्ड सिस्टम को सेट अप करें और किसी फ़ाइल को चुनकर उसे उचित स्थान पर कॉपी करके Android.mk फ़ाइल:

  1. device/<company_name>/<device_name>/camera बनाएं डायरेक्ट्री में जोड़ा जा सकता है.
  2. शेयर की गई लाइब्रेरी बनाने के लिए Android.mk फ़ाइल बनाएं. पक्का करें कि कि मेकफ़ाइल में ये लाइनें शामिल हैं:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    आपकी लाइब्रेरी का नाम camera.<device_name> होना चाहिए (.so अपने-आप जुड़ जाता है), ताकि Android लाइब्रेरी. उदाहरण के लिए, इसमें मौजूद Galaxy Nexus कैमरे के लिए मेकफ़ाइल देखें hardware/ti/omap4xxx/Android.mk.

  3. ज़रूरी सुविधा एक्सएमएल को कॉपी करके यह बताएं कि आपके डिवाइस में कैमरे की सुविधाएं हैं frameworks/native/data/etc डायरेक्ट्री में मौजूद फ़ाइलें फ़ाइल होस्ट करती है. उदाहरण के लिए, यह बताने के लिए कि आपके डिवाइस में कैमरे का फ़्लैश है और ऑटोफ़ोकस की सुविधा देता है, तो अपने डिवाइस के <device>/<company_name>/<device_name>/device.mk अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है मेकफ़ाइल:
    PRODUCT_COPY_FILES := \ ...
    
    PRODUCT_COPY_FILES += \
    frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:system/etc/permissions/android.hardware.camera.flash-autofocus.xml \
    

    डिवाइस मेकफ़ाइल का उदाहरण देखने के लिए, यहां देखें device/samsung/tuna/device.mk.

  4. अपने कैमरे के मीडिया कोडेक, फ़ॉर्मैट, और रिज़ॉल्यूशन की जानकारी यहां दें device/<company_name>/<device_name>/media_profiles.xml अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है और device/<company_name>/<device_name>/media_codecs.xml एक्सएमएल फ़ाइलें. जानकारी के लिए, यह देखें कोडेक का पता लगाना फ़्रेमवर्क को ध्यान में रखकर बनाया गया है.
  5. अपने डिवाइस के device/<company_name>/<device_name>/device.mk मेकेफ़ाइल media_profiles.xml और media_codecs.xml को कॉपी करने के लिए फ़ाइलों को उचित स्थान पर अपलोड करें:
    # media config xml file
    PRODUCT_COPY_FILES += \
        <device>/<company>/<device>/media_profiles.xml:system/etc/media_profiles.xml
    
    # media codec config xml file
    PRODUCT_COPY_FILES += \
        <device>/<company>/<device>/media_codecs.xml:system/etc/media_codecs.xml
    
  6. Camera ऐप्लिकेशन को अपने डिवाइस की सिस्टम इमेज में शामिल करने के लिए, इसे आपके डिवाइस में PRODUCT_PACKAGES वैरिएबल device/<company>/<device>/device.mk मेकफ़ाइल:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...