कैमरा एक्सटेंशन

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

समर्थित एक्सटेंशन की सूची के लिए, जो कैमरा2 और कैमराएक्स में समान है, कैमराएक्स एक्सटेंशन एपीआई देखें। यदि आप कोई एक्सटेंशन जोड़ना चाहते हैं, तो इश्यू ट्रैकर के साथ बग दर्ज करें।

यह पृष्ठ वर्णन करता है कि उपकरणों पर OEM विक्रेता लाइब्रेरी को कैसे कार्यान्वित और सक्षम किया जाए।

वास्तुकला

निम्नलिखित आरेख कैमरा एक्सटेंशन इंटरफ़ेस या extensions-interface की वास्तुकला का वर्णन करता है: वास्तुकला

चित्र 1. कैमरा एक्सटेंशन आर्किटेक्चर आरेख

जैसा कि चित्र में दिखाया गया है, कैमरा एक्सटेंशन का समर्थन करने के लिए, आपको OEM विक्रेता लाइब्रेरी द्वारा प्रदान किए गए extensions-interface लागू करने की आवश्यकता है। आपकी ओईएम विक्रेता लाइब्रेरी दो एपीआई सक्षम करती है: कैमराएक्स एक्सटेंशन एपीआई और कैमरा2 एक्सटेंशन एपीआई , जिनका उपयोग विक्रेता एक्सटेंशन तक पहुंचने के लिए क्रमशः कैमराएक्स और कैमरा2 ऐप्स द्वारा किया जाता है।

OEM विक्रेता लाइब्रेरी लागू करें

ओईएम विक्रेता लाइब्रेरी को लागू करने के लिए, camera-extensions-stub फ़ाइलों को सिस्टम लाइब्रेरी प्रोजेक्ट में कॉपी करें। ये फ़ाइलें कैमरा एक्सटेंशन इंटरफ़ेस को परिभाषित करती हैं।

camera-extensions-stub फ़ाइलें निम्नलिखित श्रेणियों में विभाजित हैं:

आवश्यक इंटरफ़ेस फ़ाइलें (संशोधित न करें)

  • PreviewExtenderImpl.java
  • ImageCaptureExtenderImpl.java
  • ExtenderStateListener.java
  • ProcessorImpl.java
  • PreviewImageProcessorImpl.java
  • CaptureProcessorImpl.java
  • CaptureStageImpl.java
  • RequestUpdateProcessorImpl.java
  • ProcessResultImpl.java
  • advanced/AdvancedExtenderImpl.java
  • advanced/Camera2OutputConfigImpl.java
  • advanced/Camera2SessionConfigImpl.java
  • advanced/ImageProcessorImpl.java
  • advanced/ImageReaderOutputConfigImpl.java
  • advanced/ImageReferenceImpl.java
  • advanced/MultiResolutionImageReaderOutputConfigImpl.java
  • advanced/OutputSurfaceImpl.java
  • advanced/RequestProcessorImpl.java
  • advanced/SessionProcessorImpl.java
  • advanced/SurfaceOutputConfigImpl.java

अनिवार्य कार्यान्वयन (अपना कार्यान्वयन जोड़ें)

  • ExtensionVersionImpl.java
  • InitializerImpl.java

बोकेह एक्सटेंडर कक्षाएं (यदि बोकेह एक्सटेंशन समर्थित है तो इसे लागू करें)

  • BokehImageCaptureExtenderImpl.java
  • BokehPreviewExtenderImpl.java
  • advanced/BokehAdvancedExtenderImpl.java

रात्रि विस्तारक कक्षाएं (यदि रात्रि विस्तार समर्थित है तो इसे लागू करें)

  • NightImageCaptureExtenderImpl.java
  • NightPreviewExtenderImpl.java
  • advanced/NightAdvancedExtenderImpl.java

ऑटो एक्सटेंडर कक्षाएं (यदि ऑटो एक्सटेंशन समर्थित है तो इसे लागू करें)

  • AutoImageCaptureExtenderImpl.java
  • AutoPreviewExtenderImpl.java
  • advanced/AutoAdvancedExtenderImpl.java

एचडीआर एक्सटेंडर कक्षाएं (यदि एचडीआर एक्सटेंशन समर्थित है तो इसे लागू करें)

  • HdrImageCaptureExtenderImpl.java
  • HdrPreviewExtenderImpl.java
  • advanced/HdrAdvancedExtenderImpl.java

फेस रीटच एक्सटेंडर कक्षाएं (यदि फेस रीटच एक्सटेंशन समर्थित है तो इसे लागू करें)

  • BeautyImageCaptureExtenderImpl.java
  • BeautyPreviewExtenderImpl.java
  • advanced/BeautyAdvancedExtenderImpl.java

उपयोगिताएँ (वैकल्पिक, हटाया जा सकता है)

  • advanced/Camera2OutputConfigImplBuilder.java
  • advanced/Camera2SessionConfigImplBuilder.java

आपको प्रत्येक एक्सटेंशन के लिए कार्यान्वयन प्रदान करने की आवश्यकता नहीं है। यदि आप कोई एक्सटेंशन लागू नहीं करते हैं, तो false वापसी करने या संबंधित एक्सटेंडर कक्षाओं को हटाने के लिए isExtensionAvailable() सेट करें। कैमरा2 और कैमराएक्स एक्सटेंशन एपीआई ऐप को रिपोर्ट करते हैं कि एक्सटेंशन अनुपलब्ध है।

आइए देखें कि कैमरा2 और कैमराएक्स एक्सटेंशन एपीआई किसी एक्सटेंशन को सक्षम करने के लिए विक्रेता लाइब्रेरी के साथ कैसे इंटरैक्ट करते हैं। निम्नलिखित आरेख एक उदाहरण के रूप में नाइट एक्सटेंशन का उपयोग करके अंत-से-अंत प्रवाह को दर्शाता है:

मुख्यप्रवाह

चित्र 2. रात्रि विस्तार कार्यान्वयन

  1. संस्करण सत्यापन:

    यह सुनिश्चित करने के लिए कि OEM-कार्यान्वित extensions-interface संस्करण, कैमरा2/X समर्थित संस्करणों के साथ संगत है, कैमरा2/X ExtensionVersionImpl.checkApiVersion() को कॉल करता है।

  2. विक्रेता पुस्तकालय आरंभीकरण:

    InitializerImpl में एक विधि init() है जो विक्रेता लाइब्रेरी को प्रारंभ करती है। कैमरा2/एक्स एक्सटेंडर कक्षाओं तक पहुंचने से पहले आरंभीकरण पूरा करता है।

  3. तात्कालिक विस्तारक वर्ग:

    एक्सटेंशन के लिए एक्सटेंडर कक्षाओं को इंस्टेंट करता है। एक्सटेंडर दो प्रकार के होते हैं: बेसिक एक्सटेंडर और एडवांस्ड एक्सटेंडर। आपको सभी एक्सटेंशन के लिए एक एक्सटेंडर प्रकार लागू करना होगा। अधिक जानकारी के लिए, बेसिक एक्सटेंडर बनाम एडवांस्ड एक्सटेंडर देखें।

    कैमरा2/एक्स जानकारी प्राप्त करने और एक्सटेंशन को सक्षम करने के लिए एक्सटेंडर कक्षाओं को इंस्टेंट और इंटरैक्ट करता है। किसी दिए गए एक्सटेंशन के लिए, कैमरा2/एक्स एक्सटेंडर कक्षाओं को कई बार इंस्टेंट कर सकता है। परिणामस्वरूप, कंस्ट्रक्टर या init() कॉल में हेवी-लिफ्टिंग इनिशियलाइज़ेशन न करें। भारी सामान केवल तभी उठाएं जब कैमरा सत्र शुरू होने वाला हो, जैसे कि जब बेसिक एक्सटेंडर में onInit() कॉल किया जाता है या एडवांस्ड एक्सटेंडर में initSession() को कॉल किया जाता है।

    नाइट एक्सटेंशन के लिए, बेसिक एक्सटेंडर प्रकार के लिए निम्नलिखित एक्सटेंडर कक्षाएं तत्काल शुरू की जाती हैं:

    • NightImageCaptureExtenderImpl.java
    • NightPreviewExtenderImpl.java

    और उन्नत विस्तारक प्रकार के लिए:

    • NightAdvancedExtenderImpl.java
  4. एक्सटेंशन उपलब्धता जांचें:

    एक्सटेंशन को सक्षम करने से पहले, isExtensionAvailable() जांच करता है कि एक्सटेंशन एक्सटेंडर इंस्टेंस के माध्यम से निर्दिष्ट कैमरा आईडी पर उपलब्ध है या नहीं।

  5. कैमरा जानकारी के साथ एक्सटेंडर को प्रारंभ करें:

    कैमरा2/एक्स एक्सटेंडर इंस्टेंस पर init() को कॉल करता है और इसे कैमरा आईडी और CameraCharacteristics पास करता है।

  6. क्वेरी जानकारी:

    समर्थित रिज़ॉल्यूशन जैसी जानकारी प्राप्त करने, अनुमानित विलंबता को कैप्चर करने और एक्सटेंशन को सक्षम करने की तैयारी में एक्सटेंडर से अनुरोध कुंजियों को कैप्चर करने के लिए एक्सटेंडर वर्ग को आमंत्रित करता है।

  7. एक्सटेंडर पर एक्सटेंशन सक्षम करें:

    एक्सटेंडर क्लास क्लास को सक्षम करने के लिए आवश्यक सभी इंटरफेस प्रदान करता है। यह OEM कार्यान्वयन को कैमरा2 पाइपलाइन में जोड़ने के लिए एक तंत्र प्रदान करता है जैसे कि कैप्चर अनुरोध पैरामीटर को इंजेक्ट करना या पोस्ट प्रोसेसर को सक्षम करना।

    उन्नत एक्सटेंडर प्रकार के लिए, कैमरा2/एक्स एक्सटेंशन को सक्षम करने के लिए SessionProcessorImpl के साथ इंटरैक्ट करता है। कैमरा2/X एक्सटेंडर पर createSessionProcessor() कॉल करके SessionProcessorImpl इंस्टेंस को पुनः प्राप्त करता है।

