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

डिवाइस बनाने वाली कंपनियां, तीसरे पक्ष के डेवलपर को बोकेह, नाइट मोड, और एचडीआर जैसे एक्सटेंशन दिखा सकती हैं. इसके लिए, वे OEM वेंडर लाइब्रेरी से मिले कैमरा एक्सटेंशन इंटरफ़ेस का इस्तेमाल करती हैं. OEM वेंडर लाइब्रेरी में लागू किए गए एक्सटेंशन को ऐक्सेस करने के लिए, डेवलपर Camera2 एक्सटेंशन एपीआई और CameraX एक्सटेंशन एपीआई का इस्तेमाल कर सकते हैं.

काम करने वाले एक्सटेंशन की सूची देखने के लिए, CameraX एक्सटेंशन एपीआई देखें. यह सूची, Camera2 और CameraX, दोनों के लिए एक जैसी है. अगर आपको कोई एक्सटेंशन जोड़ना है, तो समस्या ट्रैकर की मदद से गड़बड़ी की शिकायत करें.

इस पेज पर, डिवाइसों पर OEM वेंडर लाइब्रेरी को लागू करने और चालू करने का तरीका बताया गया है.

भवन निर्माण

इस डायग्राम में, Camera Extensions इंटरफ़ेस या extensions-interface के आर्किटेक्चर के बारे में बताया गया है: भवन निर्माण

पहली इमेज. Camera Extensions के आर्किटेक्चर का डायग्राम

डायग्राम में दिखाए गए तरीके से, कैमरा एक्सटेंशन के साथ काम करने के लिए, आपको OEM वेंडर लाइब्रेरी से मिले extensions-interface को लागू करना होगा. आपकी OEM वेंडर लाइब्रेरी, दो एपीआई चालू करती है: CameraX एक्सटेंशन एपीआई और Camera2 एक्सटेंशन एपीआई. वेंडर एक्सटेंशन को ऐक्सेस करने के लिए, CameraX और Camera2 ऐप्लिकेशन इनका इस्तेमाल करते हैं.

OEM वेंडर लाइब्रेरी लागू करना

OEM वेंडर लाइब्रेरी को लागू करने के लिए, camera-extensions-stub फ़ाइलों को सिस्टम लाइब्रेरी प्रोजेक्ट में कॉपी करें. इन फ़ाइलों से, Camera Extensions के इंटरफ़ेस के बारे में पता चलता है.

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

आपको हर एक्सटेंशन के लिए, लागू करने का तरीका बताने की ज़रूरत नहीं है. अगर आपने कोई एक्सटेंशन लागू नहीं किया है, तो isExtensionAvailable() को false पर सेट करें या उससे जुड़ी एक्सटेंडर क्लास हटाएं. Camera2 और CameraX एक्सटेंशन के एपीआई, ऐप्लिकेशन को बताते हैं कि एक्सटेंशन उपलब्ध नहीं है.

आइए, यह जानें कि एक्सटेंशन चालू करने के लिए, Camera2 और CameraX एक्सटेंशन एपीआई, वेंडर लाइब्रेरी के साथ कैसे इंटरैक्ट करते हैं. यहां दिए गए डायग्राम में, उदाहरण के तौर पर Night एक्सटेंशन का इस्तेमाल करके, एंड-टू-एंड फ़्लो दिखाया गया है:

Mainflow

दूसरी इमेज. नाइट एक्सटेंशन को लागू करना

  1. वर्शन की पुष्टि करना:

    Camera2/X, ExtensionVersionImpl.checkApiVersion() को कॉल करता है, ताकि यह पक्का किया जा सके कि OEM के लागू किए गए extensions-interface वर्शन, Camera2/X के साथ काम करने वाले वर्शन के साथ काम करता हो.

  2. वेंडर लाइब्रेरी को शुरू करना:

    InitializerImpl में एक तरीका init() है, जो वेंडर लाइब्रेरी को शुरू करता है. Camera2/X, एक्सटेंडर क्लास को ऐक्सेस करने से पहले, इनिशलाइज़ेशन पूरा करता है.

  3. एक्सटेंडर क्लास को तुरंत लागू करना:

    एक्सटेंशन के लिए, एक्सटेंडर क्लास को इंस्टैंशिएट करता है. एक्सटेंडर दो तरह के होते हैं: बुनियादी एक्सटेंडर और बेहतर एक्सटेंडर. आपको सभी एक्सटेंशन के लिए, एक तरह का एक्सटेंडर लागू करना होगा. ज़्यादा जानकारी के लिए, बेसिक एक्सटेंडर बनाम ऐडवांस एक्सटेंडर लेख पढ़ें.

    Camera2/X, जानकारी हासिल करने और एक्सटेंशन चालू करने के लिए, एक्सटेंडर क्लास को इंस्टैंशिएट करता है और उनसे इंटरैक्ट करता है. किसी एक्सटेंशन के लिए, Camera2/X कई बार एक्सटेंडर क्लास को इंस्टैंशिएट कर सकता है. इसलिए, कंस्ट्रक्टर या init() कॉल में, ज़्यादा काम करने वाला इनिशलाइज़ेशन न करें. कैमरा सेशन शुरू होने पर ही, ज़्यादा काम करें. जैसे, जब बुनियादी एक्सटेंडर में onInit() या ऐडवांस एक्सटेंडर में initSession() को कॉल किया जाता है.

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

    • NightImageCaptureExtenderImpl.java
    • NightPreviewExtenderImpl.java

    और बेहतर एक्सटेंडर टाइप के लिए:

    • NightAdvancedExtenderImpl.java
  4. समयसीमा बढ़ाने की सुविधा उपलब्ध है या नहीं, यह देखना:

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

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

    Camera2/X, एक्सटेंडर इंस्टेंस पर init() को कॉल करता है और उसे कैमरा आईडी और CameraCharacteristics भेजता है.

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

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

  7. एक्सटेंडर पर एक्सटेंशन चालू करना:

    Extender क्लास, क्लास को चालू करने के लिए ज़रूरी सभी इंटरफ़ेस उपलब्ध कराती है. यह OEM के लागू होने को Camera2 पाइपलाइन में जोड़ने का तरीका उपलब्ध कराता है. जैसे, कैप्चर अनुरोध पैरामीटर को इंजेक्ट करना या पोस्ट प्रोसेसर को चालू करना.

    ऐडवांस एक्सटेंडर टाइप के लिए, Camera2/X, एक्सटेंशन चालू करने के लिए SessionProcessorImpl के साथ इंटरैक्ट करता है. Camera2/X, एक्सटेंडर पर createSessionProcessor() को कॉल करके SessionProcessorImpl इंस्टेंस को वापस लाता है.

