আউটপুট স্ট্রিম, ক্রপিং ও জুম

এই পৃষ্ঠায় আউটপুট স্ট্রিম, ক্রপিং, রিপ্রসেসিং ও জুম সহ ক্যামেরা অপারেশন ও অপ্টিমাইজেশন সম্পর্কে বর্ণনা করা হয়েছে।

আউটপুট স্ট্রিম

ক্যামেরা সাবসিস্টেম শুধুমাত্র ANativeWindow-ভিত্তিক পাইপলাইনে কাজ করে সব রেজোলিউশন ও আউটপুট ফর্ম্যাটের জন্য। GPU, ভিডিও এনকোডার, RenderScript বা অ্যাপ-ভিজিবল বাফারের (RAW Bayer, প্রসেস করা YUV বাফার বা JPEG-এনকোড করা বাফার) মতো একাধিক টার্গেটে একটি ফ্রেম পাঠানোর জন্য একই সময়ে একাধিক স্ট্রিম কনফিগার করা যেতে পারে।

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

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

ক্রপিং

সম্পূর্ণ পিক্সেল অ্যারে ক্রপ করা (ডিজিটাল জুম ও অন্যান্য ব্যবহারের ক্ষেত্রে যেখানে ছোট FOV প্রয়োজন) ANDROID_SCALER_CROP_REGION সেটিংয়ের মাধ্যমে জানানো হয়। এটি একটি অনুরোধ-পিছু সেটিং এবং অনুরোধ-পিছু ভিত্তিতে পরিবর্তন করা যেতে পারে, যা মসৃণ ডিজিটাল জুম প্রয়োগ করার জন্য অত্যন্ত গুরুত্বপূর্ণ।

অঞ্চলটি একটি আয়তক্ষেত্র (x, y, প্রস্থ, উচ্চতা) হিসাবে সংজ্ঞায়িত করা হয়, যেখানে (x, y) আয়তক্ষেত্রের উপরের-বাম কোণটি বর্ণনা করে। সেন্সর অ্যাক্টিভ পিক্সেল অ্যারের কোঅর্ডিনেট সিস্টেমে আয়তক্ষেত্রটি সংজ্ঞায়িত করা হয়েছে, যেখানে (0,0) হল অ্যাক্টিভ পিক্সেল অ্যারের উপরের বাঁদিকের পিক্সেল। তাই, প্রস্থ এবং উচ্চতা ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY স্ট্যাটিক তথ্য ফিল্ডে রিপোর্ট করা ডাইমেনশনের চেয়ে বড় হতে পারবে না। HAL-এর মাধ্যমে ANDROID_SCALER_MAX_DIGITAL_ZOOM স্ট্যাটিক তথ্য ফিল্ডের মাধ্যমে ন্যূনতম অনুমোদিত প্রস্থ ও উচ্চতা রিপোর্ট করা হয়, যা সর্বাধিক কাজ করে এমন জুম ফ্যাক্টর বর্ণনা করে। তাই, ন্যূনতম ক্রপ করা অঞ্চলের প্রস্থ ও উচ্চতা হল:

  {width, height} =
   { floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[0] /
       ANDROID_SCALER_MAX_DIGITAL_ZOOM),
     floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[1] /
       ANDROID_SCALER_MAX_DIGITAL_ZOOM) }