निम्नलिखित अनुभाग विस्तार प्रवाह का अधिक विस्तार से वर्णन करते हैं।

संस्करण सत्यापन

रनटाइम पर डिवाइस से ओईएम विक्रेता लाइब्रेरी को लोड करते समय, कैमरा2/एक्स सत्यापित करता है कि लाइब्रेरी extensions-interface संस्करण के साथ संगत है या नहीं। extensions-interface सिमेंटिक वर्जनिंग या MAJOR.MINOR.PATCH का उपयोग करता है, उदाहरण के लिए, 1.1.0 या 1.2.0। हालाँकि, संस्करण सत्यापन के दौरान केवल प्रमुख और लघु संस्करणों का उपयोग किया जाता है।

संस्करण को सत्यापित करने के लिए, कैमरा2/X समर्थित extensions-interface संस्करण के साथ ExtensionVersionImpl.checkApiVersion() को कॉल करता है। कैमरा2/एक्स फिर ओईएम लाइब्रेरी द्वारा रिपोर्ट किए गए संस्करण का उपयोग यह निर्धारित करने के लिए करता है कि क्या एक्सटेंशन सक्षम किया जा सकता है और इसे किन क्षमताओं का आह्वान करना चाहिए।

प्रमुख संस्करण अनुकूलता

यदि एक्सटेंशन-इंटरफ़ेस के प्रमुख संस्करण कैमरा2/X और विक्रेता लाइब्रेरी के बीच भिन्न हैं, तो इसे असंगत माना जाता है और एक्सटेंशन अक्षम कर दिया जाता है।

पश्च संगतता

जब तक प्रमुख संस्करण समान है, कैमरा2/एक्स पूर्व extensions-interface संस्करणों के साथ निर्मित OEM विक्रेता लाइब्रेरीज़ के साथ बैकवर्ड संगतता सुनिश्चित करता है। उदाहरण के लिए, यदि कैमरा2/एक्स extensions-interface 1.3.0 का समर्थन करता है, तो 1.0.0, 1.1.0 और 1.2.0 लागू करने वाली OEM विक्रेता लाइब्रेरी अभी भी संगत हैं। इसका मतलब यह भी है कि विक्रेता लाइब्रेरी के एक विशिष्ट संस्करण को लागू करने के बाद, कैमरा 2/एक्स यह सुनिश्चित करता है कि लाइब्रेरी आगामी extension-interface संस्करणों के साथ पिछड़े संगत है।

आगे की अनुकूलता

नए extensions-interface के विक्रेता पुस्तकालयों के साथ आगे की अनुकूलता आप पर निर्भर करती है, ओईएम पर। यदि आपको एक्सटेंशन लागू करने के लिए कुछ सुविधाओं की आवश्यकता है, तो आप एक निश्चित संस्करण से शुरू होने वाले एक्सटेंशन को सक्षम करना चाहेंगे। इस मामले में, जब कैमरा2/एक्स लाइब्रेरी संस्करण आवश्यकताओं को पूरा करता है तो आप समर्थित extensions-interface संस्करण वापस कर सकते हैं। यदि कैमरा2/X संस्करण समर्थित नहीं हैं, तो आप एक्सटेंशन को अक्षम करने के लिए 99.0.0 जैसे असंगत संस्करण को वापस कर सकते हैं।

विक्रेता पुस्तकालय आरंभीकरण

OEM लाइब्रेरी द्वारा कार्यान्वित extensions-interface संस्करण को सत्यापित करने के बाद, कैमरा2/X आरंभीकरण प्रक्रिया शुरू करता है। InitializerImpl.init() विधि OEM लाइब्रेरी को संकेत देती है कि कोई ऐप एक्सटेंशन का उपयोग करने का प्रयास कर रहा है।

जब तक OEM विक्रेता लाइब्रेरी आरंभीकरण के पूरा होने की सूचना देने के लिए OnExtensionsInitializedCallback.onSuccess() को कॉल नहीं करती, तब तक कैमरा2/X OEM लाइब्रेरी में कोई अन्य कॉल नहीं करता (संस्करण जांच के अलावा)।

आपको InitializerImpl extensions-interface 1.1.0 के रूप में लागू करना होगा। यदि OEM विक्रेता लाइब्रेरी extensions-interface 1.0.0 लागू करती है, तो कैमरा2/X लाइब्रेरी आरंभीकरण चरण को छोड़ देता है।

बेसिक एक्सटेंडर बनाम एडवांस्ड एक्सटेंडर

extensions-interface कार्यान्वयन दो प्रकार के होते हैं: बेसिक एक्सटेंडर और एडवांस्ड एक्सटेंडर। एडवांस्ड एक्सटेंडर को extensions-interface 1.2.0 के बाद से समर्थित किया गया है।

एक्सटेंशन के लिए बेसिक एक्सटेंडर लागू करें जो कैमरा एचएएल में छवियों को संसाधित करता है या वाईयूवी स्ट्रीम को संसाधित करने में सक्षम पोस्ट प्रोसेसर का उपयोग करता है।

उन एक्सटेंशन के लिए उन्नत एक्सटेंडर लागू करें जिन्हें कैमरा2 स्ट्रीम कॉन्फ़िगरेशन को अनुकूलित करने और आवश्यकतानुसार कैप्चर अनुरोध भेजने की आवश्यकता है।

तुलना के लिए निम्न तालिका देखें:

बुनियादी विस्तारक उन्नत विस्तारक
स्ट्रीम कॉन्फ़िगरेशन तय
पूर्वावलोकन: PRIVATE या YUV_420_888 (यदि प्रोसेसर मौजूद है)
अभी भी कैप्चर करें: JPEG या YUV_420_888 (यदि प्रोसेसर मौजूद है)
OEM द्वारा अनुकूलन योग्य।
कैप्चर अनुरोध भेजा जा रहा है केवल कैमरा2/एक्स ही कैप्चर अनुरोध भेज सकता है। आप इन अनुरोधों के लिए पैरामीटर सेट कर सकते हैं। जब प्रोसेसर को छवि कैप्चर के लिए प्रदान किया जाता है, तो कैमरा2/एक्स एकाधिक कैप्चर अनुरोध भेज सकता है और सभी छवियां और कैप्चर परिणाम प्रोसेसर को भेज सकता है। कैमरा2 कैप्चर अनुरोध को निष्पादित करने और परिणाम और छवि प्राप्त करने के लिए आपको एक RequestProcessorImpl उदाहरण प्रदान किया जाता है।

कैमरा2/X OEM को पूर्वावलोकन के लिए दोहराए जाने वाले अनुरोध को startRepeating और क्रमशः स्टिल कैप्चर अनुक्रम शुरू करने के लिए संकेत देने के लिए SessionProcessorImpl पर startCapture और स्टार्टकैप्चर को आमंत्रित करता है।

कैमरे की पाइपलाइन में हुक
  • onPresetSession सत्र पैरामीटर प्रदान करता है।
  • CameraCaptureSession कॉन्फ़िगर होने के ठीक बाद onEnableSession एक एकल अनुरोध भेजता है।
  • CameraCaptureSession बंद होने से पहले onDisableSession एक एकल अनुरोध भेजता है।
  • initSession कैप्चर सत्र बनाने के लिए एक अनुकूलित कैमरा2 सत्र कॉन्फ़िगरेशन प्रारंभ करता है और लौटाता है।
  • CameraCaptureSession कॉन्फ़िगर होने के ठीक बाद onCaptureSessionStart लागू किया जाता है।
  • CameraCaptureSession बंद होने से पहले onCaptureSessionEnd लागू किया जाता है।
के लिए उपयुक्त कैमरा HAL या प्रोसेसर में लागू किए गए एक्सटेंशन जो YUV छवियों को संसाधित करते हैं।
  • एक्सटेंशन के लिए कैमरा2-आधारित कार्यान्वयन है।
  • RAW स्ट्रीम जैसे अनुकूलित स्ट्रीम कॉन्फ़िगरेशन की आवश्यकता है।
  • इंटरएक्टिव कैप्चर अनुक्रम की आवश्यकता है।
समर्थित एपीआई संस्करण कैमरा2 एक्सटेंशन: Android 13 या उच्चतर
कैमराएक्स एक्सटेंशन: camera-extensions 1.1.0 या उच्चतर
कैमरा2 एक्सटेंशन: Android 12L या उच्चतर
कैमराएक्स एक्सटेंशन: camera-extensions 1.2.0-अल्फा03 या उच्चतर

ऐप प्रवाहित होता है

निम्न तालिका तीन प्रकार के ऐप प्रवाह और उनके संबंधित कैमरा एक्सटेंशन एपीआई कॉल दिखाती है। जबकि कैमरा2/एक्स ये एपीआई प्रदान करता है, आपको इन प्रवाहों का समर्थन करने के लिए विक्रेता लाइब्रेरी को उचित रूप से कार्यान्वित करना होगा, जिसे हम बाद के अनुभाग में अधिक विस्तार से वर्णित करेंगे।

