Camera2 पर माइग्रेट करना

इस पेज पर, एक्सटेंडेड व्यू सिस्टम (ईवीएस) और Camera2 के बीच के अंतर के बारे में बताया गया है. इसमें Camera2 API को लागू करने का तरीका भी बताया गया है.

कैमरा ऐप्लिकेशन को खोलना और बंद करना

ईवीएस

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

Camera2

Camera2 की सुविधा वाले डिवाइस को खोलने और बंद करने के लिए:

  1. इनमें से कोई एक मोड चुनें:

    • एक्सक्लूसिव मोड के लिए, नेटिव डेवलपमेंट किट (NDK) पर CameraManager.openCamera (Java) या ACameraManager_openCamera का इस्तेमाल करें.

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

  2. स्ट्रीम कॉन्फ़िगर करने के लिए, काम के आउटपुट सर्फ़ेस के साथ एक कैप्चर सेशन बनाएं. उदाहरण के लिए, CameraDevice.createCaptureSession() (Java) या ACameraDevice_createCaptureSession() (NDK) के साथ ImageReader या SurfaceView से.

    Camera2, एक साथ कई स्ट्रीम को सपोर्ट करता है. झलक देखने, रिकॉर्ड करने, और इमेज प्रोसेसिंग जैसे कामों के लिए, एक से ज़्यादा स्ट्रीम बनाएं. स्ट्रीम, पैरलल पाइपलाइन के तौर पर काम करती हैं. ये कैमरे से मिले रॉ फ़्रेम को क्रम से प्रोसेस करती हैं.

  3. कैमरा डिवाइस को बंद करने के लिए, CameraDevice.close() (Java) या ACameraDevice_close() (NDK) का इस्तेमाल करें.

यहां दिए गए कोड स्निपेट के सैंपल देखें:

Java

CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
    manager.openCamera(cameraId, new CameraDevice.StateCallback() {
        @Override
        public void onOpened(@NonNull CameraDevice camera) {
            // Camera opened, now create session
        }
        @Override
        public void onDisconnected(@NonNull CameraDevice camera) {}
        @Override
        public void onError(@NonNull CameraDevice camera, int error) {}
    }, handler);
} catch (CameraAccessException e) {
    // Handle exception
}

NDK

ACameraManager *cameraManager = ACameraManager_create();
ACameraDevice *cameraDevice = nullptr;
camera_status_t status = ACameraManager_openCamera(
    cameraManager, cameraId, &deviceStateCallbacks, &cameraDevice);

कैमरे का डेटा स्ट्रीम करना

इस सेक्शन में, कैमरे के डेटा को स्ट्रीम करने का तरीका बताया गया है.

ईवीएस

ईवीएस पर, ये काम करने के लिए:

  1. स्ट्रीमिंग शुरू करने के लिए, startVideoStream का इस्तेमाल करें.
  2. स्ट्रीमिंग बंद करें और stopVideoStream का इस्तेमाल करें.

Camera2

Camera2 पर, इन कामों के लिए:

  1. झलक देखने के लिए, CaptureRequest बनाएं. Java में CameraDevice.createCaptureRequest() के साथ TEMPLATE_PREVIEW का इस्तेमाल करें या NDK पर ACameraDevice_createCaptureRequest() का इस्तेमाल करें.

  2. लगातार स्ट्रीमिंग के लिए अनुरोध सबमिट करें. इसके लिए, CameraCaptureSession.setSingleRepeatingRequest (Java) या ACameraCaptureSession_setRepeatingRequestV2 (NDK) का इस्तेमाल करें.

  3. स्ट्रीमिंग बंद करें. इसके लिए, CameraCaptureSession.stopRepeating (Java) या ACameraCaptureSession_stopRepeating (NDK) का इस्तेमाल करें.

बफ़र मैनेजमेंट

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

  • Camera2 पर, सेशन शुरू होने पर AImageReader या ImageReader के लिए, ज़्यादा से ज़्यादा इमेज की संख्या AImageReader_new या ImageReader.newInstance के साथ सेट की जाती है. सेशन शुरू होने के बाद, इसे डाइनैमिक तरीके से नहीं बदला जा सकता. हर फ़्रेम के लिए बफ़र आईडी पाने के लिए, क्लाइंट एक ऐसा मैप बनाए रख सकते हैं जो Image ऑब्जेक्ट से मिले हार्डवेयर बफ़र के पते को यूनीक आइडेंटिफ़ायर से जोड़ता है.

