ডিভাইস নির্মাতারা OEM ভেন্ডর লাইব্রেরি দ্বারা প্রদত্ত ক্যামেরা এক্সটেনশন ইন্টারফেসের মাধ্যমে তৃতীয় পক্ষের বিকাশকারীদের কাছে bokeh, নাইট মোড এবং HDR-এর মতো এক্সটেনশনগুলি প্রকাশ করতে পারে৷ বিকাশকারীরা OEM ভেন্ডর লাইব্রেরিতে বাস্তবায়িত এক্সটেনশনগুলি অ্যাক্সেস করতে Camera2 এক্সটেনশন API এবং CameraX এক্সটেনশন API ব্যবহার করতে পারেন।
সমর্থিত এক্সটেনশনগুলির একটি তালিকার জন্য, যা Camera2 এবং CameraX জুড়ে একই, CameraX এক্সটেনশন API দেখুন। আপনি যদি একটি এক্সটেনশন যোগ করতে চান, তাহলে ইস্যু ট্র্যাকারের সাথে একটি বাগ ফাইল করুন।
এই পৃষ্ঠাটি বর্ণনা করে যে কীভাবে ডিভাইসে OEM বিক্রেতা লাইব্রেরি বাস্তবায়ন এবং সক্ষম করা যায়।
স্থাপত্য
নিম্নলিখিত চিত্রটি ক্যামেরা এক্সটেনশন ইন্টারফেস বা extensions-interface আর্কিটেকচার বর্ণনা করে: 
চিত্র 1. ক্যামেরা এক্সটেনশন আর্কিটেকচার ডায়াগ্রাম
ডায়াগ্রামে দেখানো হয়েছে, ক্যামেরা এক্সটেনশন সমর্থন করার জন্য, আপনাকে OEM বিক্রেতা লাইব্রেরি দ্বারা প্রদত্ত extensions-interface বাস্তবায়ন করতে হবে। আপনার OEM বিক্রেতা লাইব্রেরি দুটি API সক্ষম করে: CameraX Extensions API এবং Camera2 Extensions API , যা যথাক্রমে CameraX এবং Camera2 অ্যাপ্লিকেশানগুলি দ্বারা বিক্রেতা এক্সটেনশনগুলি অ্যাক্সেস করতে ব্যবহৃত হয়৷
OEM বিক্রেতা লাইব্রেরি বাস্তবায়ন করুন
OEM ভেন্ডর লাইব্রেরি বাস্তবায়ন করতে, camera-extensions-stub ফাইলগুলিকে একটি সিস্টেম লাইব্রেরি প্রকল্পে অনুলিপি করুন। এই ফাইলগুলি ক্যামেরা এক্সটেনশন ইন্টারফেস সংজ্ঞায়িত করে।
camera-extensions-stub ফাইলগুলি নিম্নলিখিত বিভাগে বিভক্ত:
অপরিহার্য ইন্টারফেস ফাইল (পরিবর্তন করবেন না)
-
PreviewExtenderImpl.java -
ImageCaptureExtenderImpl.java -
ExtenderStateListener.java -
ProcessorImpl.java -
PreviewImageProcessorImpl.java -
CaptureProcessorImpl.java -
CaptureStageImpl.java -
RequestUpdateProcessorImpl.java -
ProcessResultImpl.java -
advanced/AdvancedExtenderImpl.java -
advanced/Camera2OutputConfigImpl.java -
advanced/Camera2SessionConfigImpl.java -
advanced/ImageProcessorImpl.java -
advanced/ImageReaderOutputConfigImpl.java -
advanced/ImageReferenceImpl.java -
advanced/MultiResolutionImageReaderOutputConfigImpl.java -
advanced/OutputSurfaceImpl.java -
advanced/RequestProcessorImpl.java -
advanced/SessionProcessorImpl.java -
advanced/SurfaceOutputConfigImpl.java
বাধ্যতামূলক বাস্তবায়ন (আপনার বাস্তবায়ন যোগ করুন)
-
ExtensionVersionImpl.java -
InitializerImpl.java
বোকেহ এক্সটেনশন ক্লাস (বোকেহ এক্সটেনশন সমর্থিত হলে এটি প্রয়োগ করুন)
-
BokehImageCaptureExtenderImpl.java -
BokehPreviewExtenderImpl.java -
advanced/BokehAdvancedExtenderImpl.java
নাইট এক্সটেনশন ক্লাস (নাইট এক্সটেনশন সমর্থিত হলে এটি প্রয়োগ করুন)
-
NightImageCaptureExtenderImpl.java -
NightPreviewExtenderImpl.java -
advanced/NightAdvancedExtenderImpl.java
অটো এক্সটেনশন ক্লাস (যদি স্বয়ংক্রিয় এক্সটেনশন সমর্থিত হয় তবে এটি প্রয়োগ করুন)
-
AutoImageCaptureExtenderImpl.java -
AutoPreviewExtenderImpl.java -
advanced/AutoAdvancedExtenderImpl.java
এইচডিআর এক্সটেনশন ক্লাস (এইচডিআর এক্সটেনশন সমর্থিত হলে এটি প্রয়োগ করুন)
-
HdrImageCaptureExtenderImpl.java -
HdrPreviewExtenderImpl.java -
advanced/HdrAdvancedExtenderImpl.java
ফেস রিটাচ এক্সটেনশন ক্লাস (ফেস রিটাচ এক্সটেনশন সমর্থিত হলে এটি প্রয়োগ করুন)
-
BeautyImageCaptureExtenderImpl.java -
BeautyPreviewExtenderImpl.java -
advanced/BeautyAdvancedExtenderImpl.java
ইউটিলিটি (ঐচ্ছিক, মুছে ফেলা যেতে পারে)
-
advanced/Camera2OutputConfigImplBuilder.java -
advanced/Camera2SessionConfigImplBuilder.java
আপনাকে প্রতিটি এক্সটেনশনের জন্য একটি বাস্তবায়ন প্রদান করতে হবে না। আপনি যদি একটি এক্সটেনশন বাস্তবায়ন না করেন, তাহলে false ফেরত দিতে বা সংশ্লিষ্ট এক্সটেন্ডার ক্লাসগুলি সরাতে isExtensionAvailable() সেট করুন। Camera2 এবং CameraX এক্সটেনশন APIs অ্যাপে রিপোর্ট করে যে এক্সটেনশনটি অনুপলব্ধ।
ক্যামেরা2 এবং ক্যামেরাএক্স এক্সটেনশন এপিআই কীভাবে একটি এক্সটেনশন সক্ষম করতে বিক্রেতা লাইব্রেরির সাথে ইন্টারঅ্যাক্ট করে তা নিয়ে চলুন। নিম্নলিখিত চিত্রটি উদাহরণ হিসাবে নাইট এক্সটেনশন ব্যবহার করে এন্ড-টু-এন্ড প্রবাহকে চিত্রিত করে:

চিত্র 2. নাইট এক্সটেনশন বাস্তবায়ন
সংস্করণ যাচাইকরণ:
OEM- প্রয়োগকৃত
extensions-interfaceসংস্করণ Camera2/X সমর্থিত সংস্করণগুলির সাথে সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করতে Camera2/XExtensionVersionImpl.checkApiVersion()কল করে৷বিক্রেতা লাইব্রেরি আরম্ভ:
InitializerImplএকটি পদ্ধতি আছেinit()যা ভেন্ডর লাইব্রেরি আরম্ভ করে। এক্সটেন্ডার ক্লাস অ্যাক্সেস করার আগে ক্যামেরা 2/এক্স প্রাথমিককরণ সম্পূর্ণ করে।তাত্ক্ষণিক এক্সটেন্ডার ক্লাস:
এক্সটেনশনের জন্য এক্সটেন্ডার ক্লাসগুলিকে ইনস্ট্যান্টিয়েট করে৷ দুটি এক্সটেন্ডার প্রকার রয়েছে: বেসিক এক্সটেন্ডার এবং অ্যাডভান্সড এক্সটেন্ডার। আপনাকে অবশ্যই সমস্ত এক্সটেনশনের জন্য একটি এক্সটেন্ডার প্রকার প্রয়োগ করতে হবে৷ আরও তথ্যের জন্য, বেসিক এক্সটেন্ডার বনাম অ্যাডভান্সড এক্সটেন্ডার দেখুন।
ক্যামেরা2/X তথ্য পুনরুদ্ধার করতে এবং এক্সটেনশন সক্রিয় করতে এক্সটেন্ডার ক্লাসের সাথে তাত্ক্ষণিক এবং ইন্টারঅ্যাক্ট করে। একটি প্রদত্ত এক্সটেনশনের জন্য, Camera2/X এক্সটেন্ডার ক্লাসগুলি একাধিকবার ইনস্ট্যান্ট করতে পারে। ফলস্বরূপ, কনস্ট্রাক্টর বা
init()কলে হেভি-লিফটিং ইনিশিয়ালাইজেশন করবেন না। যখন ক্যামেরা সেশন শুরু হতে চলেছে তখনই ভারী উত্তোলন করুন, যেমন যখনonInit()বেসিক এক্সটেন্ডারে কল করা হয় বাinitSession()অ্যাডভান্সড এক্সটেন্ডারে ডাকা হয়।নাইট এক্সটেনশনের জন্য, বেসিক এক্সটেন্ডার টাইপের জন্য নিম্নলিখিত এক্সটেন্ডার ক্লাসগুলি ইনস্ট্যান্ট করা হয়েছে:
-
NightImageCaptureExtenderImpl.java -
NightPreviewExtenderImpl.java
এবং অ্যাডভান্সড এক্সটেন্ডার টাইপের জন্য:
-
NightAdvancedExtenderImpl.java
-
এক্সটেনশন প্রাপ্যতা পরীক্ষা করুন:
এক্সটেনশন সক্রিয় করার আগে,
isExtensionAvailable()এক্সটেন্ডার উদাহরণের মাধ্যমে নির্দিষ্ট ক্যামেরা আইডিতে এক্সটেনশন উপলব্ধ কিনা তা পরীক্ষা করে।ক্যামেরা তথ্য সহ এক্সটেন্ডার শুরু করুন:
Camera2/X এক্সটেন্ডার ইনস্ট্যান্সে
init()কল করে এবং এটিকে ক্যামেরা আইডি এবংCameraCharacteristicsপাস করে।অনুসন্ধান তথ্য:
সমর্থিত রেজোলিউশন, এখনও আনুমানিক লেটেন্সি ক্যাপচার এবং এক্সটেনশন সক্ষম করার প্রস্তুতির জন্য এক্সটেন্ডার থেকে অনুরোধ কীগুলি ক্যাপচার করার মতো তথ্য পুনরুদ্ধার করতে এক্সটেন্ডার ক্লাসকে আহ্বান করে।
এক্সটেন্ডারে এক্সটেনশন সক্রিয় করুন:
এক্সটেন্ডার ক্লাস ক্লাস সক্রিয় করার জন্য প্রয়োজনীয় সমস্ত ইন্টারফেস প্রদান করে। এটি ক্যামেরা2 পাইপলাইনে OEM বাস্তবায়নকে হুক করার জন্য একটি প্রক্রিয়া অফার করে যেমন ক্যাপচার অনুরোধের পরামিতিগুলি ইনজেকশন দেওয়া বা একটি পোস্ট প্রসেসর সক্রিয় করা।
অ্যাডভান্সড এক্সটেন্ডার টাইপের জন্য, ক্যামেরা2/X এক্সটেনশন সক্রিয় করতে
SessionProcessorImplসাথে ইন্টারঅ্যাক্ট করে। Camera2/X এক্সটেন্ডারেcreateSessionProcessor()কল করেSessionProcessorImplউদাহরণ পুনরুদ্ধার করে।
নিম্নলিখিত বিভাগগুলি এক্সটেনশন প্রবাহকে আরও বিস্তারিতভাবে বর্ণনা করে।
সংস্করণ যাচাইকরণ
রানটাইমে ডিভাইস থেকে OEM ভেন্ডর লাইব্রেরি লোড করার সময়, Camera2/X লাইব্রেরি extensions-interface সংস্করণের সাথে সামঞ্জস্যপূর্ণ কিনা তা যাচাই করে। extensions-interface শব্দার্থিক সংস্করণ ব্যবহার করে, বা MAJOR.MINOR.PATCH, উদাহরণস্বরূপ, 1.1.0 বা 1.2.0৷ যাইহোক, সংস্করণ যাচাইকরণের সময় শুধুমাত্র বড় এবং ছোট সংস্করণ ব্যবহার করা হয়।
সংস্করণটি যাচাই করতে, Camera2/X সমর্থিত extensions-interface সংস্করণ সহ ExtensionVersionImpl.checkApiVersion() কল করে। Camera2/X তারপর এক্সটেনশনটি সক্ষম করা যায় কিনা এবং এটির জন্য কী কী ক্ষমতা ব্যবহার করা উচিত তা নির্ধারণ করতে OEM লাইব্রেরি দ্বারা রিপোর্ট করা সংস্করণ ব্যবহার করে।
প্রধান সংস্করণ সামঞ্জস্য
যদি এক্সটেনশন-ইন্টারফেসের প্রধান সংস্করণগুলি Camera2/X এবং বিক্রেতা লাইব্রেরির মধ্যে আলাদা হয়, তাহলে এটি বেমানান বলে বিবেচিত হয় এবং এক্সটেনশনটি নিষ্ক্রিয় করা হয়।
পশ্চাদপদ সামঞ্জস্য
যতক্ষণ পর্যন্ত প্রধান সংস্করণ অভিন্ন, ক্যামেরা2/X পূর্বের extensions-interface সংস্করণগুলির সাথে নির্মিত OEM বিক্রেতা লাইব্রেরির সাথে পশ্চাদগামী সামঞ্জস্য নিশ্চিত করে। উদাহরণস্বরূপ, যদি Camera2/X extensions-interface 1.3.0 সমর্থন করে, তাহলে 1.0.0, 1.1.0 এবং 1.2.0 প্রয়োগ করা OEM বিক্রেতা লাইব্রেরিগুলি এখনও সামঞ্জস্যপূর্ণ। এর মানে হল যে আপনি ভেন্ডর লাইব্রেরির একটি নির্দিষ্ট সংস্করণ বাস্তবায়ন করার পরে, Camera2/X নিশ্চিত করে যে লাইব্রেরিটি আসন্ন extension-interface সংস্করণগুলির সাথে পিছিয়ে সামঞ্জস্যপূর্ণ।
ফরোয়ার্ড সামঞ্জস্য
নতুন extensions-interface বিক্রেতা লাইব্রেরির সাথে ফরওয়ার্ড সামঞ্জস্যতা আপনার উপর, OEM-এর উপর নির্ভর করে। এক্সটেনশনগুলি বাস্তবায়নের জন্য আপনার যদি কিছু বৈশিষ্ট্যের প্রয়োজন হয়, আপনি একটি নির্দিষ্ট সংস্করণ থেকে শুরু করে এক্সটেনশনগুলি সক্ষম করতে চাইতে পারেন। এই ক্ষেত্রে, Camera2/X লাইব্রেরি সংস্করণ প্রয়োজনীয়তা পূরণ করলে আপনি সমর্থিত extensions-interface সংস্করণটি ফেরত দিতে পারেন। যদি Camera2/X সংস্করণগুলি সমর্থিত না হয়, আপনি এক্সটেনশনগুলি নিষ্ক্রিয় করতে 99.0.0 এর মতো একটি বেমানান সংস্করণ ফেরত দিতে পারেন৷
বিক্রেতা লাইব্রেরি আরম্ভ
OEM লাইব্রেরি দ্বারা বাস্তবায়িত extensions-interface সংস্করণ যাচাই করার পরে, Camera2/X আরম্ভ করার প্রক্রিয়া শুরু করে। InitializerImpl.init() পদ্ধতিটি OEM লাইব্রেরিতে সংকেত দেয় যে একটি অ্যাপ এক্সটেনশন ব্যবহার করার চেষ্টা করছে।
ক্যামেরা 2/X OEM লাইব্রেরিতে অন্য কোন কল করে না (সংস্করণ চেকিং বাদ দিয়ে) যতক্ষণ না OEM বিক্রেতা লাইব্রেরি OnExtensionsInitializedCallback.onSuccess() সূচনা সম্পূর্ণ হওয়ার বিষয়ে অবহিত না করে।
extensions-interface 1.1.0 হিসাবে আপনাকে অবশ্যই InitializerImpl প্রয়োগ করতে হবে। যদি OEM ভেন্ডর লাইব্রেরি extensions-interface 1.0.0 প্রয়োগ করে ক্যামেরা2/X লাইব্রেরি প্রারম্ভিক পদক্ষেপটি এড়িয়ে যায়।
বেসিক এক্সটেন্ডার বনাম অ্যাডভান্সড এক্সটেন্ডার
দুই ধরনের extensions-interface বাস্তবায়ন: বেসিক এক্সটেন্ডার এবং অ্যাডভান্সড এক্সটেন্ডার। extensions-interface 1.2.0 থেকে অ্যাডভান্সড এক্সটেন্ডার সমর্থিত।
এক্সটেনশনগুলির জন্য বেসিক এক্সটেন্ডার প্রয়োগ করুন যা ক্যামেরা HAL-এ ছবিগুলি প্রক্রিয়া করে বা YUV স্ট্রীমগুলি প্রক্রিয়া করতে সক্ষম একটি পোস্ট প্রসেসর ব্যবহার করে৷
ক্যামেরা2 স্ট্রীম কনফিগারেশন কাস্টমাইজ করতে এবং প্রয়োজন অনুযায়ী ক্যাপচার অনুরোধ পাঠাতে প্রয়োজন এমন এক্সটেনশনগুলির জন্য অ্যাডভান্সড এক্সটেন্ডার প্রয়োগ করুন।
তুলনা করার জন্য নিম্নলিখিত টেবিল দেখুন:
| বেসিক এক্সটেন্ডার | উন্নত এক্সটেন্ডার | |
|---|---|---|
| স্ট্রিম কনফিগারেশন | স্থির পূর্বরূপ: PRIVATE বা YUV_420_888 (যদি প্রসেসর বিদ্যমান থাকে)এখনও ক্যাপচার করুন: JPEG বা YUV_420_888 (যদি প্রসেসর থাকে) | OEM দ্বারা কাস্টমাইজযোগ্য. |
| ক্যাপচার অনুরোধ পাঠানো হচ্ছে | শুধুমাত্র Camera2/X ক্যাপচার অনুরোধ পাঠাতে পারে। আপনি এই অনুরোধের পরামিতি সেট করতে পারেন। যখন ইমেজ ক্যাপচারের জন্য প্রসেসর দেওয়া হয়, তখন ক্যামেরা2/X একাধিক ক্যাপচারের অনুরোধ পাঠাতে পারে এবং প্রসেসরে সমস্ত ছবি ও ক্যাপচার ফলাফল পাঠাতে পারে। | একটি RequestProcessorImpl ইন্সট্যান্স আপনাকে ক্যামেরা2 ক্যাপচার রিকোয়েস্ট এক্সিকিউট করার জন্য এবং ফলাফল এবং ইমেজ পাওয়ার জন্য প্রদান করা হয়েছে। প্রিভিউয়ের পুনরাবৃত্তির অনুরোধ শুরু করার জন্য এবং যথাক্রমে স্টিল ক্যাপচার সিকোয়েন্স শুরু করার জন্য OEM-কে সংকেত দেওয়ার জন্য 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গুলি প্রদান করার সময়, এই ফ্লোগুলিকে সমর্থন করার জন্য আপনাকে অবশ্যই বিক্রেতা লাইব্রেরি সঠিকভাবে প্রয়োগ করতে হবে, যা আমরা পরবর্তী বিভাগে আরও বিশদে বর্ণনা করব।
| ক্যামেরা2 এক্সটেনশন | ক্যামেরাএক্স এক্সটেনশন | |
|---|---|---|
| প্রশ্ন এক্সটেনশন প্রাপ্যতা | CameraExtensionCharacteristics . getSupportedExtensions | ExtensionsManager. isExtensionAvailable |
| তথ্য অনুসন্ধান করুন | CameraExtensionCharacteristics. getExtensionSupportedSizes CameraExtensionCharacteristics. getEstimatedCaptureLatencyRangeMillis CameraExtensionCharacteristics. getAvailableCaptureRequestKeys CameraExtensionCharacteristics. getAvailableCaptureResultKeys | ExtensionsManager. getEstimatedCaptureLatencyRangeCameraX লাইব্রেরির মধ্যে বাকি তথ্য পরিচালনা করে। |
| প্রিভিউ এবং স্থির-ক্যাপচার এক্সটেনশন সক্ষম | CameraDevice. createExtensionSession | val cameraSelector = ExtensionsManager. getExtensionEnabledCameraSelector bindToLifecycle(lifecycleOwner, cameraSelector, preview, ...) |
বেসিক এক্সটেন্ডার
বেসিক এক্সটেন্ডার ইন্টারফেস ক্যামেরা পাইপলাইনের বিভিন্ন জায়গায় হুক প্রদান করে। প্রতিটি এক্সটেনশন প্রকারের সাথে সংশ্লিষ্ট এক্সটেন্ডার ক্লাস রয়েছে যা OEM দের বাস্তবায়ন করতে হবে।
নিম্নোক্ত সারণীতে প্রতিটি এক্সটেনশনের জন্য OEMSকে যে এক্সটেন্ডার ক্লাস বাস্তবায়ন করতে হবে তা তালিকাভুক্ত করা হয়েছে:
| এক্সটেন্ডার ক্লাস বাস্তবায়ন করতে | |
|---|---|
| রাত্রি | NightPreviewExtenderImpl.java |
| এইচডিআর | HdrPreviewExtenderImpl.java |
| অটো | AutoPreviewExtenderImpl.java |
| বোকেহ | BokehPreviewExtenderImpl.java |
| ফেস রিটাচ | BeautyPreviewExtenderImpl.java |
আমরা নিম্নলিখিত উদাহরণে স্থানধারক হিসাবে PreviewExtenderImpl এবং ImageCaptureExtenderImpl ব্যবহার করি। আপনি যে প্রকৃত ফাইলগুলি বাস্তবায়ন করছেন তার নাম দিয়ে এগুলি প্রতিস্থাপন করুন।
বেসিক এক্সটেন্ডারের নিম্নলিখিত ক্ষমতা রয়েছে:
-
CameraCaptureSession(onPresetSession) কনফিগার করার সময় সেশন প্যারামিটারগুলি ইনজেক্ট করুন। - ক্যাপচার সেশন শুরু এবং সমাপ্তির ইভেন্টগুলি সম্পর্কে আপনাকে অবহিত করুন এবং ফিরে আসা প্যারামিটারগুলি (
onEnableSession,onDisableSession) সহ HAL-কে অবহিত করার জন্য একটি একক অনুরোধ পাঠান। - অনুরোধের জন্য ক্যাপচার প্যারামিটারগুলি ইনজেক্ট করুন (
PreviewExtenderImpl.getCaptureStage,ImageCaptureExtenderImpl.getCaptureStages)। - পূর্বরূপের জন্য প্রসেসর যোগ করুন এবং এখনও ক্যাপচার করুন যা
YUV_420_888স্ট্রীম প্রক্রিয়া করতে সক্ষম।
আসুন দেখি কিভাবে ক্যামেরা2/X উপরে উল্লিখিত তিনটি অ্যাপ ফ্লো অর্জন করতে extensions-interface ব্যবহার করে।
অ্যাপ ফ্লো 1: এক্সটেনশনের প্রাপ্যতা পরীক্ষা করুন