ক্রপ করা অঞ্চলকে নির্দিষ্ট প্রয়োজনীয়তা পূরণ করতে হলে (যেমন, এটি জোড় কোঅর্ডিনেটে শুরু হতে হবে এবং এর প্রস্থ/উচ্চতা জোড় হতে হবে), HAL-কে অবশ্যই প্রয়োজনীয় রাউন্ডিং করতে হবে এবং আউটপুট ফলাফল মেটাডেটায় ব্যবহৃত চূড়ান্ত ক্রপ করা অঞ্চল লিখতে হবে। একইভাবে, HAL যদি ভিডিও স্টেবিলাইজেশন প্রয়োগ করে, তাহলে ভিডিও স্টেবিলাইজেশন প্রয়োগ করার পরে আউটপুটে আসলে অন্তর্ভুক্ত থাকা অঞ্চলকে বর্ণনা করতে ফলাফলের ক্রপ করা অঞ্চলকে অবশ্যই অ্যাডজাস্ট করতে হবে। সাধারণত, ক্যামেরা ব্যবহারকারী অ্যাপকে অবশ্যই ক্রপ করা অঞ্চল, ইমেজ সেন্সরের ডাইমেনশন এবং লেন্সের ফোকাল লেন্থের উপর ভিত্তি করে সেটি যে ফিল্ড অফ ভিউ পাচ্ছে তা নির্ধারণ করতে হবে।

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

সব ক্ষেত্রেই, স্ট্রিম ক্রপকে অবশ্যই সম্পূর্ণ ক্রপ অঞ্চলের মধ্যে কেন্দ্রে রাখতে হবে এবং প্রতিটি স্ট্রিমকে সম্পূর্ণ ক্রপ অঞ্চলের সাপেক্ষে শুধুমাত্র অনুভূমিক বা উল্লম্বভাবে ক্রপ করা হয়, কখনও দুটিই করা হয় না।

যেমন, দুটি স্ট্রিম সংজ্ঞায়িত করা হলে, একটি ৬৪০x৪৮০ স্ট্রিম (৪:৩ অ্যাস্পেক্ট) এবং একটি ১২৮০x৭২০ স্ট্রিম (১৬:৯ অ্যাস্পেক্ট), নিচে একটি কাল্পনিক ৩ এমপি (২০০০ x ১৫০০ পিক্সেল অ্যারে) সেন্সরে কয়েকটি স্যাম্পেল ক্রপ অঞ্চলের জন্য প্রতিটি স্ট্রিমের প্রত্যাশিত আউটপুট অঞ্চল দেখানো হয়েছে।

ক্রপ করা অঞ্চল: (৫০০, ৩৭৫, ১০০০, ৭৫০) (৪:৩ অ্যাস্পেক্ট রেশিও)
৬৪০x৪৮০ স্ট্রিম ক্রপ: (৫০০, ৩৭৫, ১০০০, ৭৫০) (ক্রপ করা অঞ্চলের সমান)
১২৮০x৭২০ স্ট্রিম ক্রপ: (৫০০, ৪৬৯, ১০০০, ৫৬২)

crop-region-43-ratio

ছবি ১. ৪:৩ অ্যাস্পেক্ট রেশিও

ক্রপ করা অঞ্চল: (৫০০, ৩৭৫, ১৩৩৩, ৭৫০) (১৬:৯ অ্যাস্পেক্ট রেশিও)
৬৪০x৪৮০ স্ট্রিম ক্রপ: (৬৬৬, ৩৭৫, ১০০০, ৭৫০)
১২৮০x৭২০ স্ট্রিম ক্রপ: (৫০০, ৩৭৫, ১৩৩৩, ৭৫০) (ক্রপ করা অঞ্চলের সমান)

crop-region-169-ratio

ছবি ২. ১৬:৯ আকৃতির অনুপাত

ক্রপ করা অঞ্চল: (৫০০, ৩৭৫, ৭৫০, ৭৫০) (১:১ অ্যাস্পেক্ট রেশিও)
৬৪০x৪৮০ স্ট্রিম ক্রপ: (৫০০, ৪৬৯, ৭৫০, ৫৬২)
১২৮০x৭২০ স্ট্রিম ক্রপ: (৫০০, ৫৪৩, ৭৫০, ৪১৪)

crop-region-11-ratio

ছবি ৩. ১:১ অ্যাস্পেক্ট রেশিও

