زیر سیستم HAL

درخواست ها

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

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

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

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

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

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

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

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

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

  • خروجی RAW Bayer در داخل ISP تحت هیچ پردازشی قرار نمی گیرد.
  • آمار بر اساس داده های حسگر خام تولید می شود.
  • بلوک‌های پردازشی مختلفی که داده‌های حسگر خام را به YUV تبدیل می‌کنند، به ترتیب دلخواه هستند.
  • در حالی که چندین واحد مقیاس و برش نشان داده می‌شوند، همه واحدهای مقیاس‌کننده کنترل‌های ناحیه خروجی (زوم دیجیتال) را به اشتراک می‌گذارند. با این حال، هر واحد ممکن است وضوح خروجی و فرمت پیکسل متفاوتی داشته باشد.

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

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

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

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

شکل 3. نمای کلی دوربین HAL

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

این بخش شامل توضیح مفصلی از مراحل مورد انتظار هنگام استفاده از دوربین API است. لطفاً برای تعاریف رابط HIDL به پلتفرم/سخت افزار/اینترفیس/دوربین/ مراجعه کنید.

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

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

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

  1. چارچوب ICameraDeviceSession::configureStreams() با لیستی از جریان های ورودی/خروجی به دستگاه HAL فراخوانی می کند.
  2. فریم ورک تنظیمات پیش‌فرض را برای برخی موارد استفاده با فراخوانی به ICameraDeviceSession::constructDefaultRequestSettings() درخواست می‌کند. این ممکن است در هر زمانی پس از ایجاد ICameraDeviceSession توسط ICameraDevice::open رخ دهد.
  3. فریم ورک اولین درخواست ضبط را با تنظیماتی بر اساس یکی از مجموعه تنظیمات پیش‌فرض و با حداقل یک جریان خروجی که قبلاً توسط چارچوب ثبت شده است، ساخته و به HAL ارسال می‌کند. این با ICameraDeviceSession::processCaptureRequest() به HAL ارسال می شود. HAL باید بازگشت این تماس را تا زمانی که برای درخواست بعدی آماده شود مسدود کند.
  4. چارچوب به ارسال درخواست‌ها و فراخوانی ICameraDeviceSession::constructDefaultRequestSettings() ادامه می‌دهد تا در صورت لزوم، بافرهای تنظیمات پیش‌فرض را برای سایر موارد استفاده دریافت کند.
  5. هنگامی که ضبط یک درخواست شروع می شود (سنسور برای گرفتن عکس شروع به نمایش می کند)، HAL ICameraDeviceCallback::notify() با پیام SHUTTER، شامل شماره فریم و مهر زمانی برای شروع نوردهی، فراخوانی می کند. این پاسخ تماس اعلان لازم نیست قبل از اولین فراخوانی 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() باید پس از بازگشت متد notify() از یک پیام خطای کشنده، -ENODEV یا NULL را برگردانند.
جریان عملیات دوربین

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

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

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

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

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

پارامتر ایالت خواص کنترل شده
android.control.aeMode خاموش هیچ کدام
روشن android.sensor.exposureTime android.sensor.frameDuration android.sensor.sensitivity android.lens.aperture (در صورت پشتیبانی) android.lens.filterDensity (در صورت پشتیبانی)
ON_AUTO_FLASH همه چیز روشن است، به علاوه 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 خاموش هیچ کدام
WHITE_BALANCE_* android.colorCorrection.transform. اگر android.colorCorrection.mode FAST یا HIGH_QUALITY باشد، تنظیمات مخصوص پلتفرم.
android.control.afMode خاموش هیچ کدام
FOCUS_MODE_* android.lens.focusDistance
android.control.videoStabilization خاموش هیچ کدام
روشن می تواند android.scaler.cropRegion را برای اجرای تثبیت کننده ویدیو تنظیم کند
android.control.mode خاموش AE، AWB و AF غیرفعال هستند
AUTO تنظیمات فردی AE، AWB و AF استفاده می شود
SCENE_MODE_* می تواند تمام پارامترهای ذکر شده در بالا را لغو کند. کنترل‌های فردی 3A غیرفعال هستند.

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

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

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

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

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

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