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

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

Camera2 ও CameraX জুড়ে একই ধরনের যেসব এক্সটেনশন কাজ করে, সেগুলির তালিকা দেখতে, CameraX Extensions API দেখুন। আপনি কোনও এক্সটেনশন যোগ করতে চাইলে, Issue Tracker-এর মাধ্যমে সমস্যা সম্পর্কে অভিযোগ জানান।

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

স্থাপত্যশিল্প

নিম্নলিখিত ডায়াগ্রামটি Camera Extensions ইন্টারফেস বা extensions-interface-এর আর্কিটেকচার বর্ণনা করে: স্থাপত্যশিল্প

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

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

OEM ভেন্ডর লাইব্রেরি প্রয়োগ করা

OEM ভেন্ডর লাইব্রেরি প্রয়োগ করতে, সিস্টেম লাইব্রেরি প্রোজেক্টে camera-extensions-stub ফাইল কপি করুন। এইসব ফাইল Camera Extensions ইন্টারফেসকে সংজ্ঞায়িত করে।

camera-extensions-stub ফাইলগুলিকে নিম্নলিখিত বিভাগে ভাগ করা হয়েছে:

অপরিহার্য ইন্টারফেস ফাইল (পরিবর্তন করবেন না)

  • PreviewExtenderImpl.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

Bokeh এক্সটেন্ডার ক্লাস (Bokeh এক্সটেনশন কাজ করলে এটি প্রয়োগ করুন)

  • 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

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

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

Mainflow

ছবি ২. নাইট এক্সটেনশন প্রয়োগ করা

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

    OEM-এর প্রয়োগ করা extensions-interface ভার্সন Camera2/X সাপোর্ট করা ভার্সনের সাথে মানানসই কিনা তা নিশ্চিত করতে Camera2/X কল ExtensionVersionImpl.checkApiVersion() করা হয়।

  2. ভেন্ডর লাইব্রেরি ইনিশিয়ালাইজেশন:

    InitializerImpl-এর একটি পদ্ধতি init() আছে যা ভেন্ডর লাইব্রেরি শুরু করে। Extender ক্লাস অ্যাক্সেস করার আগে Camera2/X ইনিশিয়ালাইজেশন সম্পূর্ণ করে।

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

    এক্সটেনশনের জন্য এক্সটেন্ডার ক্লাস ইনস্ট্যান্টিয়েট করে। দু'টি Extender টাইপ আছে: Basic Extender ও Advanced Extender. আপনাকে সব এক্সটেনশনের জন্য একটি এক্সটেন্ডার টাইপ প্রয়োগ করতে হবে। আরও তথ্যের জন্য, সাধারণ এক্সটেন্ডার বনাম উন্নত এক্সটেন্ডার দেখুন।

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

    রাতের এক্সটেনশনের জন্য, নিম্নলিখিত এক্সটেন্ডার ক্লাসগুলি বেসিক এক্সটেন্ডার ধরনের জন্য ইনস্ট্যানশিয়েট করা হয়:

    • NightImageCaptureExtenderImpl.java
    • NightPreviewExtenderImpl.java

    এবং উন্নত এক্সটেন্ডারের ধরনের জন্য:

    • NightAdvancedExtenderImpl.java
  4. এক্সটেনশন উপলভ্য আছে কিনা তা চেক করুন:

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

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

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

  6. কোয়েরি সংক্রান্ত তথ্য:

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

  7. এক্সটেন্ডারে এক্সটেনশন চালু করুন:

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

    উন্নত এক্সটেন্ডার ধরনের জন্য, Camera2/X এক্সটেনশন চালু করতে SessionProcessorImpl-এর সাথে ইন্টার‍্যাক্ট করে। Camera2/X, Extender-এ createSessionProcessor() কল করে SessionProcessorImpl ইনস্ট্যান্স রিট্রিভ করে।

নিচের বিভাগগুলিতে এক্সটেনশন ফ্লো সম্পর্কে আরও বিস্তারিত বিবরণ দেওয়া হয়েছে।

ভার্সন যাচাইকরণ

রানটাইমে ডিভাইস থেকে OEM ভেন্ডর লাইব্রেরি লোড করার সময়, Camera2/X লাইব্রেরিটি extensions-interface ভার্সনের সাথে মানানসই কিনা তা যাচাই করে। extensions-interface-এ সিম্যান্টিক ভার্সনিং বা MAJOR.MINOR.PATCH ব্যবহার করা হয়, যেমন, ১.১.০ বা ১.২.০। তবে, ভার্সন যাচাইকরণের সময় শুধুমাত্র মেজর ও মাইনর ভার্সন ব্যবহার করা হয়।

ভার্সন যাচাই করতে, Camera2/X কল ExtensionVersionImpl.checkApiVersion() করে, এর সাথে কাজ করে এমন extensions-interface ভার্সন। Camera2/X তারপর OEM লাইব্রেরির মাধ্যমে রিপোর্ট করা ভার্সন ব্যবহার করে নির্ধারণ করে যে এক্সটেনশন চালু করা যাবে কিনা এবং এটি কোন ক্ষমতাগুলি প্রয়োগ করবে।

মেজর ভার্সন মানানসই

Camera2/X এবং ভেন্ডর লাইব্রেরির মধ্যে এক্সটেনশন-ইন্টারফেসের মেজর ভার্সন আলাদা হলে, সেটিকে মানানসই নয় হিসেবে বিবেচনা করা হয় এবং এক্সটেনশন বন্ধ করে দেওয়া হয়।

পুরনো ভার্সনের সাথে মানানসই

মেজর ভার্সন একই থাকলে, Camera2/X, পূর্ববর্তী extensions-interface ভার্সন দিয়ে তৈরি OEM ভেন্ডর লাইব্রেরির সাথে ব্যাকওয়ার্ড কম্প্যাটিবিলিটি নিশ্চিত করে। যেমন, Camera2/X যদি extensions-interface 1.3.0 ভার্সনে কাজ করে, তাহলে OEM ভেন্ডর লাইব্রেরি যেগুলি 1.0.0, 1.1.0 এবং 1.2.0 ভার্সনে কাজ করে সেগুলি এখনও মানানসই। এর অর্থ হল, আপনি কোনও নির্দিষ্ট ভার্সনের ভেন্ডর লাইব্রেরি প্রয়োগ করার পরে, Camera2/X নিশ্চিত করে যে লাইব্রেরি আসন্ন extension-interface ভার্সনের সাথে ব্যাকওয়ার্ড-কম্প্যাটিবল।

