پشتیبانی از نسخه دوربین

این صفحه جزئیات تفاوت‌های نسخه‌ها در HALهای دوربین، APIها و تست‌های مربوط به مجموعه تست سازگاری (CTS) را شرح می‌دهد. همچنین چندین تغییر معماری ایجاد شده برای مقاوم‌سازی و ایمن‌سازی چارچوب دوربین در اندروید ۷.۰، تغییر به Treble در اندروید ۸.۰ و به‌روزرسانی‌هایی که فروشندگان باید برای پشتیبانی از این تغییرات در پیاده‌سازی دوربین خود انجام دهند را پوشش می‌دهد.

اصطلاحات

در این صفحه از اصطلاحات زیر استفاده شده است:

دوربین API1
چارچوب دوربین در سطح برنامه در دستگاه‌های اندروید ۴.۴ و پایین‌تر، که از طریق کلاس android.hardware.Camera در دسترس قرار می‌گیرد.
دوربین API2
چارچوب دوربین در سطح برنامه در دستگاه‌های اندروید ۵.۰ و بالاتر، که از طریق بسته android.hardware.camera2 در دسترس قرار می‌گیرد.
دوربین هال
لایه ماژول دوربین که توسط فروشندگان SoC پیاده‌سازی شده است. چارچوب‌های عمومی سطح برنامه بر روی HAL دوربین ساخته شده‌اند.
دوربین HAL3.1
نسخه‌ای از دستگاه دوربین HAL با اندروید ۴.۴ منتشر شد.
دوربین HAL3.2
نسخه‌ای از دستگاه دوربین HAL با اندروید ۵.۰ منتشر شد.
دوربین API1 CTS
مجموعه‌ای از تست‌های CTS دوربین که بر روی API1 دوربین اجرا می‌شوند.
دوربین API2 CTS
مجموعه‌ی اضافی از تست‌های CTS دوربین که بر روی API2 دوربین اجرا می‌شوند.
تریبل
پیاده‌سازی فروشنده (نرم‌افزار سطح پایین و مختص دستگاه که توسط تولیدکنندگان سیلیکون نوشته شده است) را از طریق یک رابط فروشنده جدید، از چارچوب سیستم عامل اندروید جدا می‌کند.
هایدل
زبان تعریف رابط HAL که با Treble معرفی شد و برای مشخص کردن رابط بین HAL و کاربران آن استفاده می‌شود.
وی تی اس
مجموعه تست فروشنده در کنار Treble معرفی شد.

API های دوربین

اندروید شامل API های دوربین زیر است.

دوربین API1

اندروید ۵.۰ رابط برنامه‌نویسی کاربردی دوربین ۱ (Camera API1) را منسوخ کرد، که همچنان در حال حذف شدن است زیرا توسعه پلتفرم جدید بر روی رابط برنامه‌نویسی کاربردی دوربین ۲ (Camera API2) تمرکز دارد. با این حال، دوره حذف طولانی خواهد بود و نسخه‌های اندروید برای مدتی به پشتیبانی از برنامه‌های رابط برنامه‌نویسی کاربردی دوربین ۱ ادامه خواهند داد. به طور خاص، پشتیبانی برای موارد زیر ادامه دارد:

  • رابط‌های API1 دوربین برای برنامه‌ها. برنامه‌های دوربین ساخته شده بر اساس API1 دوربین باید همانطور که در دستگاه‌هایی با نسخه‌های پایین‌تر اندروید کار می‌کنند، کار کنند.
  • نسخه‌های دوربین HAL. شامل پشتیبانی از دوربین HAL1.0.

دوربین API2

چارچوب API2 دوربین، کنترل سطح پایین‌تر دوربین را در اختیار برنامه قرار می‌دهد، از جمله جریان‌های کارآمد zero-copy burst/streaming و کنترل‌های هر فریم از نوردهی، gain، white balance gain، تبدیل رنگ، حذف نویز، sharpening و موارد دیگر. برای جزئیات بیشتر، ویدیوی مروری Google I/O را تماشا کنید.

اندروید ۵.۰ و بالاتر شامل Camera API2 می‌شود؛ با این حال، دستگاه‌هایی که اندروید ۵.۰ و بالاتر را اجرا می‌کنند ممکن است از تمام ویژگی‌های Camera API2 پشتیبانی نکنند. ویژگی android.info.supportedHardwareLevel که برنامه‌ها می‌توانند از طریق رابط‌های Camera API2 از آن پرس‌وجو کنند، یکی از سطوح پشتیبانی زیر را گزارش می‌دهد:

  • LEGACY : این دستگاه‌ها از طریق رابط‌های Camera API2 قابلیت‌هایی را در اختیار برنامه‌ها قرار می‌دهند که تقریباً همان قابلیت‌هایی هستند که از طریق رابط‌های Camera API1 در اختیار برنامه‌ها قرار می‌گیرند. کد چارچوب‌های قدیمی، فراخوانی‌های Camera API2 را به فراخوانی‌های Camera API1 تبدیل می‌کند؛ دستگاه‌های قدیمی از ویژگی‌های Camera API2 مانند کنترل‌های هر فریم پشتیبانی نمی‌کنند.
  • LIMITED : این دستگاه‌ها از برخی قابلیت‌های Camera API2 (اما نه همه آنها) پشتیبانی می‌کنند و باید از Camera HAL 3.2 یا بالاتر استفاده کنند.
  • FULL : این دستگاه‌ها از تمام قابلیت‌های اصلی Camera API2 پشتیبانی می‌کنند و باید از Camera HAL 3.2 یا بالاتر و اندروید 5.0 یا بالاتر استفاده کنند.
  • LEVEL_3 : این دستگاه‌ها از پردازش مجدد YUV و ضبط تصویر RAW، همراه با تنظیمات جریان خروجی اضافی، پشتیبانی می‌کنند.
  • EXTERNAL ): این دستگاه‌ها مشابه دستگاه‌های LIMITED هستند، با برخی استثنائات؛ برای مثال، ممکن است برخی از اطلاعات حسگر یا لنز گزارش نشوند یا نرخ فریم پایدارتری داشته باشند. این سطح برای دوربین‌های خارجی مانند وب‌کم‌های USB استفاده می‌شود.

