कैमरा

Android Camera HAL का आइकॉन

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

आर्किटेक्चर

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

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

पहली इमेज. कैमरे का आर्किटेक्चर

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

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

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

किसी सामान्य बाइंडराइज़्ड एचएएल को, इन एचआईडीएल इंटरफ़ेस को लागू करना होगा:

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

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

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

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

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

इस सेक्शन में, लेगसी एचएएल कॉम्पोनेंट के आर्किटेक्चर और एचएएल को लागू करने के तरीके के बारे में बताया गया है. Android 8.0 और इसके बाद के वर्शन पर, कैमरे के एचएएल को लागू करने के लिए, ऊपर बताए गए एचआईडीएल एपीआई का इस्तेमाल करना होगा.

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

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

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

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

ऐप्लिकेशन फ़्रेमवर्क
ऐप्लिकेशन फ़्रेमवर्क के लेवल पर, ऐप्लिकेशन का कोड होता है. यह कोड, कैमरे के हार्डवेयर के साथ इंटरैक्ट करने के लिए android.hardware.Camera एपीआई का इस्तेमाल करता है. इंटरनली, यह कोड, कैमरे के साथ इंटरैक्ट करने वाले नेटिव कोड को ऐक्सेस करने के लिए, JNI ग्लू क्लास को कॉल करता है.
JNI
से जुड़ा JNI कोड, frameworks/base/core/jni/android_hardware_Camera.cpp में मौजूद है.android.hardware.Camera यह कोड फ़िज़िकल कैमरे का ऐक्सेस पाने के लिए, लोअर लेवल के नेटिव कोड को कॉल करता है साथ ही, ऐसा डेटा रिटर्न करता है जिसका इस्तेमाल 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 इमेज फ़ॉर्मैट के साथ काम करना होगा, ताकि डिसप्ले पर कैमरे की इमेज का प्रीव्यू और वीडियो रिकॉर्डिंग की सुविधा दी जा सके.

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

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

camera_common.h, camera_module को तय करता है. यह कैमरे के बारे में सामान्य जानकारी पाने के लिए एक स्टैंडर्ड स्ट्रक्चर है. जैसे, कैमरे का आईडी और सभी कैमरों की सामान्य प्रॉपर्टी (यानी, यह फ्रंट-फ़ेसिंग कैमरा है या बैक-फ़ेसिंग कैमरा).

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

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

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

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, लाइब्रेरी को सही तरीके से लोड कर सके. उदाहरण के लिए, hardware/ti/omap4xxx/Android.mk में मौजूद, Galaxy Nexus कैमरे के लिए मेकफ़ाइल देखें.

  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. `media_profiles.xml` और `media_codecs.xml` फ़ाइलों को सही जगह पर कॉपी करने के लिए, अपने डिवाइस की ` device/<company_name>/<device_name>/device.mk` मेकफ़ाइल ` ` में ये लाइनें जोड़ें:
    # 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. अपने डिवाइस की सिस्टम इमेज में, कैमरा ऐप्लिकेशन शामिल करने के लिए, अपने डिवाइस की device/<company>/<device>/device.mk मेकफ़ाइल में, PRODUCT_PACKAGES वैरिएबल में इसे तय करें:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...