চিত্র 3. বেসিক এক্সটেন্ডারে অ্যাপ ফ্লো 1
এই প্রবাহে, Camera2/X সরাসরি init() কল না করে PreviewExtenderImpl এবং ImageCaptureExtenderImpl উভয়ের isExtensionAvailable() পদ্ধতিতে কল করে। এক্সটেনশনগুলি সক্ষম করতে উভয় এক্সটেন্ডার ক্লাসকেই true ফিরে আসতে হবে।
এক্সটেনশন সক্রিয় করার আগে প্রদত্ত এক্সটেনশনের ধরনটি প্রদত্ত ক্যামেরা আইডির জন্য সমর্থিত কিনা তা পরীক্ষা করার জন্য প্রায়শই অ্যাপগুলির জন্য এটি প্রথম পদক্ষেপ। এর কারণ হল কিছু এক্সটেনশন শুধুমাত্র নির্দিষ্ট ক্যামেরা আইডিতে সমর্থিত।
অ্যাপ ফ্লো 2: কোয়েরি তথ্য

চিত্র 4. বেসিক এক্সটেন্ডারে অ্যাপ ফ্লো 2
এক্সটেনশনটি উপলব্ধ কিনা তা নির্ধারণ করার পরে, অ্যাপ্লিকেশানগুলিকে এক্সটেনশন সক্ষম করার আগে নিম্নলিখিত তথ্যগুলি জিজ্ঞাসা করা উচিত৷
স্টিল ক্যাপচার লেটেন্সি রেঞ্জ:
ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRangeঅ্যাপটির জন্য ক্যাপচার লেটেন্সি রেঞ্জ রিটার্ন করে যে এটি বর্তমান পরিস্থিতিতে এক্সটেনশন সক্ষম করা উপযুক্ত কিনা তা মূল্যায়ন করতে।প্রিভিউ এবং ক্যাপচার সারফেসের জন্য সমর্থিত মাপ:
ImageCaptureExtenderImpl.getSupportedResolutionsএবংPreviewExtenderImpl.getSupportedResolutionsইমেজ ফরম্যাট এবং সারফেস ফরম্যাট এবং সাইজের জন্য সমর্থিত মাপগুলির একটি তালিকা প্রদান করে।সমর্থিত অনুরোধ এবং ফলাফল কী: Camera2/X আপনার বাস্তবায়ন থেকে সমর্থিত ক্যাপচার অনুরোধ কী এবং ফলাফল কীগুলি পুনরুদ্ধার করতে নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করে:
-
ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys -
ImageCaptureExtenderImpl.getAvailableCapturetResultKeys
-
Camera2/X সর্বদা init() কল করে এই এক্সটেন্ডার ক্লাসে আরও তথ্যের জন্য জিজ্ঞাসা করার আগে।
অ্যাপ ফ্লো 3: এক্সটেনশন সক্ষম করে পূর্বরূপ/এখনও ক্যাপচার (HAL বাস্তবায়ন)