स्ट्रीमिंग को रोकना और फिर से शुरू करना

  • ईवीएस में pauseVideoStream और resumeVideoStream का इस्तेमाल किया गया.

  • Camera2 के लिए, कोई भी सीधे तौर पर काम करने वाला विकल्प उपलब्ध नहीं है. इसके बजाय, इनके लिए:

    • रोकें, stopRepeating का इस्तेमाल करें
    • फिर से शुरू करने के लिए, setSingleRepeatingRequest का इस्तेमाल करें

कैमरे के पैरामीटर

  • ईवीएस ने कैमरा कैप्चर करने के अनुरोध वाले पैरामीटर को बदलने के लिए, setIntParameter जैसे तरीकों का इस्तेमाल किया.

  • Camera2 पर, पैरामीटर में बदलाव करने के लिए, CaptureRequest बिल्डर के लिए set एपीआई को कॉल करें. इसके बाद, इसे सबमिट करें.

कोड के इन सैंपल पर ध्यान दें:

Java

CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.set(CaptureRequest.CONTROL_EFFECT_MODE, CaptureRequest.CONTROL_EFFECT_MODE_MONO);
// Submit this request

NDK

ACaptureRequest_setEntry_i32(captureRequest, ACAMERA_CONTROL_EFFECT_MODE, 1, &effectMode);

लॉजिकल कैमरे

  • ईवीएस: लॉजिकल कैमरों, जैसे कि सराउंड व्यू के लिए, ईवीएस मैनेजर ने सभी संबंधित फ़िज़िकल कैमरे खोले, वीडियो स्ट्रीम शुरू कीं, और इमेज का एक साथ दिखने वाला व्यू उपलब्ध कराया.

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

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

हम मौजूदा EVS क्लाइंट को एक कंपैटिबिलिटी लाइब्रेरी (शिम लेयर) उपलब्ध कराएंगे, ताकि वे आसानी से ट्रांज़िशन कर सकें. इसका मकसद, कोड में कम से कम बदलाव करके Camera2 API को सपोर्ट करना है.

अनुमतियां

इस सेक्शन में, अनुमतियों में हुए बदलावों के बारे में बताया गया है.

ईवीएस

ऐक्सेस सिर्फ़ खास यूनीक आइडेंटिफ़ायर (यूआईडी) के लिए उपलब्ध है. उदाहरण के लिए, AID_AUTOMOTIVE_EVS. अब काम न करने वाली अनुमतियों में android.car.permission.USE_CAR_EVS_CAMERA शामिल है.

Camera2

Camera2 के लिए android.permission.CAMERA की ज़रूरत होती है. खास मामलों के लिए:

  • android.permission.SYSTEM_CAMERA: तीसरे पक्ष के ऐप्लिकेशन से छिपे हुए कैमरों को ऐक्सेस करने के लिए. इसके लिए, CAMERA अनुमति भी ज़रूरी है. ज़्यादा जानने के लिए, सिस्टम कैमरे लेख पढ़ें.

  • android.permission.CAMERA_HEADLESS_SYSTEM_USER: इससे User 0 को ऐक्सेस करने की अनुमति मिलती है. यह उन सेवाओं के लिए ज़रूरी है जो उपयोगकर्ता के स्विच करने पर भी काम करती हैं. जैसे, पीछे का व्यू दिखाने वाले कैमरे. इसके लिए, CAMERA ऐक्सेस करने की अनुमति पहले से मिली होनी चाहिए.

  • android.permission.CAMERA_PRIVACY_ALLOWLIST: इससे ओईएम को, सुरक्षा के लिहाज़ से ज़रूरी कुछ ऐप्लिकेशन को, उपयोगकर्ता के कंट्रोल वाले कैमरा प्राइवसी टॉगल से छूट देने की अनुमति मिलती है.

सुरक्षा के लिहाज़ से ज़रूरी कैमरा ऐप्लिकेशन को, Google की उन नीतियों का पालन करना होगा जो पहले से मौजूद हैं. ये नीतियां, ड्राइविंग के लिए डिज़ाइन किया गया सेक्शन में दी गई हैं.

मुख्य और सेकंडरी क्लाइंट

