ক্যামেরা এক্সটেনশন

ডিভাইস নির্মাতারা OEM ভেন্ডর লাইব্রেরি দ্বারা প্রদত্ত ক্যামেরা এক্সটেনশন ইন্টারফেসের মাধ্যমে বোকেহ, নাইট মোড এবং HDR-এর মতো এক্সটেনশনগুলো তৃতীয় পক্ষের ডেভেলপারদের কাছে উন্মুক্ত করতে পারে। ডেভেলপাররা OEM ভেন্ডর লাইব্রেরিতে বাস্তবায়িত এক্সটেনশনগুলো অ্যাক্সেস করার জন্য Camera2 Extensions API এবং CameraX Extensions API ব্যবহার করতে পারে।

সমর্থিত এক্সটেনশনগুলির তালিকার জন্য, যা Camera2 এবং CameraX উভয় ক্ষেত্রেই একই, CameraX এক্সটেনশন API দেখুন। আপনি যদি কোনো এক্সটেনশন যোগ করতে চান, তাহলে Issue Tracker- এ একটি বাগ রিপোর্ট করুন।

এই পৃষ্ঠায় ডিভাইসগুলিতে OEM ভেন্ডর লাইব্রেরি কীভাবে প্রয়োগ এবং সক্রিয় করতে হয় তা বর্ণনা করা হয়েছে।

স্থাপত্য

নিম্নোক্ত ডায়াগ্রামটি ক্যামেরা এক্সটেনশন ইন্টারফেস বা extensions-interface স্থাপত্য বর্ণনা করে: স্থাপত্য

চিত্র ১. ক্যামেরা এক্সটেনশন আর্কিটেকচার ডায়াগ্রাম

ডায়াগ্রামে যেমন দেখানো হয়েছে, ক্যামেরা এক্সটেনশন সমর্থন করার জন্য, আপনাকে OEM ভেন্ডর লাইব্রেরি দ্বারা প্রদত্ত extensions-interface ইমপ্লিমেন্ট করতে হবে। আপনার OEM ভেন্ডর লাইব্রেরি দুটি API সক্রিয় করে: CameraX এক্সটেনশন API এবং Camera2 এক্সটেনশন 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

HDR এক্সটেন্ডার ক্লাসসমূহ (যদি HDR এক্সটেনশন সমর্থিত হয় তবে এটি প্রয়োগ করুন)

  • HdrImageCaptureExtenderImpl.java
  • HdrPreviewExtenderImpl.java
  • advanced/HdrAdvancedExtenderImpl.java

ফেস রিটাচ এক্সটেন্ডার ক্লাসসমূহ (যদি ফেস রিটাচ এক্সটেনশন সমর্থিত হয় তবে এটি প্রয়োগ করুন)

  • BeautyImageCaptureExtenderImpl.java
  • BeautyPreviewExtenderImpl.java
  • advanced/BeautyAdvancedExtenderImpl.java

ইউটিলিটি (ঐচ্ছিক, মুছে ফেলা যেতে পারে)

  • advanced/Camera2OutputConfigImplBuilder.java
  • advanced/Camera2SessionConfigImplBuilder.java

প্রতিটি এক্সটেনশনের জন্য ইমপ্লিমেন্টেশন প্রদান করা আপনার জন্য বাধ্যতামূলক নয়। যদি আপনি কোনো এক্সটেনশন ইমপ্লিমেন্ট না করেন, তাহলে isExtensionAvailable() ফাংশনটিকে false রিটার্ন করার জন্য সেট করুন অথবা সংশ্লিষ্ট Extender ক্লাসগুলো সরিয়ে ফেলুন। Camera2 এবং CameraX এক্সটেনশন এপিআইগুলো অ্যাপকে জানিয়ে দেয় যে এক্সটেনশনটি অনুপলব্ধ।

চলুন দেখে নেওয়া যাক, একটি এক্সটেনশন সক্রিয় করার জন্য Camera2 এবং CameraX এক্সটেনশন API-গুলো কীভাবে ভেন্ডর লাইব্রেরির সাথে কাজ করে। নিচের ডায়াগ্রামটিতে Night এক্সটেনশনকে উদাহরণ হিসেবে ব্যবহার করে সম্পূর্ণ কার্যপ্রবাহটি দেখানো হয়েছে:

মূল প্রবাহ

