एक से ज़्यादा कैमरे इस्तेमाल करने की सुविधा

Android 9 में, मल्टी-कैमरा डिवाइसों के लिए एपीआई की सुविधा शुरू की गई थी. इसके तहत, एक नया लॉजिकल कैमरा डिवाइस बनाया गया था. इसमें दो या उससे ज़्यादा फ़िज़िकल कैमरा डिवाइस होते हैं, जो एक ही दिशा में पॉइंट करते हैं. लॉजिकल कैमरा डिवाइस को किसी ऐप्लिकेशन के लिए, एक CameraDevice/CaptureSession के तौर पर दिखाया जाता है. इससे HAL के साथ इंटिग्रेट की गई मल्टी-कैमरा सुविधाओं के साथ इंटरैक्ट किया जा सकता है. ऐप्लिकेशन के पास, कैमरे की फ़िज़िकल स्ट्रीम, मेटाडेटा, और कंट्रोल को ऐक्सेस करने और कंट्रोल करने का विकल्प होता है.

एक से ज़्यादा कैमरे इस्तेमाल करने की सुविधा

पहली इमेज. एक से ज़्यादा कैमरे इस्तेमाल करने की सुविधा

इस डायग्राम में, अलग-अलग कैमरा आईडी को कलर कोड किया गया है. यह ऐप्लिकेशन, हर फ़िज़िकल कैमरे से एक ही समय में रॉ बफ़र स्ट्रीम कर सकता है. अलग-अलग फ़िज़िकल कैमरों के लिए, अलग-अलग कंट्रोल सेट किए जा सकते हैं. साथ ही, उनसे अलग-अलग मेटाडेटा भी पाया जा सकता है.

उदाहरण और सोर्स

एक से ज़्यादा कैमरे वाले डिवाइसों का विज्ञापन, लॉजिकल मल्टी-कैमरा सिस्टम की सुविधा के साथ दिखाया जाना चाहिए.

कैमरा क्लाइंट, getPhysicalCameraIds() को कॉल करके, उन फ़िज़िकल डिवाइसों के कैमरा आईडी के बारे में क्वेरी कर सकते हैं जिनसे कोई लॉजिकल कैमरा बना है. इसके बाद, नतीजे के तौर पर मिले आईडी का इस्तेमाल करके, setPhysicalCameraId() के ज़रिए अलग-अलग डिवाइसों को कंट्रोल किया जाता है. अलग-अलग अनुरोधों से मिले नतीजों के बारे में पूरी जानकारी, getPhysicalCameraResults() को लागू करके देखी जा सकती है.

फ़िज़िकल कैमरे के अलग-अलग अनुरोधों में, पैरामीटर का सिर्फ़ एक सीमित सबसेट काम कर सकता है. इस्तेमाल किए जा सकने वाले पैरामीटर की सूची पाने के लिए, डेवलपर getAvailablePhysicalCameraRequestKeys() को कॉल कर सकते हैं.

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

लागू करना

सहायता टीम की चेकलिस्ट

एचएएल साइड पर लॉजिकल मल्टी-कैमरा डिवाइस जोड़ने के लिए:

  • दो या उससे ज़्यादा फ़िज़िकल कैमरों की मदद से काम करने वाले किसी भी लॉजिकल कैमरा डिवाइस के लिए, ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA सुविधा जोड़ें. ये फ़िज़िकल कैमरे, किसी ऐप्लिकेशन को भी दिखते हैं.
  • स्टैटिक ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS मेटाडेटा फ़ील्ड में, फ़िज़िकल कैमरे के आईडी की सूची डालें.
  • फ़िजिकल कैमरा स्ट्रीम के पिक्सल के बीच संबंध बनाने के लिए, गहराई से जुड़ा ज़रूरी स्टैटिक मेटाडेटा भरें: ANDROID_LENS_POSE_ROTATION, ANDROID_LENS_POSE_TRANSLATION, ANDROID_LENS_INTRINSIC_CALIBRATION, ANDROID_LENS_DISTORTION, ANDROID_LENS_POSE_REFERENCE.
  • स्टैटिक ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE मेटाडेटा फ़ील्ड को इस पर सेट करें:

  • ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS फ़ील्ड में, हर फ़िज़िकल कैमरे के लिए काम करने वाले पैरामीटर की सूची भरें. अगर लॉजिकल डिवाइस, अलग-अलग अनुरोधों को पूरा नहीं करता है, तो सूची खाली हो सकती है.

  • अगर अलग-अलग अनुरोधों को स्वीकार किया जाता है, तो अलग-अलग physicalCameraSettings को प्रोसेस करें और लागू करें. ये अनुरोध, कैप्चर करने के अनुरोधों के साथ मिल सकते हैं. इसके बाद, अलग-अलग physicalCameraMetadata को जोड़ें.

  • कैमरा HAL डिवाइस के 3.5 (Android 10 में पेश किया गया) या इसके बाद के वर्शन के लिए, लॉजिकल कैमरे को सपोर्ट करने वाले मौजूदा ऐक्टिव फ़िज़िकल कैमरे के आईडी का इस्तेमाल करके, ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID नतीजे की कुंजी भरें.

