لایه انتزاعی سختافزار دوربین اندروید (HAL) رابطهای برنامهنویسی سطح بالاتر چارچوب دوربین در android.hardware.camera2 را به درایور و سختافزار دوربین شما متصل میکند. با شروع از اندروید ۱۳، توسعه رابط HAL دوربین از AIDL استفاده میکند. اندروید ۸.۰ Treble را معرفی کرد و رابط برنامهنویسی دوربین HAL را به یک رابط پایدار تعریف شده توسط زبان توصیف رابط HAL (HIDL) تغییر داد. اگر قبلاً ماژول و درایور HAL دوربین را برای اندروید ۷.۰ و پایینتر توسعه دادهاید، از تغییرات قابل توجه در خط لوله دوربین آگاه باشید.
دوربین AIDL HAL
برای دستگاههایی که اندروید ۱۳ یا بالاتر را اجرا میکنند، چارچوب دوربین شامل پشتیبانی از HALهای دوربین AIDL است. چارچوب دوربین همچنین از HALهای دوربین HIDL پشتیبانی میکند، با این حال ویژگیهای دوربین اضافه شده در اندروید ۱۳ یا بالاتر فقط از طریق رابطهای HAL دوربین AIDL در دسترس هستند. برای پیادهسازی چنین ویژگیهایی در دستگاههایی که به اندروید ۱۳ یا بالاتر ارتقا مییابند، تولیدکنندگان دستگاه باید فرآیند HAL خود را از استفاده از رابطهای دوربین HIDL به رابطهای دوربین AIDL منتقل کنند.
برای آشنایی با مزایای AIDL، به بخش AIDL برای HALها مراجعه کنید.
پیادهسازی دوربین AIDL HAL
برای پیادهسازی مرجع یک دوربین AIDL HAL، به hardware/google/camera/common/hal/aidl_service/ مراجعه کنید.
مشخصات دوربین AIDL HAL در مکانهای زیر قرار دارد:
- ارائه دهنده دوربین:
hardware/interfaces/camera/provider/aidl/ - دستگاه دوربین:
hardware/interfaces/camera/device/aidl/ - فراداده دوربین:
hardware/interfaces/camera/metadata/aidl/ - انواع دادههای رایج:
hardware/interfaces/camera/common/aidl/
برای دستگاههایی که به AIDL مهاجرت میکنند، ممکن است تولیدکنندگان دستگاه بسته به ساختار کد، نیاز به تغییر سیاست SELinux اندروید (sepolicy) و فایلهای RC داشته باشند.
اعتبارسنجی دوربین AIDL HAL
برای آزمایش پیادهسازی HAL دوربین AIDL خود، مطمئن شوید که دستگاه تمام تستهای CTS و VTS را با موفقیت پشت سر میگذارد. اندروید ۱۳ تست AIDL VTS، VtsAidlHalCameraProvider_TargetTest.cpp را معرفی میکند.
ویژگیهای دوربین HAL3
هدف از طراحی مجدد API دوربین اندروید، افزایش قابل توجه توانایی برنامهها برای کنترل زیرسیستم دوربین در دستگاههای اندروید و در عین حال سازماندهی مجدد API برای افزایش کارایی و قابلیت نگهداری آن است. این کنترل اضافی، ساخت برنامههای دوربین با کیفیت بالا در دستگاههای اندروید را آسانتر میکند که میتوانند به طور قابل اعتمادی در چندین محصول کار کنند و در عین حال از الگوریتمهای خاص دستگاه برای به حداکثر رساندن کیفیت و عملکرد استفاده کنند.
نسخه ۳ زیرسیستم دوربین، حالتهای عملیاتی را در یک نمای واحد و یکپارچه ساختاربندی میکند که میتواند برای پیادهسازی هر یک از حالتهای قبلی و چندین حالت دیگر، مانند حالت عکاسی پیاپی، مورد استفاده قرار گیرد. این امر منجر به کنترل بهتر کاربر بر فوکوس و نوردهی و پردازشهای پس از عکاسی بیشتر، مانند کاهش نویز، کنتراست و افزایش وضوح تصویر، میشود. علاوه بر این، این نمای سادهشده، استفاده از عملکردهای مختلف دوربین را برای توسعهدهندگان برنامه آسانتر میکند.
این API، زیرسیستم دوربین را به عنوان یک خط لوله مدلسازی میکند که درخواستهای ورودی برای ضبط فریم را به فریمها، بر اساس نسبت ۱:۱ تبدیل میکند. این درخواستها تمام اطلاعات پیکربندی مربوط به ضبط و پردازش یک فریم را در خود جای میدهند. این شامل وضوح و فرمت پیکسل؛ کنترل دستی حسگر، لنز و فلاش؛ حالتهای عملیاتی ۳A؛ کنترل پردازش RAW->YUV؛ تولید آمار؛ و غیره میشود.
به عبارت ساده، چارچوب برنامه یک فریم را از زیرسیستم دوربین درخواست میکند و زیرسیستم دوربین نتایج را به یک جریان خروجی برمیگرداند. علاوه بر این، فرادادههایی که حاوی اطلاعاتی مانند فضاهای رنگی و سایه لنز هستند برای هر مجموعه از نتایج تولید میشوند. میتوانید دوربین نسخه ۳ را به عنوان یک خط لوله به جریان یک طرفه دوربین نسخه ۱ در نظر بگیرید. این خط لوله هر درخواست ضبط را به یک تصویر ضبط شده توسط سنسور تبدیل میکند که به صورت زیر پردازش میشود:
- یک شیء نتیجه با فرادادهای در مورد ضبط.
- یک تا N بافر از دادههای تصویر، هر کدام در سطح مقصد خود.
مجموعه سطوح خروجی ممکن از پیش پیکربندی شده است:
- هر سطح، مقصدی برای جریانی از بافرهای تصویر با وضوح ثابت است.
- فقط تعداد کمی از سطوح را میتوان به عنوان خروجی به طور همزمان پیکربندی کرد (~3).
یک درخواست شامل تمام تنظیمات ضبط مورد نظر و لیست سطوح خروجی برای ارسال بافرهای تصویر برای این درخواست (از کل مجموعه پیکربندی شده) است. یک درخواست میتواند یکباره (با capture() ) باشد، یا ممکن است به طور نامحدود تکرار شود (با setRepeatingRequest() ). ضبطها نسبت به درخواستهای تکراری اولویت دارند.

