একাধিক ক্যামেরা কাজ করে

Android 9-এ একাধিক ক্যামেরা ডিভাইসের জন্য API কাজ করে। এটি নতুন লজিক্যাল ক্যামেরা ডিভাইসের মাধ্যমে করা হয়। এই ডিভাইসে একই দিকে পয়েন্ট করা দুই বা তার বেশি ফিজিক্যাল ক্যামেরা ডিভাইস থাকে। লজিক্যাল ক্যামেরা ডিভাইসটি একটি অ্যাপে একক CameraDevice/CaptureSession হিসেবে দেখানো হয় যা HAL-ইন্টিগ্রেটেড মাল্টি-ক্যামেরা ফিচারের সাথে ইন্টার‍্যাক্ট করার অনুমতি দেয়। অ্যাপগুলি ঐচ্ছিকভাবে আসল ক্যামেরা স্ট্রিম, মেটাডেটা ও কন্ট্রোল অ্যাক্সেস ও কন্ট্রোল করতে পারে।

একাধিক ক্যামেরা কাজ করে

ছবি ১. একাধিক ক্যামেরা কাজ করে

এই ডায়াগ্রামে, বিভিন্ন ক্যামেরা আইডি কালার কোড করা আছে। অ্যাপটি একই সময়ে প্রতিটি ফিজিক্যাল ক্যামেরা থেকে র বাফার স্ট্রিম করতে পারে। এছাড়াও, আলাদা আলাদা ফিজিক্যাল ক্যামেরার জন্য আলাদা কন্ট্রোল সেট করা এবং আলাদা মেটাডেটা পাওয়া সম্ভব।

উদাহরণ ও সোর্স

মাল্টি-ক্যামেরা ডিভাইস অবশ্যই লজিক্যাল মাল্টি-ক্যামেরা ক্ষমতা সহ বিজ্ঞাপন দিতে হবে।

কোনও নির্দিষ্ট লজিক্যাল ক্যামেরা যে ফিজিক্যাল ডিভাইস দিয়ে তৈরি, ক্যামেরা ক্লায়েন্ট getPhysicalCameraIds() কল করে সেটির ক্যামেরা আইডি কোয়েরি করতে পারে। ফলাফলের অংশ হিসেবে ফেরত আসা আইডিগুলি পরে setPhysicalCameraId()-এর মাধ্যমে আলাদা আলাদাভাবে ফিজিক্যাল ডিভাইস কন্ট্রোল করতে ব্যবহার করা হয়। এই ধরনের স্বতন্ত্র অনুরোধের ফলাফল সম্পূর্ণ ফলাফল থেকে getPhysicalCameraResults() ইনভোক করে কোয়েরি করা যেতে পারে।

ব্যক্তিগত ফিজিক্যাল ক্যামেরা অনুরোধে হয়ত শুধুমাত্র সীমিত সাবসেট প্যারামিটার কাজ করে। কাজ করে এমন প্যারামিটারের তালিকা পেতে, ডেভেলপাররা getAvailablePhysicalCameraRequestKeys() কল করতে পারেন।

ফিজিক্যাল ক্যামেরা স্ট্রিম শুধুমাত্র নন-রিপ্রসেসিং অনুরোধের জন্য এবং শুধুমাত্র মনোক্রোম ও বায়ার সেন্সরের জন্য কাজ করে।

প্রয়োগ

সহায়তা চেকলিস্ট