कैमरे का ऐक्सेस शेयर करने के लिए:

  • ईवीएस ने मुख्य क्लाइंट को मैनेज करने के लिए, setPrimaryClient और forcePrimaryClient जैसे एपीआई उपलब्ध कराए थे. मुख्य क्लाइंट के पास पैरामीटर में बदलाव करने का अधिकार था.

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

सिस्टम कैमरे

अगर आपको किसी कैमरा डिवाइस को सिस्टम या 1P ऐप्लिकेशन सिर्फ़ ऐक्सेस करने की अनुमति देनी है, तो उस डिवाइस के लिए Camera HAL में ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA क्षमता का एलान करें. क्लाइंट के पास, इस कैमरे से कनेक्ट किए गए android.permission.CAMERA के साथ-साथ android.permission.SYSTEM_CAMERA भी होना चाहिए.

रियर व्यू कैमरा

ईवीएस

ईवीएस, Android बूट होने से पहले कैमरे का ऐक्सेस चालू करता था. यह रियर व्यू कैमरे जैसी सुविधाओं के लिए ज़रूरी है. फ़ेडरल मोटर व्हीकल सेफ़्टी स्टैंडर्ड (एफ़एमवीएसएस), नंबर 111, पीछे की ओर देखने की सुविधा में दिए गए नियमों का पालन करना और सर्टिफ़िकेट पाना, वाहन ओईएम की ज़िम्मेदारी है. इसके अलावा, वाहन के ओईएम को रियर व्यू कैमरे से जुड़े अन्य नियमों का भी पालन करना होगा.

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

Camera2

AID_AUTOMOTIVE_EVS UID से पहचाना गया खास क्लाइंट, Android बूट प्रोसेस पूरी होने से पहले ही कैमरे का ऐक्सेस पाने के लिए, Camera2 एपीआई का इस्तेमाल कर सकता है. अर्ली ऐक्सेस की यह सुविधा, सिर्फ़ गाड़ी के बाहरी हिस्से में लगे सिस्टम कैमरों के लिए उपलब्ध है. Camera2, कैमरा ऐक्सेस करने के लिए, EVS की तरह ही परफ़ॉर्मेंस के मुख्य इंडिकेटर (केपीआई) पूरे करता है. आम तौर पर, Android बूट होने के चार से छह सेकंड के अंदर, Camera2 उपलब्ध हो जाता है.

रियर व्यू कैमरे का व्यू लगातार और बिना किसी रुकावट के दिखाने के लिए, खास तौर पर तब, जब उपयोगकर्ता ट्रांज़िशन कर रहे हों या जब अन्य ऐप्लिकेशन झलक को धुंधला कर सकते हों, हम Camera2 के साथ रियर व्यू कैमरा लागू करते समय इन दिशा-निर्देशों का पालन करने का सुझाव देते हैं:

  1. तीसरे पक्ष के ऐप्लिकेशन को ऐक्सेस करने से रोकने के लिए, पीछे के कैमरे को सिस्टम कैमरा के तौर पर सेट करें.

  2. CAMERA_HEADLESS_SYSTEM_USER अनुमति का इस्तेमाल करके, कैमरे को ऐक्सेस करने वाले ऐप्लिकेशन या सेवा को User 0 के तौर पर चलाएं. इससे यह पक्का होता है कि फ़ोरग्राउंड में इस्तेमाल किए जा रहे ऐप्लिकेशन को बदलने पर भी, कैमरे की स्ट्रीमिंग में कोई रुकावट नहीं आएगी.

  3. ऐप्लिकेशन को कैमरे की निजता सेटिंग की अनुमति वाली सूची में जोड़ें, ताकि उपयोगकर्ता के कंट्रोल वाली कैमरे की निजता सेटिंग चालू होने पर भी, उसे कैमरे का ऐक्सेस मिल सके.

CarEVSManager और CarEVSService

CarEVSManager, पहले Java ऐप्लिकेशन को कैमरे का ऐक्सेस देता था. Camera2 पर स्विच करने से, यह सुविधा standard android.hardware.camera2.CameraManager से बदल जाती है.

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

  • GEAR_SELECTION VHAL प्रॉपर्टी की निगरानी करें.
  • रिवर्स गियर चालू होने पर, पीछे के कैमरे का व्यू दिखाने वाली ऐक्टिविटी लॉन्च करें.
  • कैमरे का फ़ीड दिखाने के लिए, Camera2 API का इस्तेमाल करें.