এবং একটি চূড়ান্ত উদাহরণ, 480p স্ট্রিমের পরিবর্তে 1024x1024 স্কোয়ার অ্যাস্পেক্ট রেশিও স্ট্রিম:
ক্রপ অঞ্চল: (৫০০, ৩৭৫, ১০০০, ৭৫০) (৪:৩ অ্যাস্পেক্ট রেশিও)
1024x1024 স্ট্রিম ক্রপ: (৬২৫, ৩৭৫, ৭৫০, ৭৫০)
1280x720 স্ট্রিম ক্রপ: (৫০০, ৪৬৯, ১০০০, ৫৬২)

crop-region-43-square-ratio

ছবি ৪. ৪:৩ অ্যাস্পেক্ট রেশিও, বর্গাকার

আবার প্রসেস করা

RAW Bayer ডেটা রিপ্রসেস করার সুবিধা প্রদান করে RAW ইমেজ ফাইলের জন্য অতিরিক্ত সহায়তা প্রদান করা হয়। এই সাপোর্ট ক্যামেরা পাইপলাইনকে আগে ক্যাপচার করা RAW বাফার ও মেটাডেটা (আগে রেকর্ড করা সম্পূর্ণ ফ্রেম) প্রসেস করার অনুমতি দেয়, যাতে নতুন রেন্ডার করা YUV বা JPEG আউটপুট তৈরি করা যায়।

জুম

Android 11 বা তার পরবর্তী যেকোনও ভার্সনে চলা ডিভাইসের ক্ষেত্রে, কোনও অ্যাপ ANDROID_CONTROL_ZOOM_RATIO সেটিংসের মাধ্যমে ক্যামেরার জুম (ডিজিটাল ও অপ্টিক্যাল) ব্যবহার করতে পারে।

জুম রেশিওকে ফ্লোটিং পয়েন্ট ফ্যাক্টর হিসেবে সংজ্ঞায়িত করা হয়। ক্রপ ও জুমের জন্য ANDROID_SCALER_CROP_REGION ব্যবহার না করে, কোনও অ্যাপ জুম লেভেল কন্ট্রোল করতে ANDROID_CONTROL_ZOOM_RATIO ব্যবহার করতে পারে এবং নেটিভ ক্যামেরা সেন্সরের চেয়ে আলাদা অ্যাস্পেক্ট রেশিও পেতে হরাইজন্টাল ও ভার্টিক্যাল ক্রপিংয়ের জন্য ANDROID_SCALER_CROP_REGION ব্যবহার করতে পারে।

মাল্টি-ক্যামেরা সিস্টেমে আলাদা আলাদা ফোকাল লেন্থ সহ একাধিক লেন্স থাকতে পারে এবং ব্যবহারকারী লেন্স পরিবর্তন করে অপ্টিক্যাল জুম ব্যবহার করতে পারেন। ANDROID_CONTROL_ZOOM_RATIO ব্যবহার করলে নিম্নলিখিত পরিস্থিতিতে সুবিধা পাওয়া যায়:

  • ওয়াইড লেন্স থেকে টেলিফটো লেন্সে জুম ইন করা: ফ্লোটিং পয়েন্ট রেশিও ANDROID_SCALER_CROP_REGION-এর ইন্টিজার ভ্যালুর তুলনায় আরও ভাল প্রিসিশন প্রদান করে।
  • ওয়াইড লেন্স থেকে আল্ট্রাওয়াইড লেন্সে জুম-আউট করা: ANDROID_CONTROL_ZOOM_RATIO জুম-আউট করার সুবিধা দেয় (<1.0f) যেখানে ANDROID_SCALER_CROP_REGION দেয় না।

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

জুম রেশিও: ২.০; আসল ফিল্ড অফ ভিউয়ের ১/৪
ক্রপ করা অংশ: (০, ০, ২০০০, ১৫০০) (৪:৩ অ্যাস্পেক্ট রেশিও)
৬৪০x৪৮০ স্ট্রিম ক্রপ: (০, ০, ২০০০, ১৫০০) (ক্রপ করা অংশের সমান)
১২৮০x৭২০ স্ট্রিম ক্রপ: (০, ১৮৭, ২০০০, ১১২৫)

