Camera2 এ স্থানান্তর করুন

এই পৃষ্ঠাটি এক্সটেন্ডেড ভিউ সিস্টেম (EVS) এবং Camera2 এর মধ্যে পার্থক্য চিহ্নিত করে। এটি আপনার Camera2 বাস্তবায়ন কিভাবে সেট আপ করবেন তাও বর্ণনা করে।

ক্যামেরা খুলুন এবং বন্ধ করুন

ইভিএস

openCamera ডিভাইসটি খোলা এবং একটি একক স্ট্রীম কনফিগার করাকে একত্রিত করে।

ক্যামেরা2

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) ব্যবহার করুন।

এই নমুনা কোড স্নিপেট বিবেচনা করুন:

জাভা

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);

ক্যামেরা ডেটা স্ট্রিম করুন

এই বিভাগটি বর্ণনা করে কিভাবে ক্যামেরা ডেটা স্ট্রিম করতে হয়।

ইভিএস

EVS-এ, থেকে:

  1. স্ট্রিমিং শুরু করুন, startVideoStream ব্যবহার করুন।
  2. স্ট্রিমিং বন্ধ করুন, stopVideoStream ব্যবহার করুন।

ক্যামেরা2

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) ব্যবহার করুন।

বাফার ব্যবস্থাপনা

  • EVS-এ, setMaxFramesInFlight পূর্বে বাফার গণনা নিয়ন্ত্রিত করেছিল, যা সম্ভাব্য মধ্য-প্রবাহে পরিবর্তন করা যেতে পারে। ক্যামেরা স্ট্রিমিং শুরু হলে, EVS প্রতিটি ছবির ফ্রেমের জন্য একটি বাফার আইডি সজ্জিত করে, যা মেমরিতে একই হার্ডওয়্যার বাফার ঠিকানার সাথে সম্পর্কযুক্ত।

  • Camera2-এ, একটি AImageReader বা ImageReader জন্য সর্বাধিক সংখ্যক ছবি AImageReader_new বা ImageReader.newInstance দিয়ে সেট করা হয় যখন একটি সেশন শুরু হয়। একবার সেশন শুরু হয়ে গেলে এটি গতিশীলভাবে পরিবর্তন করা যাবে না। প্রতিটি ফ্রেমের জন্য একটি বাফার আইডি পেতে, ক্লায়েন্টরা একটি মানচিত্র বজায় রাখতে পারে যা হার্ডওয়্যার বাফার ঠিকানা, Image অবজেক্ট থেকে প্রাপ্ত, একটি অনন্য শনাক্তকারীর সাথে সম্পর্কযুক্ত।

বিরাম দিন এবং স্ট্রিমিং পুনরায় শুরু করুন

  • EVS pauseVideoStream ব্যবহার করে এবং resumeVideoStream

  • Camera2 এর কোনো সরাসরি সমতুল্য নেই। পরিবর্তে, এর জন্য:

ক্যামেরা প্যারামিটার

  • ক্যামেরা ক্যাপচার রিকোয়েস্ট প্যারামিটার পরিবর্তন করতে EVS পদ্ধতি ব্যবহার করেছে, যেমন setIntParameter

  • Camera2-তে, প্যারামিটারগুলি সংশোধন করতে, CaptureRequest নির্মাতার জন্য সেট API কল করুন এবং তারপরে এটি জমা দিন।

এই কোড নমুনা বিবেচনা করুন:

জাভা

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);

লজিক্যাল ক্যামেরা

  • EVS: লজিক্যাল ক্যামেরার জন্য, যেমন সার্রাউন্ড ভিউ, ইভিএস ম্যানেজার সমস্ত সংশ্লিষ্ট ফিজিক্যাল ক্যামেরা খুলেছেন, ভিডিও স্ট্রীম শুরু করেছেন এবং ছবিগুলির একটি সমন্বিত অ্যারে প্রদান করেছেন।

  • Camera2: যখন Camera2-এর সাথে একই ধরনের কার্যকারিতার প্রয়োজন হয়, তখন অ্যাপগুলিকে অবশ্যই লজিক্যাল ক্যামেরা পরিচালনা করতে হবে, যার জন্য আপনার প্রয়োজন:

    • লজিক্যাল ক্যামেরার সাথে যুক্ত ফিজিক্যাল সাব-ক্যামেরা শনাক্ত করুন।
    • প্রতিটি প্রয়োজনীয় শারীরিক ক্যামেরা খুলুন।
    • প্রতিটি ক্যামেরায় স্ট্রিম শুরু করুন।
    • ফ্রেম সিঙ্ক্রোনাইজ করুন, যদি প্রয়োজন হয়। সর্বোত্তমভাবে, এটি হার্ডওয়্যার-স্তরের সিঙ্ক্রোনাইজেশনের জন্য HAL-এ পরিচালনা করা হয়।