डिसप्ले रेंडरिंग

ईवीएस डिसप्ले और ऑटोमोटिव डिसप्ले सेवा

ये अब काम नहीं करते हैं.

Camera2

Surface, android.hardware.display.DisplayManager, और android.view.Display के साथ Android के स्टैंडर्ड रेंडरिंग तरीकों का इस्तेमाल करें.

ऐसे मामलों में जहां कैमरे का डिसप्ले जल्दी चाहिए होता है वहां Camera2 ImageReader, हार्डवेयर बफ़र का सीधा ऐक्सेस दे सकता है. इससे, रेंडरिंग के लिए इसे DRM पर आधारित मौजूदा डिसप्ले के साथ इंटिग्रेट किया जा सकता है.

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

एम्युलेटर एचएएल (ईवीएस मॉक एचएएल)

हम EVS Mock HAL को बंद करने वाले हैं. इसके बजाय, ओईएम को Camera2 emulated camera HAL, hardware/google/camera/devices/EmulatedCamera/, का इस्तेमाल करना चाहिए. इसमें हम ये सुविधाएं उपलब्ध कराने का प्लान कर रहे हैं:

  • कॉन्फ़िगर किए जा सकने वाले कैमरों की संख्या.
  • कलर बार के टेस्ट पैटर्न.
  • वीडियो फ़ाइल का इम्यूलेशन.

इस HAL को बिल्ड में शामिल करने के लिए:

# In device.mk
PRODUCT_SOONG_NAMESPACES += hardware/google/camera/devices/EmulatedCamera
PRODUCT_PACKAGES += com.google.emulated.camera.provider.hal

cameraserver को Emulated Camera HAL सेवा के साथ इंटरैक्ट करने की अनुमति देने के लिए, सुरक्षा को बेहतर बनाने वाली Linux (SELinux) की सही नीतियां भी ज़रूरी हैं.

V4L2 यूवीसी कैमरा एचएएल

हम EVS V4L2 HAL को बंद करने वाले हैं. यूएसबी कैमरों (यूवीसी) के लिए, Camera2 के एक्सटर्नल कैमरे की सुविधा का इस्तेमाल करें. ज़्यादा जानने के लिए, बाहरी यूएसबी कैमरे देखें.

अल्ट्रासोनिक एपीआई

हम EVS Ultrasonics API को बंद करने वाले हैं. इसके बजाय, Android 15 में अल्ट्रासोनिक सेंसर का पता लगाने के लिए, VHAL की इन प्रॉपर्टी का इस्तेमाल करें.

प्रॉपर्टी टाइप परिभाषा
ULTRASONICS_SENSOR_POSITION स्टैटिक {<x>, <y>, <z>}

मिलीमीटर में, हर वैल्यू सेंसर की पोज़िशन को दिखाती है. यह पोज़िशन, AAOS सेंसर कोऑर्डिनेट फ़्रेम के हिसाब से, उससे जुड़े ऐक्सिस पर होती है.

ULTRASONICS_SENSOR_ORIENTATION स्टैटिक {<qw>, <qx>, <qy>, <qz>}

यह AAOS सेंसर कोऑर्डिनेट फ़्रेम के हिसाब से सेंसर का कौनसा क्वाटर्नियन रोटेशन है: $$w+xi+yj+zk$$

ULTRASONICS_SENSOR_FIELD_OF_VIEW स्टैटिक {<horizontal>, <vertical>}

डिग्री में, सेंसर का हॉरिज़ॉन्टल और वर्टिकल फ़ील्ड ऑफ़ व्यू.

ULTRASONICS_SENSOR_DETECTION_RANGE स्टैटिक {<minimum>, <maximum>}

मिलीमीटर में, सेंसर की पहचान करने की सीमा.

ULTRASONICS_SENSOR_DETECTION_RANGES स्टैटिक {<range_min_1>, <range_max_1>, <range_min_2>, <range_max_2>}

यह सेंसर की उन रेंज का कलेक्शन होता है जिनमें वह ऑब्जेक्ट का पता लगा सकता है. ये रेंज मिलीमीटर में होती हैं.

ULTRASONICS_SENSOR_DETECTION_RANGES निरंतर {<distance>, <distance_error>}

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