ফরওয়ার্ড কম্প্যাটিবিলিটি

নতুন extensions-interface-এর ভেন্ডর লাইব্রেরির সাথে ফরওয়ার্ড কম্প্যাটিবিলিটি আপনার উপর নির্ভর করে, OEM। এক্সটেনশন প্রয়োগ করার জন্য কিছু ফিচারের প্রয়োজন হলে, আপনি নির্দিষ্ট কোনও ভার্সন থেকে এক্সটেনশন চালু করতে পারেন। এই ক্ষেত্রে, Camera2/X লাইব্রেরি ভার্সন প্রয়োজনীয়তা পূরণ করলে, আপনি কাজ করে এমন extensions-interface ভার্সন ফেরত দিতে পারবেন। Camera2/X ভার্সন কাজ না করলে, এক্সটেনশন বন্ধ করতে 99.0.0-এর মতো মানানসই নয় এমন ভার্সন ফিরিয়ে দিতে পারেন।

ভেন্ডর লাইব্রেরি ইনিশিয়ালাইজেশন

OEM-এর প্রয়োগ করা extensions-interface ভার্সন লাইব্রেরি যাচাই করার পরে, Camera2/X ইনিশিয়ালাইজেশন প্রসেস শুরু করে। InitializerImpl.init() পদ্ধতিটি OEM লাইব্রেরিকে এই সিগন্যাল দেয় যে কোনও অ্যাপ এক্সটেনশন ব্যবহার করার চেষ্টা করছে।

OEM ভেন্ডর লাইব্রেরি OnExtensionsInitializedCallback.onSuccess()-এ কল করে ইনিশিয়ালাইজেশন সম্পূর্ণ হওয়ার কথা না জানানো পর্যন্ত Camera2/X, OEM লাইব্রেরিতে আর কোনও কল করে না (ভার্সন চেক করা ছাড়া)।

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

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

extensions-interface প্রয়োগের দুটি ধরন আছে: প্রাথমিক এক্সটেন্ডার ও উন্নত এক্সটেন্ডার। Advanced Extender extensions-interface 1.2.0 ভার্সন থেকে কাজ করে।

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

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

তুলনা করার জন্য নিম্নলিখিত টেবিল দেখুন:

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

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

ক্যামেরা পাইপলাইনে হুক
  • onPresetSession সেশন প্যারামিটার প্রদান করে।
  • CameraCaptureSession কনফিগার করার সাথে সাথেই onEnableSession একটি অনুরোধ পাঠায়।
  • CameraCaptureSession বন্ধ হওয়ার আগে onDisableSession একটি অনুরোধ পাঠায়।
  • initSession ক্যাপচার সেশন তৈরি করার জন্য কাস্টমাইজ করা camera2 সেশন কনফিগারেশন ইনিশিয়ালাইজ করে ও রিটার্ন করে।
  • CameraCaptureSession কনফিগার করার সাথে সাথেই onCaptureSessionStart কল করা হয়।
  • CameraCaptureSession বন্ধ হওয়ার আগে onCaptureSessionEnd কল করা হয়।
এর জন্য উপযুক্ত ক্যামেরা HAL বা প্রসেসরে এক্সটেনশন প্রয়োগ করা হয়েছে যা YUV ছবি প্রসেস করে।
  • এক্সটেনশনের জন্য Camera2-ভিত্তিক ইমপ্লিমেন্টেশন আছে।
  • RAW স্ট্রিমের মতো কাস্টমাইজ করা স্ট্রিম কনফিগারেশন প্রয়োজন।
  • ইন্টার‌্যাক্টিভ ক্যাপচার সিকোয়েন্স প্রয়োজন।
কাজ করে এমন API ভার্সন Camera2 এক্সটেনশন: Android 13 বা এর পরবর্তী যেকোনও ভার্সন
CameraX এক্সটেনশন: camera-extensions 1.1.0 বা এর পরবর্তী যেকোনও ভার্সন
Camera2 এক্সটেনশন: Android 12L বা এর পরবর্তী যেকোনও ভার্সন
CameraX এক্সটেনশন: camera-extensions 1.2.0-alpha03 বা এর পরবর্তী যেকোনও ভার্সন

অ্যাপ ফ্লো

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

Camera2 এক্সটেনশন CameraX এক্সটেনশন
কোয়েরি এক্সটেনশনের উপলভ্যতা CameraExtensionCharacteristics .getSupportedExtensions ExtensionsManager. isExtensionAvailable
কোয়েরি সংক্রান্ত তথ্য CameraExtensionCharacteristics. getExtensionSupportedSizes CameraExtensionCharacteristics. getEstimatedCaptureLatencyRangeMillis CameraExtensionCharacteristics. getAvailableCaptureRequestKeys CameraExtensionCharacteristics. getAvailableCaptureResultKeys ExtensionsManager. getEstimatedCaptureLatencyRange

লাইব্রেরির মধ্যে থাকা বাকি তথ্য CameraX ম্যানেজ করে।

এক্সটেনশন চালু করে প্রিভিউ ও স্টিল-ক্যাপচার করা CameraDevice. createExtensionSession

cameraExtensionsSession. setRepeatingRequest

cameraExtensionsSession. capture

val cameraSelector = ExtensionsManager. getExtensionEnabledCameraSelector

bindToLifecycle(lifecycleOwner, cameraSelector, preview, ...)

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

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

নিম্নলিখিত সারণীতে প্রতিটি এক্সটেনশনের জন্য OEM-কে যে Extender ক্লাস প্রয়োগ করতে হবে তার তালিকা দেওয়া হল:

প্রয়োগ করার জন্য এক্সটেন্ডার ক্লাস
রাত্রি 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 ইনভোক করে।

অ্যাপ ফ্লো ১: এক্সটেনশন উপলভ্য কিনা চেক করা

BasicExtenderAppFlow1

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

এই ফ্লোতে, Camera2/X সরাসরি PreviewExtenderImpl এবং ImageCaptureExtenderImpl-এর isExtensionAvailable() মেথড কল করে, init() কল না করেই। এক্সটেনশন চালু করতে দুটি Extender ক্লাসে true রিটার্ন করতে হবে।

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

