ক্যামেরা

অ্যান্ড্রয়েড ক্যামেরা HAL আইকন

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

স্থাপত্য

নিম্নোক্ত চিত্র ও তালিকাটিতে HAL-এর উপাদানগুলো বর্ণনা করা হয়েছে।

অ্যান্ড্রয়েড ক্যামেরা আর্কিটেকচার

চিত্র ১. ক্যামেরার গঠন

অ্যাপ ফ্রেমওয়ার্ক
অ্যাপ ফ্রেমওয়ার্ক লেভেলে অ্যাপটির কোড থাকে, যা ক্যামেরা হার্ডওয়্যারের সাথে ইন্টারঅ্যাক্ট করার জন্য ক্যামেরা ২ এপিআই (Camera 2 API) ব্যবহার করে। অভ্যন্তরীণভাবে, এই কোডটি ক্যামেরার সাথে ইন্টারঅ্যাক্টকারী নেটিভ কোড অ্যাক্সেস করার জন্য সংশ্লিষ্ট বাইন্ডার (Binder) ইন্টারফেসগুলোকে কল করে।
এআইডিএল
CameraService এর সাথে যুক্ত বাইন্ডার ইন্টারফেসটি frameworks/av/camera/aidl/android/hardware- এ পাওয়া যাবে। জেনারেটেড কোডটি ফিজিক্যাল ক্যামেরায় অ্যাক্সেস পাওয়ার জন্য নিম্ন স্তরের নেটিভ কোডকে কল করে এবং এমন ডেটা রিটার্ন করে যা ফ্রেমওয়ার্ক লেভেলে CameraDevice এবং অবশেষে CameraCaptureSession অবজেক্ট তৈরি করতে ব্যবহৃত হয়।
নেটিভ ফ্রেমওয়ার্ক
frameworks/av/ ফোল্ডারে অবস্থিত এই ফ্রেমওয়ার্কটি CameraDevice এবং CameraCaptureSession ক্লাসগুলোর একটি নেটিভ সমতুল্য রূপ প্রদান করে। আরও দেখুন NDK camera2 রেফারেন্স
বাইন্ডার আইপিসি ইন্টারফেস
আইপিসি বাইন্ডার ইন্টারফেস প্রসেস সীমানা জুড়ে যোগাযোগ সহজ করে। frameworks/av/camera/camera/aidl/android/hardware ডিরেক্টরিতে বেশ কয়েকটি ক্যামেরা বাইন্ডার ক্লাস রয়েছে যা ক্যামেরা সার্ভিসকে কল করে। ICameraService হলো ক্যামেরা সার্ভিসের ইন্টারফেস; ICameraDeviceUser হলো একটি নির্দিষ্ট খোলা ক্যামেরা ডিভাইসের ইন্টারফেস; এবং ICameraServiceListenerICameraDeviceCallbacks হলো যথাক্রমে অ্যাপ ফ্রেমওয়ার্কের জন্য CameraServiceCameraDevice কলব্যাক।
ক্যামেরা পরিষেবা
frameworks/av/services/camera/libcameraservice/CameraService.cpp এ অবস্থিত ক্যামেরা সার্ভিসটিই হলো সেই প্রকৃত কোড যা HAL-এর সাথে যোগাযোগ স্থাপন করে।
এইচএএল
হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার সেই স্ট্যান্ডার্ড ইন্টারফেসটি সংজ্ঞায়িত করে, যেটিকে ক্যামেরা সার্ভিস কল করে এবং আপনার ক্যামেরা হার্ডওয়্যার সঠিকভাবে কাজ করার জন্য আপনাকে অবশ্যই সেটি ইমপ্লিমেন্ট করতে হবে।

HAL বাস্তবায়ন করুন

HAL ক্যামেরা ড্রাইভার এবং উচ্চ-স্তরের অ্যান্ড্রয়েড ফ্রেমওয়ার্কের মধ্যে অবস্থান করে এবং এমন একটি ইন্টারফেস সংজ্ঞায়িত করে যা আপনাকে অবশ্যই ইমপ্লিমেন্ট করতে হবে, যাতে অ্যাপগুলো ক্যামেরা হার্ডওয়্যারটি সঠিকভাবে পরিচালনা করতে পারে। ক্যামেরা HAL-এর জন্য HIDL ইন্টারফেসগুলো hardware/interfaces/camera- এ সংজ্ঞায়িত করা আছে।

