कैमरा HAL3 बफ़र मैनेजमेंट एपीआई

Android 10 में लॉन्च किया गया वैकल्पिक सुविधाएं कैमरा HAL3 बफ़र मैनेजमेंट एपीआई जो आपको बफ़र मैनेजमेंट लॉजिक को लागू किया जाता है, ताकि अलग-अलग मेमोरी और कैप्चर कैमरा एचएएल लागू करने के दौरान इंतज़ार का समय.

कैमरा HAL के लिए N अनुरोधों की आवश्यकता होती है (जहां N पाइपलाइन की गहराई) अपनी पाइपलाइन में पंक्तिबद्ध है, लेकिन इसके लिए अक्सर इसके सभी N सेट की आवश्यकता नहीं होती है आउटपुट बफ़र होना चाहिए.

उदाहरण के लिए, हो सकता है कि एचएएल की पाइपलाइन में आठ अनुरोध हों, लेकिन के अंतिम चरणों में केवल दो अनुरोधों के लिए आउटपुट बफ़र की आवश्यकता होती है पाइपलाइन. Android 9 और उससे पहले के वर्शन वाले डिवाइसों पर, कैमरे का फ़्रेमवर्क जब अनुरोध एचएएल में कतार में होता है, तो बफ़र होता है, इसलिए इसमें छह सेट हो सकते हैं HAL में ऐसे बफ़र हैं जिनका इस्तेमाल नहीं किया जा रहा है. Android 10 में, कैमरा HAL3 बफ़र मैनेजमेंट एपीआई, आउटपुट को अलग करने की अनुमति देता है बफ़र के छह सेट को खाली करने के लिए बफ़र का इस्तेमाल करता है. इसकी वजह से, महंगे डिवाइसों की मेमोरी में मेगाबाइट की बचत होती है. साथ ही, यह इन डिवाइसों के लिए भी फ़ायदेमंद हो सकता है कम मेमोरी वाले डिवाइस.

पहली इमेज में, चल रहे डिवाइसों के लिए कैमरा एचएएल इंटरफ़ेस का डायग्राम दिखाया गया है Android 9 और इससे पहले के वर्शन. दूसरी इमेज में Android में कैमरा एचएएल इंटरफ़ेस दिखाया गया है 10 के साथ कैमरा HAL3 बफ़र मैनेजमेंट एपीआई लागू किए गए हैं.

9 या उससे कम साइज़ में बफ़र मैनेजमेंट

पहला डायग्राम. Android 9 और इससे पहले के वर्शन में कैमरा एचएएल इंटरफ़ेस

Android 10 में बफ़र मैनेजमेंट की सुविधा

दूसरा डायग्राम. बफ़र मैनेजमेंट एपीआई का इस्तेमाल करके, Android 10 वर्शन में कैमरा एचएएल इंटरफ़ेस का इस्तेमाल करना

बफ़र मैनेजमेंट एपीआई को लागू करना

बफ़र मैनेजमेंट एपीआई लागू करने के लिए, कैमरा एचएएल को ये ज़रूरी शर्तें पूरी करनी होंगी:

कैमरा एचएएल, requestStreamBuffers और returnStreamBuffers तरीके ICameraDeviceCallback.hal बफ़र का अनुरोध करने और लौटाने के लिए. एचएएल को signalStreamFlush में तरीका ICameraDeviceSession.hal का इस्तेमाल करें.

अनुरोध स्ट्रीमबफ़र

इसका इस्तेमाल करें requestStreamBuffers का इस्तेमाल करता है. HAL3 कैमरा इस्तेमाल करते समय बफ़र मैनेजमेंट एपीआई, कैमरा फ़्रेमवर्क से अनुरोध कैप्चर करने की सुविधा ये काम नहीं करती आउटपुट बफ़र होना चाहिए, यानी कि bufferId फ़ील्ड में StreamBuffer 0 है. इसलिए, अनुरोध करने के लिए कैमरा एचएएल को requestStreamBuffers का इस्तेमाल करना होगा कैमरा फ़्रेमवर्क के बफ़र.

