कैमरा

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

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

आर्किटेक्चर

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

चित्र 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 वर्ग के लिए एक देशी समकक्ष प्रदान करता है। यह वर्ग कैमरा सेवा तक पहुँच प्राप्त करने के लिए IPC बाइंडर प्रॉक्सी को कॉल करता है।
बाइंडर आईपीसी प्रॉक्सी
IPC बाइंडर प्रॉक्सी प्रक्रिया सीमाओं पर संचार की सुविधा प्रदान करता है। तीन कैमरा बाइंडर वर्ग हैं जो frameworks/av/camera निर्देशिका में स्थित हैं जो कैमरा सेवा में कॉल करते हैं। ICameraService कैमरा सेवा का इंटरफ़ेस है, ICamera एक विशिष्ट खुले कैमरा डिवाइस का इंटरफ़ेस है, और ICameraClient डिवाइस का इंटरफ़ेस वापस ऐप फ्रेमवर्क में है।
कैमरा सेवा
frameworks/av/services/camera/libcameraservice/CameraService.cpp में स्थित कैमरा सेवा, वास्तविक कोड है जो HAL के साथ इंटरैक्ट करता है।
हैल
हार्डवेयर एब्स्ट्रैक्शन लेयर उस मानक इंटरफ़ेस को परिभाषित करता है जिसे कैमरा सेवा कॉल करती है और जिसे आपको अपने कैमरा हार्डवेयर को सही ढंग से काम करने के लिए लागू करना होगा।
कर्नेल ड्राइवर
कैमरे का ड्राइवर वास्तविक कैमरा हार्डवेयर और एचएएल के आपके कार्यान्वयन के साथ इंटरैक्ट करता है। प्रदर्शन और वीडियो रिकॉर्डिंग पर कैमरा छवि का पूर्वावलोकन करने के लिए समर्थन प्रदान करने के लिए कैमरा और ड्राइवर को YV12 और NV21 छवि प्रारूपों का समर्थन करना चाहिए।

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

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

HAL कार्यान्वयन के उदाहरण के लिए, hardware/ti/omap4xxx/camera में Galaxy Nexus HAL के कार्यान्वयन का संदर्भ लें।

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

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

  1. अपनी लाइब्रेरी की स्रोत फ़ाइलों को शामिल करने के लिए एक device/<company_name>/<device_name>/camera निर्देशिका बनाएं।
  2. साझा लाइब्रेरी बनाने के लिए Android.mk फ़ाइल बनाएँ। सुनिश्चित करें कि मेकफ़ाइल में निम्नलिखित पंक्तियाँ हैं:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    आपकी .so का नाम camera.<device_name> होना चाहिए। उदाहरण के लिए, hardware/ti/omap4xxx/Android.mk में स्थित गैलेक्सी नेक्सस कैमरे के लिए मेकफ़ाइल देखें।

  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 XML फ़ाइलों में अपने कैमरे के मीडिया कोडेक, फ़ॉर्मैट और रिज़ॉल्यूशन क्षमताओं की घोषणा करें। विवरण के लिए, कोडेक्स को फ्रेमवर्क में एक्सपोज़ करना देखें।
  5. अपने डिवाइस के device/<company_name>/<device_name>/device.mk में निम्न पंक्तियों को जोड़ें ताकि media_profiles.xml और media_codecs.xml फ़ाइलों को उपयुक्त स्थान पर कॉपी किया जा सके:
    # 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 := \
    Gallery2 \
    ...
    
    में PRODUCT_PACKAGES वेरिएबल में निर्दिष्ट करें।