قابلیت‌های منحصر به فرد از طریق ویژگی android.request.availableCapabilities در رابط‌های Camera API2 در معرض نمایش قرار می‌گیرند. دستگاه‌های FULL به قابلیت‌های MANUAL_SENSOR و MANUAL_POST_PROCESSING و موارد دیگر نیاز دارند. قابلیت RAW حتی برای دستگاه‌های FULL اختیاری است. دستگاه‌های LIMITED می‌توانند هر زیرمجموعه‌ای از این قابلیت‌ها، از جمله هیچ یک از آنها را، تبلیغ کنند. با این حال، قابلیت BACKWARD_COMPATIBLE همیشه باید تعریف شود.

سطح سخت‌افزار پشتیبانی‌شده توسط دستگاه، و همچنین قابلیت‌های خاص Camera API2 که از آن‌ها پشتیبانی می‌کند، به صورت feature flag های زیر در دسترس هستند تا امکان فیلتر کردن برنامه‌های دوربین Camera API2 در گوگل پلی فراهم شود.

  • android.hardware.camera.hardware_level.full
  • android.hardware.camera.capability.raw
  • android.hardware.camera.capability.manual_sensor
  • android.hardware.camera.capability.manual_post_processing

الزامات CTS

دستگاه‌هایی که از اندروید ۵.۰ و بالاتر استفاده می‌کنند باید تست‌های Camera API1 CTS، Camera API2 CTS و CTS Verifier را با موفقیت پشت سر بگذارند.

دستگاه‌هایی که فاقد پیاده‌سازی Camera HAL3.2 هستند و قادر به پشتیبانی کامل از رابط‌های Camera API2 نیستند، همچنان باید تست‌های Camera API2 CTS را با موفقیت پشت سر بگذارند. با این حال، دستگاه در حالت Camera API2 LEGACY اجرا می‌شود (که در آن فراخوانی‌های Camera API2 به صورت مفهومی به فراخوانی‌های Camera API1 نگاشت می‌شوند) بنابراین هرگونه تست Camera API2 CTS مربوط به ویژگی‌ها یا قابلیت‌هایی فراتر از Camera API1 به طور خودکار رد می‌شود.

در دستگاه‌های قدیمی، تست‌های Camera API2 CTS که اجرا می‌شوند، از رابط‌ها و قابلیت‌های عمومی Camera API1 موجود بدون هیچ الزام جدیدی استفاده می‌کنند. باگ‌هایی که آشکار می‌شوند (و باعث خرابی Camera API2 CTS می‌شوند) باگ‌هایی هستند که از قبل در Camera HAL موجود دستگاه وجود دارند و بنابراین توسط برنامه‌های Camera API1 موجود پیدا می‌شوند. ما انتظار نداریم که باگ‌های زیادی از این نوع وجود داشته باشند (با این حال، هرگونه باگی باید برای قبولی در تست‌های Camera API2 CTS برطرف شود).

الزامات VTS

دستگاه‌هایی که اندروید ۸.۰ و بالاتر را اجرا می‌کنند و پیاده‌سازی‌های HAL بایندری دارند، باید آزمون‌های Camera VTS را با موفقیت پشت سر بگذارند.

مقاوم‌سازی چارچوب دوربین

برای افزایش امنیت چارچوب رسانه و دوربین، اندروید ۷.۰ سرویس دوربین را از مدیاسرور خارج می‌کند. با شروع از اندروید ۸.۰، هر HAL دوربینِ متصل‌شده در فرآیندی جدا از سرویس دوربین اجرا می‌شود. فروشندگان ممکن است بسته به نسخه‌های API و HAL مورد استفاده، نیاز به ایجاد تغییراتی در HAL دوربین داشته باشند. بخش‌های زیر جزئیات تغییرات معماری در AP1 و AP2 برای HAL1 و HAL3 و همچنین الزامات عمومی را شرح می‌دهند.

تغییرات معماری برای API1