অ্যাপ ফ্লো ২: কোয়েরি সংক্রান্ত তথ্য

BasicExtenderAppFlow2

ছবি ৪. Basic Extender-এ অ্যাপ ফ্লো ২

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

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

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

  • কাজ করে এমন অনুরোধ ও ফলাফল কী: আপনার প্রয়োগ করা থেকে কাজ করে এমন ক্যাপচার অনুরোধ কী ও ফলাফল কী পেতে Camera2/X নিম্নলিখিত পদ্ধতি ব্যবহার করে:

    • ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys
    • ImageCaptureExtenderImpl.getAvailableCapturetResultKeys

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

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

BasicExtenderAppFlow3

ছবি ৫. Basic Extender-এ অ্যাপ ফ্লো ৩

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

এই ফ্লোতে, Camera2/X প্রথমে init() তারপরে onInit কল করে, যা আপনাকে জানায় যে নির্দিষ্ট এক্সটেনশন সহ একটি ক্যামেরা সেশন শুরু হতে চলেছে। আপনি onInit()-এ কঠিন কাজগুলি শুরু করতে পারেন।

CameraCaptureSession কনফিগার করার সময়, সেশন প্যারামিটার পেতে Camera2/X onPresetSession-কে কল করে। ক্যাপচার সেশন সফলভাবে কনফিগার করার পরে, Camera2/X onEnableSession ইনভোক করে যা ক্যাপচার প্যারামিটার সহ একটি CaptureStageImpl ইনস্ট্যান্স রিটার্ন করে। Camera2/X এইসব ক্যাপচার প্যারামিটার সহ একটি অনুরোধ অবিলম্বে পাঠায় যাতে HAL-কে বিজ্ঞপ্তি পাঠানো যায়। একইভাবে, ক্যাপচার সেশন বন্ধ করার আগে, Camera2/X onDisableSession ইনভোক করে এবং তারপর রিটার্ন করা ক্যাপচার প্যারামিটার সহ একটি অনুরোধ পাঠায়।

Camera2/X-এর মাধ্যমে ট্রিগার করা রিপিটিং অনুরোধে PreviewExtenderImpl.getCaptureStage()-এর মাধ্যমে ফেরত দেওয়া অনুরোধের প্যারামিটার থাকে। এছাড়াও, স্টিল ক্যাপচার অনুরোধে ImageCaptureExtenderImpl.getCaptureStages()-এর মাধ্যমে ফেরত পাঠানো প্যারামিটার থাকে।

অবশেষে, ক্যামেরা সেশন শেষ হওয়ার পরে Camera2/X onDeInit() চালু করে। আপনি onDeinit()-এ রিসোর্স রিলিজ করতে পারবেন।

প্রিভিউ প্রসেসর

ক্যামেরা HAL ছাড়াও, আপনি প্রসেসরে এক্সটেনশন প্রয়োগ করতে পারবেন।

প্রসেসরের ধরন নির্দিষ্ট করতে PreviewExtenderImpl.getProcessorType প্রয়োগ করুন যেমন নিচে ব্যাখ্যা করা হয়েছে:

  • PROCESSOR_TYPE_NONE: কোনও প্রসেসর নেই। ক্যামেরা HAL-এ ছবি প্রসেস করা হয়।

  • PROCESSOR_TYPE_REQUEST_UPDATE_ONLY: প্রসেসর টাইপ আপনাকে লেটেস্ট TotalCaptureResult-এর উপর ভিত্তি করে নতুন ক্যাপচার রিকোয়েস্ট প্যারামিটার সহ পুনরাবৃত্ত অনুরোধ আপডেট করতে দেয়।

    PreviewExtenderImpl.getProcessor অবশ্যই এমন একটি RequestUpdateProcessorImpl ইনস্ট্যান্স রিটার্ন করতে হবে যা TotalCaptureResult ইনস্ট্যান্স প্রসেস করে এবং রিপিটিং অনুরোধ আপডেট করার জন্য একটি CaptureStageImpl ইনস্ট্যান্স রিটার্ন করে। PreviewExtenderImpl.getCaptureStage()-এ প্রসেসিংয়ের ফলাফলও দেখানো উচিত এবং লেটেস্ট CaptureStageImpl ফেরত দেওয়া উচিত।

  • PROCESSOR_TYPE_IMAGE_PROCESSOR: এই ধরনের বিকল্প আপনাকে YUV_420_888 ছবি প্রসেস করার জন্য একটি প্রসেসর প্রয়োগ করতে এবং আউটপুটকে একটি PRIVATE সারফেসে লিখতে দেয়।

    আপনাকে PreviewExtenderImpl.getProcessor-এ PreviewImageProcessorImpl ইনস্ট্যান্স প্রয়োগ করতে এবং ফেরত দিতে হবে। YUV_420_888 ইনপুট ছবি প্রসেস করার দায়িত্ব প্রসেসরের। প্রিভিউয়ের PRIVATE ফর্ম্যাটে আউটপুট লিখতে হবে। Camera2/X, প্রিভিউয়ের জন্য CameraCaptureSession কনফিগার করতে PRIVATE-এর পরিবর্তে YUV_420_888 সারফেস ব্যবহার করে।

    ফ্লো সম্পর্কে জানতে নিচের ছবি দেখুন:

PreviewProcessor

ছবি ৬. 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 সারফেসে আউটপুট লেখার জন্য প্রসেসর দায়ী।

স্টিল ক্যাপচার অনুরোধ পাঠানোর আগে আপনি নিরাপদে ধরে নিতে পারেন যে প্রিভিউ চালু আছে এবং চলছে।

নিচের ডায়াগ্রামে ফ্লো দেখুন:

CaptureProcessor

