ক্যামেরা

Android Camera HAL আইকন

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

স্থাপত্যশিল্প

নিচের ছবি ও তালিকায় HAL কম্পোনেন্ট বর্ণনা করা হয়েছে:

Android ক্যামেরা আর্কিটেকচার

ছবি ১. ক্যামেরা আর্কিটেকচার।

অ্যাপ ফ্রেমওয়ার্ক
অ্যাপ ফ্রেমওয়ার্ক লেভেলে অ্যাপের কোড থাকে, যা ক্যামেরা হার্ডওয়্যারের সাথে ইন্টার‍্যাক্ট করার জন্য Camera 2 API ব্যবহার করে। অভ্যন্তরীণভাবে, এই কোড ক্যামেরার সাথে ইন্টার‍্যাক্ট করে এমন নেটিভ কোড অ্যাক্সেস করতে বাইন্ডার ইন্টারফেসের সাথে সংশ্লিষ্ট কোডকে কল করে।
AIDL
CameraService-এর সাথে যুক্ত বাইন্ডার ইন্টারফেস এখানে পাওয়া যাবে: frameworks/av/camera/aidl/android/hardware. জেনারেট করা কোডটি ফিজিক্যাল ক্যামেরায় অ্যাক্সেস পেতে লোয়ার লেভেল নেটিভ কোডকে কল করে এবং ডেটা রিটার্ন করে যা CameraDevice এবং অবশেষে ফ্রেমওয়ার্ক লেভেলে CameraCaptureSession অবজেক্ট তৈরি করতে ব্যবহার করা হয়।
নেটিভ ফ্রেমওয়ার্ক
frameworks/av/-এ থাকা এই ফ্রেমওয়ার্ক CameraDevice এবং CameraCaptureSession ক্লাসের নেটিভ সমতুল্য প্রদান করে। এছাড়াও দেখুন NDK camera2 রেফারেন্স।
বাইন্ডার IPC ইন্টারফেস
IPC বাইন্ডার ইন্টারফেস প্রসেস সীমার মধ্যে কমিউনিকেশন সহজ করে তোলে। frameworks/av/camera/camera/aidl/android/hardware ডিরেক্টরিতে একাধিক ক্যামেরা বাইন্ডার ক্লাস আছে যেগুলি ক্যামেরা পরিষেবাতে কল করে। ICameraService হল ক্যামেরা পরিষেবার ইন্টারফেস; ICameraDeviceUser হল কোনও নির্দিষ্ট খোলা ক্যামেরা ডিভাইসের ইন্টারফেস; এবং ICameraServiceListener ও ICameraDeviceCallbacks হল যথাক্রমে CameraService ও CameraDevice কলব্যাক যা অ্যাপ ফ্রেমওয়ার্কে পাঠানো হয়।
ক্যামেরা পরিষেবা
ক্যামেরা পরিষেবা, যা frameworks/av/services/camera/libcameraservice/CameraService.cpp-এ অবস্থিত, হল আসল কোড যা HAL-এর সাথে ইন্টার‍্যাক্ট করে।
HAL
হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার স্ট্যান্ডার্ড ইন্টারফেসকে সংজ্ঞায়িত করে যা ক্যামেরা পরিষেবা কল করে এবং আপনার ক্যামেরা হার্ডওয়্যার যাতে সঠিকভাবে কাজ করে তার জন্য আপনাকে অবশ্যই এটি প্রয়োগ করতে হবে।

HAL প্রয়োগ করা

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

সাধারণত বাইন্ডারাইজড HAL-কে নিম্নলিখিত HIDL ইন্টারফেস প্রয়োগ করতে হবে:

  • ICameraProvider: আলাদা আলাদা ডিভাইস গণনা করতে ও সেগুলির স্ট্যাটাস ম্যানেজ করতে।
  • ICameraDevice: ক্যামেরা ডিভাইস ইন্টারফেস।
  • ICameraDeviceSession: অ্যাক্টিভ ক্যামেরা ডিভাইস সেশন ইন্টারফেস।

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

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

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

পুরনো HAL

এই বিভাগে লেগ্যাসি HAL কম্পোনেন্টগুলির আর্কিটেকচার এবং কীভাবে HAL ইমপ্লিমেন্ট করতে হয় তা বর্ণনা করা হয়েছে। Android 8.0 এবং তার পরবর্তী যেকোনও ভার্সনে ক্যামেরা HAL ইমপ্লিমেন্টেশনে উপরে বর্ণিত HIDL API ব্যবহার করতে হবে।

স্থাপত্যশিল্প (পুরনো)

নিচের ছবি ও তালিকা থেকে পুরনো ক্যামেরা HAL কম্পোনেন্ট সম্পর্কে জানা যাবে:

Android ক্যামেরা আর্কিটেকচার

ছবি ২. পুরনো ক্যামেরা আর্কিটেকচার।

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

HAL (লিগ্যাসি) প্রয়োগ করা

HAL, ক্যামেরা ড্রাইভার ও উচ্চ-স্তরের Android ফ্রেমওয়ার্কের মধ্যে থাকে এবং এমন একটি ইন্টারফেস নির্ধারণ করে যা আপনাকে অবশ্যই প্রয়োগ করতে হবে যাতে অ্যাপ ক্যামেরা হার্ডওয়্যার সঠিকভাবে অপারেট করতে পারে। 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 struct ঘোষণা করে যা পরিবর্তে HAL ইন্টারফেস প্রয়োগ করে এমন ফাংশনে পয়েন্টার সহ একটি camera_device_ops struct থাকে। ক্যামেরা প্যারামিটার ডেভেলপারদের সেট করা সংক্রান্ত ডকুমেন্টেশনের জন্য, frameworks/av/include/camera/CameraParameters.h দেখুন। HAL-এ int (*set_parameters)(struct camera_device *, const char *parms) দ্বারা নির্দেশিত ফাংশনের সাথে এই প্যারামিটারগুলি সেট করা হয়।

HAL প্রয়োগের উদাহরণ হিসেবে, hardware/ti/omap4xxx/camera-এ Galaxy Nexus HAL-এর প্রয়োগ দেখুন।

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

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

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

    আপনার লাইব্রেরির নাম অবশ্যই camera.<device_name> হতে হবে (.so অটোমেটিক যোগ করা হয়), যাতে Android সঠিকভাবে লাইব্রেরি লোড করতে পারে। উদাহরণস্বরূপ, Galaxy Nexus ক্যামেরার জন্য মেকফাইল দেখুন যা 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. আপনার ডিভাইসের device/<company_name>/<device_name>/device.mk makefile এ নিম্নলিখিত লাইন যোগ করে media_profiles.xml এবং media_codecs.xml ফাইলগুলি সঠিক লোকেশনে কপি করুন:
    # 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 makefile-এ PRODUCT_PACKAGES ভেরিয়েবলে এটি নির্দিষ্ট করুন:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...