ضبط ویدیوی API1 ممکن است فرض کند که دوربین و انکودر ویدیو به صورت زنده در یک فرآیند قرار دارند. هنگام استفاده از API1 در:

  • HAL3، که در آن سرویس دوربین از BufferQueue برای انتقال بافرها بین فرآیندها استفاده می‌کند، هیچ به‌روزرسانی فروشنده‌ای لازم نیست.

    دوربین و پشته رسانه اندروید ۷.۰ در API1 روی HAL3

    شکل 1. دوربین و پشته رسانه اندروید 7.0 در API1 روی HAL3

  • HAL1 که از انتقال فراداده در بافرهای ویدیویی پشتیبانی می‌کند، فروشندگان باید HAL را برای استفاده از kMetadataBufferTypeNativeHandleSource به‌روزرسانی کنند. ( kMetadataBufferTypeCameraSource دیگر در اندروید ۷.۰ پشتیبانی نمی‌شود.)

    دوربین و پشته رسانه اندروید ۷.۰ در API1 روی HAL1

    شکل 2. دوربین و پشته رسانه اندروید 7.0 در API1 روی HAL1

تغییرات معماری برای API2

برای API2 روی HAL1 یا HAL3، BufferQueue بافرها را ارسال می‌کند تا آن مسیرها به کار خود ادامه دهند. معماری اندروید ۷.۰ برای API2 روی:

  • HAL1 تحت تأثیر تغییر سرویس دوربین قرار نگرفته است و نیازی به به‌روزرسانی فروشنده ندارد .
  • HAL3 تحت تأثیر قرار گرفته است ، اما هیچ به‌روزرسانی فروشنده‌ای لازم نیست:

    دوربین و پشته رسانه اندروید ۷.۰ در API2 روی HAL3

    شکل 3. دوربین و پشته رسانه اندروید 7.0 در API2 روی HAL3

الزامات اضافی

تغییرات معماری ایجاد شده برای تقویت امنیت چارچوب رسانه و دوربین شامل الزامات اضافی دستگاه زیر است.

  • عمومی. دستگاه‌ها به دلیل IPC به پهنای باند اضافی نیاز دارند که ممکن است بر موارد استفاده از دوربین که به زمان حساس هستند مانند ضبط ویدیوی پرسرعت تأثیر بگذارد. فروشندگان می‌توانند با اجرای android.hardware.camera2.cts.PerformanceTest و برنامه Google Camera برای ضبط ویدیوی پرسرعت ۱۲۰/۲۴۰ FPS، تأثیر واقعی را اندازه‌گیری کنند. دستگاه‌ها همچنین برای ایجاد فرآیند جدید به مقدار کمی رم اضافی نیاز دارند.
  • متادیتا را در بافرهای ویدیویی ( فقط HAL1 ) ذخیره کند. اگر HAL1 به جای داده‌های فریم YUV واقعی در بافرهای ویدیویی، متادیتا را ذخیره کند، HAL باید از kMetadataBufferTypeNativeHandleSource به عنوان نوع بافر متادیتا استفاده کند و VideoNativeHandleMetadata در بافرهای ویدیویی منتقل کند. ( kMetadataBufferTypeCameraSource دیگر در اندروید 7.0 پشتیبانی نمی‌شود.) با VideoNativeHandleMetadata ، فریم‌ورک‌های دوربین و رسانه می‌توانند با سریال‌سازی و غیر سریال‌سازی صحیح هندل‌های بومی، بافرهای ویدیویی را بین فرآیندها منتقل کنند.
  • آدرس دسته بافر همیشه همان بافر را ذخیره نمی‌کند ( فقط HAL3 ). برای هر درخواست ضبط، HAL3 آدرس دسته‌های بافر را دریافت می‌کند. HAL نمی‌تواند از این آدرس‌ها برای شناسایی بافرها استفاده کند زیرا ممکن است آدرس‌ها پس از اینکه HAL بافر را برمی‌گرداند، دسته بافر دیگری را ذخیره کنند. شما باید HAL را به‌روزرسانی کنید تا از دسته‌های بافر برای شناسایی بافرها استفاده کند. به عنوان مثال، HAL آدرس دسته بافر A را دریافت می‌کند که دسته بافر A را ذخیره می‌کند. پس از اینکه HAL دسته بافر A را برمی‌گرداند، آدرس دسته بافر A ممکن است دفعه بعد که HAL آن را دریافت می‌کند، دسته بافر B را ذخیره کند.
  • به‌روزرسانی سیاست‌های SELinux برای cameraserver. اگر سیاست‌های SELinux مختص دستگاه، مجوزهای مدیاسرور برای اجرای دوربین را می‌دهد، شما باید سیاست‌های SELinux را به‌روزرسانی کنید تا مجوزهای مناسب را به cameraserver بدهید. ما از تکرار سیاست‌های SELinux مدیاسرور برای cameraserver خودداری می‌کنیم (زیرا mediaserver و cameraserver عموماً به منابع متفاوتی در سیستم نیاز دارند). Cameraserver فقط باید مجوزهای لازم برای انجام عملکردهای دوربین را داشته باشد و هرگونه مجوز غیرضروری مربوط به دوربین در mediaserver باید حذف شود.
  • جداسازی بین Camera HAL و cameraserver. اندروید ۸.۰ و بالاتر علاوه بر این، Camera HAL متصل شده را در فرآیندی متفاوت از cameraserver جدا می‌کند. IPC از طریق رابط‌های تعریف شده توسط HIDL عبور می‌کند.