ছবি ৭. CaptureProcessorImpl-এর মাধ্যমে এখনও ফ্লো ক্যাপচার করা

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

    • YUV_420_888-এর সাথে CaptureProcessorImpl.onImageFormatUpdate()।
    • ইনপুট করা ছবির সাইজ সহ CaptureProcessorImpl.onResolutionUpdate()।
    • YUV_420_888 সারফেস আউটপুট সহ CaptureProcessorImpl.onOutputSurface()।
  2. ImageCaptureExtenderImpl.getCaptureStages CaptureStageImpl-এর একটি তালিকা রিটার্ন করে, যেখানে প্রতিটি এলিমেন্ট ক্যাপচার প্যারামিটার সহ একটি CaptureRequest ইনস্ট্যান্সের সাথে ম্যাপ করে যা Camera2/X দ্বারা পাঠানো হয়। যেমন, এটি যদি তিনটি 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 থেকে ক্যাপচার ফলাফল পায়, যা process() মেথডে PreviewImageProcessorImpl এবং CaptureProcessorImpl-এ পাস করা হয়। ProcessResultImpl-এর মাধ্যমে Camera2/X-এ ক্যাপচার করা ফলাফল সম্পর্কে রিপোর্ট করার দায়িত্ব আপনার।

উদাহরণ হিসেবে নিচে CaptureProcessorImpl ইন্টারফেসের সংজ্ঞা দেখুন। extensions-interface 1.3.0 বা তার পরবর্তী যেকোনও ভার্সনে, দ্বিতীয় process() কল ইনভোক করা হয়:

Interface CaptureProcessorImpl extends ProcessorImpl {
    // invoked when extensions-interface version < 1.3.0
    void process(Map<Integer, Pair<Image, TotalCaptureResult>> results);
    // invoked when extensions-interface version >= 1.3.0
    void process(Map<Integer, Pair<Image, TotalCaptureResult>> results,
            ProcessResultImpl resultCallback, Executor executor);
}

জুম, ট্যাপ-টু-ফোকাস, ফ্ল্যাশ ও এক্সপোজার কম্পেনসেশনের মতো সাধারণ ক্যামেরা অপারেশনের জন্য, আমরা ক্যাপচার অনুরোধ ও ক্যাপচার ফলাফল, উভয়ের জন্যই নিম্নলিখিত 'কী' ব্যবহার করার সাজেশন দিই:

  • জুম:
    • CaptureRequest#CONTROL_ZOOM_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 অনুরোধ পাঠানোর ক্ষমতা: জটিল ইন্টার‍্যাকশন লজিক কাজ করে যা আগের অনুরোধের ফলাফলের উপর ভিত্তি করে প্যারামিটার সহ ক্যাপচার অনুরোধ পাঠাতে পারে।

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

প্রয়োগ করার জন্য ফাইল

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

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

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

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

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

AdvancedAppFlow1

ছবি ৮. Advanced Extender-এ অ্যাপ ফ্লো ১

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

অ্যাপ ফ্লো ২: কোয়েরি সংক্রান্ত তথ্য

AdvancedAppFlow2

ছবি ৯. Advanced Extender-এ অ্যাপ ফ্লো ২

AdvancedExtenderImpl.init()-কে কল করার পরে, অ্যাপটি AdvancedExtenderImpl-এ থাকা নিম্নলিখিত তথ্য সম্পর্কে কোয়েরি করতে পারে:

  • স্টিল ক্যাপচার ল্যাটেন্সি সংক্রান্ত আনুমানিক তথ্য: AdvancedExtenderImpl.getEstimatedCaptureLatencyRange() বর্তমান পরিস্থিতির জন্য এক্সটেনশন চালু করা উপযুক্ত কিনা তা মূল্যায়ন করতে অ্যাপের ক্যাপচার ল্যাটেন্সির রেঞ্জ প্রদান করে।

  • প্রিভিউ ও স্টিল ক্যাপচারের জন্য কাজ করে এমন রেজোলিউশন:

    • AdvancedExtenderImpl.getSupportedPreviewOutputResolutions() প্রিভিউ সারফেস ফর্ম্যাট ও সাইজের জন্য কাজ করে এমন সাইজের তালিকার সাথে ইমেজ ফর্ম্যাটের একটি ম্যাপ রিটার্ন করে। OEM-কে অবশ্যই অন্তত PRIVATE ফর্ম্যাট সাপোর্ট করতে হবে।

    • AdvancedExtenderImpl.getSupportedCaptureOutputResolutions() স্টিল ক্যাপচার সারফেসের জন্য সমর্থিত ফর্ম্যাট এবং সাইজ রিটার্ন করে। OEM-কে অবশ্যই JPEG এবং YUV_420_888 ফর্ম্যাট আউটপুট, দুটিকেই সাপোর্ট করতে হবে।

    • AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions() ইমেজ বিশ্লেষণের জন্য অতিরিক্ত YUV_420_888 স্ট্রিমের জন্য সাপোর্ট করা সাইজ দেখায়। যদি ইমেজ অ্যানালিসিস YUV সারফেস কাজ না করে, getSupportedYuvAnalysisResolutions() null বা একটি খালি তালিকা রিটার্ন করবে।

  • উপলভ্য ক্যাপচার অনুরোধ কী/ফলাফল (extensions-interface 1.3.0-এ যোগ করা হয়েছে): আপনার প্রয়োগ করা থেকে কাজ করে এমন ক্যাপচার অনুরোধ কী ও ফলাফল কী পেতে Camera2/X নিম্নলিখিত পদ্ধতি ব্যবহার করে:

    • AdvancedExtenderImpl.getAvailableCaptureRequestKeys
    • AdvancedExtenderImpl.getAvailableCaptureResultKeys

আরও তথ্যের জন্য, ক্যাপচার অনুরোধ কী ও ফলাফল দেখুন।

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

AdvancedAppFlow3

ছবি ১০. Advanced Extender-এ অ্যাপ ফ্লো ৩

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

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

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

  2. initSession

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

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

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

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

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

      আপনাকে মধ্যবর্তী ছবি প্রসেস করতে হবে এবং ফলাফল ছবিটিকে আউটপুট সারফেসে লিখতে হবে।

    • Camera2 সারফেস শেয়ারিং ব্যবহার করুন: অন্য সারফেসের সাথে সারফেস শেয়ারিং ব্যবহার করুন অন্য Camera2OutputConfigImpl ইনস্ট্যান্সের getSurfaceSharingOutputConfigs() পদ্ধতিতে কোনও Camera2OutputConfigImpl ইনস্ট্যান্স যোগ করে। সারফেস ফর্ম্যাট ও সাইজ একই হতে হবে।

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

  3. onCaptureSessionStart এবং RequestProcessorImpl

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

    অনুরোধ কার্যকর করার ক্ষেত্রে RequestProcessImpl API, Camera2 CameraCaptureSession API-এর মতোই। পার্থক্যগুলি হল:

    • টার্গেট সারফেস Camera2OutputConfigImpl ইনস্ট্যান্সের আইডি দ্বারা নির্দিষ্ট করা হয়।
    • ImageReader-এর ছবি ফিরিয়ে আনার ক্ষমতা।

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

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

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

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

    এছাড়াও, 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. ক্লিন-আপ করুন

    ক্যাপচার সেশন শেষ করার সময়, SessionProcessorImpl.onCaptureSessionEnd(), CameraCaptureSession বন্ধ করার আগে ইনভোক করা হয়। ক্যাপচার সেশন বন্ধ হয়ে যাওয়ার পরে, deInitSession() ক্লিন-আপ পারফর্ম করে।