कैमरा2 एक्सटेंशन कैमराएक्स एक्सटेंशन
क्वेरी एक्सटेंशन उपलब्धता CameraExtensionCharacteristics . getSupportedExtensions ExtensionsManager. isExtensionAvailable
जानकारी पूछें CameraExtensionCharacteristics. getExtensionSupportedSizes CameraExtensionCharacteristics. getEstimatedCaptureLatencyRangeMillis CameraExtensionCharacteristics. getAvailableCaptureRequestKeys CameraExtensionCharacteristics. getAvailableCaptureResultKeys ExtensionsManager. getEstimatedCaptureLatencyRange

कैमराएक्स लाइब्रेरी के भीतर बाकी जानकारी को संभालता है।

एक्सटेंशन सक्षम होने पर पूर्वावलोकन और स्टिल-कैप्चर करें CameraDevice. createExtensionSession

cameraExtensionsSession. setRepeatingRequest

cameraExtensionsSession. capture

val cameraSelector = ExtensionsManager. getExtensionEnabledCameraSelector (जीवनचक्रस्वामी, कैमरा चयनकर्ता, पूर्वावलोकन, ...)

बुनियादी विस्तारक

बेसिक एक्सटेंडर इंटरफ़ेस कैमरा पाइपलाइन में कई स्थानों पर हुक प्रदान करता है। प्रत्येक एक्सटेंशन प्रकार में संबंधित एक्सटेंडर वर्ग होते हैं जिन्हें ओईएम को लागू करने की आवश्यकता होती है।

निम्न तालिका उन एक्सटेंडर वर्गों को सूचीबद्ध करती है जिन्हें ओईएमएस को प्रत्येक एक्सटेंशन के लिए लागू करने की आवश्यकता है:

लागू करने के लिए विस्तारक वर्ग
रात NightPreviewExtenderImpl.java

NightImageCaptureExtenderImpl.java

एचडीआर HdrPreviewExtenderImpl.java HdrImageCaptureExtenderImpl.java
ऑटो AutoPreviewExtenderImpl.java AutoImageCaptureExtenderImpl.java
bokeh BokehPreviewExtenderImpl.java BokehImageCaptureExtenderImpl.java
चेहरा सुधारना BeautyPreviewExtenderImpl.java BeautyImageCaptureExtenderImpl.java

हम निम्नलिखित उदाहरण में प्लेसहोल्डर के रूप में PreviewExtenderImpl और ImageCaptureExtenderImpl का उपयोग करते हैं। इन्हें उन वास्तविक फ़ाइलों के नामों से बदलें जिन्हें आप कार्यान्वित कर रहे हैं।

बेसिक एक्सटेंडर में निम्नलिखित क्षमताएं हैं:

  • CameraCaptureSession ( onPresetSession ) को कॉन्फ़िगर करते समय सत्र पैरामीटर इंजेक्ट करें।
  • कैप्चर सत्र प्रारंभ और समापन घटनाओं के बारे में आपको सूचित करें और लौटाए गए पैरामीटर ( onEnableSession , onDisableSession ) के साथ HAL को सूचित करने के लिए एक एकल अनुरोध भेजें।
  • अनुरोध के लिए कैप्चर पैरामीटर इंजेक्ट करें ( PreviewExtenderImpl.getCaptureStage , ImageCaptureExtenderImpl.getCaptureStages )।
  • पूर्वावलोकन के लिए प्रोसेसर जोड़ें और अभी भी कैप्चर करें जो YUV_420_888 स्ट्रीम को संसाधित करने में सक्षम है।

आइए देखें कि ऊपर उल्लिखित तीन ऐप प्रवाह को प्राप्त करने के लिए कैमरा2/एक्स extensions-interface कैसे लागू करता है।

ऐप प्रवाह 1: एक्सटेंशन उपलब्धता की जाँच करें

BasicExtenderAppFlow1

चित्र 3. बेसिक एक्सटेंडर पर ऐप प्रवाह 1

इस प्रवाह में, कैमरा2/X init() को कॉल किए बिना सीधे PreviewExtenderImpl और ImageCaptureExtenderImpl दोनों की isExtensionAvailable() init() को कॉल करता है। एक्सटेंशन को सक्षम करने के लिए दोनों एक्सटेंडर वर्गों को true लौटना होगा।

यह अक्सर ऐप्स के लिए यह जांचने का पहला कदम होता है कि एक्सटेंशन सक्षम करने से पहले दिया गया एक्सटेंशन प्रकार किसी दिए गए कैमरा आईडी के लिए समर्थित है या नहीं। ऐसा इसलिए है क्योंकि कुछ एक्सटेंशन केवल कुछ कैमरा आईडी पर ही समर्थित होते हैं।

ऐप प्रवाह 2: जानकारी क्वेरी करें

BasicExtenderAppFlow2

चित्र 4. बेसिक एक्सटेंडर पर ऐप फ्लो 2

यह निर्धारित करने के बाद कि एक्सटेंशन उपलब्ध है या नहीं, ऐप्स को एक्सटेंशन सक्षम करने से पहले निम्नलिखित जानकारी पूछनी चाहिए।

  • अभी भी विलंबता सीमा कैप्चर करें: ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRange ऐप के मूल्यांकन के लिए कैप्चर विलंबता की सीमा लौटाता है कि क्या यह वर्तमान परिदृश्य के लिए एक्सटेंशन को सक्षम करने के लिए उपयुक्त है।

  • पूर्वावलोकन और कैप्चर सतह के लिए समर्थित आकार: ImageCaptureExtenderImpl.getSupportedResolutions और PreviewExtenderImpl.getSupportedResolutions छवि प्रारूपों और आकारों की एक सूची लौटाते हैं जो सतह प्रारूप और आकार के लिए समर्थित हैं।

  • समर्थित अनुरोध और परिणाम कुंजियाँ: कैमरा2/X आपके कार्यान्वयन से समर्थित कैप्चर अनुरोध कुंजियाँ और परिणाम कुंजियाँ पुनः प्राप्त करने के लिए निम्नलिखित विधियों को लागू करता है:

    • ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys
    • ImageCaptureExtenderImpl.getAvailableCapturetResultKeys

कैमरा2/X हमेशा अधिक जानकारी के लिए पूछताछ करने से पहले इन एक्सटेंडर कक्षाओं पर init() को कॉल करता है।

ऐप प्रवाह 3: एक्सटेंशन सक्षम होने पर पूर्वावलोकन/अभी भी कैप्चर करें (एचएएल कार्यान्वयन)

BasicExtenderAppFlow3

चित्र 5. बेसिक एक्सटेंडर पर ऐप फ़्लो 3

उपरोक्त आरेख बिना किसी प्रोसेसर के एक्सटेंशन के साथ पूर्वावलोकन और स्टिल कैप्चर को सक्षम करने के मुख्य प्रवाह को दर्शाता है। इसका मतलब है कि कैमरा HAL एक्सटेंशन को प्रोसेस करता है।

इस प्रवाह में, कैमरा2/X पहले init() फिर onInit कॉल करता है, जो आपको सूचित करता है कि निर्दिष्ट एक्सटेंशन के साथ एक कैमरा सत्र शुरू होने वाला है। आप onInit() में हेवी-लिफ्टिंग इनिशियलाइज़ेशन कर सकते हैं।

CameraCaptureSession कॉन्फ़िगर करते समय, कैमरा2/एक्स सत्र पैरामीटर प्राप्त करने के लिए onPresetSession आमंत्रित करता है। कैप्चर सत्र सफलतापूर्वक कॉन्फ़िगर होने के बाद, कैमरा2/X एक CaptureStageImpl इंस्टेंस लौटाने वाले onEnableSession आमंत्रित करता है जिसमें कैप्चर पैरामीटर होते हैं। कैमरा2/एक्स तुरंत एचएएल को सूचित करने के लिए इन कैप्चर मापदंडों के साथ एक अनुरोध भेजता है। इसी तरह, कैप्चर सत्र बंद होने से पहले, कैमरा2/एक्स onDisableSession आमंत्रित करता है और फिर लौटाए गए कैप्चर पैरामीटर के साथ एक एकल अनुरोध भेजता है।

कैमरा2/एक्स द्वारा ट्रिगर किए गए दोहराए गए अनुरोध में PreviewExtenderImpl.getCaptureStage() द्वारा लौटाए गए अनुरोध पैरामीटर शामिल हैं। इसके अलावा, स्टिल कैप्चर अनुरोध में ImageCaptureExtenderImpl.getCaptureStages() द्वारा लौटाए गए पैरामीटर शामिल हैं।

अंत में, कैमरा सत्र समाप्त होने के बाद कैमरा2/X onDeInit() को आमंत्रित करता है। आप onDeinit() में संसाधन जारी कर सकते हैं।

पूर्वावलोकन प्रोसेसर

कैमरा एचएएल के अलावा, आप प्रोसेसर में एक्सटेंशन भी लागू कर सकते हैं।