اعتبارسنجی

برای همه دستگاه‌هایی که شامل دوربین هستند و اندروید ۷.۰ را اجرا می‌کنند، پیاده‌سازی را با اجرای Android 7.0 CTS تأیید کنید. اگرچه اندروید ۷.۰ شامل تست‌های CTS جدیدی که تغییرات سرویس دوربین را تأیید می‌کنند، نیست، اما اگر به‌روزرسانی‌های ذکر شده در بالا را انجام نداده باشید، تست‌های CTS موجود با شکست مواجه می‌شوند.

برای همه دستگاه‌هایی که شامل دوربین هستند و اندروید ۸.۰ و بالاتر را اجرا می‌کنند، با اجرای VTS، پیاده‌سازی فروشنده را تأیید کنید.

تاریخچه نسخه دوربین HAL

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

اندروید ۱۰

اندروید ۱۰ به‌روزرسانی‌های زیر را معرفی می‌کند.

رابط برنامه‌نویسی کاربردی دوربین

  • بهبودهای چند دوربینی که با پنهان کردن شناسه‌های دوربین فیزیکی، امکان استفاده از دوربین‌های فیزیکی را به صورت جداگانه یا از طریق دوربین‌های منطقی مربوطه فراهم می‌کنند. به پشتیبانی از چند دوربین مراجعه کنید.
  • امکان بررسی پشتیبانی از پیکربندی یک جلسه خاص بدون سربار عملکردی ناشی از ایجاد یک جلسه جدید. به CameraDevice مراجعه کنید.
  • امکان بازیابی پیکربندی‌های جریان پیشنهادی برای یک مورد استفاده خاص برای افزایش بهره‌وری و عملکرد کلاینت از نظر مصرف انرژی. به getRecommendedStreamConfigurationMap مراجعه کنید.
  • پشتیبانی از فرمت تصویر JPEG با عمق . برای جزئیات بیشتر، به مشخصات عمق پویا مراجعه کنید.
  • پشتیبانی از فرمت تصویر HEIC . به تصویربرداری HEIF مراجعه کنید.
  • بهبود حریم خصوصی. قبل از اینکه کلاینت بتواند از CameraCharacteristics کلیدهای خاصی را بازیابی کند، برای داشتن مجوزهای CAMERA به آنها نیاز است. به getKeysNeedingPermission مراجعه کنید.

دوربین هال

نسخه‌های Camera HAL زیر در اندروید ۱۰ به‌روزرسانی شده‌اند.

۳.۵

ICameraDevice

  • getPhysicalCameraCharacteristics : اطلاعات ثابت دوربین برای یک شناسه دوربین فیزیکی که از یک دستگاه دوربین منطقی پشتیبانی می‌کند. به پشتیبانی از چند دوربین مراجعه کنید.
  • isStreamCombinationSupported : این متد از یک API عمومی پشتیبانی می‌کند که به کلاینت‌ها کمک می‌کند تا در صورت پشتیبانی از پیکربندی جلسه، پرس‌وجو کنند. برای پرس‌وجو در مورد ترکیبات جریان، به API مراجعه کنید.

ICameraDeviceSession

  • isReconfigurationNeeded : روشی که به چارچوب دوربین می‌گوید که آیا برای مقادیر جدید پارامترهای جلسه، پیکربندی مجدد کامل جریان مورد نیاز است یا خیر. این به جلوگیری از تأخیرهای غیرضروری در پیکربندی مجدد دوربین کمک می‌کند. به پرس‌وجوی پیکربندی مجدد جلسه مراجعه کنید.
  • APIهای مدیریت بافر HAL : این APIها به دوربین HAL اجازه می‌دهند تا فقط در صورت نیاز، به جای اتصال هر درخواست ضبط با بافرهای مرتبط با آن در سراسر خط لوله دوربین، از چارچوب دوربین درخواست بافر کند که منجر به صرفه‌جویی قابل توجه در حافظه می‌شود.
    • signalStreamFlush : به HAL سیگنال می‌دهد که سرویس دوربین در شرف انجام configureStreams_3_5 است و HAL باید تمام بافرهای جریان‌های تعیین‌شده را برگرداند.
    • configureStreams_3_5 : مشابه ICameraDevice3.4.configureStreams است، اما علاوه بر آن، شمارنده streamConfigCounter برای بررسی شرایط رقابتی بین فراخوانی‌های configureStreams_3_5 و signalStreamFlush ارائه شده است.

به‌روزرسانی‌های ICameraDeviceCallback :

  • requestStreamBuffers : فراخوانی همزمان که دوربین HAL برای درخواست بافر از سرور دوربین فراخوانی می‌کند. به requestStreamBuffers مراجعه کنید.
  • returnStreamBuffers : فراخوانی همزمان برای دوربین HAL جهت بازگرداندن بافرهای خروجی به سرور دوربین. به returnStreamBuffers مراجعه کنید.

۳.۴

