جاری‌سازی هم‌زمان دوربین

Android به دستگاه‌ها اجازه می‌دهد از جاری‌سازی هم‌زمان دستگاه‌های دوربین پشتیبانی کنند. برای مثال، این ویژگی به دستگاه اجازه می‌دهد هم‌زمان از دوربین جلو و دوربین پشت استفاده کند. از Android 11،‏ Camera2 API شامل روش‌های زیر است که برنامه‌ها می‌توانند برای تعیین اینکه آیا دوربین‌ها از جاری‌سازی هم‌زمان پشتیبانی می‌کنند یا نه و پیکربندی‌های جاری‌سازی پشتیبانی‌شده را فراخوانی کنند.

  • getConcurrentCameraIds: مجموعه ترکیب‌های شناسه‌های دستگاه دوربین متصل‌شده فعلی را که از پیکربندی هم‌زمان جلسه‌های دستگاه دوربین پشتیبانی می‌کنند دریافت می‌کند.
  • isConcurrentSessionConfigurationSupported: بررسی می‌کند که آیا مجموعه ارائه‌شده از دستگاه‌های دوربین و پیکربندی‌های جلسه مربوط به آن‌ها می‌توانند به‌طور هم‌زمان پیکربندی شوند یا نه.

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

هر دستگاه دوربین تبلیغ‌شده ازطریق getConcurrentStreamingCameraIds() باید از پیکربندی‌های تضمین‌شده زیر برای جاری‌سازی‌های هم‌زمان پشتیبانی کند.

هدف ۱ هدف ۲
نوع حداکثر اندازه نوع حداکثر اندازه موارد استفاده نمونه
YUV s1440p پردازش ویدیو یا تصویر درون‌برنامه‌ای
PRIV s1440p تجزیه‌وتحلیل نمایاب درون‌برنامه‌ای
JPEG s1440p بدون ضبط تصویر ثابت نمایاب
YUV / PRIV s720p JPEG s1440p تصویربرداری ثابت استاندارد
YUV / PRIV s720p YUV / PRIV s1440p ویدیو درون‌برنامه‌ای یا پردازش با پیش‌نمایش

دستگاه‌های دارای قابلیت MONOCHROME (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES شامل CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) که از Y8 پشتیبانی می‌کنند باید از جایگزینی جاری‌سازی‌های YUV با Y8 در همه ترکیب‌های جاری‌سازی تضمین‌شده پشتیبانی کنند.

s720p به ۷۲۰ پیکسل (۱۲۸۰ × ۷۲۰) یا حداکثر وضوح پشتیبانی‌شده برای قالب خاصی که توسط StreamConfigurationMap.getOutputSizes() برگردانده می‌شود اشاره دارد. s1440p به ۱۴۴۰ پیکسل (۱۹۲۰ × ۱۴۴۰) یا حداکثر وضوح پشتیبانی‌شده برای قالب خاصی که توسط StreamConfigurationMap.getOutputSizes() برگردانده می‌شود اشاره دارد. دستگاه‌هایی که قابلیت‌هایشان شامل ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE نمی‌شود باید حداقل از یک جاری‌سازی Y16، Dataspace::DEPTH با وضوح sVGA درطول عملکرد هم‌زمان پشتیبانی کنند، جایی که sVGA کوچک‌ترین دو وضوح زیر است:

  • حداکثر وضوح برونداد برای قالب داده‌شده
  • ۴۸۰ × ۶۴۰

پیاده‌سازی

برای اینکه به برنامه‌ها اجازه دهید دستگاه را پُرسمان کنند تا مشخص شود دوربین‌های آن از جاری‌سازی هم‌زمان پشتیبانی می‌کنند یا نه، ICameraProvider@2.6 میانای HAL را پیاده‌سازی کنید که شامل روش‌های زیر است:

برای پیاده‌سازی مرجع از رابط ICameraProvider@2.6HAL، به کتابخانه HAL دوربین شبیه‌سازی‌شده در EmulatedCameraProviderHWLImpl.cpp مراجعه کنید.

اعتبارسنجی