চিত্র ২. রাত্রিকালীন সম্প্রসারণ বাস্তবায়ন

  1. সংস্করণ যাচাইকরণ:

    OEM দ্বারা বাস্তবায়িত extensions-interface সংস্করণটি Camera2/X সমর্থিত সংস্করণগুলির সাথে সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করার জন্য Camera2/X ExtensionVersionImpl.checkApiVersion() কল করে।

  2. ভেন্ডর লাইব্রেরি প্রারম্ভিককরণ:

    InitializerImpl একটি init() মেথড আছে যা ভেন্ডর লাইব্রেরিটি ইনিশিয়ালাইজ করে। Camera2/X এক্সটেন্ডার ক্লাসগুলো অ্যাক্সেস করার আগে এই ইনিশিয়ালাইজেশন সম্পন্ন করে।

  3. এক্সটেন্ডার ক্লাস ইনস্ট্যানশিয়েট করুন:

    এক্সটেনশনটির জন্য এক্সটেন্ডার ক্লাসগুলো ইনস্ট্যানশিয়েট করে। এক্সটেন্ডার দুই প্রকারের হয়: বেসিক এক্সটেন্ডার এবং অ্যাডভান্সড এক্সটেন্ডার। সমস্ত এক্সটেনশনের জন্য আপনাকে অবশ্যই যেকোনো একটি এক্সটেন্ডার টাইপ ইমপ্লিমেন্ট করতে হবে। আরও তথ্যের জন্য, বেসিক এক্সটেন্ডার বনাম অ্যাডভান্সড এক্সটেন্ডার দেখুন।

    Camera2/X তথ্য পুনরুদ্ধার করতে এবং এক্সটেনশনটি সক্রিয় করতে এক্সটেন্ডার ক্লাসগুলোকে ইনস্ট্যানশিয়েট করে এবং সেগুলোর সাথে ইন্টারঅ্যাক্ট করে। একটি নির্দিষ্ট এক্সটেনশনের জন্য, Camera2/X একাধিকবার এক্সটেন্ডার ক্লাসগুলোকে ইনস্ট্যানশিয়েট করতে পারে। ফলস্বরূপ, কনস্ট্রাক্টর বা init() কলে ভারী ইনিশিয়ালাইজেশন করবেন না। এই ভারী কাজটি কেবল তখনই করুন যখন ক্যামেরা সেশন শুরু হতে চলেছে, যেমন বেসিক এক্সটেন্ডারে onInit() বা অ্যাডভান্সড এক্সটেন্ডারে initSession() কল করা হলে।

    Night এক্সটেনশনের জন্য, Basic Extender টাইপের ক্ষেত্রে নিম্নলিখিত Extender ক্লাসগুলো ইনস্ট্যানশিয়েট করা হয়:

    • NightImageCaptureExtenderImpl.java
    • NightPreviewExtenderImpl.java

    এবং অ্যাডভান্সড এক্সটেন্ডার টাইপের জন্য:

    • NightAdvancedExtenderImpl.java
  4. এক্সটেনশনের প্রাপ্যতা যাচাই করুন:

    এক্সটেনশনটি সক্রিয় করার আগে, isExtensionAvailable() ফাংশনটি Extender ইনস্ট্যান্সের মাধ্যমে যাচাই করে দেখে যে নির্দিষ্ট ক্যামেরা আইডিতে এক্সটেনশনটি উপলব্ধ আছে কি না।

  5. ক্যামেরার তথ্য দিয়ে এক্সটেন্ডারটি চালু করুন:

    Camera2/X, Extender ইনস্ট্যান্সের init() কল করে এবং এটিকে ক্যামেরা আইডি ও CameraCharacteristics পাস করে।

  6. তথ্য অনুসন্ধান করুন:

    এক্সটেনশনটি সক্রিয় করার প্রস্তুতির জন্য, সমর্থিত রেজোলিউশনের মতো তথ্য পুনরুদ্ধার করতে, আনুমানিক লেটেন্সি ক্যাপচার করতে এবং এক্সটেন্ডার থেকে রিকোয়েস্ট কী ক্যাপচার করতে এক্সটেন্ডার ক্লাসটিকে কল করা হয়।

  7. এক্সটেন্ডারে এক্সটেনশনটি সক্রিয় করুন:

    এক্সটেন্ডার ক্লাসটি ক্লাসটি সক্রিয় করার জন্য প্রয়োজনীয় সমস্ত ইন্টারফেস সরবরাহ করে। এটি OEM ইমপ্লিমেন্টেশনকে Camera2 পাইপলাইনে সংযুক্ত করার একটি ব্যবস্থা প্রদান করে, যেমন ক্যাপচার রিকোয়েস্ট প্যারামিটার ইনজেক্ট করা বা একটি পোস্ট প্রসেসর সক্রিয় করা।

    অ্যাডভান্সড এক্সটেন্ডার টাইপের ক্ষেত্রে, এক্সটেনশনটি সক্রিয় করার জন্য Camera2/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 এবং ভেন্ডর লাইব্রেরির এক্সটেনশন-ইন্টারফেসের প্রধান সংস্করণগুলো ভিন্ন হলে, সেটিকে অসামঞ্জস্যপূর্ণ বলে গণ্য করা হয় এবং এক্সটেনশনটি নিষ্ক্রিয় হয়ে যায়।

পশ্চাৎ সামঞ্জস্যতা

যতক্ষণ পর্যন্ত প্রধান সংস্করণটি অভিন্ন থাকে, Camera2/X পূর্ববর্তী extensions-interface সংস্করণ দিয়ে তৈরি OEM ভেন্ডর লাইব্রেরিগুলোর সাথে পশ্চাৎ সামঞ্জস্যতা নিশ্চিত করে। উদাহরণস্বরূপ, যদি Camera2/X extensions-interface ১.৩.০ সমর্থন করে, তাহলে যে 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 লাইব্রেরিকে সংকেত দেয় যে একটি অ্যাপ এক্সটেনশন ব্যবহার করার চেষ্টা করছে।

OEM ভেন্ডর লাইব্রেরি ইনিশিয়ালাইজেশন সম্পন্ন হওয়ার বিজ্ঞপ্তি দেওয়ার জন্য OnExtensionsInitializedCallback.onSuccess() কল না করা পর্যন্ত Camera2/X (ভার্সন চেকিং ছাড়া) OEM লাইব্রেরিতে অন্য কোনো কল করে না।

extensions-interface 1.1.0 সংস্করণ থেকে আপনাকে অবশ্যই InitializerImpl ইমপ্লিমেন্ট করতে হবে। যদি OEM ভেন্ডর লাইব্রেরি extensions-interface 1.0.0 ইমপ্লিমেন্ট করে, তাহলে Camera2/X লাইব্রেরি ইনিশিয়ালাইজেশন ধাপটি এড়িয়ে যাবে।

বেসিক এক্সটেন্ডার বনাম অ্যাডভান্সড এক্সটেন্ডার

extensions-interface বাস্তবায়নের দুটি প্রকার রয়েছে: বেসিক এক্সটেন্ডার এবং অ্যাডভান্সড এক্সটেন্ডার। extensions-interface ১.২.০ সংস্করণ থেকে অ্যাডভান্সড এক্সটেন্ডার সমর্থিত হয়ে আসছে।