HAL-এর দিকে একাধিক লজিক্যাল ক্যামেরা ডিভাইস যোগ করতে:

  • দুই বা তার বেশি ফিজিক্যাল ক্যামেরা দ্বারা ব্যাক-আপ করা যেকোনও লজিক্যাল ক্যামেরা ডিভাইসের জন্য ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA ক্ষমতা যোগ করুন, যা কোনও অ্যাপের ক্ষেত্রেও প্রযোজ্য।
  • ফিজিক্যাল ক্যামেরা আইডির তালিকা দিয়ে স্ট্যাটিক ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS মেটাডেটা ফিল্ড পূরণ করুন।
  • ফিজিক্যাল ক্যামেরা স্ট্রিমের পিক্সেলের মধ্যে কোরিলেট করার জন্য প্রয়োজনীয় ডেপথ-সম্পর্কিত স্ট্যাটিক মেটাডেটা পূরণ করুন: ANDROID_LENS_POSE_ROTATION, ANDROID_LENS_POSE_TRANSLATION, ANDROID_LENS_INTRINSIC_CALIBRATION, ANDROID_LENS_DISTORTION, ANDROID_LENS_POSE_REFERENCE.
  • স্ট্যাটিক ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE মেটাডেটা ফিল্ডকে এগুলিতে সেট করুন:

  • আলাদা আলাদা ফিজিক্যাল ক্যামেরার জন্য কাজ করে এমন প্যারামিটারের তালিকা দিয়ে ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS ভরে দিন। লজিক্যাল ডিভাইস আলাদা আলাদা অনুরোধে কাজ না করলে তালিকাটি খালি থাকতে পারে।

  • আলাদা আলাদা অনুরোধ কাজ করলে, ক্যাপচার অনুরোধের অংশ হিসেবে আসা আলাদা আলাদা physicalCameraSettings প্রসেস ও প্রয়োগ করুন এবং সেই অনুযায়ী আলাদা আলাদা physicalCameraMetadata যোগ করুন।

  • Camera HAL ডিভাইস ভার্সন 3.5 (Android 10-এ চালু করা হয়েছে) বা এর পরের যেকোনও ভার্সনের জন্য, বর্তমান অ্যাক্টিভ ফিজিক্যাল ক্যামেরার ID ব্যবহার করে ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID result কী পূরণ করুন যা লজিক্যাল ক্যামেরাকে ব্যাক-আপ দেয়।

Android 9 ভার্সনে চলা ডিভাইসের ক্ষেত্রে, ক্যামেরা ডিভাইসকে অবশ্যই একই সাইজের (RAW স্ট্রিমের ক্ষেত্রে প্রযোজ্য নয়) এবং দুটি ফিজিক্যাল ক্যামেরা থেকে একই ফর্ম্যাটের ফিজিক্যাল স্ট্রিমের সাথে একটি লজিক্যাল YUV বা RAW স্ট্রিম প্রতিস্থাপন করার সুবিধা দিতে হবে। Android 10 ভার্সনে চলে এমন ডিভাইসের ক্ষেত্রে এটি প্রযোজ্য নয়।

Android 10-এ চলা ডিভাইসের ক্ষেত্রে, ক্যামেরা HAL ডিভাইস ভার্সন 3.5 বা তার বেশি হলে, ক্যামেরা ডিভাইসকে অবশ্যই isStreamCombinationSupported সাপোর্ট করতে হবে, যাতে অ্যাপগুলি কোয়েরি করতে পারে যে ফিজিক্যাল স্ট্রিম সহ কোনও নির্দিষ্ট স্ট্রিম কম্বিনেশন সাপোর্ট করা হয় কিনা।

স্ট্রিম কনফিগারেশন ম্যাপ

লজিক্যাল ক্যামেরার ক্ষেত্রে, নির্দিষ্ট হার্ডওয়্যার লেভেলের ক্যামেরা ডিভাইসের জন্য বাধ্যতামূলক স্ট্রিম কম্বিনেশন CameraDevice.createCaptureSession-এ যা প্রয়োজন তার সমান। স্ট্রিম কনফিগারেশন ম্যাপের সব স্ট্রিমকে লজিক্যাল স্ট্রিম হতে হবে।

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

RAW ক্যাপচার করার সময় ফিজিক্যাল সাব-ক্যামেরার মধ্যে পরিবর্তন করে HAL-ইমপ্লিমেন্টেড অপ্টিক্যাল জুমের সুবিধা নিতে হলে, অ্যাপগুলিকে অবশ্যই লজিক্যাল RAW স্ট্রিমের পরিবর্তে ফিজিক্যাল সাব-ক্যামেরা স্ট্রিম কনফিগার করতে হবে।