برای آزمایش اینکه پیاده‌سازی این ویژگی طبق انتظار کار می‌کند، از ConcurrentCameraTest.java آزمایش CTS استفاده کنید. همچنین، بااستفاده از برنامه‌ای که چندین دوربین را باز می‌کند و به‌طور هم‌زمان از آن‌ها استفاده می‌کند، آزمایش کنید.

مشکلات تخصیص منابع

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

سناریوی نمونه

سناریو زیر این مشکل را نشان می‌دهد.

مشکل

دستگاه پیکربندی زیر را دارد:

  • شناسه دوربین 0 یک دوربین منطقی است که توسط یک دوربین زاویه باز و یک دوربین زاویه فوق‌باز پشتیبانی می‌شود، که هرکدام یک منبع ISP را اشغال می‌کنند.
  • شناسه دوربین 1 دوربینی است که از یک منبع ISP استفاده می‌کند.

دستگاه (تلفن) دو ISP دارد. اگر شناسه دوربین 0 باز باشد و جلسه‌ای پیکربندی شده باشد، ممکن است «لایه انتزاع سخت‌افزار» دوربین دو «پردازنده سیگنال تصویر» را برای پیش‌بینی استفاده از دوربین فوق‌عریض و عریض رزرو کند.

اگر این‌طور باشد، دوربین جلو (شناسه 1) نمی‌تواند هیچ جریانی را پیکربندی کند زیرا هر دو ارائه‌دهنده خدمات اینترنتی درحال استفاده هستند.

راه‌حل

برای رفع این مشکل، چارچوب می‌تواند هر دو شناسه دوربین 0 و 1 را قبل‌از پیکربندی جلسه‌ها باز کند تا راهنمایی درباره نحوه تخصیص منابع به HAL دوربین ارائه دهد (زیرا اکنون انتظار دارد دوربین‌ها به‌طور هم‌زمان کار کنند). بااین‌حال، این کار می‌تواند منجر به قابلیت‌های محدود شود، برای مثال، ممکن است بزرگ‌نمایی نتواند نسبت محدوده بزرگ‌نمایی کامل را مدیریت کند (زیرا ممکن است تعویض شناسه‌های دوربین فیزیکی مشکل‌ساز باشد).

برای پیاده‌سازی این راهکار، به‌روزرسانی‌های زیر را در provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds انجام دهید.

  • الزامی کنید که برای عملکرد هم‌زمان دوربین‌ها، چارچوب دوربین باید دستگاه‌های دوربین (@3.2::ICameraDevice::open) را قبل‌از پیکربندی هرگونه جلسه در دستگاه‌های دوربین باز کند. این کار به ارائه‌دهندگان دوربین امکان می‌دهد منابع را به‌طور مناسب اختصاص دهند.

  • برای رفع مشکل عدم توانایی در مدیریت نسبت محدوده کامل بزرگ‌نمایی، مطمئن شوید که برنامه‌های دوربین هنگام استفاده هم‌زمان از دوربین‌ها، از تنظیم کنترل ZOOM_RATIO فقط بین ۱ برابر و MAX_DIGITAL_ZOOM به‌جای ZOOM_RATIO_RANGE کامل استفاده می‌کنند (این کار از جابه‌جایی دوربین‌های فیزیکی در داخل جلوگیری می‌کند، که احتمالاً به ISP بیشتری نیاز دارد).

مشکل در testDualCameraPreview

وقتی به‌روزرسانی‌های بالا را انجام می‌دهید، ممکن است مشکلی در عملکرد مجاز توسط آزمون MultiViewTest.java#testDualCameraPreview ایجاد شود.

آزمایش testDualCameraPreview جلسه‌ها را فقط پس‌از باز کردن همه دوربین‌ها پیکربندی نمی‌کند. این ترتیب را دنبال می‌کند:

for each camera  in cameraDevices :
  device = openCamera(camera)
     createCaptureSession(device);

بااین‌حال، این برنامه خطاهای باز شدن دوربین را با ERROR_MAX_CAMERAS_IN_USE [1] تحمل می‌کند. برنامه‌های طرف سوم ممکن است به این رفتار وابسته باشند.

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

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