যেসব এক্সটেনশন ক্যামেরা HAL-এ ছবি প্রসেস করে অথবা YUV স্ট্রিম প্রসেস করতে সক্ষম কোনো পোস্ট প্রসেসর ব্যবহার করে, তাদের জন্য বেসিক এক্সটেন্ডার প্রয়োগ করুন।

যেসব এক্সটেনশনের Camera2 স্ট্রিম কনফিগারেশন কাস্টমাইজ করার এবং প্রয়োজন অনুযায়ী ক্যাপচার রিকোয়েস্ট পাঠানোর প্রয়োজন হয়, তাদের জন্য অ্যাডভান্সড এক্সটেন্ডার প্রয়োগ করুন।

তুলনার জন্য নিচের সারণিটি দেখুন:

বেসিক এক্সটেন্ডার অ্যাডভান্সড এক্সটেন্ডার
স্ট্রিম কনফিগারেশন স্থির
প্রিভিউ: PRIVATE অথবা YUV_420_888 (যদি প্রসেসর বিদ্যমান থাকে)
স্থিরচিত্র: JPEG অথবা YUV_420_888 (যদি প্রসেসর থাকে)
OEM দ্বারা কাস্টমাইজযোগ্য।
ক্যাপচার অনুরোধ পাঠানো হচ্ছে শুধুমাত্র Camera2/X-ই ক্যাপচার রিকোয়েস্ট পাঠাতে পারে। আপনি এই রিকোয়েস্টগুলোর জন্য প্যারামিটার সেট করতে পারেন। যখন ইমেজ ক্যাপচারের জন্য প্রসেসরকে নির্দেশ দেওয়া হয়, তখন Camera2/X একাধিক ক্যাপচার রিকোয়েস্ট পাঠাতে পারে এবং সমস্ত ছবি ও ক্যাপচারের ফলাফল প্রসেসরের কাছে পাঠিয়ে দিতে পারে। ক্যামেরা২ ক্যাপচার অনুরোধটি কার্যকর করতে এবং ফলাফল ও ছবি পেতে আপনাকে একটি RequestProcessorImpl ইনস্ট্যান্স প্রদান করা হয়েছে।

Camera2/X, প্রিভিউয়ের জন্য পুনরাবৃত্তিমূলক অনুরোধ শুরু করতে এবং স্থিরচিত্র তোলার ক্রম শুরু করতে যথাক্রমে OEM-কে সংকেত দেওয়ার জন্য SessionProcessorImpl এর startRepeating এবং startCapture ব্যবহার করে।

ক্যামেরা পাইপলাইনে হুক
  • onPresetSession সেশন প্যারামিটার প্রদান করে।
  • CameraCaptureSession কনফিগার করার ঠিক পরেই onEnableSession একটিমাত্র অনুরোধ পাঠায়।
  • CameraCaptureSession বন্ধ হওয়ার আগে onDisableSession একটিমাত্র অনুরোধ পাঠায়।
  • initSession ক্যাপচার সেশন তৈরির জন্য একটি কাস্টমাইজড ক্যামেরা২ সেশন কনফিগারেশন শুরু করে এবং ফেরত দেয়।
  • CameraCaptureSession কনফিগার করার ঠিক পরেই onCaptureSessionStart কল করা হয়।
  • CameraCaptureSession বন্ধ হওয়ার আগে onCaptureSessionEnd কল করা হয়।
এর জন্য উপযুক্ত ক্যামেরার HAL-এ অথবা YUV ছবি প্রক্রিয়াকারী কোনো প্রসেসরে বাস্তবায়িত এক্সটেনশনসমূহ।
  • এক্সটেনশনগুলোর জন্য ক্যামেরা২-ভিত্তিক বাস্তবায়ন রয়েছে।
  • RAW স্ট্রিমের মতো কাস্টমাইজড স্ট্রিম কনফিগারেশন প্রয়োজন।
  • ইন্টারেক্টিভ ক্যাপচার সিকোয়েন্স প্রয়োজন।
সমর্থিত এপিআই সংস্করণ ক্যামেরা২ এক্সটেনশন: অ্যান্ড্রয়েড ১৩ বা তার উচ্চতর সংস্করণ
ক্যামেরাএক্স এক্সটেনশন: camera-extensions ১.১.০ বা উচ্চতর সংস্করণ
ক্যামেরা২ এক্সটেনশন: অ্যান্ড্রয়েড ১২এল বা উচ্চতর সংস্করণ
ক্যামেরাএক্স এক্সটেনশন: camera-extensions ১.২.০-আলফা০৩ বা উচ্চতর সংস্করণ

অ্যাপ প্রবাহ

নিম্নলিখিত সারণীতে তিন ধরনের অ্যাপ ফ্লো এবং তাদের সংশ্লিষ্ট ক্যামেরা এক্সটেনশন এপিআই কলগুলো দেখানো হয়েছে। যদিও Camera2/X এই এপিআইগুলো সরবরাহ করে, এই ফ্লোগুলোকে সমর্থন করার জন্য আপনাকে অবশ্যই ভেন্ডর লাইব্রেরিটি যথাযথভাবে প্রয়োগ করতে হবে, যা আমরা পরবর্তী একটি বিভাগে আরও বিস্তারিতভাবে বর্ণনা করব।

ক্যামেরা২ এক্সটেনশন ক্যামেরাএক্স এক্সটেনশন
কোয়েরি এক্সটেনশনের প্রাপ্যতা CameraExtensionCharacteristics . getSupportedExtensions ExtensionsManager. isExtensionAvailable
তথ্য অনুসন্ধান করুন CameraExtensionCharacteristics. getExtensionSupportedSizes CameraExtensionCharacteristics. getEstimatedCaptureLatencyRangeMillis CameraExtensionCharacteristics. getAvailableCaptureRequestKeys CameraExtensionCharacteristics. getAvailableCaptureResultKeys ExtensionsManager. getEstimatedCaptureLatencyRange