इन सेक्शन में, एक्सटेंशन फ़्लो के बारे में ज़्यादा जानकारी दी गई है.

वर्शन की पुष्टि करना

रनटाइम के दौरान डिवाइस से OEM वेंडर लाइब्रेरी लोड करते समय, Camera2/X यह पुष्टि करता है कि लाइब्रेरी, extensions-interface वर्शन के साथ काम करती है या नहीं. extensions-interface, सिमेंटिक वर्शनिंग या MAJOR.MINOR.PATCH का इस्तेमाल करता है. उदाहरण के लिए, 1.1.0 या 1.2.0. हालांकि, वर्शन की पुष्टि के दौरान सिर्फ़ मुख्य और मामूली वर्शन का इस्तेमाल किया जाता है.

वर्शन की पुष्टि करने के लिए, Camera2/X, काम करने वाले extensions-interface वर्शन के साथ ExtensionVersionImpl.checkApiVersion() को कॉल करता है. इसके बाद, Camera2/X, OEM लाइब्रेरी के बताए गए वर्शन का इस्तेमाल करके यह तय करता है कि एक्सटेंशन को चालू किया जा सकता है या नहीं. साथ ही, यह भी तय करता है कि उसे कौनसी सुविधाएं चालू करनी चाहिए.

मेजर वर्शन के साथ काम करना

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

पुराने सिस्टम के साथ काम करने की सुविधा

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

नए सिस्टम के साथ काम करने की सुविधा

नए extensions-interface के वेंडर लाइब्रेरी के साथ फ़ॉरवर्ड कम्पैटिबिलिटी, OEM के तौर पर आप पर निर्भर करती है. अगर आपको एक्सटेंशन लागू करने के लिए कुछ सुविधाओं की ज़रूरत है, तो हो सकता है कि आप किसी खास वर्शन से एक्सटेंशन चालू करना चाहें. इस मामले में, Camera2/X लाइब्रेरी का वर्शन ज़रूरी शर्तें पूरी करने पर, काम करने वाला extensions-interface वर्शन दिखाया जा सकता है. अगर Camera2/X वर्शन काम नहीं करते हैं, तो एक्सटेंशन बंद करने के लिए, काम न करने वाले वर्शन को वापस लाया जा सकता है. जैसे, 99.0.0.

वेंडर लाइब्रेरी को शुरू करना

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

Camera2/X, वर्शन की जांच के अलावा OEM लाइब्रेरी को कोई और कॉल तब तक नहीं करता, जब तक OEM वेंडर लाइब्रेरी, शुरू करने की प्रोसेस पूरी होने की सूचना देने के लिए OnExtensionsInitializedCallback.onSuccess() को कॉल नहीं करती.

आपको extensions-interface 1.1.0 के तौर पर, InitializerImpl लागू करना होगा. अगर OEM वेंडर लाइब्रेरी में extensions-interface 1.0.0 लागू किया जाता है, तो Camera2/X लाइब्रेरी को शुरू करने के चरण को छोड़ देता है.

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

extensions-interface को लागू करने के दो तरीके हैं: बुनियादी एक्सटेंडर और बेहतर एक्सटेंडर. ऐडवांस एक्सटेंडर की सुविधा, extensions-interface 1.2.0 से काम करती है.

कैमरा एचएएल में इमेज प्रोसेस करने वाले एक्सटेंशन के लिए, बुनियादी एक्सटेंडर लागू करें या YUV स्ट्रीम को प्रोसेस करने वाले पोस्ट प्रोसेसर का इस्तेमाल करें.

उन एक्सटेंशन के लिए बेहतर एक्सटेंडर लागू करें जिन्हें Camera2 के स्ट्रीम कॉन्फ़िगरेशन को पसंद के मुताबिक बनाने और ज़रूरत के हिसाब से कैप्चर करने के अनुरोध भेजने की ज़रूरत है.

तुलना के लिए, नीचे दी गई टेबल देखें:

बुनियादी एक्सटेंडर ऐडवांस एक्सटेंडर
स्ट्रीम के कॉन्फ़िगरेशन ठीक किया गया
झलक: PRIVATE या YUV_420_888 (अगर प्रोसेसर मौजूद है)
स्टिल कैप्चर: JPEG या YUV_420_888 (अगर प्रोसेसर मौजूद है)
OEM के हिसाब से पसंद के मुताबिक बनाया जा सकता है.
कैप्चर करने का अनुरोध भेजना सिर्फ़ Camera2/X, कैप्चर करने के अनुरोध भेज सकता है. इन अनुरोधों के लिए पैरामीटर सेट किए जा सकते हैं. जब इमेज कैप्चर करने के लिए प्रोसेसर उपलब्ध कराया जाता है, तो Camera2/X कई कैप्चर अनुरोध भेज सकता है. साथ ही, सभी इमेज और कैप्चर के नतीजे प्रोसेसर को भेज सकता है. आपको RequestProcessorImpl इंस्टेंस दिया जाता है, ताकि आप camera2 capture अनुरोध को पूरा कर सकें और नतीजे और इमेज पा सकें.