requestStreamBuffers वाला तरीका, कॉलर को एक से ज़्यादा बफ़र का अनुरोध करने की अनुमति देता है एक ही कॉल में कई आउटपुट स्ट्रीम का इस्तेमाल किया जाता है. इससे HIDL IPC कम होता है कॉल. हालांकि, जब ज़्यादा बफ़र का अनुरोध किया जाता है, तो कॉल में ज़्यादा समय लगता है साथ ही, इससे अनुरोध करने पर नतीजे पाने में लगने वाले समय पर बुरा असर पड़ सकता है. साथ ही, requestStreamBuffers को किए जाने वाले कॉल, कैमरे में सीरियल नंबर के हिसाब से होते हैं सेवा है, तो यह सुझाव दिया जाता है कि कैमरा एचएएल किसी खास हाई-प्राथमिकता का इस्तेमाल करे बफ़र का अनुरोध करने के लिए थ्रेड.

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

  • ऐप्लिकेशन, आउटपुट स्ट्रीम से डिसकनेक्ट हो जाता है: यह एक साधारण गड़बड़ी है. कैमरा एचएएल को भेजना चाहिए ERROR_REQUEST कैप्चर करने के किसी भी अनुरोध के लिए जो डिसकनेक्ट की गई स्ट्रीम को टारगेट करती है और बाद के अनुरोधों पर कार्रवाई करने के लिए तैयार रहती है सामान्य रूप से.
  • समय खत्म: ऐसा तब हो सकता है, जब कोई ऐप्लिकेशन व्यस्त हो कुछ बफ़र को बनाए रखते हुए गहन प्रोसेसिंग करता है. कैमरा एचएएल को यह करना चाहिए भेजें ERROR_REQUEST कैप्चर अनुरोधों के लिए जिन्हें स्वीकार नहीं किया जा सकता टाइम आउट गड़बड़ी की सूचना मिलती है और इससे बाद के अनुरोधों को सामान्य रूप से प्रोसेस किया जा सकता है.
  • कैमरे का फ़्रेमवर्क एक नया स्ट्रीम कॉन्फ़िगरेशन तैयार कर रहा है: कैमरा एचएएल को अगले दिन तक इंतज़ार करना चाहिए configureStreams requestStreamBuffers को फिर से कॉल करने से पहले कॉल पूरा हो गया.
  • कैमरा एचएएल, बफ़र की सीमा (maxBuffers फ़ील्ड): कैमरा एचएएल को इंतज़ार करना होगा जब तक यह कॉल करने से पहले स्ट्रीम का कम से कम एक बफ़र दिखाता है requestStreamBuffers को फिर से सेटअप करें.

रिटर्नस्ट्रीमबफ़र

इसका इस्तेमाल करें returnStreamBuffers विधि का इस्तेमाल करती है. कैमरा एचएएल सामान्य रूप से काम करता है यह पैरामीटर के ज़रिए कैमरा फ़्रेमवर्क पर बफ़र करता है processCaptureResult तरीका है, लेकिन यह केवल कैमरा एचएएल. requestStreamBuffers तरीके से, अनुरोध किए गए बफ़र से ज़्यादा बफ़र को बनाए रखने के लिए, कैमरा एचएएल लागू करना को ध्यान में रखकर बनाया गया है. ऐसा तब होता है, जब returnStreamBuffers तरीका इस्तेमाल किया गया. अगर HAL लागू करने की प्रक्रिया में कभी भी अनुरोध किए गए बफ़र से ज़्यादा बफ़र नहीं होते हैं, तो कैमरा एचएएल लागू करने के लिए, returnStreamBuffers को कॉल करने की ज़रूरत नहीं है तरीका.

सिग्नलस्ट्रीमफ़्लश

कॉन्टेंट बनाने signalStreamFlush तरीका को कैमरा फ़्रेमवर्क की मदद से कॉल किया जाता है, ताकि कैमरा एचएएल को सारा डेटा वापस लाने के लिए कहा जा सके साथ में बफ़र. आम तौर पर, इसे तब कॉल किया जाता है, जब कैमरे का फ़्रेमवर्क कॉल करें configureStreams साथ ही, कैमरे को कैप्चर करने वाले पाइपलाइन में मौजूद डेटा को खाली करना होगा. returnStreamBuffers से मिलती-जुलती विधि से, अगर कैमरा एचएएल इंप्लिमेंटेशन में इससे ज़्यादा बफ़र नहीं होते हैं अनुरोध किया गया है, तो हो सकता है कि इस तरीके को बिना किसी हाथ के लागू किया जाए.

