इस पेज पर, एचएएल सबसिस्टम के बारे में बताया गया है. इसमें अनुरोध, कैमरा सबसिस्टम, स्टार्टअप और ऑपरेशन सीक्वेंस, हार्डवेयर लेवल, और इंटरैक्शन शामिल हैं.
अनुरोध
ऐप्लिकेशन फ़्रेमवर्क, कैप्चर किए गए नतीजों के लिए, कैमरा सबसिस्टम को अनुरोध भेजता है. एक अनुरोध, नतीजों के एक सेट से जुड़ा होता है. अनुरोध में, नतीजों को कैप्चर और प्रोसेस करने से जुड़ी सभी कॉन्फ़िगरेशन की जानकारी शामिल होती है. इसमें रिज़ॉल्यूशन और पिक्सल फ़ॉर्मैट जैसी चीज़ें शामिल होती हैं. साथ ही, सेंसर, लेंस, और फ़्लैश को मैन्युअल तरीके से कंट्रोल करने की सुविधा, 3A ऑपरेटिंग मोड, RAW से YUV प्रोसेसिंग कंट्रोल, और आंकड़े जनरेट करने की सुविधा भी शामिल होती है. इससे नतीजों के आउटपुट और प्रोसेसिंग पर ज़्यादा कंट्रोल मिलता है. एक साथ कई अनुरोध भेजे जा सकते हैं. साथ ही, अनुरोध सबमिट करने पर, अन्य प्रोसेस पर कोई असर नहीं पड़ता. अनुरोधों को हमेशा उसी क्रम में प्रोसेस किया जाता है जिस क्रम में वे मिलते हैं.
पहली इमेज. कैमरा मॉडल.
एचएएल और कैमरा सबसिस्टम
कैमरा सबसिस्टम में, कैमरा पाइपलाइन में शामिल कॉम्पोनेंट के लिए लागू किए गए कोड शामिल होते हैं. जैसे, 3A एल्गोरिदम और प्रोसेसिंग कंट्रोल. कैमरा एचएएल आपको इन कॉम्पोनेंट के अपने वर्शन लागू करने के लिए इंटरफ़ेस उपलब्ध कराता है. डिवाइस बनाने वाली अलग-अलग कंपनियों और इमेज सिग्नल प्रोसेसर (आईएसपी या कैमरा सेंसर) के वेंडर के बीच, क्रॉस-प्लैटफ़ॉर्म के हिसाब से काम करने की सुविधा बनाए रखने के लिए, कैमरा पाइपलाइन मॉडल वर्चुअल होता है. यह किसी भी असली आईएसपी से सीधे तौर पर मेल नहीं खाता. हालांकि, यह असली प्रोसेसिंग पाइपलाइन के जैसा ही होता है, ताकि इसे अपने हार्डवेयर पर आसानी से मैप किया जा सके. इसके अलावा, यह इतना ऐब्स्ट्रैक्ट होता है कि क्वालिटी, परफ़ॉर्मेंस या क्रॉस-डिवाइस के साथ काम करने की सुविधा से समझौता किए बिना, अलग-अलग एल्गोरिदम और ऑपरेशन के क्रम का इस्तेमाल किया जा सकता है.
कैमरा पाइपलाइन, ट्रिगर को भी सपोर्ट करती है. ऐप्लिकेशन फ़्रेमवर्क, ऑटो-फ़ोकस जैसी चीज़ों को चालू करने के लिए, इन ट्रिगर को शुरू कर सकता है. यह ऐप्लिकेशन फ़्रेमवर्क को सूचनाएं भी भेजता है. इससे ऐप्लिकेशन को ऑटो-फ़ोकस लॉक या गड़बड़ियों जैसे इवेंट की सूचना मिलती है.
दूसरी इमेज. कैमरा पाइपलाइन.
ध्यान दें कि ऊपर दिए गए डायग्राम में, इमेज प्रोसेसिंग के कुछ ब्लॉक, शुरुआती रिलीज़ में अच्छी तरह से तय नहीं किए गए हैं. कैमरा पाइपलाइन के लिए ये बातें मानी जाती हैं:
- RAW बायर आउटपुट, आईएसपी में प्रोसेस नहीं किया जाता.
- आंकड़े, रॉ सेंसर डेटा के आधार पर जनरेट किए जाते हैं.
- रॉ सेंसर डेटा को YUV में बदलने वाले अलग-अलग प्रोसेसिंग ब्लॉक, किसी भी क्रम में हो सकते हैं.
- स्केल और क्रॉप करने वाली कई यूनिट दिखाई गई हैं. हालांकि, सभी स्केलर यूनिट, आउटपुट रीजन कंट्रोल (डिजिटल ज़ूम) शेयर करती हैं. हालांकि, हर यूनिट का आउटपुट रिज़ॉल्यूशन और पिक्सल फ़ॉर्मैट अलग-अलग हो सकता है.
एपीआई के इस्तेमाल की खास जानकारी
यह Android कैमरा एपीआई का इस्तेमाल करने के चरणों की खास जानकारी है. इन चरणों के बारे में ज़्यादा जानकारी पाने के लिए, स्टार्टअप और ऑपरेशन सीक्वेंस देखें. इसमें एपीआई कॉल भी शामिल हैं.
- कैमरा डिवाइसों को सुनें और उनकी गिनती करें.
- डिवाइस खोलें और लिसनर कनेक्ट करें.
- टारगेट इस्तेमाल के उदाहरण के लिए आउटपुट कॉन्फ़िगर करें. जैसे, फ़ोटो कैप्चर करना या रिकॉर्ड करना.
- टारगेट इस्तेमाल के उदाहरण के लिए अनुरोध बनाएं.
- अनुरोध और बर्स्ट कैप्चर/दोहराएं.
- नतीजे का मेटाडेटा और इमेज डेटा पाएं.
- इस्तेमाल के उदाहरण स्विच करते समय, तीसरे चरण पर वापस जाएं.
एचएएल ऑपरेशन की खास जानकारी
- कैप्चर के लिए एसिंक्रोनस अनुरोध, फ़्रेमवर्क से आते हैं.
- एचएएल डिवाइस को अनुरोधों को क्रम से प्रोसेस करना होगा. साथ ही, हर अनुरोध के लिए, आउटपुट के नतीजों का मेटाडेटा और एक या उससे ज़्यादा आउटपुट इमेज बफ़र जनरेट करने होंगे.
- अनुरोधों और नतीजों के लिए, फ़र्स्ट-इन, फ़र्स्ट-आउट. साथ ही, बाद के अनुरोधों में रेफ़र किए गए स्ट्रीम के लिए भी यही नियम लागू होता है.
- किसी दिए गए अनुरोध के सभी आउटपुट के लिए, टाइमस्टैंप एक जैसे होने चाहिए, ताकि the फ़्रेमवर्क ज़रूरत पड़ने पर उन्हें मैच कर सके.
- कैप्चर के सभी कॉन्फ़िगरेशन और स्थिति (3A रूटीन को छोड़कर), अनुरोधों और नतीजों में शामिल होती है.
तीसरी इमेज. कैमरा एचएएल की खास जानकारी.
स्टार्टअप और ऑपरेशन सीक्वेंस
इस सेक्शन में, कैमरा एपीआई का इस्तेमाल करते समय, उम्मीद के मुताबिक होने वाले चरणों के बारे में ज़्यादा जानकारी दी गई है. एचआईडीएल इंटरफ़ेस की परिभाषाओं के लिए, platform/hardware/interfaces/camera/ देखें.
कैमरा डिवाइसों की गिनती करना, उन्हें खोलना, और एक ऐक्टिव सेशन बनाना
- शुरू होने के बाद, फ़्रेमवर्क, मौजूद किसी भी
कैमरा प्रोवाइडर को सुनने लगता है जो
ICameraProviderइंटरफ़ेस लागू करते हैं. अगर ऐसा कोई प्रोवाइडर या प्रोवाइडर मौजूद हैं, तो फ़्रेमवर्क कनेक्शन बनाने की कोशिश करता है. - फ़्रेमवर्क, कैमरा डिवाइसों की गिनती
ICameraProvider::getCameraIdListके ज़रिए करता है. - फ़्रेमवर्क,
ICameraProvider::getCameraDeviceInterface_VX_Xको कॉल करके, नयाICameraDeviceइंस्टैंशिएट करता है. - फ़्रेमवर्क, नया
ऐक्टिव कैप्चर सेशन ICameraDeviceSession बनाने के लिए,
ICameraDevice::openको कॉल करता है.
ऐक्टिव कैमरा सेशन का इस्तेमाल करना
- फ़्रेमवर्क, एचएएल डिवाइस को इनपुट/आउटपुट स्ट्रीम की सूची के साथ,
ICameraDeviceSession::configureStreamsको कॉल करता है. - फ़्रेमवर्क, कुछ इस्तेमाल के उदाहरणों के लिए डिफ़ॉल्ट सेटिंग का अनुरोध करता है, जिसमें
ICameraDeviceSession::constructDefaultRequestSettingsको कॉल किया जाता है.ICameraDevice::openसेICameraDeviceSessionबनने के बाद, यह किसी भी समय हो सकता है. - फ़्रेमवर्क, डिफ़ॉल्ट सेटिंग के किसी एक सेट के आधार पर सेटिंग के साथ, एचएएल को पहला कैप्चर अनुरोध बनाता है और भेजता है.
साथ ही, इसमें कम से कम एक
आउटपुट स्ट्रीम शामिल होती है जिसे फ़्रेमवर्क ने पहले रजिस्टर किया हो. इसे
एचएएल को
ICameraDeviceSession::processCaptureRequestके साथ भेजा जाता है. एचएएल को इस कॉल के नतीजे को तब तक ब्लॉक करना होगा, जब तक वह अगला अनुरोध भेजने के लिए तैयार न हो जाए. - फ़्रेमवर्क, अनुरोध सबमिट करता रहता है और ज़रूरत के मुताबिक, अन्य इस्तेमाल के उदाहरणों के लिए डिफ़ॉल्ट सेटिंग बफ़र पाने के लिए,
ICameraDeviceSession::constructDefaultRequestSettingsको कॉल करता है. - किसी अनुरोध का कैप्चर शुरू होने पर (सेंसर, कैप्चर के लिए एक्सपोज़ होना शुरू होता है), एचएएल, शटर मैसेज के साथ
ICameraDeviceCallback::notifyको कॉल करता है. इसमें फ़्रेम नंबर और एक्सपोज़र शुरू होने का टाइमस्टैंप शामिल होता है. ज़रूरी नहीं है कि यह नोटिफ़ाई कॉलबैक, किसी अनुरोध के लिए पहलेprocessCaptureResultकॉल से पहले हो. हालांकि, कैप्चर के लिए, किसी ऐप्लिकेशन को तब तक नतीजे नहीं मिलते, जब तक उस कैप्चर के लिएnotifyको कॉल नहीं किया जाता. - पाइपलाइन में कुछ देरी के बाद, एचएएल,
ICameraDeviceCallback::processCaptureResultके साथ, पूरे हो चुके कैप्चर को फ़्रेमवर्क को वापस भेजना शुरू करता है. इन्हें उसी क्रम में वापस भेजा जाता है जिस क्रम में अनुरोध सबमिट किए गए थे. कैमरा एचएएल डिवाइस की पाइपलाइन डेप्थ के आधार पर, एक साथ कई अनुरोध भेजे जा सकते हैं.
कुछ समय बाद, इनमें से कोई एक चीज़ होती है:
- फ़्रेमवर्क, नए अनुरोध सबमिट करना बंद कर देता है. साथ ही, मौजूदा कैप्चर के पूरे होने का इंतज़ार करता है (सभी बफ़र भर गए, सभी नतीजे वापस मिल गए). इसके बाद,
ICameraDeviceSession::configureStreamsको फिर से कॉल करता है. इससे, इनपुट/आउटपुट स्ट्रीम के नए सेट के लिए, कैमरा हार्डवेयर और पाइपलाइन रीसेट हो जाती है. पिछली सेटिंग से कुछ स्ट्रीम को फिर से इस्तेमाल किया जा सकता है इसके बाद, फ़्रेमवर्क, एचएएल को पहले कैप्चर अनुरोध से जारी रखता है. हालांकि, इसके लिए कम से कम एक रजिस्टर की गई आउटपुट स्ट्रीम मौजूद होनी चाहिए. (Otherwise,ICameraDeviceSession::configureStreamsis required first.) - फ़्रेमवर्क, कैमरा सेशन खत्म करने के लिए,
ICameraDeviceSession::closeको कॉल कर सकता है. इसे किसी भी समय कॉल किया जा सकता है, जब फ़्रेमवर्क से कोई अन्य कॉल ऐक्टिव न हो. हालांकि, सभी इन-फ़्लाइट कैप्चर पूरे होने तक (सभी नतीजे वापस मिल गए, सभी बफ़र भर गए), कॉल ब्लॉक हो सकती है.closeकॉल के नतीजे मिलने के बाद, एचएएल सेICameraDeviceCallbackको कोई और कॉल नहीं की जा सकती.closeकॉल शुरू होने के बाद, फ़्रेमवर्क, एचएएल डिवाइस के किसी अन्य फ़ंक्शन को कॉल नहीं कर सकता. - गड़बड़ी या अन्य एसिंक्रोनस इवेंट होने पर, एचएएल को सही गड़बड़ी/इवेंट मैसेज के साथ,
ICameraDeviceCallback::notifyको कॉल करना होगा. डिवाइस में होने वाली किसी बड़ी गड़बड़ी की सूचना मिलने के बाद, एचएएल को ऐसा काम करना चाहिए जैसे किcloseके लिए कॉल किया गया हो. हालांकि, एचएएल को `notify` को कॉल करने से पहले, सभी लंबित कैप्चर रद्द करने या पूरे करने होंगे, ताकि किसी बड़ी गड़बड़ी के साथ `notify` को कॉल करने के बाद, फ़्रेमवर्क को डिवाइस से कोई और कॉलबैक न मिले.notifynotify`notify` तरीके से किसी बड़ी गड़बड़ी का मैसेज मिलने के बाद, `close` के अलावा अन्य तरीकों को `-ENODEV` या `NULL` दिखाना चाहिए.close-ENODEVNULLnotify
चौथी इमेज. कैमरा ऑपरेशनल फ़्लो.
हार्डवेयर लेवल
कैमरा डिवाइस, अपनी क्षमताओं के आधार पर कई हार्डवेयर लेवल लागू कर सकते हैं. ज़्यादा जानकारी के लिए, supported hardware level देखें.
ऐप्लिकेशन के कैप्चर अनुरोध, 3A कंट्रोल, और प्रोसेसिंग पाइपलाइन के बीच इंटरैक्शन
3A कंट्रोल ब्लॉक में मौजूद सेटिंग के आधार पर, कैमरा पाइपलाइन, ऐप्लिकेशन के कैप्चर अनुरोध में मौजूद कुछ पैरामीटर को अनदेखा करती है . इसके बजाय, 3A कंट्रोल रूटीन से मिली वैल्यू का इस्तेमाल करती है . उदाहरण के लिए, जब ऑटो-एक्सपोज़र चालू होता है, तो सेंसर के एक्सपोज़र टाइम, फ़्रेम की अवधि, और संवेदनशीलता के पैरामीटर को प्लैटफ़ॉर्म 3A एल्गोरिदम से कंट्रोल किया जाता है. साथ ही, ऐप्लिकेशन से तय की गई किसी भी वैल्यू को अनदेखा कर दिया जाता है. 3A रूटीन से फ़्रेम के लिए चुनी गई वैल्यू, आउटपुट मेटाडेटा में रिपोर्ट की जानी चाहिए. यहां दी गई टेबल में, 3A कंट्रोल ब्लॉक के अलग-अलग मोड और इन मोड से कंट्रोल की जाने वाली प्रॉपर्टी के बारे में बताया गया है. इन प्रॉपर्टी की परिभाषाओं के लिए, platform/system/media/camera/docs/docs.html फ़ाइल देखें.
| पैरामीटर | राज्य | कंट्रोल की जाने वाली प्रॉपर्टी |
|---|---|---|
android.control.aeMode |
OFF |
कोई नहीं. |
ON |
android.sensor.exposureTime, android.sensor.frameDuration, android.sensor.sensitivity, android.lens.aperture (अगर यह सुविधा उपलब्ध है), और android.lens.filterDensity (अगर यह सुविधा उपलब्ध है). |
|
ON_AUTO_FLASH |
सब कुछ ON है. साथ ही, android.flash.firingPower,
android.flash.firingTime, और android.flash.mode भी. |
|
ON_ALWAYS_FLASH |
ON_AUTO_FLASH के जैसा. |
|
ON_AUTO_FLASH_RED_EYE |
ON_AUTO_FLASH के जैसा. |
|
android.control.awbMode |
OFF |
कोई नहीं. |
WHITE_BALANCE_* |
android.colorCorrection.transform. अगर
android.colorCorrection.mode FAST या HIGH_QUALITY है, तो प्लैटफ़ॉर्म के हिसाब से अडजस्टमेंट. |
|
android.control.afMode |
OFF |
कोई नहीं |
FOCUS_MODE_* |
android.lens.focusDistance |
|
android.control.videoStabilization |
OFF |
कोई नहीं. |
ON |
वीडियो स्टेबलाइज़ेशन लागू करने के लिए, android.scaler.cropRegion को अडजस्ट किया जा सकता है. |
|
android.control.mode |
OFF |
AE, AWB, और AF बंद हैं. |
AUTO |
AE, AWB, और AF की अलग-अलग सेटिंग का इस्तेमाल किया जाता है. | |
SCENE_MODE_* |
ऊपर दी गई सभी सेटिंग को बदला जा सकता है. 3A के अलग-अलग कंट्रोल बंद हैं. |
इमेज प्रोसेसिंग ब्लॉक में मौजूद सभी कंट्रोल, एक जैसे सिद्धांत पर काम करते हैं. साथ ही, हर ब्लॉक के तीन मोड होते हैं:
OFF: इस मोड में, प्रोसेसिंग ब्लॉक बंद होता है. डेमोसेइक, रंग में सुधार करने की सुविधा, और टोन कर्व अडजस्टमेंट ब्लॉक को बंद नहीं किया जा सकता.FAST: इस मोड में, प्रोसेसिंग ब्लॉक,OFFमोड की तुलना में आउटपुट फ़्रेम रेट को धीमा नहीं करता. हालांकि, इस मोड में, क्वालिटी के मामले में सबसे अच्छा आउटपुट मिलना चाहिए. आम तौर पर, इसका इस्तेमाल प्रीव्यू या वीडियो रिकॉर्डिंग मोड या फ़ोटो के लिए बर्स्ट कैप्चर मोड में किया जाता है. कुछ डिवाइसों पर, यहOFFमोड के बराबर हो सकता है. इसका मतलब है कि फ़्रेम रेट को धीमा किए बिना, कोई प्रोसेसिंग नहीं की जा सकती. वहीं, कुछ डिवाइसों पर, यहHIGH_QUALITYमोड के बराबर हो सकता है. इसका मतलब है कि सबसे अच्छी क्वालिटी के बावजूद, फ़्रेम रेट धीमा नहीं होता.HIGH_QUALITY: इस मोड में, प्रोसेसिंग ब्लॉक को सबसे अच्छी क्वालिटी का नतीजा देना चाहिए. साथ ही, ज़रूरत के मुताबिक, आउटपुट फ़्रेम रेट को धीमा किया जा सकता है. आम तौर पर, इसका इस्तेमाल अच्छी क्वालिटी की फ़ोटो कैप्चर करने के लिए किया जाता है. कुछ ब्लॉक में मैन्युअल कंट्रोल शामिल होता है. इसेFASTयाHIGH_QUALITYके बजाय, चुना जा सकता है. उदाहरण के लिए, रंग में सुधार करने की सुविधा, कलर ट्रांसफ़ॉर्म मैट्रिक्स को सपोर्ट करती है. वहीं, टोन कर्व अडजस्टमेंट, किसी भी ग्लोबल टोन मैपिंग कर्व को सपोर्ट करता है.
कैमरा सबसिस्टम, कई चीज़ों के आधार पर ज़्यादा से ज़्यादा फ़्रेम रेट को सपोर्ट कर सकता है:
- आउटपुट इमेज स्ट्रीम के लिए अनुरोध किए गए रिज़ॉल्यूशन
- इमेजर पर बिनिंग/स्किपिंग मोड की उपलब्धता
- इमेजर इंटरफ़ेस की बैंडविड्थ
- अलग-अलग आईएसपी प्रोसेसिंग ब्लॉक की बैंडविड्थ
ये चीज़ें, अलग-अलग आईएसपी और सेंसर के हिसाब से अलग-अलग हो सकती हैं. इसलिए, कैमरा एचएएल इंटरफ़ेस, बैंडविड्थ की पाबंदियों को आसान मॉडल में ऐब्स्ट्रैक्ट करने की कोशिश करता है. यहां दिए गए मॉडल की ये खासियतें हैं:
- इमेज सेंसर को हमेशा सबसे कम रिज़ॉल्यूशन पर आउटपुट देने के लिए कॉन्फ़िगर किया जाता है. यह रिज़ॉल्यूशन, ऐप्लिकेशन की अनुरोध की गई आउटपुट स्ट्रीम के साइज़ के हिसाब से तय किया जाता है. सबसे कम रिज़ॉल्यूशन, अनुरोध की गई सबसे बड़ी आउटपुट स्ट्रीम के साइज़ के बराबर या उससे ज़्यादा होता है.
- कोई भी अनुरोध, फ़िलहाल कॉन्फ़िगर की गई किसी भी या सभी आउटपुट स्ट्रीम का इस्तेमाल कर सकता है, इसलिए सेंसर और आईएसपी को एक ही कैप्चर को एक साथ सभी स्ट्रीम पर स्केल करने के लिए कॉन्फ़िगर किया जाना चाहिए.
- जिन अनुरोधों में JPEG स्ट्रीम शामिल नहीं होती हैं उनके लिए, JPEG स्ट्रीम, प्रोसेस की गई YUV स्ट्रीम की तरह काम करती हैं. वहीं, जिन अनुरोधों में सीधे तौर पर JPEG स्ट्रीम का रेफ़रंस दिया जाता है उनके लिए, JPEG स्ट्रीम, JPEG स्ट्रीम की तरह काम करती हैं.
- JPEG प्रोसेसर, कैमरा पाइपलाइन के बाकी हिस्सों के साथ-साथ काम कर सकता है. हालांकि, यह एक बार में एक से ज़्यादा कैप्चर को प्रोसेस नहीं कर सकता.