زیرسیستم لایه انتزاع سخت‌افزار

این صفحه زیرسیستم HAL را شرح می‌دهد، ازجمله درخواست‌ها، زیرسیستم دوربین، توالی راه‌اندازی و عملکرد، سطوح سخت‌افزار، و تعاملات.

درخواست‌ها

چارچوب برنامه درخواست‌هایی را برای نتایج ضبط‌شده به زیرسیستم دوربین صادر می‌کند. هر درخواست با یک مجموعه نتایج مطابقت دارد. درخواست شامل همه اطلاعات پیکربندی درباره ضبط و پردازش آن نتایج است. این شامل مواردی مثل وضوح و قالب پیکسل؛ حسگر دستی، لنز، و کنترل فلاش؛ حالت‌های عملکرد 3A؛ کنترل پردازش RAW به YUV؛ و تولید آمار می‌شود. این کار امکان کنترل بسیار بیشتری بر برونداد و پردازش نتایج فراهم می‌کند. چندین درخواست می‌توانند به‌طور هم‌زمان درحال پردازش باشند، و ارسال درخواست‌ها غیرمسدودکننده است. و درخواست‌ها همیشه به ترتیب دریافت پردازش می‌شوند.

مدل درخواست دوربین

شکل ۱. مدل دوربین.

زیرسیستم HAL و دوربین

زیرسیستم دوربین شامل پیاده‌سازی‌هایی برای مؤلفه‌ها در خط لوله دوربین، مانند الگوریتم 3A و کنترل‌های پردازش است. ‫HAL دوربین واسط‌هایی را برای پیاده‌سازی نسخه‌های خودتان از این عناصر ارائه می‌دهد. برای حفظ سازگاری بین‌پلتفرمی بین تولیدکنندگان دستگاه‌های مختلف و فروشندگان «پردازنده سیگنال تصویر» (ISP، یا حسگر دوربین)، مدل خط لوله دوربین مجازی است و مستقیماً با هیچ ISP واقعی مطابقت ندارد. بااین‌حال، به‌اندازه کافی به خطوط پردازش واقعی شبیه است تا بتوانید آن را به‌طور مؤثر به سخت‌افزارتان نگاشت کنید. علاوه‌براین، این مدل به‌اندازه کافی انتزاعی است تا امکان استفاده از چندین الگوریتم و ترتیب عملیات مختلف را بدون به‌خطر انداختن کیفیت، کارایی، یا سازگاری بین دستگاهی فراهم کند.

خط لوله دوربین از راه‌اندازهایی نیز پشتیبانی می‌کند که چارچوب برنامه می‌تواند برای روشن کردن مواردی مثل فوکوس خودکار آغاز کند. همچنین اعلان‌هایی را به چارچوب برنامه ارسال می‌کند و برنامه‌ها را از رویدادهایی مانند قفل فوکوس خودکار یا خطاها مطلع می‌کند.

لایه انتزاعی سخت‌افزار دوربین

شکل ۲. خط لوله دوربین.

توجه داشته باشید که برخی‌از بلوک‌های پردازش تصویر که در نمودار بالا نشان داده شده‌اند در نسخه اولیه به‌خوبی تعریف نشده‌اند. خط لوله دوربین فرض‌های زیر را درنظر می‌گیرد:

  • خروجی RAW Bayer هیچ پردازشی در ISP ندارد.
  • آمار براساس داده‌های حسگر خام تولید می‌شود.
  • بلوک‌های پردازش مختلفی که داده‌های حسگر خام را به YUV تبدیل می‌کنند، به ترتیب دلخواه هستند.
  • While multiple scale and crop units are shown, all scaler units share the output region controls (digital zoom). بااین‌حال، هر واحد ممکن است وضوح برونداد و قالب پیکسل متفاوتی داشته باشد.

خلاصه استفاده از میانای برنامه‌سازی کاربردی

این خلاصه کوتاهی از مراحل استفاده از API دوربین Android است. برای تفکیک دقیق این مراحل، ازجمله فراخوانی‌های API، به بخش «توالی راه‌اندازی و عملکرد موردانتظار» مراجعه کنید.

  1. به‌دنبال دستگاه‌های دوربین بگردد و آن‌ها را فهرست کند.
  2. دستگاه را باز کنید و شنوندگان را متصل کنید.
  3. بروندادها را برای مورد استفاده هدف پیکربندی کنید (مثل ضبط یا گرفتن عکس).
  4. درخواست‌هایی برای مورد استفاده هدف ایجاد کنید.
  5. درخواست‌های ضبط/تکرار و رگبار.
  6. فراداده نتیجه و داده‌های تصویر را دریافت کنید.
  7. هنگام تغییر موارد استفاده، به مرحله ۳ برگردید.