कैमरे का फ़्रेमवर्क कॉल होने के बाद signalStreamFlush फ़्रेमवर्क तब तक कैमरा एचएएल को कैप्चर करने के नए अनुरोध भेजना बंद कर देता है, जब तक बफ़र को कैमरे के फ़्रेमवर्क में वापस भेज दिया गया है. जब सभी बफ़र की वैल्यू वापस आने पर, requestStreamBuffers तरीके से कॉल नहीं हो पाए और कैमरे को फ़्रेमवर्क अपने काम को पूरी तरह से सुरक्षित बनाए रख सकता है. इसके बाद, कैमरे का फ़्रेमवर्क कॉल करता है या configureStreams या processCaptureRequest तरीका. अगर कैमरे का फ़्रेमवर्क configureStreams तरीके को कॉल करता है, तो कैमरा configureStreams कॉल वापस आने के बाद, एचएएल बफ़र का अनुरोध फिर से कर सकता है का इस्तेमाल किया जा सकता है. अगर कैमरे का फ़्रेमवर्क processCaptureRequest तरीके को कॉल करता है, processCaptureRequest के दौरान, कैमरा एचएएल बफ़र का अनुरोध कर सकता है कॉल.

signalStreamFlush तरीके और flush तरीका. flush तरीके को कॉल करने पर, एचएएल अधूरी कैप्चर की गई कार्रवाई को रद्द कर सकता है इनसे अनुरोध करें: ERROR_REQUEST ताकि पाइपलाइन में जल्दी से काम हो सके. टास्क कब शुरू होगा signalStreamFlush तरीके का इस्तेमाल करके कॉल किया जा रहा है, तो एचएएल को बाकी सभी काम पूरे करने होंगे सामान्य तौर पर अनुरोधों को कैप्चर करता है और सभी बफ़र को कैमरा फ़्रेमवर्क पर वापस भेजता है.

signalStreamFlush तरीके और अन्य तरीकों के बीच एक और अंतर यह है वह signalStreamFlush एक एकतरफ़ा HIDL है, जिसका मतलब है कि कैमरा HAL को signalStreamFlush कॉल. इसका मतलब है कि signalStreamFlush वाला तरीका और अन्य तरीके (खास तौर पर, configureStreams तरीका) किसी दूसरे क्रम में कैमरा एचएएल पर पहुंच सकती है पहले से रिकॉर्ड किए गए क्रम में नहीं दिख रहे थे. इसे ठीक करने के लिए एक साथ कई काम करने की समस्या की वजह से, streamConfigCounter फ़ील्ड को StreamConfiguration और signalStreamFlush में एक तर्क के रूप में जोड़ा गया तरीका. कैमरा एचएएल लागू करने के लिए, streamConfigCounter का इस्तेमाल करना चाहिए यह निर्धारित करने के लिए तर्क कि signalStreamFlush कॉल उसके कॉल के बाद के संबंधित configureStreams कॉल. उदाहरण के लिए, तीसरी इमेज देखें.

देर से आने वाले कॉल को मैनेज करना

तीसरी इमेज. कैमरा एचएएल को किस तरह से SignStreamFlush कॉल का पता लगाना चाहिए और उन्हें हैंडल करना चाहिए

बफ़र मैनेजमेंट एपीआई लागू करते समय, व्यवहार में बदलाव