প্রিভিউ, স্টিল ক্যাপচার ও ছবি বিশ্লেষণ করার সুবিধা আছে

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

বেসিক এক্সটেন্ডার ধরনের ক্ষেত্রে, প্রিভিউয়ের জন্য এক্সটেনশন চালু করা হোক বা না হোক, আপনাকে অবশ্যই কোনও প্রদত্ত এক্সটেনশনের জন্য ImageCaptureExtenderImpl ও PreviewExtenderImpl দুটিই প্রয়োগ করতে হবে। এছাড়াও, কোনও অ্যাপ প্রায়শই YUV স্ট্রিম ব্যবহার করে QR কোড বা টেক্সটের মতো ইমেজ কন্টেন্ট বিশ্লেষণ করে। এই ব্যবহারের ক্ষেত্রে আরও ভালভাবে সহায়তা করতে , আপনাকে প্রিভিউ, স্টিল ক্যাপচার এবং CameraCaptureSession কনফিগার করার জন্য YUV_420_888 স্ট্রিমের স্ট্রিম কম্বিনেশনকে সহায়তা করতে হবে। এর অর্থ হল আপনি কোনও প্রসেসর প্রয়োগ করলে, আপনাকে তিনটি YUV_420_888 স্ট্রিমের কম্বিনেশন সাপোর্ট করতে হবে।

Advanced Extender-এর জন্য, Camera2/X তিনটি আউটপুট সারফেস SessionProcessorImpl.initSession() কলে পাস করে। এই আউটপুট সারফেসগুলি যথাক্রমে প্রিভিউ , স্টিল ক্যাপচার এবং ছবি বিশ্লেষণের জন্য। আপনাকে অবশ্যই নিশ্চিত করতে হবে যে প্রিভিউ ও স্টিল ক্যাপচার আউটপুট সারফেস সঠিক আউটপুট দেখাচ্ছে। তবে, ইমেজ বিশ্লেষণ আউটপুট সারফেসের জন্য, এটি শুধুমাত্র তখনই কাজ করছে কিনা তা নিশ্চিত করুন যখন এটি নন-নাল হয়। আপনার ইমপ্লিমেন্টেশন যদি ইমেজ অ্যানালিসিস স্ট্রিম সাপোর্ট না করে, তাহলে আপনি AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions()-এ একটি খালি তালিকা রিটার্ন করতে পারেন। এটি নিশ্চিত করে যে ইমেজ বিশ্লেষণ আউটপুট সারফেস সবসময় SessionProcessorImpl.initSession()-এ নাল থাকে।

ভিডিও ক্যাপচার করার সুবিধা

বর্তমান ক্যামেরা এক্সটেনশন আর্কিটেকচার শুধুমাত্র প্রিভিউ এবং স্টিল ক্যাপচার ব্যবহারিক ক্ষেত্রকে সাপোর্ট করে। ভিডিও রেকর্ড করার জন্য MediaCodec বা MediaRecorder সারফেসে এক্সটেনশন চালু করার সুবিধা আমরা প্রদান করি না। তবে, অ্যাপের পক্ষে প্রিভিউ আউটপুট রেকর্ড করা সম্ভব।

MediaCodec ও MediaRecorder সারফেসের ক্ষেত্রে কাজ করা সংক্রান্ত সমস্যা খতিয়ে দেখা হচ্ছে।

এক্সটেনশন-নির্দিষ্ট মেটাডেটা

Android 14 ও এর পরের যেকোনও ভার্সনের জন্য, এক্সটেনশন-নির্দিষ্ট মেটাডেটা ক্যামেরা এক্সটেনশন ক্লায়েন্টকে এক্সটেনশন-নির্দিষ্ট ক্যাপচার অনুরোধ সেটিংস ও ফলাফল সেট ও গ্রহণ করতে দেয়। বিশেষত, ক্যামেরা এক্সটেনশন ক্লায়েন্টরা এক্সটেনশনের ক্ষমতা এবং EXTENSION_CURRENT_TYPE ক্যাপচার ফলাফলকে কন্ট্রোল করতে EXTENSION_STRENGTH ক্যাপচার অনুরোধ প্যারামিটার ব্যবহার করতে পারে যা চালু থাকা এক্সটেনশনের ধরন নির্দেশ করে।

ক্যাপচার করার অনুরোধ

এক্সটেনশন পোস্ট-প্রসেসিং এফেক্টের শক্তি EXTENSION_STRENGTH ক্যাপচার রিকোয়েস্ট প্যারামিটার কন্ট্রোল করে। এই প্যারামিটার ক্লায়েন্ট স্পষ্টভাবে সেট না করলে, সংশ্লিষ্ট ক্যাপচার ফলাফলে ডিফল্ট স্ট্রেন্থ ভ্যালু অন্তর্ভুক্ত থাকে। এইসব এক্সটেনশনের ধরনের জন্য এই প্যারামিটার এইভাবে প্রয়োগ করা যেতে পারে:

  • BOKEH: অস্পষ্টতার পরিমাণ নিয়ন্ত্রণ করে।
  • HDR এবং NIGHT: ফিউজ করা ছবির সংখ্যা এবং চূড়ান্ত ছবির উজ্জ্বলতা নিয়ন্ত্রণ করে।
  • FACE_RETOUCH: কসমেটিক এনহ্যান্সমেন্ট ও স্কিন স্মুথিংয়ের পরিমাণ নিয়ন্ত্রণ করে।

