Android का कैमरा हार्डवेयर ऐब्स्ट्रैक्शन लेयर (एचएएल), Camera 2 में मौजूद, कैमरा फ़्रेमवर्क के हायर-लेवल एपीआई को आपके कैमरा ड्राइवर और हार्डवेयर से कनेक्ट करता है. कैमरा सबसिस्टम में, कैमरा पाइपलाइन कॉम्पोनेंट के लिए लागू किए गए तरीके शामिल होते हैं. वहीं, कैमरा HAL, इन कॉम्पोनेंट के अपने वर्शन को लागू करने के लिए इंटरफ़ेस उपलब्ध कराता है.
वास्तुकला
यहां दिए गए फ़िगर और सूची में, एचएएल कॉम्पोनेंट के बारे में बताया गया है:
पहली इमेज. कैमरे का आर्किटेक्चर.
- ऐप्लिकेशन फ़्रेमवर्क
- ऐप्लिकेशन फ़्रेमवर्क लेवल पर, ऐप्लिकेशन का कोड होता है. यह कोड, कैमरे के हार्डवेयर के साथ इंटरैक्ट करने के लिए 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.hardware.Cameraएपीआई का इस्तेमाल करता है. आंतरिक तौर पर, यह कोड कैमरे से इंटरैक्ट करने वाले नेटिव कोड को ऐक्सेस करने के लिए, JNI ग्लू क्लास को कॉल करता है. - JNI
-
android.hardware.Cameraसे जुड़ा JNI कोड,frameworks/base/core/jni/android_hardware_Camera.cppमें मौजूद है. यह कोड, फ़िज़िकल कैमरे का ऐक्सेस पाने के लिए, लोअर-लेवल के नेटिव कोड को कॉल करता है. साथ ही, ऐसा डेटा दिखाता है जिसका इस्तेमाल फ़्रेमवर्क लेवल परandroid.hardware.Cameraऑब्जेक्ट बनाने के लिए किया जाता है. - नेटिव फ़्रेमवर्क
- में तय किया गया नेटिव फ़्रेमवर्क,
frameworks/av/camera/Camera.cppandroid.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 फ़ाइल बनाकर, उसे सही जगह पर कॉपी किया जा सकेगा:
- अपनी लाइब्रेरी की सोर्स फ़ाइलों को शामिल करने के लिए,
device/<company_name>/<device_name>/cameraडायरेक्ट्री बनाएं. - शेयर की गई लाइब्रेरी बनाने के लिए,
Android.mkफ़ाइल बनाएं. पक्का करें कि मेकफ़ाइल में ये लाइनें शामिल हों:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
आपकी लाइब्रेरी का नाम
camera.<device_name>होना चाहिए (.soअपने-आप जुड़ जाता है), ताकि Android लाइब्रेरी को सही तरीके से लोड कर सके. उदाहरण के लिए,hardware/ti/omap4xxx/Android.mkमें मौजूद Galaxy Nexus कैमरे के लिए मेकफ़ाइल देखें. - अपने डिवाइस की मेकफ़ाइल के साथ, ज़रूरी सुविधा वाली एक्सएमएल फ़ाइलों को
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पर जाएं. device/<company_name>/<device_name>/media_profiles.xmlऔरdevice/<company_name>/<device_name>/media_codecs.xmlएक्सएमएल फ़ाइलों में, अपने कैमरे के मीडिया कोडेक, फ़ॉर्मैट, और रिज़ॉल्यूशन की क्षमताओं के बारे में बताएं. ज़्यादा जानकारी के लिए, कोडेक को फ़्रेमवर्क के लिए उपलब्ध कराना लेख पढ़ें.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- अपने डिवाइस की सिस्टम इमेज में Camera ऐप्लिकेशन को शामिल करने के लिए, डिवाइस के
device/<company>/<device>/device.mkmakefile मेंPRODUCT_PACKAGESवैरिएबल में इसे शामिल करें:PRODUCT_PACKAGES := \ Gallery2 \ ...