नीचे बताए अनुसार प्रोसेसर प्रकार निर्दिष्ट करने के लिए PreviewExtenderImpl.getProcessorType लागू करें:

  • PROCESSOR_TYPE_NONE : कोई प्रोसेसर नहीं। छवियाँ कैमरे HAL में संसाधित की जाती हैं।

  • PROCESSOR_TYPE_REQUEST_UPDATE_ONLY : प्रोसेसर प्रकार आपको नवीनतम TotalCaptureResult के आधार पर नए कैप्चर अनुरोध पैरामीटर के साथ दोहराए जाने वाले अनुरोध को अपडेट करने देता है।

    PreviewExtenderImpl.getProcessor एक RequestUpdateProcessorImpl इंस्टेंस लौटाना होगा जो TotalCaptureResult इंस्टेंस को प्रोसेस करता है और दोहराए जाने वाले अनुरोध को अपडेट करने के लिए एक CaptureStageImpl इंस्टेंस लौटाता है। PreviewExtenderImpl.getCaptureStage() प्रसंस्करण के परिणाम को भी प्रतिबिंबित करना चाहिए और नवीनतम CaptureStageImpl वापस करना चाहिए।

  • PROCESSOR_TYPE_IMAGE_PROCESSOR : यह प्रकार आपको YUV_420_888 छवियों को संसाधित करने और आउटपुट को एक PRIVATE सतह पर लिखने के लिए एक प्रोसेसर लागू करने की अनुमति देता है।

    आपको PreviewExtenderImpl.getProcessor में एक PreviewImageProcessorImpl उदाहरण लागू करने और वापस करने की आवश्यकता है। प्रोसेसर YUV_420_888 इनपुट छवियों को संसाधित करने के लिए जिम्मेदार है। इसे आउटपुट को पूर्वावलोकन के PRIVATE प्रारूप में लिखना चाहिए। पूर्वावलोकन के लिए CameraCaptureSession कॉन्फ़िगर करने के लिए कैमरा2/एक्स PRIVATE के बजाय YUV_420_888 सतह का उपयोग करता है।

    प्रवाह के लिए निम्नलिखित चित्रण देखें:

पूर्वावलोकनप्रोसेसर

चित्र 6. PreviewImageProcessorImpl के साथ पूर्वावलोकन प्रवाह

PreviewImageProcessorImpl इंटरफ़ेस, ProcessImpl विस्तार करता है और इसमें तीन महत्वपूर्ण विधियाँ हैं:

  • onOutputSurface(Surface surface, int imageFormat) प्रोसेसर के लिए आउटपुट सतह सेट करता है। PreviewImageProcessorImpl के लिए, imageFormat एक पिक्सेल प्रारूप है जैसे कि PixelFormat.RGBA_8888

  • onResolutionUpdate(Size size) इनपुट छवि का आकार निर्धारित करता है।

  • onImageFormatUpdate(int imageFormat) इनपुट छवि का छवि प्रारूप सेट करता है। वर्तमान में, यह केवल YUV_420_888 हो सकता है।

छवि कैप्चर प्रोसेसर

स्टिल कैप्चर के लिए, आप ImageCaptureExtenderImpl.getCaptureProcessor का उपयोग करके CaptureProcessorImpl उदाहरण लौटाकर एक प्रोसेसर लागू कर सकते हैं। प्रोसेसर कैप्चर की गई YUV_420_888 छवियों और TotalCaptureResult इंस्टेंसेस की सूची को संसाधित करने और आउटपुट को YUV_420_888 सतह पर लिखने के लिए जिम्मेदार है।

आप सुरक्षित रूप से मान सकते हैं कि स्टिल कैप्चर अनुरोध भेजने से पहले पूर्वावलोकन सक्षम है और चल रहा है।

नीचे दिए गए चित्र में प्रवाह देखें:

कैप्चरप्रोसेसर

चित्र 7. CaptureProcessorImpl के साथ अभी भी प्रवाह कैप्चर करें

  1. कैप्चर सत्र को कॉन्फ़िगर करने के लिए कैमरा2/X स्थिर कैप्चर के लिए YUV_420_888 प्रारूप सतह का उपयोग करता है। कैमरा2/एक्स कॉल करके CaptureProcessorImpl तैयार करता है:

    • CaptureProcessorImpl.onImageFormatUpdate() YUV_420_888 के साथ।
    • CaptureProcessorImpl.onResolutionUpdate() इनपुट छवि आकार के साथ।
    • CaptureProcessorImpl.onOutputSurface() आउटपुट YUV_420_888 सतह के साथ।
  2. ImageCaptureExtenderImpl.getCaptureStages CaptureStageImpl की एक सूची लौटाता है, जहां प्रत्येक तत्व कैमरा2/X द्वारा भेजे गए कैप्चर पैरामीटर के साथ CaptureRequest इंस्टेंस पर मैप होता है। उदाहरण के लिए, यदि यह तीन CaptureStageImpl उदाहरणों की सूची लौटाता है, तो कैमरा2/X captureBurst एपीआई का उपयोग करके संबंधित कैप्चर पैरामीटर के साथ तीन कैप्चर अनुरोध भेजता है।

  3. प्राप्त छवियों और TotalCaptureResult उदाहरणों को एक साथ बंडल किया जाता है और प्रसंस्करण के लिए CaptureProcessorImpl पर भेजा जाता है।

  4. CaptureProcessorImpl परिणाम छवि ( YUV_420_888 प्रारूप) को onOutputSurface() कॉल द्वारा निर्दिष्ट आउटपुट सतह पर लिखता है। यदि आवश्यक हो तो कैमरा2/एक्स इसे जेपीईजी छवियों में परिवर्तित करता है।

समर्थन कैप्चर अनुरोध कुंजियाँ और परिणाम

कैमरा पूर्वावलोकन और कैप्चर के अलावा, ऐप्स ज़ूम, फ़्लैश पैरामीटर सेट कर सकते हैं या टैप-टू-फ़ोकस ट्रिगर कर सकते हैं। ये पैरामीटर आपके एक्सटेंशन कार्यान्वयन के साथ संगत नहीं हो सकते हैं।

आपके कार्यान्वयन द्वारा समर्थित पैरामीटरों को उजागर करने की अनुमति देने के लिए extensions-interface 1.3.0 में निम्नलिखित विधियाँ जोड़ी गई हैं:

  • ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys() आपके कार्यान्वयन द्वारा समर्थित कैप्चर अनुरोध कुंजी लौटाता है।
  • ImageCaptureExtenderImpl.getAvailableCaptureResultKeys() कैप्चर परिणाम कुंजियाँ लौटाता है जो कैप्चर परिणाम में शामिल हैं।

यदि कैमरा HAL एक्सटेंशन को संसाधित करता है, तो कैमरा2/X CameraCaptureSession.CaptureCallback में कैप्चर परिणाम पुनः प्राप्त करता है। हालाँकि, यदि प्रोसेसर कार्यान्वित किया जाता है, तो कैमरा2/X कैप्चर परिणाम को ProcessResultImpl में पुनः प्राप्त करता है, जिसे PreviewImageProcessorImpl और CaptureProcessorImpl में process() विधि में पास किया जाता है। आप ProcessResultImpl के माध्यम से कैमरा2/X पर कैप्चर परिणाम की रिपोर्ट करने के लिए जिम्मेदार हैं।

उदाहरण के तौर पर नीचे CaptureProcessorImpl इंटरफ़ेस की परिभाषा देखें। extensions-interface 1.3.0 या उच्चतर में, दूसरी process() कॉल लागू की जाती है:

Interface CaptureProcessorImpl extends ProcessorImpl {
    // invoked when extensions-interface version < 1.3.0
    void process(Map<Integer, Pair<Image, TotalCaptureResult>> results);
    // invoked when extensions-interface version >= 1.3.0
    void process(Map<Integer, Pair<Image, TotalCaptureResult>> results,
            ProcessResultImpl resultCallback, Executor executor);
}

ज़ूम, टैप-टू-फ़ोकस, फ़्लैश और एक्सपोज़र कंपंसेशन जैसे सामान्य कैमरा संचालन के लिए, हम कैप्चर अनुरोध और कैप्चर परिणाम दोनों के लिए निम्नलिखित कुंजियों का समर्थन करने की सलाह देते हैं:

  • ज़ूम करें:
    • CaptureRequest#CONTROL_ZOOM_RATIO
    • CaptureRequest#SCALER_CROP_REGION
  • टैप-टू-फोकस:
    • CaptureRequest#CONTROL_AF_MODE
    • CaptureRequest#CONTROL_AF_TRIGGER
    • CaptureRequest#CONTROL_AF_REGIONS
    • CaptureRequest#CONTROL_AE_REGIONS
    • CaptureRequest#CONTROL_AWB_REGIONS
  • चमक:
    • CaptureRequest#CONTROL_AE_MODE
    • CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER
    • CaptureRequest#FLASH_MODE
  • जोख़िम प्रतिपूर्ति:
    • CaptureRequest#CONTROL_AE_EXPOSURE_COMPENSATION

1.2.0 या पूर्व संस्करणों को लागू करने वाले बेसिक एक्सटेंडरों के लिए, कैमराएक्स एक्सटेंशन एपीआई स्पष्ट रूप से उपरोक्त सभी कुंजियों का समर्थन करता है। extensions-interface 1.3.0 के लिए, कैमराएक्स और कैमरा2 दोनों लौटाई गई सूची का सम्मान करते हैं और केवल इसमें मौजूद कुंजियों का समर्थन करते हैं। उदाहरण के लिए, यदि आप 1.3.0 कार्यान्वयन में केवल CaptureRequest#CONTROL_ZOOM_RATIO और CaptureRequest#SCALER_CROP_REGION लौटाने का निर्णय लेते हैं, तो इसका मतलब है कि ऐप के लिए केवल ज़ूम समर्थित है जबकि टैप-टू-फोकस, फ्लैश और एक्सपोज़र मुआवजे की अनुमति नहीं है।

