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

এই পৃষ্ঠায় এক্সটেন্ডেড ভিউ সিস্টেম (EVS) এবং ক্যামেরা২-এর মধ্যে পার্থক্যগুলো তুলে ধরা হয়েছে। এছাড়াও, আপনার ক্যামেরা২ ইমপ্লিমেন্টেশন কীভাবে সেট আপ করবেন, তাও বর্ণনা করা হয়েছে।

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

ইভিএস

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

ক্যামেরা২

ক্যামেরা২ দিয়ে কোনো ডিভাইস খুলতে ও বন্ধ করতে:

  1. এই মোডগুলির মধ্যে একটি বেছে নিন:

    • এক্সক্লুসিভ মোডের জন্য, Java-তে CameraManager.openCamera অথবা Native development kit (NDK)-তে ACameraManager_openCamera ব্যবহার করুন।

    • শেয়ার্ড মোডের জন্য openSharedCamera অথবা ACameraManager_openSharedCamera ব্যবহার করুন। ক্যামেরা শেয়ারিং চালু করার সময় একটি শেয়ার্ড সেশন কনফিগারেশন প্রদান করুন।

  2. স্ট্রিম কনফিগার করতে, প্রাসঙ্গিক আউটপুট সারফেস সহ একটি ক্যাপচার সেশন তৈরি করুন। উদাহরণস্বরূপ, একটি ImageReader বা SurfaceView থেকে CameraDevice.createCaptureSession() (Java) বা ACameraDevice_createCaptureSession() (NDK) ব্যবহার করে।

    ক্যামেরা২ একই সাথে একাধিক স্ট্রিম সমর্থন করে। প্রিভিউ, রেকর্ডিং এবং ইমেজ প্রসেসিং-এর মতো কাজের জন্য একাধিক স্ট্রিম তৈরি করুন। স্ট্রিমগুলো সমান্তরাল পাইপলাইন হিসেবে কাজ করে, যা ক্যামেরা থেকে আসা র ফ্রেমগুলোকে ক্রমানুসারে প্রসেস করে।

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

ক্যামেরা২

ক্যামেরা২-এ, প্রতি:

  1. প্রিভিউয়ের জন্য উপযুক্ত একটি CaptureRequest তৈরি করতে, জাভাতে CameraDevice.createCaptureRequest() এর সাথে TEMPLATE_PREVIEW ব্যবহার করুন অথবা NDK-তে ACameraDevice_createCaptureRequest() ব্যবহার করুন।

  2. ক্রমাগত স্ট্রিমিংয়ের জন্য অনুরোধ জমা দিতে, CameraCaptureSession.setSingleRepeatingRequest (Java) অথবা ACameraCaptureSession_setRepeatingRequestV2 (NDK) ব্যবহার করুন।

  3. স্ট্রিমিং বন্ধ করতে CameraCaptureSession.stopRepeating (Java) অথবা ACameraCaptureSession_stopRepeating (NDK) ব্যবহার করুন।

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

  • EVS-এ, setMaxFramesInFlight পূর্বে বাফার সংখ্যা নিয়ন্ত্রণ করত, যা স্ট্রিমিং চলাকালীন পরিবর্তন করা যেত। ক্যামেরা স্ট্রিমিং শুরু হলে, EVS প্রতিটি ইমেজ ফ্রেমের জন্য একটি বাফার আইডি প্রদান করত, যা মেমোরিতে থাকা একই হার্ডওয়্যার বাফার অ্যাড্রেসের সাথে সম্পর্কিত ছিল।

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

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

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

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

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

  • ক্যামেরা ক্যাপচার অনুরোধের প্যারামিটার পরিবর্তন করার জন্য EVS, setIntParameter এর মতো পদ্ধতি ব্যবহার করত।

  • ক্যামেরা২-এর প্যারামিটার পরিবর্তন করতে, CaptureRequest বিল্ডারের জন্য সেট এপিআই (set 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);

যৌক্তিক ক্যামেরা

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

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

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

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

অনুমতি

এই অংশে অনুমতির পরিবর্তনসমূহ বর্ণনা করা হয়েছে।

ইভিএস

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

ক্যামেরা২

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

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

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

  • android.permission.CAMERA_PRIVACY_ALLOWLIST : এটি OEM-দেরকে ব্যবহারকারী-নিয়ন্ত্রিত ক্যামেরা প্রাইভেসি টগল থেকে নির্দিষ্ট কিছু নিরাপত্তামূলক অ্যাপকে অব্যাহতি দেওয়ার অনুমতি দেয়।

নিরাপত্তাজনিত গুরুত্বপূর্ণ ক্যামেরা অ্যাপগুলোকে অবশ্যই 'ডিজাইন ফর ড্রাইভিং' -এ প্রদত্ত গুগলের অন্তর্নির্মিত প্রাক-অনুমোদন নীতিমালা অনুসরণ করতে হবে।

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

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

  • প্রাইমারি ক্লায়েন্টকে পরিচালনা করার জন্য EVS-এ setPrimaryClient এবং forcePrimaryClient মতো সুস্পষ্ট API ছিল, যেটির প্যারামিটার পরিবর্তন করার ক্ষমতা ছিল।

  • ক্যামেরা২, যখন ক্যামেরাটি শেয়ার্ড মোডে (অ্যান্ড্রয়েড ১৬ এবং তার উপরের সংস্করণ) খোলা হয়, তখন ক্যামেরা অ্যাক্সেসকারী ক্লায়েন্টের অগ্রাধিকারই প্রাথমিক ক্লায়েন্ট নির্ধারণ করে। সর্বোচ্চ অগ্রাধিকারপ্রাপ্ত ক্লায়েন্ট (সাধারণত ফোরগ্রাউন্ড অ্যাপ) ক্যাপচার অনুরোধের প্যারামিটার পরিবর্তন করতে পারে। প্রাথমিক অবস্থা জোর করে চালু করার জন্য কোনো সরাসরি এপিআই ব্যবহার করা হয় না। প্রাথমিক অবস্থা ফ্রেমওয়ার্ক দ্বারা পরিচালিত হয়।

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

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

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

ইভিএস

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

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

ক্যামেরা২

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

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

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

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

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

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

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

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

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

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

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

এগুলো অপ্রচলিত।

ক্যামেরা২

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

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

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

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

আমরা EVS Mock 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 এমুলেটেড ক্যামেরা এইচএএল সার্ভিসের সাথে যোগাযোগ করার অনুমতি দেওয়ার জন্য উপযুক্ত নিরাপত্তা-বর্ধিত লিনাক্স (এসইলিনাক্স) পলিসিও প্রয়োজন।

V4L2 UVC ক্যামেরা HAL

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

আল্ট্রাসনিক্স এপিআই

আমরা EVS আল্ট্রাসনিকস এপিআইগুলো অপ্রচলিত করার পরিকল্পনা করছি। এর পরিবর্তে, আল্ট্রাসনিক সেন্সর শনাক্তকরণের জন্য অ্যান্ড্রয়েড ১৫-এ প্রবর্তিত এই 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>}

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