कैमरा

Android Camera HAL का आइकॉन

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

वास्तुकला

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

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

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

ऐप्लिकेशन फ़्रेमवर्क
ऐप्लिकेशन फ़्रेमवर्क लेवल पर, ऐप्लिकेशन का कोड होता है. यह कोड, कैमरे के हार्डवेयर के साथ इंटरैक्ट करने के लिए Camera 2 API का इस्तेमाल करता है. आंतरिक तौर पर, यह कोड Binder इंटरफ़ेस को कॉल करता है, ताकि उस नेटिव कोड को ऐक्सेस किया जा सके जो कैमरे के साथ इंटरैक्ट करता है.
एआईडीएल
CameraService से जुड़ा बाइंडर इंटरफ़ेस, frameworks/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
हार्डवेयर ऐब्स्ट्रैक्शन लेयर, स्टैंडर्ड इंटरफ़ेस तय करती है. कैमरा सेवा, इस इंटरफ़ेस को कॉल करती है. आपको इस इंटरफ़ेस को लागू करना होगा, ताकि आपका कैमरा हार्डवेयर सही तरीके से काम करे.

HAL लागू करना

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

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

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

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

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

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

लेगसी HAL

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

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

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

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

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

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

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

एचएएल, कैमरा ड्राइवर और हायर-लेवल Android फ़्रेमवर्क के बीच काम करता है. यह एक ऐसा इंटरफ़ेस तय करता है जिसे आपको लागू करना होगा, ताकि ऐप्लिकेशन कैमरा हार्डवेयर को सही तरीके से इस्तेमाल कर सकें. एचएएल इंटरफ़ेस को 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 स्ट्रक्चर होता है. इसमें उन फ़ंक्शन के पॉइंटर होते हैं जो एचएएल इंटरफ़ेस को लागू करते हैं. डेवलपर, कैमरे के जिन पैरामीटर को सेट कर सकते हैं उनके बारे में जानने के लिए, 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 लाइब्रेरी को सही तरीके से लोड कर सके. उदाहरण के लिए, 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. अपने डिवाइस की सिस्टम इमेज में Camera ऐप्लिकेशन को शामिल करने के लिए, डिवाइस के device/<company>/<device>/device.mk makefile में PRODUCT_PACKAGES वैरिएबल में इसे शामिल करें:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...