उन्नत विस्तारक

एडवांस्ड एक्सटेंडर कैमरा2 एपीआई पर आधारित एक प्रकार का विक्रेता कार्यान्वयन है। यह एक्सटेंडर प्रकार extensions-interface 1.2.0 में जोड़ा गया था। डिवाइस निर्माता के आधार पर, एक्सटेंशन को ऐप लेयर में लागू किया जा सकता है, जो निम्नलिखित कारकों पर निर्भर करता है:

  • कस्टम स्ट्रीम कॉन्फ़िगरेशन: RAW स्ट्रीम जैसी कस्टम स्ट्रीम कॉन्फ़िगर करें या विभिन्न भौतिक कैमरा आईडी के लिए एकाधिक स्ट्रीम रखें।

  • कैमरा2 अनुरोध भेजने की क्षमता: एक जटिल इंटरैक्शन लॉजिक का समर्थन करें जो पिछले अनुरोधों के परिणामों के आधार पर पैरामीटर के साथ कैप्चर अनुरोध भेज सकता है।

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

कार्यान्वयन हेतु फ़ाइलें

उन्नत एक्सटेंडर कार्यान्वयन पर स्विच करने के लिए, ExtensionVersionImpl में isAdvancedExtenderImplemented() विधि को true वापस आना होगा। प्रत्येक एक्सटेंशन प्रकार के लिए, ओईएम को संबंधित एक्सटेंडर कक्षाएं लागू करनी होंगी। उन्नत विस्तारक कार्यान्वयन फ़ाइलें उन्नत पैकेज में हैं।

लागू करने के लिए विस्तारक वर्ग
रात advanced/NightAdvancedExtenderImpl.java
एचडीआर advanced/HdrAdvancedExtenderImpl.java
ऑटो advanced/AutoAdvancedExtenderImpl.java
bokeh advanced/BokehAdvancedExtenderImpl.java
फेस रीटच advanced/BeautyAdvancedExtenderImpl.java

हम निम्नलिखित उदाहरण में एक प्लेसहोल्डर के रूप में AdvancedExtenderImpl उपयोग करते हैं। आप जिस एक्सटेंशन को कार्यान्वित कर रहे हैं उसके लिए इसे एक्सटेंडर फ़ाइल के नाम से बदलें।

आइए देखें कि कैमरा2/एक्स तीन ऐप प्रवाह को प्राप्त करने के लिए extensions-interface कैसे आमंत्रित करता है।

ऐप प्रवाह 1: एक्सटेंशन की उपलब्धता जांचें

AdvancedAppFlow1

चित्र 8. उन्नत विस्तारक पर ऐप प्रवाह 1

सबसे पहले, ऐप जाँचता है कि दिया गया एक्सटेंशन समर्थित है या नहीं।

ऐप प्रवाह 2: जानकारी क्वेरी करें

AdvancedAppFlow2

चित्र 9. उन्नत विस्तारक पर ऐप प्रवाह 2

AdvancedExtenderImpl.init() कॉल करने के बाद, ऐप AdvancedExtenderImpl पर निम्नलिखित जानकारी पूछ सकता है:

  • अनुमानित अभी भी कैप्चर विलंबता: AdvancedExtenderImpl.getEstimatedCaptureLatencyRange() ऐप के मूल्यांकन के लिए कैप्चर विलंबता की सीमा लौटाता है कि क्या यह वर्तमान परिदृश्य के लिए एक्सटेंशन को सक्षम करने के लिए उपयुक्त है।

  • पूर्वावलोकन और स्टिल कैप्चर के लिए समर्थित रिज़ॉल्यूशन:

    • AdvancedExtenderImpl.getSupportedPreviewOutputResolutions() आकार सूची में छवि प्रारूप का एक मानचित्र लौटाता है जो पूर्वावलोकन सतह प्रारूप और आकार के लिए समर्थित है। ओईएम को कम से कम PRIVATE प्रारूप का समर्थन करना चाहिए।

    • AdvancedExtenderImpl.getSupportedCaptureOutputResolutions() स्थिर कैप्चर सतह के लिए समर्थित प्रारूप और आकार लौटाता है। OEM को JPEG और YUV_420_888 प्रारूप आउटपुट दोनों का समर्थन करना चाहिए।

    • AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions() छवि विश्लेषण के लिए अतिरिक्त YUV_420_888 स्ट्रीम के लिए समर्थित आकार लौटाता है। यदि छवि विश्लेषण YUV सतह समर्थित नहीं है, getSupportedYuvAnalysisResolutions() null या खाली सूची लौटानी चाहिए।

  • उपलब्ध कैप्चर अनुरोध कुंजी/परिणाम ( extensions-interface 1.3.0 में जोड़ा गया): कैमरा2/एक्स आपके कार्यान्वयन से समर्थित कैप्चर अनुरोध कुंजी और परिणाम कुंजी को पुनः प्राप्त करने के लिए निम्नलिखित विधियों को लागू करता है:

    • AdvancedExtenderImpl.getAvailableCaptureRequestKeys
    • AdvancedExtenderImpl.getAvailableCaptureResultKeys

अधिक जानकारी के लिए, समर्थन कैप्चर अनुरोध कुंजी और परिणाम देखें।

ऐप प्रवाह 3: एक्सटेंशन सक्षम होने पर पूर्वावलोकन/अभी भी कैप्चर करें

AdvancedAppFlow3

चित्र 10. उन्नत विस्तारक पर ऐप प्रवाह 3