চিত্র 5. বেসিক এক্সটেন্ডারে অ্যাপ ফ্লো 3
উপরের চিত্রটি প্রিভিউ সক্ষম করার মূল প্রবাহকে চিত্রিত করে এবং এখনও কোনও প্রসেসর ছাড়াই একটি এক্সটেনশনের সাথে ক্যাপচার করে৷ এর মানে হল ক্যামেরা HAL এক্সটেনশন প্রক্রিয়া করে।
এই প্রবাহে, Camera2/X প্রথমে init() তারপর onInit কল করে, যা আপনাকে জানায় যে একটি ক্যামেরা সেশন নির্দিষ্ট এক্সটেনশনের সাথে শুরু হতে চলেছে। আপনি onInit() এ হেভি-লিফটিং ইনিশিয়ালাইজেশন করতে পারেন।
CameraCaptureSession কনফিগার করার সময়, Camera2/X সেশনের পরামিতি পেতে onPresetSession চালু করে। ক্যাপচার সেশনটি সফলভাবে কনফিগার হওয়ার পরে, Camera2/X ক্যাপচার প্যারামিটার ধারণ করে একটি CaptureStageImpl উদাহরণ প্রদান করে onEnableSession আহ্বান করে। 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বিন্যাসে আউটপুট লিখতে হবে। প্রাকদর্শনের জন্যCameraCaptureSessionকনফিগার করতে Camera2/XPRIVATEপরিবর্তে একটিYUV_420_888পৃষ্ঠ ব্যবহার করে৷প্রবাহের জন্য নিম্নলিখিত চিত্রটি দেখুন:

চিত্র 6. 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 পৃষ্ঠে আউটপুট লেখার জন্য দায়ী।
আপনি নিরাপদে অনুমান করতে পারেন যে স্থির ক্যাপচার অনুরোধ পাঠানোর আগে পূর্বরূপ সক্রিয় এবং চলমান।
নীচের চিত্রে প্রবাহ দেখুন:

