پشتیبانی از چند دوربین

‫Android 9 پشتیبانی از «میانای برنامه‌سازی کاربردی» را برای دستگاه‌های چنددوربینی ازطریق دستگاه دوربین منطقی جدیدی که از دو یا چند دستگاه دوربین فیزیکی که در یک جهت قرار دارند تشکیل شده است معرفی کرد. دستگاه دوربین منطقی به‌عنوان یک CameraDevice/CaptureSession واحد دراختیار برنامه قرار می‌گیرد و امکان تعامل با ویژگی‌های چنددوربینی یکپارچه‌شده در HAL را فراهم می‌کند. برنامه‌ها می‌توانند به‌صورت اختیاری به جاری‌سازی‌های دوربین فیزیکی زیرین، فراداده، و کنترل‌ها دسترسی داشته باشند و آن‌ها را کنترل کنند.

پشتیبانی از چند دوربین

شکل ۱. پشتیبانی از چند دوربین

در این نمودار، شناسه‌های دوربین مختلف با رنگ کدگذاری شده‌اند. برنامه می‌تواند هم‌زمان از هر دوربین فیزیکی بافرهای خام جاری‌سازی کند. همچنین می‌توان کنترل‌های جداگانه‌ای تنظیم کرد و فراداده‌های جداگانه‌ای از دوربین‌های فیزیکی مختلف دریافت کرد.

مثال‌ها و منابع

دستگاه‌های چنددوربینه باید با قابلیت چنددوربینه منطقی تبلیغ شوند.

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

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

جاری‌سازی‌های دوربین فیزیکی فقط برای درخواست‌های غیربازپردازش و فقط برای حسگرهای تک‌رنگ و بایر پشتیبانی می‌شود.

پیاده‌سازی

بازبینه پشتیبانی

برای افزودن دستگاه‌های چنددوربینی منطقی در سمت HAL:

برای دستگاه‌های دارای Android 9، دستگاه‌های دوربین باید از جایگزینی یک جاری‌سازی منطقی YUV یا RAW با جاری‌سازی‌های فیزیکی با اندازه یکسان (برای جاری‌سازی‌های RAW اعمال نمی‌شود) و قالب یکسان از دو دوربین فیزیکی پشتیبانی کنند. این مورد برای دستگاه‌های دارای Android 10 اعمال نمی‌شود.

برای دستگاه‌های دارای Android 10 که نسخه دستگاه HAL دوربین در آن‌ها ۳.۵ یا بالاتر است، دستگاه دوربین باید از isStreamCombinationSupported پشتیبانی کند تا برنامه‌ها بتوانند درباره پشتیبانی از ترکیب جاری‌سازی خاصی که حاوی جاری‌سازی‌های فیزیکی است پرس‌وجو کنند.

نقشه پیکربندی جاری‌سازی

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

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

برای بهره‌گیری از زوم اپتیکال پیاده‌سازی‌شده با HAL ازطریق جابه‌جایی بین دوربین‌های فرعی فیزیکی درطول ضبط RAW، برنامه‌ها باید جاری‌سازی‌های دوربین فرعی فیزیکی را به‌جای جاری‌سازی منطقی RAW پیکربندی کنند.

ترکیب جاری‌سازی تضمینی

هم دوربین منطقی و هم دوربین‌های فیزیکی زیربنایی آن باید ترکیب‌های جاری‌سازی اجباری موردنیاز برای سطوح دستگاهشان را تضمین کنند.

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

در دستگاه‌های دارای Android 9، برای هر ترکیب جاری‌سازی تضمین‌شده، دوربین منطقی باید از موارد زیر پشتیبانی کند:

  • جایگزین کردن یک جاری‌سازی منطقی YUV_420_888 یا خام با دو جاری‌سازی فیزیکی با اندازه و قالب یکسان، که هرکدام از یک دوربین فیزیکی جداگانه می‌آیند، به شرطی که اندازه و قالب توسط دوربین‌های فیزیکی پشتیبانی شود.

  • افزودن دو جاری‌سازی RAW، یکی از هر دوربین فیزیکی، اگر دوربین منطقی قابلیت RAW را تبلیغ نکند، اما دوربین‌های فیزیکی زیرین این قابلیت را داشته باشند. این معمولاً زمانی اتفاق می‌افتد که دوربین‌های فیزیکی اندازه‌های حسگر متفاوتی داشته باشند.

  • استفاده از جاری‌سازی‌های فیزیکی به‌جای جاری‌سازی منطقی با همان اندازه و قالب. وقتی حداقل مدت فریم جاری‌سازی‌های فیزیکی و منطقی یکسان است، این کار نباید نرخ فریم ضبط را کاهش دهد.

ملاحظات عملکرد و توان

  • عملکرد:

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

    • بهینه‌سازی توان HAL در حالت پیش‌فرض همچنان کار می‌کند.
    • پیکربندی یا درخواست جاری‌سازی فیزیکی ممکن است بهینه‌سازی داخلی توان HAL را ملغی کند و باعث مصرف بیشتر توان شود.