একটি আদর্শ বাইন্ডারাইজড HAL-কে অবশ্যই নিম্নলিখিত HIDL ইন্টারফেসগুলো বাস্তবায়ন করতে হবে:

  • ICameraProvider : স্বতন্ত্র ডিভাইসগুলোর তালিকা তৈরি এবং সেগুলোর অবস্থা ব্যবস্থাপনার জন্য।
  • ICameraDevice : ক্যামেরা ডিভাইস ইন্টারফেস।
  • ICameraDeviceSession : সক্রিয় ক্যামেরা ডিভাইস সেশন ইন্টারফেস।

CameraProvider.cpp , CameraDevice.cpp , এবং CameraDeviceSession.cpp এর জন্য রেফারেন্স HIDL ইমপ্লিমেন্টেশন পাওয়া যায়। এই ইমপ্লিমেন্টেশনটি সেইসব পুরোনো HAL-কে র‍্যাপ করে যেগুলো এখনও লিগ্যাসি API ব্যবহার করে। Android 8.0 থেকে শুরু করে, ক্যামেরা HAL ইমপ্লিমেন্টেশনগুলোকে অবশ্যই HIDL API ব্যবহার করতে হবে; লিগ্যাসি ইন্টারফেসের ব্যবহার সমর্থিত নয়।

ইনপুট যাচাইকরণ

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

লিগ্যাসি HAL উপাদান

এই বিভাগে লিগ্যাসি HAL কম্পোনেন্টগুলোর আর্কিটেকচার এবং কীভাবে HAL ইমপ্লিমেন্ট করতে হয় তা বর্ণনা করা হয়েছে। অ্যান্ড্রয়েড ৮.০ এবং তার পরবর্তী সংস্করণগুলোতে ক্যামেরা HAL ইমপ্লিমেন্টেশনের জন্য এর পরিবর্তে উপরে বর্ণিত HIDL API ব্যবহার করতে হবে।

স্থাপত্য (উত্তরাধিকার)

নিম্নলিখিত চিত্র এবং তালিকাটি লিগ্যাসি ক্যামেরা HAL উপাদানগুলো বর্ণনা করে।

অ্যান্ড্রয়েড ক্যামেরা আর্কিটেকচার

চিত্র ২. ঐতিহ্যবাহী ক্যামেরা স্থাপত্য