zoom-ratio-2-crop-43

ছবি ৫. ২.০ জুম, ৪:৩ অ্যাস্পেক্ট রেশিও

জুম রেশিও: ২.০; আসল ফিল্ড অফ ভিউয়ের ১/৪
ক্রপ করা অংশ: (০, ১৮৭, ২০০০, ১১২৫) (১৬:৯ অ্যাস্পেক্ট রেশিও)
৬৪০x৪৮০ স্ট্রিম ক্রপ: (২৫০, ১৮৭, ১৫০০, ১১২৫) (পিলারবক্সড)
১২৮০x৭২০ স্ট্রিম ক্রপ: (০, ১৮৭, ২০০০, ১১২৫) (ক্রপ করা অংশের সমান)

zoom-ratio-2-crop-169

ছবি ৬. ২.০ জুম, ১৬:৯ অ্যাস্পেক্ট রেশিও

জুম রেশিও: ০.৫; আসল ফিল্ড অফ ভিউয়ের ৪ গুণ (ওয়াইড লেন্স থেকে আল্ট্রাওয়াইড লেন্সে পরিবর্তন করা হয়েছে)
ক্রপ করা অঞ্চল: (২৫০, ০, ১৫০০, ১৫০০) (১:১ অ্যাস্পেক্ট রেশিও)
৬৪০x৪৮০ স্ট্রিম ক্রপ: (২৫০, ১৮৭, ১৫০০, ১১২৫) (লেটারবক্সড)
১২৮০x৭২০ স্ট্রিম ক্রপ: (২৫০, ৩২৮, ১৫০০, ৮৪৪) (লেটারবক্সড)

images/zoom-ratio-0.5-crop-11

ছবি ৭. ০.৫ জুম, ১:১ অ্যাস্পেক্ট রেশিও

উপরের গ্রাফ থেকে দেখা যাচ্ছে যে ক্রপ করা অঞ্চলের কোঅর্ডিনেট সিস্টেমটি জুম করার পরে কার্যকর ফিল্ড অফ ভিউতে পরিবর্তিত হয় এবং নিম্নলিখিত ডাইমেনশন সহ আয়তক্ষেত্র দ্বারা উপস্থাপিত হয়: (0, 0, activeArrayWith, activeArrayHeight)। AE/AWB/AF অঞ্চল এবং মুখের ক্ষেত্রেও একই প্রযোজ্য। এই কোঅর্ডিনেট সিস্টেম পরিবর্তন RAW ক্যাপচার ও এর সাথে সম্পর্কিত মেটাডেটা যেমন intrinsicCalibration এবং lensShadingMap-এর ক্ষেত্রে প্রযোজ্য নয়।

উপরের একই কাল্পনিক উদাহরণ ব্যবহার করে এবং আউটপুট স্ট্রিম #১ (640x480) ভিউফাইন্ডার স্ট্রিম হিসেবে ধরে নিয়ে, দুটি উপায়ের মধ্যে একটির মাধ্যমে ২.০x জুম করা যেতে পারে:

  • zoomRatio = 2.0, scaler.cropRegion = (0, 0, 2000, 1500)
  • zoomRatio = 1.0 (ডিফল্ট), scaler.cropRegion = (500, 375, 1000, 750)

কোনও অ্যাপের জন্য ভিউফাইন্ডারের ফিল্ড অফ ভিউয়ের সবচেয়ে উপরে বাঁদিকের কোণায় android.control.aeRegions সেট করতে, android.control.aeRegions-কে (0, 0, 1000, 750) হিসেবে সেট করুন এবং android.control.zoomRatio-কে 2.0 হিসেবে সেট করুন। অথবা, 1.0-এর android.control.zoomRatio-এর জন্য (500, 375, 1000, 750)-এর সমতুল্য অঞ্চলে অ্যাপটি android.control.aeRegions সেট করতে পারে।