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
}

एनडीके

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

एनडीके

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

लॉजिकल कैमरे

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

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

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

हम मौजूदा 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 भी होना चाहिए.

CarEVSManager और CarEVSService

एपीआई ऐक्सेस करने के लिए, Java ऐप्लिकेशन को CarEVSManager के बजाय स्टैंडर्ड android.hardware.camera2.CameraManager का इस्तेमाल करना चाहिए.

रियर व्यू कैमरे के लिए, CarEVSService में मौजूद लॉजिक को OEM के मालिकाना हक वाले ऐप्लिकेशन में माइग्रेट करना ज़रूरी है. यह लॉजिक, GEAR_SELECTION VHAL प्रॉपर्टी को मॉनिटर करता है और गतिविधि लॉन्च करता है. इस ऐप्लिकेशन में ये सुविधाएं होनी चाहिए:

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

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

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

ईवीएस डिसप्ले और वाहन के डिसप्ले की सेवा.

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

Camera2

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

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

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

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

हम EVS Mock HAL को बंद करने वाले हैं. इसके बजाय, ओईएम को Camera2 इम्यूलेटेड कैमरा एचएएल, 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 के एक्सटर्नल कैमरे की सुविधा का इस्तेमाल करें. ज़्यादा जानने के लिए, बाहरी यूएसबी कैमरे देखें.

कैमरे का ऐक्सेस

ईवीएस कैमरे का ऐक्सेस, सिर्फ़ उन खास क्लाइंट के पास था जिनके पास AID_AUTOMOTIVE_EVS यूआईडी था. Android बूट प्रोसेस पूरी होने से पहले कैमरे का ऐक्सेस पाने के लिए, यह ज़रूरी है कि यूआईडी AID_AUTOMOTIVE_EVS रहे. हालांकि, कैमरे का ऐक्सेस सिर्फ़ उन सिस्टम कैमरों को मिलता है जो वाहन के बाहर लगे होते हैं.

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

हम 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>}

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