کلیدهای زیر در اندروید ۱۰ به متادیتای دوربین اضافه شده‌اند.

  • قالب‌های تصویر
    • ANDROID_SCALER_AVAILABLE_FORMATS_RAW10
    • ANDROID_SCALER_AVAILABLE_FORMATS_RAW12
    • ANDROID_SCALER_AVAILABLE_FORMATS_Y8
  • برچسب‌های فراداده دوربین
    • ANDROID_REQUEST_CHARACTERISTIC_KEYS_NEEDING_PERMISSION
    • ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS
    • ANDROID_SCALER_AVAILABLE_RECOMMENDED_INPUT_OUTPUT_FORMATS_MAP
    • ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION
    • ANDROID_DEPTH_AVAILABLE_RECOMMENDED_DEPTH_STREAM_CONFIGURATIONS
    • ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS
    • ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS
    • ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID
    • ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS
    • ANDROID_HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS
    • ANDROID_HEIC_AVAILABLE_HEIC_STALL_DURATIONS
    • ANDROID_HEIC_INFO_SUPPORTED
    • ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT
  • قابلیت‌ها
    • ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SECURE_IMAGE_DATA
  • مقادیر مربوط به کلید ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT
    • ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_MONO
    • ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_NIR
  • پیکربندی‌های جریان عمقی پویای موجود
    • ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS_OUTPUT
    • ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS_INPUT
  • پیکربندی‌های موجود برای استریم HEIC
    • ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS_OUTPUT
    • ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS_INPUT

ماژول دوربین

نسخه‌های ماژول دوربین زیر در اندروید ۱۰ به‌روزرسانی شده‌اند.

۲.۵

  • متد notifyDeviceStateChange را برای دستگاه‌ها اضافه می‌کند تا وقتی تغییرات فیزیکی، مانند تا شدن، روی دوربین و مسیریابی تأثیر می‌گذارند، به دوربین HAL اطلاع دهند.

۲.۴

  • دستگاه‌هایی که با سطح API 29 یا بالاتر راه‌اندازی می‌شوند، باید برای isTorchModeSupported true گزارش کنند.

اندروید ۹

نسخه اندروید ۹ به‌روزرسانی‌های زیر را برای رابط برنامه‌نویسی کاربردی دوربین (API2) و رابط کاربری HAL ارائه می‌دهد.

رابط برنامه‌نویسی کاربردی دوربین

  • API چند دوربینه را برای پشتیبانی بهتر از دستگاه‌هایی که چندین دوربین در یک جهت قرار دارند، معرفی می‌کند و ویژگی‌هایی مانند بوکه و بزرگنمایی یکپارچه را فعال می‌کند. این به برنامه‌ها اجازه می‌دهد تا چندین دوربین را در یک دستگاه به عنوان یک واحد منطقی (دوربین منطقی) مشاهده کنند. درخواست‌های ضبط همچنین می‌توانند به دستگاه‌های دوربین مجزا که توسط یک دوربین منطقی احاطه شده‌اند، ارسال شوند. به پشتیبانی چند دوربینه مراجعه کنید.
  • پارامترهای جلسه را معرفی می‌کند. پارامترهای جلسه زیرمجموعه‌ای از پارامترهای ضبط موجود هستند که در صورت تغییر می‌توانند باعث تأخیرهای شدید پردازش شوند. اگر کلاینت‌ها مقادیر اولیه خود را در طول مقداردهی اولیه جلسه ضبط ارسال کنند، می‌توان این هزینه‌ها را کاهش داد. به پارامترهای جلسه مراجعه کنید.
  • کلیدهای داده تثبیت نوری (OIS) را برای تثبیت و جلوه‌های سطح برنامه اضافه می‌کند. به STATISTICS_OIS_SAMPLES مراجعه کنید.
  • پشتیبانی از فلاش خارجی را اضافه می‌کند. CONTROL_AE_MODE_ON_EXTERNAL_FLASH مراجعه کنید.
  • یک هدف ردیابی حرکت در CAPTURE_INTENT اضافه می‌کند. CONTROL_CAPTURE_INTENT_MOTION_TRACKING مراجعه کنید.
  • LENS_RADIAL_DISTORTION منسوخ کرده و به جای آن LENS_DISTORTION را اضافه می‌کند.
  • حالت‌های اصلاح اعوجاج را در CaptureRequest اضافه می‌کند. به DISTORTION_CORRECTION_MODE مراجعه کنید.
  • پشتیبانی از دوربین‌های USB/UVC خارجی را در دستگاه‌های پشتیبانی‌شده اضافه می‌کند. INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL مراجعه کنید.

دوربین هال

۳.۴

به‌روزرسانی‌های ICameraDeviceSession

  • configureStreams_3_4 : پشتیبانی از sessionParameters و دوربین‌های منطقی را اضافه می‌کند.
  • processCaptureRequest_3_4 : پشتیبانی از گنجاندن شناسه‌های فیزیکی دوربین در ساختار جریان را اضافه می‌کند.

به‌روزرسانی‌های ICameraDeviceCallback

  • processCaptureResult_3_4 : فراداده‌های فیزیکی دوربین را در نتایج ضبط اضافه می‌کند.

۳.۳