سفارشی‌سازی

می‌توانید پیاده‌سازی دستگاهتان را به روش‌های زیر سفارشی‌سازی کنید.

  • برونداد ترکیب‌شده دستگاه دوربین منطقی کاملاً به پیاده‌سازی HAL بستگی دارد. تصمیم‌گیری درباره نحوه استخراج جاری‌سازی‌های منطقی ترکیب‌شده از دوربین‌های فیزیکی برای برنامه و چارچوب دوربین Android شفاف است.
  • درخواست‌ها و نتایج فیزیکی فردی را می‌توان به‌صورت اختیاری پشتیبانی کرد. مجموعه پارامترهای دردسترس در چنین درخواست‌هایی نیز کاملاً به پیاده‌سازی HAL خاص بستگی دارد.
  • از Android 10، «لایه انتزاعی سخت‌افزار» می‌تواند با انتخاب عدم تبلیغ برخی یا همه PHYSICAL_IDها در getCameraIdList، تعداد دوربین‌هایی را که برنامه می‌تواند مستقیماً باز کند کاهش دهد. سپس تماس با getPhysicalCameraCharacteristics باید ویژگی‌های دوربین فیزیکی را برگرداند.

اعتبارسنجی

دستگاه‌های چنددوربینه منطقی باید مانند هر دوربین معمولی دیگری CTS دوربین را بگذرانند. موارد آزمایشی که این نوع دستگاه را هدف‌یابی می‌کنند را می‌توانید در LogicalCameraDeviceTest پیمانه پیدا کنید.

این سه آزمایش ITS سیستم‌های چنددوربینی را هدف قرار می‌دهد تا ترکیب مناسب تصاویر را تسهیل کند:

آزمایش‌های صحنه ۱ و صحنه ۴ با دستگاه آزمایش ITS-in-a-box اجرا می‌شوند. آزمایش test_multi_camera_match تأیید می‌کند که وقتی هر دو دوربین فعال باشند، روشنایی مرکز تصاویر یکسان است. آزمایش test_multi_camera_alignment تأیید می‌کند که فاصله‌های دوربین، جهت‌گیری‌ها، و پارامترهای اعوجاج به‌درستی بارگیری شده‌اند. اگر سیستم چنددوربینی شامل دوربین «میدان دید عریض» (>۹۰ درجه) باشد، نسخه ۲ جعبه ITS لازم است.

Sensor_fusion یک دستگاه آزمایش دوم است که امکان حرکت‌های مکرر و ازپیش‌تعیین‌شده تلفن را فراهم می‌کند و تأیید می‌کند که مُهر زمان ژیروسکوپ و حسگر تصویر مطابقت دارند و قاب‌های چنددوربینی همگام‌سازی شده‌اند.

همه جعبه‌ها ازطریق AcuSpec, Inc.‎ (www.acuspecinc.com، fred@acuspecinc.com) و MYWAY Manufacturing (www.myway.tw، sales@myway.tw) دردسترس است. علاوه‌براین، جعبه rev1 ITS را می‌توانید ازطریق West-Mark (www.west-mark.com, dgoodman@west-mark.com) خریداری کنید.