ট্রানজিশনের সুবিধার্থে আমরা বিদ্যমান EVS ক্লায়েন্টদের একটি সামঞ্জস্যপূর্ণ লাইব্রেরি (শিম লেয়ার) প্রদান করব। উদ্দেশ্য হচ্ছে কোডে ন্যূনতম পরিবর্তন সহ Camera2 API-কে সমর্থন করা।

অনুমতি

ইভিএস

প্রবেশাধিকার বিশেষাধিকারপ্রাপ্ত অনন্য শনাক্তকারী (UID) এ সীমাবদ্ধ। উদাহরণস্বরূপ, AID_AUTOMOTIVE_EVS । অপ্রচলিত অনুমতিগুলির মধ্যে রয়েছে android.car.permission.USE_CAR_EVS_CAMERA

ক্যামেরা2

Camera2 এর জন্য android.permission.CAMERA প্রয়োজন। বিশেষ ক্ষেত্রে:

  • android.permission.SYSTEM_CAMERA : 3P অ্যাপ থেকে লুকানো ক্যামেরা অ্যাক্সেস করতে। এছাড়াও CAMERA অনুমতি প্রয়োজন. আরও জানতে, সিস্টেম ক্যামেরা দেখুন।

  • android.permission.CAMERA_HEADLESS_SYSTEM_USER : User 0 থেকে অ্যাক্সেসের অনুমতি দেয়, রিয়ার ভিউ ক্যামেরার মতো পরিষেবার জন্য গুরুত্বপূর্ণ যা ব্যবহারকারীর সুইচ জুড়ে চলতে হবে। একটি পূর্ব-মঞ্জুর করা CAMERA অনুমতি প্রয়োজন৷

  • android.permission.CAMERA_PRIVACY_ALLOWLIST : OEM-কে ব্যবহারকারী-নিয়ন্ত্রিত ক্যামেরা গোপনীয়তা টগল থেকে কিছু নিরাপত্তা-সমালোচনা অ্যাপকে ছাড় দিতে দেয়।

নিরাপত্তা-সমালোচনামূলক ক্যামেরা অ্যাপ্লিকেশানগুলিকে অবশ্যই ড্রাইভিংয়ের জন্য ডিজাইনে প্রদত্ত Google বিল্ট-ইন প্রাক-অনুদান নীতিগুলি অনুসরণ করতে হবে৷

প্রাথমিক এবং মাধ্যমিক ক্লায়েন্ট

শেয়ার্ড ক্যামেরা অ্যাক্সেসের জন্য:

  • প্রাথমিক ক্লায়েন্ট পরিচালনা করার জন্য EVS সুস্পষ্ট APIs, setPrimaryClient এবং forcePrimaryClient অফার করেছে, যার পরামিতিগুলি পরিবর্তন করার ক্ষমতা ছিল।

  • Camera2, যখন ক্যামেরাটি শেয়ার্ড মোডে খোলা হয় (Android 16 এবং উচ্চতর), ক্যামেরা অ্যাক্সেস করার ক্লায়েন্টের অগ্রাধিকার প্রাথমিক ক্লায়েন্ট নির্ধারণ করে। সর্বোচ্চ অগ্রাধিকার ক্লায়েন্ট (সাধারণত ফোরগ্রাউন্ড অ্যাপ) ক্যাপচার রিকোয়েস্ট প্যারামিটার পরিবর্তন করতে পারে। প্রাথমিক স্থিতি জোর করতে কোনো সরাসরি API ব্যবহার করা হয় না। প্রাথমিক অবস্থা কাঠামো দ্বারা পরিচালিত হয়.

সিস্টেম ক্যামেরা

শুধুমাত্র সিস্টেম বা 1P অ্যাপের মাধ্যমে একটি ক্যামেরা ডিভাইস অ্যাক্সেস করা সীমাবদ্ধ করতে, সেই ডিভাইসের জন্য ক্যামেরা HAL-এ ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA ক্ষমতা ঘোষণা করুন। ক্লায়েন্টদের অবশ্যই android.permission.SYSTEM_CAMERA ছাড়াও android.permission.CAMERA এই ক্যামেরা ডিভাইসের সাথে কানেক্ট করতে হবে।

কেয়ারইভিএসম্যানেজার এবং কেয়ারইভিএসসার্ভিস

API অ্যাক্সেসের জন্য, Java অ্যাপগুলিকে CarEVSManager পরিবর্তে আদর্শ android.hardware.camera2.CameraManager ব্যবহার করা উচিত।