EXTENSION_STRENGTH প্যারামিটারের জন্য কাজ করে এমন রেঞ্জ হল 0 থেকে 100, যেখানে 0 বলতে কোনও এক্সটেনশন প্রসেসিং বা সাধারণ পাসথ্রু এবং 100 বলতে প্রসেসিং এফেক্টের সর্বাধিক এক্সটেনশন পাওয়ারকে বোঝায়।

EXTENSION_STRENGTH-এর জন্য সহায়তা যোগ করতে, এক্সটেনশন লাইব্রেরি ইন্টারফেসের 1.3.0 ভার্সনে চালু করা ভেন্ডর নির্দিষ্ট প্যারামিটার API ব্যবহার করুন। আরও তথ্যের জন্য, getAvailableCaptureRequestKeys() দেখুন।

ক্যাপচার ফলাফল

EXTENSION_CURRENT_TYPE ক্যাপচার ফলাফল এক্সটেনশন ইমপ্লিমেন্টেশনকে অ্যাক্টিভ এক্সটেনশন টাইপ সম্পর্কে ক্লায়েন্টদের জানাতে দেয়।

AUTO টাইপ ব্যবহার করা এক্সটেনশন, সিন কন্ডিশন, ক্যামেরা এক্সটেনশন অ্যাপের উপর নির্ভর করে HDR ও NIGHT-এর মতো এক্সটেনশন টাইপের মধ্যে ডায়নামিক সুইচ করে বলে, AUTO এক্সটেনশন দ্বারা বেছে নেওয়া বর্তমান এক্সটেনশন সম্পর্কে তথ্য দেখাতে, ক্যামেরা এক্সটেনশন অ্যাপ EXTENSION_CURRENT_TYPE ব্যবহার করতে পারে।

রিয়েল-টাইম স্টিল ক্যাপচার লেটেন্সি সংক্রান্ত অনুমান

Android 14 এবং তার পরবর্তী ভার্সনের জন্য, ক্যামেরা এক্সটেনশন ক্লায়েন্ট getRealtimeStillCaptureLatency() ব্যবহার করে দৃশ্য এবং পরিবেশের অবস্থার উপর ভিত্তি করে রিয়েল-টাইম স্টিল ক্যাপচার লেটেন্সি অনুমান কোয়েরি করতে পারে। এই পদ্ধতিটি স্ট্যাটিক getEstimatedCaptureLatencyRangeMillis() পদ্ধতির চেয়ে আরও সঠিক অনুমান প্রদান করে। লেটেন্সি অনুমান অনুযায়ী, অ্যাপ এক্সটেনশন প্রসেস করা এড়িয়ে যেতে পারে অথবা দীর্ঘ সময় ধরে চলতে থাকা অপারেশন সম্পর্কে ব্যবহারকারীদের জানানোর জন্য ইঙ্গিত দেখাতে পারে।

CameraExtensionSession.StillCaptureLatency latency;

latency = extensionSession.getRealtimeStillCaptureLatency();

// The capture latency from ExtensionCaptureCallback#onCaptureStarted() until ExtensionCaptureCallback#onCaptureProcessStarted().

latency.getCaptureLatency();

// The processing latency from  ExtensionCaptureCallback#onCaptureProcessStarted() until  the processed frame returns to the client.

latency.getProcessingLatency();

রিয়েল-টাইম স্টিল ক্যাপচার ল্যাটেন্সি এস্টিমেটকে সাপোর্ট করতে, নিম্নলিখিতগুলি প্রয়োগ করুন:

ক্যাপচার প্রসেসিং প্রগ্রেস কলব্যাক

Android 14 এবং তার পরবর্তী ভার্সনের জন্য, ক্যামেরা এক্সটেনশন ক্লায়েন্ট দীর্ঘ সময় ধরে চলা স্টিল ক্যাপচার প্রসেসিং অপারেশনের প্রগ্রেসের জন্য কলব্যাক পেতে পারে। ব্যবহারকারীর সামগ্রিক অভিজ্ঞতা উন্নত করতে অ্যাপ ব্যবহারকারীদের বর্তমান প্রগ্রেস দেখাতে পারে।

এই ফিচার ইন্টিগ্রেট করতে অ্যাপ নিম্নলিখিত কোড ব্যবহার করতে পারে:

import android.hardware.camera2.CameraExtensionSession.
ExtensionCaptureCallback;

{
…
  class AppCallbackImpl extends ExtensionCaptureCallback {
…
    @Override
    public void onCaptureProcessProgressed(
      @NonNull CameraExtensionSession session,
      @NonNull CaptureRequest request,
      @IntRange(from = 0, to = 100) int progress) {
      // Update app UI with current progress
    }
  }
…
}

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

পোস্টভিউ স্টিল ক্যাপচার

Android 14 ও এর পরের যেকোনও ভার্সনের জন্য, ক্যামেরা এক্সটেনশন setPostviewOutputConfiguration ব্যবহার করে পোস্টভিউ (প্রিভিউ ছবি) সাপ্লাই করতে পারে। ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে, কোনও এক্সটেনশনে প্রসেসিং লেটেন্সি বেড়ে গেলে, অ্যাপ পোস্টভিউ ছবিকে প্লেসহোল্ডার হিসেবে দেখাতে পারে এবং ফাইনাল ছবি উপলভ্য হলে সেটি দিয়ে প্লেসহোল্ডারটি পাল্টে দিতে পারে। অ্যাপ নিম্নলিখিত রেফারেন্স কোড ব্যবহার করে পোস্টভিউ ক্যাপচার অনুরোধ কনফিগার ও ইস্যু করতে পারে:

{
…
if (!CameraExtensionCharacteristics.isPostviewAvailable()) {
    continue;
}
…
ExtensionSessionConfiguration extensionConfiguration = new
        ExtensionSessionConfiguration(
                CameraExtensionCharacteristics.EXTENSION_NIGHT,
                outputConfig,
                backgroundExecutor,
                extensionSessionStateCallback
    );

extensionConfiguration.setPostviewOutputConfiguration(
    postviewImageOutput);
…
CaptureRequest.Builder captureRequestBuilder =
    cameraDevice.createCaptureRequest(
        CameraDevice.TEMPLATE_STILL_CAPTURE);
captureRequestBuilder.addTarget(stillImageReader.getSurface());
captureRequestBuilder.addTarget(postviewImageSurface);

CaptureRequest captureRequest = captureRequestBuilder.build();
…
}