Camera2/X, SessionProcessorImpl पर startRepeating और startCapture को शुरू करता है, ताकि OEM को झलक देखने के लिए बार-बार अनुरोध करने और स्टिल कैप्चर करने का क्रम शुरू करने का सिग्नल दिया जा सके.

कैमरा पाइपलाइन में हुक
  • onPresetSession सेशन पैरामीटर उपलब्ध कराता है.
  • onEnableSession, CameraCaptureSession कॉन्फ़िगर होने के तुरंत बाद एक अनुरोध भेजता है.
  • onDisableSession, CameraCaptureSession के बंद होने से पहले एक अनुरोध भेजता है.
  • initSession, कैप्चर सेशन बनाने के लिए, पसंद के मुताबिक बनाए गए camera2 सेशन कॉन्फ़िगरेशन को शुरू करता है और दिखाता है.
  • CameraCaptureSession कॉन्फ़िगर होने के तुरंत बाद, onCaptureSessionStart को ट्रिगर किया जाता है.
  • CameraCaptureSession बंद होने से पहले, onCaptureSessionEnd को शुरू किया जाता है.
इनके लिए सही है कैमरा एचएएल या YUV इमेज को प्रोसेस करने वाले प्रोसेसर में लागू किए गए एक्सटेंशन.
  • एक्सटेंशन के लिए, Camera2 पर आधारित सुविधाएं उपलब्ध हैं.
  • इसके लिए, स्ट्रीम को पसंद के मुताबिक कॉन्फ़िगर करना ज़रूरी है. जैसे, रॉ स्ट्रीम.
  • इंटरैक्टिव कैप्चर सीक्वेंस की ज़रूरत है.
काम करने वाला एपीआई वर्शन Camera2 एक्सटेंशन: Android 13 या इसके बाद का वर्शन
CameraX एक्सटेंशन: camera-extensions 1.1.0 या इसके बाद का वर्शन
Camera2 एक्सटेंशन: Android 12L या इसके बाद का वर्शन
CameraX एक्सटेंशन: camera-extensions 1.2.0-alpha03 या इसके बाद का वर्शन

ऐप्लिकेशन फ़्लो

नीचे दी गई टेबल में, तीन तरह के ऐप्लिकेशन फ़्लो और उनसे जुड़े Camera Extensions API कॉल दिखाए गए हैं. Camera2/X में ये एपीआई उपलब्ध होते हैं. हालांकि, इन फ़्लो के साथ काम करने के लिए, आपको वेंडर लाइब्रेरी को सही तरीके से लागू करना होगा. इस बारे में हम आगे के सेक्शन में ज़्यादा जानकारी देंगे.

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

लाइब्रेरी में बाकी जानकारी को CameraX मैनेज करता है.

एक्सटेंशन चालू होने पर, झलक देखना और फ़ोटो खींचना CameraDevice. createExtensionSession

cameraExtensionsSession. setRepeatingRequest

cameraExtensionsSession. capture

val cameraSelector = ExtensionsManager. getExtensionEnabledCameraSelector

bindToLifecycle(lifecycleOwner, cameraSelector, preview, ...)

बुनियादी एक्सटेंडर

बेसिक एक्सटेंडर इंटरफ़ेस, कैमरे की प्रोसेसिंग की प्रोसेस में कई जगहों पर हुक उपलब्ध कराता है. हर तरह के एक्सटेंशन के लिए, एक्सटेंडर क्लास होती हैं. OEM को इन्हें लागू करना होता है.

नीचे दी गई टेबल में, एक्सटेंडर क्लास की सूची दी गई है. OEM को हर एक्सटेंशन के लिए इन्हें लागू करना होगा:

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

NightImageCaptureExtenderImpl.java

एचडीआर HdrPreviewExtenderImpl.java

HdrImageCaptureExtenderImpl.java

अपने-आप AutoPreviewExtenderImpl.java

AutoImageCaptureExtenderImpl.java

बोकेह BokehPreviewExtenderImpl.java

BokehImageCaptureExtenderImpl.java

चेहरे की फ़ोटो क्वालिटी में सुधार BeautyPreviewExtenderImpl.java

BeautyImageCaptureExtenderImpl.java

हम इस उदाहरण में, प्लेसहोल्डर के तौर पर PreviewExtenderImpl और ImageCaptureExtenderImpl का इस्तेमाल करते हैं. इन नामों को उन असल फ़ाइलों के नाम से बदलें जिन्हें लागू किया जा रहा है.

बुनियादी एक्सटेंडर में ये सुविधाएं होती हैं:

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

आइए, देखें कि ऊपर बताए गए तीन ऐप्लिकेशन फ़्लो को पूरा करने के लिए, Camera2/X extensions-interface को कैसे इस्तेमाल करता है.

ऐप्लिकेशन फ़्लो 1: एक्सटेंशन की उपलब्धता की जांच करना

BasicExtenderAppFlow1

तीसरी इमेज. बेसिक एक्सटेंडर पर ऐप्लिकेशन का फ़्लो 1

इस फ़्लो में, Camera2/X सीधे PreviewExtenderImpl और ImageCaptureExtenderImpl, दोनों के isExtensionAvailable() तरीके को कॉल करता है. इसके लिए, init() को कॉल नहीं किया जाता. एक्सटेंशन चालू करने के लिए, दोनों एक्सटेंडर क्लास को true दिखाना होगा.