Android 9 पर काम करने वाले डिवाइसों के लिए, कैमरा डिवाइसों में यह सुविधा होनी चाहिए कि वे एक लॉजिकल YUV/RAW स्ट्रीम को, दो फ़िज़िकल कैमरों से मिलने वाली एक ही साइज़ (RAW स्ट्रीम पर लागू नहीं होता) और एक ही फ़ॉर्मैट वाली फ़िज़िकल स्ट्रीम से बदल सकें. यह Android 10 पर काम करने वाले डिवाइसों पर लागू नहीं होता.

Android 10 पर काम करने वाले ऐसे डिवाइसों के लिए जिनमें कैमरा HAL डिवाइस का वर्शन 3.5 या इसके बाद का वर्शन है, कैमरा डिवाइस में isStreamCombinationSupported की सुविधा होनी चाहिए. इससे ऐप्लिकेशन यह क्वेरी कर पाएंगे कि फ़िज़िकल स्ट्रीम वाले किसी स्ट्रीम कॉम्बिनेशन के साथ काम किया जा सकता है या नहीं.

स्ट्रीम कॉन्फ़िगरेशन मैप

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

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

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

स्ट्रीम कॉम्बिनेशन की गारंटी

लॉजिकल कैमरा और उसके साथ काम करने वाले फ़िज़िकल कैमरे, दोनों को डिवाइस के लेवल के लिए ज़रूरी स्ट्रीम के ज़रूरी कॉम्बिनेशन की गारंटी देनी होगी.

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

Android 9 पर काम करने वाले डिवाइसों पर, गारंटीड स्ट्रीम के हर कॉम्बिनेशन के लिए, लॉजिकल कैमरे में ये सुविधाएं होनी चाहिए:

  • एक लॉजिकल YUV_420_888 या रॉ स्ट्रीम को एक ही साइज़ और फ़ॉर्मैट की दो फ़िज़िकल स्ट्रीम से बदला जा सकता है. ये दोनों स्ट्रीम, अलग-अलग फ़िज़िकल कैमरे से ली गई हों. हालांकि, यह ज़रूरी है कि फ़िज़िकल कैमरे, साइज़ और फ़ॉर्मैट के साथ काम करते हों.

  • अगर लॉजिकल कैमरा, RAW फ़ॉर्मैट में फ़ोटो लेने की सुविधा के बारे में जानकारी नहीं देता है, लेकिन उसके साथ जुड़े फ़िज़िकल कैमरे ऐसा कर सकते हैं, तो हर फ़िज़िकल कैमरे से एक-एक रॉ स्ट्रीम जोड़ें. ऐसा आम तौर पर तब होता है, जब फ़िज़िकल कैमरों के सेंसर का साइज़ अलग-अलग होता है.

  • एक ही साइज़ और फ़ॉर्मैट की लॉजिकल स्ट्रीम के बजाय, फ़िज़िकल स्ट्रीम का इस्तेमाल करना. जब फ़िज़िकल और लॉजिकल स्ट्रीम के फ़्रेम की कम से कम अवधि एक जैसी हो, तब इससे कैप्चर करने की फ़्रेम रेट कम नहीं होनी चाहिए.

