Android-এর ক্যামেরা হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL) আপনার অন্তর্নিহিত ক্যামেরা ড্রাইভার ও হার্ডওয়্যারের সাথে ক্যামেরা ২-এর উচ্চ-লেভেলের ক্যামেরা ফ্রেমওয়ার্ক API কানেক্ট করে। ক্যামেরা সাবসিস্টেমে ক্যামেরা পাইপলাইন কম্পোনেন্টের জন্য ইমপ্লিমেন্টেশন অন্তর্ভুক্ত থাকে, যেখানে ক্যামেরা HAL এইসব কম্পোনেন্টের আপনার ভার্সন ইমপ্লিমেন্ট করার জন্য ইন্টারফেস প্রদান করে।
স্থাপত্যশিল্প
নিচের ছবি ও তালিকায় HAL কম্পোনেন্ট বর্ণনা করা হয়েছে:
ছবি ১. ক্যামেরা আর্কিটেকচার।
- অ্যাপ ফ্রেমওয়ার্ক
- অ্যাপ ফ্রেমওয়ার্ক লেভেলে অ্যাপের কোড থাকে, যা ক্যামেরা হার্ডওয়্যারের সাথে ইন্টার্যাক্ট করার জন্য 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.hardware.CameraAPI ব্যবহার করে। ইন্টার্নালি, এই কোডটি ক্যামেরা সাথে ইন্টার্যাক্ট করা নেটিভ কোড অ্যাক্সেস করতে সংশ্লিষ্ট JNI গ্লু ক্লাসকে কল করে। - JNI
- এর সাথে যুক্ত JNI কোড
android.hardware.Cameraএখানে আছে:frameworks/base/core/jni/android_hardware_Camera.cpp. এই কোড ফিজিক্যাল ক্যামেরায় অ্যাক্সেস পাওয়ার জন্য লোয়ার-লেভেল নেটিভ কোডকে কল করে এবং এমন ডেটা রিটার্ন করে যা ফ্রেমওয়ার্ক লেভেলেandroid.hardware.Cameraঅবজেক্ট তৈরি করতে ব্যবহার করা হয়। - নেটিভ ফ্রেমওয়ার্ক
- নেটিভ ফ্রেমওয়ার্কে সংজ্ঞায়িত
frameworks/av/camera/Camera.cppandroid.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 বিল্ড সিস্টেম সেট-আপ করুন:
- আপনার লাইব্রেরির সোর্স ফাইল রাখার জন্য একটি
device/<company_name>/<device_name>/cameraডিরেক্টরি তৈরি করুন। - শেয়ার করা লাইব্রেরি তৈরি করতে
Android.mkফাইল তৈরি করুন। মেকফাইলে নিম্নলিখিত লাইনগুলি আছে কিনা তা নিশ্চিত করুন:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
আপনার লাইব্রেরির নাম অবশ্যই
camera.<device_name>হতে হবে (.soঅটোমেটিক যোগ করা হয়), যাতে Android সঠিকভাবে লাইব্রেরি লোড করতে পারে। উদাহরণস্বরূপ, Galaxy Nexus ক্যামেরার জন্য মেকফাইল দেখুন যাhardware/ti/omap4xxx/Android.mk-এ রয়েছে। - আপনার ডিভাইসের মেকফাইলে প্রয়োজনীয় ফিচার 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দেখুন। device/<company_name>/<device_name>/media_profiles.xmldevice/<company_name>/<device_name>/media_codecs.xmlXML ফাইলে আপনার ক্যামেরার মিডিয়া কোডেক, ফর্ম্যাট ও রেজোলিউশন সংক্রান্ত ক্ষমতা ঘোষণা করুন। আরও বিবরণের জন্য, ফ্রেমওয়ার্কে কোডেক এক্সপোজ করাদেখুন।- আপনার ডিভাইসের
device/<company_name>/<device_name>/device.mkmakefile এ নিম্নলিখিত লাইন যোগ করে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 - আপনার ডিভাইসের সিস্টেম ইমেজে ক্যামেরা অ্যাপ অন্তর্ভুক্ত করতে, আপনার ডিভাইসের
device/<company>/<device>/device.mkmakefile-এPRODUCT_PACKAGESভেরিয়েবলে এটি নির্দিষ্ট করুন:PRODUCT_PACKAGES := \ Gallery2 \ ...