অ্যাপ ফ্রেমওয়ার্ক
অ্যাপ ফ্রেমওয়ার্ক লেভেলে অ্যাপের কোড থাকে, যা ক্যামেরা হার্ডওয়্যারের সাথে ইন্টারঅ্যাক্ট করার জন্য android.hardware.Camera API ব্যবহার করে। অভ্যন্তরীণভাবে, এই কোডটি ক্যামেরার সাথে ইন্টারঅ্যাক্টকারী নেটিভ কোড অ্যাক্সেস করার জন্য একটি সংশ্লিষ্ট JNI গ্লু ক্লাসকে কল করে।
জেএনআই
android.hardware.Camera এর সাথে সম্পর্কিত JNI কোডটি frameworks/base/core/jni/android_hardware_Camera.cpp এ অবস্থিত। এই কোডটি ফিজিক্যাল ক্যামেরায় অ্যাক্সেস পাওয়ার জন্য নিম্ন-স্তরের নেটিভ কোডকে কল করে এবং এমন ডেটা রিটার্ন করে যা ফ্রেমওয়ার্ক লেভেলে android.hardware.Camera অবজেক্টটি তৈরি করতে ব্যবহৃত হয়।
নেটিভ ফ্রেমওয়ার্ক
frameworks/av/camera/Camera.cpp এ সংজ্ঞায়িত নেটিভ ফ্রেমওয়ার্কটি android.hardware.Camera ক্লাসের একটি নেটিভ সমতুল্য প্রদান করে। এই ক্লাসটি ক্যামেরা পরিষেবাতে অ্যাক্সেস পাওয়ার জন্য আইপিসি বাইন্ডার প্রক্সিগুলোকে কল করে।
বাইন্ডার আইপিসি প্রক্সি
আইপিসি বাইন্ডার প্রক্সিগুলো প্রসেস সীমানা জুড়ে যোগাযোগ সহজ করে। frameworks/av/camera ডিরেক্টরিতে তিনটি ক্যামেরা বাইন্ডার ক্লাস রয়েছে যা ক্যামেরা সার্ভিসকে কল করে। ICameraService হলো ক্যামেরা সার্ভিসের ইন্টারফেস, ICamera হলো একটি নির্দিষ্ট খোলা ক্যামেরা ডিভাইসের ইন্টারফেস, এবং ICameraClient হলো অ্যাপ ফ্রেমওয়ার্কে ডিভাইসটির ইন্টারফেস।
ক্যামেরা পরিষেবা
frameworks/av/services/camera/libcameraservice/CameraService.cpp এ অবস্থিত ক্যামেরা সার্ভিসটিই হলো সেই প্রকৃত কোড যা HAL-এর সাথে যোগাযোগ স্থাপন করে।
এইচএএল
হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার সেই স্ট্যান্ডার্ড ইন্টারফেসটি সংজ্ঞায়িত করে, যেটিকে ক্যামেরা সার্ভিস কল করে এবং আপনার ক্যামেরা হার্ডওয়্যার সঠিকভাবে কাজ করার জন্য আপনাকে অবশ্যই সেটি ইমপ্লিমেন্ট করতে হবে।
কার্নেল ড্রাইভার
ক্যামেরার ড্রাইভারটি প্রকৃত ক্যামেরা হার্ডওয়্যার এবং আপনার HAL ইমপ্লিমেন্টেশনের সাথে ইন্টারঅ্যাক্ট করে। ডিসপ্লেতে ক্যামেরার ছবি প্রিভিউ করা এবং ভিডিও রেকর্ডিং সমর্থন করার জন্য ক্যামেরা এবং ড্রাইভার উভয়কেই YV12 এবং NV21 ইমেজ ফরম্যাট সমর্থন করতে হবে।

HAL (লেগ্যাসি) বাস্তবায়ন করুন

HAL ক্যামেরা ড্রাইভার এবং উচ্চ-স্তরের অ্যান্ড্রয়েড ফ্রেমওয়ার্কের মাঝে অবস্থান করে এবং এমন একটি ইন্টারফেস সংজ্ঞায়িত করে যা আপনাকে অবশ্যই ইমপ্লিমেন্ট করতে হবে, যাতে অ্যাপগুলো ক্যামেরা হার্ডওয়্যারটি সঠিকভাবে পরিচালনা করতে পারে। HAL ইন্টারফেসটি hardware/libhardware/include/hardware/camera.h এবং hardware/libhardware/include/hardware/camera_common.h হেডার ফাইলগুলোতে সংজ্ঞায়িত করা থাকে।

camera_common.h ফাইলটি camera_module সংজ্ঞায়িত করে, যা ক্যামেরা সম্পর্কে সাধারণ তথ্য, যেমন ক্যামেরা আইডি এবং সকল ক্যামেরার জন্য সাধারণ বৈশিষ্ট্য (অর্থাৎ, এটি সামনের না পেছনের ক্যামেরা) পাওয়ার জন্য একটি স্ট্যান্ডার্ড স্ট্রাকচার।

camera.h ফাইলে android.hardware.Camera সাথে সম্পর্কিত কোড রয়েছে। এই হেডার ফাইলটি একটি camera_device স্ট্রাকচার ঘোষণা করে, যার মধ্যে আবার একটি camera_device_ops স্ট্রাকচার থাকে। এই স্ট্রাকচারে HAL ইন্টারফেস বাস্তবায়নকারী ফাংশনগুলোর পয়েন্টার দেওয়া থাকে। ডেভেলপাররা ক্যামেরার যে প্যারামিটারগুলো সেট করতে পারেন, সে সম্পর্কিত ডকুমেন্টেশনের জন্য frameworks/av/include/camera/CameraParameters.h ফাইলটি দেখুন। HAL-এ int (*set_parameters)(struct camera_device *, const char *parms) দ্বারা নির্দেশিত ফাংশনটির মাধ্যমে এই প্যারামিটারগুলো সেট করা হয়।

