
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
फ़ाइल बनाकर उचित स्थान पर कॉपी करें:
- अपनी लाइब्रेरी की स्रोत फ़ाइलों को शामिल करने के लिए एक
device/<company_name>/<device_name>/camera
निर्देशिका बनाएं। - साझा लाइब्रेरी बनाने के लिए
Android.mk
फ़ाइल बनाएँ। सुनिश्चित करें कि मेकफ़ाइल में निम्नलिखित पंक्तियाँ हैं:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
आपकी
.so
का नामcamera.<device_name>
होना चाहिए। उदाहरण के लिए,hardware/ti/omap4xxx/Android.mk
में स्थित गैलेक्सी नेक्सस कैमरे के लिए मेकफ़ाइल देखें। - अपने डिवाइस के मेकफाइल के साथ
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
XML फ़ाइलों में अपने कैमरे के मीडिया कोडेक, फ़ॉर्मैट और रिज़ॉल्यूशन क्षमताओं की घोषणा करें। विवरण के लिए, कोडेक्स को फ्रेमवर्क में एक्सपोज़ करना देखें। - अपने डिवाइस के
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
- अपने डिवाइस के सिस्टम इमेज में कैमरा ऐप को शामिल करने के लिए, इसे अपने डिवाइस के
device/<company>/<device>/device.mk
:PRODUCT_PACKAGES := \ Gallery2 \ ...
मेंPRODUCT_PACKAGES
वेरिएबल में निर्दिष्ट करें।