خلاصه عملیات HAL

  • درخواست‌های غیرهم‌زمان برای ضبط‌ها از چارچوب می‌آیند.
  • دستگاه HAL باید درخواست‌ها را به‌ترتیب پردازش کند. و برای هر درخواست، فراداده نتیجه برونداد و یک یا چند میان‌گیر تصویر برونداد تولید می‌کند.
  • درخواست‌ها و نتایج و جاری‌سازی‌های ارجاع‌شده توسط درخواست‌های بعدی به‌ترتیب دریافت پردازش می‌شوند.
  • مُهرهای زمان باید برای همه بروندادهای یک درخواست یکسان باشد تا چارچوب بتواند درصورت نیاز آن‌ها را با هم مطابقت دهد.
  • همه پیکربندی و وضعیت ضبط (به‌جز روال‌های 3A) در درخواست‌ها و نتایج کپسوله می‌شود.

نمای کلی Camera HAL

شکل ۳. نمای کلی Camera HAL.

راه‌اندازی و توالی عملیات موردانتظار

این بخش حاوی توضیح دقیقی از مراحل موردانتظار هنگام استفاده از میانای برنامه‌سازی کاربردی دوربین است. برای تعاریف میانای HIDL، به platform/hardware/interfaces/camera/ مراجعه کنید.

شمارش، باز کردن دستگاه‌های دوربین، و ایجاد جلسه فعال

  1. پس‌از مقداردهی اولیه، چارچوب شروع به گوش دادن به هر ارائه‌دهنده دوربین موجود می‌کند که رابط ICameraProvider را پیاده‌سازی می‌کند. اگر چنین ارائه‌دهنده یا ارائه‌دهندگانی وجود داشته باشند، چارچوب سعی می‌کند اتصال برقرار کند.
  2. چارچوب دستگاه‌های دوربین را ازطریق ICameraProvider::getCameraIdList فهرست می‌کند.
  3. چارچوب با فراخوانی ICameraProvider::getCameraDeviceInterface_VX_X مربوطه، ICameraDevice جدیدی را نمونه‌سازی می‌کند.
  4. چارچوب ICameraDevice::open را برای ایجاد جلسه ضبط فعال جدید ICameraDeviceSession فرا می‌خواند.

استفاده از جلسه دوربین فعال

  1. چارچوب ICameraDeviceSession::configureStreams را با فهرستی از جاری‌سازی‌های ورودی/خروجی به دستگاه HAL فرا می‌خواند.
  2. چارچوب تنظیمات پیش‌فرض را برای برخی‌از موارد استفاده با تماس با ICameraDeviceSession::constructDefaultRequestSettings درخواست می‌کند. این اتفاق می‌تواند در هر زمانی پس‌از ایجاد ICameraDeviceSession توسط ICameraDevice::open رخ دهد.
  3. چارچوب اولین درخواست ضبط را با تنظیمات براساس یکی از مجموعه‌های تنظیمات پیش‌فرض و با حداقل یک جاری‌سازی برونداد که قبلاً توسط چارچوب ثبت شده است، می‌سازد و به HAL ارسال می‌کند. این مورد با ICameraDeviceSession::processCaptureRequest به HAL ارسال می‌شود. «لایه انتزاع سخت‌افزار» باید تا زمانی که برای ارسال درخواست بعدی آماده شود، از برگشت این تماس جلوگیری کند.
  4. چارچوب همچنان درخواست‌ها و تماس‌های ICameraDeviceSession::constructDefaultRequestSettings را ارسال می‌کند تا درصورت لزوم، میان‌گیرهای تنظیمات پیش‌فرض را برای موارد استفاده دیگر دریافت کند.
  5. وقتی ضبط درخواست شروع می‌شود (حسگر شروع به نوردهی برای ضبط می‌کند)، HAL با پیام SHUTTER (شاتر) که شامل شماره قاب و مُهر زمان شروع نوردهی است، ICameraDeviceCallback::notify را فرا می‌خواند. این فراخوانی برگشتی اطلاع‌رسانی لازم نیست قبل‌از اولین فراخوانی processCaptureResult برای درخواست اتفاق بیفتد، اما هیچ نتیجه‌ای برای ضبط به برنامه ارائه نمی‌شود تا زمانی که notify برای آن ضبط فراخوانی شود.
  6. پس‌از کمی تأخیر در خط لوله، HAL شروع به برگرداندن عکس‌های تکمیل‌شده به چارچوب با ICameraDeviceCallback::processCaptureResult می‌کند. این موارد به همان ترتیبی که درخواست‌ها ارسال شده‌اند برگردانده می‌شوند. بسته به عمق خط لوله دستگاه HAL دوربین، چندین درخواست می‌تواند به‌طور هم‌زمان درحال پردازش باشد.