HAL বাস্তবায়নের একটি উদাহরণের জন্য, hardware/ti/omap4xxx/camera এ থাকা Galaxy Nexus HAL-এর বাস্তবায়নটি দেখুন।

শেয়ার্ড লাইব্রেরি কনফিগার করুন

একটি Android.mk ফাইল তৈরি করে অ্যান্ড্রয়েড বিল্ড সিস্টেমকে এমনভাবে সেট আপ করুন যাতে এটি HAL ইমপ্লিমেন্টেশনকে একটি শেয়ার্ড লাইব্রেরিতে সঠিকভাবে প্যাকেজ করে এবং উপযুক্ত স্থানে কপি করে:

  1. আপনার লাইব্রেরির সোর্স ফাইলগুলো রাখার জন্য device/<company_name>/<device_name>/camera নামে একটি ডিরেক্টরি তৈরি করুন।
  2. শেয়ার্ড লাইব্রেরিটি বিল্ড করার জন্য একটি Android.mk ফাইল তৈরি করুন। নিশ্চিত করুন যে makefile-টিতে নিম্নলিখিত লাইনগুলো রয়েছে:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    আপনার লাইব্রেরির নাম অবশ্যই camera.<device_name> হতে হবে ( .so স্বয়ংক্রিয়ভাবে যুক্ত হয়ে যায়), যাতে অ্যান্ড্রয়েড লাইব্রেরিটি সঠিকভাবে লোড করতে পারে। একটি উদাহরণের জন্য, hardware/ti/omap4xxx/Android.mk এ অবস্থিত গ্যালাক্সি নেক্সাস ক্যামেরার মেকফাইলটি দেখুন।

  3. আপনার ডিভাইসে ক্যামেরা ফিচার আছে তা নির্দিষ্ট করতে, প্রয়োজনীয় ফিচার XML ফাইলগুলো আপনার ডিভাইসের মেকফাইলের সাথে frameworks/native/data/etc ডিরেক্টরিতে কপি করুন। উদাহরণস্বরূপ, আপনার ডিভাইসে ক্যামেরা ফ্ল্যাশ এবং অটোফোকাস করার সুবিধা আছে তা নির্দিষ্ট করতে, আপনার ডিভাইসের <device>/<company_name>/<device_name>/device.mk মেকফাইলে নিম্নলিখিত লাইনগুলো যোগ করুন:
    PRODUCT_COPY_FILES := \ ...
    
    PRODUCT_COPY_FILES += \
    frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:system/etc/permissions/android.hardware.camera.flash-autofocus.xml \
    

    ডিভাইস মেকফাইলের একটি উদাহরণের জন্য, device/samsung/tuna/device.mk দেখুন।

  4. আপনার ক্যামেরার মিডিয়া কোডেক, ফরম্যাট এবং রেজোলিউশনের সক্ষমতা device/<company_name>/<device_name>/media_profiles.xml এবং device/<company_name>/<device_name>/media_codecs.xml XML ফাইলগুলিতে ঘোষণা করুন। বিস্তারিত জানার জন্য, ফ্রেমওয়ার্কে কোডেক প্রকাশ করা দেখুন।
  5. media_profiles.xml এবং media_codecs.xml ফাইল দুটিকে যথাযথ স্থানে কপি করার জন্য আপনার ডিভাইসের device/<company_name>/<device_name>/device.mk makefile-এ নিম্নলিখিত লাইনগুলো যোগ করুন:
    # media config xml file
    PRODUCT_COPY_FILES += \
        <device>/<company>/<device>/media_profiles.xml:system/etc/media_profiles.xml
    
    # media codec config xml file
    PRODUCT_COPY_FILES += \
        <device>/<company>/<device>/media_codecs.xml:system/etc/media_codecs.xml
    
  6. আপনার ডিভাইসের সিস্টেম ইমেজে ক্যামেরা অ্যাপটি অন্তর্ভুক্ত করতে, আপনার ডিভাইসের device/<company>/<device>/device.mk মেকফাইলে PRODUCT_PACKAGES ভেরিয়েবলে এটি উল্লেখ করুন:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...