CameraX লাইব্রেরির মধ্যে থাকা বাকি তথ্যগুলো পরিচালনা করে।

এক্সটেনশন সক্রিয় থাকলে প্রিভিউ এবং স্থিরচিত্র ধারণ করুন CameraDevice. createExtensionSession

cameraExtensionsSession. setRepeatingRequest

cameraExtensionsSession. capture

val cameraSelector = ExtensionsManager. getExtensionEnabledCameraSelector bindToLifecycle(lifecycleOwner, cameraSelector, preview, ...)

বেসিক এক্সটেন্ডার

বেসিক এক্সটেন্ডার ইন্টারফেসটি ক্যামেরা পাইপলাইনের বিভিন্ন স্থানে সংযোগের সুযোগ দেয়। প্রতিটি এক্সটেনশন টাইপের জন্য সংশ্লিষ্ট এক্সটেন্ডার ক্লাস রয়েছে, যা OEM-দের ইমপ্লিমেন্ট করতে হয়।

নিম্নলিখিত সারণিতে সেই এক্সটেন্ডার ক্লাসগুলির তালিকা দেওয়া হয়েছে যা OEMS-কে প্রতিটি এক্সটেনশনের জন্য প্রয়োগ করতে হবে:

বাস্তবায়নের জন্য এক্সটেন্ডার ক্লাস
রাত NightPreviewExtenderImpl.java

NightImageCaptureExtenderImpl.java

HDR HdrPreviewExtenderImpl.java HdrImageCaptureExtenderImpl.java
অটো AutoPreviewExtenderImpl.java AutoImageCaptureExtenderImpl.java
বোকেহ BokehPreviewExtenderImpl.java BokehImageCaptureExtenderImpl.java
মুখের রিটাচ BeautyPreviewExtenderImpl.java BeautyImageCaptureExtenderImpl.java

নিচের উদাহরণটিতে আমরা PreviewExtenderImpl এবং ImageCaptureExtenderImpl কে প্লেসহোল্ডার হিসেবে ব্যবহার করেছি। এগুলোকে আপনার ইমপ্লিমেন্ট করা আসল ফাইলগুলোর নাম দিয়ে প্রতিস্থাপন করুন।

বেসিক এক্সটেন্ডারের নিম্নলিখিত সক্ষমতাগুলো রয়েছে:

  • CameraCaptureSession কনফিগার করার সময় ( onPresetSession ) সেশন প্যারামিটার যুক্ত করুন।
  • ক্যাপচার সেশন শুরু এবং বন্ধ হওয়ার ইভেন্টগুলো সম্পর্কে আপনাকে অবহিত করে এবং ফেরত আসা প্যারামিটার ( onEnableSession , onDisableSession ) সহ HAL-কে জানানোর জন্য একটি একক অনুরোধ পাঠায়।
  • অনুরোধের জন্য ক্যাপচার প্যারামিটারগুলি ইনজেক্ট করুন ( PreviewExtenderImpl.getCaptureStage , ImageCaptureExtenderImpl.getCaptureStages )।
  • প্রিভিউ এবং স্টিল ক্যাপচারের জন্য এমন প্রসেসর যোগ করুন যা YUV_420_888 স্ট্রিম প্রসেস করতে সক্ষম।

চলুন দেখি, উপরে উল্লিখিত তিনটি অ্যাপ ফ্লো সম্পন্ন করার জন্য Camera2/X কীভাবে extensions-interface ব্যবহার করে।

অ্যাপ ফ্লো ১: এক্সটেনশনের প্রাপ্যতা যাচাই করুন

বেসিকএক্সটেন্ডারঅ্যাপফ্লো১

চিত্র ৩. বেসিক এক্সটেন্ডারে অ্যাপ ফ্লো ১

এই কার্যপ্রণালীতে, Camera2/X সরাসরি init() কল না করেই PreviewExtenderImpl এবং ImageCaptureExtenderImpl উভয়ের isExtensionAvailable() মেথডকে কল করে। এক্সটেনশনগুলো সক্রিয় করার জন্য উভয় Extender ক্লাসকেই অবশ্যই true রিটার্ন করতে হবে।

এক্সটেনশনটি চালু করার আগে, অ্যাপগুলোর জন্য এটিই প্রায়শই প্রথম পদক্ষেপ যে তারা যাচাই করে নেয় প্রদত্ত এক্সটেনশন টাইপটি কোনো নির্দিষ্ট ক্যামেরা আইডির জন্য সমর্থিত কিনা। এর কারণ হলো, কিছু এক্সটেনশন কেবল নির্দিষ্ট কিছু ক্যামেরা আইডিতেই সমর্থিত হয়।

অ্যাপ প্রবাহ ২: তথ্য অনুসন্ধান

বেসিকএক্সটেন্ডারঅ্যাপফ্লো২

চিত্র ৪. বেসিক এক্সটেন্ডারে অ্যাপ ফ্লো ২

এক্সটেনশনটি উপলব্ধ আছে কিনা তা নির্ধারণ করার পর, অ্যাপগুলোকে এক্সটেনশনটি সক্রিয় করার আগে নিম্নলিখিত তথ্যগুলো জিজ্ঞাসা করতে হবে।

  • স্টিল ক্যাপচার ল্যাটেন্সি রেঞ্জ: ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRange অ্যাপটির জন্য ক্যাপচার ল্যাটেন্সির সেই পরিসরটি রিটার্ন করে, যা মূল্যায়ন করে যে বর্তমান পরিস্থিতির জন্য এক্সটেনশনটি চালু করা উপযুক্ত কিনা।

  • প্রিভিউ এবং ক্যাপচার সারফেসের জন্য সমর্থিত সাইজ: ImageCaptureExtenderImpl.getSupportedResolutions এবং PreviewExtenderImpl.getSupportedResolutions সারফেস ফরম্যাট ও সাইজের জন্য সমর্থিত ইমেজ ফরম্যাট এবং সাইজগুলোর একটি তালিকা প্রদান করে।

  • সমর্থিত অনুরোধ এবং ফলাফল কী: Camera2/X আপনার ইমপ্লিমেন্টেশন থেকে সমর্থিত ক্যাপচার অনুরোধ কী এবং ফলাফল কী পুনরুদ্ধার করতে নিম্নলিখিত পদ্ধতিগুলি কল করে:

    • ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys
    • ImageCaptureExtenderImpl.getAvailableCapturetResultKeys