پس‌از مدتی، یکی از موارد زیر رخ می‌دهد:

  • چارچوب ارسال درخواست‌های جدید را متوقف می‌کند، منتظر می‌ماند تا ضبط‌های موجود تکمیل شوند (همه بافرها پر شوند، همه نتایج برگردانده شوند)، و سپس دوباره ICameraDeviceSession::configureStreams را فراخوانی می‌کند. با این کار، سخت‌افزار و خط لوله دوربین برای مجموعه جدیدی از جریان‌های ورودی/خروجی بازنشانی می‌شود. برخی‌از جاری‌سازی‌ها را می‌توان از پیکربندی قبلی دوباره استفاده کرد. سپس چارچوب از اولین درخواست ضبط به HAL ادامه می‌دهد، اگر حداقل یک جاری‌سازی برونداد ثبت‌شده باقی بماند. (درغیراین‌صورت، ابتدا باید ICameraDeviceSession::configureStreams را داشته باشید.)
  • چارچوب می‌تواند ICameraDeviceSession::close را فراخوانی کند تا جلسه دوربین را پایان دهد. این را می‌توان در هر زمانی که هیچ تماس دیگری از چارچوب فعال نیست فراخوانی کرد، اگرچه ممکن است تماس تا زمانی که همه ضبط‌های درحال انجام تکمیل شوند (همه نتایج برگردانده شوند، همه میان‌گیرها پر شوند) مسدود شود. پس‌از بازگشت تماس close، دیگر هیچ تماسی به ICameraDeviceCallback از HAL مجاز نیست. پس‌از شروع تماس close، چارچوب نمی‌تواند هیچ‌یک از عملکردهای دستگاه HAL دیگر را فراخوانی کند.
  • درصورت بروز خطا یا رویداد ناهم‌زمان دیگر، HAL باید ICameraDeviceCallback::notify را با پیام خطا/رویداد مناسب فراخوانی کند. پس‌از بازگشت از اعلان خطای مهلک در کل دستگاه، HAL باید طوری عمل کند که انگار close در آن فراخوانده شده است. بااین‌حال، HAL باید یا همه ضبط‌های معلقه را لغو کند یا آن‌ها را تکمیل کند سپس notify را فراخوانی کند، تا پس‌از فراخوانی notify با خطای مهلک، چارچوب دیگر از دستگاه بازخوان دریافت نکند. روش‌های دیگر به‌جز close باید -ENODEV یا NULL را پس‌از اینکه روش notify از پیام خطای مهلک برگرداند، برگردانند.

جریان عملیات دوربین

شکل ۴. جریان عملیاتی دوربین.

سطوح سخت‌افزار

دستگاه‌های دوربین می‌توانند چندین سطح سخت‌افزاری را بسته به قابلیت‌هایشان پیاده‌سازی کنند. برای اطلاعات بیشتر، سطح سخت‌افزار پشتیبانی‌شده را ببینید.

تعامل بین درخواست ضبط برنامه، کنترل 3A، و خط لوله پردازش

بسته به تنظیمات در بلوک کنترل 3A، خط لوله دوربین برخی‌از پارامترها را در درخواست ضبط برنامه نادیده می‌گیرد و به‌جای آن از مقادیر ارائه‌شده توسط روال‌های کنترل 3A استفاده می‌کند. برای مثال، وقتی نوردهی خودکار فعال است، زمان نوردهی، مدت قاب، و پارامترهای حساسیت حسگر توسط الگوریتم 3A پلاتفرم کنترل می‌شود و مقادیر مشخص‌شده توسط برنامه نادیده گرفته می‌شود. مقادیر انتخاب‌شده برای قاب توسط روال‌های 3A باید در فراداده خروجی گزارش شود. جدول زیر حالت‌های مختلف بلوک کنترل 3A و ویژگی‌هایی را که توسط این حالت‌ها کنترل می‌شوند شرح می‌دهد. برای تعریف این دارایی‌ها، فایل platform/system/media/camera/docs/docs.html را ببینید.

پارامتر ایالت دارایی‌های کنترل‌شده
android.control.aeMode OFF هیچ‌کدام.
ON ‫android.sensor.exposureTime،‏ android.sensor.frameDuration،‏ android.sensor.sensitivity،‏ android.lens.aperture (درصورت پشتیبانی)، و android.lens.filterDensity (درصورت پشتیبانی).
ON_AUTO_FLASH همه چیز ON، به‌علاوه android.flash.firingPower، android.flash.firingTime، و android.flash.mode.
ON_ALWAYS_FLASH مشابه ON_AUTO_FLASH.
ON_AUTO_FLASH_RED_EYE مشابه ON_AUTO_FLASH.
android.control.awbMode OFF هیچ‌کدام.
WHITE_BALANCE_* android.colorCorrection.transform. اصلاحات مختص پلاتفرم اگر android.colorCorrection.mode FAST یا HIGH_QUALITY باشد.
android.control.afMode OFF هیچ‌کدام
FOCUS_MODE_* android.lens.focusDistance
android.control.videoStabilization OFF هیچ‌کدام.
ON می‌تواند android.scaler.cropRegion را برای اجرای لرزش‌گیر ویدیو تنظیم کند.
android.control.mode OFF AE،‏ AWB، و AF غیرفعال هستند.
AUTO از تنظیمات جداگانه AE،‏ AWB، و AF استفاده می‌شود.
SCENE_MODE_* می‌تواند همه پارامترهای فهرست‌شده در بالا را ملغی کند. کنترل‌های 3A تکی غیرفعال است.