চিত্র 7. এখনও CaptureProcessorImpl দিয়ে ফ্লো ক্যাপচার করুন
ক্যামেরা2/X একটি
YUV_420_888ফর্ম্যাট পৃষ্ঠ ব্যবহার করে ক্যাপচার সেশন কনফিগার করার জন্য এখনও ক্যাপচার করার জন্য। Camera2/X কল করেCaptureProcessorImplপ্রস্তুত করে:-
YUV_420_888এর সাথেCaptureProcessorImpl.onImageFormatUpdate()। - ইনপুট চিত্রের আকার সহ
CaptureProcessorImpl.onResolutionUpdate()। - একটি আউটপুট
YUV_420_888পৃষ্ঠ সহCaptureProcessorImpl.onOutputSurface()।
-
ImageCaptureExtenderImpl.getCaptureStagesCaptureStageImplএর একটি তালিকা প্রদান করে, যেখানে প্রতিটি উপাদান ক্যামেরা2/X দ্বারা পাঠানো ক্যাপচার প্যারামিটার সহ একটিCaptureRequestউদাহরণে ম্যাপ করে। উদাহরণস্বরূপ, যদি এটি তিনটিCaptureStageImplদৃষ্টান্তের একটি তালিকা প্রদান করে, Camera2/XcaptureBurstAPI ব্যবহার করে সংশ্লিষ্ট ক্যাপচার প্যারামিটার সহ তিনটি ক্যাপচার অনুরোধ পাঠায়।প্রাপ্ত ছবি এবং
TotalCaptureResultদৃষ্টান্তগুলি একসাথে বান্ডিল করা হয় এবং প্রক্রিয়াকরণের জন্যCaptureProcessorImplএ পাঠানো হয়।CaptureProcessorImplonOutputSurface()কল দ্বারা নির্দিষ্ট আউটপুট পৃষ্ঠে ফলাফল চিত্র (YUV_420_888বিন্যাস) লেখে। ক্যামেরা2/X প্রয়োজনে এটিকে JPEG ছবিতে রূপান্তর করে।
সমর্থন ক্যাপচার অনুরোধ কী এবং ফলাফল
ক্যামেরা প্রিভিউ এবং ক্যাপচার ছাড়াও, অ্যাপগুলি জুম, ফ্ল্যাশ প্যারামিটার সেট করতে পারে বা ট্যাপ-টু-ফোকাস ট্রিগার করতে পারে। এই প্যারামিটারগুলি আপনার এক্সটেনশন বাস্তবায়নের সাথে সামঞ্জস্যপূর্ণ নাও হতে পারে৷
নিম্নলিখিত পদ্ধতিগুলি extensions-interface 1.3.0-তে যোগ করা হয়েছে যাতে আপনি আপনার বাস্তবায়ন সমর্থন করে এমন প্যারামিটারগুলিকে প্রকাশ করতে পারবেন:
-
ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys()আপনার বাস্তবায়ন দ্বারা সমর্থিত ক্যাপচার অনুরোধ কী ফেরত দেয়। -
ImageCaptureExtenderImpl.getAvailableCaptureResultKeys()ক্যাপচার ফলাফল কীগুলি ফেরত দেয় যা ক্যাপচার ফলাফলে থাকে।
ক্যামেরা HAL এক্সটেনশন প্রক্রিয়া করলে, Camera2/X CameraCaptureSession.CaptureCallback ক্যাপচার ফলাফল পুনরুদ্ধার করে। যাইহোক, যদি প্রসেসর প্রয়োগ করা হয়, তাহলে Camera2/X ProcessResultImpl এ ক্যাপচার ফলাফল পুনরুদ্ধার করে, যা PreviewImageProcessorImpl এবং CaptureProcessorImpl এ process() পদ্ধতিতে পাস করা হয়। 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_RATIO -
CaptureRequest#SCALER_CROP_REGION
-
- ফোকাস করতে ট্যাপ করুন:
-
CaptureRequest#CONTROL_AF_MODE -
CaptureRequest#CONTROL_AF_TRIGGER -
CaptureRequest#CONTROL_AF_REGIONS -
CaptureRequest#CONTROL_AE_REGIONS -
CaptureRequest#CONTROL_AWB_REGIONS
-
- ফ্ল্যাশ:
-
CaptureRequest#CONTROL_AE_MODE -
CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER -
CaptureRequest#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 অনুরোধ পাঠানোর ক্ষমতা: একটি জটিল মিথস্ক্রিয়া যুক্তি সমর্থন করে যা পূর্ববর্তী অনুরোধের ফলাফলের উপর ভিত্তি করে প্যারামিটার সহ ক্যাপচার অনুরোধ পাঠাতে পারে।
অ্যাডভান্সড এক্সটেন্ডার একটি মোড়ক, বা একটি মধ্যবর্তী স্তর প্রদান করে, যাতে আপনি স্ট্রিম কনফিগারেশন কাস্টমাইজ করতে পারেন এবং চাহিদা অনুযায়ী ক্যাপচার অনুরোধ পাঠাতে পারেন।
বাস্তবায়নের জন্য ফাইল
অ্যাডভান্সড এক্সটেন্ডার ইমপ্লিমেন্টে স্যুইচ করতে, ExtensionVersionImpl এ isAdvancedExtenderImplemented() পদ্ধতিটি অবশ্যই true ফিরে আসবে। প্রতিটি এক্সটেনশন প্রকারের জন্য, OEM-কে অবশ্যই সংশ্লিষ্ট এক্সটেন্ডার ক্লাসগুলি বাস্তবায়ন করতে হবে। অ্যাডভান্সড এক্সটেন্ডার বাস্তবায়ন ফাইলগুলি উন্নত প্যাকেজে রয়েছে।
| এক্সটেন্ডার ক্লাস বাস্তবায়ন করতে | |
|---|---|
| রাত্রি | advanced/NightAdvancedExtenderImpl.java |
| এইচডিআর | advanced/HdrAdvancedExtenderImpl.java |
| অটো | advanced/AutoAdvancedExtenderImpl.java |
| বোকেহ | advanced/BokehAdvancedExtenderImpl.java |
| ফেস রিটাচ | advanced/BeautyAdvancedExtenderImpl.java |
আমরা নিম্নলিখিত উদাহরণে একটি স্থানধারক হিসাবে AdvancedExtenderImpl ব্যবহার করি। আপনি যে এক্সটেনশনটি বাস্তবায়ন করছেন তার জন্য এক্সটেন্ডার ফাইলের নামের সাথে এটি প্রতিস্থাপন করুন।
আসুন দেখি কিভাবে ক্যামেরা2/X তিনটি অ্যাপ ফ্লো অর্জন করতে extensions-interface আহ্বান করে।
অ্যাপ ফ্লো 1: এক্সটেনশনের প্রাপ্যতা পরীক্ষা করুন

চিত্র 8. অ্যাডভান্সড এক্সটেন্ডারে অ্যাপ ফ্লো 1
প্রথমত, অ্যাপটি প্রদত্ত এক্সটেনশনটি সমর্থিত কিনা তা পরীক্ষা করে।
অ্যাপ ফ্লো 2: কোয়েরি তথ্য

