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

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

कैमरा खोलना और बंद करना

ईवीएस

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

Camera2

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

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

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

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

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

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

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

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

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 बनाने के लिए, CameraDevice.createCaptureRequest() के साथ TEMPLATE_PREVIEW का इस्तेमाल करें Java में या एनडीके पर ACameraDevice_createCaptureRequest().

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

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

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

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

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

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

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

  • Camera2 में, इनके बराबर की कोई सुविधा नहीं है. इसके बजाय, इन कामों के लिए:

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

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

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

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

कोड के ये सैंपल देखें:

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 में भी इसी तरह की सुविधा की ज़रूरत पड़ने पर, ऐप्लिकेशन को लॉजिकल कैमरों को मैनेज करना होगा. इसके लिए, आपको ये काम करने होंगे:

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

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

अनुमतियां

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

ईवीएस

ऐक्सेस, खास यूनीक आइडेंटिफ़ायर (यूआईडी) तक सीमित है. उदाहरण के लिए, 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 और इसके बाद के वर्शन), कैमरा ऐक्सेस करने वाले क्लाइंट की प्राथमिकता के आधार पर प्राइमरी क्लाइंट तय होता है. सबसे ज़्यादा प्राथमिकता वाला क्लाइंट (आम तौर पर, फ़ोरग्राउंड ऐप्लिकेशन), कैप्चर अनुरोध के पैरामीटर में बदलाव कर सकता है. प्राइमरी स्टेटस को लागू करने के लिए, सीधे तौर पर एपीआई का इस्तेमाल नहीं किया जाता. प्राइमरी स्टेटस को फ़्रेमवर्क मैनेज करता है.

सिस्टम कैमरे

किसी कैमरा डिवाइस को सिर्फ़ सिस्टम या पहले पक्ष के ऐप्लिकेशन से ऐक्सेस करने की अनुमति देने के लिए, उस डिवाइस के लिए 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, शुरुआती कैमरा ऐक्सेस के लिए, ईवीएस के जैसे ही परफ़ॉर्मेंस केपीआई को पूरा करता है. यह आम तौर पर, Android बूट होने के चार से छह सेकंड के अंदर उपलब्ध हो जाता है.

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

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

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

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

CarEVSManager और CarEVSService

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

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

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

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

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

इन्हें बंद किया जा रहा है.

Camera2

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

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

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

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

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

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

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

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

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

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

हम ईवीएस V4L2 एचएएल को बंद करने वाले हैं. यूएसबी कैमरों (यूवीसी) के लिए, Camera2 के बाहरी कैमरे की सहायता का इस्तेमाल करें. ज़्यादा जानने के लिए, बाहरी यूएसबी कैमरे लेख पढ़ें.

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

हम ईवीएस अल्ट्रासोनिक्स एपीआई को बंद करने वाले हैं. इसके बजाय, अल्ट्रासोनिक सेंसर की पहचान के लिए, 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>}

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