कैमरा

एंड्रॉइड कैमरा एचएएल आइकन

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

वास्तुकला

निम्नलिखित चित्र और सूची एचएएल घटकों का वर्णन करती है।

एंड्रॉइड कैमरा आर्किटेक्चर

चित्र 1. कैमरा वास्तुकला

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

एचएएल का कार्यान्वयन

एचएएल कैमरा ड्राइवर और उच्च-स्तरीय एंड्रॉइड फ्रेमवर्क के बीच बैठता है और एक इंटरफ़ेस को परिभाषित करता है जिसे आपको लागू करना होगा ताकि ऐप्स कैमरा हार्डवेयर को सही ढंग से संचालित कर सकें। कैमरा HAL के लिए HIDL इंटरफेस को हार्डवेयर/इंटरफेस/कैमरा में परिभाषित किया गया है।

एक विशिष्ट बाइंडरीकृत एचएएल को निम्नलिखित एचआईडीएल इंटरफेस लागू करना होगा:

  • ICameraProvider : व्यक्तिगत उपकरणों की गणना करने और उनकी स्थिति प्रबंधित करने के लिए।
  • ICameraDevice : कैमरा डिवाइस इंटरफ़ेस।
  • ICameraDeviceSession : सक्रिय कैमरा डिवाइस सत्र इंटरफ़ेस।

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

इनपुट सत्यापन

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

विरासत एचएएल घटक

यह खंड पुराने एचएएल घटकों की वास्तुकला और एचएएल को कैसे लागू किया जाए, इसका वर्णन करता है। एंड्रॉइड 8.0 और उच्चतर पर कैमरा एचएएल कार्यान्वयन को ऊपर वर्णित एचआईडीएल एपीआई का उपयोग करना चाहिए।

वास्तुकला (विरासत)

निम्नलिखित चित्र और सूची पुराने कैमरे HAL घटकों का वर्णन करती है।

एंड्रॉइड कैमरा आर्किटेक्चर

चित्र 2. विरासती कैमरा वास्तुकला

ऐप ढांचा
ऐप फ्रेमवर्क स्तर पर ऐप का कोड होता है, जो कैमरा हार्डवेयर के साथ इंटरैक्ट करने के लिए android.hardware.Camera API का उपयोग करता है। आंतरिक रूप से, यह कोड कैमरे के साथ इंटरैक्ट करने वाले मूल कोड तक पहुंचने के लिए संबंधित जेएनआई गोंद वर्ग को कॉल करता है।
जेएनआई
android.hardware.Camera से संबद्ध JNI कोड 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 छवि प्रारूपों का समर्थन करना चाहिए।

एचएएल (विरासत) को लागू करना

एचएएल कैमरा ड्राइवर और उच्च-स्तरीय एंड्रॉइड फ्रेमवर्क के बीच बैठता है और एक इंटरफ़ेस को परिभाषित करता है जिसे आपको लागू करना होगा ताकि ऐप्स कैमरा हार्डवेयर को सही ढंग से संचालित कर सकें। एचएएल इंटरफ़ेस को 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 देखें। ये पैरामीटर एचएएल में int (*set_parameters)(struct camera_device *, const char *parms) द्वारा इंगित फ़ंक्शन के साथ सेट किए गए हैं।

एचएएल कार्यान्वयन के उदाहरण के लिए, hardware/ti/omap4xxx/camera में गैलेक्सी नेक्सस एचएएल के कार्यान्वयन को देखें।

साझा लाइब्रेरी को कॉन्फ़िगर करना

एचएएल कार्यान्वयन को साझा लाइब्रेरी में सही ढंग से पैकेज करने के लिए एंड्रॉइड बिल्ड सिस्टम सेट करें और 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 स्वचालित रूप से जोड़ा जाता है), ताकि एंड्रॉइड लाइब्रेरी को सही ढंग से लोड कर सके। उदाहरण के लिए, hardware/ti/omap4xxx/Android.mk में स्थित गैलेक्सी नेक्सस कैमरे के लिए मेकफ़ाइल देखें।

  3. अपने डिवाइस के मेकफ़ाइल के साथ frameworks/native/data/etc निर्देशिका में आवश्यक फ़ीचर XML फ़ाइलों की प्रतिलिपि बनाकर निर्दिष्ट करें कि आपके डिवाइस में कैमरा सुविधाएँ हैं। उदाहरण के लिए, यह निर्दिष्ट करने के लिए कि आपके डिवाइस में कैमरा फ्लैश है और वह ऑटोफोकस कर सकता है, अपने डिवाइस के <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 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 \
    ...