চিত্র 9. অ্যাডভান্সড এক্সটেন্ডারে অ্যাপ ফ্লো 2
AdvancedExtenderImpl.init() এ কল করার পরে, অ্যাপটি AdvancedExtenderImpl এ নিম্নলিখিত তথ্যগুলি জিজ্ঞাসা করতে পারে:
আনুমানিক এখনও ক্যাপচার লেটেন্সি:
AdvancedExtenderImpl.getEstimatedCaptureLatencyRange()বর্তমান পরিস্থিতির জন্য এক্সটেনশন সক্ষম করা উপযুক্ত কিনা তা মূল্যায়ন করার জন্য অ্যাপটির ক্যাপচার লেটেন্সির পরিসর প্রদান করে।পূর্বরূপ এবং এখনও ক্যাপচারের জন্য সমর্থিত রেজোলিউশন:
AdvancedExtenderImpl.getSupportedPreviewOutputResolutions()আকারের তালিকায় চিত্র বিন্যাসের একটি মানচিত্র ফেরত দেয় যা পূর্বরূপ পৃষ্ঠ বিন্যাস এবং আকারের জন্য সমর্থিত। OEM গুলিকে অবশ্যই অন্ততPRIVATEফর্ম্যাট সমর্থন করতে হবে৷AdvancedExtenderImpl.getSupportedCaptureOutputResolutions()স্থির ক্যাপচার পৃষ্ঠের জন্য সমর্থিত বিন্যাস এবং মাপ প্রদান করে। OEMs অবশ্যইJPEGএবংYUV_420_888ফর্ম্যাট আউটপুট উভয় সমর্থন করবে৷AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions()চিত্র বিশ্লেষণের জন্য একটি অতিরিক্তYUV_420_888স্ট্রীমের জন্য সমর্থিত মাপ প্রদান করে। ইমেজ বিশ্লেষণ YUV পৃষ্ঠ সমর্থিত না হলে,getSupportedYuvAnalysisResolutions()nullবা একটি খালি তালিকা প্রদান করা উচিত।
উপলব্ধ ক্যাপচার অনুরোধ কী/ফলাফল (
extensions-interfaceযোগ করা হয়েছে 1.3.0): Camera2/X আপনার বাস্তবায়ন থেকে সমর্থিত ক্যাপচার অনুরোধ কী এবং ফলাফল কীগুলি পুনরুদ্ধার করতে নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করে:-
AdvancedExtenderImpl.getAvailableCaptureRequestKeys -
AdvancedExtenderImpl.getAvailableCaptureResultKeys
-
আরও তথ্যের জন্য, সমর্থন ক্যাপচার অনুরোধ কী এবং ফলাফল দেখুন।
অ্যাপ ফ্লো 3: এক্সটেনশন সক্ষম করে পূর্বরূপ/এখনও ক্যাপচার করুন