Camera2/X আরও তথ্যের জন্য জিজ্ঞাসা করার আগে এই এক্সটেন্ডার ক্লাসগুলিতে সর্বদা প্রথমে init() কল করে।

অ্যাপ ফ্লো ৩: এক্সটেনশন সক্রিয় থাকা অবস্থায় প্রিভিউ/স্টিল ক্যাপচার (HAL বাস্তবায়ন)

বেসিকএক্সটেন্ডারঅ্যাপফ্লো৩

চিত্র ৫. বেসিক এক্সটেন্ডারে অ্যাপ ফ্লো ৩

উপরের ডায়াগ্রামটি কোনো প্রসেসর ছাড়াই একটি এক্সটেনশনের মাধ্যমে প্রিভিউ এবং স্টিল ক্যাপচার সক্রিয় করার মূল কার্যপ্রবাহ তুলে ধরেছে। এর মানে হলো, ক্যামেরার 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 ব্যবহার করে স্থিরচিত্র ধারণের প্রবাহ।

  1. ক্যাপচার সেশন কনফিগার করার জন্য Camera2/X স্থিরচিত্র তোলার ক্ষেত্রে একটি YUV_420_888 ফরম্যাটের সারফেস ব্যবহার করে। Camera2/X নিম্নলিখিত কলের মাধ্যমে CaptureProcessorImpl প্রস্তুত করে:

    • CaptureProcessorImpl.onImageFormatUpdate() YUV_420_888 সহ।
    • ইনপুট ইমেজের সাইজ দিয়ে CaptureProcessorImpl.onResolutionUpdate()
    • CaptureProcessorImpl.onOutputSurface() এর আউটপুট সারফেসটি হলো YUV_420_888
  2. ImageCaptureExtenderImpl.getCaptureStages একটি CaptureStageImpl এর তালিকা ফেরত দেয়, যেখানে প্রতিটি উপাদান Camera2/X দ্বারা প্রেরিত ক্যাপচার প্যারামিটারসহ একটি CaptureRequest ইনস্ট্যান্সের সাথে ম্যাপ করা থাকে। উদাহরণস্বরূপ, যদি এটি তিনটি CaptureStageImpl ইনস্ট্যান্সের একটি তালিকা ফেরত দেয়, তাহলে Camera2/X, captureBurst API ব্যবহার করে সংশ্লিষ্ট ক্যাপচার প্যারামিটারসহ তিনটি ক্যাপচার অনুরোধ পাঠায়।

  3. প্রাপ্ত ছবিগুলো এবং TotalCaptureResult ইনস্ট্যান্সগুলোকে একসাথে বান্ডিল করে প্রক্রিয়াকরণের জন্য CaptureProcessorImpl এ পাঠানো হয়।

  4. 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 এ ক্যাপচারের ফলাফল গ্রহণ করে, যা 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

যেসব বেসিক এক্সটেন্ডার ১.২.০ বা তার পূর্ববর্তী সংস্করণগুলো প্রয়োগ করে, সেগুলোর জন্য CameraX এক্সটেনশনস এপিআই উপরের সমস্ত কী-গুলোকে স্পষ্টভাবে সমর্থন করে। extensions-interface ১.৩.০-এর ক্ষেত্রে, CameraX এবং Camera2 উভয়ই ফেরত আসা তালিকাটিকে সম্মান করে এবং শুধুমাত্র তাতে থাকা কী-গুলোকেই সমর্থন করে। উদাহরণস্বরূপ, যদি আপনি ১.৩.০ সংস্করণে শুধুমাত্র CaptureRequest#CONTROL_ZOOM_RATIO এবং CaptureRequest#SCALER_CROP_REGION ফেরত দেওয়ার সিদ্ধান্ত নেন, তাহলে এর অর্থ হলো অ্যাপটির জন্য শুধুমাত্র জুম সমর্থিত হবে এবং ট্যাপ-টু-ফোকাস, ফ্ল্যাশ ও এক্সপোজার কম্পেনসেশন অনুমোদিত হবে না।

অ্যাডভান্সড এক্সটেন্ডার

অ্যাডভান্সড এক্সটেন্ডার হলো Camera2 API-এর উপর ভিত্তি করে তৈরি এক ধরনের ভেন্ডর ইমপ্লিমেন্টেশন। এই এক্সটেন্ডার টাইপটি extensions-interface 1.2.0-তে যোগ করা হয়েছিল। ডিভাইস প্রস্তুতকারকের উপর নির্ভর করে, এক্সটেনশনগুলি অ্যাপ লেয়ারে ইমপ্লিমেন্ট করা হতে পারে, যা নিম্নলিখিত বিষয়গুলির উপর নির্ভরশীল:

  • কাস্টম স্ট্রিম কনফিগারেশন: RAW স্ট্রিমের মতো কাস্টম স্ট্রিম কনফিগার করুন অথবা বিভিন্ন ফিজিক্যাল ক্যামেরা আইডির জন্য একাধিক স্ট্রিম রাখুন।

  • ক্যামেরা২ অনুরোধ পাঠানোর সক্ষমতা: একটি জটিল ইন্টারঅ্যাকশন লজিক সমর্থন করে যা পূর্ববর্তী অনুরোধের ফলাফলের উপর ভিত্তি করে প্যারামিটারসহ ক্যাপচার অনুরোধ পাঠাতে পারে।