परफ़ॉर्मेंस और पावर से जुड़ी बातों का ध्यान रखना

  • परफ़ॉर्मेंस:

    • फ़िजिकल स्ट्रीम को कॉन्फ़िगर करने और स्ट्रीम करने से, संसाधन की कमी की वजह से लॉजिकल कैमरे का कैप्चर रेट कम हो सकता है.
    • फ़िजिकल कैमरा सेटिंग लागू करने पर, कैप्चर रेट कम हो सकता है. ऐसा तब होता है, जब कैमरे अलग-अलग फ़्रेम रेट पर सेट किए जाते हैं.
  • पावर:

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

पसंद के मुताबिक बनाएं

डिवाइस पर लागू करने की प्रोसेस को इन तरीकों से पसंद के मुताबिक बनाया जा सकता है.

  • लॉजिकल कैमरा डिवाइस का फ़्यूज़ किया गया आउटपुट, पूरी तरह से HAL के लागू होने पर निर्भर करता है. फ़िज़िकल कैमरों से फ़्यूज़ की गई लॉजिकल स्ट्रीम कैसे बनाई जाती हैं, इस बारे में ऐप्लिकेशन और Android कैमरा फ़्रेमवर्क को पूरी जानकारी होती है.
  • अलग-अलग फ़िज़िकल अनुरोधों और नतीजों के लिए, वैकल्पिक तौर पर सहायता दी जा सकती है. ऐसे अनुरोधों में उपलब्ध पैरामीटर का सेट भी, HAL के खास तौर पर लागू होने पर पूरी तरह से निर्भर करता है.
  • Android 10 से, HAL उन कैमरों की संख्या कम कर सकता है जिन्हें कोई ऐप्लिकेशन सीधे तौर पर खोल सकता है. इसके लिए, वह getCameraIdList में कुछ या सभी PHYSICAL_ID का विज्ञापन नहीं करता है. इसके बाद, getPhysicalCameraCharacteristics को फ़िज़िकल कैमरे की विशेषताएं दिखानी होंगी.

Validation

लॉजिकल मल्टी-कैमरा डिवाइसों को, सामान्य कैमरे की तरह ही कैमरा सीटीएस पास करना होगा. इस तरह के डिवाइस को टारगेट करने वाले टेस्ट केस, LogicalCameraDeviceTest मॉड्यूल में देखे जा सकते हैं.

ये तीन ITS टेस्ट, मल्टी-कैमरा सिस्टम को टारगेट करते हैं, ताकि इमेज को सही तरीके से फ़्यूज़ किया जा सके:

सीन 1 और सीन 4 के टेस्ट, ITS-in-a-box टेस्ट रिग के साथ किए जाते हैं. test_multi_camera_match टेस्ट से यह पुष्टि होती है कि दोनों कैमरे चालू होने पर, इमेज के बीच वाले हिस्से की चमक एक जैसी होती है. test_multi_camera_alignment टेस्ट से यह पुष्टि होती है कि कैमरे के बीच की दूरी, ओरिएंटेशन, और डिस्टॉर्शन पैरामीटर सही तरीके से लोड किए गए हैं. अगर मल्टी-कैमरा सिस्टम में वाइड फ़ील्ड ऑफ़ व्यू (>90o) वाला कैमरा शामिल है, तो ITS बॉक्स का rev2 वर्शन ज़रूरी है.

Sensor_fusion दूसरा टेस्ट रिग है. इससे फ़ोन को बार-बार, तय की गई गति से घुमाया जा सकता है. साथ ही, यह पुष्टि की जा सकती है कि जायरोस्कोप और इमेज सेंसर के टाइमस्टैंप मेल खाते हैं और मल्टी-कैमरा फ़्रेम सिंक हैं.

सभी बॉक्स, AcuSpec, Inc. (www.acuspecinc.com, fred@acuspecinc.com) और MYWAY Manufacturing (www.myway.tw, sales@myway.tw) से उपलब्ध हैं. इसके अलावा, rev1 ITS बॉक्स को West-Mark से खरीदा जा सकता है (www.west-mark.com, dgoodman@west-mark.com).

