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 ছাড়াও এই ক্যামেরা ডিভাইসের সাথে সংযুক্ত থাকতে হবে।

রিয়ার ভিউ ক্যামেরা

ইভিএস

EVS পূর্বে অ্যান্ড্রয়েড বুট করার আগে ক্যামেরা অ্যাক্সেস সক্ষম করেছিল, রিয়ার ভিউ ক্যামেরার মতো বৈশিষ্ট্যগুলির জন্য একটি গুরুত্বপূর্ণ ঘটনা। ফেডারেল মোটর ভেহিকেল সেফটি স্ট্যান্ডার্ড (FMVSS), নং 111 রিয়ার ভিজিবিলিটি- তে প্রদত্ত প্রবিধানগুলির সাথে সম্মতি এবং শংসাপত্রের জন্য যানবাহন OEMগুলি দায়ী৷ উপরন্তু, গাড়ির OEM-কে অবশ্যই অন্যান্য রিয়ার ভিউ ক্যামেরার নিয়ম মেনে চলতে হবে।

সম্মতি হার্ডওয়্যার, HAL বাস্তবায়ন এবং সামগ্রিক সিস্টেম ইন্টিগ্রেশনের উপর নির্ভর করে। রেফারেন্স প্ল্যাটফর্মের একটি অ্যান্ড্রয়েড বুট করার পরে, ইভিএসকে সাধারণত চার থেকে ছয় সেকেন্ডের প্রয়োজন হয় চালু হতে এবং ক্যামেরা অ্যাক্সেস দেওয়ার জন্য।

ক্যামেরা2

AID_AUTOMOTIVE_EVS UID দ্বারা চিহ্নিত একটি সুবিধাপ্রাপ্ত ক্লায়েন্ট, Android বুট প্রক্রিয়া সম্পূর্ণ হওয়ার আগে ক্যামেরা অ্যাক্সেসের জন্য Camera2 API ব্যবহার করতে পারে। এই প্রারম্ভিক অ্যাক্সেস গাড়ির বাইরের সিস্টেম ক্যামেরাগুলিতে সীমাবদ্ধ। ক্যামেরা2 EVS-এর মতো প্রারম্ভিক ক্যামেরা অ্যাক্সেসের জন্য একই পারফরম্যান্স KPIs পূরণ করে, যা সাধারণত অ্যান্ড্রয়েড বুট হওয়ার চার থেকে ছয় সেকেন্ডের মধ্যে উপলব্ধ হয়ে যায়।

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

  1. থার্ড-পার্টি অ্যাপ অ্যাক্সেস সীমিত করতে রিয়ার ভিউ ক্যামেরাটিকে সিস্টেম ক্যামেরা হিসেবে মনোনীত করুন।

  2. CAMERA_HEADLESS_SYSTEM_USER অনুমতি ব্যবহার করার জন্য User 0 হিসাবে ক্যামেরা অ্যাক্সেস করার পরিষেবা বা অ্যাপ চালান৷ এটি নিরবচ্ছিন্ন ক্যামেরা স্ট্রিমিং নিশ্চিত করে, ফোরগ্রাউন্ড ব্যবহারকারী স্যুইচিং নির্বিশেষে।

  3. ব্যবহারকারী-নিয়ন্ত্রিত ক্যামেরা গোপনীয়তা টগল সক্ষম থাকা অবস্থায়ও ক্যামেরা অ্যাক্সেস মঞ্জুর করতে ক্যামেরা গোপনীয়তা অনুমোদনের তালিকায় অ্যাপটি যোগ করুন।

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

CarEVSManager পূর্বে ক্যামেরা অ্যাক্সেস সহ জাভা অ্যাপ্লিকেশন সরবরাহ করেছিল। Camera2-এ রূপান্তর এই বৈশিষ্ট্যটিকে standard android.hardware.camera2.CameraManager দিয়ে প্রতিস্থাপন করে।

আমরা CarEVSService বর্জন করার পরিকল্পনা করছি, একটি ঐচ্ছিক পরিষেবা যা GEAR_SELECTION VHAL সম্পত্তি নিরীক্ষণ করে এবং একটি OEM-নির্দিষ্ট রিয়ার ভিউ ক্যামেরা কার্যকলাপ শুরু করতে ব্যবহৃত হয়। যে OEMগুলি এই বৈশিষ্ট্যটি ব্যবহার করে তাদের অবশ্যই সংশ্লিষ্ট যুক্তিটিকে একটি OEM-মালিকানাধীন অ্যাপে স্থানান্তর করতে হবে৷

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

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

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

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

ক্যামেরা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 বাহ্যিক ক্যামেরা সমর্থন ব্যবহার করুন। আরও জানতে, এক্সটার্নাল ইউএসবি ক্যামেরা দেখুন।

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

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