OEM ভেন্ডর লাইব্রেরির প্রদান করা ক্যামেরা এক্সটেনশন ইন্টারফেসের মাধ্যমে ডিভাইস প্রস্তুতকারকরা থার্ড-পার্টি ডেভেলপারদের কাছে বোকে, নাইট মোড ও HDR-এর মতো এক্সটেনশন প্রকাশ করতে পারেন। OEM ভেন্ডর লাইব্রেরিতে প্রয়োগ করা এক্সটেনশন অ্যাক্সেস করতে, ডেভেলপাররা Camera2 Extensions API ও CameraX Extensions API ব্যবহার করতে পারবেন।
Camera2 ও CameraX জুড়ে একই ধরনের যেসব এক্সটেনশন কাজ করে, সেগুলির তালিকা দেখতে, CameraX Extensions API দেখুন। আপনি কোনও এক্সটেনশন যোগ করতে চাইলে, Issue Tracker-এর মাধ্যমে সমস্যা সম্পর্কে অভিযোগ জানান।
ডিভাইসে কীভাবে OEM ভেন্ডর লাইব্রেরি প্রয়োগ ও চালু করতে হয় তা এই পৃষ্ঠায় বর্ণনা করা হয়েছে।
স্থাপত্যশিল্প
নিম্নলিখিত ডায়াগ্রামটি Camera Extensions
ইন্টারফেস বা extensions-interface-এর আর্কিটেকচার বর্ণনা করে:
ছবি ১. ক্যামেরা এক্সটেনশন আর্কিটেকচার ডায়াগ্রাম
ডায়াগ্রামে দেখানো হয়েছে যে, ক্যামেরা এক্সটেনশন কাজ করানোর জন্য আপনাকে OEM ভেন্ডর লাইব্রেরির দেওয়া
extensions-interface প্রয়োগ করতে হবে। আপনার
OEM ভেন্ডর লাইব্রেরি দুটি API চালু করে:
CameraX এক্সটেনশন API এবং
Camera2 এক্সটেনশন API,
যেগুলি CameraX এবং Camera2 অ্যাপ যথাক্রমে
ভেন্ডর এক্সটেনশন অ্যাক্সেস করতে ব্যবহার করে।
OEM ভেন্ডর লাইব্রেরি প্রয়োগ করা
OEM ভেন্ডর লাইব্রেরি প্রয়োগ করতে, সিস্টেম লাইব্রেরি প্রোজেক্টে
camera-extensions-stub
ফাইল কপি করুন। এইসব ফাইল Camera Extensions
ইন্টারফেসকে সংজ্ঞায়িত করে।
camera-extensions-stub
ফাইলগুলিকে নিম্নলিখিত বিভাগে ভাগ করা হয়েছে:
অপরিহার্য ইন্টারফেস ফাইল (পরিবর্তন করবেন না)
PreviewExtenderImpl.javaImageCaptureExtenderImpl.javaExtenderStateListener.javaProcessorImpl.javaPreviewImageProcessorImpl.javaCaptureProcessorImpl.javaCaptureStageImpl.javaRequestUpdateProcessorImpl.javaProcessResultImpl.javaadvanced/AdvancedExtenderImpl.javaadvanced/Camera2OutputConfigImpl.javaadvanced/Camera2SessionConfigImpl.javaadvanced/ImageProcessorImpl.javaadvanced/ImageReaderOutputConfigImpl.javaadvanced/ImageReferenceImpl.javaadvanced/MultiResolutionImageReaderOutputConfigImpl.javaadvanced/OutputSurfaceImpl.javaadvanced/RequestProcessorImpl.javaadvanced/SessionProcessorImpl.javaadvanced/SurfaceOutputConfigImpl.java
বাধ্যতামূলক প্রয়োগ (আপনার প্রয়োগ যোগ করুন)
ExtensionVersionImpl.javaInitializerImpl.java
Bokeh এক্সটেন্ডার ক্লাস (Bokeh এক্সটেনশন কাজ করলে এটি প্রয়োগ করুন)
BokehImageCaptureExtenderImpl.javaBokehPreviewExtenderImpl.javaadvanced/BokehAdvancedExtenderImpl.java
নাইট এক্সটেন্ডার ক্লাস (নাইট এক্সটেনশন কাজ করলে এটি প্রয়োগ করুন)
NightImageCaptureExtenderImpl.javaNightPreviewExtenderImpl.javaadvanced/NightAdvancedExtenderImpl.java
অটো এক্সটেন্ডার ক্লাস (অটোমেটিক এক্সটেনশন কাজ করলে এটি প্রয়োগ করুন)
AutoImageCaptureExtenderImpl.javaAutoPreviewExtenderImpl.javaadvanced/AutoAdvancedExtenderImpl.java
HDR এক্সটেন্ডার ক্লাস (HDR এক্সটেনশন কাজ করলে এটি প্রয়োগ করুন)
HdrImageCaptureExtenderImpl.javaHdrPreviewExtenderImpl.javaadvanced/HdrAdvancedExtenderImpl.java
ফেস রিটাচ এক্সটেন্ডার ক্লাস (ফেস রিটাচ এক্সটেনশন কাজ করলে এটি প্রয়োগ করুন)
BeautyImageCaptureExtenderImpl.javaBeautyPreviewExtenderImpl.javaadvanced/BeautyAdvancedExtenderImpl.java
ইউটিলিটি (ঐচ্ছিক, মুছে দেওয়া যাবে)
advanced/Camera2OutputConfigImplBuilder.javaadvanced/Camera2SessionConfigImplBuilder.java
আপনাকে প্রতিটি এক্সটেনশনের জন্য ইমপ্লিমেন্টেশন প্রদান করতে হবে না। আপনি
কোনও এক্সটেনশন প্রয়োগ না করলে, false ফিরিয়ে আনতে isExtensionAvailable() সেট করুন অথবা
সংশ্লিষ্ট এক্সটেন্ডার ক্লাস সরিয়ে দিন। Camera2 এবং CameraX এক্সটেনশন
API অ্যাপকে জানায় যে এক্সটেনশনটি উপলভ্য নেই।
এক্সটেনশন চালু করতে Camera2 এবং CameraX এক্সটেনশন API কীভাবে ভেন্ডর লাইব্রেরির সাথে ইন্টার্যাক্ট করে তা দেখে নেওয়া যাক। নিচের ডায়াগ্রামে Night এক্সটেনশনকে উদাহরণ হিসেবে ব্যবহার করে এন্ড-টু-এন্ড ফ্লো দেখানো হয়েছে:
ছবি ২. নাইট এক্সটেনশন প্রয়োগ করা
ভার্সন যাচাইকরণ:
OEM-এর প্রয়োগ করা
extensions-interfaceভার্সন Camera2/X সাপোর্ট করা ভার্সনের সাথে মানানসই কিনা তা নিশ্চিত করতে Camera2/X কলExtensionVersionImpl.checkApiVersion()করা হয়।ভেন্ডর লাইব্রেরি ইনিশিয়ালাইজেশন:
InitializerImpl-এর একটি পদ্ধতিinit()আছে যা ভেন্ডর লাইব্রেরি শুরু করে। Extender ক্লাস অ্যাক্সেস করার আগে Camera2/X ইনিশিয়ালাইজেশন সম্পূর্ণ করে।এক্সটেন্ডার ক্লাস ইনস্ট্যান্টিয়েট করুন:
এক্সটেনশনের জন্য এক্সটেন্ডার ক্লাস ইনস্ট্যান্টিয়েট করে। দু'টি Extender টাইপ আছে: Basic Extender ও Advanced Extender. আপনাকে সব এক্সটেনশনের জন্য একটি এক্সটেন্ডার টাইপ প্রয়োগ করতে হবে। আরও তথ্যের জন্য, সাধারণ এক্সটেন্ডার বনাম উন্নত এক্সটেন্ডার দেখুন।
Camera2/X ইনস্ট্যান্টিয়েট করে এবং তথ্য ফিরিয়ে আনতে ও এক্সটেনশন চালু করতে Extender ক্লাসের সাথে ইন্টার্যাক্ট করে। কোনও নির্দিষ্ট এক্সটেনশনের জন্য, Camera2/X একাধিকবার এক্সটেন্ডার ক্লাস ইনস্ট্যানশিয়েট করতে পারে। ফলে, কনস্ট্রাক্টর বা
init()কলে ভারী ইনিশিয়ালাইজেশন করবেন না। ক্যামেরা সেশন শুরু হওয়ার ঠিক আগে, যেমন Basic Extender-এonInit()কল করা হলে অথবা Advanced Extender-এinitSession()কল করা হলে, তবেই ভারী কাজগুলি করুন।রাতের এক্সটেনশনের জন্য, নিম্নলিখিত এক্সটেন্ডার ক্লাসগুলি বেসিক এক্সটেন্ডার ধরনের জন্য ইনস্ট্যানশিয়েট করা হয়:
NightImageCaptureExtenderImpl.javaNightPreviewExtenderImpl.java
এবং উন্নত এক্সটেন্ডারের ধরনের জন্য:
NightAdvancedExtenderImpl.java
এক্সটেনশন উপলভ্য আছে কিনা তা চেক করুন:
এক্সটেনশন চালু করার আগে,
isExtensionAvailable()চেক করে দেখে যে এক্সটেন্ডার ইনস্ট্যান্সের মাধ্যমে নির্দিষ্ট ক্যামেরা আইডিতে এক্সটেনশন উপলভ্য আছে কিনা।ক্যামেরার তথ্য সহ এক্সটেন্ডার চালু করুন:
Camera2/X, এক্সটেন্ডার ইনস্ট্যান্সে
init()কল করে এবং এটিকে ক্যামেরা আইডি ওCameraCharacteristicsপাস করে।কোয়েরি সংক্রান্ত তথ্য:
এক্সটেনশন চালু করার প্রস্তুতি হিসেবে, এক্সটেন্ডার ক্লাসকে কল করে, এর থেকে এক্সটেনশন দ্বারা কাজ করে এমন রেজোলিউশন, এখনও ক্যাপচার করা আনুমানিক লেটেন্সি ও ক্যাপচার অনুরোধ কী-এর মতো তথ্য রিট্রিভ করে।
এক্সটেন্ডারে এক্সটেনশন চালু করুন:
Extender ক্লাস, ক্লাস চালু করার জন্য প্রয়োজনীয় সব ইন্টারফেস প্রদান করে। এটি Camera2 পাইপলাইনে OEM ইমপ্লিমেন্টেশন হুক করার একটি মেকানিজম অফার করে, যেমন ক্যাপচার রিকোয়েস্ট প্যারামিটার ইনজেক্ট করা বা পোস্ট প্রসেসর চালু করা।
উন্নত এক্সটেন্ডার ধরনের জন্য, Camera2/X এক্সটেনশন চালু করতে
SessionProcessorImpl-এর সাথে ইন্টার্যাক্ট করে। Camera2/X, Extender-এcreateSessionProcessor()কল করেSessionProcessorImplইনস্ট্যান্স রিট্রিভ করে।
নিচের বিভাগগুলিতে এক্সটেনশন ফ্লো সম্পর্কে আরও বিস্তারিত বিবরণ দেওয়া হয়েছে।
ভার্সন যাচাইকরণ
রানটাইমে ডিভাইস থেকে OEM ভেন্ডর লাইব্রেরি লোড করার সময়, Camera2/X
লাইব্রেরিটি extensions-interface ভার্সনের সাথে মানানসই কিনা তা যাচাই করে।
extensions-interface-এ সিম্যান্টিক ভার্সনিং বা
MAJOR.MINOR.PATCH ব্যবহার করা হয়, যেমন, ১.১.০ বা ১.২.০। তবে, ভার্সন যাচাইকরণের সময় শুধুমাত্র
মেজর ও মাইনর ভার্সন ব্যবহার করা হয়।
ভার্সন যাচাই করতে, Camera2/X কল
ExtensionVersionImpl.checkApiVersion() করে, এর সাথে কাজ করে এমন
extensions-interface ভার্সন। Camera2/X তারপর OEM লাইব্রেরির মাধ্যমে রিপোর্ট করা ভার্সন ব্যবহার করে নির্ধারণ করে যে এক্সটেনশন চালু করা যাবে কিনা এবং এটি কোন ক্ষমতাগুলি
প্রয়োগ করবে।
মেজর ভার্সন মানানসই
Camera2/X এবং ভেন্ডর লাইব্রেরির মধ্যে এক্সটেনশন-ইন্টারফেসের মেজর ভার্সন আলাদা হলে, সেটিকে মানানসই নয় হিসেবে বিবেচনা করা হয় এবং এক্সটেনশন বন্ধ করে দেওয়া হয়।
পুরনো ভার্সনের সাথে মানানসই
মেজর ভার্সন একই থাকলে, Camera2/X, পূর্ববর্তী extensions-interface ভার্সন দিয়ে তৈরি OEM ভেন্ডর লাইব্রেরির সাথে
ব্যাকওয়ার্ড কম্প্যাটিবিলিটি
নিশ্চিত করে। যেমন, Camera2/X যদি
extensions-interface 1.3.0 ভার্সনে কাজ করে, তাহলে OEM ভেন্ডর লাইব্রেরি যেগুলি 1.0.0,
1.1.0 এবং 1.2.0 ভার্সনে কাজ করে সেগুলি এখনও মানানসই। এর অর্থ হল, আপনি কোনও নির্দিষ্ট ভার্সনের ভেন্ডর লাইব্রেরি প্রয়োগ করার পরে, Camera2/X নিশ্চিত করে যে লাইব্রেরি
আসন্ন extension-interface ভার্সনের সাথে
ব্যাকওয়ার্ড-কম্প্যাটিবল।
ফরওয়ার্ড কম্প্যাটিবিলিটি
নতুন extensions-interface-এর ভেন্ডর লাইব্রেরির সাথে ফরওয়ার্ড কম্প্যাটিবিলিটি
আপনার উপর নির্ভর করে, OEM। এক্সটেনশন প্রয়োগ করার জন্য কিছু ফিচারের প্রয়োজন হলে,
আপনি নির্দিষ্ট কোনও ভার্সন থেকে এক্সটেনশন চালু করতে পারেন। এই
ক্ষেত্রে, Camera2/X লাইব্রেরি ভার্সন প্রয়োজনীয়তা পূরণ করলে, আপনি কাজ করে এমন extensions-interface ভার্সন ফেরত দিতে
পারবেন। Camera2/X ভার্সন
কাজ না করলে, এক্সটেনশন বন্ধ করতে
99.0.0-এর মতো মানানসই নয় এমন ভার্সন ফিরিয়ে দিতে পারেন।
ভেন্ডর লাইব্রেরি ইনিশিয়ালাইজেশন
OEM-এর প্রয়োগ করা extensions-interface ভার্সন
লাইব্রেরি যাচাই করার পরে, Camera2/X ইনিশিয়ালাইজেশন প্রসেস শুরু করে।
InitializerImpl.init() পদ্ধতিটি OEM লাইব্রেরিকে এই সিগন্যাল দেয় যে কোনও অ্যাপ এক্সটেনশন
ব্যবহার করার চেষ্টা করছে।
OEM ভেন্ডর লাইব্রেরি OnExtensionsInitializedCallback.onSuccess()-এ কল করে
ইনিশিয়ালাইজেশন সম্পূর্ণ হওয়ার কথা না জানানো পর্যন্ত
Camera2/X, OEM লাইব্রেরিতে আর কোনও কল করে না (ভার্সন চেক করা ছাড়া)।
আপনাকে অবশ্যই
InitializerImpl
extensions-interface 1.1.0 ভার্সন থেকে প্রয়োগ করতে হবে। OEM ভেন্ডর লাইব্রেরি extensions-interface 1.0.0 প্রয়োগ করলে Camera2/X লাইব্রেরি ইনিশিয়ালাইজেশন
স্টেপ এড়িয়ে যায়।
বেসিক এক্সটেন্ডার বনাম অ্যাডভান্সড এক্সটেন্ডার
extensions-interface প্রয়োগের দুটি ধরন আছে: প্রাথমিক এক্সটেন্ডার ও
উন্নত এক্সটেন্ডার। Advanced Extender
extensions-interface 1.2.0 ভার্সন থেকে কাজ করে।
যেসব এক্সটেনশন ক্যামেরা HAL-এ ছবি প্রসেস করে অথবা YUV স্ট্রিম প্রসেস করতে পারে এমন পোস্ট প্রসেসর ব্যবহার করে, সেগুলির জন্য Basic Extender প্রয়োগ করুন।
Camera2 স্ট্রিম কনফিগারেশন কাস্টমাইজ করতে এবং প্রয়োজন অনুযায়ী ক্যাপচার অনুরোধ পাঠাতে হবে এমন এক্সটেনশনের জন্য উন্নত এক্সটেন্ডার প্রয়োগ করুন।
তুলনা করার জন্য নিম্নলিখিত টেবিল দেখুন:
| বেসিক এক্সটেন্ডার | Advanced Extender | |
|---|---|---|
| স্ট্রিম কনফিগারেশন | সমাধান করা হয়েছে প্রিভিউ: PRIVATE বা YUV_420_888 (প্রসেসর থাকলে) স্টিল ক্যাপচার: JPEG বা YUV_420_888 (প্রসেসর থাকলে)
|
OEM-এর মাধ্যমে কাস্টমাইজ করা যায়। |
| ক্যাপচার করার অনুরোধ পাঠানো হচ্ছে | শুধুমাত্র Camera2/X ক্যাপচার করার অনুরোধ পাঠাতে পারে। আপনি এইসব অনুরোধের জন্য প্যারামিটার সেট করতে পারবেন। ইমেজ ক্যাপচারের জন্য প্রসেসর প্রদান করা হলে, Camera2/X একাধিক ক্যাপচারের অনুরোধ পাঠাতে পারে এবং সমস্ত ছবি ও ক্যাপচারের ফলাফল প্রসেসরে পাঠাতে পারে। | আপনাকে একটি RequestProcessorImpl ইনস্ট্যান্স প্রদান করা হয়েছে যা
camera2 ক্যাপচার অনুরোধ এক্সিকিউট করে এবং ফলাফল ও ছবি পায়।
Camera2/X |
| ক্যামেরা পাইপলাইনে হুক |
|
|
| এর জন্য উপযুক্ত | ক্যামেরা HAL বা প্রসেসরে এক্সটেনশন প্রয়োগ করা হয়েছে যা YUV ছবি প্রসেস করে। |
|
| কাজ করে এমন API ভার্সন | Camera2 এক্সটেনশন: Android 13 বা এর পরবর্তী যেকোনও ভার্সন CameraX এক্সটেনশন: camera-extensions 1.1.0 বা এর পরবর্তী যেকোনও ভার্সন |
Camera2 এক্সটেনশন: Android 12L বা এর পরবর্তী যেকোনও ভার্সন CameraX এক্সটেনশন: camera-extensions 1.2.0-alpha03 বা এর পরবর্তী যেকোনও ভার্সন |
অ্যাপ ফ্লো
নিচের সারণীতে তিন ধরনের অ্যাপ ফ্লো এবং সেগুলির অনুরূপ ক্যামেরা এক্সটেনশন API কল দেখানো হয়েছে। Camera2/X এই API প্রদান করলেও, এইসব ফ্লোতে সহায়তা করার জন্য আপনাকে ভেন্ডর লাইব্রেরি সঠিকভাবে প্রয়োগ করতে হবে, যা আমরা পরবর্তী বিভাগে আরও বিস্তারিতভাবে বর্ণনা করেছি।
| Camera2 এক্সটেনশন | CameraX এক্সটেনশন | |
|---|---|---|
| কোয়েরি এক্সটেনশনের উপলভ্যতা | CameraExtensionCharacteristics
.getSupportedExtensions
|
ExtensionsManager.
isExtensionAvailable
|
| কোয়েরি সংক্রান্ত তথ্য | CameraExtensionCharacteristics.
getExtensionSupportedSizes
CameraExtensionCharacteristics.
getEstimatedCaptureLatencyRangeMillis
CameraExtensionCharacteristics.
getAvailableCaptureRequestKeys
CameraExtensionCharacteristics.
getAvailableCaptureResultKeys
|
ExtensionsManager.
getEstimatedCaptureLatencyRange
লাইব্রেরির মধ্যে থাকা বাকি তথ্য CameraX ম্যানেজ করে। |
| এক্সটেনশন চালু করে প্রিভিউ ও স্টিল-ক্যাপচার করা | CameraDevice.
createExtensionSession
|
val cameraSelector = ExtensionsManager.
getExtensionEnabledCameraSelector
|
বেসিক এক্সটেন্ডার
বেসিক এক্সটেন্ডার ইন্টারফেস ক্যামেরা পাইপলাইনের বিভিন্ন জায়গায় হুক প্রদান করে। প্রতিটি এক্সটেনশন টাইপের সাথে সংশ্লিষ্ট এক্সটেন্ডার ক্লাস থাকে যা OEM-কে প্রয়োগ করতে হয়।
নিম্নলিখিত সারণীতে প্রতিটি এক্সটেনশনের জন্য OEM-কে যে Extender ক্লাস প্রয়োগ করতে হবে তার তালিকা দেওয়া হল:
| প্রয়োগ করার জন্য এক্সটেন্ডার ক্লাস | |
|---|---|
| রাত্রি | NightPreviewExtenderImpl.java
|
| HDR | HdrPreviewExtenderImpl.java
|
| অটোমেটিক | AutoPreviewExtenderImpl.java
|
| বোকেহ | BokehPreviewExtenderImpl.java
|
| ফেস রিটাচ | BeautyPreviewExtenderImpl.java
|
নিচের উদাহরণে আমরা PreviewExtenderImpl ও ImageCaptureExtenderImpl-কে প্লেসহোল্ডার হিসেবে ব্যবহার করেছি
। আপনি যে আসল ফাইল
ইমপ্লিমেন্ট করছেন, সেগুলির নাম দিয়ে এগুলি পরিবর্তন করুন।
বেসিক এক্সটেন্ডারের নিম্নলিখিত ক্ষমতা আছে:
CameraCaptureSession(onPresetSession) কনফিগার করার সময় সেশন প্যারামিটার ইনজেক্ট করুন।- ক্যাপচার সেশন শুরু ও শেষ হওয়ার ইভেন্ট সম্পর্কে আপনাকে বিজ্ঞপ্তি পাঠায় এবং ফিরে আসা প্যারামিটার (
onEnableSession,onDisableSession) সহ HAL-কে বিজ্ঞপ্তি পাঠানোর জন্য একটি অনুরোধ পাঠায়। - অনুরোধের জন্য ক্যাপচার প্যারামিটার ইনজেক্ট করুন
(
PreviewExtenderImpl.getCaptureStage,ImageCaptureExtenderImpl.getCaptureStages). - প্রিভিউ ও স্টিল ক্যাপচারের জন্য এমন প্রসেসর যোগ করুন যা
YUV_420_888স্ট্রিম প্রসেস করতে পারে।
আসুন দেখি, Camera2/X কীভাবে উপরে উল্লিখিত তিনটি
অ্যাপ ফ্লো পাওয়ার জন্য extensions-interface ইনভোক করে।
অ্যাপ ফ্লো ১: এক্সটেনশন উপলভ্য কিনা চেক করা
ছবি ৩. বেসিক এক্সটেন্ডারে অ্যাপ ফ্লো ১
এই ফ্লোতে, Camera2/X সরাসরি PreviewExtenderImpl এবং ImageCaptureExtenderImpl-এর isExtensionAvailable() মেথড কল করে,
init() কল না করেই। এক্সটেনশন চালু করতে দুটি Extender ক্লাসে true রিটার্ন করতে হবে।
এক্সটেনশন চালু করার আগে, প্রদত্ত ক্যামেরা আইডির জন্য প্রদত্ত এক্সটেনশন টাইপ কাজ করে কিনা তা চেক করার জন্য অ্যাপের ক্ষেত্রে এটিই প্রথম ধাপ। এর কারণ হল, কিছু এক্সটেনশন শুধুমাত্র নির্দিষ্ট ক্যামেরা আইডিতে কাজ করে।
অ্যাপ ফ্লো ২: কোয়েরি সংক্রান্ত তথ্য
ছবি ৪. Basic Extender-এ অ্যাপ ফ্লো ২
এক্সটেনশন উপলভ্য কিনা তা নির্ধারণ করার পরে, এক্সটেনশন চালু করার আগে অ্যাপগুলিকে নিম্নলিখিত তথ্য কোয়েরি করতে হবে।
স্টিল ক্যাপচার ল্যাটেন্সি রেঞ্জ:
ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRangeবর্তমান পরিস্থিতির জন্য এক্সটেনশন চালু করা উপযুক্ত কিনা তা মূল্যায়ন করার জন্য অ্যাপের ক্যাপচার ল্যাটেন্সির রেঞ্জ প্রদান করে।প্রিভিউ ও ক্যাপচার সারফেসের জন্য কাজ করে এমন সাইজ:
ImageCaptureExtenderImpl.getSupportedResolutionsএবংPreviewExtenderImpl.getSupportedResolutionsছবির ফর্ম্যাটের একটি তালিকা এবং সারফেস ফর্ম্যাট ও সাইজের জন্য কাজ করে এমন সাইজ প্রদান করে।কাজ করে এমন অনুরোধ ও ফলাফল কী: আপনার প্রয়োগ করা থেকে কাজ করে এমন ক্যাপচার অনুরোধ কী ও ফলাফল কী পেতে Camera2/X নিম্নলিখিত পদ্ধতি ব্যবহার করে:
ImageCaptureExtenderImpl.getAvailableCaptureRequestKeysImageCaptureExtenderImpl.getAvailableCapturetResultKeys
Camera2/X সবসময় আরও তথ্যের জন্য কোয়েরি করার আগে এইসব এক্সটেন্ডার ক্লাসে প্রথমে init()-কে কল করে।
অ্যাপ ফ্লো ৩: এক্সটেনশন চালু থাকা অবস্থায় প্রিভিউ/স্টিল ক্যাপচার (HAL ইমপ্লিমেন্টেশন)
ছবি ৫. Basic Extender-এ অ্যাপ ফ্লো ৩
উপরের ডায়াগ্রামে কোনও প্রসেসর ছাড়াই এক্সটেনশনের মাধ্যমে প্রিভিউ চালু করা এবং স্টিল ক্যাপচার করার মূল ফ্লো দেখানো হয়েছে। এর অর্থ হল ক্যামেরা HAL এক্সটেনশন প্রসেস করে।
এই ফ্লোতে, Camera2/X প্রথমে init() তারপরে onInit কল করে, যা আপনাকে
জানায় যে নির্দিষ্ট এক্সটেনশন সহ একটি ক্যামেরা সেশন শুরু হতে চলেছে।
আপনি onInit()-এ কঠিন কাজগুলি শুরু করতে পারেন।
CameraCaptureSession কনফিগার করার সময়, সেশন প্যারামিটার পেতে Camera2/X
onPresetSession-কে কল করে। ক্যাপচার সেশন
সফলভাবে কনফিগার করার পরে, Camera2/X onEnableSession ইনভোক করে যা ক্যাপচার প্যারামিটার সহ একটি
CaptureStageImpl
ইনস্ট্যান্স রিটার্ন করে। Camera2/X
এইসব ক্যাপচার প্যারামিটার সহ একটি অনুরোধ অবিলম্বে পাঠায় যাতে
HAL-কে বিজ্ঞপ্তি পাঠানো যায়। একইভাবে, ক্যাপচার সেশন বন্ধ করার আগে, Camera2/X
onDisableSession ইনভোক করে এবং তারপর রিটার্ন করা ক্যাপচার প্যারামিটার সহ
একটি অনুরোধ পাঠায়।
Camera2/X-এর মাধ্যমে ট্রিগার করা রিপিটিং অনুরোধে PreviewExtenderImpl.getCaptureStage()-এর
মাধ্যমে ফেরত দেওয়া অনুরোধের প্যারামিটার থাকে। এছাড়াও, স্টিল ক্যাপচার অনুরোধে
ImageCaptureExtenderImpl.getCaptureStages()-এর মাধ্যমে ফেরত পাঠানো প্যারামিটার থাকে।
অবশেষে, ক্যামেরা সেশন শেষ হওয়ার পরে Camera2/X onDeInit() চালু করে।
আপনি onDeinit()-এ রিসোর্স রিলিজ করতে পারবেন।
প্রিভিউ প্রসেসর
ক্যামেরা HAL ছাড়াও, আপনি প্রসেসরে এক্সটেনশন প্রয়োগ করতে পারবেন।
প্রসেসরের ধরন নির্দিষ্ট করতে PreviewExtenderImpl.getProcessorType প্রয়োগ করুন
যেমন নিচে ব্যাখ্যা করা হয়েছে:
PROCESSOR_TYPE_NONE: কোনও প্রসেসর নেই। ক্যামেরা HAL-এ ছবি প্রসেস করা হয়।PROCESSOR_TYPE_REQUEST_UPDATE_ONLY: প্রসেসর টাইপ আপনাকে লেটেস্টTotalCaptureResult-এর উপর ভিত্তি করে নতুন ক্যাপচার রিকোয়েস্ট প্যারামিটার সহ পুনরাবৃত্ত অনুরোধ আপডেট করতে দেয়।PreviewExtenderImpl.getProcessorঅবশ্যই এমন একটিRequestUpdateProcessorImplইনস্ট্যান্স রিটার্ন করতে হবে যাTotalCaptureResultইনস্ট্যান্স প্রসেস করে এবং রিপিটিং অনুরোধ আপডেট করার জন্য একটিCaptureStageImplইনস্ট্যান্স রিটার্ন করে।PreviewExtenderImpl.getCaptureStage()-এ প্রসেসিংয়ের ফলাফলও দেখানো উচিত এবং লেটেস্টCaptureStageImplফেরত দেওয়া উচিত।PROCESSOR_TYPE_IMAGE_PROCESSOR: এই ধরনের বিকল্প আপনাকেYUV_420_888ছবি প্রসেস করার জন্য একটি প্রসেসর প্রয়োগ করতে এবং আউটপুটকে একটিPRIVATEসারফেসে লিখতে দেয়।আপনাকে
PreviewExtenderImpl.getProcessor-এPreviewImageProcessorImplইনস্ট্যান্স প্রয়োগ করতে এবং ফেরত দিতে হবে।YUV_420_888ইনপুট ছবি প্রসেস করার দায়িত্ব প্রসেসরের। প্রিভিউয়েরPRIVATEফর্ম্যাটে আউটপুট লিখতে হবে। Camera2/X, প্রিভিউয়ের জন্যCameraCaptureSessionকনফিগার করতেPRIVATE-এর পরিবর্তেYUV_420_888সারফেস ব্যবহার করে।ফ্লো সম্পর্কে জানতে নিচের ছবি দেখুন:
ছবি ৬. PreviewImageProcessorImpl-এর সাথে ফ্লোয়ের প্রিভিউ দেখা
PreviewImageProcessorImpl ইন্টারফেসটি এক্সটেন্ড করা হয় ProcessImpl এবং এতে
তিনটি গুরুত্বপূর্ণ পদ্ধতি আছে:
onOutputSurface(Surface surface, int imageFormat)প্রসেসরের জন্য আউটপুট সারফেস সেট করে।PreviewImageProcessorImpl-এর জন্য,imageFormatহলPixelFormat.RGBA_8888-এর মতো একটি পিক্সেল ফর্ম্যাট।onResolutionUpdate(Size size)ইনপুট ছবির সাইজ সেট করে।onImageFormatUpdate(int imageFormat)ইনপুট ছবির ফর্ম্যাট সেট করে। বর্তমানে, এটি শুধুমাত্রYUV_420_888করা যাবে।
ছবি ক্যাপচার করার প্রসেসর
স্টিল ক্যাপচারের জন্য, আপনি ImageCaptureExtenderImpl.getCaptureProcessor ব্যবহার করে একটি
CaptureProcessorImpl
ইনস্ট্যান্স রিটার্ন করার মাধ্যমে একটি প্রসেসর প্রয়োগ করতে পারবেন। ক্যাপচার করা YUV_420_888 ছবি ও
TotalCaptureResult ইনস্ট্যান্সের তালিকা প্রসেস করা এবং YUV_420_888 সারফেসে আউটপুট লেখার জন্য
প্রসেসর দায়ী।
স্টিল ক্যাপচার অনুরোধ পাঠানোর আগে আপনি নিরাপদে ধরে নিতে পারেন যে প্রিভিউ চালু আছে এবং চলছে।
নিচের ডায়াগ্রামে ফ্লো দেখুন:
ছবি ৭. CaptureProcessorImpl-এর মাধ্যমে এখনও ফ্লো ক্যাপচার করা
ক্যাপচার সেশন কনফিগার করার জন্য স্থির ছবি ক্যাপচার করতে Camera2/X
YUV_420_888ফর্ম্যাট সারফেস ব্যবহার করে। Camera2/X,CaptureProcessorImpl-কে কল করে প্রস্তুত করে:YUV_420_888-এর সাথেCaptureProcessorImpl.onImageFormatUpdate()।- ইনপুট করা ছবির সাইজ সহ
CaptureProcessorImpl.onResolutionUpdate()। YUV_420_888সারফেস আউটপুট সহCaptureProcessorImpl.onOutputSurface()।
ImageCaptureExtenderImpl.getCaptureStagesCaptureStageImpl-এর একটি তালিকা রিটার্ন করে, যেখানে প্রতিটি এলিমেন্ট ক্যাপচার প্যারামিটার সহ একটিCaptureRequestইনস্ট্যান্সের সাথে ম্যাপ করে যা Camera2/X দ্বারা পাঠানো হয়। যেমন, এটি যদি তিনটিCaptureStageImplইনস্ট্যান্সের তালিকা রিটার্ন করে, তাহলে Camera2/XcaptureBurstAPI ব্যবহার করে সংশ্লিষ্ট ক্যাপচার প্যারামিটার সহ তিনটি ক্যাপচার অনুরোধ পাঠায়।প্রাপ্ত ছবি ও
TotalCaptureResultইনস্ট্যান্স একসাথে বান্ডেল করা হয় এবং প্রসেস করার জন্যCaptureProcessorImpl-এ পাঠানো হয়।CaptureProcessorImpl,onOutputSurface()কল দ্বারা নির্দিষ্ট করা আউটপুট সারফেসে ফলাফল ছবি (YUV_420_888ফর্ম্যাট) লেখে। প্রয়োজন হলে Camera2/X এটিকে JPEG ছবিতে কনভার্ট করে।
ক্যাপচার অনুরোধের 'কী' ও ফলাফল সংক্রান্ত সহায়তা
ক্যামেরা প্রিভিউ ও ক্যাপচার করা ছাড়াও, অ্যাপ জুম, ফ্ল্যাশ প্যারামিটার সেট করতে বা ট্যাপ-টু-ফোকাস ট্রিগার করতে পারে। এইসব প্যারামিটার আপনার এক্সটেনশন ইমপ্লিমেন্টেশনের সাথে মানানসই নাও হতে পারে।
আপনার ইমপ্লিমেন্টেশন যেসব প্যারামিটার সাপোর্ট করে সেগুলি প্রকাশ করার অনুমতি
আপনাকে দিতে extensions-interface 1.3.0-এ নিম্নলিখিত পদ্ধতি যোগ করা হয়েছে:
ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys()আপনার ইমপ্লিমেন্টেশনে কাজ করে এমন ক্যাপচার রিকোয়েস্ট কী রিটার্ন করে।ImageCaptureExtenderImpl.getAvailableCaptureResultKeys()ক্যাপচার ফলাফলে থাকা ক্যাপচার ফলাফল কী ফিরিয়ে দেয়।
ক্যামেরা HAL এক্সটেনশন প্রসেস করলে, Camera2/X ক্যাপচার
ফলাফল CameraCaptureSession.CaptureCallback-এ রিট্রিভ করে। তবে, প্রসেসর প্রয়োগ করা হলে, Camera2/X ProcessResultImpl
থেকে ক্যাপচার ফলাফল পায়, যা process()
মেথডে
PreviewImageProcessorImpl
এবং
CaptureProcessorImpl-এ পাস করা হয়।
ProcessResultImpl-এর মাধ্যমে Camera2/X-এ ক্যাপচার করা ফলাফল সম্পর্কে রিপোর্ট করার দায়িত্ব আপনার।
উদাহরণ হিসেবে নিচে CaptureProcessorImpl ইন্টারফেসের সংজ্ঞা দেখুন।
extensions-interface 1.3.0 বা তার পরবর্তী যেকোনও ভার্সনে, দ্বিতীয় process() কল ইনভোক করা হয়:
Interface CaptureProcessorImpl extends ProcessorImpl {
// invoked when extensions-interface version < 1.3.0
void process(Map<Integer, Pair<Image, TotalCaptureResult>> results);
// invoked when extensions-interface version >= 1.3.0
void process(Map<Integer, Pair<Image, TotalCaptureResult>> results,
ProcessResultImpl resultCallback, Executor executor);
}
জুম, ট্যাপ-টু-ফোকাস, ফ্ল্যাশ ও এক্সপোজার কম্পেনসেশনের মতো সাধারণ ক্যামেরা অপারেশনের জন্য, আমরা ক্যাপচার অনুরোধ ও ক্যাপচার ফলাফল, উভয়ের জন্যই নিম্নলিখিত 'কী' ব্যবহার করার সাজেশন দিই:
- জুম:
CaptureRequest#CONTROL_ZOOM_RATIOCaptureRequest#SCALER_CROP_REGION
- ট্যাপ-টু-ফোকাস:
CaptureRequest#CONTROL_AF_MODECaptureRequest#CONTROL_AF_TRIGGERCaptureRequest#CONTROL_AF_REGIONSCaptureRequest#CONTROL_AE_REGIONSCaptureRequest#CONTROL_AWB_REGIONS
- ফ্ল্যাশ:
CaptureRequest#CONTROL_AE_MODECaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGERCaptureRequest#FLASH_MODE
- এক্সপোজার কম্পেনসেশন:
CaptureRequest#CONTROL_AE_EXPOSURE_COMPENSATION
1.2.0 বা তার আগের ভার্সন প্রয়োগ করে এমন সাধারণ এক্সটেন্ডারের জন্য, CameraX
এক্সটেনশন API স্পষ্টভাবে উপরের সব কী কাজ করে।
extensions-interface 1.3.0-এর জন্য, CameraX ও Camera2 দু'টিই রিটার্ন করা তালিকা মেনে চলে
এবং এতে থাকা কীগুলিকেই শুধু সাপোর্ট করে। যেমন, আপনি যদি 1.3.0 ইমপ্লিমেন্টেশনে
শুধুমাত্র CaptureRequest#CONTROL_ZOOM_RATIO এবং
CaptureRequest#SCALER_CROP_REGION রিটার্ন করার সিদ্ধান্ত নেন, তাহলে এর অর্থ হল
অ্যাপের জন্য শুধুমাত্র জুম কাজ করে, তবে ট্যাপ-টু-ফোকাস, ফ্ল্যাশ ও এক্সপোজার
কম্পেনসেশন কাজ করে না।
উন্নত এক্সটেন্ডার
Advanced Extender হল Camera2 API-এর উপর ভিত্তি করে তৈরি করা এক ধরনের ভেন্ডর ইমপ্লিমেন্টেশন।
এই এক্সটেন্ডার ধরন extensions-interface 1.2.0-এ যোগ করা হয়েছে। ডিভাইস প্রস্তুতকারকের উপর নির্ভর করে, অ্যাপ লেয়ারে এক্সটেনশন প্রয়োগ করা হতে পারে,
যা নিম্নলিখিত বিষয়ের উপর নির্ভর করে:
কাস্টম স্ট্রিম কনফিগারেশন: RAW স্ট্রিমের মতো কাস্টম স্ট্রিম কনফিগার করুন অথবা আলাদা আলাদা ফিজিক্যাল ক্যামেরা আইডির জন্য একাধিক স্ট্রিম রাখুন।
Camera2 অনুরোধ পাঠানোর ক্ষমতা: জটিল ইন্টার্যাকশন লজিক কাজ করে যা আগের অনুরোধের ফলাফলের উপর ভিত্তি করে প্যারামিটার সহ ক্যাপচার অনুরোধ পাঠাতে পারে।
Advanced Extender একটি র্যাপার বা মধ্যবর্তী লেয়ার প্রদান করে, যাতে আপনি স্ট্রিম কনফিগারেশন কাস্টমাইজ করতে এবং চাহিদা অনুযায়ী ক্যাপচার অনুরোধ পাঠাতে পারেন।
প্রয়োগ করার জন্য ফাইল
উন্নত এক্সটেন্ডার প্রয়োগে পরিবর্তন করতে, isAdvancedExtenderImplemented() পদ্ধতিকে
ExtensionVersionImpl
অবশ্যই true রিটার্ন করতে হবে। প্রতিটি এক্সটেনশন ধরনের জন্য, OEM-কে সংশ্লিষ্ট
এক্সটেন্ডার ক্লাস প্রয়োগ করতে হবে। Advanced Extender ইমপ্লিমেন্টেশন ফাইলগুলি উন্নত প্যাকেজে
থাকে।
| প্রয়োগ করার জন্য এক্সটেন্ডার ক্লাস | |
|---|---|
| রাত | advanced/NightAdvancedExtenderImpl.java
|
| HDR | advanced/HdrAdvancedExtenderImpl.java
|
| অটোমেটিক | advanced/AutoAdvancedExtenderImpl.java
|
| বোকেহ | advanced/BokehAdvancedExtenderImpl.java
|
| ফেস রিটাচ | advanced/BeautyAdvancedExtenderImpl.java
|
নিচের উদাহরণে আমরা AdvancedExtenderImpl-কে প্লেসহোল্ডার হিসেবে ব্যবহার করেছি।
আপনি যে এক্সটেনশন প্রয়োগ করছেন সেটির Extender ফাইলের নাম দিয়ে এটি পরিবর্তন করুন।
তিনটি অ্যাপ ফ্লো সম্পূর্ণ করতে Camera2/X কীভাবে extensions-interface-কে কল করে তা দেখা যাক।
অ্যাপ ফ্লো ১: এক্সটেনশনের উপলভ্যতা চেক করা
ছবি ৮. Advanced Extender-এ অ্যাপ ফ্লো ১
প্রথমে, অ্যাপ চেক করে দেখে যে প্রদত্ত এক্সটেনশন কাজ করে কিনা।
অ্যাপ ফ্লো ২: কোয়েরি সংক্রান্ত তথ্য
ছবি ৯. Advanced Extender-এ অ্যাপ ফ্লো ২
AdvancedExtenderImpl.init()-কে কল করার পরে, অ্যাপটি AdvancedExtenderImpl-এ থাকা
নিম্নলিখিত তথ্য সম্পর্কে কোয়েরি করতে পারে:
স্টিল ক্যাপচার ল্যাটেন্সি সংক্রান্ত আনুমানিক তথ্য:
AdvancedExtenderImpl.getEstimatedCaptureLatencyRange()বর্তমান পরিস্থিতির জন্য এক্সটেনশন চালু করা উপযুক্ত কিনা তা মূল্যায়ন করতে অ্যাপের ক্যাপচার ল্যাটেন্সির রেঞ্জ প্রদান করে।প্রিভিউ ও স্টিল ক্যাপচারের জন্য কাজ করে এমন রেজোলিউশন:
AdvancedExtenderImpl.getSupportedPreviewOutputResolutions()প্রিভিউ সারফেস ফর্ম্যাট ও সাইজের জন্য কাজ করে এমন সাইজের তালিকার সাথে ইমেজ ফর্ম্যাটের একটি ম্যাপ রিটার্ন করে। OEM-কে অবশ্যই অন্ততPRIVATEফর্ম্যাট সাপোর্ট করতে হবে।AdvancedExtenderImpl.getSupportedCaptureOutputResolutions()স্টিল ক্যাপচার সারফেসের জন্য সমর্থিত ফর্ম্যাট এবং সাইজ রিটার্ন করে। OEM-কে অবশ্যইJPEGএবংYUV_420_888ফর্ম্যাট আউটপুট, দুটিকেই সাপোর্ট করতে হবে।AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions()ইমেজ বিশ্লেষণের জন্য অতিরিক্তYUV_420_888স্ট্রিমের জন্য সাপোর্ট করা সাইজ দেখায়। যদি ইমেজ অ্যানালিসিস YUV সারফেস কাজ না করে,getSupportedYuvAnalysisResolutions()nullবা একটি খালি তালিকা রিটার্ন করবে।
উপলভ্য ক্যাপচার অনুরোধ কী/ফলাফল (
extensions-interface1.3.0-এ যোগ করা হয়েছে): আপনার প্রয়োগ করা থেকে কাজ করে এমন ক্যাপচার অনুরোধ কী ও ফলাফল কী পেতে Camera2/X নিম্নলিখিত পদ্ধতি ব্যবহার করে:AdvancedExtenderImpl.getAvailableCaptureRequestKeysAdvancedExtenderImpl.getAvailableCaptureResultKeys
আরও তথ্যের জন্য, ক্যাপচার অনুরোধ কী ও ফলাফল দেখুন।
অ্যাপ ফ্লো ৩: এক্সটেনশন চালু করে প্রিভিউ/স্টিল ক্যাপচার করা
ছবি ১০. Advanced Extender-এ অ্যাপ ফ্লো ৩
উপরের ডায়াগ্রামে অ্যাডভান্সড এক্সটেন্ডার ধরনের জন্য প্রিভিউ শুরু করা এবং স্টিল ক্যাপচার করার মূল ফ্লো দেখানো হয়েছে। আসুন, প্রতিটি ধাপ সম্পর্কে জেনে নেওয়া যাক।
SessionProcessorImplইনস্ট্যান্সমূল Advanced Extender-এর প্রয়োগ
SessionProcessorImpl-এ রয়েছে, যা কাস্টমাইজ করা সেশন কনফিগারেশন প্রদান করা এবং প্রিভিউ ও স্টিল ক্যাপচার অনুরোধ শুরু করার জন্য ক্যাপচার অনুরোধ পাঠানোর জন্য দায়ী।SessionProcessorImplইনস্ট্যান্স রিটার্ন করার জন্যAdvancedExtenderImpl.createSessionProcessor()ইনভোক করা হয়।initSessionSessionProcessorImpl.initSession()এক্সটেনশনের জন্য সেশন শুরু করে।CameraCaptureSessionপ্রস্তুত করার জন্য রিসোর্স বরাদ্দ করা এবং সেশন কনফিগারেশন ফেরত দেওয়ার কাজটি এখানেই করা হয়।ইনপুট প্যারামিটারের জন্য, Camera2/X প্রিভিউ, স্টিল ক্যাপচার এবং ঐচ্ছিক YUV ইমেজ বিশ্লেষণের জন্য আউটপুট সারফেস কনফিগারেশন নির্দিষ্ট করে। এই আউটপুট সারফেস কনফিগারেশনে (
OutputSurfaceImpl) সারফেস, সাইজ ও ইমেজ ফর্ম্যাট থাকে যাAdvancedExtenderImpl-এ নিম্নলিখিত পদ্ধতি অনুসরণ করে পাওয়া যায়:getSupportedPreviewOutputResolutions()getSupportedCaptureOutputResolutions()getSupportedYuvAnalysisResolutions()
আপনাকে অবশ্যই একটি
Camera2SessionConfigImplইনস্ট্যান্স রিটার্ন করতে হবে, যার মধ্যেCamera2OutputConfigImplইনস্ট্যান্সের একটি তালিকা এবংCameraCaptureSessionকনফিগার করার জন্য ব্যবহৃত সেশন প্যারামিটার থাকে। Camera2/X-এর মাধ্যমে পাস করা আউটপুট সারফেসে সঠিক ক্যামেরা ছবি আউটপুট করার দায়িত্ব আপনার। আউটপুট চালু করার জন্য এখানে কয়েকটি বিকল্প দেওয়া হল:- ক্যামেরা HAL-এ প্রসেসিং: আপনি সরাসরি আউটপুট সারফেস
CameraCaptureSession-এSurfaceOutputConfigImplইমপ্লিমেন্টেশন সহ যোগ করতে পারবেন। এটি ক্যামেরা পাইপলাইনে প্রদত্ত আউটপুট সারফেস কনফিগার করে এবং ক্যামেরা HAL-কে ছবি প্রসেস করার অনুমতি দেয়। ইন্টারমিডিয়েট
ImageReaderসারফেস প্রসেস করা (RAW, YUV, ইত্যাদি):ImageReaderOutputConfigImplইনস্ট্যান্স সহCameraCaptureSession-এ ইন্টারমিডিয়েটImageReaderসারফেস যোগ করুন।আপনাকে মধ্যবর্তী ছবি প্রসেস করতে হবে এবং ফলাফল ছবিটিকে আউটপুট সারফেসে লিখতে হবে।
- Camera2 সারফেস শেয়ারিং ব্যবহার করুন: অন্য সারফেসের সাথে সারফেস শেয়ারিং ব্যবহার করুন
অন্য
Camera2OutputConfigImplইনস্ট্যান্সেরgetSurfaceSharingOutputConfigs()পদ্ধতিতে কোনওCamera2OutputConfigImplইনস্ট্যান্স যোগ করে। সারফেস ফর্ম্যাট ও সাইজ একই হতে হবে।
SurfaceOutputConfigImplএবংImageReaderOutputConfigImplসহ সবCamera2OutputConfigImpl-এর একটি অনন্য আইডি (getId()) থাকতে হবে, যা টার্গেট সারফেস নির্দিষ্ট করতে এবংImageReaderOutputConfigImplথেকে ছবি ফিরিয়ে আনতে ব্যবহার করা হয়।onCaptureSessionStartএবংRequestProcessorImplCameraCaptureSessionশুরু হলে এবং Camera ফ্রেমওয়ার্কonConfigured()ইনভোক করলে, Camera2/X, Camera2 অনুরোধ র্যাপারRequestProcessImplসহSessionProcessorImpl.onCaptureSessionStart()ইনভোক করে। Camera2/XRequestProcessImplপ্রয়োগ করে, যা আপনাকে ক্যাপচার অনুরোধ এক্সিকিউট করতে এবং ছবি রিট্রিভ করতে দেয়, যদিImageReaderOutputConfigImplব্যবহার করা হয়।অনুরোধ কার্যকর করার ক্ষেত্রে
RequestProcessImplAPI, Camera2CameraCaptureSessionAPI-এর মতোই। পার্থক্যগুলি হল:- টার্গেট সারফেস
Camera2OutputConfigImplইনস্ট্যান্সের আইডি দ্বারা নির্দিষ্ট করা হয়। ImageReader-এর ছবি ফিরিয়ে আনার ক্ষমতা।
ছবি পাওয়ার জন্য
ImageProcessorImplইনস্ট্যান্স রেজিস্টার করতে, আপনি নির্দিষ্টCamera2OutputConfigImplআইডি সহRequestProcessorImpl.setImageProcessor()-এ কল করতে পারেন।Camera2/X কল
SessionProcessorImpl.onCaptureSessionEnd()-এর পরেRequestProcessImplইনস্ট্যান্সটি অবৈধ হয়ে যায়।- টার্গেট সারফেস
প্রিভিউ শুরু করুন এবং ছবি তুলুন
উন্নত এক্সটেন্ডার প্রয়োগের ক্ষেত্রে, আপনি
RequestProcessorImplইন্টারফেসের মাধ্যমে ক্যাপচার করার অনুরোধ পাঠাতে পারবেন। Camera2/X আপনাকে প্রিভিউ বা স্টিল ক্যাপচার সিকোয়েন্সের জন্য পুনরাবৃত্তির অনুরোধ শুরু করতে বিজ্ঞপ্তি দেয়। এর জন্য যথাক্রমেSessionProcessorImpl#startRepeatingএবংSessionProcessorImpl#startCapture-এ কল করতে হয়। এইসব প্রিভিউ ও স্টিল-ক্যাপচার অনুরোধ পূরণ করার জন্য আপনাকে capture অনুরোধ পাঠাতে হবে।এছাড়াও, Camera2/X,
SessionProcessorImpl#setParameters-এর মাধ্যমে ক্যাপচার অনুরোধ প্যারামিটার সেট করে। আপনাকে অবশ্যই এইসব অনুরোধ প্যারামিটার (প্যারামিটার কাজ করলে) রিপিট করা ও সিঙ্গেল অনুরোধ, দু'টিতেই সেট করতে হবে।আপনার অবশ্যই অন্তত
CaptureRequest.JPEG_ORIENTATIONএবংCaptureRequest.JPEG_QUALITYভার্সন থাকতে হবে।extensions-interface1.3.0 ভার্সনে অনুরোধ ও ফলাফল কী কাজ করে, যা নিম্নলিখিত পদ্ধতি দ্বারা প্রকাশ করা হয়:AdvancedExtenderImpl.getAvailableCaptureRequestKeys()AdvancedExtenderImpl.getAvailableCaptureResultKeys()
ডেভেলপাররা
getAvailableCaptureRequestKeysতালিকায় কী সেট করলে, আপনাকে অবশ্যই প্যারামিটার চালু করতে হবে এবং নিশ্চিত করতে হবে যে ক্যাপচার করা ফলাফলেgetAvailableCaptureResultKeysতালিকায় কী রয়েছে।startTriggerSessionProcessorImpl.startTrigger()-কে ট্রিগার শুরু করার জন্য ডাকা হয়, যেমনCaptureRequest.CONTROL_AF_TRIGGERএবংCaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER। আপনিAdvancedExtenderImpl.getAvailableCaptureRequestKeys()-এ বিজ্ঞাপন দেওয়া হয়নি এমন যেকোনও ক্যাপচার রিকোয়েস্ট কী উপেক্ষা করতে পারবেন।extensions-interface1.3.0 থেকেstartTrigger()কাজ করে। এটি অ্যাপগুলিকে এক্সটেনশনের মাধ্যমে ট্যাপ-টু-ফোকাস ও ফ্ল্যাশ প্রয়োগ করতে দেয়।ক্লিন-আপ করুন
ক্যাপচার সেশন শেষ করার সময়,
SessionProcessorImpl.onCaptureSessionEnd(),CameraCaptureSessionবন্ধ করার আগে ইনভোক করা হয়। ক্যাপচার সেশন বন্ধ হয়ে যাওয়ার পরে,deInitSession()ক্লিন-আপ পারফর্ম করে।
প্রিভিউ, স্টিল ক্যাপচার ও ছবি বিশ্লেষণ করার সুবিধা আছে
প্রিভিউ ও স্টিল ক্যাপচার, এই দুই ক্ষেত্রেই আপনাকে এক্সটেনশন প্রয়োগ করতে হবে। তবে, প্রিভিউ মসৃণভাবে দেখানোর জন্য লেটেন্সি খুব বেশি হলে, আপনি শুধুমাত্র স্থির ক্যাপচারের জন্য এক্সটেনশন প্রয়োগ করতে পারেন।
বেসিক এক্সটেন্ডার ধরনের ক্ষেত্রে, প্রিভিউয়ের জন্য এক্সটেনশন চালু করা হোক বা না হোক,
আপনাকে অবশ্যই কোনও প্রদত্ত এক্সটেনশনের জন্য ImageCaptureExtenderImpl ও PreviewExtenderImpl
দুটিই প্রয়োগ করতে হবে। এছাড়াও, কোনও অ্যাপ প্রায়শই YUV স্ট্রিম ব্যবহার করে QR কোড বা টেক্সটের মতো
ইমেজ কন্টেন্ট বিশ্লেষণ করে। এই ব্যবহারের ক্ষেত্রে আরও ভালভাবে সহায়তা করতে
, আপনাকে প্রিভিউ, স্টিল ক্যাপচার এবং CameraCaptureSession কনফিগার করার জন্য YUV_420_888 স্ট্রিমের
স্ট্রিম কম্বিনেশনকে সহায়তা করতে হবে। এর অর্থ হল
আপনি কোনও প্রসেসর প্রয়োগ করলে, আপনাকে তিনটি YUV_420_888 স্ট্রিমের
কম্বিনেশন সাপোর্ট করতে হবে।
Advanced Extender-এর জন্য, Camera2/X তিনটি আউটপুট সারফেস
SessionProcessorImpl.initSession() কলে পাস করে। এই আউটপুট সারফেসগুলি যথাক্রমে প্রিভিউ
, স্টিল ক্যাপচার এবং ছবি বিশ্লেষণের জন্য। আপনাকে অবশ্যই নিশ্চিত করতে হবে যে প্রিভিউ
ও স্টিল ক্যাপচার আউটপুট সারফেস সঠিক আউটপুট দেখাচ্ছে। তবে, ইমেজ বিশ্লেষণ আউটপুট সারফেসের জন্য, এটি শুধুমাত্র তখনই কাজ করছে কিনা তা নিশ্চিত করুন যখন এটি নন-নাল হয়। আপনার
ইমপ্লিমেন্টেশন যদি ইমেজ অ্যানালিসিস স্ট্রিম সাপোর্ট না করে, তাহলে আপনি AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions()-এ একটি খালি
তালিকা রিটার্ন করতে পারেন। এটি
নিশ্চিত করে যে ইমেজ বিশ্লেষণ আউটপুট সারফেস সবসময় SessionProcessorImpl.initSession()-এ
নাল থাকে।
ভিডিও ক্যাপচার করার সুবিধা
বর্তমান ক্যামেরা এক্সটেনশন আর্কিটেকচার শুধুমাত্র প্রিভিউ এবং স্টিল
ক্যাপচার ব্যবহারিক ক্ষেত্রকে সাপোর্ট করে। ভিডিও রেকর্ড করার জন্য MediaCodec
বা MediaRecorder সারফেসে এক্সটেনশন চালু করার সুবিধা আমরা প্রদান করি না। তবে, অ্যাপের পক্ষে প্রিভিউ আউটপুট রেকর্ড করা সম্ভব।
MediaCodec ও MediaRecorder সারফেসের ক্ষেত্রে কাজ করা সংক্রান্ত সমস্যা খতিয়ে দেখা হচ্ছে।
এক্সটেনশন-নির্দিষ্ট মেটাডেটা
Android 14 ও এর পরের যেকোনও ভার্সনের জন্য, এক্সটেনশন-নির্দিষ্ট মেটাডেটা
ক্যামেরা এক্সটেনশন ক্লায়েন্টকে এক্সটেনশন-নির্দিষ্ট ক্যাপচার
অনুরোধ সেটিংস ও ফলাফল সেট ও গ্রহণ করতে দেয়। বিশেষত, ক্যামেরা এক্সটেনশন
ক্লায়েন্টরা এক্সটেনশনের ক্ষমতা এবং EXTENSION_CURRENT_TYPE ক্যাপচার ফলাফলকে
কন্ট্রোল করতে EXTENSION_STRENGTH ক্যাপচার অনুরোধ প্যারামিটার ব্যবহার করতে পারে
যা চালু থাকা এক্সটেনশনের ধরন নির্দেশ করে।
ক্যাপচার করার অনুরোধ
এক্সটেনশন পোস্ট-প্রসেসিং এফেক্টের শক্তি
EXTENSION_STRENGTH
ক্যাপচার রিকোয়েস্ট প্যারামিটার
কন্ট্রোল করে। এই প্যারামিটার ক্লায়েন্ট স্পষ্টভাবে সেট না করলে, সংশ্লিষ্ট
ক্যাপচার ফলাফলে ডিফল্ট স্ট্রেন্থ ভ্যালু অন্তর্ভুক্ত থাকে।
এইসব এক্সটেনশনের ধরনের জন্য এই প্যারামিটার এইভাবে
প্রয়োগ করা যেতে পারে:
BOKEH: অস্পষ্টতার পরিমাণ নিয়ন্ত্রণ করে।HDRএবংNIGHT: ফিউজ করা ছবির সংখ্যা এবং চূড়ান্ত ছবির উজ্জ্বলতা নিয়ন্ত্রণ করে।FACE_RETOUCH: কসমেটিক এনহ্যান্সমেন্ট ও স্কিন স্মুথিংয়ের পরিমাণ নিয়ন্ত্রণ করে।
EXTENSION_STRENGTH প্যারামিটারের জন্য কাজ করে এমন রেঞ্জ হল 0 থেকে
100, যেখানে 0 বলতে কোনও এক্সটেনশন প্রসেসিং বা সাধারণ পাসথ্রু এবং
100 বলতে প্রসেসিং এফেক্টের সর্বাধিক এক্সটেনশন পাওয়ারকে বোঝায়।
EXTENSION_STRENGTH-এর জন্য সহায়তা যোগ করতে, এক্সটেনশন লাইব্রেরি
ইন্টারফেসের 1.3.0 ভার্সনে চালু করা ভেন্ডর
নির্দিষ্ট প্যারামিটার API ব্যবহার করুন। আরও তথ্যের জন্য, getAvailableCaptureRequestKeys() দেখুন।
ক্যাপচার ফলাফল
EXTENSION_CURRENT_TYPE
ক্যাপচার ফলাফল এক্সটেনশন ইমপ্লিমেন্টেশনকে অ্যাক্টিভ এক্সটেনশন টাইপ সম্পর্কে ক্লায়েন্টদের জানাতে দেয়।
AUTO টাইপ ব্যবহার করা এক্সটেনশন, সিন কন্ডিশন, ক্যামেরা
এক্সটেনশন অ্যাপের উপর নির্ভর করে HDR ও NIGHT-এর মতো এক্সটেনশন
টাইপের মধ্যে ডায়নামিক সুইচ করে বলে, AUTO এক্সটেনশন দ্বারা বেছে নেওয়া বর্তমান এক্সটেনশন সম্পর্কে
তথ্য দেখাতে, ক্যামেরা এক্সটেনশন অ্যাপ EXTENSION_CURRENT_TYPE ব্যবহার করতে পারে।
রিয়েল-টাইম স্টিল ক্যাপচার লেটেন্সি সংক্রান্ত অনুমান
Android 14 এবং তার পরবর্তী ভার্সনের জন্য, ক্যামেরা এক্সটেনশন ক্লায়েন্ট
getRealtimeStillCaptureLatency() ব্যবহার করে দৃশ্য এবং
পরিবেশের অবস্থার উপর ভিত্তি করে রিয়েল-টাইম স্টিল ক্যাপচার লেটেন্সি অনুমান
কোয়েরি করতে পারে। এই
পদ্ধতিটি স্ট্যাটিক
getEstimatedCaptureLatencyRangeMillis()
পদ্ধতির চেয়ে আরও সঠিক অনুমান প্রদান করে। লেটেন্সি অনুমান অনুযায়ী, অ্যাপ এক্সটেনশন
প্রসেস করা এড়িয়ে যেতে পারে অথবা দীর্ঘ
সময় ধরে চলতে থাকা অপারেশন সম্পর্কে ব্যবহারকারীদের জানানোর জন্য ইঙ্গিত দেখাতে পারে।
CameraExtensionSession.StillCaptureLatency latency;
latency = extensionSession.getRealtimeStillCaptureLatency();
// The capture latency from ExtensionCaptureCallback#onCaptureStarted() until ExtensionCaptureCallback#onCaptureProcessStarted().
latency.getCaptureLatency();
// The processing latency from ExtensionCaptureCallback#onCaptureProcessStarted() until the processed frame returns to the client.
latency.getProcessingLatency();
রিয়েল-টাইম স্টিল ক্যাপচার ল্যাটেন্সি এস্টিমেটকে সাপোর্ট করতে, নিম্নলিখিতগুলি প্রয়োগ করুন:
- প্রাথমিক এক্সটেনশন:
ImageCaptureExtenderImpl.getRealtimeCaptureLatency() - উন্নত এক্সটেনশন:
SessionProcessorImpl.getRealtimeCaptureLatency
ক্যাপচার প্রসেসিং প্রগ্রেস কলব্যাক
Android 14 এবং তার পরবর্তী ভার্সনের জন্য, ক্যামেরা এক্সটেনশন ক্লায়েন্ট দীর্ঘ সময় ধরে চলা স্টিল ক্যাপচার প্রসেসিং অপারেশনের প্রগ্রেসের জন্য কলব্যাক পেতে পারে। ব্যবহারকারীর সামগ্রিক অভিজ্ঞতা উন্নত করতে অ্যাপ ব্যবহারকারীদের বর্তমান প্রগ্রেস দেখাতে পারে।
এই ফিচার ইন্টিগ্রেট করতে অ্যাপ নিম্নলিখিত কোড ব্যবহার করতে পারে:
import android.hardware.camera2.CameraExtensionSession.
ExtensionCaptureCallback;
{
…
class AppCallbackImpl extends ExtensionCaptureCallback {
…
@Override
public void onCaptureProcessProgressed(
@NonNull CameraExtensionSession session,
@NonNull CaptureRequest request,
@IntRange(from = 0, to = 100) int progress) {
// Update app UI with current progress
}
}
…
}
ক্যাপচার প্রসেসিং প্রগ্রেস কলব্যাক সাপোর্ট করতে, আপনার এক্সটেনশন ভেন্ডর ইমপ্লিমেন্টেশনকে অবশ্যই বর্তমান প্রগ্রেস ভ্যালু সহ নিম্নলিখিত কলব্যাক কল করতে হবে:
- বেসিক এক্সটেনশন:
ProcessResultImpl.onCaptureProcessProgressed() - উন্নত এক্সটেনশন:
CaptureCallback.onCaptureProcessProgressed()
পোস্টভিউ স্টিল ক্যাপচার
Android 14 ও এর পরের যেকোনও ভার্সনের জন্য, ক্যামেরা এক্সটেনশন
setPostviewOutputConfiguration ব্যবহার করে পোস্টভিউ (প্রিভিউ ছবি) সাপ্লাই
করতে পারে।
ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে, কোনও এক্সটেনশনে প্রসেসিং লেটেন্সি বেড়ে গেলে,
অ্যাপ পোস্টভিউ ছবিকে প্লেসহোল্ডার হিসেবে দেখাতে পারে
এবং ফাইনাল ছবি উপলভ্য হলে সেটি দিয়ে প্লেসহোল্ডারটি পাল্টে দিতে পারে। অ্যাপ নিম্নলিখিত রেফারেন্স কোড ব্যবহার করে
পোস্টভিউ ক্যাপচার অনুরোধ কনফিগার ও ইস্যু করতে পারে:
{
…
if (!CameraExtensionCharacteristics.isPostviewAvailable()) {
continue;
}
…
ExtensionSessionConfiguration extensionConfiguration = new
ExtensionSessionConfiguration(
CameraExtensionCharacteristics.EXTENSION_NIGHT,
outputConfig,
backgroundExecutor,
extensionSessionStateCallback
);
extensionConfiguration.setPostviewOutputConfiguration(
postviewImageOutput);
…
CaptureRequest.Builder captureRequestBuilder =
cameraDevice.createCaptureRequest(
CameraDevice.TEMPLATE_STILL_CAPTURE);
captureRequestBuilder.addTarget(stillImageReader.getSurface());
captureRequestBuilder.addTarget(postviewImageSurface);
CaptureRequest captureRequest = captureRequestBuilder.build();
…
}
পোস্টভিউ স্টিল ক্যাপচারকে সাপোর্ট করতে, আপনার ভেন্ডর ইমপ্লিমেন্টেশনকে এগুলি ইমপ্লিমেন্ট করতে হবে:
প্রাথমিক এক্সটেনশন:
CaptureProcessorImpl.onPostviewOutputSurfaceএবংCaptureProcessorImpl.processWithPostviewউন্নত এক্সটেনশন:
SessionProcessorImpl.startCaptureWithPostview
SurfaceView আউটপুট কাজ করে
Android 14 ও তার পরবর্তী ভার্সনের জন্য, ক্যামেরা এক্সটেনশন ক্লায়েন্ট
পাওয়ার ও পারফর্ম্যান্স অপ্টিমাইজ করা প্রিভিউ রেন্ডার পাথ ব্যবহার করতে পারে। এর জন্য, বারবার করা অনুরোধের জন্য প্রিভিউ আউটপুটের
SurfaceView
ইনস্ট্যান্স রেজিস্টার করতে হবে।
SurfaceView আউটপুট কাজ করানোর জন্য, আপনার ভেন্ডর এক্সটেনশন ইমপ্লিমেন্টেশনকে অবশ্যই
SurfaceView ইনস্ট্যান্সে স্ট্রিম ও আউটপুট প্রিভিউ করার উপযুক্ত হতে হবে। এটি
কাজ করে কিনা তা যাচাই করতে, SurfaceViewExtensionPreviewTest.java
CTS মডিউল রান করুন।
ভেন্ডর নির্দিষ্ট সেশনের ধরন
এই ফিচারটি ভেন্ডর এক্সটেনশন প্রয়োগ করার সুবিধা দেয় যাতে ডিফল্ট ভ্যালুর পরিবর্তে ইন্টার্নাল ক্যামেরা ক্যাপচার সেশনে সেট করা হবে এমন ভেন্ডর-নির্দিষ্ট সেশন টাইপ বেছে নেওয়া যায়।
এই ফিচারটি সম্পূর্ণ ফ্রেমওয়ার্ক ও ভেন্ডর স্ট্যাকের মধ্যে কাজ করে এবং এর ফলে ক্লায়েন্ট/পাবলিক দৃশ্যমান API-তে কোনও প্রভাব পড়ে না।
ভেন্ডর-নির্দিষ্ট সেশন ধরন বেছে নিতে, আপনার এক্সটেনশন লাইব্রেরির জন্য নিম্নলিখিতগুলি প্রয়োগ করুন:
* সাধারণ এক্সটেনশনের জন্য ExtenderStateListener.onSessionType()
* উন্নত এক্সটেনশনের জন্য Camera2SessionConfigImpl.getSessionType()
এক্সটেনশন ইন্টারফেস ভার্সন ইতিহাস
নিচের সারণীতে ক্যামেরা এক্সটেনশন ইন্টারফেস ভার্সনের ইতিহাস দেখানো হয়েছে। আপনাকে সর্বদা লেটেস্ট ভার্সনের সাথে ভেন্ডর লাইব্রেরি প্রয়োগ করতে হবে।
| Version | যোগ করা ফিচার |
|---|---|
| 1.0.0 |
|
| ১.১.০ |
|
| 1.2.0 |
|
| ১.৩.০ |
|
| 1.4.0 |
|
রেফারেন্স প্রয়োগ করা
নিম্নলিখিত রেফারেন্স OEM ভেন্ডর লাইব্রেরি ইমপ্লিমেন্টেশন
frameworks/ex-এ উপলভ্য।
advancedSample: Advanced Extender-এর প্রাথমিক প্রয়োগ।sample: Basic Extender-এর প্রাথমিক প্রয়োগ।service_based_sample: একটি ইমপ্লিমেন্টেশন যা দেখায় কীভাবেService-এ ক্যামেরা এক্সটেনশন হোস্ট করতে হয়। এই প্রয়োগে নিম্নলিখিত কম্পোনেন্ট রয়েছে:oem_library: Camera2 ও CameraX Extensions API-এর জন্য Camera Extensions OEM লাইব্রেরি যাExtensions-Interfaceপ্রয়োগ করে। এটি একটি পাসথ্রু হিসেবে কাজ করে যাExtensions-Interfaceথেকে পরিষেবাতে কল ফরওয়ার্ড করে। এই লাইব্রেরি এছাড়াও, পরিষেবার সাথে যোগাযোগ করার জন্য AIDL ফাইল ও র্যাপার ক্লাস প্রদান করে।অ্যাডভান্সড এক্সটেন্ডার ডিফল্ট হিসেবে চালু থাকে। Basic Extender চালু করতে,
ExtensionsVersionImpl#isAdvancedExtenderImplementedপরিবর্তন করেfalseকরুন।extensions_service: এক্সটেনশন পরিষেবার একটি স্যাম্পেল প্রয়োগ। এখানে আপনার ইমপ্লিমেন্টেশন যোগ করুন। পরিষেবাতে প্রয়োগ করার ইন্টারফেসটিExtensions-Interface-এর মতোই। যেমন,IAdvancedExtenderImpl.Stubপ্রয়োগ করলেAdvancedExtenderImpl-এর মতো একই অপারেশন করা হয়।ImageএবংTotalCaptureResultপার্সেল করার জন্যImageWrapperএবংTotalCaptureResultWrapperপ্রয়োজন।
ডিভাইসে ভেন্ডর লাইব্রেরি সেট-আপ করা
OEM ভেন্ডর লাইব্রেরি কোনও অ্যাপে বিল্ট-ইন থাকে না; এটি রানটাইমে Camera2/X-এর মাধ্যমে ডিভাইস থেকে
লোড করা হয়। CameraX-এ, <uses-library> ট্যাগ ঘোষণা করে যে
androidx.camera.extensions.impl লাইব্রেরি, যা camera-extensions লাইব্রেরির
AndroidManifest.xml
ফাইলে সংজ্ঞায়িত করা হয়েছে, তা CameraX-এর একটি নির্ভরতা এবং রানটাইমে লোড করতে হবে।
Camera2-এ, ফ্রেমওয়ার্ক একটি এক্সটেনশন পরিষেবা লোড করে যা
এছাড়াও ঘোষণা করে যে এটি রানটাইমে <uses-library>একই
androidx.camera.extensions.impl লাইব্রেরি লোড করে।
এর ফলে এক্সটেনশন ব্যবহার করা থার্ড-পার্টি অ্যাপগুলি OEM ভেন্ডর লাইব্রেরি অটোমেটিক লোড করতে পারে। OEM লাইব্রেরিকে ঐচ্ছিক হিসেবে চিহ্নিত করা হয়েছে, তাই যেসব ডিভাইসে লাইব্রেরি নেই সেগুলিতেও অ্যাপ চলতে পারে। কোনও অ্যাপ ক্যামেরা এক্সটেনশন ব্যবহার করার চেষ্টা করলে, Camera2/X অটোমেটিক এই আচরণ ম্যানেজ করে, যতক্ষণ না ডিভাইস প্রস্তুতকারক ডিভাইসে OEM লাইব্রেরি রাখে, যাতে অ্যাপটি এটি খুঁজে পেতে পারে।
কোনও ডিভাইসে OEM লাইব্রেরি সেট-আপ করতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:
<uses-library>ট্যাগের জন্য প্রয়োজনীয় অনুমতি ফাইল যোগ করুন, নিচে উল্লেখ করা ফর্ম্যাট ব্যবহার করে:/etc/permissions/ANY_FILENAME.xml. যেমন,/etc/permissions/camera_extensions.xml। এই ডিরেক্টরির ফাইলগুলি<uses-library>-এ নাম দেওয়া লাইব্রেরির ম্যাপিং ডিভাইসের আসল ফাইল পাথে প্রদান করে।ফাইলে প্রয়োজনীয় তথ্য যোগ করতে নিচের উদাহরণটি ব্যবহার করুন।
nameঅবশ্যইandroidx.camera.extensions.implহতে হবে কারণ CameraX এই লাইব্রেরিই সার্চ করে।fileহল সেই ফাইলের অ্যাবসলিউট পাথ যাতে এক্সটেনশন ইমপ্লিমেন্টেশন (যেমন,/system/framework/androidx.camera.extensions.impl.jar) আছে।
<?xml version="1.0" encoding="utf-8"?> <permissions> <library name="androidx.camera.extensions.impl" file="OEM_IMPLEMENTED_JAR" /> </permissions>
Android 12 বা তার পরবর্তী যেকোনও ভার্সনে, CameraX
এক্সটেনশন কাজ করে এমন ডিভাইসে ro.camerax.extensions.enabled প্রপার্টি true হিসেবে সেট করা থাকতে হবে,
যা কোনও ডিভাইসে এক্সটেনশন কাজ করে কিনা তা কোয়েরি করার অনুমতি দেয়।
এটি করতে, ডিভাইসের মেক ফাইলে নিম্নলিখিত লাইন যোগ করুন:
PRODUCT_VENDOR_PROPERTIES += \
ro.camerax.extensions.enabled=true \
যাচাইকরণ
ডেভেলপমেন্টের সময় OEM ভেন্ডর লাইব্রেরির প্রয়োগ পরীক্ষা করতে, androidx-main/camera/integration-tests/extensionstestapp/-এ
উদাহরণ হিসেবে দেওয়া অ্যাপটি ব্যবহার করুন, যা বিভিন্ন ভেন্ডর এক্সটেনশনের মাধ্যমে চলে।
আপনি প্রয়োগ করা সম্পূর্ণ করার পরে, ভেন্ডর লাইব্রেরি সঠিকভাবে প্রয়োগ করা হয়েছে কিনা তা যাচাই করতে অটোমেটিক ও ম্যানুয়াল টেস্ট চালানোর জন্য ক্যামেরা এক্সটেনশন যাচাইকরণ টুল ব্যবহার করুন।
এক্সটেন্ডেড সিন মোড বনাম ক্যামেরা এক্সটেনশন
বোকেহ এক্সটেনশনের জন্য, ক্যামেরা এক্সটেনশন ব্যবহার করে এটি এক্সপোজ করা ছাড়াও, আপনি
এক্সটেন্ডেড সিন মোড ব্যবহার করে এক্সটেনশন এক্সপোজ করতে পারেন, যা
CONTROL_EXTENDED_SCENE_MODE
কী-এর মাধ্যমে
চালু করা হয়।
প্রয়োগ করা সংক্রান্ত আরও বিবরণের জন্য, ক্যামেরা বোকেহ দেখুন।
ক্যামেরা এক্সটেনশনের তুলনায় এক্সটেন্ডেড সিন মোডে কম বিধিনিষেধ থাকে
camera2 অ্যাপ। যেমন, আপনি সাধারণ CameraCaptureSession ইনস্ট্যান্সে এক্সটেন্ডেড সিন মোড চালু করতে পারেন
যা ফ্লেক্সিবল স্ট্রিম
কম্বিনেশন ও ক্যাপচার রিকোয়েস্ট প্যারামিটার কাজ করে। অন্যদিকে, ক্যামেরা এক্সটেনশন
শুধুমাত্র নির্দিষ্ট কিছু স্ট্রিম টাইপ সাপোর্ট করে এবং ক্যাপচার
অনুরোধ প্যারামিটারের জন্য সীমিত সাপোর্ট প্রদান করে।
এক্সটেন্ডেড সিন মোডের একটি অসুবিধা হল যে আপনি এটি শুধুমাত্র ক্যামেরা HAL-এ প্রয়োগ করতে পারবেন, যার অর্থ হল অ্যাপ ডেভেলপারদের জন্য উপলভ্য সমস্ত অর্থোগোনাল কন্ট্রোলে কাজ করার জন্য এটি যাচাই করা আবশ্যক।
আমরা সাজেস্ট করি যে এক্সটেন্ডেড সিন মোড ও Camera Extensions, দু'টিই ব্যবহার করে বোকে এক্সপোজ করুন, কারণ অ্যাপ বোকে চালু করার জন্য কোনও নির্দিষ্ট API ব্যবহার করতে চাইতে পারে। আমরা প্রথমে এক্সটেন্ডেড সিন মোড ব্যবহার করার সাজেশন দিই কারণ এটিই হল অ্যাপের জন্য বোকে এক্সটেনশন চালু করার সবচেয়ে ফ্লেক্সিবল উপায়। তারপর আপনি এক্সটেন্ডেড সিন মোডের উপর ভিত্তি করে ক্যামেরা এক্সটেনশন ইন্টারফেস প্রয়োগ করতে পারবেন। ক্যামেরা HAL-এ বোকে ইমপ্লিমেন্ট করা কঠিন হলে, যেমন, এর জন্য ছবি প্রসেস করার জন্য অ্যাপ লেয়ারে পোস্ট প্রসেসর চালানোর প্রয়োজন হলে, আমরা Camera Extensions ইন্টারফেস ব্যবহার করে বোকে এক্সটেনশন ইমপ্লিমেন্ট করার সাজেশন দিই।
প্রায়শই জিজ্ঞাসিত প্রশ্ন (FAQ)
API লেভেলে কি কোনও বিধিনিষেধ আছে?
হ্যাঁ। এটি OEM
ভেন্ডর লাইব্রেরি প্রয়োগের জন্য প্রয়োজনীয় Android API ফিচার সেটের উপর নির্ভর করে। যেমন,
ExtenderStateListener.onPresetSession() ট্যাগগুলির একটি বেসলাইন সেট করতে
SessionConfiguration.setSessionParameters()
কল ব্যবহার করে। এই কলটি শুধুমাত্র API লেভেল
28 ও তার পরবর্তী ভার্সনে উপলভ্য। নির্দিষ্ট ইন্টারফেস পদ্ধতি সম্পর্কে আরও জানতে, API রেফারেন্স ডকুমেন্টেশন দেখুন।