গ্যারেন্টিযুক্ত স্ট্রিম কম্বিনেশন

লজিক্যাল ক্যামেরা ও এর অন্তর্নিহিত ফিজিক্যাল ক্যামেরা, দু'টিকেই ডিভাইসের লেভেলের জন্য প্রয়োজনীয় বাধ্যতামূলক স্ট্রিম কম্বিনেশন নিশ্চিত করতে হবে।

লজিক্যাল ক্যামেরা ডিভাইসকে তার হার্ডওয়্যার লেভেল ও ক্ষমতা অনুযায়ী ফিজিক্যাল ক্যামেরা ডিভাইসের মতোই কাজ করতে হবে। এর ফিচার সেটকে স্বতন্ত্র ফিজিক্যাল ক্যামেরার ফিচার সেটের সুপারসেট হতে সাজেস্ট করা হয়।

Android 9-এ চলে এমন ডিভাইসে, প্রতিটি গ্যারান্টিযুক্ত স্ট্রিম কম্বিনেশনের জন্য, লজিক্যাল ক্যামেরাকে এগুলি অবশ্যই সাপোর্ট করতে হবে:

  • একটি লজিক্যাল YUV_420_888 বা র স্ট্রিমকে একই সাইজ ও ফর্ম্যাটের দুটি ফিজিক্যাল স্ট্রিম দিয়ে প্রতিস্থাপন করা, প্রতিটি আলাদা ফিজিক্যাল ক্যামেরা থেকে, যদি সাইজ ও ফর্ম্যাট ফিজিক্যাল ক্যামেরার সাথে কাজ করে।

  • দুটি র স্ট্রিম যোগ করা, প্রতিটি ফিজিক্যাল ক্যামেরা থেকে একটি করে, যদি লজিক্যাল ক্যামেরা র ক্যাপাবিলিটি বিজ্ঞাপন না করে, কিন্তু অন্তর্নিহিত ফিজিক্যাল ক্যামেরা করে। এটি সাধারণত তখনই ঘটে যখন ফিজিক্যাল ক্যামেরার সেন্সরের সাইজ আলাদা আলাদা হয়।

  • একই সাইজ ও ফর্ম্যাটের লজিক্যাল স্ট্রিমের পরিবর্তে ফিজিক্যাল স্ট্রিম ব্যবহার করা। ফিজিক্যাল ও লজিক্যাল স্ট্রিমের সর্বনিম্ন ফ্রেমের সময়সীমা একই হলে, ক্যাপচারের ফ্রেম রেট যেন কমে না যায়।

পারফর্ম্যান্স ও পাওয়ার সংক্রান্ত বিষয়

  • পারফর্ম্যান্স:

    • ফিজিক্যাল স্ট্রিম কনফিগার ও স্ট্রিম করলে, রিসোর্স সংক্রান্ত সীমাবদ্ধতার কারণে লজিক্যাল ক্যামেরার ক্যাপচার রেট কমে যেতে পারে।
    • আসল ক্যামেরা সেটিংস প্রয়োগ করলে, অন্তর্নিহিত ক্যামেরাগুলি আলাদা ফ্রেম রেটে সেট করা হলে, ক্যাপচার রেট কমে যেতে পারে।
  • পাওয়ার:

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

কাস্টমাইজেশন