सबसे सही तरीके

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

  • (Android 10 या इसके बाद के वर्शन के लिए) getCameraIdList से फ़िज़िकल सब-कैमरों को छिपाएं. इससे, ऐप्लिकेशन के ज़रिए सीधे तौर पर खोले जा सकने वाले कैमरों की संख्या कम हो जाती है. साथ ही, ऐप्लिकेशन को कैमरा चुनने के लिए जटिल लॉजिक की ज़रूरत नहीं पड़ती.
  • (Android 11 या इसके बाद के वर्शन) ऑप्टिकल ज़ूम की सुविधा देने वाले लॉजिकल मल्टी-कैमरा डिवाइस के लिए, ANDROID_CONTROL_ZOOM_RATIO एपीआई लागू करें. साथ ही, सिर्फ़ आसपेक्ट रेशियो (लंबाई-चौड़ाई का अनुपात) के हिसाब से इमेज को काटने के लिए, ANDROID_SCALER_CROP_REGION का इस्तेमाल करें. ANDROID_CONTROL_ZOOM_RATIO इसकी मदद से, डिवाइस ज़ूम आउट कर पाता है और ज़्यादा सटीक जानकारी दे पाता है. इस मामले में, HAL को ANDROID_SCALER_CROP_REGION, ANDROID_CONTROL_AE_REGIONS, ANDROID_CONTROL_AWB_REGIONS, ANDROID_CONTROL_AF_REGIONS, ANDROID_STATISTICS_FACE_RECTANGLES, और ANDROID_STATISTICS_FACE_LANDMARKS के कोऑर्डिनेट सिस्टम को अडजस्ट करना होगा, ताकि ज़ूम करने के बाद फ़ील्ड ऑफ़ व्यू को सेंसर ऐक्टिव ऐरे के तौर पर इस्तेमाल किया जा सके. ANDROID_SCALER_CROP_REGION और ANDROID_CONTROL_ZOOM_RATIO के साथ काम करने के तरीके के बारे में ज़्यादा जानने के लिए, camera3_crop_reprocess#cropping देखें.
  • एक से ज़्यादा कैमरे वाले ऐसे डिवाइसों के लिए जिनमें अलग-अलग क्षमताओं वाले फ़िज़िकल कैमरे होते हैं, पक्का करें कि डिवाइस किसी कंट्रोल के लिए किसी वैल्यू या रेंज के साथ काम करने की जानकारी सिर्फ़ तब दे, जब ज़ूम की पूरी रेंज उस वैल्यू या रेंज के साथ काम करती हो. उदाहरण के लिए, अगर लॉजिकल कैमरा, अल्ट्रावाइड, वाइड, और टेलीफ़ोटो कैमरे से बना है, तो यह तरीका अपनाएं:
    • अगर फ़िज़िकल कैमरों के ऐक्टिव ऐरे का साइज़ अलग-अलग है, तो कैमरा HAL को फ़िज़िकल कैमरों के ऐक्टिव ऐरे को लॉजिकल कैमरे के ऐक्टिव ऐरे में मैप करना होगा. ऐसा ANDROID_SCALER_CROP_REGION, ANDROID_CONTROL_AE_REGIONS, ANDROID_CONTROL_AWB_REGIONS, ANDROID_CONTROL_AF_REGIONS, ANDROID_STATISTICS_FACE_RECTANGLES, और ANDROID_STATISTICS_FACE_LANDMARKS के लिए करना होगा, ताकि ऐप्लिकेशन के हिसाब से, कोऑर्डिनेट सिस्टम लॉजिकल कैमरे के ऐक्टिव ऐरे का साइज़ हो.
    • अगर वाइड और टेलीफ़ोटो कैमरे में ऑटोफ़ोकस की सुविधा काम करती है, लेकिन अल्ट्रावाइड कैमरे में फ़ोकस फ़िक्स है, तो पक्का करें कि लॉजिकल कैमरा, ऑटोफ़ोकस की सुविधा के बारे में जानकारी दे रहा हो. HAL को अल्ट्रावाइड कैमरे के लिए, ऑटोफ़ोकस स्टेट मशीन को सिम्युलेट करना होगा, ताकि जब ऐप्लिकेशन अल्ट्रावाइड लेंस पर ज़ूम आउट करे, तो ऐप्लिकेशन को यह पता न चले कि फ़िज़िकल कैमरा फ़िक्स्ड फ़ोकस है. साथ ही, ऑटोफ़ोकस के लिए उपलब्ध मोड के लिए ऑटोफ़ोकस स्टेट मशीन, उम्मीद के मुताबिक काम करे.
    • अगर वाइड और टेलीफ़ोटो कैमरे 4K @ 60 एफ़पीएस पर काम करते हैं और अल्ट्रावाइड कैमरा सिर्फ़ 4K @ 30 एफ़पीएस या 1080 पिक्सल @ 60 एफ़पीएस पर काम करता है, लेकिन 4K @ 60 एफ़पीएस पर काम नहीं करता, तो पक्का करें कि लॉजिकल कैमरा, स्ट्रीम कॉन्फ़िगरेशन के साथ काम करने वाले 4K @ 60 एफ़पीएस का विज्ञापन न दिखाए. इससे लॉजिकल कैमरे की क्षमताओं की इंटिग्रिटी की गारंटी मिलती है. साथ ही, यह पक्का होता है कि ऐप्लिकेशन को 4K @ 60 फ़्रेम प्रति सेकंड की दर से वीडियो रिकॉर्ड करने में समस्या नहीं आएगी. ऐसा तब होगा, जब ANDROID_CONTROL_ZOOM_RATIO की वैल्यू 1 से कम होगी.
  • Android 10 से, फ़िज़िकल स्ट्रीम शामिल करने वाले स्ट्रीम कॉम्बिनेशन के लिए, लॉजिकल मल्टी-कैमरा की ज़रूरत नहीं होती. अगर एचएएल, फ़िज़िकल स्ट्रीम के साथ कॉम्बिनेशन को सपोर्ट करता है, तो:
    • (Android 11 या इसके बाद के वर्शन) स्टीरियो से डेप्थ और मोशन ट्रैकिंग जैसे इस्तेमाल के उदाहरणों को बेहतर तरीके से हैंडल करने के लिए, फ़िज़िकल स्ट्रीम आउटपुट के फ़ील्ड ऑफ़ व्यू को जितना हो सके उतना बड़ा बनाएं. हालांकि, अगर कोई फ़िज़िकल स्ट्रीम और लॉजिकल स्ट्रीम, एक ही फ़िज़िकल कैमरे से जनरेट होती हैं, तो हार्डवेयर से जुड़ी सीमाओं की वजह से, फ़िज़िकल स्ट्रीम का फ़ील्ड ऑफ़ व्यू, लॉजिकल स्ट्रीम के फ़ील्ड ऑफ़ व्यू के बराबर हो सकता है.
    • एक से ज़्यादा फ़िज़िकल स्ट्रीम की वजह से मेमोरी पर पड़ने वाले दबाव को कम करने के लिए, पक्का करें कि ऐप्लिकेशन discardFreeBuffers का इस्तेमाल करें. इससे, खाली बफ़र (ऐसे बफ़र जिन्हें उपभोक्ता ने रिलीज़ कर दिया है, लेकिन निर्माता ने अब तक डीक्यू नहीं किया है) को डी-ऐलोकेट किया जा सकता है. ऐसा तब करें, जब किसी फ़िज़िकल स्ट्रीम के कुछ समय तक इस्तेमाल न होने की संभावना हो.
    • अगर अलग-अलग फ़िज़िकल कैमरों से मिलने वाली फ़िज़िकल स्ट्रीम, आम तौर पर एक ही अनुरोध से जुड़ी नहीं होती हैं, तो पक्का करें कि ऐप्लिकेशन surface group का इस्तेमाल करें. इससे, ऐप्लिकेशन के दो इंटरफ़ेस के लिए एक ही बफ़र क्यू का इस्तेमाल किया जा सकेगा. साथ ही, मेमोरी की खपत कम हो जाएगी.