आम तौर पर, ऐप्लिकेशन इस बात की जांच करने के लिए, सबसे पहले यह देखते हैं कि किसी कैमरा आईडी के लिए, एक्सटेंशन का दिया गया टाइप काम करता है या नहीं. इसके बाद ही, वे एक्सटेंशन को चालू करते हैं. ऐसा इसलिए है, क्योंकि कुछ एक्सटेंशन सिर्फ़ कुछ कैमरा आईडी पर काम करते हैं.

ऐप्लिकेशन का दूसरा फ़्लो: क्वेरी की जानकारी

BasicExtenderAppFlow2

चौथी इमेज. बेसिक एक्सटेंडर पर ऐप्लिकेशन फ़्लो 2

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

  • स्टिल कैप्चर में लगने वाला समय: ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRange, ऐप्लिकेशन के लिए स्टिल कैप्चर में लगने वाले समय की रेंज दिखाता है. इससे यह पता चलता है कि मौजूदा स्थिति के लिए, एक्सटेंशन चालू करना सही है या नहीं.

  • झलक और कैप्चर किए गए प्लैटफ़ॉर्म के लिए इस्तेमाल किए जा सकने वाले साइज़: ImageCaptureExtenderImpl.getSupportedResolutions और PreviewExtenderImpl.getSupportedResolutions, इमेज फ़ॉर्मैट और साइज़ की सूची दिखाते हैं. ये साइज़, प्लैटफ़ॉर्म के फ़ॉर्मैट और साइज़ के साथ काम करते हैं.

  • काम करने वाले अनुरोध और नतीजे की कुंजियां: Camera2/X, आपके लागू किए गए कैप्चर अनुरोध की कुंजियों और नतीजे की कुंजियों को वापस पाने के लिए, इन तरीकों का इस्तेमाल करता है:

    • ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys
    • ImageCaptureExtenderImpl.getAvailableCapturetResultKeys

ज़्यादा जानकारी के लिए क्वेरी करने से पहले, Camera2/X हमेशा इन एक्सटेंडर क्लास पर पहले init() को कॉल करता है.

ऐप्लिकेशन फ़्लो 3: एक्सटेंशन चालू होने पर झलक देखना/स्टिल कैप्चर करना (एचएएल लागू करना)

BasicExtenderAppFlow3

पांचवीं इमेज. बेसिक एक्सटेंडर पर ऐप्लिकेशन फ़्लो 3

ऊपर दिए गए डायग्राम में, प्रोसेसर के बिना एक्सटेंशन की मदद से, झलक देखने और फ़ोटो खींचने की सुविधा चालू करने के मुख्य फ़्लो को दिखाया गया है. इसका मतलब है कि कैमरा एचएएल, एक्सटेंशन को प्रोसेस करता है.

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

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

Camera2/X से ट्रिगर किए गए बार-बार होने वाले अनुरोध में, PreviewExtenderImpl.getCaptureStage() से मिले अनुरोध पैरामीटर शामिल होते हैं. इसके अलावा, स्टिल कैप्चर के अनुरोध में ImageCaptureExtenderImpl.getCaptureStages() से मिले पैरामीटर शामिल होते हैं.

आखिर में, कैमरा सेशन खत्म होने के बाद, Camera2/X onDeInit() को ट्रिगर करता है. onDeinit() में जाकर, संसाधनों को रिलीज़ किया जा सकता है.

झलक दिखाने वाला प्रोसेसर

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

प्रोसेसर टाइप बताने के लिए, PreviewExtenderImpl.getProcessorType को लागू करें. इसके बारे में यहां बताया गया है:

  • PROCESSOR_TYPE_NONE: कोई प्रोसेसर नहीं. इमेज को कैमरे के एचएएल में प्रोसेस किया जाता है.

  • 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 फ़ॉर्मैट में लिखना चाहिए. Camera2/X, झलक देखने के लिए CameraCaptureSession को कॉन्फ़िगर करने के लिए, PRIVATE के बजाय YUV_420_888 के प्लैटफ़ॉर्म का इस्तेमाल करता है.

    फ़्लो के बारे में जानने के लिए, यह इलस्ट्रेशन देखें:

PreviewProcessor

छठी इमेज. 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 प्लैटफ़ॉर्म पर लिखना है.

स्टिल कैप्चर का अनुरोध भेजने से पहले, यह माना जा सकता है कि झलक देखने की सुविधा चालू है और वह काम कर रही है.

नीचे दिए गए डायग्राम में फ़्लो देखें:

CaptureProcessor

सातवीं इमेज. CaptureProcessorImpl से अब भी फ़्लो कैप्चर किया जा सकता है

  1. कैमरा2/X, कैप्चर सेशन को कॉन्फ़िगर करने के लिए, स्टिल कैप्चर के लिए YUV_420_888 फ़ॉर्मैट के प्लैटफ़ॉर्म का इस्तेमाल करता है. Camera2/X, CaptureProcessorImpl को तैयार करने के लिए इन फ़ंक्शन को कॉल करता है:

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

  3. मिली इमेज और TotalCaptureResult इंस्टेंस को एक साथ बंडल किया जाता है और प्रोसेस करने के लिए CaptureProcessorImpl को भेजा जाता है.

  4. CaptureProcessorImpl, onOutputSurface() कॉल से तय किए गए आउटपुट प्लैटफ़ॉर्म पर नतीजे की इमेज (YUV_420_888 फ़ॉर्मैट) लिखता है. ज़रूरत पड़ने पर, Camera2/X इसे JPEG इमेज में बदल देता है.