उपरोक्त आरेख उन्नत एक्सटेंडर प्रकार के लिए पूर्वावलोकन शुरू करने और फिर भी कैप्चर करने के लिए मुख्य प्रवाह दिखाता है। आइए प्रत्येक चरण पर चलें।

  1. SessionProcessorImpl उदाहरण

    मुख्य उन्नत एक्सटेंडर कार्यान्वयन SessionProcessorImpl में है, जो अनुकूलित सत्र कॉन्फ़िगरेशन प्रदान करने और पूर्वावलोकन शुरू करने और फिर भी कैप्चर अनुरोध भेजने के लिए कैप्चर अनुरोध भेजने के लिए जिम्मेदार है। AdvancedExtenderImpl.createSessionProcessor() को SessionProcessorImpl इंस्टेंस को वापस करने के लिए लागू किया जाता है।

  2. initSession

    SessionProcessorImpl.initSession() एक्सटेंशन के लिए सत्र प्रारंभ करता है। यह वह जगह है जहां आप संसाधन आवंटित करते हैं और CameraCaptureSession तैयार करने के लिए एक सत्र कॉन्फ़िगरेशन लौटाते हैं।

    इनपुट मापदंडों के लिए, कैमरा2/एक्स पूर्वावलोकन, स्टिल कैप्चर और एक वैकल्पिक YUV छवि विश्लेषण के लिए आउटपुट सतह कॉन्फ़िगरेशन निर्दिष्ट करता है। इस आउटपुट सतह कॉन्फ़िगरेशन ( OutputSurfaceImpl ) में सतह, आकार और छवि प्रारूप शामिल हैं जिन्हें AdvancedExtenderImpl में निम्नलिखित विधियों द्वारा पुनर्प्राप्त किया जाता है:

    • getSupportedPreviewOutputResolutions()
    • getSupportedCaptureOutputResolutions()
    • getSupportedYuvAnalysisResolutions()

    आपको एक Camera2SessionConfigImpl इंस्टेंस वापस करना होगा, जिसमें Camera2OutputConfigImpl इंस्टेंसेस की एक सूची और CameraCaptureSession कॉन्फ़िगर करने के लिए उपयोग किए जाने वाले सत्र पैरामीटर शामिल हैं। आप कैमरा2/एक्स द्वारा पारित आउटपुट सतहों पर सही कैमरा छवियों को आउटपुट करने के लिए जिम्मेदार हैं। आउटपुट को सक्षम करने के लिए यहां कुछ विकल्प दिए गए हैं:

    • कैमरा एचएएल में प्रसंस्करण: आप SurfaceOutputConfigImpl कार्यान्वयन के साथ आउटपुट सतहों को सीधे CameraCaptureSession में जोड़ सकते हैं। यह आपूर्ति की गई आउटपुट सतह को कैमरा पाइपलाइन में कॉन्फ़िगर करता है और कैमरा एचएएल को छवि को संसाधित करने की अनुमति देता है।
    • मध्यवर्ती ImageReader सतह (RAW, YUV, आदि) को संसाधित करना: ImageReaderOutputConfigImpl उदाहरण के साथ CameraCaptureSession में मध्यवर्ती ImageReader सतहों को जोड़ें।

      आपको मध्यवर्ती छवियों को संसाधित करने और परिणाम छवि को आउटपुट सतह पर लिखने की आवश्यकता है।

    • कैमरा2 सतह साझाकरण का उपयोग करें: किसी अन्य Camera2OutputConfigImpl उदाहरण की getSurfaceSharingOutputConfigs() विधि में कोई भी कैमरा Camera2OutputConfigImpl इंस्टेंस जोड़कर दूसरी सतह के साथ सतह साझाकरण का उपयोग करें। सतह का प्रारूप और आकार समान होना चाहिए।

    SurfaceOutputConfigImpl और ImageReaderOutputConfigImpl सहित सभी Camera2OutputConfigImpl OutputConfigImpl में एक अद्वितीय आईडी ( getId() ) होनी चाहिए, जिसका उपयोग लक्ष्य सतह को निर्दिष्ट करने और ImageReaderOutputConfigImpl से छवि पुनर्प्राप्त करने के लिए किया जाता है।

  3. onCaptureSessionStart और RequestProcessorImpl

    जब CameraCaptureSession शुरू होता है और कैमरा फ्रेमवर्क onConfigured() को आमंत्रित करता है, तो कैमरा2/एक्स कैमरा2 अनुरोध रैपर RequestProcessImpl के साथ SessionProcessorImpl.onCaptureSessionStart() आमंत्रित करता है। कैमरा2/एक्स RequestProcessImpl लागू करता है, जो आपको कैप्चर अनुरोधों को निष्पादित करने और ImageReaderOutputConfigImpl का उपयोग करने पर छवियों को पुनर्प्राप्त करने में सक्षम बनाता है।

    अनुरोधों को निष्पादित करने के मामले में RequestProcessImpl एपीआई कैमरा2 CameraCaptureSession एपीआई के समान हैं। अंतर हैं:

    • लक्ष्य सतह को Camera2OutputConfigImpl इंस्टेंस की आईडी द्वारा निर्दिष्ट किया गया है।
    • ImageReader की छवि को पुनः प्राप्त करने की क्षमता।

    आप छवियां प्राप्त करने के लिए ImageProcessorImpl इंस्टेंस को पंजीकृत करने के लिए एक निर्दिष्ट Camera2OutputConfigImpl आईडी के साथ RequestProcessorImpl.setImageProcessor() को कॉल कर सकते हैं।

    कैमरा2/X SessionProcessorImpl.onCaptureSessionEnd() कॉल करने के बाद RequestProcessImpl इंस्टेंस अमान्य हो जाता है।

  4. पूर्वावलोकन प्रारंभ करें और एक चित्र लें

    उन्नत एक्सटेंडर कार्यान्वयन में, आप RequestProcessorImpl इंटरफ़ेस के माध्यम से कैप्चर अनुरोध भेज सकते हैं। कैमरा2/एक्स आपको क्रमशः SessionProcessorImpl#startRepeating और SessionProcessorImpl#startCapture कॉल करके पूर्वावलोकन या स्टिल कैप्चर अनुक्रम के लिए दोहराए जाने वाले अनुरोध को शुरू करने के लिए सूचित करता है। आपको इन पूर्वावलोकन और स्टिल-कैप्चर अनुरोधों को संतुष्ट करने के लिए कैप्चर अनुरोध भेजना चाहिए।

    कैमरा2/X SessionProcessorImpl#setParameters के माध्यम से कैप्चर अनुरोध पैरामीटर भी सेट करता है। आपको इन अनुरोध मापदंडों को दोहराए जाने वाले और एकल अनुरोधों दोनों पर सेट करना होगा (यदि पैरामीटर समर्थित हैं)।

    आपको कम से कम CaptureRequest.JPEG_ORIENTATION और CaptureRequest.JPEG_QUALITY का समर्थन करना होगा। extensions-interface 1.3.0 अनुरोध और परिणाम कुंजियों का समर्थन करता है, जिन्हें निम्नलिखित विधियों द्वारा उजागर किया जाता है:

    • AdvancedExtenderImpl.getAvailableCaptureRequestKeys()
    • AdvancedExtenderImpl.getAvailableCaptureResultKeys()

    जब डेवलपर्स getAvailableCaptureRequestKeys सूची में कुंजियाँ सेट करते हैं, तो आपको मापदंडों को सक्षम करना होगा और सुनिश्चित करना होगा कि कैप्चर परिणाम में getAvailableCaptureResultKeys सूची में कुंजियाँ शामिल हैं।

  5. startTrigger

    CaptureRequest.CONTROL_AF_TRIGGER और CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER जैसे ट्रिगर शुरू करने के लिए SessionProcessorImpl.startTrigger() को लागू किया जाता है। आप किसी भी कैप्चर अनुरोध कुंजियों को अनदेखा कर सकते हैं जिनका AdvancedExtenderImpl.getAvailableCaptureRequestKeys() में विज्ञापन नहीं किया गया था।

    extensions-interface 1.3.0 के बाद से startTrigger() समर्थन किया गया है। यह ऐप्स को एक्सटेंशन के साथ टैप-टू-फोकस और फ्लैश लागू करने में सक्षम बनाता है।

  6. साफ - सफाई

    कैप्चर सत्र समाप्त करते समय, CameraCaptureSession बंद करने से पहले SessionProcessorImpl.onCaptureSessionEnd() को लागू किया जाता है। कैप्चर सत्र बंद होने के बाद, deInitSession() सफ़ाई करता है।

पूर्वावलोकन, स्टिल कैप्चर और छवि विश्लेषण का समर्थन करें

आपको पूर्वावलोकन और स्टिल कैप्चर उपयोग के मामलों दोनों के लिए एक्सटेंशन लागू करना चाहिए। हालाँकि, यदि पूर्वावलोकन को आसानी से दिखाने के लिए विलंबता बहुत अधिक है, तो आप केवल स्टिल कैप्चर के लिए एक्सटेंशन लागू कर सकते हैं।

बेसिक एक्सटेंडर प्रकार के लिए, पूर्वावलोकन के लिए एक्सटेंशन को सक्षम करने के बावजूद, आपको किसी दिए गए एक्सटेंशन के लिए ImageCaptureExtenderImpl और PreviewExtenderImpl दोनों को लागू करना होगा। अक्सर, कोई ऐप छवि सामग्री का विश्लेषण करने जैसे क्यूआर कोड या टेक्स्ट ढूंढने के लिए YUV स्ट्रीम का भी उपयोग करता है। इस उपयोग के मामले में बेहतर समर्थन करने के लिए, आपको CameraCaptureSession कॉन्फ़िगर करने के लिए पूर्वावलोकन, अभी भी कैप्चर, और एक YUV_420_888 स्ट्रीम के स्ट्रीम संयोजन का समर्थन करना चाहिए। इसका मतलब है कि यदि आप एक प्रोसेसर को लागू करते हैं, तो आपको तीन YUV_420_888 स्ट्रीम के स्ट्रीम संयोजन का समर्थन करना होगा।

उन्नत एक्सटेंडर के लिए, Camera2/X SessionProcessorImpl.initSession() कॉल के लिए तीन आउटपुट सतहों को पास करता है। ये आउटपुट सतह क्रमशः पूर्वावलोकन, अभी भी कैप्चर और छवि विश्लेषण के लिए हैं। आपको यह सुनिश्चित करना चाहिए कि पूर्वावलोकन और अभी भी आउटपुट सतहों को कैप्चर करें वैध आउटपुट दिखाते हैं। हालांकि, छवि विश्लेषण आउटपुट सतह के लिए, यह सुनिश्चित करें कि यह केवल तब काम कर रहा है जब यह गैर-शून्य हो। यदि आपका कार्यान्वयन छवि विश्लेषण स्ट्रीम का समर्थन नहीं कर सकता है, तो आप AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions() में एक खाली सूची वापस कर सकते हैं। यह सुनिश्चित करता है कि छवि विश्लेषण आउटपुट सतह हमेशा SessionProcessorImpl.initSession() में शून्य है।

वीडियो कैप्चर का समर्थन करें

वर्तमान कैमरा एक्सटेंशन आर्किटेक्चर केवल पूर्वावलोकन का समर्थन करता है और अभी भी उपयोग के मामलों को कैप्चर करता है। हम वीडियो रिकॉर्ड करने के लिए MediaCodec या MediaRecorder सतहों पर एक्सटेंशन को सक्षम करने का समर्थन नहीं करते हैं। हालांकि, ऐप्स के लिए पूर्वावलोकन आउटपुट रिकॉर्ड करना संभव है।

MediaCodec और MediaRecorder सतहों का समर्थन करना जांच के दायरे में है।

एक्सटेंशन-विशिष्ट मेटाडेटा

Android 14 और उच्चतर के लिए, एक्सटेंशन-विशिष्ट मेटाडेटा कैमरा एक्सटेंशन क्लाइंट सेट करने और एक्सटेंशन विशिष्ट कैप्चर अनुरोध सेटिंग्स और परिणाम प्राप्त करने देता है। विशेष रूप से, कैमरा एक्सटेंशन क्लाइंट एक्सटेंशन की ताकत और EXTENSION_CURRENT_TYPE कैप्चर परिणाम को नियंत्रित करने के लिए EXTENSION_STRENGTH कैप्चर अनुरोध पैरामीटर का उपयोग कर सकते हैं ताकि सक्षम एक्सटेंशन प्रकार को इंगित किया जा सके।

अनुरोधों को कैप्चर करें

EXTENSION_STRENGTH कैप्चर अनुरोध पैरामीटर एक्सटेंशन पोस्ट-प्रोसेसिंग प्रभाव की ताकत को नियंत्रित करता है। यदि यह पैरामीटर क्लाइंट द्वारा स्पष्ट रूप से सेट नहीं किया गया है, तो इसी कैप्चर परिणाम में डिफ़ॉल्ट शक्ति मान शामिल है। इस पैरामीटर को इन एक्सटेंशन प्रकारों के लिए निम्नानुसार लागू किया जा सकता है:

  • BOKEH : धब्बा की मात्रा को नियंत्रित करता है।
  • HDR और NIGHT : फ्यूज्ड छवियों की मात्रा और अंतिम छवि की चमक को नियंत्रित करता है।
  • FACE_RETOUCH : कॉस्मेटिक एन्हांसमेंट और स्किन स्मूथिंग की मात्रा को नियंत्रित करता है।