شکل ۱. مدل عملکرد هسته دوربین
نمای کلی دوربین HAL1
نسخه ۱ زیرسیستم دوربین به صورت یک جعبه سیاه با کنترلهای سطح بالا و سه حالت عملیاتی زیر طراحی شده است:
- پیشنمایش
- ضبط ویدئو
- هنوز هم ضبط کنید
هر حالت قابلیتهای کمی متفاوت و همپوشانی دارد. این امر پیادهسازی ویژگیهای جدید مانند حالت عکاسی پیاپی که بین دو حالت عملیاتی قرار میگیرد را دشوار میکرد.

شکل ۲. اجزای دوربین
اندروید ۷.۰ همچنان از دوربین HAL1 پشتیبانی میکند، زیرا بسیاری از دستگاهها هنوز به آن متکی هستند. علاوه بر این، سرویس دوربین اندروید از پیادهسازی هر دو HAL (1 و 3) پشتیبانی میکند، که زمانی مفید است که میخواهید از یک دوربین جلویی کمتوانتر با دوربین HAL1 و یک دوربین پشتی پیشرفتهتر با دوربین HAL3 پشتیبانی کنید.
یک ماژول HAL دوربین واحد (با شماره نسخه خاص خود) وجود دارد که چندین دستگاه دوربین مستقل را فهرست میکند که هر کدام شماره نسخه خاص خود را دارند. ماژول دوربین ۲ یا جدیدتر برای پشتیبانی از دستگاههای ۲ یا جدیدتر مورد نیاز است و چنین ماژولهای دوربینی میتوانند ترکیبی از نسخههای دستگاههای دوربین را داشته باشند (منظور ما از اینکه اندروید از پیادهسازی هر دو HAL پشتیبانی میکند، همین است).