अनुरोध कुंजियों और नतीजों को कैप्चर करने की सुविधा

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

extensions-interface 1.3.0 में ये तरीके जोड़े गए हैं, ताकि आप उन पैरामीटर को एक्सपोज़ कर सकें जिनके साथ आपका लागू किया गया वर्शन काम करता है:

  • ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys(), कैप्चर करने के लिए अनुरोध की उन कुंजियों की जानकारी देता है जो आपके लागू किए गए तरीके के साथ काम करती हैं.
  • ImageCaptureExtenderImpl.getAvailableCaptureResultKeys(), कैप्चर किए गए नतीजे में मौजूद कैप्चर की गई कीवर्ड दिखाता है.

अगर कैमरा एचएएल एक्सटेंशन को प्रोसेस करता है, तो Camera2/X, कैप्चर किए गए CameraCaptureSession.CaptureCallback के नतीजे वापस लाता है. हालांकि, अगर प्रोसेसर लागू किया जाता है, तो Camera2/X, कैप्चर किए गए नतीजों को ProcessResultImpl में वापस लाता है. इसे PreviewImageProcessorImpl और CaptureProcessorImpl में process() तरीके से पास किया जाता है. ProcessResultImpl की मदद से कैप्चर किए गए नतीजे को Camera2/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

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

ऐडवांस एक्सटेंडर

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

  • कस्टम स्ट्रीम कॉन्फ़िगरेशन: RAW स्ट्रीम जैसी कस्टम स्ट्रीम कॉन्फ़िगर करें या अलग-अलग फ़िज़िकल कैमरा आईडी के लिए कई स्ट्रीम बनाएं.

  • Camera2 अनुरोध भेजने की सुविधा: यह एक जटिल इंटरैक्शन लॉजिक के साथ काम करता है. यह पिछले अनुरोधों के नतीजों के आधार पर, पैरामीटर के साथ कैप्चर करने के अनुरोध भेज सकता है.

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

लागू की जाने वाली फ़ाइलें

बेहतर एक्सटेंडर लागू करने के लिए, ExtensionVersionImpl में isAdvancedExtenderImplemented() का तरीका, true दिखाना चाहिए. हर तरह के एक्सटेंशन के लिए, OEM को उससे जुड़ी एक्सटेंडर क्लास लागू करनी होंगी. Advanced Extender को लागू करने की फ़ाइलें, advanced पैकेज में होती हैं.

लागू करने के लिए एक्सटेंडर क्लास
रात advanced/NightAdvancedExtenderImpl.java
एचडीआर advanced/HdrAdvancedExtenderImpl.java
अपने-आप advanced/AutoAdvancedExtenderImpl.java
बोकेह advanced/BokehAdvancedExtenderImpl.java
चेहरे की फ़ोटो क्वालिटी में सुधार advanced/BeautyAdvancedExtenderImpl.java

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

चलिए देखते हैं कि Camera2/X, तीन ऐप्लिकेशन फ़्लो को पूरा करने के लिए, extensions-interface को कैसे इस्तेमाल करता है.

ऐप्लिकेशन फ़्लो 1: एक्सटेंशन की उपलब्धता की जांच करना

AdvancedAppFlow1

आठवीं इमेज. ऐडवांस एक्सटेंडर पर ऐप्लिकेशन का पहला फ़्लो

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

ऐप्लिकेशन का दूसरा फ़्लो: क्वेरी की जानकारी

AdvancedAppFlow2

नौवीं इमेज. ऐडवांस एक्सटेंडर पर ऐप्लिकेशन का दूसरा फ़्लो

AdvancedExtenderImpl.init() को कॉल करने के बाद, ऐप्लिकेशन AdvancedExtenderImpl पर दी गई इस जानकारी के आधार पर क्वेरी कर सकता है:

  • स्टिल कैप्चर में लगने वाला अनुमानित समय: AdvancedExtenderImpl.getEstimatedCaptureLatencyRange(), ऐप्लिकेशन के लिए कैप्चर में लगने वाले समय की सीमा दिखाता है. इससे यह पता चलता है कि मौजूदा स्थिति के लिए, एक्सटेंशन चालू करना सही है या नहीं.

  • झलक देखने और फ़ोटो खींचने के लिए इस्तेमाल किए जा सकने वाले रिज़ॉल्यूशन:

    • AdvancedExtenderImpl.getSupportedPreviewOutputResolutions(), इमेज फ़ॉर्मैट का मैप दिखाता है. यह मैप, झलक दिखाने वाले प्लैटफ़ॉर्म के फ़ॉर्मैट और साइज़ के लिए इस्तेमाल किए जा सकने वाले साइज़ की सूची में दिखता है. OEM, कम से कम PRIVATE फ़ॉर्मैट के साथ काम करने चाहिए.

    • AdvancedExtenderImpl.getSupportedCaptureOutputResolutions(), स्टिल कैप्चर प्लैटफ़ॉर्म के लिए इस्तेमाल किए जा सकने वाले फ़ॉर्मैट और साइज़ दिखाता है. OEM के डिवाइसों पर, JPEG और YUV_420_888, दोनों फ़ॉर्मैट में आउटपुट मिलना चाहिए.

    • AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions(), इमेज के विश्लेषण के लिए, अतिरिक्त YUV_420_888 स्ट्रीम के लिए काम करने वाले साइज़ दिखाता है. अगर इमेज विश्लेषण के लिए YUV प्लैटफ़ॉर्म काम नहीं करता है, तो getSupportedYuvAnalysisResolutions() को null या खाली सूची दिखानी चाहिए.

  • कैप्चर रिक्वेस्ट के लिए उपलब्ध कुंजियां/नतीजे (extensions-interface 1.3.0 में जोड़ा गया): Camera2/X, आपके लागू किए गए कैप्चर रिक्वेस्ट के लिए काम करने वाली कुंजियों और नतीजों की कुंजियों को वापस पाने के लिए, इन तरीकों का इस्तेमाल करता है:

    • AdvancedExtenderImpl.getAvailableCaptureRequestKeys
    • AdvancedExtenderImpl.getAvailableCaptureResultKeys

