कैमरा

Android Camera HAL का आइकॉन

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

भवन निर्माण

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

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

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

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

HAL लागू करना

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

आम तौर पर, बाइंडर वाले HAL को ये HIDL इंटरफ़ेस लागू करने होंगे:

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

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

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

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

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

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

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

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

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

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

ऐप्लिकेशन फ़्रेमवर्क
ऐप्लिकेशन फ़्रेमवर्क लेवल पर, ऐप्लिकेशन का कोड होता है. यह कैमरा हार्डवेयर के साथ इंटरैक्ट करने के लिए, android.hardware.Camera एपीआई का इस्तेमाल करता है. अंदरूनी तौर पर, यह कोड उस JNI glue क्लास को कॉल करता है जो कैमरे के साथ इंटरैक्ट करने वाले नेटिव कोड को ऐक्सेस करता है.
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 इमेज फ़ॉर्मैट का इस्तेमाल करना ज़रूरी है. इससे डिसप्ले पर कैमरे की इमेज की झलक देखने और वीडियो रिकॉर्ड करने में मदद मिलती है.

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

एचएएल, कैमरा ड्राइवर और हाई-लेवल 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 एचएएल के लिए लागू करने का तरीका देखें.

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

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

  1. अपनी लाइब्रेरी की सोर्स फ़ाइलों को शामिल करने के लिए, device/<company_name>/<device_name>/camera डायरेक्ट्री बनाएं.
  2. शेयर की जाने वाली लाइब्रेरी बनाने के लिए, Android.mk फ़ाइल बनाएं. पक्का करें कि makefile में ये लाइनें शामिल हों:
    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.mkmakefile में ये लाइनें जोड़ें:
    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 makefile में ये लाइनें जोड़ें:
    # 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.mkmakefile में PRODUCT_PACKAGES वैरिएबल में यह जानकारी दें:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...