EXTENSION_STRENGTH पैरामीटर के लिए समर्थित रेंज 0 और 100 के बीच है, 0 कोई एक्सटेंशन प्रोसेसिंग या सिंपल पेस्ट्रू और 100 प्रोसेसिंग इफेक्ट की अधिकतम एक्सटेंशन स्ट्रेंथ को इंगित करता है।

EXTENSION_STRENGTH के लिए समर्थन जोड़ने के लिए, एक्सटेंशन लाइब्रेरी इंटरफ़ेस के संस्करण 1.3.0 में शुरू किए गए विक्रेता विशिष्ट पैरामीटर एपीआई का उपयोग करें। अधिक जानकारी के लिए, getAvailableCaptureRequestKeys() देखें।

परिणाम कैप्चर करें

EXTENSION_CURRENT_TYPE कैप्चर परिणाम एक्सटेंशन कार्यान्वयन को सक्रिय एक्सटेंशन प्रकार के बारे में ग्राहकों को सूचित करने देता है।

क्योंकि AUTO टाइप का उपयोग करने वाले एक्सटेंशन डायनामिक रूप से एक्सटेंशन प्रकार जैसे कि HDR और NIGHT बीच दृश्य स्थितियों के आधार पर स्विच करते हैं, कैमरा एक्सटेंशन ऐप्स AUTO एक्सटेंशन द्वारा चयनित वर्तमान एक्सटेंशन के बारे में जानकारी प्रदर्शित करने के लिए EXTENSION_CURRENT_TYPE उपयोग कर सकते हैं।

वास्तविक समय अभी भी विलंबता अनुमान को कैप्चर करता है

Android 14 और उच्चतर के लिए, कैमरा एक्सटेंशन क्लाइंट वास्तविक समय को क्वेरी कर सकते हैं, अभी भी getRealtimeStillCaptureLatency() का उपयोग करके दृश्य और पर्यावरण की स्थिति के आधार पर विलंबता अनुमानों को कैप्चर कर सकते हैं। यह विधि स्थैतिक getEstimatedCaptureLatencyRangeMillis() विधि की तुलना में अधिक सटीक अनुमान प्रदान करती है। विलंबता अनुमान के आधार पर, ऐप्स एक्सटेंशन प्रोसेसिंग को छोड़ने या लंबे समय तक चलने वाले ऑपरेशन के बारे में उपयोगकर्ताओं को सूचित करने के लिए एक संकेत प्रदर्शित करने का निर्णय ले सकते हैं।

CameraExtensionSession.StillCaptureLatency latency;

latency = extensionSession.getRealtimeStillCaptureLatency();

// The capture latency from ExtensionCaptureCallback#onCaptureStarted() until ExtensionCaptureCallback#onCaptureProcessStarted().

latency.getCaptureLatency();

// The processing latency from  ExtensionCaptureCallback#onCaptureProcessStarted() until  the processed frame returns to the client.

latency.getProcessingLatency();

वास्तविक समय का समर्थन करने के लिए अभी भी विलंबता अनुमानों को पकड़ने के लिए, निम्नलिखित को लागू करें:

प्रसंस्करण प्रगति कॉलबैक कैप्चर करें

Android 14 और उच्चतर के लिए, कैमरा एक्सटेंशन क्लाइंट लंबे समय तक चलने वाली अभी भी कैप्चर प्रोसेसिंग ऑपरेशन की प्रगति के लिए कॉलबैक प्राप्त कर सकते हैं। Apps समग्र उपयोगकर्ता अनुभव को बेहतर बनाने के लिए उपयोगकर्ताओं को वर्तमान प्रगति प्रदर्शित कर सकते हैं।

इस सुविधा को एकीकृत करने के लिए ऐप्स निम्न कोड का उपयोग कर सकते हैं:

import android.hardware.camera2.CameraExtensionSession.
ExtensionCaptureCallback;

{
…
  class AppCallbackImpl extends ExtensionCaptureCallback {
…
    @Override
    public void onCaptureProcessProgressed(
      @NonNull CameraExtensionSession session,
      @NonNull CaptureRequest request,
      @IntRange(from = 0, to = 100) int progress) {
      // Update app UI with current progress
    }
  }
…
}

कैप्चर प्रोसेसिंग प्रगति कॉलबैक का समर्थन करने के लिए, आपके एक्सटेंशन विक्रेता कार्यान्वयन को वर्तमान प्रगति मूल्य के साथ निम्नलिखित कॉलबैक को कॉल करना होगा:

पोस्टव्यू अभी भी कैप्चर है

Android 14 और उच्चतर के लिए, कैमरा एक्सटेंशन setPostviewOutputConfiguration का उपयोग करके एक पोस्टव्यू (पूर्वावलोकन छवि) की आपूर्ति कर सकता है। उपयोगकर्ता अनुभव को बेहतर बनाने के लिए, एप्स एक पोस्टव्यू छवि को एक प्लेसहोल्डर के रूप में प्रदर्शित कर सकते हैं जब एक एक्सटेंशन बढ़ा हुआ प्रसंस्करण विलंबता का अनुभव कर रहा है, और अंतिम छवि उपलब्ध होने पर छवि को बदलें। एप्लिकेशन निम्नलिखित संदर्भ कोड का उपयोग करके पोस्टव्यू कैप्चर अनुरोधों को कॉन्फ़िगर और जारी कर सकते हैं:

{
…
if (!CameraExtensionCharacteristics.isPostviewAvailable()) {
    continue;
}
…
ExtensionSessionConfiguration extensionConfiguration = new
        ExtensionSessionConfiguration(
                CameraExtensionCharacteristics.EXTENSION_NIGHT,
                outputConfig,
                backgroundExecutor,
                extensionSessionStateCallback
    );

extensionConfiguration.setPostviewOutputConfiguration(
    postviewImageOutput);
…
CaptureRequest.Builder captureRequestBuilder =
    cameraDevice.createCaptureRequest(
        CameraDevice.TEMPLATE_STILL_CAPTURE);
captureRequestBuilder.addTarget(stillImageReader.getSurface());
captureRequestBuilder.addTarget(postviewImageSurface);

CaptureRequest captureRequest = captureRequestBuilder.build();
…
}

पोस्टव्यू का समर्थन करने के लिए अभी भी कब्जा कर लिया गया है, आपके विक्रेता कार्यान्वयन को निम्नलिखित लागू करना होगा:

सरफेस व्यू आउटपुट का समर्थन करें

Android 14 और उच्चतर के लिए, कैमरा एक्सटेंशन क्लाइंट पावर और प्रदर्शन अनुकूलित पूर्वावलोकन रेंडर पथों का उपयोग कर सकते हैं, अनुरोधों को दोहराने के लिए पूर्वावलोकन आउटपुट के लिए एक SurfaceView उदाहरण दर्ज करके।

SurfaceView आउटपुट का समर्थन करने के लिए, आपके विक्रेता एक्सटेंशन कार्यान्वयन को SurfaceView इंस्टेंस के लिए पूर्वावलोकन को स्ट्रीमिंग और आउटपुट करने में सक्षम होना चाहिए। यह सत्यापित करने के लिए कि यह समर्थित है, SurfaceViewExtensionPreviewTest.java CTS मॉड्यूल को चलाएं।

विक्रेता विशिष्ट सत्र प्रकार

यह सुविधा विक्रेता एक्सटेंशन कार्यान्वयन को एक विक्रेता विशिष्ट सत्र प्रकार का चयन करने में सक्षम बनाता है जो डिफ़ॉल्ट मान के बजाय आंतरिक कैमरा कैप्चर सत्र में सेट किया जाएगा।

यह सुविधा पूरी तरह से फ्रेमवर्क और विक्रेता स्टैक के भीतर काम करती है और इसमें कोई ग्राहक/सार्वजनिक दृश्यमान एपीआई प्रभाव नहीं है।

एक विक्रेता-विशिष्ट सत्र प्रकार का चयन करने के लिए, अपने एक्सटेंशन लाइब्रेरीज़ के लिए निम्नलिखित को लागू करें: * ExtenderStateListener.onSessionType() Camera2SessionConfigImpl.getSessionType() बेसिक एक्सटेंशन के लिए

एक्सटेंशन इंटरफ़ेस संस्करण इतिहास

निम्न तालिका कैमरा एक्सटेंशन इंटरफ़ेस संस्करण इतिहास दिखाती है। आपको हमेशा नवीनतम संस्करण के साथ विक्रेता पुस्तकालय को लागू करना चाहिए।

संस्करण सुविधाएँ जोड़ी गईं
1.0.0
  • संस्करण सत्यापन
    • ExtensionVersionImpl
  • बुनियादी विस्तारक
    • PreviewExtenderImpl
    • ImageCaptureExtenderImpl
    • Processor
      • PreviewImageProcessorImpl
      • CaptureProcessorImpl
      • RequestUpdateProcessorImpl
1.1.0
  • लाइब्रेरी इनिशियलाइज़ेशन
    • InitializerImpl
  • समर्थित संकल्पों को उजागर करें
    • PreviewExtenderImpl.getSupportedResolutions
    • ImageCaptureExtenderImpl.getSupportedResolutions
1.2.0
  • उन्नत पाठक
    • AdvancedExtenderImpl
    • SessionProcessorImpl
  • अनुमानित कैप्चर विलंबता प्राप्त करें
    • ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRange
