অ্যান্ড্রয়েডে এমন কিছু ফিচার রয়েছে যা ক্যামেরা ক্লায়েন্টদের নির্দিষ্ট ব্যবহারের জন্য সর্বোত্তম ক্যামেরা স্ট্রিম বেছে নিতে এবং ক্যামেরা ডিভাইসটি নির্দিষ্ট কিছু স্ট্রিম কম্বিনেশন সমর্থন করে কিনা তা নিশ্চিত করতে সাহায্য করে। একটি স্ট্রিম কনফিগারেশন বলতে ক্যামেরা ডিভাইসে কনফিগার করা একটি একক ক্যামেরা স্ট্রিমকে বোঝায় এবং একটি স্ট্রিম কম্বিনেশন বলতে ক্যামেরা ডিভাইসে কনফিগার করা এক বা একাধিক স্ট্রিমের সেটকে বোঝায়। এই ফিচারগুলো সম্পর্কে আরও জানতে, প্রস্তাবিত স্ট্রিম কনফিগারেশন এবং ফিচার কম্বিনেশন কোয়েরি করার জন্য এপিআই (API) দেখুন।
রেফারেন্স বাস্তবায়ন
প্রস্তাবিত কনফিগারেশন স্ট্রিম এবং স্ট্রিম কম্বিনেশন ফিচারগুলো কোয়েরি করার এপিআই-এর একটি ভেন্ডর-সাইড রেফারেন্স ইমপ্লিমেন্টেশন রয়েছে। আপনি এই ইমপ্লিমেন্টেশনটি QCamera3HWI.cpp- তে খুঁজে পাবেন।
প্রস্তাবিত স্ট্রিম কনফিগারেশন
ক্যামেরা বিক্রেতারা নির্দিষ্ট ব্যবহারের ক্ষেত্রের জন্য ক্যামেরা ক্লায়েন্টদের কাছে প্রস্তাবিত স্ট্রিম কনফিগারেশনগুলো প্রচার করতে পারেন। এই প্রস্তাবিত স্ট্রিম কনফিগারেশনগুলো, যা StreamConfigurationMap- এর উপসেট, ক্যামেরা ক্লায়েন্টদের সর্বোত্তম কনফিগারেশন বেছে নিতে সাহায্য করতে পারে।
যদিও StreamConfigurationMap ক্যামেরা ক্লায়েন্টদেরকে স্ট্রিম কনফিগারেশনের বিস্তারিত তথ্য প্রদান করে, এটি একটি স্ট্রিমের পরিবর্তে অন্যটি বেছে নেওয়ার কার্যকারিতা, শক্তি খরচ বা পারফরম্যান্সের উপর প্রভাব সম্পর্কে কোনো তথ্য দেয় না। ক্যামেরা ক্লায়েন্টরা সম্ভাব্য সমস্ত স্ট্রিম কনফিগারেশন থেকে অবাধে বেছে নিতে পারে, কিন্তু অনেক ক্ষেত্রে এর ফলে ক্লায়েন্টরা নিম্নমানের ক্যামেরা কনফিগারেশন ব্যবহার করে এবং অ্যাপগুলোকে সময়সাপেক্ষ ও ব্যাপক অনুসন্ধান করতে হয়।
উদাহরণস্বরূপ, যদিও কিছু প্রক্রিয়াজাত YUV ফরম্যাটের প্রয়োজন হয় এবং সেগুলোর সাপোর্ট থাকা আবশ্যক, ক্যামেরা ডিভাইসটিতে সেই ফরম্যাটগুলোর জন্য নেটিভ সাপোর্ট নাও থাকতে পারে। এর ফলে ফরম্যাট রূপান্তরের জন্য একটি অতিরিক্ত প্রসেসিং ধাপের প্রয়োজন হয় এবং কার্যকারিতা কমে যায়। আকার এবং সংশ্লিষ্ট অ্যাসপেক্ট রেশিও-এরও একই রকম প্রভাব থাকতে পারে, যা শক্তি এবং পারফরম্যান্সের দিক থেকে নির্দিষ্ট মাপকে বেশি পছন্দনীয় করে তোলে।
আপনার প্রস্তাবিত স্ট্রিম কনফিগারেশন ম্যাপগুলোকে StreamConfigurationMap- এর তুলনায় সম্পূর্ণ হওয়ার প্রয়োজন নেই। প্রস্তাবিত কনফিগারেশন ম্যাপগুলোকে অবশ্যই ইমপ্লিমেন্টেশন সেকশনের শর্তাবলী অনুসরণ করতে হবে এবং এতে StreamConfigurationMap- এ থাকা যেকোনো উপলব্ধ ফরম্যাট, সাইজ বা অন্যান্য ভ্যালু অন্তর্ভুক্ত থাকতে পারে। StreamConfigurationMap-এ নেই এমন কোনো লুকানো ফরম্যাট, সাইজ বা অন্যান্য ভ্যালু প্রস্তাবিত স্ট্রিম কনফিগারেশন ম্যাপে অন্তর্ভুক্ত করা যাবে না।
প্রস্তাবিত স্ট্রিম কনফিগারেশনের উপর নির্ভর করে সমস্ত পরীক্ষা অপরিবর্তিত থাকে এবং সেগুলোতে কোনো শিথিলতা আনা হয় না।
ক্যামেরা বাস্তবায়ন দ্বারা প্রদত্ত প্রস্তাবিত স্ট্রিম কনফিগারেশনগুলো ঐচ্ছিক এবং ক্যামেরা ক্লায়েন্ট সেগুলো উপেক্ষা করতে পারে।
বাস্তবায়ন
এই ফিচারটি চালু করতে এই ধাপগুলো অনুসরণ করুন।
মেটাডেটা এন্ট্রি
এই বৈশিষ্ট্যটি সক্রিয় করতে ক্যামেরা HAL-কে অবশ্যই নিম্নলিখিত স্ট্যাটিক মেটাডেটা এন্ট্রিগুলি পূরণ করতে হবে:
android.scaler.availableRecommendedStreamConfigurations: নির্দিষ্ট ব্যবহারের ক্ষেত্রগুলির জন্য প্রস্তাবিত স্ট্রিম কনফিগারেশনের উপসেট। এই ডিক্লারেশনে[1 << PREVIEW | 1 << RECORD..]আকারে বিটম্যাপ ব্যবহার করে প্রস্তাবিত ব্যবহারের ক্ষেত্রগুলি নির্দেশ করা হয়। ব্যবহারের ক্ষেত্রগুলি সাধারণ (ফরম্যাট, প্রস্থ, উচ্চতা, ইনপুট) টাপলকে একটি অতিরিক্ত এন্ট্রি দিয়ে বর্ধিত করে। অস্তিত্বহীন পাবলিক ব্যবহারের ক্ষেত্র অথবা[PUBLIC_END, VENDOR_START]সীমার মধ্যে সেট করা অন্য কোনো বিট নিষিদ্ধ।এই তথ্যটি
availableRecommendedStreamConfigurationsমেটাডেটা ট্যাগে সংরক্ষিত থাকে।নিম্নলিখিত উদাহরণটি এমন একটি ক্যামেরা ডিভাইসের জন্য প্রস্তাবিত স্ট্রিম কনফিগারেশনের একটি অ্যারে দেখায়, যা শুধুমাত্র 4K এবং 1080p সমর্থন করে, যেখানে ভিডিও রেকর্ডিংয়ের জন্য উভয় রেজোলিউশনই পছন্দনীয় কিন্তু প্রিভিউয়ের জন্য কেবল 1080p প্রস্তাবিত।
[3840, 2160, HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, (1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_RECORD | 1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_SNAPSHOT | 1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_VIDEO_SNAPSHOT), 1920, 1080, HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, (1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_PREVIEW | 1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_RECORD | 1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_SNAPSHOT | 1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_VIDEO_SNAPSHOT)]android.depth.availableRecommendedDepthStreamConfigurations(শুধুমাত্র ডিভাইসে সমর্থিত হলেই উপলব্ধ): এই ক্যামেরা ডিভাইসের জন্য প্রস্তাবিত ডেপথ ডেটাস্পেস স্ট্রিম কনফিগারেশন। উপরের মেটাডেটা এন্ট্রির মতোই, একটি অতিরিক্ত ইউজ কেস বিটম্যাপ প্রস্তাবিত ব্যবহারের ক্ষেত্রগুলো নির্দেশ করে।এই তথ্যটি
availableRecommendedInputOutputFormatsMapমেটাডেটা ট্যাগে সংরক্ষিত থাকে।android.scaler.availableRecommendedInputOutputFormatsMap(শুধুমাত্র ডিভাইসে সমর্থিত হলেই উপলব্ধ): এই ক্যামেরা ডিভাইসের জন্য ইনপুট স্ট্রিমে প্রস্তাবিত ইমেজ ফরম্যাট এবং তাদের সংশ্লিষ্ট আউটপুট ফরম্যাটের ম্যাপিং।এই তথ্যটি
availableRecommendedDepthStreamConfigurationsমেটাডেটা ট্যাগে সংরক্ষিত থাকে।
এই তথ্যটি RecommendedStreamConfigurationMap API-এর মাধ্যমে ক্যামেরা ক্লায়েন্টদের কাছে উপলব্ধ।
প্রয়োজনীয় ব্যবহারের ক্ষেত্র
নিম্নলিখিত ব্যবহারের ক্ষেত্রগুলির জন্য প্রস্তাবিত স্ট্রিম কনফিগারেশন অবশ্যই প্রদান করতে হবে এবং সংশ্লিষ্ট প্রয়োজনীয়তাগুলি পূরণ করতে হবে:
| ব্যবহারের ক্ষেত্র | প্রয়োজনীয়তা |
|---|---|
PREVIEW | একটি প্রিভিউতে অবশ্যই শুধুমাত্র YUV_420_888 এবং IMPLEMENTATION_DEFINED এর মতো আউটপুট ফরম্যাটসহ নন-স্টলিং প্রসেসড স্ট্রিম কনফিগারেশন অন্তর্ভুক্ত থাকতে হবে। |
RECORD | একটি ভিডিও রেকর্ডে অবশ্যই IMPLEMENTATION_DEFINED ফরম্যাটের সাথে বিজ্ঞাপিত সমর্থিত মিডিয়া প্রোফাইলগুলোর সাথে মেলে এমন স্ট্রিম কনফিগারেশন অন্তর্ভুক্ত থাকতে হবে। |
VIDEO_SNAPSHOT | একটি ভিডিও স্ন্যাপশটে অবশ্যই এমন স্ট্রিম কনফিগারেশন অন্তর্ভুক্ত থাকতে হবে যা সর্বোচ্চ রেকর্ড রেজোলিউশনের সমান বা তার চেয়ে বড় এবং শুধুমাত্র BLOB + DATASPACE_JFIF ফরম্যাট/ডেটাস্পেস সংমিশ্রণ (JPEG) ব্যবহার করে। এই কনফিগারেশনগুলোর কারণে প্রিভিউতে কোনো ত্রুটি হওয়া উচিত নয় এবং এগুলো ৩০ এফপিএস-এ চলতে সক্ষম হতে হবে। |
SNAPSHOT | স্ন্যাপশট স্ট্রিম কনফিগারেশনে অবশ্যই android.sensor.info.activeArraySize এর কাছাকাছি আকারের অন্তত একটি স্ন্যাপশট অন্তর্ভুক্ত থাকতে হবে, যা BLOB + DATASPACE_JFIF ফরম্যাট/ডেটাস্পেস সংমিশ্রণে (JPEG) তৈরি। অ্যাস্পেক্ট রেশিও, অ্যালাইনমেন্ট এবং অন্যান্য ভেন্ডর-নির্দিষ্ট সীমাবদ্ধতা বিবেচনা করে, সর্বোচ্চ প্রস্তাবিত আকারের ক্ষেত্রফল সেন্সর অ্যারে আকারের ক্ষেত্রফলের ৯৭%-এর কম হওয়া উচিত নয়। |
ZSL (যদি সমর্থিত হয়) | ক্যামেরা ডিভাইস দ্বারা সমর্থিত হলে, প্রস্তাবিত ইনপুট স্ট্রিম কনফিগারেশনগুলো অবশ্যই অন্যান্য প্রক্রিয়াজাত বা স্টলিং আউটপুট ফরম্যাটের সাথে একত্রে বিজ্ঞাপিত করতে হবে। |
RAW (যদি সমর্থিত হয়) | ক্যামেরা ডিভাইস দ্বারা সমর্থিত হলে, প্রস্তাবিত র' স্ট্রিম কনফিগারেশনে শুধুমাত্র র' ভিত্তিক আউটপুট ফরম্যাট অন্তর্ভুক্ত থাকতে হবে। |
অন্যান্য ব্যবহারের ক্ষেত্র
আপনার বাস্তবায়নের জন্য নির্দিষ্ট ব্যবহারের ক্ষেত্রগুলোর জন্য আপনি অতিরিক্ত প্রস্তাবিত কনফিগারেশন স্ট্রিম প্রদান করতে পারেন।
বৈধতা
প্রস্তাবিত কনফিগারেশন স্ট্রিমগুলির আপনার বাস্তবায়ন পরীক্ষা করতে, নিম্নলিখিত CTS এবং VTS পরীক্ষাগুলি চালান:
ফিচার সংমিশ্রণ কোয়েরি করার জন্য এপিআই
অ্যান্ড্রয়েড ১৫ থেকে, অ্যান্ড্রয়েড প্ল্যাটফর্ম বিভিন্ন ফিচারের সমন্বয় সম্পর্কে জানার জন্য একটি এপিআই (API) প্রদান করে। এই এপিআই ক্যামেরা ক্লায়েন্টদেরকে জানতে সাহায্য করে যে, কোনো নির্দিষ্ট ফিচারের সমন্বয় ডিভাইসটি সমর্থন করতে পারবে কি না। এই এপিআইটি প্রয়োজনীয়, কারণ ক্যামেরা২ এপিআই (camera2 API) ৪কে (4k), ৬০এফপিএস (60fps), এইচডিআর (HDR) ভিডিও, আল্ট্রাএইচডিআর (UltraHDR), আল্ট্রাওয়াইড জুম (Ultrawide zoom), এবং স্ট্যাবিলাইজেশন (stabilization)-এর মতো বিভিন্ন ফিচারকে অর্থোগোনাল কন্ট্রোল (orthogonal controls) হিসেবে মডেল করে।
প্রয়োজনীয়তা
ফিচার কম্বিনেশন কোয়েরি করার জন্য এপিআই সমর্থন করতে, ক্যামেরা এইচএএল-কে অবশ্যই ICameraDevice ইন্টারফেসের ভার্সন ৩ ইমপ্লিমেন্ট করতে হবে। বিস্তারিত জানতে, ইমপ্লিমেন্টেশন সেকশনটি দেখুন।
যখন এপিআই সমর্থিত হয়, তখন প্রিভিউ স্ট্যাবিলাইজেশন অবশ্যই অন্যান্য ফিচার থেকে স্বতন্ত্র হতে হবে। এর মানে হলো, প্রিভিউ স্ট্যাবিলাইজেশন সমর্থনকারী একটি ক্যামেরা ডিভাইসের ক্ষেত্রে, কোনো নির্দিষ্ট কম্বিনেশনের জন্য isStreamCombinationWithSettingsSupported এর রিটার্ন ভ্যালুটি প্রিভিউ স্ট্যাবিলাইজেশন চালু বা বন্ধ থাকা অবস্থায় একই হতে হবে। এটি ফিচার কম্বিনেশন কোয়েরির জন্য সার্চ স্পেস কমিয়ে দেয়।
এছাড়াও, মিডিয়া পারফরম্যান্স ক্লাস ১৫-এর জন্য, প্রধান পেছনের ক্যামেরাটিতে অবশ্যই প্রিভিউ স্ট্যাবিলাইজেশন সাপোর্ট থাকতে হবে, যার সাথে 1080p ও 720p প্রিভিউ এবং সর্বোচ্চ আকারের JPEG-এর জন্য 10-বিট HLG10 প্রিভিউ অন্তর্ভুক্ত থাকবে। এই প্রয়োজনীয়তাগুলো সম্পর্কে আরও বিস্তারিত জানতে, অনুচ্ছেদ ২.২.৭.২. সিডিডি-এর ক্যামেরা দেখুন।
বাস্তবায়ন
ফিচার কম্বিনেশন কোয়েরি করার API সমর্থন করার জন্য, ICameraDevice এর ভার্সন ৩-এ নিম্নলিখিত ফিচার কম্বিনেশন কোয়েরি API-গুলো ইমপ্লিমেন্ট করুন:
constructDefaultRequestSettings: একটি নির্দিষ্টCaptureRequestটাইপের জন্য ডিফল্ট সেটিংস তৈরি করে। HAL,ICameraDeviceSession::constructDefaultRequestSettingsইমপ্লিমেন্টেশনটি ব্যবহার করতে পারে।isStreamCombinationWithSettingsSupported: সেশন প্যারামিটার এবং অতিরিক্তCaptureRequestকী-সহ একটি নির্দিষ্ট ক্যামেরা স্ট্রিম কম্বিনেশনের জন্য ডিভাইসের সাপোর্ট পরীক্ষা করে। সাপোর্টেড কম্বিনেশনের জন্য অবশ্যইtrueএবং আনসাপোর্টেড ফিচার কম্বিনেশনের জন্যfalseরিটার্ন করতে হবে। HAL,isStreamCombinationSupportedইমপ্লিমেন্টেশনটি ব্যবহার করতে পারে এবংsessionParamsএ পাস করাCaptureRequestসেটিংস পরীক্ষা করার জন্য সাপোর্ট যোগ করতে পারে।getSessionCharacteristics: সেশন প্যারামিটারসহ একটি সমর্থিত স্ট্রিম সংমিশ্রণ গ্রহণ করে এবং সেশন-নির্দিষ্ট বৈশিষ্ট্যগুলো ফেরত দেয়।INFO_SESSION_CONFIGURATION_QUERY_VERSION: সাধারণভাবে ব্যবহৃত সকল সেশন কনফিগারেশনের তালিকা দেখায়। এই কনফিগারেশনগুলো কমপ্লায়েন্স টেস্টিংয়ের মাধ্যমে যাচাই করা হয়।
ICameraDevice ইন্টারফেসের সংস্করণ ৩-এর চেয়ে নিম্নতর সংস্করণগুলোর জন্য, HAL-কে isStreamCombinationSupported মেথডটি ইমপ্লিমেন্ট করতে হবে।
এপিআই দ্বারা কোয়েরি করা ফিচার কম্বিনেশনগুলো সম্পর্কে আরও তথ্যের জন্য, system/media/camera/docs/metadata_definitions.xml এ থাকা sessionConfigurationQueryVersion এর ডকুমেন্টেশন দেখুন।
এই বৈশিষ্ট্যটির একটি আদর্শ বাস্তবায়নের জন্য, hardware/google/camera/devices/EmulatedCamera/hwl/ দেখুন।
পাবলিক এপিআই
অ্যাপগুলি ডিভাইসের জন্য সমর্থিত ফিচার সংমিশ্রণগুলি জানতে নিম্নলিখিত পাবলিক API গুলি ব্যবহার করতে পারে:
CameraDevice.CameraDeviceSetup:CameraDeviceএর একটি সীমিত রূপ যা একটিCameraDeviceইনস্ট্যান্সের প্রয়োজন ছাড়াই ফিচার সংমিশ্রণগুলি জিজ্ঞাসা করতে ব্যবহার করা যেতে পারে।getCameraDeviceSetup: যদিisCameraDeviceSetupSupportedtrueরিটার্ন করে, তাহলে প্রদত্ত ক্যামেরা আইডির জন্য একটিCameraDeviceSetupঅবজেক্ট সংগ্রহ করে।INFO_SESSION_CONFIGURATION_QUERY_VERSION: এই মানVANILLA_ICE_CREAMবা তার চেয়ে বেশি হলে ফিচার কম্বিনেশন কোয়েরি সমর্থন করে।OutputConfiguration: ক্যামেরা আউটপুট বর্ণনা করে এমন একটি ক্লাস, যা কম লেটেন্সির ফিচার কম্বিনেশন কোয়েরির উদ্দেশ্যে একটি ডিফার্ড সারফেস ধারণ করতে পারে।SessionConfiguration: একটি ইউটিলিটি ক্লাস যা সেশন কনফিগারেশন বর্ণনা করে, যার মধ্যে স্ট্রিম কম্বিনেশন এবং সেশন প্যারামিটার অন্তর্ভুক্ত থাকে, যা ফিচার কম্বিনেশন কোয়েরির জন্য ব্যবহার করা যেতে পারে।
বৈধতা
এই ফিচারটির বাস্তবায়ন যাচাই করতে, নিম্নলিখিত VTS, CTS, এবং Camera ITS (CTS Verifier) টেস্টগুলো ব্যবহার করুন:
ভিটিএস
সিটিএস
- cts/tests/camera/src/android/hardware/camera2/cts/FeatureCombinationTest.java
- cts/tests/camera/src/android/hardware/camera2/cts/CameraDeviceSetupTest.java
ক্যামেরা ITS