আপনি নিম্নলিখিত উপায়ে নিজের ডিভাইসে প্রয়োগ করা কাস্টমাইজ করতে পারবেন।

  • লজিক্যাল ক্যামেরা ডিভাইসের ফিউজড আউটপুট সম্পূর্ণভাবে HAL ইমপ্লিমেন্টেশনের উপর নির্ভর করে। ফিজিক্যাল ক্যামেরা থেকে কীভাবে ফিউজ করা লজিক্যাল স্ট্রিম পাওয়া যায় সেই সিদ্ধান্ত অ্যাপ এবং Android ক্যামেরা ফ্রেমওয়ার্কের কাছে স্বচ্ছ।
  • ঐচ্ছিকভাবে স্বতন্ত্র ফিজিক্যাল অনুরোধ ও ফলাফলকে সমর্থন করা যেতে পারে। এই ধরনের অনুরোধে উপলভ্য প্যারামিটারের সেটও সম্পূর্ণভাবে নির্দিষ্ট HAL প্রয়োগের উপর নির্ভর করে।
  • Android 10 থেকে, HAL, getCameraIdList-এ কিছু বা সব PHYSICAL_ID বিজ্ঞাপন না করার সিদ্ধান্ত নিয়ে, কোনও অ্যাপের মাধ্যমে সরাসরি খোলা যেতে পারে এমন ক্যামেরার সংখ্যা কমাতে পারে। কলিং getPhysicalCameraCharacteristics অবশ্যই ফিজিক্যাল ক্যামেরার বৈশিষ্ট্য রিটার্ন করতে হবে।

যাচাইকরণ

লজিক্যাল মাল্টি-ক্যামেরা ডিভাইসকে অন্য যেকোনও সাধারণ ক্যামেরার মতো ক্যামেরা CTS পাস করতে হবে। এই ধরনের ডিভাইসকে টার্গেট করা টেস্ট কেসগুলি LogicalCameraDeviceTest মডিউলে পাওয়া যাবে।

এইসব ITS টেস্টের মাধ্যমে মাল্টি-ক্যামেরা সিস্টেমের উপর ফোকাস করা হয় যাতে ছবিগুলি সঠিকভাবে ফিউজ করা যায়:

ITS-in-a-box টেস্ট রিগের মাধ্যমে দৃশ্য ১ ও দৃশ্য ৪-এর টেস্ট রান করা হয়। test_multi_camera_match পরীক্ষাটি নিশ্চিত করে যে দুটি ক্যামেরা চালু থাকলে, ছবির কেন্দ্রের উজ্জ্বলতা একই থাকে। The test_multi_camera_alignment টেস্টে দাবি করা হয় যে ক্যামেরা স্পেসিং, ওরিয়েন্টেশন এবং ডিসটর্শন প্যারামিটার সঠিকভাবে লোড করা হয়েছে। মাল্টি-ক্যামেরা সিস্টেমে ওয়াইড FoV ক্যামেরা (>৯০o) থাকলে, ITS বক্সের rev2 ভার্সন প্রয়োজন।

Sensor_fusion হল দ্বিতীয় টেস্ট রিগ যা বারবার, নির্ধারিত ফোন মোশন চালু করে এবং নিশ্চিত করে যে জাইরোস্কোপ ও ইমেজ সেন্সর টাইমস্ট্যাম্প ম্যাচ করছে এবং মাল্টি-ক্যামেরা ফ্রেম সিঙ্ক করা আছে।

সব বক্স AcuSpec, Inc. (www.acuspecinc.com, fred@acuspecinc.com) এবং MYWAY Manufacturing (www.myway.tw, sales@myway.tw)-এর মাধ্যমে উপলভ্য। এছাড়াও, rev1 ITS বক্স West-Mark-এর মাধ্যমে কেনা যাবে (www.west-mark.com, dgoodman@west-mark.com)।

পেশাদার পদ্ধতি