পোস্টভিউ স্টিল ক্যাপচারকে সাপোর্ট করতে, আপনার ভেন্ডর ইমপ্লিমেন্টেশনকে এগুলি ইমপ্লিমেন্ট করতে হবে:

SurfaceView আউটপুট কাজ করে

Android 14 ও তার পরবর্তী ভার্সনের জন্য, ক্যামেরা এক্সটেনশন ক্লায়েন্ট পাওয়ার ও পারফর্ম্যান্স অপ্টিমাইজ করা প্রিভিউ রেন্ডার পাথ ব্যবহার করতে পারে। এর জন্য, বারবার করা অনুরোধের জন্য প্রিভিউ আউটপুটের SurfaceView ইনস্ট্যান্স রেজিস্টার করতে হবে।

SurfaceView আউটপুট কাজ করানোর জন্য, আপনার ভেন্ডর এক্সটেনশন ইমপ্লিমেন্টেশনকে অবশ্যই SurfaceView ইনস্ট্যান্সে স্ট্রিম ও আউটপুট প্রিভিউ করার উপযুক্ত হতে হবে। এটি কাজ করে কিনা তা যাচাই করতে, SurfaceViewExtensionPreviewTest.java CTS মডিউল রান করুন।

ভেন্ডর নির্দিষ্ট সেশনের ধরন

এই ফিচারটি ভেন্ডর এক্সটেনশন প্রয়োগ করার সুবিধা দেয় যাতে ডিফল্ট ভ্যালুর পরিবর্তে ইন্টার্নাল ক্যামেরা ক্যাপচার সেশনে সেট করা হবে এমন ভেন্ডর-নির্দিষ্ট সেশন টাইপ বেছে নেওয়া যায়।

এই ফিচারটি সম্পূর্ণ ফ্রেমওয়ার্ক ও ভেন্ডর স্ট্যাকের মধ্যে কাজ করে এবং এর ফলে ক্লায়েন্ট/পাবলিক দৃশ্যমান API-তে কোনও প্রভাব পড়ে না।

ভেন্ডর-নির্দিষ্ট সেশন ধরন বেছে নিতে, আপনার এক্সটেনশন লাইব্রেরির জন্য নিম্নলিখিতগুলি প্রয়োগ করুন: * সাধারণ এক্সটেনশনের জন্য ExtenderStateListener.onSessionType() * উন্নত এক্সটেনশনের জন্য Camera2SessionConfigImpl.getSessionType()

এক্সটেনশন ইন্টারফেস ভার্সন ইতিহাস

নিচের সারণীতে ক্যামেরা এক্সটেনশন ইন্টারফেস ভার্সনের ইতিহাস দেখানো হয়েছে। আপনাকে সর্বদা লেটেস্ট ভার্সনের সাথে ভেন্ডর লাইব্রেরি প্রয়োগ করতে হবে।

Version যোগ করা ফিচার
1.0.0
  • ভার্সন যাচাইকরণ
    • ExtensionVersionImpl
  • Basic Extender
    • PreviewExtenderImpl
    • ImageCaptureExtenderImpl
    • Processor
      • PreviewImageProcessorImpl
      • CaptureProcessorImpl
      • RequestUpdateProcessorImpl
১.১.০
  • লাইব্রেরি ইনিশিয়ালাইজেশন
    • InitializerImpl
  • কাজ করে এমন রেজোলিউশন প্রকাশ করুন
    • PreviewExtenderImpl.getSupportedResolutions
    • ImageCaptureExtenderImpl.getSupportedResolutions
1.2.0
  • AdvancedExtender
    • AdvancedExtenderImpl
    • SessionProcessorImpl
  • ক্যাপচার লেটেন্সি সংক্রান্ত আনুমানিক তথ্য পান
    • ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRange
১.৩.০
  • সাপোর্ট করা ক্যাপচার রিকোয়েস্ট কী/ফলাফল কী এক্সপোজ করা
    • ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys ও getAvailableCaptureResultKeys
    • AdvancedExtenderImpl.getAvailableCaptureRequestKeys ও getAvailableCaptureResultKeys
    • নতুন process() কল যা PreviewImageProcessorImpl ও CaptureProcessorImpl-এ ProcessResultImpl নেয়
    • ট্রিগার টাইপ সংক্রান্ত অনুরোধে সহায়তা
      • AdvancedExtenderImpl.startTrigger
1.4.0
  • এক্সটেনশন-নির্দিষ্ট মেটাডেটা
  • ডায়নামিক স্টিল ক্যাপচার ল্যাটেন্সি এস্টিমেট
  • ক্যাপচার প্রসেসিং প্রগ্রেস কলব্যাক
  • পোস্টভিউ স্টিল ক্যাপচার
  • SurfaceView আউটপুটের জন্য সহায়তা
  • ভেন্ডর নির্দিষ্ট সেশনের ধরন

রেফারেন্স প্রয়োগ করা

নিম্নলিখিত রেফারেন্স OEM ভেন্ডর লাইব্রেরি ইমপ্লিমেন্টেশন frameworks/ex-এ উপলভ্য।

  • advancedSample: Advanced Extender-এর প্রাথমিক প্রয়োগ।

  • sample: Basic Extender-এর প্রাথমিক প্রয়োগ।

  • service_based_sample: একটি ইমপ্লিমেন্টেশন যা দেখায় কীভাবে Service-এ ক্যামেরা এক্সটেনশন হোস্ট করতে হয়। এই প্রয়োগে নিম্নলিখিত কম্পোনেন্ট রয়েছে:

    • oem_library: Camera2 ও CameraX Extensions API-এর জন্য Camera Extensions OEM লাইব্রেরি যা Extensions-Interface প্রয়োগ করে। এটি একটি পাসথ্রু হিসেবে কাজ করে যা Extensions-Interface থেকে পরিষেবাতে কল ফরওয়ার্ড করে। এই লাইব্রেরি এছাড়াও, পরিষেবার সাথে যোগাযোগ করার জন্য AIDL ফাইল ও র‍্যাপার ক্লাস প্রদান করে।

      অ্যাডভান্সড এক্সটেন্ডার ডিফল্ট হিসেবে চালু থাকে। Basic Extender চালু করতে, ExtensionsVersionImpl#isAdvancedExtenderImplemented পরিবর্তন করে false করুন।

    • extensions_service: এক্সটেনশন পরিষেবার একটি স্যাম্পেল প্রয়োগ। এখানে আপনার ইমপ্লিমেন্টেশন যোগ করুন। পরিষেবাতে প্রয়োগ করার ইন্টারফেসটি Extensions-Interface-এর মতোই। যেমন, IAdvancedExtenderImpl.Stub প্রয়োগ করলে AdvancedExtenderImpl-এর মতো একই অপারেশন করা হয়। Image এবং TotalCaptureResult পার্সেল করার জন্য ImageWrapper এবং TotalCaptureResultWrapper প্রয়োজন।