کلیدهای زیر در اندروید ۹ به ابرداده دوربین اضافه شده‌اند.

  • قابلیت‌ها
    • ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
    • ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MOTION_TRACKING
    • ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
  • برچسب‌های فراداده دوربین
    • ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS
    • ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE
    • ANDROID_DISTORTION_CORRECTION_AVAILABLE_MODES
    • ANDROID_LENS_POSE_REFERENCE
    • ANDROID_LENS_DISTORTION
    • ANDROID_REQUEST_AVAILABLE_SESSION_KEYS
    • ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS
    • ANDROID_STATISTICS_OIS_DATA_MODE
    • ANDROID_STATISTICS_OIS_TIMESTAMPS
    • ANDROID_STATISTICS_OIS_X_SHIFTS
    • ANDROID_STATISTICS_OIS_Y_SHIFTS

اندروید ۸.۰

نسخه اندروید ۸.۰، Treble را معرفی می‌کند. با Treble، پیاده‌سازی‌های دوربین HAL فروشنده باید binderized شوند. اندروید ۸.۰ همچنین شامل این پیشرفت‌های کلیدی در سرویس دوربین است:

  • سطوح مشترک: فعال کردن اشتراک‌گذاری چندین سطح با OutputConfiguration یکسان
  • API سیستم برای حالت‌های دوربین سفارشی
  • onCaptureQueueEmpty

برای اطلاعات بیشتر در مورد این ویژگی‌ها، به بخش‌های زیر مراجعه کنید.

سطوح مشترک

این ویژگی تنها یک مجموعه از بافرها را قادر می‌سازد تا دو خروجی، مانند پیش‌نمایش و رمزگذاری ویدیو، را هدایت کنند که باعث کاهش مصرف برق و حافظه می‌شود. برای پشتیبانی از این ویژگی، تولیدکنندگان دستگاه باید اطمینان حاصل کنند که پیاده‌سازی‌های HAL دوربین و gralloc HAL آنها می‌تواند بافرهای gralloc ایجاد کند که توسط چندین مصرف‌کننده مختلف (مانند آهنگساز سخت‌افزار/GPU و رمزگذار ویدیو) استفاده می‌شوند، نه فقط یک مصرف‌کننده. سرویس دوربین، پرچم‌های استفاده از مصرف‌کننده را به HAL دوربین و gralloc HAL منتقل می‌کند. آنها باید یا انواع مناسب بافرها را اختصاص دهند، یا HAL دوربین باید خطایی مبنی بر پشتیبانی نشدن این ترکیب از مصرف‌کنندگان را برگرداند.

برای جزئیات بیشتر به مستندات توسعه‌دهنده enableSurfaceSharing مراجعه کنید.

API سیستم برای حالت‌های دوربین سفارشی

API دوربین عمومی دو حالت عملیاتی را تعریف می‌کند: ضبط پرسرعت معمولی و محدود. آن‌ها معانی نسبتاً متفاوتی دارند؛ برای مثال، حالت پرسرعت حداکثر به دو خروجی خاص به طور همزمان محدود می‌شود. تولیدکنندگان اصلی تجهیزات (OEM) مختلف علاقه خود را به تعریف حالت‌های سفارشی دیگر برای قابلیت‌های خاص سخت‌افزار ابراز کرده‌اند. در باطن، این حالت فقط یک عدد صحیح است که به configure_streams ارسال می‌شود. به این آدرس مراجعه کنید: hardware/camera/device/3.2/ICameraDeviceSession#configurestreams .

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

برای پشتیبانی از این ویژگی، تولیدکنندگان اصلی تجهیزات (OEM) صرفاً باید حالت جدید را به HAL خود اضافه کنند، که توسط این عدد صحیح منتقل شده به HAL در configure_streams فعال می‌شود، و سپس برنامه دوربین سفارشی خود را از API سیستم استفاده کنند.

نام متد android.hardware.camera2.CameraDevice#createCustomCaptureSession است. به این آدرس مراجعه کنید: frameworks/base/core/java/android/hardware/camera2/CameraDevice .

onCaptureQueueEmpty

هدف این API کاهش تأخیر تغییرات کنترلی مانند بزرگنمایی با خالی نگه داشتن صف درخواست تا حد امکان است. onCaptureQueueEmpty نیازی به کار HAL ندارد؛ این صرفاً یک افزونه‌ی سمت فریم‌ورک بود. برنامه‌هایی که می‌خواهند از آن بهره ببرند، باید یک شنونده به آن فراخوانی اضافه کنند و به طور مناسب پاسخ دهند. عموماً این کار با ارسال یک درخواست ضبط دیگر به دستگاه دوربین انجام می‌شود.

رابط HIDL دوربین

رابط کاربری Camera HIDL یک بازنگری کامل از رابط کاربری Camera HAL است که از APIهای پایدار تعریف‌شده توسط HIDL استفاده می‌کند. تمام ویژگی‌ها و قابلیت‌های دوربین که در جدیدترین نسخه‌های قدیمی ۳.۴ و ۲.۴ (برای ماژول دوربین) معرفی شده‌اند نیز بخشی از تعاریف HIDL هستند.

۳.۴

