अनुरोध
ऐप्लिकेशन फ़्रेमवर्क, कैप्चर किए गए नतीजों के लिए, कैमरा सबसिस्टम को अनुरोध भेजता है. एक अनुरोध, नतीजों के एक सेट से जुड़ा होता है. अनुरोध में, उन नतीजों को कैप्चर और प्रोसेस करने से जुड़ी सभी कॉन्फ़िगरेशन की जानकारी शामिल होती है. इसमें रिज़ॉल्यूशन और पिक्सल फ़ॉर्मैट जैसी चीज़ें शामिल होती हैं. साथ ही, मैन्युअल सेंसर, लेंस, और फ़्लैश कंट्रोल; 3A ऑपरेटिंग मोड; RAW से YUV प्रोसेसिंग कंट्रोल; और आंकड़े जनरेट करने की सुविधा भी शामिल होती है. इससे नतीजों के आउटपुट और प्रोसेसिंग पर ज़्यादा कंट्रोल मिलता है. एक साथ कई अनुरोध भेजे जा सकते हैं. साथ ही, अनुरोध सबमिट करने पर, अन्य प्रोसेस पर कोई असर नहीं पड़ता. अनुरोधों को हमेशा उसी क्रम में प्रोसेस किया जाता है जिस क्रम में वे मिलते हैं.
पहली इमेज. कैमरा मॉडल
एचएएल और कैमरा सबसिस्टम
कैमरा सबसिस्टम में, कैमरा पाइपलाइन में मौजूद कॉम्पोनेंट के लिए लागू की गई सुविधाएं शामिल होती हैं. जैसे, 3A एल्गोरिदम और प्रोसेसिंग कंट्रोल. कैमरा एचएएल आपको इन कॉम्पोनेंट के अपने वर्शन लागू करने के लिए इंटरफ़ेस उपलब्ध कराता है. कई डिवाइस बनाने वाली कंपनियों और इमेज सिग्नल प्रोसेसर (आईएसपी या कैमरा सेंसर) के वेंडर के बीच, क्रॉस-प्लैटफ़ॉर्म के हिसाब से काम करने की सुविधा बनाए रखने के लिए, कैमरा पाइपलाइन मॉडल वर्चुअल होता है. यह किसी भी असली आईएसपी से सीधे तौर पर मेल नहीं खाता. हालांकि, यह असली प्रोसेसिंग पाइपलाइन के जैसा ही होता है, ताकि इसे अपने हार्डवेयर पर आसानी से मैप किया जा सके. इसके अलावा, यह इतना ऐब्स्ट्रैक्ट होता है कि क्वालिटी, परफ़ॉर्मेंस या क्रॉस-डिवाइस के साथ काम करने की सुविधा से समझौता किए बिना, अलग-अलग एल्गोरिदम और ऑपरेशन के क्रम इस्तेमाल किए जा सकते हैं.
कैमरा पाइपलाइन, ट्रिगर को भी सपोर्ट करती है. ऐप्लिकेशन फ़्रेमवर्क, इन ट्रिगर को शुरू करके, ऑटो-फ़ोकस जैसी सुविधाएं चालू कर सकता है. यह ऐप्लिकेशन फ़्रेमवर्क को सूचनाएं भी भेजता है. इससे ऐप्लिकेशन को ऑटो-फ़ोकस लॉक या गड़बड़ियों जैसे इवेंट के बारे में पता चलता है.
दूसरी इमेज. कैमरा पाइपलाइन
कृपया ध्यान दें कि ऊपर दिए गए डायग्राम में, इमेज प्रोसेसिंग के कुछ ब्लॉक, शुरुआती रिलीज़ में अच्छी तरह से तय नहीं किए गए हैं. कैमरा पाइपलाइन के लिए ये बातें मानी जाती हैं:
- RAW Bayer आउटपुट, आईएसपी में प्रोसेस नहीं किया जाता.
- आंकड़े, रॉ सेंसर डेटा के आधार पर जनरेट किए जाते हैं.
- रॉ सेंसर डेटा को YUV में बदलने वाले अलग-अलग प्रोसेसिंग ब्लॉक, किसी भी क्रम में हो सकते हैं.
- स्केल और क्रॉप करने वाली कई यूनिट दिखाई गई हैं. हालांकि, सभी स्केलर यूनिट, आउटपुट रीजन कंट्रोल (डिजिटल ज़ूम) शेयर करती हैं. हालांकि, हर यूनिट का आउटपुट रिज़ॉल्यूशन और पिक्सल फ़ॉर्मैट अलग-अलग हो सकता है.
एपीआई के इस्तेमाल की खास जानकारी
यह Android कैमरा एपीआई के इस्तेमाल के चरणों की खास जानकारी है. इन चरणों के बारे में ज़्यादा जानने के लिए, स्टार्टअप और ऑपरेशन के क्रम से जुड़ा सेक्शन देखें. इसमें एपीआई कॉल भी शामिल हैं.
- कैमरा डिवाइसों को ट्रैक करें और उनकी सूची बनाएं.
- डिवाइस खोलें और लिसनर कनेक्ट करें.
- टारगेट इस्तेमाल के उदाहरणों (जैसे, फ़ोटो कैप्चर करना, रिकॉर्ड करना, वगैरह) के लिए आउटपुट कॉन्फ़िगर करें.
- टारगेट इस्तेमाल के उदाहरणों के लिए अनुरोध बनाएं.
- अनुरोधों और बर्स्ट को कैप्चर/दोहराएं.
- नतीजों का मेटाडेटा और इमेज डेटा पाएं.
- इस्तेमाल के उदाहरणों के बीच स्विच करते समय, तीसरे चरण पर वापस जाएं.
एचएएल के ऑपरेशन की खास जानकारी
- कैप्चर के लिए एसिंक्रोनस अनुरोध, फ़्रेमवर्क से आते हैं.
- एचएएल डिवाइस को अनुरोधों को क्रम से प्रोसेस करना होगा. साथ ही, हर अनुरोध के लिए, आउटपुट के नतीजों का मेटाडेटा और एक या उससे ज़्यादा आउटपुट इमेज बफ़र जनरेट करने होंगे.
- अनुरोधों और नतीजों के लिए, फ़र्स्ट-इन, फ़र्स्ट-आउट नियम लागू होता है. साथ ही, बाद के अनुरोधों में रेफ़र किए गए स्ट्रीम के लिए भी यह नियम लागू होता है.
- किसी दिए गए अनुरोध के सभी आउटपुट के लिए, टाइमस्टैंप एक जैसे होने चाहिए, ताकि the फ़्रेमवर्क ज़रूरत पड़ने पर उन्हें मैच कर सके.
- कैप्चर के सभी कॉन्फ़िगरेशन और स्थिति (3A रूटीन को छोड़कर), अनुरोधों और नतीजों में शामिल होती है.
तीसरी इमेज. कैमरा एचएएल की खास जानकारी
स्टार्टअप और ऑपरेशन के क्रम से जुड़ी ज़रूरी शर्तें
इस सेक्शन में, कैमरा एपीआई का इस्तेमाल करते समय, ज़रूरी चरणों के बारे में पूरी जानकारी दी गई है. HIDL इंटरफ़ेस परिभाषाओं के लिए, 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()को फिर से कॉल कर सकता है. इससे, इनपुट/आउटपुट स्ट्रीम के नए सेट के लिए, कैमरा हार्डवेयर और पाइपलाइन रीसेट हो जाती है. पिछली सेटिंग से कुछ स्ट्रीम को फिर से इस्तेमाल किया जा सकता है. इसके बाद, फ़्रेमवर्क, एचएएल को पहले कैप्चर अनुरोध से आगे बढ़ता है. हालांकि, इसके लिए ज़रूरी है कि कम से कम एक रजिस्टर की गई आउटपुट स्ट्रीम मौजूद हो. (ऐसा न होने पर,ICameraDeviceSession::configureStreams()को कॉल करना होगा.) - फ़्रेमवर्क, कैमरा सेशन खत्म करने के लिए,
ICameraDeviceSession::close()को कॉल कर सकता है. इसे किसी भी समय कॉल किया जा सकता है, जब फ़्रेमवर्क से कोई अन्य कॉल ऐक्टिव न हो. हालांकि, सभी इन-फ़्लाइट कैप्चर पूरे होने तक (सभी नतीजे वापस मिल गए, सभी बफ़र भर गए), कॉल ब्लॉक हो सकता है.close()कॉल के जवाब मिलने के बाद, एचएएल सेICameraDeviceCallbackको कोई और कॉल नहीं किया जा सकता.close()कॉल शुरू होने के बाद, फ़्रेमवर्क, किसी अन्य एचएएल डिवाइस फ़ंक्शन को कॉल नहीं कर सकता. - गड़बड़ी या अन्य एसिंक्रोनस इवेंट होने पर, एचएएल को सही
गड़बड़ी/इवेंट मैसेज के साथ,
ICameraDeviceCallback::notify()को कॉल करना होगा. डिवाइस में होने वाली किसी गंभीर गड़बड़ी की सूचना मिलने के बाद, एचएएल को ऐसा काम करना चाहिए जैसे किclose()के लिए कॉल किया गया हो. हालांकि, एचएएल को `notify()` को कॉल करने से पहले, सभी पेंडिंग कैप्चर रद्द करने या पूरे करने होंगे, ताकि गंभीर गड़बड़ी के साथ `notify()` को कॉल किए जाने के बाद, फ़्रेमवर्क को डिवाइस से कोई और कॉलबैक न मिले.notify()notify()गंभीर गड़बड़ी का मैसेज मिलने के बाद,notify()तरीके सेclose()के अलावा अन्य तरीकों को -ENODEV या NULL जवाब देना चाहिए.
चौथी इमेज. कैमरा के ऑपरेशन का फ़्लो
हार्डवेयर लेवल
कैमरा डिवाइस, अपनी क्षमताओं के आधार पर कई हार्डवेयर लेवल लागू कर सकते हैं. ज़्यादा जानकारी के लिए, supported hardware level देखें.
ऐप्लिकेशन के कैप्चर अनुरोध, 3A कंट्रोल, और प्रोसेसिंग पाइपलाइन के बीच इंटरैक्शन
3A कंट्रोल ब्लॉक में मौजूद सेटिंग के आधार पर, कैमरा पाइपलाइन, ऐप्लिकेशन के कैप्चर अनुरोध में मौजूद कुछ पैरामीटर को अनदेखा करती है . इसके बजाय, 3A कंट्रोल रूटीन से मिली वैल्यू का इस्तेमाल करती है . उदाहरण के लिए, जब ऑटो-एक्सपोज़र चालू होता है, तो सेंसर के एक्सपोज़र टाइम, फ़्रेम की अवधि, और संवेदनशीलता के पैरामीटर को प्लैटफ़ॉर्म 3A एल्गोरिदम से कंट्रोल किया जाता है. साथ ही, ऐप्लिकेशन से तय की गई किसी भी वैल्यू को अनदेखा कर दिया जाता है. 3A रूटीन से चुने गए फ़्रेम की वैल्यू, आउटपुट मेटाडेटा में रिपोर्ट की जानी चाहिए. यहां दी गई टेबल में, 3A कंट्रोल ब्लॉक के अलग-अलग मोड और इन मोड से कंट्रोल की जाने वाली प्रॉपर्टी के बारे में बताया गया है. इन प्रॉपर्टी की परिभाषाओं के लिए, platform/system/media/camera/docs/docs.html फ़ाइल देखें.
| पैरामीटर | राज्य | कंट्रोल की जाने वाली प्रॉपर्टी |
|---|---|---|
| android.control.aeMode | बंद है | कोई नहीं |
| चालू है | android.sensor.exposureTime android.sensor.frameDuration android.sensor.sensitivity android.lens.aperture (अगर यह सुविधा उपलब्ध है) android.lens.filterDensity (अगर यह सुविधा उपलब्ध है) | |
| ON_AUTO_FLASH | सभी सेटिंग चालू हैं. साथ ही, 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 | बंद है | कोई नहीं |
| WHITE_BALANCE_* | android.colorCorrection.transform. अगर android.colorCorrection.mode, FAST या HIGH_QUALITY है, तो प्लैटफ़ॉर्म के हिसाब से अडजस्टमेंट. | |
| android.control.afMode | बंद है | कोई नहीं |
| FOCUS_MODE_* | android.lens.focusDistance | |
| android.control.videoStabilization | बंद है | कोई नहीं |
| चालू है | वीडियो स्टेबलाइज़ेशन लागू करने के लिए, android.scaler.cropRegion को अडजस्ट किया जा सकता है | |
| android.control.mode | बंद है | AE, AWB, और AF बंद हैं |
| ऑटो | AE, AWB, और AF की अलग-अलग सेटिंग इस्तेमाल की जाती हैं | |
| SCENE_MODE_* | ऊपर दी गई सभी सेटिंग को बदला जा सकता है. 3A के अलग-अलग कंट्रोल बंद हैं. |
दूसरी इमेज में, इमेज प्रोसेसिंग ब्लॉक में मौजूद सभी कंट्रोल, एक जैसे सिद्धांत पर काम करते हैं . आम तौर पर, हर ब्लॉक के तीन मोड होते हैं:
- बंद है: यह प्रोसेसिंग ब्लॉक बंद है. डेमोसेक, रंग में सुधार करने की सुविधा, और टोन कर्व अडजस्टमेंट ब्लॉक को बंद नहीं किया जा सकता.
- FAST: इस मोड में, प्रोसेसिंग ब्लॉक, बंद मोड की तुलना में आउटपुट फ़्रेम रेट को धीमा नहीं कर सकता. हालांकि, उसे उस पाबंदी के हिसाब से, सबसे अच्छी क्वालिटी का आउटपुट जनरेट करना चाहिए. आम तौर पर, इसका इस्तेमाल प्रीव्यू या वीडियो रिकॉर्डिंग मोड या फ़ोटो के लिए बर्स्ट कैप्चर के लिए किया जाता है. कुछ डिवाइसों पर, यह बंद मोड के बराबर हो सकता है (फ़्रेम रेट को धीमा किए बिना, कोई प्रोसेसिंग नहीं की जा सकती). वहीं, कुछ डिवाइसों पर, यह HIGH_QUALITY मोड के बराबर हो सकता है (सबसे अच्छी क्वालिटी होने पर भी, फ़्रेम रेट धीमा नहीं होता).
- HIGH_QUALITY: इस मोड में, प्रोसेसिंग ब्लॉक को सबसे अच्छी क्वालिटी का नतीजा जनरेट करना चाहिए. इसके लिए, ज़रूरत के मुताबिक आउटपुट फ़्रेम रेट को धीमा किया जा सकता है. आम तौर पर, इसका इस्तेमाल अच्छी क्वालिटी की फ़ोटो कैप्चर करने के लिए किया जाता है. कुछ ब्लॉक में मैन्युअल कंट्रोल शामिल होता है. इसे FAST या HIGH_QUALITY के बजाय, चुना जा सकता है. उदाहरण के लिए, रंग में सुधार करने की सुविधा वाला ब्लॉक, कलर ट्रांसफ़ॉर्म मैट्रिक्स को सपोर्ट करता है. वहीं, टोन कर्व अडजस्टमेंट, ग्लोबल टोन मैपिंग कर्व को सपोर्ट करता है.
कैमरा सबसिस्टम से सपोर्ट किए जा सकने वाले ज़्यादा से ज़्यादा फ़्रेम रेट, कई चीज़ों पर निर्भर करता है:
- आउटपुट इमेज स्ट्रीम के लिए अनुरोध किए गए रिज़ॉल्यूशन
- इमेजर पर बिनिंग/स्किपिंग मोड की उपलब्धता
- इमेजर इंटरफ़ेस की बैंडविड्थ
- आईएसपी के अलग-अलग प्रोसेसिंग ब्लॉक की बैंडविड्थ
इन चीज़ों में अलग-अलग आईएसपी और सेंसर के हिसाब से काफ़ी अंतर हो सकता है. इसलिए, कैमरा एचएएल इंटरफ़ेस, बैंडविड्थ की पाबंदियों को जितना हो सके, उतने आसान मॉडल में ऐब्स्ट्रैक्ट करने की कोशिश करता है. दिखाए गए मॉडल की ये खासियतें हैं:
- इमेज सेंसर को हमेशा सबसे कम रिज़ॉल्यूशन पर आउटपुट देने के लिए कॉन्फ़िगर किया जाता है. यह रिज़ॉल्यूशन, ऐप्लिकेशन की अनुरोध की गई आउटपुट स्ट्रीम के साइज़ के हिसाब से तय किया जाता है. सबसे कम रिज़ॉल्यूशन, अनुरोध की गई सबसे बड़ी आउटपुट स्ट्रीम के साइज़ के बराबर या उससे ज़्यादा होता है.
- किसी भी अनुरोध में, फ़िलहाल कॉन्फ़िगर की गई किसी भी या सभी आउटपुट स्ट्रीम का इस्तेमाल किया जा सकता है. सेंसर और आईएसपी को एक ही समय में सभी स्ट्रीम के लिए, एक कैप्चर को स्केल करने के लिए कॉन्फ़िगर किया जाना चाहिए.
- जिन अनुरोधों में JPEG स्ट्रीम शामिल नहीं होती हैं उनके लिए, ये स्ट्रीम प्रोसेस की गई YUV स्ट्रीम की तरह काम करती हैं. वहीं, जिन अनुरोधों में इन्हें सीधे तौर पर रेफ़र किया जाता है उनमें ये JPEG स्ट्रीम की तरह काम करती हैं.
- JPEG प्रोसेसर, कैमरा पाइपलाइन के बाकी हिस्सों के साथ-साथ काम कर सकता है. हालांकि, यह एक समय में एक से ज़्यादा कैप्चर को प्रोसेस नहीं कर सकता.