کنترل‌های موجود در بلوک پردازش تصویر در شکل ۲ همگی براساس اصل مشابهی عمل می‌کنند و هر بلوک سه حالت دارد:

  • ‫OFF: این بلوک پردازش غیرفعال است. بلوک‌های دِموزاییک، تصحیح رنگ، و اصلاح منحنی تن نمی‌توانند غیرفعال شوند.
  • FAST: در این حالت، بلوک پردازش ممکن است نرخ فریم برونداد را در مقایسه با حالت OFF کاهش ندهد، اما درغیراین‌صورت باید با درنظر گرفتن این محدودیت، بهترین کیفیت برونداد ممکن را تولید کند. معمولاً از این حالت برای حالت‌های پیش‌نمایش یا ضبط ویدیو، یا ضبط پی‌درپی برای تصاویر ثابت استفاده می‌شود. در برخی‌از دستگاه‌ها، این ممکن است معادل حالت OFF باشد (بدون کاهش سرعت نرخ فریم، پردازش انجام نمی‌شود)، و در برخی‌از دستگاه‌ها، این ممکن است معادل حالت HIGH_QUALITY باشد (بهترین کیفیت همچنان باعث کاهش سرعت نرخ فریم نمی‌شود).
  • HIGH_QUALITY: در این حالت، بلوک پردازش باید بهترین نتیجه ممکن را ازنظر کیفیت تولید کند و درصورت نیاز، نرخ فریم خروجی را کاهش دهد. معمولاً از این برای ضبط تصویر ثابت با کیفیت بالا استفاده می‌شود. برخی‌از بلوک‌ها شامل کنترل دستی هستند که می‌توان به‌جای FAST یا HIGH_QUALITY به‌صورت اختیاری انتخاب کرد. برای مثال، بلوک تصحیح رنگ از ماتریس تبدیل رنگ پشتیبانی می‌کند، درحالی‌که تنظیم منحنی تن از منحنی نگاشت تن سراسری دلخواه پشتیبانی می‌کند.

حداکثر نرخ فریم که می‌تواند توسط یک زیرسیستم دوربین پشتیبانی شود تابعی از عوامل بسیاری است:

  • وضوح‌های درخواستی جاری‌سازی‌های تصویر برونداد
  • دردسترس بودن حالت‌های دسته‌بندی/پرش در تصویرساز
  • پهنای باند رابط تصویربردار
  • پهنای باند بلوک‌های پردازش ISP مختلف

این عوامل می‌توانند بین ارائه‌دهندگان خدمات اینترنتی و حسگرهای مختلف بسیار متفاوت باشند، بنابراین میانای HAL دوربین سعی می‌کند محدودیت‌های پهنای باند را به ساده‌ترین مدل ممکن انتزاع کند. مدل ارائه‌شده دارای ویژگی‌های زیر است:

  • حسگر تصویر همیشه به‌گونه‌ای پیکربندی می‌شود که کوچک‌ترین وضوح ممکن را با توجه به اندازه‌های جاری‌سازی خروجی درخواست‌شده توسط برنامه ارائه دهد. کوچک‌ترین وضوح به‌عنوان حداقل به بزرگی بزرگ‌ترین اندازه جاری‌سازی برونداد درخواستی تعریف می‌شود.
  • هر درخواستی می‌تواند از هریک یا همه جاری‌سازی‌های برونداد پیکربندی‌شده فعلی استفاده کند، بنابراین حسگر و ISP باید طوری پیکربندی شوند که از مقیاس‌بندی یک ضبط واحد برای همه جاری‌سازی‌ها به‌طور هم‌زمان پشتیبانی کنند.
  • جاری‌سازی‌های JPEG برای درخواست‌هایی که در آن‌ها گنجانده نشده‌اند، مانند جاری‌سازی‌های YUV پردازش‌شده عمل می‌کنند؛ در درخواست‌هایی که مستقیماً به آن‌ها ارجاع داده شده است، مانند جاری‌سازی‌های JPEG عمل می‌کنند.
  • پردازنده JPEG می‌تواند هم‌زمان با بقیه خط لوله دوربین اجرا شود اما نمی‌تواند بیش‌از یک عکس را در یک زمان پردازش کند.