اضافات جزئی به ابرداده‌های پشتیبانی‌شده و تغییرات در پشتیبانی از data_space:

  • اگر از فرمت RAW_OPAQUE پشتیبانی می‌شود، متادیتای استاتیک ANDROID_SENSOR_OPAQUE_RAW_SIZE به صورت اجباری اضافه کنید.
  • اگر از هر فرمت RAW پشتیبانی می‌شود، متادیتای استاتیک ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE را به صورت اجباری اضافه کنید.
  • فیلد camera3_stream_t data_space را با استفاده از تعریف نسخه ۰ کدگذاری dataspace، به تعریف انعطاف‌پذیرتری تغییر دهید.
  • اضافات عمومی ابرداده که برای HALv3.2 یا جدیدتر قابل استفاده هستند:
    • ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_3
    • ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST
    • ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE
    • ANDROID_SENSOR_DYNAMIC_BLACK_LEVEL
    • ANDROID_SENSOR_DYNAMIC_WHITE_LEVEL
    • ANDROID_SENSOR_OPAQUE_RAW_SIZE
    • ANDROID_SENSOR_OPTICAL_BLACK_REGIONS

۳.۳

بازنگری جزئی در HAL با قابلیت گسترش‌یافته:

  • به‌روزرسانی‌های API پردازش مجدد OPAQUE و YUV.
  • پشتیبانی اولیه از بافرهای خروجی عمق.
  • اضافه شدن فیلد data_space به camera3_stream_t .
  • افزودن فیلد چرخش به camera3_stream_t .
  • اضافه شدن حالت عملیات پیکربندی جریان camera3 به camera3_stream_configuration_t .

۳.۲

بازنگری جزئی در HAL با قابلیت گسترش‌یافته:

  • get_metadata_vendor_tag_ops منسوخ می‌کند. به جای آن get_vendor_tag_ops در camera_common.h استفاده کنید.
  • register_stream_buffers منسوخ می‌کند. همه بافرهای gralloc ارائه شده توسط چارچوب به HAL در process_capture_request ممکن است در هر زمان جدید باشند.
  • پشتیبانی از نتیجه جزئی را اضافه کنید. process_capture_result ممکن است چندین بار با زیرمجموعه‌ای از نتایج موجود فراخوانی شود تا نتیجه کامل در دسترس قرار گیرد.
  • الگوی دستی را به camera3_request_template اضافه کنید. برنامه‌ها می‌توانند از این الگو برای کنترل مستقیم تنظیمات ضبط استفاده کنند.
  • مشخصات جریان دوطرفه و ورودی را دوباره بررسی کنید.
  • مسیر بازگشت بافر ورودی را تغییر دهید. بافر به جای process_capture_request در process_capture_result بازگردانده می‌شود.

۳.۱

بازنگری جزئی در HAL با قابلیت گسترش‌یافته:

  • configure_streams پرچم‌های استفاده مصرف‌کننده را به HAL منتقل می‌کند.
  • تماس فوری برای حذف تمام درخواست‌ها/بافرهای حین پرواز در اسرع وقت.

۳.۰

اولین نسخه از HAL با قابلیت گسترش‌یافته:

  • تغییر عمده نسخه از آنجایی که ABI کاملاً متفاوت است. هیچ تغییری در قابلیت‌های سخت‌افزاری مورد نیاز یا مدل عملیاتی از نسخه ۲.۰ ایجاد نشده است.
  • رابط‌های صف درخواست ورودی و جریان بازسازی‌شده: فریم‌ورک با درخواست بعدی و بافرهای جریان که از قبل از صف خارج شده‌اند، به HAL فراخوانی می‌کند. پشتیبانی از فریم‌ورک همگام‌سازی نیز گنجانده شده است که برای پیاده‌سازی‌های کارآمد ضروری است.
  • محرک‌ها را به درخواست‌ها و بیشتر اعلان‌ها را به نتایج منتقل کرد.
  • تمام فراخوانی‌های برگشتی در چارچوب را در یک ساختار و تمام متدهای راه‌اندازی را در یک فراخوانی initialize() واحد تجمیع کرد.
  • پیکربندی جریان را به یک فراخوانی واحد تبدیل کرد تا مدیریت جریان را ساده‌تر کند. جریان‌های دوطرفه جایگزین ساختار STREAM_FROM_STREAM می‌شوند.
  • معناشناسی حالت محدود برای دستگاه‌های سخت‌افزاری قدیمی‌تر/محدود.

۲.۰

انتشار اولیه HAL با قابلیت توسعه‌یافته (اندروید ۴.۲) [camera2.h]:

  • برای پیاده‌سازی API موجود android.hardware.Camera کافی است.
  • امکان صف ZSL را در لایه سرویس دوربین فراهم می‌کند.
  • برای هیچ یک از ویژگی‌های جدید مانند کنترل دستی ضبط، ضبط Bayer RAW، پردازش مجدد داده‌های RAW و غیره آزمایش نشده است.

۱.۰

دوربین اولیه اندروید HAL (اندروید ۴.۰) [camera.h]:

  • تبدیل شده از لایه انتزاعی رابط دوربین و سخت‌افزار C++‎
  • از رابط android.hardware.Camera API) پشتیبانی می‌کند.

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

این بخش شامل اطلاعات نسخه‌بندی ماژول برای ماژول سخت‌افزاری دوربین، بر اساس camera_module_t.common.module_api_version است. دو رقم هگز با بیشترین اهمیت، نشان‌دهنده‌ی نسخه اصلی و دو رقم با کمترین اهمیت، نشان‌دهنده‌ی نسخه فرعی هستند.