बफ़र मैनेजमेंट लॉजिक को लागू करने के लिए, बफ़र मैनेजमेंट एपीआई का इस्तेमाल करते समय, कैमरे के काम करने के तरीके में इन बदलावों को ध्यान में रखें और कैमरा एचएएल लागू करना:

  • कैप्चर के अनुरोध, कैमरा एचएएल पर जल्दी और ज़्यादा तेज़ी से पहुंचते हैं अक्सर: बफ़र मैनेजमेंट एपीआई के बिना, कैमरा फ़्रेमवर्क कैप्चर अनुरोध भेजने से पहले हर कैप्चर अनुरोध के लिए आउटपुट बफ़र होता है कैमरा एचएएल. बफ़र मैनेजमेंट एपीआई का इस्तेमाल करते समय, कैमरे का फ़्रेमवर्क को अब बफ़र का इंतज़ार नहीं करना होगा. इसलिए, कैप्चर करने के अनुरोध भेजे जा सकेंगे कैमरा एचएएल तक पहुंचने में मदद मिली.

    साथ ही, बफ़र मैनेजमेंट एपीआई के बिना, कैमरे का फ़्रेमवर्क बंद हो जाता है कैप्चर की कोई एक आउटपुट स्ट्रीम होने पर कैप्चर अनुरोध भेजा जा रहा है अनुरोध, बफ़र की तय सीमा तक पहुंच गया है, जिसे एचएएल एक बार (यह वैल्यू कैमरा एचएएल से तय होती है configureStreams की रिटर्न वैल्यू में HalStream::maxBuffers फ़ील्ड कॉल). बफ़र मैनेजमेंट एपीआई की मदद से, थ्रॉटलिंग का यह तरीका अब काम नहीं करता मौजूद है और कैमरा एचएएल लागू नहीं करना चाहिए एचएएल के पास कैप्चर करने के बहुत ज़्यादा अनुरोध होने पर, processCaptureRequest कॉल सूची में है.

  • requestStreamBuffers कॉल के दौरान इंतज़ार का समय बहुत अलग होता है: ऐसे मामले requestStreamBuffers पर कॉल आने में ज़्यादा समय लगने की कई वजहें हो सकती हैं औसत. उदाहरण के लिए:

    • नई स्ट्रीम के शुरुआती कुछ बफ़र के लिए, ज़्यादा समय लग सकता है, क्योंकि डिवाइस को मेमोरी असाइन करनी होती है.
    • अपेक्षित प्रतीक्षा समय की संख्या के अनुपात में हर कॉल में बफ़र का अनुरोध किया जाता है.
    • ऐप्लिकेशन में बफ़र हैं और उसे प्रोसेस किया जा रहा है. यह बफ़र अनुरोध की रफ़्तार धीमी हो सकती है या टाइम आउट हो सकता है. ऐसा बफ़र का कम होना या सीपीयू (CPU) का काफ़ी इस्तेमाल न होना.

बफ़र मैनेजमेंट से जुड़ी रणनीतियां

बफ़र मैनेजमेंट एपीआई अलग-अलग तरह के बफ़र मैनेजमेंट की सुविधा देता है रणनीतियों को लागू किया जाएगा. इसके कुछ उदाहरण यहां दिए गए हैं:

  • पुराने सिस्टम के साथ काम करने की सुविधा: एचएएल, कैप्चर अनुरोध के लिए बफ़र का अनुरोध करता है processCaptureRequest कॉल के दौरान. इस रणनीति से ऐसे ट्रैफ़िक की कोई जानकारी नहीं मिलती मेमोरी में बचत होती है, लेकिन बफ़र को पहली बार लागू किया जा सकता है मैनेजमेंट एपीआई के साथ काम करता है. इसके लिए, मौजूदा कैमरा एचएएल में बहुत कम कोड में बदलाव करने पड़ते हैं.
  • ज़्यादा मेमोरी की बचत: कैमरा एचएएल सिर्फ़ आउटपुट बफ़र का अनुरोध करता है इसके ठीक पहले: इस रणनीति से आपको ये काम करने में मदद मिलती है ज़्यादा मेमोरी बचाई जा सकती है. कैमरे की ज़्यादा पाइपलाइन की वजह से आपको समस्या हो सकती है बफ़र अनुरोधों के पूरा होने में असामान्य रूप से ज़्यादा समय लगने पर जैंक करें.
  • कैश मेमोरी में सेव किया गया: कैमरा एचएएल कुछ बफ़र को कैश मेमोरी में सेव करता है, ताकि इनके होने की संभावना कम हो समय-समय पर धीमे बफ़र अनुरोध की वजह से असर पड़ सकता है.

कैमरा एचएएल, अलग-अलग रणनीतियां अपना सकता है. ये रणनीतियां अलग-अलग कामों के लिए अपनाई जा सकती हैं, उदाहरण के लिए, स्टोरेज में ज़्यादा बचत करने वाली रणनीति का इस्तेमाल करना. साथ ही, पुराने सिस्टम के साथ काम करने की रणनीति का इस्तेमाल किया जा सकता है.

एक्सटर्नल कैमरा एचएएल में सैंपल लागू करने की सुविधा

बाहरी कैमरा एचएएल को Android 9 में लॉन्च किया गया था. इसे सोर्स ट्री यहां hardware/interfaces/camera/device/3.5/. Android 10 को अपडेट किया गया है, ताकि इसमें ExternalCameraDeviceSession.cpp बफ़र मैनेजमेंट एपीआई को लागू करना. बाहरी कैमरा एचएएल यह बफ़र मैनेजमेंट में बताई गई, ज़्यादा से ज़्यादा मेमोरी सेव करने की रणनीति लागू करता है रणनीतियों का इस्तेमाल किया गया है. C++ कोड.