অ্যাপের মানানসইতা বজায় রেখে মাল্টি-ক্যামেরার মাধ্যমে চালু করা ফিচারের সম্পূর্ণ সুবিধা নিতে, লজিক্যাল মাল্টি-ক্যামেরা ডিভাইস প্রয়োগ করার সময় এইসব পেশাদার পদ্ধতি অনুসরণ করুন:

  • (Android 10 বা তার পরবর্তী ভার্সন) getCameraIdList থেকে ফিজিক্যাল সাব-ক্যামেরা লুকান। এর ফলে, অ্যাপের মাধ্যমে সরাসরি খোলা যায় এমন ক্যামেরার সংখ্যা কমে যায়। এর ফলে, অ্যাপের ক্ষেত্রে জটিল ক্যামেরা বেছে নেওয়ার লজিকের প্রয়োজন হয় না।
  • (Android 11 বা তার পরবর্তী যেকোনও ভার্সন) অপটিক্যাল জুম কাজ করে এমন লজিক্যাল মাল্টি-ক্যামেরা ডিভাইসের জন্য, ANDROID_CONTROL_ZOOM_RATIO API প্রয়োগ করুন এবং শুধুমাত্র অ্যাস্পেক্ট রেশিও ক্রপ করার জন্য ANDROID_SCALER_CROP_REGION ব্যবহার করুন। ANDROID_CONTROL_ZOOM_RATIO ডিভাইসকে জুম-আউট করতে এবং আরও ভাল নির্ভুলতা বজায় রাখতে সাহায্য করে। এই ক্ষেত্রে, HAL-কে অবশ্যই ANDROID_SCALER_CROP_REGION, ANDROID_CONTROL_AE_REGIONS, ANDROID_CONTROL_AWB_REGIONS, ANDROID_CONTROL_AF_REGIONS, ANDROID_STATISTICS_FACE_RECTANGLES এবং ANDROID_STATISTICS_FACE_LANDMARKS-এর কোঅর্ডিনেট সিস্টেম অ্যাডজাস্ট করতে হবে যাতে পোস্ট-জুম ফিল্ড অফ ভিউকে সেন্সর অ্যাক্টিভ অ্যারে হিসেবে বিবেচনা করা যায়। কীভাবে ANDROID_SCALER_CROP_REGION ANDROID_CONTROL_ZOOM_RATIO-এর সাথে একসাথে কাজ করে, তা জানতে camera3_crop_reprocess#cropping দেখুন।
  • একাধিক ক্যামেরা সহ ডিভাইসের ক্ষেত্রে, আলাদা আলাদা ক্ষমতা সম্পন্ন ফিজিক্যাল ক্যামেরা থাকলে, নিশ্চিত করুন যে ডিভাইসটি কোনও নির্দিষ্ট ভ্যালু বা রেঞ্জের জন্য কন্ট্রোল সংক্রান্ত সহায়তা তখনই বিজ্ঞাপন দেয়, যখন সম্পূর্ণ জুম রেঞ্জ ভ্যালু বা রেঞ্জকে সাপোর্ট করে। যেমন, লজিক্যাল ক্যামেরা যদি একটি আল্ট্রাওয়াইড, একটি ওয়াইড ও একটি টেলিফটো ক্যামেরা দিয়ে তৈরি হয়, তাহলে এগুলি করুন:
    • ফিজিক্যাল ক্যামেরার অ্যাক্টিভ অ্যারে সাইজ আলাদা আলাদা হলে, ক্যামেরা HAL-কে অবশ্যই ANDROID_SCALER_CROP_REGION, ANDROID_CONTROL_AE_REGIONS, ANDROID_CONTROL_AWB_REGIONS, ANDROID_CONTROL_AF_REGIONS, ANDROID_STATISTICS_FACE_RECTANGLES, এবং ANDROID_STATISTICS_FACE_LANDMARKS-এর জন্য ফিজিক্যাল ক্যামেরার অ্যাক্টিভ অ্যারে থেকে লজিক্যাল ক্যামেরার অ্যাক্টিভ অ্যারেতে ম্যাপিং করতে হবে যাতে অ্যাপের দৃষ্টিকোণ থেকে, কোঅর্ডিনেট সিস্টেম হল লজিক্যাল ক্যামেরার অ্যাক্টিভ অ্যারে সাইজ।
    • ওয়াইড ও টেলিফটো ক্যামেরায় অটোফোকাস কাজ করলেও, আল্ট্রাওয়াইড ক্যামেরায় ফিক্সড ফোকাস থাকলে, লজিক্যাল ক্যামেরায় অটোফোকাস কাজ করে কিনা তা ভাল করে দেখে নিন। HAL-কে অবশ্যই আল্ট্রাওয়াইড ক্যামেরার জন্য একটি অটোফোকাস স্টেট মেশিন সিমুলেট করতে হবে যাতে অ্যাপটি আল্ট্রাওয়াইড লেন্সে জুম-আউট করলে, অন্তর্নিহিত ফিজিক্যাল ক্যামেরা যে ফিক্সড ফোকাস, সেই বিষয়টি অ্যাপের কাছে স্বচ্ছ থাকে এবং কাজ করে এমন AF মোডের জন্য অটোফোকাস স্টেট মেশিন প্রত্যাশিতভাবে কাজ করে।
    • ওয়াইড ও টেলিফটো ক্যামেরা 4K @ 60 fps-এ কাজ করলে এবং আল্ট্রাওয়াইড ক্যামেরা শুধু 4K @ 30 fps অথবা 1080p @ 60 fps-এ কাজ করলে, কিন্তু 4K @ 60 fps-এ কাজ না করলে, নিশ্চিত করুন যে লজিক্যাল ক্যামেরা তার কাজ করে এমন স্ট্রিম কনফিগারেশনে 4k @ 60 fps-এর বিজ্ঞাপন দেয় না। এটি লজিক্যাল ক্যামেরা ক্যাপাবিলিটির অখণ্ডতা নিশ্চিত করে, যার ফলে অ্যাপটি ১-এর কম ভ্যালুতে 4k @ 60 fps না পাওয়ার ANDROID_CONTROL_ZOOM_RATIO সমস্যায় পড়বে না।
  • Android 10 এবং তার পরবর্তী ভার্সনে, ফিজিক্যাল স্ট্রিম অন্তর্ভুক্ত করে এমন স্ট্রিম কম্বিনেশন সাপোর্ট করার জন্য লজিক্যাল মাল্টি-ক্যামেরার প্রয়োজন নেই। HAL-এ ফিজিক্যাল স্ট্রিমের সাথে কম্বিনেশন কাজ করলে:
    • (Android 11 বা তার পরের যেকোনও ভার্সন) স্টেরিও থেকে ডেপথ ও মোশন ট্র্যাকিংয়ের মতো ব্যবহার সংক্রান্ত কেস আরও ভালোভাবে ম্যানেজ করতে, হার্ডওয়্যারের মাধ্যমে যতটা সম্ভব পাওয়া যায়, ফিজিক্যাল স্ট্রিম আউটপুটের ফিল্ড অফ ভিউ ততটা বড় করুন। তবে, কোনও ফিজিক্যাল স্ট্রিম ও লজিক্যাল স্ট্রিম একই ফিজিক্যাল ক্যামেরা থেকে উৎপন্ন হলে, হার্ডওয়্যার সংক্রান্ত সীমাবদ্ধতার কারণে ফিজিক্যাল স্ট্রিমের ফিল্ড অফ ভিউ লজিক্যাল স্ট্রিমের মতোই হতে পারে।
    • একাধিক ফিজিক্যাল স্ট্রিমের কারণে মেমরি প্রেসার কমাতে, নিশ্চিত করুন যে অ্যাপগুলি ফ্রি বাফার (কনজিউমার রিলিজ করেছে, কিন্তু প্রযোজক এখনও ডিকিউ করেনি) ডিলোক করার জন্য discardFreeBuffers ব্যবহার করে যদি কোনও ফিজিক্যাল স্ট্রিম কিছু সময়ের জন্য নিষ্ক্রিয় থাকে।
    • সাধারণত, আলাদা আলাদা ফিজিক্যাল ক্যামেরা থেকে পাওয়া ফিজিক্যাল স্ট্রিম একই অনুরোধের সাথে অ্যাটাচ করা না থাকলে, অ্যাপ যাতে surface group ব্যবহার করে তা নিশ্চিত করুন যাতে দুটি অ্যাপ-ফেসিং সারফেসের জন্য একটি বাফার কিউ ব্যবহার করা যায়, এর ফলে মেমরি কম ব্যবহার হয়।