۲.۴

این نسخه از ماژول دوربین، تغییرات API زیر را اضافه می‌کند:

  1. پشتیبانی از حالت مشعل. این چارچوب می‌تواند حالت مشعل را برای هر دستگاه دوربینی که دارای واحد فلاش است، بدون باز کردن دستگاه دوربین، فعال کند. دستگاه دوربین اولویت بالاتری برای دسترسی به واحد فلاش نسبت به ماژول دوربین دارد؛ باز کردن دستگاه دوربین، مشعل را خاموش می‌کند، اگر از طریق رابط ماژول فعال شده باشد. هنگامی که هرگونه تداخل منابع وجود دارد، مانند فراخوانی تابع open() برای باز کردن دستگاه دوربین، ماژول HAL دوربین باید از طریق فراخوانی وضعیت حالت مشعل به چارچوب اطلاع دهد که حالت مشعل خاموش شده است.
  2. پشتیبانی از دوربین خارجی (برای مثال، دوربین USB با قابلیت اتصال در حالت روشن). به‌روزرسانی‌های API مشخص می‌کنند که اطلاعات ثابت دوربین فقط زمانی در دسترس است که دوربین متصل و آماده استفاده برای دوربین‌های خارجی با قابلیت اتصال در حالت روشن باشد. فراخوانی‌ها برای دریافت اطلاعات ثابت، زمانی که وضعیت دوربین CAMERA_DEVICE_STATUS_PRESENT نباشد، فراخوانی‌های نامعتبر هستند. این چارچوب صرفاً بر روی فراخوانی‌های تغییر وضعیت دستگاه برای مدیریت لیست دوربین‌های خارجی موجود حساب می‌کند.
  3. نکات داوری دوربین. پشتیبانی از مشخص کردن صریح تعداد دستگاه‌های دوربینی که می‌توانند همزمان باز و استفاده شوند را اضافه می‌کند. برای تعیین ترکیب‌های معتبر دستگاه‌ها، فیلدهای resource_cost و conflicting_devices باید همیشه در ساختار camera_info که توسط فراخوانی get_camera_info برگردانده می‌شود، تنظیم شوند.
  4. روش مقداردهی اولیه ماژول. پس از بارگذاری ماژول HAL توسط سرویس دوربین فراخوانی می‌شود تا امکان مقداردهی اولیه یک‌باره HAL را فراهم کند. این روش قبل از فراخوانی سایر متدهای ماژول فراخوانی می‌شود.

۲.۳

این نسخه ماژول دوربین، پشتیبانی از دستگاه HAL دوربین قدیمی باز را اضافه می‌کند. این چارچوب می‌تواند از آن برای باز کردن دستگاه دوربین به عنوان دستگاه HAL نسخه پایین‌تر دستگاه HAL استفاده کند، اگر همان دستگاه بتواند از چندین نسخه API دستگاه پشتیبانی کند. فراخوانی استاندارد ماژول سخت‌افزاری باز ( common.methods->open ) همچنان دستگاه دوربین را با آخرین نسخه پشتیبانی شده باز می‌کند، که این نسخه همچنین در camera_info_t.device_version ذکر شده است.

۲.۲

این نسخه از ماژول دوربین، پشتیبانی از برچسب فروشنده (vendor tag) را از ماژول اضافه می‌کند و vendor_tag_query_ops قدیمی را که قبلاً فقط با باز بودن دستگاه قابل دسترسی بودند، منسوخ می‌کند.

۲.۱

این نسخه از ماژول دوربین، پشتیبانی از فراخوانی‌های غیرهمزمان را از ماژول HAL دوربین به چارچوب اضافه می‌کند که برای اطلاع‌رسانی به چارچوب در مورد تغییرات در وضعیت ماژول دوربین استفاده می‌شود. ماژول‌هایی که متد set_callbacks() معتبری ارائه می‌دهند، باید حداقل این شماره نسخه را گزارش دهند.

۲.۰

ماژول‌های دوربینی که این شماره نسخه را گزارش می‌دهند، نسخه دوم رابط HAL ماژول دوربین را پیاده‌سازی می‌کنند. دستگاه‌های دوربینی که از طریق این ماژول باز می‌شوند، می‌توانند از نسخه ۱.۰ یا نسخه ۲.۰ رابط HAL دستگاه دوربین پشتیبانی کنند. فیلد device_version از camera_info همیشه معتبر است؛ فیلد static_camera_characteristics از camera_info در صورتی معتبر است که فیلد device_version 2.0 یا بالاتر باشد.

۱.۰

ماژول‌های دوربینی که این شماره نسخه‌ها را گزارش می‌دهند، رابط HAL ماژول دوربین اولیه را پیاده‌سازی می‌کنند. تمام دستگاه‌های دوربینی که از طریق این ماژول قابل باز شدن هستند، فقط از نسخه ۱ دستگاه دوربین HAL پشتیبانی می‌کنند. فیلدهای device_version و static_camera_characteristics از camera_info معتبر نیستند. فقط API مربوط به android.hardware.Camera می‌تواند توسط این ماژول و دستگاه‌های آن پشتیبانی شود.