চিত্র 10. অ্যাডভান্সড এক্সটেন্ডারে অ্যাপ ফ্লো 3
উপরের চিত্রটি প্রিভিউ শুরু করার জন্য প্রধান প্রবাহ দেখায় এবং এখনও উন্নত এক্সটেন্ডার প্রকারের জন্য ক্যাপচার করে। আসুন প্রতিটি পদক্ষেপের মধ্য দিয়ে হেঁটে যাই।
SessionProcessorImplউদাহরণকোর অ্যাডভান্সড এক্সটেন্ডার বাস্তবায়ন
SessionProcessorImplএ রয়েছে, যা কাস্টমাইজড সেশন কনফিগারেশন প্রদানের জন্য এবং প্রিভিউ শুরু করতে এবং এখনও ক্যাপচার অনুরোধ পাঠানোর জন্য দায়ী।AdvancedExtenderImpl.createSessionProcessor()SessionProcessorImplদৃষ্টান্ত ফেরত দেওয়ার জন্য আহ্বান করা হয়েছে।initSessionSessionProcessorImpl.initSession()এক্সটেনশনের জন্য সেশন শুরু করে। এখানেই আপনি সম্পদ বরাদ্দ করেন এবং একটিCameraCaptureSessionপ্রস্তুত করার জন্য একটি সেশন কনফিগারেশন ফেরত দেন।ইনপুট পরামিতিগুলির জন্য, Camera2/X পূর্বরূপ, এখনও ক্যাপচার এবং একটি ঐচ্ছিক YUV চিত্র বিশ্লেষণের জন্য আউটপুট পৃষ্ঠের কনফিগারেশনগুলি নির্দিষ্ট করে৷ এই আউটপুট সারফেস কনফিগারেশন (
OutputSurfaceImpl) এ সারফেস, সাইজ এবং ইমেজ ফরম্যাট রয়েছে যাAdvancedExtenderImplএ নিম্নলিখিত পদ্ধতি দ্বারা পুনরুদ্ধার করা হয়:-
getSupportedPreviewOutputResolutions() -
getSupportedCaptureOutputResolutions() -
getSupportedYuvAnalysisResolutions()
আপনাকে অবশ্যই একটি
Camera2SessionConfigImplদৃষ্টান্ত ফেরত দিতে হবে, যাCamera2OutputConfigImplদৃষ্টান্তগুলির একটি তালিকা এবংCameraCaptureSessionকনফিগার করার জন্য ব্যবহৃত সেশন প্যারামিটারগুলি নিয়ে গঠিত। Camera2/X দ্বারা পাস করা আউটপুট পৃষ্ঠগুলিতে সঠিক ক্যামেরা চিত্রগুলি আউটপুট করার জন্য আপনি দায়ী৷ আউটপুট সক্ষম করার জন্য এখানে কিছু বিকল্প রয়েছে:- ক্যামেরা HAL-এ প্রক্রিয়াকরণ: আপনি একটি
SurfaceOutputConfigImplবাস্তবায়নের মাধ্যমেCameraCaptureSessionসেশনে সরাসরি আউটপুট পৃষ্ঠগুলি যুক্ত করতে পারেন। এটি ক্যামেরা পাইপলাইনে সরবরাহকৃত আউটপুট পৃষ্ঠকে কনফিগার করে এবং ক্যামেরা HAL কে ছবিটি প্রক্রিয়া করার অনুমতি দেয়। মধ্যবর্তী
ImageReaderপৃষ্ঠ (RAW, YUV, ইত্যাদি) প্রক্রিয়াকরণ: একটিImageReaderOutputConfigImplউদাহরণ সহCameraCaptureSessionএ অন্তর্বর্তীImageReaderপৃষ্ঠগুলি যুক্ত করুন।আপনাকে মধ্যবর্তী চিত্রগুলি প্রক্রিয়া করতে হবে এবং ফলাফলের চিত্রটি আউটপুট পৃষ্ঠে লিখতে হবে।
- Camera2 সারফেস শেয়ারিং ব্যবহার করুন: অন্য
Camera2OutputConfigImplউদাহরণেরgetSurfaceSharingOutputConfigs()পদ্ধতিতে যেকোনোCamera2OutputConfigImplউদাহরণ যোগ করে অন্য সারফেসের সাথে সারফেস শেয়ারিং ব্যবহার করুন। পৃষ্ঠ বিন্যাস এবং আকার অভিন্ন হতে হবে।
SurfaceOutputConfigImplএবংImageReaderOutputConfigImplসহ সমস্তCamera2OutputConfigImplএকটি অনন্য আইডি (getId()) থাকতে হবে, যা লক্ষ্য পৃষ্ঠ নির্দিষ্ট করতে এবংImageReaderOutputConfigImplথেকে ছবিটি পুনরুদ্ধার করতে ব্যবহৃত হয়।-
onCaptureSessionStartএবংRequestProcessorImplযখন
CameraCaptureSessionশুরু হয় এবং ক্যামেরা ফ্রেমওয়ার্কonConfigured()আহ্বান করে, তখন Camera2/X Camera2 অনুরোধের মোড়কেRequestProcessImplসহSessionProcessorImpl.onCaptureSessionStart()আহ্বান করে। Camera2/XRequestProcessImplপ্রয়োগ করে, যা আপনাকে ক্যাপচার অনুরোধগুলি কার্যকর করতে এবংImageReaderOutputConfigImplব্যবহার করা হলে ছবিগুলি পুনরুদ্ধার করতে সক্ষম করে।RequestProcessImplAPIগুলি অনুরোধগুলি কার্যকর করার ক্ষেত্রে Camera2CameraCaptureSessionAPI-এর মতো। পার্থক্যগুলো হল:- লক্ষ্য পৃষ্ঠ
Camera2OutputConfigImplউদাহরণের ID দ্বারা নির্দিষ্ট করা হয়। -
ImageReaderএর ইমেজ পুনরুদ্ধার করার ক্ষমতা।
আপনি একটি নির্দিষ্ট
Camera2OutputConfigImplআইডি সহRequestProcessorImpl.setImageProcessor()কল করতে পারেন ছবিগুলি পেতে একটিImageProcessorImplউদাহরণ নিবন্ধন করতে৷Camera2/X
SessionProcessorImpl.onCaptureSessionEnd()কল করার পরেRequestProcessImplউদাহরণটি অবৈধ হয়ে যায়।- লক্ষ্য পৃষ্ঠ
পূর্বরূপ শুরু করুন এবং একটি ছবি তুলুন
অ্যাডভান্সড এক্সটেন্ডার বাস্তবায়নে, আপনি
RequestProcessorImplইন্টারফেসের মাধ্যমে ক্যাপচার অনুরোধ পাঠাতে পারেন। Camera2/X আপনাকে যথাক্রমেSessionProcessorImpl#startRepeatingএবংSessionProcessorImpl#startCaptureকল করে প্রিভিউ বা স্টিল ক্যাপচার সিকোয়েন্সের জন্য পুনরাবৃত্তির অনুরোধ শুরু করতে বিজ্ঞপ্তি দেয়। এই পূর্বরূপ এবং স্থির-ক্যাপচার অনুরোধগুলি পূরণ করতে আপনার ক্যাপচার অনুরোধগুলি পাঠানো উচিত।Camera2/X এছাড়াও
SessionProcessorImpl#setParametersমাধ্যমে ক্যাপচার রিকোয়েস্ট প্যারামিটার সেট করে। পুনরাবৃত্তি এবং একক অনুরোধ উভয় ক্ষেত্রেই আপনাকে অবশ্যই এই অনুরোধের পরামিতিগুলি (যদি পরামিতি সমর্থিত হয়) সেট করতে হবে।আপনাকে অবশ্যই অন্তত
CaptureRequest.JPEG_ORIENTATIONএবংCaptureRequest.JPEG_QUALITYসমর্থন করতে হবে।extensions-interface1.3.0 অনুরোধ এবং ফলাফল কী সমর্থন করে, যা নিম্নলিখিত পদ্ধতি দ্বারা উন্মুক্ত করা হয়:-
AdvancedExtenderImpl.getAvailableCaptureRequestKeys() -
AdvancedExtenderImpl.getAvailableCaptureResultKeys()
যখন বিকাশকারীরা
getAvailableCaptureRequestKeysতালিকায় কীগুলি সেট করে, তখন আপনাকে অবশ্যই প্যারামিটারগুলি সক্রিয় করতে হবে এবং নিশ্চিত করতে হবে যে ক্যাপচার ফলাফলেgetAvailableCaptureResultKeysতালিকার কী রয়েছে৷-
startTriggerCaptureRequest.CONTROL_AF_TRIGGERএবংCaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGERএর মতো ট্রিগার শুরু করার জন্যSessionProcessorImpl.startTrigger()চালু করা হয়েছে।AdvancedExtenderImpl.getAvailableCaptureRequestKeys()এ বিজ্ঞাপন দেওয়া হয়নি এমন কোনও ক্যাপচার অনুরোধ কী আপনি উপেক্ষা করতে পারেন।startTrigger()extensions-interface1.3.0 থেকে সমর্থিত হয়েছে। এটি অ্যাপ্লিকেশানগুলিকে ট্যাপ-টু-ফোকাস এবং এক্সটেনশনগুলির সাথে ফ্ল্যাশ প্রয়োগ করতে সক্ষম করে৷পরিষ্কার করুন
একটি ক্যাপচার সেশন শেষ করার সময়,
CameraCaptureSessionবন্ধ করার আগেSessionProcessorImpl.onCaptureSessionEnd()ডাকা হয়। ক্যাপচার সেশন বন্ধ হয়ে যাওয়ার পর,deInitSession()ক্লিন আপ করে।
সমর্থন পূর্বরূপ, এখনও ক্যাপচার, এবং চিত্র বিশ্লেষণ
আপনার প্রিভিউ এবং এখনও ক্যাপচার ব্যবহারের ক্ষেত্রে উভয়ের জন্য এক্সটেনশন প্রয়োগ করা উচিত। যাইহোক, যদি প্রিভিউটি মসৃণভাবে দেখানোর জন্য লেটেন্সি খুব বেশি হয়, আপনি শুধুমাত্র স্থির ক্যাপচারের জন্য এক্সটেনশন প্রয়োগ করতে পারেন।
বেসিক এক্সটেন্ডার টাইপের জন্য, প্রিভিউয়ের জন্য এক্সটেনশন সক্রিয় করা নির্বিশেষে, আপনাকে অবশ্যই একটি প্রদত্ত এক্সটেনশনের জন্য ImageCaptureExtenderImpl এবং PreviewExtenderImpl উভয়ই প্রয়োগ করতে হবে। প্রায়শই, একটি অ্যাপ একটি YUV স্ট্রিম ব্যবহার করে ছবির বিষয়বস্তু যেমন QR কোড বা টেক্সট খোঁজার মতো বিশ্লেষণ করতে। To better support this use case , you should support the stream combination of preview, still capture, and a YUV_420_888 stream for configuring CameraCaptureSession . This means that if you implement a processor, then you have to support the stream combination of three YUV_420_888 streams.
For Advanced Extender, Camera2/X passes three output surfaces to the SessionProcessorImpl.initSession() call. These output surfaces are for preview , still capture, and image analysis, respectively. You must ensure that preview and still capture output surfaces show the valid output. However, for the image analysis output surface, ensure it's working only when it's non-null. If your implementation can't support the image analysis stream, you can return an empty list in AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions() . This ensures the image analysis output surface is always null in SessionProcessorImpl.initSession() .
Support video capture
The current Camera Extension architecture supports only the preview and still capture use cases. We don't support enabling the extension on the MediaCodec or MediaRecorder surfaces for recording the video. However, it's possible for apps to record the preview output.
Supporting MediaCodec and MediaRecorder surfaces is under investigation.
Extension-specific metadata
For Android 14 and higher, extension-specific metadata lets camera extension clients set and receive extension specific capture request settings and results. Specifically, camera extension clients can use the EXTENSION_STRENGTH capture request parameter to control the extension strength and the EXTENSION_CURRENT_TYPE capture result to indicate the enabled extension type.
Capture requests
The EXTENSION_STRENGTH capture request parameter controls the strength of the extension post-processing effect. The corresponding capture result includes the default strength value if this parameter isn't set explicitly by the client. This parameter can be applied as follows for these extension types:
-
BOKEH: Controls the amount of blur. -
HDRandNIGHT: Controls the amount of images fused and the brightness of the final image. -
FACE_RETOUCH: Controls the amount of cosmetic enhancement and skin smoothing.
The supported range for the EXTENSION_STRENGTH parameter is between 0 and 100 , with 0 indicating no extension processing or simple passthrough and 100 indicating the maximum extension strength of the processing effect.
To add support for EXTENSION_STRENGTH , use the vendor specific parameter APIs introduced in version 1.3.0 of the extension library interface. For more information, see getAvailableCaptureRequestKeys() .
Capture results
The EXTENSION_CURRENT_TYPE capture result lets extension implementations notify clients about the active extension type.
Because extensions using the AUTO type dynamically switch between extension types such as HDR and NIGHT depending on the scene conditions, camera extensions apps can use EXTENSION_CURRENT_TYPE to display information about the current extension selected by the AUTO extension.
Real-time still capture latency estimate
For Android 14 and higher, camera extension clients can query real-time still capture latency estimates based on the scene and environment conditions using getRealtimeStillCaptureLatency() . This method provides more accurate estimates than the static getEstimatedCaptureLatencyRangeMillis() method. Based on the latency estimate, apps can decide to skip extension processing or to display an indication to notify users about a long running operation.
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();
To support real-time still capture latency estimates, implement the following:
- Basic extensions:
ImageCaptureExtenderImpl.getRealtimeCaptureLatency() - Advanced extensions:
SessionProcessorImpl.getRealtimeCaptureLatency
Capture processing progress callbacks
For Android 14 and higher, camera extension clients can receive callbacks for the progress of long running still capture processing operations. Apps can display the current progress to users to improve the overall user experience.
Apps can use the following code to integrate this feature:
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
}
}
…
}
To support capture processing progress callbacks, your extension vendor implementation must call the following callbacks with the current progress value:
- Basic extensions:
ProcessResultImpl.onCaptureProcessProgressed() - Advanced extensions:
CaptureCallback.onCaptureProcessProgressed()
Postview still capture
For Android 14 and higher, camera extensions can supply a postview (preview image) using setPostviewOutputConfiguration . To improve the user experience, apps can display a postview image as a placeholder when an extension is experiencing increased processing latency, and replace the image when the final image is available. Apps can configure and issue postview capture requests using the following reference code:
{
…
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();
…
}
To support postview still capture, your vendor implementation must implement the following:
Basic extensions:
CaptureProcessorImpl.onPostviewOutputSurfaceandCaptureProcessorImpl.processWithPostviewAdvanced extensions:
SessionProcessorImpl.startCaptureWithPostview
Support SurfaceView output
For Android 14 and higher, camera extension clients can use power and performance optimized preview render paths by registering a SurfaceView instance for preview output for repeating requests.
To support SurfaceView output, your vendor extension implementation must be capable of streaming and outputting preview to SurfaceView instances. To verify that this is supported, run the SurfaceViewExtensionPreviewTest.java CTS module.
Vendor specific session types
The feature enables vendor extension implementations to select a vendor specific session type that will be set in the internal camera capture session instead of the default value.
The feature works entirely within the framework and vendor stack and has no client/public visible API impact.
To select a vendor-specific session type, implement the following for your extension libraries: * ExtenderStateListener.onSessionType() for basic extensions * Camera2SessionConfigImpl.getSessionType() for advanced extensions
Extensions interface version history
The following table shows the Camera Extension interface version history. You should always implement the vendor library with the latest version.
| সংস্করণ | বৈশিষ্ট্য যোগ করা হয়েছে |
|---|---|
| 1.0.0 |
|
| 1.1.0 |
|
| 1.2.0 |
|
| 1.3.0 |
|
| 1.4.0 |
|
রেফারেন্স বাস্তবায়ন
The following reference OEM vendor library implementations are available in frameworks/ex .
advancedSample: A basic implementation of Advanced Extender.sample: A basic implementation of Basic Extender.service_based_sample: An implementation that demonstrates how to host Camera Extensions in aService. This implementation contains the following components:oem_library: A Camera Extensions OEM library for Camera2 and CameraX Extensions APIs that implementsExtensions-Interface. This acts as a passthrough that forwards calls fromExtensions-Interfaceto the service. This library also provides AIDL files and wrapper classes to communicate with the service.Advanced Extender is enabled by default. To enable the Basic Extender, change
ExtensionsVersionImpl#isAdvancedExtenderImplementedto returnfalse.extensions_service: A sample implementation of the Extensions Service. Add your implementation here. The interface to implement in the service is similar to theExtensions-Interface. For example, implementing theIAdvancedExtenderImpl.Stubperforms the same operations asAdvancedExtenderImpl.ImageWrapperandTotalCaptureResultWrapperare required to makeImageandTotalCaptureResultparcelable.
Set up the vendor library on a device
The OEM vendor library isn't built into an app; it's loaded from the device at runtime by Camera2/X. In CameraX, the <uses-library> tag declares that the androidx.camera.extensions.impl library, which is defined in the AndroidManifest.xml file of the camera-extensions library, is a dependency of CameraX and must be loaded at runtime. In Camera2, the framework loads an extensions service that also declares that the <uses-library> loads the same androidx.camera.extensions.impl library at runtime.
This allows third-party apps using extensions to automatically load the OEM vendor library. The OEM library is marked as optional so apps can run on devices that don't have the library on the device. Camera2/X handles this behavior automatically when an app tries to use a camera extension as long as the device manufacturer places the OEM library on the device so that it can be discovered by the app.
To set up the OEM library on a device, do the following:
- Add a permission file, which is required by the
<uses-library>tag, using the following format:/etc/permissions/ ANY_FILENAME .xml. For example,/etc/permissions/camera_extensions.xml. The files in this directory provide a mapping of the library named in<uses-library>to the actual file path on the device. Use the example below to add the required information to the file.
-
namemust beandroidx.camera.extensions.implas that's the library that CameraX searches for. -
fileis the absolute path of the file that contains the extensions implementation (for example,/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>
-
In Android 12 or higher, devices supporting CameraX extensions must have the ro.camerax.extensions.enabled property set to true , which allows for querying whether a device supports extensions. To do this, add the following line in the device make file:
PRODUCT_VENDOR_PROPERTIES += \
ro.camerax.extensions.enabled=true \
বৈধতা
To test your implementation of the OEM vendor library during the development stage, use the example app at androidx-main/camera/integration-tests/extensionstestapp/ , which runs through various vendor extensions.
After you complete your implementation, use the camera extensions validation tool to run automated and manual tests to verify that the vendor library is implemented correctly.
Extended scene mode versus camera extensions
For the bokeh extension, in addition to exposing it using camera extensions, you can expose the extension using the extended scene mode, which is enabled through the CONTROL_EXTENDED_SCENE_MODE key. For more implementation details, see Camera bokeh .
Extended scene mode has fewer restrictions compared to camera extensions for camera2 apps. For example, you can enable extended scene mode in a regular CameraCaptureSession instance that supports flexible stream combinations and capture request parameters. In contrast, camera extensions support only a fixed set of stream types and have limited support for capture request parameters.
A downside of extended scene mode is that you can only implement it in the camera HAL, which means that it must be verified to work across all orthogonal controls available to app developers.
We recommend exposing bokeh using both the extended scene mode and Camera Extensions because apps might prefer to use a particular API to enable bokeh. We recommend first using the extended scene mode because this is the most flexible way for apps to enable the bokeh extension. Then you can implement the camera extensions interface based on the extended scene mode. If implementing bokeh in the camera HAL is difficult, for example, because it requires a post processor running in the app layer to process images, we recommend implementing the bokeh extension using the Camera Extensions interface.
প্রায়শই জিজ্ঞাসিত প্রশ্ন (FAQs)
Are there any restrictions on API levels?
হ্যাঁ। This depends on the Android API feature set that's required by the OEM vendor library implementation. For example, ExtenderStateListener.onPresetSession() uses the SessionConfiguration.setSessionParameters() call to set a baseline set of tags. This call is available only on API level 28 and higher. For details on specific interface methods, see the API reference documentation .