1.3.0
  • समर्थित कैप्चर अनुरोध कुंजियों/परिणाम कुंजी को उजागर करें
    • ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys और getAvailableCaptureResultKeys
    • AdvancedExtenderImpl.getAvailableCaptureRequestKeys और getAvailableCaptureResultKeys
    • नई process() कॉल जो PreviewImageProcessorImpl और CaptureProcessorImpl में ProcessResultImpl लेती है
    • ट्रिगर प्रकार के अनुरोध का समर्थन करें
      • AdvancedExtenderImpl.startTrigger
1.4.0
  • एक्सटेंशन-विशिष्ट मेटाडेटा
  • गतिशील अभी भी विलंबता अनुमानों को कैप्चर करता है
  • प्रसंस्करण प्रगति कॉलबैक कैप्चर करें
  • पोस्टव्यू अभी भी कैप्चर है
  • SurfaceView आउटपुट के लिए समर्थन
  • विक्रेता विशिष्ट सत्र प्रकार

संदर्भ कार्यान्वयन

निम्नलिखित संदर्भ OEM विक्रेता पुस्तकालय कार्यान्वयन frameworks/ex में उपलब्ध हैं।

  • advancedSample : उन्नत एक्सटेंडर का एक बुनियादी कार्यान्वयन।

  • sample : बुनियादी एक्सटेंडर का एक बुनियादी कार्यान्वयन।

  • service_based_sample : एक कार्यान्वयन जो किसी Service में कैमरा एक्सटेंशन की मेजबानी करने के लिए प्रदर्शित करता है। इस कार्यान्वयन में निम्नलिखित घटक शामिल हैं:

    • oem_library : कैमरा 2 और कैमरैक्स एक्सटेंशन एपीआई के लिए एक कैमरा एक्सटेंशन OEM लाइब्रेरी जो Extensions-Interface लागू करता है। यह एक पकेथ के रूप में कार्य करता है जो आगे की ओर Extensions-Interface से सेवा तक कॉल करता है। यह लाइब्रेरी सेवा के साथ संवाद करने के लिए Aidl फ़ाइलें और आवरण कक्षाएं भी प्रदान करती है।

      उन्नत एक्सटेंडर डिफ़ॉल्ट रूप से सक्षम है। बेसिक एक्सटेंडर को सक्षम करने के लिए, ExtensionsVersionImpl#isAdvancedExtenderImplemented को false वापस करने के लिए।

    • extensions_service : एक्सटेंशन सेवा का एक नमूना कार्यान्वयन। यहां अपना कार्यान्वयन जोड़ें। सेवा में लागू करने के लिए इंटरफ़ेस Extensions-Interface के समान है। उदाहरण के लिए, IAdvancedExtenderImpl.Stub लागू करना AdvancedExtenderImpl के समान संचालन करता है। ImageWrapper और TotalCaptureResultWrapper Image और TotalCaptureResult Parcelable बनाने की आवश्यकता है।

एक डिवाइस पर वेंडर लाइब्रेरी सेट करें

OEM वेंडर लाइब्रेरी को एक ऐप में नहीं बनाया गया है; यह डिवाइस से रनटाइम पर कैमरा 2/x द्वारा लोड किया गया है। कैमरैक्स में, <uses-library> टैग यह घोषणा करता है कि androidx.camera.extensions.impl लाइब्रेरी, जिसे camera-extensions लाइब्रेरी की AndroidManifest.xml फ़ाइल में परिभाषित किया गया है, कैमरैक्स की निर्भरता है और इसे रनटाइम पर लोड किया जाना चाहिए। कैमरा 2 में, फ्रेमवर्क एक एक्सटेंशन सेवा को लोड करता है जो यह भी घोषणा करता है कि <uses-library> एक ही androidx.camera.extensions.impl लाइब्रेरी को रनटाइम पर लोड करता है।

यह ओईएम विक्रेता लाइब्रेरी को स्वचालित रूप से लोड करने के लिए एक्सटेंशन का उपयोग करके तृतीय-पक्ष ऐप्स की अनुमति देता है। OEM लाइब्रेरी को वैकल्पिक के रूप में चिह्नित किया गया है ताकि ऐप्स उन उपकरणों पर चल सकें जिनके पास डिवाइस पर लाइब्रेरी नहीं है। Camera2/X इस व्यवहार को स्वचालित रूप से संभालता है जब कोई ऐप कैमरा एक्सटेंशन का उपयोग करने की कोशिश करता है जब तक कि डिवाइस निर्माता डिवाइस पर OEM लाइब्रेरी रखता है ताकि इसे ऐप द्वारा खोजा जा सके।

डिवाइस पर OEM लाइब्रेरी सेट करने के लिए, निम्नलिखित करें:

  1. एक अनुमति फ़ाइल जोड़ें, जो निम्न प्रारूप का उपयोग करके <uses-library> टैग द्वारा आवश्यक है: /etc/permissions/ ANY_FILENAME .xml । उदाहरण के लिए, /etc/permissions/camera_extensions.xml । इस निर्देशिका की फाइलें डिवाइस पर वास्तविक फ़ाइल पथ के लिए <uses-library> में नामित लाइब्रेरी का एक मैपिंग प्रदान करती हैं।
  2. फ़ाइल में आवश्यक जानकारी जोड़ने के लिए नीचे दिए गए उदाहरण का उपयोग करें।

    • name androidx.camera.extensions.impl होना चाहिए क्योंकि यह वह पुस्तकालय है जिसे कैमरैक्स खोजता है।
    • file उस फ़ाइल का निरपेक्ष पथ है जिसमें एक्सटेंशन कार्यान्वयन (उदाहरण के लिए, /system/framework/androidx.camera.extensions.impl.jar androidx.camera.extensions.impl.jar) होता है।
    <?xml version="1.0" encoding="utf-8"?>
    <permissions>
        <library name="androidx.camera.extensions.impl"
                 file="OEM_IMPLEMENTED_JAR" />
    </permissions>
    

Android 12 या उससे अधिक में, कैमरैक्स एक्सटेंशन का समर्थन करने वाले उपकरणों में ro.camerax.extensions.enabled प्रॉपर्टी को true पर सेट किया जाना चाहिए, जो क्वेरी करने की अनुमति देता है कि क्या कोई डिवाइस एक्सटेंशन का समर्थन करता है। ऐसा करने के लिए, डिवाइस मेक फ़ाइल में निम्न पंक्ति जोड़ें:

PRODUCT_VENDOR_PROPERTIES += \
    ro.camerax.extensions.enabled=true \

मान्यकरण

विकास चरण के दौरान OEM विक्रेता लाइब्रेरी के अपने कार्यान्वयन का परीक्षण करने के लिए, androidx-main/camera/integration-tests/extensionstestapp/ पर उदाहरण ऐप का उपयोग करें, जो विभिन्न विक्रेता एक्सटेंशन के माध्यम से चलता है।

अपने कार्यान्वयन को पूरा करने के बाद, यह सत्यापित करने के लिए स्वचालित और मैनुअल परीक्षण चलाने के लिए कैमरा एक्सटेंशन सत्यापन टूल का उपयोग करें कि विक्रेता पुस्तकालय सही तरीके से लागू किया गया है।

विस्तारित दृश्य मोड बनाम कैमरा एक्सटेंशन

बोकेह एक्सटेंशन के लिए, कैमरा एक्सटेंशन का उपयोग करके इसे उजागर करने के अलावा, आप विस्तारित दृश्य मोड का उपयोग करके एक्सटेंशन को उजागर कर सकते हैं, जो कि CONTROL_EXTENDED_SCENE_MODE key के माध्यम से सक्षम है। अधिक कार्यान्वयन विवरण के लिए, कैमरा बोकेह देखें।

विस्तारित दृश्य मोड में कैमरा 2 ऐप के लिए कैमरा एक्सटेंशन की तुलना में कम प्रतिबंध हैं। उदाहरण के लिए, आप एक नियमित CameraCaptureSession इंस्टेंस में विस्तारित दृश्य मोड को सक्षम कर सकते हैं जो लचीले स्ट्रीम संयोजनों का समर्थन करता है और अनुरोध मापदंडों को कैप्चर करता है। इसके विपरीत, कैमरा एक्सटेंशन केवल स्ट्रीम प्रकारों के एक निश्चित सेट का समर्थन करते हैं और कैप्चर अनुरोध मापदंडों के लिए सीमित समर्थन रखते हैं।

विस्तारित दृश्य मोड का एक नकारात्मक पक्ष यह है कि आप इसे केवल कैमरा एचएएल में लागू कर सकते हैं, जिसका अर्थ है कि इसे ऐप डेवलपर्स के लिए उपलब्ध सभी ऑर्थोगोनल नियंत्रणों में काम करने के लिए सत्यापित किया जाना चाहिए।

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

अक्सर पूछे जाने वाले प्रश्न (एफएक्यू)

क्या एपीआई स्तरों पर कोई प्रतिबंध है?

हाँ। यह Android API फ़ीचर सेट पर निर्भर करता है जो OEM विक्रेता लाइब्रेरी कार्यान्वयन द्वारा आवश्यक है। उदाहरण के लिए, ExtenderStateListener.onPresetSession() SessionConfiguration.setSessionParameters() कॉल का एक बेसलाइन सेट सेट करने के लिए कॉल करें। यह कॉल केवल एपीआई स्तर 28 और उच्चतर पर उपलब्ध है। विशिष्ट इंटरफ़ेस विधियों के विवरण के लिए, एपीआई संदर्भ प्रलेखन देखें।