অ্যাডভান্সড এক্সটেন্ডার একটি র‍্যাপার বা মধ্যবর্তী স্তর প্রদান করে, যার মাধ্যমে আপনি স্ট্রিম কনফিগারেশন কাস্টমাইজ করতে এবং চাহিদা অনুযায়ী ক্যাপচার রিকোয়েস্ট পাঠাতে পারেন।

বাস্তবায়নের জন্য ফাইল

অ্যাডভান্সড এক্সটেন্ডার ইমপ্লিমেন্টেশনে স্যুইচ করতে হলে, ExtensionVersionImpl এর isAdvancedExtenderImplemented() মেথডটিকে অবশ্যই true রিটার্ন করতে হবে। প্রতিটি এক্সটেনশন টাইপের জন্য, OEM-দের অবশ্যই সংশ্লিষ্ট এক্সটেন্ডার ক্লাসগুলো ইমপ্লিমেন্ট করতে হবে। অ্যাডভান্সড এক্সটেন্ডার ইমপ্লিমেন্টেশন ফাইলগুলো advanced প্যাকেজে রয়েছে।

বাস্তবায়নের জন্য এক্সটেন্ডার ক্লাস
রাত advanced/NightAdvancedExtenderImpl.java
HDR advanced/HdrAdvancedExtenderImpl.java
অটো advanced/AutoAdvancedExtenderImpl.java
বোকেহ advanced/BokehAdvancedExtenderImpl.java
ফেস রিটাচ advanced/BeautyAdvancedExtenderImpl.java

নিচের উদাহরণে আমরা AdvancedExtenderImpl একটি প্লেসহোল্ডার হিসেবে ব্যবহার করেছি। আপনি যে এক্সটেনশনটি ইমপ্লিমেন্ট করছেন, তার এক্সটেন্ডার ফাইলের নাম দিয়ে এটিকে প্রতিস্থাপন করুন।

চলুন দেখি, তিনটি অ্যাপ ফ্লো সম্পন্ন করার জন্য Camera2/X কীভাবে extensions-interface ব্যবহার করে।

অ্যাপ ফ্লো ১: এক্সটেনশনগুলোর প্রাপ্যতা যাচাই করুন

অ্যাডভান্সডঅ্যাপফ্লো১

চিত্র ৮. অ্যাডভান্সড এক্সটেন্ডারে অ্যাপ ফ্লো ১

প্রথমে, অ্যাপটি যাচাই করে দেখে যে প্রদত্ত এক্সটেনশনটি সমর্থিত কিনা।

অ্যাপ প্রবাহ ২: তথ্য অনুসন্ধান

অ্যাডভান্সডঅ্যাপফ্লো২

চিত্র ৯. অ্যাডভান্সড এক্সটেন্ডারে অ্যাপ ফ্লো ২

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-interface ১.৩.০-এ যোগ করা হয়েছে): Camera2/X আপনার ইমপ্লিমেন্টেশন থেকে সমর্থিত ক্যাপচার রিকোয়েস্ট কী এবং রেজাল্ট কী পুনরুদ্ধার করতে নিম্নলিখিত মেথডগুলো কল করে:

    • AdvancedExtenderImpl.getAvailableCaptureRequestKeys
    • AdvancedExtenderImpl.getAvailableCaptureResultKeys

আরও তথ্যের জন্য, সাপোর্ট ক্যাপচার রিকোয়েস্ট কী এবং ফলাফল দেখুন।

অ্যাপ ফ্লো ৩: এক্সটেনশন সক্রিয় থাকা অবস্থায় প্রিভিউ/স্টিল ক্যাপচার

অ্যাডভান্সডঅ্যাপফ্লো৩

চিত্র ১০। অ্যাডভান্সড এক্সটেন্ডারে অ্যাপ ফ্লো ৩