ज़्यादा जानकारी के लिए, सहायता कैप्चर करने के अनुरोध की कुंजियां और नतीजे देखें.

ऐप्लिकेशन फ़्लो 3: एक्सटेंशन चालू होने पर झलक देखना/स्टिल कैप्चर करना

AdvancedAppFlow3

10वीं इमेज. ऐडवांस एक्सटेंडर पर ऐप्लिकेशन का तीसरा फ़्लो

ऊपर दिए गए डायग्राम में, बेहतर एक्सटेंडर टाइप के लिए झलक शुरू करने और स्टिल कैप्चर करने का मुख्य फ़्लो दिखाया गया है. आइए, हर चरण के बारे में जानते हैं.

  1. SessionProcessorImpl इंस्टेंस

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

  2. initSession

    SessionProcessorImpl.initSession(), एक्सटेंशन के लिए सेशन शुरू करता है. यहां संसाधनों को बांटा जाता है और CameraCaptureSession को तैयार करने के लिए सेशन कॉन्फ़िगरेशन दिखाया जाता है.

    इनपुट पैरामीटर के लिए, Camera2/X, झलक, स्टिल कैप्चर, और YUV इमेज के विश्लेषण के लिए आउटपुट की सतह के कॉन्फ़िगरेशन तय करता है. हालांकि, YUV इमेज का विश्लेषण करना ज़रूरी नहीं है. इस आउटपुट सर्फ़ेस कॉन्फ़िगरेशन (OutputSurfaceImpl) में, AdvancedExtenderImpl में बताए गए तरीकों से हासिल किए गए, सर्फ़ेस, साइज़, और इमेज फ़ॉर्मैट शामिल होते हैं:

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

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

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

      आपको इंटरमीडिएट इमेज को प्रोसेस करना होगा और आउटपुट प्लैटफ़ॉर्म पर नतीजे वाली इमेज को लिखना होगा.

    • Camera2 की मदद से, स्क्रीन शेयर करने की सुविधा का इस्तेमाल करना: किसी दूसरे स्क्रीन पर स्क्रीन शेयर करने की सुविधा का इस्तेमाल करने के लिए, किसी Camera2OutputConfigImpl इंस्टेंस के getSurfaceSharingOutputConfigs() तरीके में कोई Camera2OutputConfigImpl इंस्टेंस जोड़ें. प्लैटफ़ॉर्म का फ़ॉर्मैट और साइज़ एक जैसा होना चाहिए.

    SurfaceOutputConfigImpl और ImageReaderOutputConfigImpl के साथ-साथ सभी Camera2OutputConfigImpl में एक यूनीक आईडी (getId()) होना चाहिए. इसका इस्तेमाल, टारगेट किए गए प्लैटफ़ॉर्म की जानकारी देने और ImageReaderOutputConfigImpl से इमेज को वापस पाने के लिए किया जाता है.

  3. onCaptureSessionStart और RequestProcessorImpl

    जब CameraCaptureSession शुरू होता है और Camera फ़्रेमवर्क onConfigured() को शुरू करता है, तो Camera2/X, Camera2 अनुरोध रैपर RequestProcessImpl के साथ SessionProcessorImpl.onCaptureSessionStart() को शुरू करता है. Camera2/X में RequestProcessImpl लागू होता है. इससे, इमेज कैप्चर करने के अनुरोधों को पूरा किया जा सकता है. साथ ही, ImageReaderOutputConfigImpl का इस्तेमाल करने पर, इमेज वापस लाई जा सकती हैं.

    अनुरोधों को लागू करने के मामले में, RequestProcessImpl एपीआई, Camera2 CameraCaptureSession एपीआई से मिलते-जुलते हैं. इनमें ये अंतर हैं:

    • टारगेट किए गए प्लैटफ़ॉर्म की जानकारी, Camera2OutputConfigImpl इंस्टेंस के आईडी से मिलती है.
    • ImageReader की इमेज वापस लाने की सुविधा.

    इमेज पाने के लिए, ImageProcessorImpl इंस्टेंस को रजिस्टर करने के लिए, किसी तय किए गए Camera2OutputConfigImpl आईडी के साथ RequestProcessorImpl.setImageProcessor() को कॉल किया जा सकता है.

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

  4. झलक देखना और फ़ोटो खींचना

    बेहतर एक्सटेंडर लागू करने के लिए, RequestProcessorImpl इंटरफ़ेस की मदद से कैप्चर करने के अनुरोध भेजे जा सकते हैं. Camera2/X, झलक देखने या स्टिल कैप्चर सीक्वेंस के लिए, बार-बार अनुरोध शुरू करने के लिए आपको सूचना देता है. इसके लिए, यह क्रमशः SessionProcessorImpl#startRepeating और SessionProcessorImpl#startCapture को कॉल करता है. झलक और फ़ोटो लेने के इन अनुरोधों को पूरा करने के लिए, आपको कैप्चर करने के अनुरोध भेजने चाहिए.

    Camera2/X, SessionProcessorImpl#setParameters के ज़रिए कैप्चर करने के अनुरोध के पैरामीटर भी सेट करता है. आपको बार-बार किए जाने वाले अनुरोधों और एक बार किए जाने वाले अनुरोधों, दोनों पर ये अनुरोध पैरामीटर सेट करने होंगे. हालांकि, ऐसा तब ही किया जा सकता है, जब पैरामीटर काम करते हों.

    आपको कम से कम CaptureRequest.JPEG_ORIENTATION और CaptureRequest.JPEG_QUALITY के साथ काम करना होगा. extensions-interface 1.3.0 में अनुरोध और नतीजे की कुंजियों का इस्तेमाल किया जा सकता है. ये कुंजियां इन तरीकों से एक्सपोज़ की जाती हैं:

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

    जब डेवलपर getAvailableCaptureRequestKeys सूची में कुंजियां सेट करते हैं, तो आपको पैरामीटर चालू करने होंगे. साथ ही, यह पक्का करना होगा कि कैप्चर किए गए नतीजे में getAvailableCaptureResultKeys सूची में मौजूद कुंजियां शामिल हों.

  5. startTrigger

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

    startTrigger(), extensions-interface 1.3.0 से काम करता है. इससे ऐप्लिकेशन, एक्सटेंशन के साथ टैप-टू-फ़ोकस और फ़्लैश की सुविधा लागू कर पाते हैं.

  6. खाली करने के लिए जगह

    कैप्चर सेशन खत्म करते समय, SessionProcessorImpl.onCaptureSessionEnd() को बंद करने से पहले CameraCaptureSession को शुरू किया जाता है. कैप्चर सेशन बंद होने के बाद, 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_STRENGTH कैप्चर रिक्वेस्ट पैरामीटर का इस्तेमाल कर सकते हैं. साथ ही, चालू किए गए एक्सटेंशन टाइप की जानकारी देने के लिए EXTENSION_CURRENT_TYPE कैप्चर के नतीजे का इस्तेमाल कर सकते हैं.