ডিভাইসে ভেন্ডর লাইব্রেরি সেট-আপ করা

OEM ভেন্ডর লাইব্রেরি কোনও অ্যাপে বিল্ট-ইন থাকে না; এটি রানটাইমে Camera2/X-এর মাধ্যমে ডিভাইস থেকে লোড করা হয়। CameraX-এ, <uses-library> ট্যাগ ঘোষণা করে যে androidx.camera.extensions.impl লাইব্রেরি, যা camera-extensions লাইব্রেরির AndroidManifest.xml ফাইলে সংজ্ঞায়িত করা হয়েছে, তা CameraX-এর একটি নির্ভরতা এবং রানটাইমে লোড করতে হবে। Camera2-এ, ফ্রেমওয়ার্ক একটি এক্সটেনশন পরিষেবা লোড করে যা এছাড়াও ঘোষণা করে যে এটি রানটাইমে <uses-library>একই androidx.camera.extensions.impl লাইব্রেরি লোড করে।

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

কোনও ডিভাইসে OEM লাইব্রেরি সেট-আপ করতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:

  1. <uses-library> ট্যাগের জন্য প্রয়োজনীয় অনুমতি ফাইল যোগ করুন, নিচে উল্লেখ করা ফর্ম্যাট ব্যবহার করে: /etc/permissions/ANY_FILENAME.xml. যেমন, /etc/permissions/camera_extensions.xml। এই ডিরেক্টরির ফাইলগুলি <uses-library>-এ নাম দেওয়া লাইব্রেরির ম্যাপিং ডিভাইসের আসল ফাইল পাথে প্রদান করে।
  2. ফাইলে প্রয়োজনীয় তথ্য যোগ করতে নিচের উদাহরণটি ব্যবহার করুন।

    • name অবশ্যই androidx.camera.extensions.impl হতে হবে কারণ CameraX এই লাইব্রেরিই সার্চ করে।
    • file হল সেই ফাইলের অ্যাবসলিউট পাথ যাতে এক্সটেনশন ইমপ্লিমেন্টেশন (যেমন, /system/framework/androidx.camera.extensions.impl.jar) আছে।
    <?xml version="1.0" encoding="utf-8"?>
    <permissions>
        <library name="androidx.camera.extensions.impl"
                 file="OEM_IMPLEMENTED_JAR" />
    </permissions>

Android 12 বা তার পরবর্তী যেকোনও ভার্সনে, CameraX এক্সটেনশন কাজ করে এমন ডিভাইসে ro.camerax.extensions.enabled প্রপার্টি true হিসেবে সেট করা থাকতে হবে, যা কোনও ডিভাইসে এক্সটেনশন কাজ করে কিনা তা কোয়েরি করার অনুমতি দেয়। এটি করতে, ডিভাইসের মেক ফাইলে নিম্নলিখিত লাইন যোগ করুন:

PRODUCT_VENDOR_PROPERTIES += \
    ro.camerax.extensions.enabled=true \

যাচাইকরণ

ডেভেলপমেন্টের সময় OEM ভেন্ডর লাইব্রেরির প্রয়োগ পরীক্ষা করতে, androidx-main/camera/integration-tests/extensionstestapp/-এ উদাহরণ হিসেবে দেওয়া অ্যাপটি ব্যবহার করুন, যা বিভিন্ন ভেন্ডর এক্সটেনশনের মাধ্যমে চলে।

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

এক্সটেন্ডেড সিন মোড বনাম ক্যামেরা এক্সটেনশন

বোকেহ এক্সটেনশনের জন্য, ক্যামেরা এক্সটেনশন ব্যবহার করে এটি এক্সপোজ করা ছাড়াও, আপনি এক্সটেন্ডেড সিন মোড ব্যবহার করে এক্সটেনশন এক্সপোজ করতে পারেন, যা CONTROL_EXTENDED_SCENE_MODE কী-এর মাধ্যমে চালু করা হয়। প্রয়োগ করা সংক্রান্ত আরও বিবরণের জন্য, ক্যামেরা বোকেহ দেখুন।

ক্যামেরা এক্সটেনশনের তুলনায় এক্সটেন্ডেড সিন মোডে কম বিধিনিষেধ থাকে camera2 অ্যাপ। যেমন, আপনি সাধারণ CameraCaptureSession ইনস্ট্যান্সে এক্সটেন্ডেড সিন মোড চালু করতে পারেন যা ফ্লেক্সিবল স্ট্রিম কম্বিনেশন ও ক্যাপচার রিকোয়েস্ট প্যারামিটার কাজ করে। অন্যদিকে, ক্যামেরা এক্সটেনশন শুধুমাত্র নির্দিষ্ট কিছু স্ট্রিম টাইপ সাপোর্ট করে এবং ক্যাপচার অনুরোধ প্যারামিটারের জন্য সীমিত সাপোর্ট প্রদান করে।

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

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

প্রায়শই জিজ্ঞাসিত প্রশ্ন (FAQ)

API লেভেলে কি কোনও বিধিনিষেধ আছে?

হ্যাঁ। এটি OEM ভেন্ডর লাইব্রেরি প্রয়োগের জন্য প্রয়োজনীয় Android API ফিচার সেটের উপর নির্ভর করে। যেমন, ExtenderStateListener.onPresetSession() ট্যাগগুলির একটি বেসলাইন সেট করতে SessionConfiguration.setSessionParameters() কল ব্যবহার করে। এই কলটি শুধুমাত্র API লেভেল 28 ও তার পরবর্তী ভার্সনে উপলভ্য। নির্দিষ্ট ইন্টারফেস পদ্ধতি সম্পর্কে আরও জানতে, API রেফারেন্স ডকুমেন্টেশন দেখুন।