উপরের ডায়াগ্রামটিতে অ্যাডভান্সড এক্সটেন্ডার টাইপের জন্য প্রিভিউ এবং স্টিল ক্যাপচার শুরু করার প্রধান কার্যপ্রবাহ দেখানো হয়েছে। চলুন প্রতিটি ধাপ ধাপে ধাপে আলোচনা করা যাক।

  1. SessionProcessorImpl ইনস্ট্যান্স

    অ্যাডভান্সড এক্সটেন্ডারের মূল বাস্তবায়নটি SessionProcessorImpl মধ্যে রয়েছে, যা কাস্টমাইজড সেশন কনফিগারেশন প্রদান এবং প্রিভিউ ও স্টিল ক্যাপচার অনুরোধ শুরু করার জন্য ক্যাপচার রিকোয়েস্ট পাঠানোর দায়িত্বে থাকে। SessionProcessorImpl ইনস্ট্যান্সটি রিটার্ন করার জন্য AdvancedExtenderImpl.createSessionProcessor() কল করা হয়।

  2. initSession

    SessionProcessorImpl.initSession() এক্সটেনশনটির জন্য সেশন শুরু করে। এখানেই আপনি রিসোর্স বরাদ্দ করেন এবং একটি CameraCaptureSession প্রস্তুত করার জন্য সেশন কনফিগারেশন ফেরত দেন।

    ইনপুট প্যারামিটার হিসেবে, Camera2/X প্রিভিউ, স্টিল ক্যাপচার এবং একটি ঐচ্ছিক YUV ইমেজ বিশ্লেষণের জন্য আউটপুট সারফেস কনফিগারেশন নির্দিষ্ট করে। এই আউটপুট সারফেস কনফিগারেশন ( OutputSurfaceImpl )-এ সারফেস, সাইজ এবং ইমেজ ফরম্যাট থাকে, যা AdvancedExtenderImpl এর নিম্নলিখিত পদ্ধতিগুলো অনুসরণ করে সংগ্রহ করা হয়:

    • getSupportedPreviewOutputResolutions()
    • getSupportedCaptureOutputResolutions()
    • getSupportedYuvAnalysisResolutions()

    আপনাকে অবশ্যই একটি Camera2SessionConfigImpl ইনস্ট্যান্স রিটার্ন করতে হবে, যা Camera2OutputConfigImpl ইনস্ট্যান্সগুলোর একটি তালিকা এবং CameraCaptureSession কনফিগার করার জন্য ব্যবহৃত সেশন প্যারামিটারগুলো নিয়ে গঠিত। Camera2/X দ্বারা প্রেরিত আউটপুট সারফেসগুলোতে সঠিক ক্যামেরার ছবিগুলো আউটপুট করার দায়িত্ব আপনার। আউটপুট চালু করার জন্য এখানে কিছু অপশন দেওয়া হলো:

    • ক্যামেরা HAL-এ প্রসেসিং: আপনি একটি SurfaceOutputConfigImpl ইমপ্লিমেন্টেশন ব্যবহার করে সরাসরি CameraCaptureSession এ আউটপুট সারফেসগুলো যোগ করতে পারেন। এটি সরবরাহকৃত আউটপুট সারফেসটিকে ক্যামেরা পাইপলাইনে কনফিগার করে এবং ক্যামেরা HAL-কে ছবিটি প্রসেস করার সুযোগ দেয়।
    • মধ্যবর্তী ImageReader সারফেস (RAW, YUV, ইত্যাদি) প্রসেস করা: একটি ImageReaderOutputConfigImpl ইনস্ট্যান্স ব্যবহার করে মধ্যবর্তী ImageReader সারফেসগুলোকে CameraCaptureSession এ যুক্ত করুন।

      আপনাকে অন্তর্বর্তী ছবিগুলো প্রসেস করে ফলাফল ছবিটি আউটপুট সারফেসে লিখতে হবে।

    • ক্যামেরা২ সারফেস শেয়ারিং ব্যবহার করুন: অন্য একটি ক্যামেরা২আউটপুটকনফিগইম্পল Camera2OutputConfigImpl ) ইনস্ট্যান্সের getSurfaceSharingOutputConfigs() মেথডে যেকোনো একটি ক্যামেরা Camera2OutputConfigImpl ইনস্ট্যান্স যোগ করে সারফেস শেয়ারিং ব্যবহার করুন। সারফেসের ফরম্যাট এবং সাইজ অবশ্যই অভিন্ন হতে হবে।

    SurfaceOutputConfigImpl এবং ImageReaderOutputConfigImpl সহ সকল Camera2OutputConfigImpl একটি অনন্য আইডি ( getId() ) থাকতে হবে, যা টার্গেট সারফেস নির্দিষ্ট করতে এবং ImageReaderOutputConfigImpl থেকে ছবিটি পুনরুদ্ধার করতে ব্যবহৃত হয়।

  3. onCaptureSessionStart এবং RequestProcessorImpl

    যখন CameraCaptureSession শুরু হয় এবং ক্যামেরা ফ্রেমওয়ার্ক onConfigured() কল করে, তখন Camera2/X, Camera2 রিকোয়েস্ট র‍্যাপার RequestProcessImpl ব্যবহার করে SessionProcessorImpl.onCaptureSessionStart() কল করে। Camera2/X, RequestProcessImpl ইমপ্লিমেন্ট করে, যা আপনাকে ক্যাপচার রিকোয়েস্টগুলো এক্সিকিউট করতে এবং ImageReaderOutputConfigImpl ব্যবহৃত হলে ইমেজ পুনরুদ্ধার করতে সক্ষম করে।

    অনুরোধ সম্পাদনের ক্ষেত্রে RequestProcessImpl API-গুলো Camera2 CameraCaptureSession API-গুলোর অনুরূপ। পার্থক্যগুলো হলো:

    • Camera2OutputConfigImpl ইনস্ট্যান্সের আইডি দ্বারা লক্ষ্য পৃষ্ঠতলটি নির্দিষ্ট করা হয়।
    • ImageReader ছবি পুনরুদ্ধার করার ক্ষমতা।

    ছবি গ্রহণ করার জন্য একটি ImageProcessorImpl ইনস্ট্যান্স রেজিস্টার করতে, আপনি একটি নির্দিষ্ট Camera2OutputConfigImpl ID সহ RequestProcessorImpl.setImageProcessor() কল করতে পারেন।

    Camera2/X যখন SessionProcessorImpl.onCaptureSessionEnd() কল করে, তখন RequestProcessImpl ইনস্ট্যান্সটি অবৈধ হয়ে যায়।

  4. প্রিভিউ শুরু করুন এবং একটি ছবি তুলুন।

    অ্যাডভান্সড এক্সটেন্ডার ইমপ্লিমেন্টেশনে, আপনি RequestProcessorImpl ইন্টারফেসের মাধ্যমে ক্যাপচার রিকোয়েস্ট পাঠাতে পারেন। Camera2/X যথাক্রমে SessionProcessorImpl#startRepeating এবং SessionProcessorImpl#startCapture কল করার মাধ্যমে আপনাকে প্রিভিউয়ের জন্য পুনরাবৃত্তিমূলক রিকোয়েস্ট অথবা স্টিল ক্যাপচার সিকোয়েন্স শুরু করার জন্য অবহিত করে। এই প্রিভিউ এবং স্টিল-ক্যাপচার রিকোয়েস্টগুলো পূরণ করার জন্য আপনার ক্যাপচার রিকোয়েস্ট পাঠানো উচিত।

    Camera2/X এছাড়াও SessionProcessorImpl#setParameters এর মাধ্যমে ক্যাপচার অনুরোধের প্যারামিটারগুলো নির্ধারণ করে। পুনরাবৃত্তিমূলক এবং একক উভয় অনুরোধের ক্ষেত্রেই আপনাকে এই অনুরোধ প্যারামিটারগুলো অবশ্যই সেট করতে হবে (যদি প্যারামিটার সমর্থিত হয়)।

    আপনাকে অবশ্যই অন্তত CaptureRequest.JPEG_ORIENTATION এবং CaptureRequest.JPEG_QUALITY সমর্থন করতে হবে। extensions-interface 1.3.0 রিকোয়েস্ট এবং রেজাল্ট কী সমর্থন করে, যা নিম্নলিখিত মেথডগুলোর মাধ্যমে প্রকাশ করা হয়:

    • AdvancedExtenderImpl.getAvailableCaptureRequestKeys()
    • AdvancedExtenderImpl.getAvailableCaptureResultKeys()

    যখন ডেভেলপাররা getAvailableCaptureRequestKeys তালিকায় কী-গুলো সেট করেন, তখন আপনাকে অবশ্যই প্যারামিটারগুলো সক্রিয় করতে হবে এবং নিশ্চিত করতে হবে যে ক্যাপচার ফলাফলে getAvailableCaptureResultKeys তালিকার কী-গুলো অন্তর্ভুক্ত রয়েছে।

  5. startTrigger

    SessionProcessorImpl.startTrigger() কল করা হয় CaptureRequest.CONTROL_AF_TRIGGER এবং CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER এর মতো ট্রিগার শুরু করার জন্য। AdvancedExtenderImpl.getAvailableCaptureRequestKeys() -এ যেসব ক্যাপচার রিকোয়েস্ট কী উল্লেখ করা হয়নি, সেগুলোকে আপনি উপেক্ষা করতে পারেন।

    extensions-interface 1.3.0 সংস্করণ থেকে startTrigger() সমর্থিত। এটি অ্যাপগুলোকে এক্সটেনশনের সাহায্যে ট্যাপ-টু-ফোকাস এবং ফ্ল্যাশ বাস্তবায়ন করতে সক্ষম করে।

  6. পরিষ্কার করা

    একটি ক্যাপচার সেশন শেষ করার সময়, CameraCaptureSession বন্ধ করার আগে SessionProcessorImpl.onCaptureSessionEnd() কল করা হয়। ক্যাপচার সেশনটি বন্ধ হয়ে যাওয়ার পর, deInitSession() পরিষ্কার-পরিচ্ছন্নতার কাজ সম্পন্ন করে।