अनुरोध कैप्चर करना

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 जैसे एक्सटेंशन टाइप के बीच डाइनैमिक तौर पर स्विच करते हैं. यह स्विच, सीन की स्थितियों के हिसाब से होता है. इसलिए, कैमरे के एक्सटेंशन ऐप्लिकेशन, EXTENSION_CURRENT_TYPE का इस्तेमाल करके AUTO एक्सटेंशन से चुने गए मौजूदा एक्सटेंशन के बारे में जानकारी दिखा सकते हैं.

रीयल-टाइम स्टिल कैप्चर में लगने वाले समय का अनुमान

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 और इसके बाद के वर्शन के लिए, कैमरा एक्सटेंशन क्लाइंट को लंबे समय तक चलने वाले स्टिल कैप्चर प्रोसेसिंग ऑपरेशन की प्रोग्रेस के लिए कॉलबैक मिल सकते हैं. ऐप्लिकेशन, उपयोगकर्ताओं को मौजूदा प्रोग्रेस दिखा सकते हैं, ताकि उपयोगकर्ताओं का अनुभव बेहतर हो.

ऐप्लिकेशन इस सुविधा को इंटिग्रेट करने के लिए, यहां दिए गए कोड का इस्तेमाल कर सकते हैं:

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();
…
}

पोस्टव्यू स्टिल कैप्चर की सुविधा के साथ काम करने के लिए, आपके वेंडर को ये काम करने होंगे:

SurfaceView आउटपुट के साथ काम करना

Android 14 और उसके बाद के वर्शन के लिए, कैमरा एक्सटेंशन क्लाइंट, बार-बार किए जाने वाले अनुरोधों के लिए, झलक के आउटपुट के लिए SurfaceView इंस्टेंस रजिस्टर करके, बेहतर परफ़ॉर्मेंस वाले झलक रेंडर पाथ का इस्तेमाल कर सकते हैं.

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

वेंडर के हिसाब से सेशन के टाइप

इस सुविधा की मदद से, वेंडर एक्सटेंशन लागू करके, वेंडर के हिसाब से सेशन टाइप चुना जा सकता है. यह सेशन टाइप, डिफ़ॉल्ट वैल्यू के बजाय इंटरनल कैमरा कैप्चर सेशन में सेट किया जाएगा.

यह सुविधा, फ़्रेमवर्क और वेंडर स्टैक में पूरी तरह से काम करती है. साथ ही, इसका क्लाइंट/सार्वजनिक एपीआई पर कोई असर नहीं पड़ता.

वेंडर के हिसाब से सेशन टाइप चुनने के लिए, अपनी एक्सटेंशन लाइब्रेरी के लिए ये लागू करें: * बुनियादी एक्सटेंशन के लिए ExtenderStateListener.onSessionType() * बेहतर एक्सटेंशन के लिए Camera2SessionConfigImpl.getSessionType()

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

यहां दी गई टेबल में, Camera Extension के इंटरफ़ेस के वर्शन का इतिहास दिखाया गया है. आपको हमेशा वेंडर लाइब्रेरी के नए वर्शन का इस्तेमाल करना चाहिए.

वर्शन जोड़ी गई सुविधाएं
1.0.0
  • वर्शन की पुष्टि करना
    • ExtensionVersionImpl
  • बेसिक एक्सटेंडर
    • PreviewExtenderImpl
    • ImageCaptureExtenderImpl
    • Processor
      • PreviewImageProcessorImpl
      • CaptureProcessorImpl
      • RequestUpdateProcessorImpl
1.1.0
  • लाइब्रेरी को शुरू करना
    • InitializerImpl
  • काम करने वाले रिज़ॉल्यूशन दिखाना
    • PreviewExtenderImpl.getSupportedResolutions
    • ImageCaptureExtenderImpl.getSupportedResolutions