روال‌های مطلوب

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

  • (Android 10 یا بالاتر) دوربین‌های فرعی فیزیکی را از getCameraIdList پنهان کنید. این کار تعداد دوربین‌هایی را که برنامه‌ها می‌توانند مستقیماً باز کنند کاهش می‌دهد و نیاز برنامه‌ها به داشتن منطق پیچیده انتخاب دوربین را ازبین می‌برد.
  • (Android 11 یا بالاتر) برای دستگاه چنددوربینی منطقی که از زوم نوری پشتیبانی می‌کند، میانای برنامه‌سازی کاربردی ANDROID_CONTROL_ZOOM_RATIO را پیاده‌سازی کنید و فقط برای برش نسبت ابعادی از ANDROID_SCALER_CROP_REGION استفاده کنید. ANDROID_CONTROL_ZOOM_RATIO به دستگاه امکان می‌دهد زوم‌پس کند و دقت بهتری را حفظ کند. در این مورد، «لایه انتزاع سخت‌افزار» باید سیستم مختصات ANDROID_SCALER_CROP_REGION، ANDROID_CONTROL_AE_REGIONS، ANDROID_CONTROL_AWB_REGIONS، ANDROID_CONTROL_AF_REGIONS، ANDROID_STATISTICS_FACE_RECTANGLES، و ANDROID_STATISTICS_FACE_LANDMARKS را تنظیم کند تا میدان دید پس‌از بزرگ‌نمایی را به‌عنوان آرایه فعال حسگر درنظر بگیرد. برای اطلاعات بیشتر درباره نحوه عملکرد ANDROID_SCALER_CROP_REGION با ANDROID_CONTROL_ZOOM_RATIO، camera3_crop_reprocess#cropping را ببینید.
  • برای دستگاه‌های چنددوربینی با دوربین‌های فیزیکی که قابلیت‌های متفاوتی دارند، مطمئن شوید که دستگاه فقط درصورتی از مقدار یا محدوده خاصی برای کنترل پشتیبانی می‌کند که کل محدوده بزرگ‌نمایی از آن مقدار یا محدوده پشتیبانی کند. برای مثال، اگر دوربین منطقی از یک دوربین زاویه فوق‌باز، یک دوربین زاویه باز، و یک دوربین تله‌فوتو تشکیل شده است، کارهای زیر را انجام دهید:
    • اگر اندازه آرایه فعال دوربین‌های فیزیکی متفاوت باشد، HAL دوربین باید نگاشت را از آرایه‌های فعال دوربین‌های فیزیکی به آرایه فعال دوربین منطقی برای ANDROID_SCALER_CROP_REGION، ANDROID_CONTROL_AE_REGIONS، ANDROID_CONTROL_AWB_REGIONS، ANDROID_CONTROL_AF_REGIONS، ANDROID_STATISTICS_FACE_RECTANGLES، و ANDROID_STATISTICS_FACE_LANDMARKS انجام دهد تا از دیدگاه برنامه، سیستم مختصات اندازه آرایه فعال دوربین منطقی باشد.
    • اگر دوربین‌های زاویه باز و تله‌فوتو از فوکوس خودکار پشتیبانی می‌کنند، اما دوربین زاویه بسیار باز فوکوس ثابت دارد، مطمئن شوید دوربین منطقی پشتیبانی از فوکوس خودکار را تبلیغ می‌کند. «لایه انتزاعی سخت‌افزار» باید ماشین حالت فوکوس خودکار را برای دوربین زاویه بسیار باز شبیه‌سازی کند تا وقتی برنامه روی لنز زاویه بسیار باز زوم‌پای می‌کند، این واقعیت که دوربین فیزیکی زیرین دارای فوکوس ثابت است برای برنامه شفاف باشد و ماشین‌های حالت فوکوس خودکار برای حالت‌های فوکوس خودکار پشتیبانی‌شده طبق انتظار کار کنند.
    • اگر دوربین‌های عریض و تله‌فوتو از 4K با سرعت ۶۰ فریم در ثانیه پشتیبانی می‌کنند، و دوربین فوق‌عریض فقط از 4K با سرعت ۳۰ فریم در ثانیه یا 1080p با سرعت ۶۰ فریم در ثانیه پشتیبانی می‌کند، اما از 4K با سرعت ۶۰ فریم در ثانیه پشتیبانی نمی‌کند، مطمئن شوید که دوربین منطقی 4K با سرعت ۶۰ فریم در ثانیه را در پیکربندی‌های جاری‌سازی پشتیبانی‌شده خود تبلیغ نمی‌کند. این کار یکپارچگی قابلیت‌های دوربین منطقی را تضمین می‌کند و مطمئن می‌شود که برنامه با مشکل عدم دستیابی به 4k @ 60 fps در مقدار کمتر از ۱ANDROID_CONTROL_ZOOM_RATIO مواجه نخواهد شد.
  • در Android 10 و بالاتر، چنددوربین منطقی برای پشتیبانی از ترکیب‌های جاری‌سازی که شامل جاری‌سازی‌های فیزیکی است لازم نیست. اگر HAL از ترکیبی با جریان‌های فیزیکی پشتیبانی کند:
    • (Android 11 یا بالاتر) برای مدیریت بهتر موارد استفاده مانند عمق از استریو و ردیابی حرکت، میدان دید بروندادهای جاری‌سازی فیزیکی را تا حد امکان بزرگ کنید. بااین‌حال، اگر یک جاری‌سازی فیزیکی و یک جاری‌سازی منطقی از یک دوربین فیزیکی منشأ بگیرند، محدودیت‌های سخت‌افزاری ممکن است باعث شود میدان دید جاری‌سازی فیزیکی با جاری‌سازی منطقی یکسان باشد.
    • برای رفع فشار حافظه ناشی از چند جاری‌سازی فیزیکی، مطمئن شوید برنامه‌ها از discardFreeBuffers برای تخصیص‌زدایی بافرهای آزاد (بافرهایی که توسط مصرف‌کننده آزاد شده‌اند، اما هنوز توسط تولیدکننده از صف خارج نشده‌اند) استفاده کنند، اگر انتظار می‌رود جاری‌سازی فیزیکی برای مدتی غیرفعال باشد.
    • اگر جاری‌سازی‌های فیزیکی از دوربین‌های فیزیکی مختلف معمولاً به درخواست یکسانی پیوست نمی‌شوند، مطمئن شوید برنامه‌ها از surface group استفاده کنند تا از یک صف میان‌گیر برای پشتیبانی از دو سطح رو به برنامه استفاده شود و مصرف حافظه کاهش یابد.