প্রিভিউ, স্থিরচিত্র ধারণ এবং চিত্র বিশ্লেষণ সমর্থন করে

প্রিভিউ এবং স্টিল ক্যাপচার, উভয় ক্ষেত্রেই আপনার এক্সটেনশনটি প্রয়োগ করা উচিত। তবে, প্রিভিউটি মসৃণভাবে দেখানোর জন্য ল্যাটেন্সি খুব বেশি হলে, আপনি এক্সটেনশনটি শুধুমাত্র স্টিল ক্যাপচারের জন্য প্রয়োগ করতে পারেন।

For the Basic Extender type, regardless of enabling the extension for preview, you must implement both ImageCaptureExtenderImpl and PreviewExtenderImpl for a given extension. Often, an app also uses a YUV stream to analyze the image content such as finding QR codes or text. 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.
  • HDR and NIGHT : 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:

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:

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:

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.

সংস্করণ Added features
১.০.০
  • Version verification
    • ExtensionVersionImpl
  • Basic Extender
    • PreviewExtenderImpl
    • ImageCaptureExtenderImpl
    • Processor
      • PreviewImageProcessorImpl
      • CaptureProcessorImpl
      • RequestUpdateProcessorImpl
1.1.0
  • Library initialization
    • InitializerImpl
  • Expose supported resolutions
    • PreviewExtenderImpl.getSupportedResolutions
    • ImageCaptureExtenderImpl.getSupportedResolutions
১.২.০
  • AdvancedExtender
    • AdvancedExtenderImpl
    • SessionProcessorImpl
  • Get estimated capture latency
    • ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRange
১.৩.০
  • Expose supported capture request keys/results keys
    • ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys and getAvailableCaptureResultKeys
    • AdvancedExtenderImpl.getAvailableCaptureRequestKeys and getAvailableCaptureResultKeys
    • New process() call that takes ProcessResultImpl in PreviewImageProcessorImpl and CaptureProcessorImpl
    • Support trigger type request
      • AdvancedExtenderImpl.startTrigger
১.৪.০
  • Extension-specific metadata
  • Dynamic still capture latency estimates
  • Capture processing progress callbacks
  • Postview still capture
  • Support for SurfaceView output
  • Vendor specific session types

Reference implementation

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 a Service . This implementation contains the following components:

    • oem_library : A Camera Extensions OEM library for Camera2 and CameraX Extensions APIs that implements Extensions-Interface . This acts as a passthrough that forwards calls from Extensions-Interface to 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#isAdvancedExtenderImplemented to return false .

    • extensions_service : A sample implementation of the Extensions Service. Add your implementation here. The interface to implement in the service is similar to the Extensions-Interface . For example, implementing the IAdvancedExtenderImpl.Stub performs the same operations as AdvancedExtenderImpl . ImageWrapper and TotalCaptureResultWrapper are required to make Image and TotalCaptureResult parcelable.

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:

  1. 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.
  2. Use the example below to add the required information to the file.

    • name must be androidx.camera.extensions.impl as that's the library that CameraX searches for.
    • file is the absolute path of the file that contains the extensions implementation (for example, /system/framework/androidx.camera.extensions.impl.jar ).
    <?xml version="1.0" encodin>g<="utf->8&quo<t;?
    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?

Yes. 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 .