1.2.0
  • AdvancedExtender
    • 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: Camera2 और CameraX एक्सटेंशन एपीआई के लिए, Camera एक्सटेंशन OEM लाइब्रेरी, जो Extensions-Interface को लागू करती है. यह एक पासथ्रू के तौर पर काम करता है, जो Extensions-Interface से आने वाले कॉल को सेवा पर फ़ॉरवर्ड करता है. यह लाइब्रेरी, सेवा के साथ इंटरैक्ट करने के लिए, एआईडीएल फ़ाइलें और रैपर क्लास भी उपलब्ध कराती है.

      बेहतर एक्सटेंडर की सुविधा डिफ़ॉल्ट रूप से चालू होती है. बुनियादी एक्सटेंडर को चालू करने के लिए, ExtensionsVersionImpl#isAdvancedExtenderImplemented को false पर बदलें.

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

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

OEM वेंडर लाइब्रेरी, ऐप्लिकेशन में नहीं बनाई जाती है. इसे Camera2/X, रनटाइम के दौरान डिवाइस से लोड करता है. CameraX में, <uses-library> टैग यह बताता है कि androidx.camera.extensions.impl लाइब्रेरी, CameraX की डिपेंडेंसी है. इस लाइब्रेरी के बारे में camera-extensions लाइब्रेरी की AndroidManifest.xml फ़ाइल में बताया गया है. इसे रनटाइम के दौरान लोड करना ज़रूरी है. Camera2 में, फ़्रेमवर्क एक एक्सटेंशन सेवा लोड करता है. इसमें यह भी बताया जाता है कि रनटाइम के दौरान <uses-library>एक ही androidx.camera.extensions.impl लाइब्रेरी लोड होती है.

इससे, एक्सटेंशन का इस्तेमाल करने वाले तीसरे पक्ष के ऐप्लिकेशन, OEM के लिए उपलब्ध वेंडर लाइब्रेरी को अपने-आप लोड कर सकते हैं. 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 होनी चाहिए, क्योंकि CameraX इसी लाइब्रेरी को खोजता है.
    • file, उस फ़ाइल का ऐब्सलूट पाथ है जिसमें एक्सटेंशन लागू करने की जानकारी होती है. उदाहरण के लिए, /system/framework/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 पर सेट करना ज़रूरी है जिन पर CameraX एक्सटेंशन काम करते हैं. इससे यह पता चलता है कि कोई डिवाइस एक्सटेंशन के साथ काम करता है या नहीं. इसके लिए, डिवाइस बनाने वाली कंपनी की फ़ाइल में यह लाइन जोड़ें:

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

पुष्टि करें

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

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

एक्सटेंडेड सीन मोड बनाम कैमरा एक्सटेंशन

बोकेह एक्सटेंशन के लिए, कैमरा एक्सटेंशन का इस्तेमाल करने के अलावा, एक्सटेंशन को एक्सटेंडेड सीन मोड का इस्तेमाल करके भी एक्सपोज़ किया जा सकता है. इसे CONTROL_EXTENDED_SCENE_MODE बटन से चालू किया जा सकता है. लागू करने के बारे में ज़्यादा जानकारी के लिए, कैमरे में बोकेह इफ़ेक्ट देखें.

camera2 ऐप्लिकेशन के लिए कैमरा एक्सटेंशन की तुलना में, एक्सटेंडेड सीन मोड पर कम पाबंदियां हैं. उदाहरण के लिए, एक्सटेंडेड सीन मोड को किसी सामान्य CameraCaptureSession इंस्टेंस में चालू किया जा सकता है. यह इंस्टेंस, स्ट्रीम के अलग-अलग कॉम्बिनेशन के साथ काम करता है और अनुरोध पैरामीटर कैप्चर करता है. इसके उलट, कैमरा एक्सटेंशन सिर्फ़ स्ट्रीम टाइप के एक तय सेट के साथ काम करते हैं. साथ ही, कैप्चर करने के अनुरोध के पैरामीटर के साथ सीमित तौर पर काम करते हैं.

एक्सटेंडेड सीन मोड का एक नुकसान यह है कि इसे सिर्फ़ कैमरा एचएएल में लागू किया जा सकता है. इसका मतलब है कि ऐप्लिकेशन डेवलपर के लिए उपलब्ध सभी ऑर्थोगोनल कंट्रोल के साथ काम करने के लिए, इसकी पुष्टि की जानी चाहिए.

हमारा सुझाव है कि एक्सटेंडेड सीन मोड और Camera Extensions, दोनों का इस्तेमाल करके बोकेह मोड चालू करें. ऐसा इसलिए, क्योंकि ऐप्लिकेशन, बोकेह मोड चालू करने के लिए किसी खास एपीआई का इस्तेमाल कर सकते हैं. हमारा सुझाव है कि पहले एक्सटेंडेड सीन मोड का इस्तेमाल करें. ऐसा इसलिए, क्योंकि ऐप्लिकेशन के लिए, बोकेह एक्सटेंशन को चालू करने का यह सबसे बेहतर तरीका है. इसके बाद, एक्सटेंडेड सीन मोड के आधार पर कैमरे के एक्सटेंशन इंटरफ़ेस को लागू किया जा सकता है. अगर कैमरा एचएएल में बोकेह लागू करना मुश्किल है, तो हमारा सुझाव है कि आप Camera एक्सटेंशन इंटरफ़ेस का इस्तेमाल करके, बोकेह एक्सटेंशन लागू करें. ऐसा इसलिए, क्योंकि इमेज को प्रोसेस करने के लिए, ऐप्लिकेशन लेयर में चलने वाले पोस्ट प्रोसेसर की ज़रूरत होती है.

अक्सर पूछे जाने वाले सवाल

क्या एपीआई लेवल पर कोई पाबंदी है?

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