রিয়ার ভিউ ক্যামেরার জন্য, CarEVSService এর লজিক যা GEAR_SELECTION VHAL সম্পত্তি নিরীক্ষণ করে এবং একটি অ্যাক্টিভিটি চালু করে তা অবশ্যই একটি OEM-মালিকানাধীন অ্যাপে স্থানান্তরিত করা উচিত। এই অ্যাপ:

  • GEAR_SELECTION VHAL সম্পত্তি নিরীক্ষণ করে।
  • রিভার্স গিয়ার নিযুক্ত থাকা অবস্থায় রিয়ার ভিউ ক্যামেরা অ্যাক্টিভিটি চালু করে।
  • ক্যামেরা ফিড প্রদর্শন করতে Camera2 API ব্যবহার করে।

রিয়ার ভিউ ক্যামেরার সামঞ্জস্যপূর্ণ এবং বাধাবিহীন প্রদর্শনের জন্য, বিশেষত ব্যবহারকারীর ট্রানজিশনের সময় বা যখন অন্যান্য অ্যাপগুলি পূর্বরূপকে অস্পষ্ট করতে পারে, তখন Camera2 এর সাথে রিয়ার ভিউ ক্যামেরা কার্যকারিতা প্রয়োগ করার সময় আমরা এই নির্দেশিকাগুলির সুপারিশ করি:

প্রদর্শন রেন্ডারিং

ইভিএস ডিসপ্লে এবং স্বয়ংচালিত প্রদর্শন পরিষেবা।

এগুলো অবজ্ঞা করা হয়।

ক্যামেরা2

সারফেস, android.hardware.display.DisplayManager এবং android.view.Display সাথে স্ট্যান্ডার্ড অ্যান্ড্রয়েড রেন্ডারিং পদ্ধতি ব্যবহার করুন।

প্রারম্ভিক ক্যামেরা প্রদর্শনের প্রয়োজনের পরিস্থিতিতে, Camera2 ImageReader হার্ডওয়্যার বাফারে সরাসরি অ্যাক্সেস প্রদান করতে পারে যাতে আপনি রেন্ডারিংয়ের জন্য বিদ্যমান DRM-ভিত্তিক প্রদর্শন বাস্তবায়নের সাথে এটিকে একীভূত করতে পারেন।

এই প্রারম্ভিক ক্যামেরা অ্যাক্সেস একচেটিয়াভাবে বিশেষ সুবিধাপ্রাপ্ত ক্লায়েন্টদের জন্য অনুমোদিত যাদের AID_AUTOMOTIVE_EVS_UID আছে এবং এটি একটি গাড়ির বাইরের দিকে অবস্থিত সিস্টেম ক্যামেরাগুলির মধ্যে সীমাবদ্ধ৷

এমুলেটর HAL (EVS মক HAL)

আমরা ইভিএস মক এইচএএলকে অবমূল্যায়ন করার পরিকল্পনা করছি। পরিবর্তে, OEM-দের Camera2 এমুলেটেড ক্যামেরা 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 এমুলেটেড ক্যামেরা HAL পরিষেবার সাথে ইন্টারঅ্যাক্ট করার অনুমতি দেওয়ার জন্য উপযুক্ত সুরক্ষা-বর্ধিত Linux (SELinux) নীতিগুলিও প্রয়োজন৷

V4L2 UVC ক্যামেরা HAL

আমরা EVS V4L2 HAL বর্জন করার পরিকল্পনা করছি। USB ক্যামেরা (UVC) এর জন্য Camera2 বাহ্যিক ক্যামেরা সমর্থন ব্যবহার করুন। আরও জানতে, এক্সটার্নাল ইউএসবি ক্যামেরা দেখুন।

প্রারম্ভিক ক্যামেরা অ্যাক্সেস

EVS ক্যামেরা অ্যাক্সেস AID_AUTOMOTIVE_EVS UID সহ বিশেষাধিকারপ্রাপ্ত ক্লায়েন্টদের মধ্যে সীমাবদ্ধ ছিল। অ্যান্ড্রয়েড বুট প্রক্রিয়া সম্পূর্ণ হওয়ার আগে ক্যামেরা অ্যাক্সেসের জন্য, যদি UID থাকে AID_AUTOMOTIVE_EVS । যাইহোক, প্রারম্ভিক ক্যামেরা অ্যাক্সেস গাড়ির বাইরের দিকে অবস্থিত সিস্টেম ক্যামেরাগুলিতে সীমাবদ্ধ।

Ultrasonics APIs

আমরা EVS Ultrasonics APIs অবমূল্যায়ন করার পরিকল্পনা করছি। পরিবর্তে, অতিস্বনক সেন্সর সনাক্তকরণের জন্য 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>}

মিলিমিটারে, সেন্সরের মাপা দূরত্ব এবং দূরত্বের ত্রুটি। শুধুমাত্র একটি ব্যাপ্তি সমর্থিত হলে, এটি সনাক্ত করা পরিসরের সর্বনিম্ন দূরত্ব।