ক্যামেরা

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

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

স্থাপত্য

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

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

চিত্র 1. ক্যামেরা আর্কিটেকচার

অ্যাপ ফ্রেমওয়ার্ক
অ্যাপ ফ্রেমওয়ার্ক লেভেলে অ্যাপের কোড, যা ক্যামেরা হার্ডওয়্যারের সাথে ইন্টারঅ্যাক্ট করতে ক্যামেরা 2 API ব্যবহার করে। অভ্যন্তরীণভাবে, এই কোডটি ক্যামেরার সাথে ইন্টারঅ্যাক্ট করে এমন নেটিভ কোড অ্যাক্সেস করতে সংশ্লিষ্ট বাইন্ডার ইন্টারফেসকে কল করে।
এআইডিএল
CameraService এর সাথে যুক্ত বাইন্ডার ইন্টারফেস ফ্রেমওয়ার্ক/av/camera/aidl/android/hardware- এ পাওয়া যাবে। জেনারেট করা কোডটি ফিজিক্যাল ক্যামেরায় অ্যাক্সেস পেতে নিম্ন স্তরের নেটিভ কোডকে কল করে এবং ফ্রেমওয়ার্ক লেভেলে CameraDevice এবং অবশেষে CameraCaptureSession অবজেক্ট তৈরি করতে ব্যবহৃত ডেটা ফেরত দেয়।
নেটিভ ফ্রেমওয়ার্ক
frameworks/av/ এ থাকা এই ফ্রেমওয়ার্কটি CameraDevice এবং CameraCaptureSession ক্লাসের একটি নেটিভ সমতুল্য প্রদান করে। এছাড়াও NDK camera2 রেফারেন্স দেখুন।
বাইন্ডার আইপিসি ইন্টারফেস
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 ক্যামেরা ড্রাইভার এবং উচ্চ-স্তরের অ্যান্ড্রয়েড ফ্রেমওয়ার্কের মধ্যে বসে এবং একটি ইন্টারফেস সংজ্ঞায়িত করে যা আপনাকে অবশ্যই প্রয়োগ করতে হবে যাতে অ্যাপগুলি সঠিকভাবে ক্যামেরা হার্ডওয়্যার পরিচালনা করতে পারে। ক্যামেরা HAL-এর HIDL ইন্টারফেসগুলি হার্ডওয়্যার/ইন্টারফেস/ক্যামেরাতে সংজ্ঞায়িত করা হয়েছে।

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

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

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

ইনপুট বৈধতা

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

উত্তরাধিকার HAL উপাদান

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

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

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

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

চিত্র 2. লিগ্যাসি ক্যামেরা আর্কিটেকচার

অ্যাপ ফ্রেমওয়ার্ক
অ্যাপ ফ্রেমওয়ার্ক লেভেলে অ্যাপের কোড, যা ক্যামেরা হার্ডওয়্যারের সাথে ইন্টারঅ্যাক্ট করতে 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 ক্লাসের একটি নেটিভ সমতুল্য প্রদান করে। এই শ্রেণীটি ক্যামেরা পরিষেবায় অ্যাক্সেস পেতে IPC বাইন্ডার প্রক্সিগুলিকে কল করে৷
বাইন্ডার আইপিসি প্রক্সি
IPC বাইন্ডার প্রক্সিগুলি প্রক্রিয়ার সীমানার উপর যোগাযোগের সুবিধা দেয়। তিনটি ক্যামেরা বাইন্ডার ক্লাস রয়েছে যা frameworks/av/camera ডিরেক্টরিতে অবস্থিত যা ক্যামেরা পরিষেবাতে কল করে। ICameraService হল ক্যামেরা পরিষেবার ইন্টারফেস, ICamera হল একটি নির্দিষ্ট খোলা ক্যামেরা ডিভাইসের ইন্টারফেস, এবং ICameraClient হল অ্যাপ ফ্রেমওয়ার্কে ডিভাইসের ইন্টারফেস।
ক্যামেরা পরিষেবা
frameworks/av/services/camera/libcameraservice/CameraService.cpp এ অবস্থিত ক্যামেরা পরিষেবা হল আসল কোড যা HAL-এর সাথে যোগাযোগ করে।
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 স্ট্রাকট ঘোষণা করে যার ফলে HAL ইন্টারফেস বাস্তবায়নকারী ফাংশনগুলির পয়েন্টার সহ একটি camera_device_ops স্ট্রাকট রয়েছে। ক্যামেরা প্যারামিটারের ডকুমেন্টেশনের জন্য ডেভেলপাররা সেট করতে পারেন, 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 ফাইল তৈরি করে উপযুক্ত অবস্থানে অনুলিপি করুন:

  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 সঠিকভাবে লাইব্রেরি লোড করতে পারে। উদাহরণের জন্য, hardware/ti/omap4xxx/Android.mk এ অবস্থিত গ্যালাক্সি নেক্সাস ক্যামেরার মেকফাইলটি দেখুন।

  3. আপনার ডিভাইসের মেকফাইলের সাথে frameworks/native/data/etc ডিরেক্টরিতে প্রয়োজনীয় বৈশিষ্ট্য XML ফাইলগুলি অনুলিপি করে আপনার ডিভাইসে ক্যামেরা বৈশিষ্ট্য রয়েছে তা নির্দিষ্ট করুন। উদাহরণস্বরূপ, আপনার ডিভাইসে একটি ক্যামেরা ফ্ল্যাশ আছে এবং অটোফোকাস করতে পারে তা নির্দিষ্ট করতে আপনার ডিভাইসের <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 মেকফাইলে PRODUCT_PACKAGES ভেরিয়েবলে উল্লেখ করুন:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...