سازندگان دستگاهها میتوانند افزونههایی مانند بوکه، حالت شب و HDR را از طریق رابط برنامههای افزودنی دوربین ارائهشده توسط کتابخانه فروشنده OEM در اختیار توسعهدهندگان شخص ثالث قرار دهند. توسعه دهندگان می توانند از Camera2 Extensions API و CameraX Extensions API برای دسترسی به برنامه های افزودنی پیاده سازی شده در کتابخانه فروشنده OEM استفاده کنند.
برای لیستی از برنامههای افزودنی پشتیبانیشده، که در Camera2 و CameraX یکسان است، CameraX Extensions API را ببینید. اگر میخواهید پسوندی اضافه کنید، یک اشکال را با ردیاب مشکل ثبت کنید.
این صفحه نحوه پیاده سازی و فعال کردن کتابخانه فروشنده OEM را در دستگاه ها شرح می دهد.
معماری
نمودار زیر معماری رابط یا extensions-interface
افزودنی دوربین را شرح میدهد:
شکل 1. نمودار معماری Extensions دوربین
همانطور که در نمودار نشان داده شده است، برای پشتیبانی از برنامه های افزودنی دوربین، باید extensions-interface
ارائه شده توسط کتابخانه فروشنده OEM را پیاده سازی کنید. کتابخانه فروشنده OEM شما دو API را فعال میکند: CameraX Extensions API و Camera2 Extensions API که به ترتیب توسط برنامههای CameraX و Camera2 برای دسترسی به برنامههای افزودنی فروشنده استفاده میشوند.
کتابخانه فروشنده OEM را پیاده سازی کنید
برای پیاده سازی کتابخانه فروشنده OEM، فایل های camera-extensions-stub
را در پروژه کتابخانه سیستم کپی کنید. این فایل ها رابط برنامه افزودنی دوربین را تعریف می کنند.
فایل های camera-extensions-stub
به دسته های زیر تقسیم می شوند:
فایل های رابط ضروری (تغییر نکنید)
-
PreviewExtenderImpl.java
-
ImageCaptureExtenderImpl.java
-
ExtenderStateListener.java
-
ProcessorImpl.java
-
PreviewImageProcessorImpl.java
-
CaptureProcessorImpl.java
-
CaptureStageImpl.java
-
RequestUpdateProcessorImpl.java
-
ProcessResultImpl.java
-
advanced/AdvancedExtenderImpl.java
-
advanced/Camera2OutputConfigImpl.java
-
advanced/Camera2SessionConfigImpl.java
-
advanced/ImageProcessorImpl.java
-
advanced/ImageReaderOutputConfigImpl.java
-
advanced/ImageReferenceImpl.java
-
advanced/MultiResolutionImageReaderOutputConfigImpl.java
-
advanced/OutputSurfaceImpl.java
-
advanced/RequestProcessorImpl.java
-
advanced/SessionProcessorImpl.java
-
advanced/SurfaceOutputConfigImpl.java
پیاده سازی های اجباری (پیاده سازی خود را اضافه کنید)
-
ExtensionVersionImpl.java
-
InitializerImpl.java
کلاس های توسعه دهنده بوکه (اگر برنامه افزودنی بوکه پشتیبانی می شود، آن را اجرا کنید)
-
BokehImageCaptureExtenderImpl.java
-
BokehPreviewExtenderImpl.java
-
advanced/BokehAdvancedExtenderImpl.java
کلاس های توسعه دهنده شب (اگر Night extension پشتیبانی می شود، آن را اجرا کنید)
-
NightImageCaptureExtenderImpl.java
-
NightPreviewExtenderImpl.java
-
advanced/NightAdvancedExtenderImpl.java
کلاس های توسعه دهنده خودکار (اگر پسوند خودکار پشتیبانی می شود، آن را اجرا کنید)
-
AutoImageCaptureExtenderImpl.java
-
AutoPreviewExtenderImpl.java
-
advanced/AutoAdvancedExtenderImpl.java
کلاس های توسعه دهنده HDR (اگر پسوند HDR پشتیبانی می شود، آن را اجرا کنید)
-
HdrImageCaptureExtenderImpl.java
-
HdrPreviewExtenderImpl.java
-
advanced/HdrAdvancedExtenderImpl.java
کلاسهای توسعهدهنده روتوش چهره (اگر برنامه افزودنی روتوش چهره پشتیبانی میشود، آن را اجرا کنید)
-
BeautyImageCaptureExtenderImpl.java
-
BeautyPreviewExtenderImpl.java
-
advanced/BeautyAdvancedExtenderImpl.java
برنامه های کاربردی (اختیاری، قابل حذف است)
-
advanced/Camera2OutputConfigImplBuilder.java
-
advanced/Camera2SessionConfigImplBuilder.java
برای هر برنامه افزودنی نیازی به ارائه یک پیاده سازی نیست. اگر افزونه ای را پیاده سازی نمی کنید، isExtensionAvailable()
را تنظیم کنید تا false
برگرداند یا کلاس های Extender مربوطه را حذف کنید. APIهای Camera2 و CameraX Extensions به برنامه گزارش می دهند که برنامه افزودنی در دسترس نیست.
بیایید نحوه تعامل APIهای Camera2 و CameraX Extensions با کتابخانه فروشنده را برای فعال کردن یک برنامه افزودنی بررسی کنیم. نمودار زیر جریان انتها به انتها را با استفاده از پسوند Night به عنوان مثال نشان می دهد:
شکل 2. اجرای برنامه افزودنی شب
تایید نسخه:
Camera2/X
ExtensionVersionImpl.checkApiVersion()
را فراخوانی می کند تا اطمینان حاصل کند که نسخهextensions-interface
پیاده سازی شده توسط OEM با نسخه های پشتیبانی شده Camera2/X سازگار است.مقداردهی اولیه کتابخانه فروشنده:
InitializerImpl
دارای یک متدinit()
است که کتابخانه فروشنده را مقداردهی اولیه می کند. Camera2/X قبل از دسترسی به کلاس های Extender، مقداردهی اولیه را تکمیل می کند.کلاس های Instantiate Extender:
کلاس های Extender را برای برنامه افزودنی نمونه سازی می کند. دو نوع Extender وجود دارد: Basic Extender و Advanced Extender. شما باید یک نوع Extender را برای همه افزونه ها پیاده سازی کنید. برای اطلاعات بیشتر، به Basic Extender در مقابل Advanced Extender مراجعه کنید.
Camera2/X کلاس های Extender را برای بازیابی اطلاعات و فعال کردن برنامه افزودنی نمونه سازی می کند و با آنها تعامل می کند. برای یک پسوند معین، Camera2/X میتواند چندین بار کلاسهای Extender را نمونهسازی کند. در نتیجه، مقداردهی اولیه را در سازنده یا فراخوانی
init()
init انجام ندهید. کارهای سنگین را فقط زمانی انجام دهید که جلسه دوربین در شرف شروع است، مانند زمانی کهonInit()
در Basic Extender یاinitSession()
در Advanced Extender فراخوانی می شود.برای افزونه Night، کلاسهای Extender زیر برای نوع Basic Extender نمونهسازی شدهاند:
-
NightImageCaptureExtenderImpl.java
-
NightPreviewExtenderImpl.java
و برای نوع Advanced Extender:
-
NightAdvancedExtenderImpl.java
-
بررسی در دسترس بودن برنامه افزودنی:
قبل از فعال کردن برنامه افزودنی،
isExtensionAvailable()
بررسی می کند که آیا برنامه افزودنی در شناسه دوربین مشخص شده از طریق نمونه Extender موجود است یا خیر.برنامه توسعه دهنده را با اطلاعات دوربین راه اندازی کنید:
Camera2/X
init()
در نمونه Extender فراخوانی می کند و شناسه دوربین وCameraCharacteristics
را به آن ارسال می کند.اطلاعات استعلام:
کلاس Extender را فراخوانی میکند تا اطلاعاتی مانند وضوحهای پشتیبانیشده، هنوز هم زمان تأخیر تخمینی را ضبط کند و کلیدهای درخواست را از Extender در آمادهسازی برای فعال کردن برنامه افزودنی بازیابی کند.
فعال کردن افزونه در Extender:
کلاس Extender تمام رابط های مورد نیاز برای فعال کردن کلاس را فراهم می کند. مکانیزمی را برای قلاب کردن اجرای OEM به خط لوله Camera2 ارائه می دهد، مانند تزریق پارامترهای درخواست ضبط یا فعال کردن یک پردازشگر پست.
برای نوع Advanced Extender، Camera2/X با
SessionProcessorImpl
تعامل دارد تا برنامه افزودنی را فعال کند. Camera2/X نمونهSessionProcessorImpl
با فراخوانیcreateSessionProcessor()
در Extender بازیابی می کند.
بخشهای زیر جریان گسترش را با جزئیات بیشتری شرح میدهند.
تایید نسخه
هنگام بارگیری کتابخانه فروشنده OEM از دستگاه در زمان اجرا، Camera2/X بررسی می کند که آیا کتابخانه با نسخه extensions-interface
سازگار است یا خیر. extensions-interface
از نسخهسازی معنایی یا MAJOR.MINOR.PATCH برای مثال 1.1.0 یا 1.2.0 استفاده میکند. با این حال، تنها نسخه اصلی و فرعی در تأیید نسخه استفاده می شود.
برای تأیید نسخه، Camera2/X ExtensionVersionImpl.checkApiVersion()
را با نسخه extensions-interface
پشتیبانی شده فراخوانی می کند. Camera2/X سپس از نسخه گزارش شده توسط کتابخانه OEM استفاده می کند تا تعیین کند که آیا برنامه افزودنی می تواند فعال شود و چه قابلیت هایی باید فراخوانی کند.
سازگاری نسخه اصلی
اگر نسخههای اصلی رابط-افزونه بین Camera2/X و کتابخانه فروشنده متفاوت باشد، ناسازگار در نظر گرفته میشود و برنامه افزودنی غیرفعال میشود.
سازگاری به عقب
تا زمانی که نسخه اصلی یکسان باشد، Camera2/X سازگاری عقب مانده با کتابخانه های فروشنده OEM ساخته شده با نسخه های extensions-interface
قبلی را تضمین می کند. به عنوان مثال، اگر Camera2/X از extensions-interface
1.3.0 پشتیبانی می کند، کتابخانه های فروشنده OEM که 1.0.0، 1.1.0 و 1.2.0 را پیاده سازی کرده اند، همچنان سازگار هستند. این همچنین به این معنی است که پس از پیادهسازی نسخه خاصی از کتابخانه فروشنده، Camera2/X مطمئن میشود که کتابخانه با نسخههای extension-interface
آینده سازگار است.
سازگاری رو به جلو
سازگاری پیشرو با کتابخانههای فروشنده extensions-interface
جدیدتر به شما، OEM بستگی دارد. اگر برای پیادهسازی برنامههای افزودنی به برخی ویژگیها نیاز دارید، ممکن است بخواهید برنامههای افزودنی را از یک نسخه خاص فعال کنید. در این مورد، زمانی که نسخه کتابخانه Camera2/X شرایط را برآورده می کند، می توانید نسخه extensions-interface
پشتیبانی شده را برگردانید. اگر نسخههای Camera2/X پشتیبانی نمیشوند، میتوانید یک نسخه ناسازگار مانند 99.0.0 را برای غیرفعال کردن برنامههای افزودنی برگردانید.
مقداردهی اولیه کتابخانه فروشنده
پس از تأیید نسخه extensions-interface
پیادهسازی شده توسط کتابخانه OEM، Camera2/X فرآیند اولیهسازی را آغاز میکند. روش InitializerImpl.init()
به کتابخانه OEM سیگنال می دهد که یک برنامه در تلاش است از برنامه های افزودنی استفاده کند.
Camera2/X هیچ تماس دیگری با کتابخانه OEM برقرار نمی کند (به غیر از بررسی نسخه) تا زمانی که کتابخانه فروشنده OEM با OnExtensionsInitializedCallback.onSuccess()
تماس بگیرد تا تکمیل اولیه سازی را اعلام کند.
شما باید InitializerImpl
از extensions-interface
1.1.0 پیاده سازی کنید. Camera2/X مرحله اولیه سازی کتابخانه را رد می کند اگر کتابخانه فروشنده OEM extensions-interface
1.0.0 را پیاده سازی کند.
توسعه دهنده پایه در مقابل توسعه دهنده پیشرفته
دو نوع پیاده سازی extensions-interface
وجود دارد: توسعه دهنده پایه و توسعه دهنده پیشرفته. توسعه دهنده پیشرفته از extensions-interface
1.2.0 پشتیبانی شده است.
Basic Extender را برای برنامههای افزودنی که تصاویر را در دوربین HAL پردازش میکنند یا از یک پردازشگر پستی که قادر به پردازش جریانهای YUV است، استفاده کنید.
برای برنامههای افزودنی که نیاز به سفارشی کردن پیکربندی جریان Camera2 و ارسال درخواستهای عکسبرداری در صورت نیاز دارند، Advanced Extender را اجرا کنید.
برای مقایسه به جدول زیر مراجعه کنید:
توسعه دهنده پایه | توسعه دهنده پیشرفته | |
---|---|---|
تنظیمات جریان | ثابت شد پیش نمایش: PRIVATE یا YUV_420_888 (در صورت وجود پردازنده)عکسبرداری همچنان: JPEG یا YUV_420_888 (در صورت وجود پردازنده) | قابل تنظیم توسط OEM. |
ارسال درخواست ضبط | فقط Camera2/X می تواند درخواست عکسبرداری ارسال کند. شما می توانید پارامترها را برای این درخواست ها تنظیم کنید. هنگامی که پردازنده برای ضبط تصویر ارائه می شود، Camera2/X می تواند چندین درخواست عکسبرداری ارسال کند و تمام تصاویر و نتایج ضبط را برای پردازنده ارسال کند. | یک نمونه RequestProcessorImpl برای اجرای درخواست عکسبرداری camera2 و دریافت نتایج و تصویر در اختیار شما قرار می گیرد. Camera2/X |
قلاب در خط لوله دوربین |
|
|
مناسب برای | برنامههای افزودنی که در دوربین HAL یا پردازندهای که تصاویر YUV را پردازش میکند، پیادهسازی شدهاند. |
|
نسخه API پشتیبانی شده | برنامه های افزودنی Camera2: اندروید 13 یا بالاتر برنامه های افزودنی CameraX: camera-extensions 1.1.0 یا بالاتر | برنامه های افزودنی Camera2: Android 12L یا بالاتر برنامه های افزودنی CameraX: camera-extensions 1.2.0-alpha03 یا بالاتر |
برنامه جریان می یابد
جدول زیر سه نوع جریان برنامه و فراخوانی های Camera Extensions API مربوط به آنها را نشان می دهد. در حالی که Camera2/X این API ها را ارائه می دهد، شما باید کتابخانه فروشنده را به درستی پیاده سازی کنید تا از این جریان ها پشتیبانی کند، که در بخش بعدی با جزئیات بیشتر توضیح خواهیم داد.
پسوند Camera2 | پسوند CameraX | |
---|---|---|
در دسترس بودن برنامه افزودنی پرس و جو | CameraExtensionCharacteristics . getSupportedExtensions | ExtensionsManager. isExtensionAvailable |
استعلام اطلاعات | CameraExtensionCharacteristics. getExtensionSupportedSizes CameraExtensionCharacteristics. getEstimatedCaptureLatencyRangeMillis CameraExtensionCharacteristics. getAvailableCaptureRequestKeys CameraExtensionCharacteristics. getAvailableCaptureResultKeys | ExtensionsManager. getEstimatedCaptureLatencyRange CameraX بقیه اطلاعات موجود در کتابخانه را مدیریت می کند. |
پیشنمایش و عکسبرداری با پسوند فعال است | CameraDevice. createExtensionSession | val cameraSelector = ExtensionsManager. getExtensionEnabledCameraSelector bindToLifecycle(lifecycleOwner، cameraSelector، پیش نمایش، ...) |
توسعه دهنده پایه
رابط Basic Extender قلاب هایی را در چندین مکان در خط لوله دوربین فراهم می کند. هر نوع برنامه افزودنی دارای کلاس های توسعه دهنده مربوطه است که OEM ها باید آن ها را پیاده سازی کنند.
جدول زیر کلاس های Extender را که OEMS باید برای هر برنامه افزودنی پیاده سازی کند فهرست می کند:
کلاس های توسعه دهنده برای پیاده سازی | |
---|---|
شب | NightPreviewExtenderImpl.java |
HDR | HdrPreviewExtenderImpl.java |
خودکار | AutoPreviewExtenderImpl.java |
بوکه | BokehPreviewExtenderImpl.java |
روتوش صورت | BeautyPreviewExtenderImpl.java |
ما در مثال زیر PreviewExtenderImpl
و ImageCaptureExtenderImpl
به عنوان متغیرهایی استفاده می کنیم. اینها را با نام فایل های واقعی که در حال پیاده سازی هستید جایگزین کنید.
Basic Extender دارای قابلیت های زیر است:
- هنگام پیکربندی
CameraCaptureSession
(onPresetSession
) پارامترهای جلسه را وارد کنید. - شما را از رویدادهای شروع و بسته شدن جلسه ضبط مطلع می کند و یک درخواست برای اطلاع HAL با پارامترهای برگشتی ارسال می کند (
onEnableSession
،onDisableSession
). - پارامترهای ضبط را برای درخواست تزریق کنید (
PreviewExtenderImpl.getCaptureStage
،ImageCaptureExtenderImpl.getCaptureStages
). - پردازندههایی را برای پیشنمایش و عکسبرداری اضافه کنید که قادر به پردازش جریان
YUV_420_888
هستند.
بیایید ببینیم Camera2/X چگونه extensions-interface
برای دستیابی به سه جریان برنامه ذکر شده در بالا فراخوانی میکند.
جریان برنامه 1: در دسترس بودن برنامه افزودنی را بررسی کنید
شکل 3. جریان برنامه 1 در Basic Extender
در این جریان، Camera2/X مستقیماً متد isExtensionAvailable()
از هر دو PreviewExtenderImpl
و ImageCaptureExtenderImpl
را بدون فراخوانی init()
فراخوانی میکند. هر دو کلاس Extender باید true
برگردانند تا افزونه ها فعال شوند.
این اغلب اولین گام برای برنامهها برای بررسی اینکه آیا نوع پسوند دادهشده برای یک شناسه دوربین مشخص پشتیبانی میشود، قبل از فعال کردن برنامه افزودنی است. این به این دلیل است که برخی از برنامههای افزودنی فقط در شناسههای دوربین خاص پشتیبانی میشوند.
جریان برنامه 2: اطلاعات را جستجو کنید
شکل 4. جریان برنامه 2 در Basic Extender
پس از تعیین اینکه آیا برنامه افزودنی در دسترس است، برنامهها باید اطلاعات زیر را قبل از فعال کردن برنامه افزودنی جستجو کنند.
محدوده تأخیر ضبط هنوز:
ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRange
محدوده تأخیر ضبط را به برنامه برمی گرداند تا ارزیابی کند که آیا برای فعال کردن برنامه افزودنی برای سناریوی فعلی مناسب است یا خیر.اندازههای پشتیبانیشده برای سطح پیشنمایش و عکسبرداری:
ImageCaptureExtenderImpl.getSupportedResolutions
وPreviewExtenderImpl.getSupportedResolutions
فهرستی از قالبهای تصویر و اندازههایی را که برای قالب و اندازه سطح پشتیبانی میشوند، برمیگردانند.کلیدهای درخواست و نتیجه پشتیبانی شده: Camera2/X روشهای زیر را برای بازیابی کلیدهای درخواست ضبط پشتیبانی شده و کلیدهای نتیجه از پیادهسازی شما فراخوانی میکند:
-
ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys
-
ImageCaptureExtenderImpl.getAvailableCapturetResultKeys
-
Camera2/X همیشه ابتدا init()
در این کلاس های Extender قبل از درخواست اطلاعات بیشتر فراخوانی می کند.
جریان برنامه 3: پیشنمایش/عکسبرداری با برنامه افزودنی فعال (اجرای HAL)
شکل 5. جریان برنامه 3 در Basic Extender
نمودار بالا جریان اصلی فعال کردن پیشنمایش و ضبط عکس با پسوند بدون هیچ پردازنده را نشان میدهد. این بدان معناست که دوربین HAL پسوند را پردازش می کند.
در این جریان، Camera2/X ابتدا init()
و سپس onInit
فراخوانی میکند، که به شما اطلاع میدهد که جلسه دوربین با پسوندهای مشخص شده شروع میشود. می توانید مقداردهی اولیه را در onInit()
انجام دهید.
هنگام پیکربندی CameraCaptureSession
، Camera2/X روی onPresetSession
را فراخوانی میکند تا پارامترهای جلسه را دریافت کند. پس از پیکربندی موفقیت آمیز جلسه ضبط، Camera2/X با فراخوانی onEnableSession
یک نمونه CaptureStageImpl
را که حاوی پارامترهای ضبط است، برمی گرداند. Camera2/X فوراً یک درخواست واحد با این پارامترهای ضبط برای اطلاع HAL ارسال می کند. به طور مشابه، قبل از بسته شدن جلسه عکسبرداری، Camera2/X روی onDisableSession
را فراخوانی می کند و سپس یک درخواست را با پارامترهای ضبط برگشتی ارسال می کند.
درخواست تکراری ایجاد شده توسط Camera2/X حاوی پارامترهای درخواستی است که توسط PreviewExtenderImpl.getCaptureStage()
برگردانده شده است. علاوه بر این، درخواست ضبط عکس حاوی پارامترهایی است که توسط ImageCaptureExtenderImpl.getCaptureStages()
برگردانده شده است.
در نهایت، Camera2/X پس از پایان جلسه دوربین onDeInit()
فراخوانی می کند. می توانید منابع را در onDeinit()
منتشر کنید.
پیش نمایش پردازنده
علاوه بر دوربین HAL، می توانید افزونه ها را در یک پردازنده نیز پیاده سازی کنید.
برای تعیین نوع پردازنده همانطور که در زیر توضیح داده شده است، PreviewExtenderImpl.getProcessorType
پیاده سازی کنید:
PROCESSOR_TYPE_NONE
: بدون پردازنده. تصاویر در دوربین HAL پردازش می شوند.PROCESSOR_TYPE_REQUEST_UPDATE_ONLY
: نوع پردازنده به شما امکان می دهد درخواست تکراری را با پارامترهای درخواست ضبط جدید بر اساس آخرینTotalCaptureResult
به روز کنید.PreviewExtenderImpl.getProcessor
باید یک نمونهRequestUpdateProcessorImpl
برگرداند که نمونهTotalCaptureResult
پردازش می کند و یک نمونهCaptureStageImpl
برای به روز رسانی درخواست تکراری برمی گرداند.PreviewExtenderImpl.getCaptureStage()
همچنین باید نتیجه پردازش را منعکس کند و آخرینCaptureStageImpl
برگرداند.PROCESSOR_TYPE_IMAGE_PROCESSOR
: این نوع به شما امکان می دهد یک پردازنده را برای پردازش تصاویرYUV_420_888
پیاده سازی کنید و خروجی را روی یک سطحPRIVATE
بنویسید.شما باید یک نمونه
PreviewImageProcessorImpl
درPreviewExtenderImpl.getProcessor
پیاده سازی و برگردانید. پردازشگر وظیفه پردازش تصاویر ورودیYUV_420_888
را بر عهده دارد. باید خروجی را به فرمتPRIVATE
پیش نمایش بنویسد. Camera2/X از یک سطحYUV_420_888
به جایPRIVATE
برای پیکربندیCameraCaptureSession
برای پیش نمایش استفاده می کند.برای جریان به تصویر زیر مراجعه کنید:
شکل 6. پیش نمایش جریان با PreviewImageProcessorImpl
رابط PreviewImageProcessorImpl
ProcessImpl
را گسترش می دهد و سه روش مهم دارد:
onOutputSurface(Surface surface, int imageFormat)
سطح خروجی را برای پردازنده تنظیم می کند. برایPreviewImageProcessorImpl
،imageFormat
یک قالب پیکسلی مانندPixelFormat.RGBA_8888
است.onResolutionUpdate(Size size)
اندازه تصویر ورودی را تعیین می کند.onImageFormatUpdate(int imageFormat)
فرمت تصویر تصویر ورودی را تنظیم می کند. در حال حاضر، فقط می تواندYUV_420_888
باشد.
پردازشگر تصویربرداری
برای عکسبرداری ثابت، میتوانید با برگرداندن یک نمونه CaptureProcessorImpl
با استفاده از ImageCaptureExtenderImpl.getCaptureProcessor
، یک پردازنده را پیادهسازی کنید. پردازنده مسئول پردازش لیستی از تصاویر YUV_420_888
و نمونههای TotalCaptureResult
است و خروجی را روی سطح YUV_420_888
بنویسد.
میتوانید با خیال راحت فرض کنید که پیشنمایش فعال است و قبل از ارسال درخواست ضبط ثابت اجرا میشود.
جریان را در نمودار زیر ببینید:
شکل 7. هنوز جریان را با CaptureProcessorImpl
ضبط کنید
Camera2/X از یک سطح فرمت
YUV_420_888
برای عکسبرداری استفاده میکند تا جلسه عکسبرداری را پیکربندی کند. Camera2/XCaptureProcessorImpl
با فراخوانی آماده می کند:-
CaptureProcessorImpl.onImageFormatUpdate()
باYUV_420_888
. -
CaptureProcessorImpl.onResolutionUpdate()
با اندازه تصویر ورودی. -
CaptureProcessorImpl.onOutputSurface()
با سطح خروجیYUV_420_888
.
-
ImageCaptureExtenderImpl.getCaptureStages
لیستی ازCaptureStageImpl
را برمی گرداند، که در آن هر عنصر با پارامترهای ضبط که توسط Camera2/X ارسال می شود، به یک نمونهCaptureRequest
نگاشت می شود. برای مثال، اگر لیستی از سه نمونهCaptureStageImpl
را برگرداند، Camera2/X با استفاده ازcaptureBurst
API، سه درخواست عکسبرداری را با پارامترهای عکسبرداری مربوطه ارسال می کند.تصاویر دریافتی و نمونه های
TotalCaptureResult
با هم ترکیب می شوند و برای پردازش بهCaptureProcessorImpl
ارسال می شوند.CaptureProcessorImpl
تصویر نتیجه را (فرمتYUV_420_888
) در سطح خروجی مشخص شده توسط فراخوانیonOutputSurface()
می نویسد. Camera2/X در صورت لزوم آن را به تصاویر JPEG تبدیل می کند.
پشتیبانی از کلیدهای درخواست ضبط و نتایج
علاوه بر پیشنمایش دوربین و عکسبرداری، برنامهها میتوانند زوم، پارامترهای فلاش را تنظیم کنند یا فوکوس ضربهای را فعال کنند. ممکن است این پارامترها با اجرای برنامه افزودنی شما سازگار نباشد.
روشهای زیر به extensions-interface
1.3.0 اضافه شدهاند تا به شما اجازه دهند پارامترهایی را که پیادهسازی شما پشتیبانی میکند در معرض دید قرار دهید:
-
ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys()
کلیدهای درخواست ضبط پشتیبانی شده توسط پیاده سازی شما را برمی گرداند. -
ImageCaptureExtenderImpl.getAvailableCaptureResultKeys()
کلیدهای نتیجه گرفتن را که در نتیجه ضبط موجود است برمی گرداند.
اگر دوربین HAL افزونه را پردازش کند، Camera2/X نتایج عکسبرداری را در CameraCaptureSession.CaptureCallback
بازیابی میکند. با این حال، اگر پردازنده پیادهسازی شود، Camera2/X نتایج ضبط را در ProcessResultImpl
بازیابی میکند، که به متد process()
در PreviewImageProcessorImpl
و CaptureProcessorImpl
منتقل میشود. شما مسئول گزارش نتیجه عکسبرداری از طریق ProcessResultImpl
به Camera2/X هستید.
به عنوان مثال تعریف رابط CaptureProcessorImpl
را در زیر ببینید. در extensions-interface
1.3.0 یا بالاتر، دومین فراخوانی process()
فراخوانی می شود:
Interface CaptureProcessorImpl extends ProcessorImpl {
// invoked when extensions-interface version < 1.3.0
void process(Map<Integer, Pair<Image, TotalCaptureResult>> results);
// invoked when extensions-interface version >= 1.3.0
void process(Map<Integer, Pair<Image, TotalCaptureResult>> results,
ProcessResultImpl resultCallback, Executor executor);
}
برای عملکردهای رایج دوربین مانند زوم، ضربه برای فوکوس، فلاش، و جبران نوردهی، توصیه میکنیم از کلیدهای زیر برای درخواست عکسبرداری و نتیجه عکسبرداری پشتیبانی کنید:
- بزرگنمایی:
-
CaptureRequest#CONTROL_ZOOM_RATIO
-
CaptureRequest#SCALER_CROP_REGION
-
- ضربه زدن برای فوکوس:
-
CaptureRequest#CONTROL_AF_MODE
-
CaptureRequest#CONTROL_AF_TRIGGER
-
CaptureRequest#CONTROL_AF_REGIONS
-
CaptureRequest#CONTROL_AE_REGIONS
-
CaptureRequest#CONTROL_AWB_REGIONS
-
- فلش:
-
CaptureRequest#CONTROL_AE_MODE
-
CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER
-
CaptureRequest#FLASH_MODE
-
- جبران نوردهی:
-
CaptureRequest#CONTROL_AE_EXPOSURE_COMPENSATION
-
برای Basic Extenders که نسخههای 1.2.0 یا نسخههای قبلی را اجرا میکنند، CameraX Extensions API صراحتاً از همه کلیدهای بالا پشتیبانی میکند. برای extensions-interface
1.3.0، هر دو CameraX و Camera2 لیست بازگشتی را ارج می نهند و فقط از کلیدهای موجود در آن پشتیبانی می کنند. به عنوان مثال، اگر تصمیم دارید فقط CaptureRequest#CONTROL_ZOOM_RATIO
و CaptureRequest#SCALER_CROP_REGION
در پیادهسازی 1.3.0 برگردانید، این بدان معناست که فقط زوم برای برنامه پشتیبانی میشود در حالی که ضربه برای فوکوس، فلاش و جبران نوردهی مجاز نیست.
توسعه دهنده پیشرفته
Advanced Extender نوعی پیاده سازی فروشنده بر اساس Camera2 API است. این نوع Extender در extensions-interface
1.2.0 اضافه شد. بسته به سازنده دستگاه، برنامههای افزودنی ممکن است در لایه برنامه پیادهسازی شوند که به عوامل زیر بستگی دارد:
پیکربندی پخش جریانی سفارشی: جریانهای سفارشی مانند جریان RAW را پیکربندی کنید یا برای شناسههای دوربین فیزیکی مختلف، چندین جریان داشته باشید.
قابلیت ارسال درخواستهای Camera2: از یک منطق تعاملی پیچیده پشتیبانی میکند که میتواند درخواستهای ضبط را با پارامترهایی بر اساس نتایج درخواستهای قبلی ارسال کند.
Advanced Extender یک پوشش یا یک لایه میانی ارائه می دهد، بنابراین می توانید پیکربندی جریان را سفارشی کنید و درخواست های ضبط را در صورت درخواست ارسال کنید.
فایل هایی برای پیاده سازی
برای تغییر به پیاده سازی Advanced Extender، متد isAdvancedExtenderImplemented()
در ExtensionVersionImpl
باید true
برگرداند. برای هر نوع پسوند، OEM ها باید کلاس های Extender مربوطه را پیاده سازی کنند. فایل های پیاده سازی Advanced Extender در بسته پیشرفته هستند.
کلاس های توسعه دهنده برای پیاده سازی | |
---|---|
شب | advanced/NightAdvancedExtenderImpl.java |
HDR | advanced/HdrAdvancedExtenderImpl.java |
خودکار | advanced/AutoAdvancedExtenderImpl.java |
بوکه | advanced/BokehAdvancedExtenderImpl.java |
روتوش صورت | advanced/BeautyAdvancedExtenderImpl.java |
ما در مثال زیر از AdvancedExtenderImpl
به عنوان مکان نگهدارنده استفاده می کنیم. آن را با نام فایل Extender برای پسوندی که پیادهسازی میکنید جایگزین کنید.
بیایید ببینیم Camera2/X چگونه extensions-interface
برای دستیابی به سه جریان برنامه فراخوانی میکند.
جریان برنامه 1: در دسترس بودن برنامه های افزودنی را بررسی کنید
شکل 8. جریان برنامه 1 در Advanced Extender
ابتدا، برنامه بررسی می کند که آیا پسوند داده شده پشتیبانی می شود یا خیر.
جریان برنامه 2: اطلاعات را جستجو کنید
شکل 9. جریان برنامه 2 در Advanced Extender
پس از فراخوانی AdvancedExtenderImpl.init()
، برنامه می تواند اطلاعات زیر را در AdvancedExtenderImpl
پرس و جو کند:
تأخیر تصویربرداری تخمینی:
AdvancedExtenderImpl.getEstimatedCaptureLatencyRange()
دامنه تأخیر ضبط را به برنامه برمیگرداند تا ارزیابی کند که آیا فعال کردن برنامه افزودنی برای سناریوی فعلی مناسب است یا خیر.رزولوشن های پشتیبانی شده برای پیش نمایش و عکسبرداری:
AdvancedExtenderImpl.getSupportedPreviewOutputResolutions()
نقشه ای از فرمت تصویر را به لیست اندازه هایی که برای قالب و اندازه سطح پیش نمایش پشتیبانی می شود، برمی گرداند. OEM ها باید حداقل از قالبPRIVATE
پشتیبانی کنند.AdvancedExtenderImpl.getSupportedCaptureOutputResolutions()
فرمت و اندازه های پشتیبانی شده را برای سطح ضبط ثابت برمی گرداند. OEM ها باید از خروجیJPEG
وYUV_420_888
پشتیبانی کنند.AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions()
اندازه های پشتیبانی شده را برای یک جریان اضافیYUV_420_888
برای تجزیه و تحلیل تصویر برمی گرداند. اگر سطح YUV تجزیه و تحلیل تصویر پشتیبانی نمی شود،getSupportedYuvAnalysisResolutions()
باید یک لیستnull
یا تهی برگرداند.
کلیدها/نتایج درخواست عکسبرداری موجود (افزوده شده در
extensions-interface
1.3.0): Camera2/X روشهای زیر را برای بازیابی کلیدهای درخواست ضبط پشتیبانی شده و کلیدهای نتیجه از پیادهسازی شما فراخوانی میکند:-
AdvancedExtenderImpl.getAvailableCaptureRequestKeys
-
AdvancedExtenderImpl.getAvailableCaptureResultKeys
-
برای اطلاعات بیشتر، کلیدهای درخواست ضبط پشتیبانی و نتایج را ببینید.
جریان برنامه 3: پیشنمایش/عکسبرداری با برنامه افزودنی فعال
شکل 10. جریان برنامه 3 در Advanced Extender
نمودار بالا جریان اصلی را برای شروع پیشنمایش و گرفتن عکس برای نوع Advanced Extender نشان میدهد. بیایید هر مرحله را طی کنیم.
نمونه
SessionProcessorImpl
هسته پیادهسازی Advanced Extender در
SessionProcessorImpl
است که مسئول ارائه پیکربندی جلسه سفارشی و ارسال درخواستهای ضبط برای شروع درخواست پیشنمایش و ضبط عکس است.AdvancedExtenderImpl.createSessionProcessor()
برای برگرداندن نمونهSessionProcessorImpl
فراخوانی می شود.initSession
SessionProcessorImpl.initSession()
جلسه را برای برنامه افزودنی مقداردهی اولیه می کند. این جایی است که شما منابع را تخصیص می دهید و پیکربندی جلسه را برای تهیهCameraCaptureSession
برمی گردانید.برای پارامترهای ورودی، Camera2/X پیکربندیهای سطح خروجی را برای پیشنمایش، گرفتن عکس و تجزیه و تحلیل تصویر YUV اختیاری مشخص میکند. این پیکربندی سطح خروجی (
OutputSurfaceImpl
) شامل سطح، اندازه و قالب تصویر است که با روشهای زیر درAdvancedExtenderImpl
بازیابی میشوند:-
getSupportedPreviewOutputResolutions()
-
getSupportedCaptureOutputResolutions()
-
getSupportedYuvAnalysisResolutions()
شما باید یک نمونه
Camera2SessionConfigImpl
را برگردانید، که شامل لیستی از نمونه هایCamera2OutputConfigImpl
و پارامترهای جلسه مورد استفاده برای پیکربندیCameraCaptureSession
است. شما مسئول ارسال تصاویر دوربین صحیح به سطوح خروجی ارسال شده توسط Camera2/X هستید. در اینجا چند گزینه برای فعال کردن خروجی وجود دارد:- پردازش در دوربین HAL: می توانید سطوح خروجی را مستقیماً با اجرای
SurfaceOutputConfigImpl
بهCameraCaptureSession
اضافه کنید. این سطح خروجی ارائه شده را به خط لوله دوربین پیکربندی می کند و به HAL دوربین اجازه می دهد تا تصویر را پردازش کند. پردازش سطح میانی
ImageReader
(RAW، YUV، و غیره): سطوح میانیImageReader
را با یک نمونهImageReaderOutputConfigImpl
بهCameraCaptureSession
اضافه کنید.شما باید تصاویر میانی را پردازش کنید و تصویر نتیجه را روی سطح خروجی بنویسید.
- استفاده از اشتراکگذاری سطح Camera2: با افزودن هر نمونه
Camera2OutputConfigImpl
به متدgetSurfaceSharingOutputConfigs()
نمونهCamera2OutputConfigImpl
دیگر از اشتراکگذاری سطح با سطح دیگری استفاده کنید. قالب و اندازه سطح باید یکسان باشد.
همه
Camera2OutputConfigImpl
از جملهSurfaceOutputConfigImpl
وImageReaderOutputConfigImpl
باید یک شناسه منحصر به فرد (getId()
) داشته باشند که برای تعیین سطح هدف و بازیابی تصویر ازImageReaderOutputConfigImpl
استفاده می شود.-
onCaptureSessionStart
وRequestProcessorImpl
وقتی
CameraCaptureSession
شروع می شود و چارچوب CameraonConfigured()
را فراخوانی می کند، سپس Camera2/XSessionProcessorImpl.onCaptureSessionStart()
را با پوشش درخواست Camera2RequestProcessImpl
فراخوانی می کند. Camera2/XRequestProcessImpl
را پیادهسازی میکند، که به شما امکان میدهد درخواستهای ضبط را اجرا کنید و در صورت استفاده ازImageReaderOutputConfigImpl
، تصاویر را بازیابی کنید .API های
RequestProcessImpl
از نظر اجرای درخواست ها مشابه API های Camera2CameraCaptureSession
هستند. تفاوت ها عبارتند از:- سطح هدف با شناسه نمونه
Camera2OutputConfigImpl
مشخص می شود. - قابلیت بازیابی تصویر
ImageReader
.
می توانید
RequestProcessorImpl.setImageProcessor()
را با شناسهCamera2OutputConfigImpl
مشخص شده برای ثبت یک نمونهImageProcessorImpl
برای دریافت تصاویر فراخوانی کنید.پس از فراخوانی
SessionProcessorImpl.onCaptureSessionEnd()
توسط Camera2/X، نمونهRequestProcessImpl
نامعتبر می شود.- سطح هدف با شناسه نمونه
پیش نمایش را شروع کنید و عکس بگیرید
در پیاده سازی Advanced Extender، می توانید درخواست های ضبط را از طریق رابط
RequestProcessorImpl
ارسال کنید. Camera2/X به شما اطلاع می دهد که به ترتیب با فراخوانیSessionProcessorImpl#startRepeating
وSessionProcessorImpl#startCapture
درخواست تکراری برای پیش نمایش یا دنباله عکسبرداری را شروع کنید. برای برآورده کردن این درخواستهای پیشنمایش و عکسبرداری باید درخواستهای عکسبرداری ارسال کنید.Camera2/X همچنین پارامترهای درخواست عکسبرداری را از طریق
SessionProcessorImpl#setParameters
تنظیم می کند. شما باید این پارامترهای درخواست را (در صورت پشتیبانی از پارامترها) روی هر دو درخواست تکراری و تکی تنظیم کنید.شما باید حداقل از
CaptureRequest.JPEG_ORIENTATION
وCaptureRequest.JPEG_QUALITY
پشتیبانی کنید.extensions-interface
1.3.0 از کلیدهای درخواست و نتیجه پشتیبانی می کند که با روش های زیر در معرض دید قرار می گیرند:-
AdvancedExtenderImpl.getAvailableCaptureRequestKeys()
-
AdvancedExtenderImpl.getAvailableCaptureResultKeys()
وقتی توسعهدهندگان کلیدها را در لیست
getAvailableCaptureRequestKeys
تنظیم میکنند، باید پارامترها را فعال کنید و مطمئن شوید که نتیجه ضبط شامل کلیدهای لیستgetAvailableCaptureResultKeys
است.-
startTrigger
SessionProcessorImpl.startTrigger()
برای شروع تریگری مانندCaptureRequest.CONTROL_AF_TRIGGER
وCaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER
فراخوانی می شود. میتوانید کلیدهای درخواست ضبط را که درAdvancedExtenderImpl.getAvailableCaptureRequestKeys()
تبلیغ نشدهاند، نادیده بگیرید.startTrigger()
ازextensions-interface
1.3.0 پشتیبانی می شود. برنامهها را قادر میسازد تا با برنامههای افزودنی، ضربه به فوکوس و فلش را اجرا کنند.تمیز کردن
هنگام اتمام یک جلسه ضبط،
SessionProcessorImpl.onCaptureSessionEnd()
قبل از بستنCameraCaptureSession
فراخوانی می شود. پس از بسته شدن جلسه ضبط،deInitSession()
پاکسازی را انجام می دهد.
پشتیبانی از پیش نمایش، عکسبرداری ثابت و تجزیه و تحلیل تصویر
باید افزونه را برای موارد استفاده پیشنمایش و ضبط همچنان اعمال کنید. با این حال، اگر تأخیر بیش از حد زیاد است که پیشنمایش را به آرامی نشان نمیدهد، میتوانید برنامه افزودنی را فقط برای ضبط ثابت اعمال کنید.
برای نوع Basic Extender، صرف نظر از فعال کردن پسوند برای پیش نمایش، باید هر دو ImageCaptureExtenderImpl
و PreviewExtenderImpl
برای یک برنامه افزودنی معین پیاده سازی کنید. اغلب، یک برنامه همچنین از یک جریان YUV برای تجزیه و تحلیل محتوای تصویر مانند یافتن کدهای QR یا متن استفاده می کند. To better support this use case , you should support the stream combination of preview, still capture, and a YUV_420_888
stream for configuring CameraCaptureSession
. This means that if you implement a processor, then you have to support the stream combination of three YUV_420_888
streams.
For Advanced Extender, Camera2/X passes three output surfaces to the SessionProcessorImpl.initSession()
call. These output surfaces are for preview , still capture, and image analysis, respectively. You must ensure that preview and still capture output surfaces show the valid output. However, for the image analysis output surface, ensure it's working only when it's non-null. If your implementation can't support the image analysis stream, you can return an empty list in AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions()
. This ensures the image analysis output surface is always null in SessionProcessorImpl.initSession()
.
Support video capture
The current Camera Extension architecture supports only the preview and still capture use cases. We don't support enabling the extension on the MediaCodec
or MediaRecorder
surfaces for recording the video. However, it's possible for apps to record the preview output.
Supporting MediaCodec
and MediaRecorder
surfaces is under investigation.
Extension-specific metadata
For Android 14 and higher, extension-specific metadata lets camera extension clients set and receive extension specific capture request settings and results. Specifically, camera extension clients can use the EXTENSION_STRENGTH
capture request parameter to control the extension strength and the EXTENSION_CURRENT_TYPE
capture result to indicate the enabled extension type.
Capture requests
The EXTENSION_STRENGTH
capture request parameter controls the strength of the extension post-processing effect. The corresponding capture result includes the default strength value if this parameter isn't set explicitly by the client. This parameter can be applied as follows for these extension types:
-
BOKEH
: Controls the amount of blur. -
HDR
andNIGHT
: Controls the amount of images fused and the brightness of the final image. -
FACE_RETOUCH
: Controls the amount of cosmetic enhancement and skin smoothing.
The supported range for the EXTENSION_STRENGTH
parameter is between 0
and 100
, with 0
indicating no extension processing or simple passthrough and 100
indicating the maximum extension strength of the processing effect.
To add support for EXTENSION_STRENGTH
, use the vendor specific parameter APIs introduced in version 1.3.0 of the extension library interface. For more information, see getAvailableCaptureRequestKeys()
.
Capture results
The EXTENSION_CURRENT_TYPE
capture result lets extension implementations notify clients about the active extension type.
Because extensions using the AUTO
type dynamically switch between extension types such as HDR
and NIGHT
depending on the scene conditions, camera extensions apps can use EXTENSION_CURRENT_TYPE
to display information about the current extension selected by the AUTO
extension.
Real-time still capture latency estimate
For Android 14 and higher, camera extension clients can query real-time still capture latency estimates based on the scene and environment conditions using getRealtimeStillCaptureLatency()
. This method provides more accurate estimates than the static getEstimatedCaptureLatencyRangeMillis()
method. Based on the latency estimate, apps can decide to skip extension processing or to display an indication to notify users about a long running operation.
CameraExtensionSession.StillCaptureLatency latency;
latency = extensionSession.getRealtimeStillCaptureLatency();
// The capture latency from ExtensionCaptureCallback#onCaptureStarted() until ExtensionCaptureCallback#onCaptureProcessStarted().
latency.getCaptureLatency();
// The processing latency from ExtensionCaptureCallback#onCaptureProcessStarted() until the processed frame returns to the client.
latency.getProcessingLatency();
To support real-time still capture latency estimates, implement the following:
- Basic extensions:
ImageCaptureExtenderImpl.getRealtimeCaptureLatency()
- Advanced extensions:
SessionProcessorImpl.getRealtimeCaptureLatency
Capture processing progress callbacks
For Android 14 and higher, camera extension clients can receive callbacks for the progress of long running still capture processing operations. Apps can display the current progress to users to improve the overall user experience.
Apps can use the following code to integrate this feature:
import android.hardware.camera2.CameraExtensionSession.
ExtensionCaptureCallback;
{
…
class AppCallbackImpl extends ExtensionCaptureCallback {
…
@Override
public void onCaptureProcessProgressed(
@NonNull CameraExtensionSession session,
@NonNull CaptureRequest request,
@IntRange(from = 0, to = 100) int progress) {
// Update app UI with current progress
}
}
…
}
To support capture processing progress callbacks, your extension vendor implementation must call the following callbacks with the current progress value:
- Basic extensions:
ProcessResultImpl.onCaptureProcessProgressed()
- Advanced extensions:
CaptureCallback.onCaptureProcessProgressed()
Postview still capture
For Android 14 and higher, camera extensions can supply a postview (preview image) using setPostviewOutputConfiguration
. To improve the user experience, apps can display a postview image as a placeholder when an extension is experiencing increased processing latency, and replace the image when the final image is available. Apps can configure and issue postview capture requests using the following reference code:
{
…
if (!CameraExtensionCharacteristics.isPostviewAvailable()) {
continue;
}
…
ExtensionSessionConfiguration extensionConfiguration = new
ExtensionSessionConfiguration(
CameraExtensionCharacteristics.EXTENSION_NIGHT,
outputConfig,
backgroundExecutor,
extensionSessionStateCallback
);
extensionConfiguration.setPostviewOutputConfiguration(
postviewImageOutput);
…
CaptureRequest.Builder captureRequestBuilder =
cameraDevice.createCaptureRequest(
CameraDevice.TEMPLATE_STILL_CAPTURE);
captureRequestBuilder.addTarget(stillImageReader.getSurface());
captureRequestBuilder.addTarget(postviewImageSurface);
CaptureRequest captureRequest = captureRequestBuilder.build();
…
}
To support postview still capture, your vendor implementation must implement the following:
Basic extensions:
CaptureProcessorImpl.onPostviewOutputSurface
andCaptureProcessorImpl.processWithPostview
Advanced extensions:
SessionProcessorImpl.startCaptureWithPostview
Support SurfaceView output
For Android 14 and higher, camera extension clients can use power and performance optimized preview render paths by registering a SurfaceView
instance for preview output for repeating requests.
To support SurfaceView
output, your vendor extension implementation must be capable of streaming and outputting preview to SurfaceView
instances. To verify that this is supported, run the SurfaceViewExtensionPreviewTest.java
CTS module.
Vendor specific session types
The feature enables vendor extension implementations to select a vendor specific session type that will be set in the internal camera capture session instead of the default value.
The feature works entirely within the framework and vendor stack and has no client/public visible API impact.
To select a vendor-specific session type, implement the following for your extension libraries: * ExtenderStateListener.onSessionType()
for basic extensions * Camera2SessionConfigImpl.getSessionType()
for advanced extensions
Extensions interface version history
The following table shows the Camera Extension interface version history. You should always implement the vendor library with the latest version.
نسخه | Added features |
---|---|
1.0.0 |
|
1.1.0 |
|
1.2.0 |
|
1.3.0 |
|
1.4.0 |
|
پیاده سازی مرجع
The following reference OEM vendor library implementations are available in frameworks/ex
.
advancedSample
: A basic implementation of Advanced Extender.sample
: A basic implementation of Basic Extender.service_based_sample
: An implementation that demonstrates how to host Camera Extensions in aService
. This implementation contains the following components:oem_library
: A Camera Extensions OEM library for Camera2 and CameraX Extensions APIs that implementsExtensions-Interface
. This acts as a passthrough that forwards calls fromExtensions-Interface
to the service. This library also provides AIDL files and wrapper classes to communicate with the service.Advanced Extender is enabled by default. To enable the Basic Extender, change
ExtensionsVersionImpl#isAdvancedExtenderImplemented
to returnfalse
.extensions_service
: A sample implementation of the Extensions Service. Add your implementation here. The interface to implement in the service is similar to theExtensions-Interface
. For example, implementing theIAdvancedExtenderImpl.Stub
performs the same operations asAdvancedExtenderImpl
.ImageWrapper
andTotalCaptureResultWrapper
are required to makeImage
andTotalCaptureResult
parcelable.
Set up the vendor library on a device
The OEM vendor library isn't built into an app; it's loaded from the device at runtime by Camera2/X. In CameraX, the <uses-library>
tag declares that the androidx.camera.extensions.impl
library, which is defined in the AndroidManifest.xml
file of the camera-extensions
library, is a dependency of CameraX and must be loaded at runtime. In Camera2, the framework loads an extensions service that also declares that the <uses-library>
loads the same androidx.camera.extensions.impl
library at runtime.
This allows third-party apps using extensions to automatically load the OEM vendor library. The OEM library is marked as optional so apps can run on devices that don't have the library on the device. Camera2/X handles this behavior automatically when an app tries to use a camera extension as long as the device manufacturer places the OEM library on the device so that it can be discovered by the app.
To set up the OEM library on a device, do the following:
- Add a permission file, which is required by the
<uses-library>
tag, using the following format:/etc/permissions/ ANY_FILENAME .xml
. For example,/etc/permissions/camera_extensions.xml
. The files in this directory provide a mapping of the library named in<uses-library>
to the actual file path on the device. Use the example below to add the required information to the file.
-
name
must beandroidx.camera.extensions.impl
as that's the library that CameraX searches for. -
file
is the absolute path of the file that contains the extensions implementation (for example,/system/framework/androidx.camera.extensions.impl.jar
).
<?xml version="1.0" encoding="utf-8"?> <permissions> <library name="androidx.camera.extensions.impl" file="OEM_IMPLEMENTED_JAR" /> </permissions>
-
In Android 12 or higher, devices supporting CameraX extensions must have the ro.camerax.extensions.enabled
property set to true
, which allows for querying whether a device supports extensions. To do this, add the following line in the device make file:
PRODUCT_VENDOR_PROPERTIES += \
ro.camerax.extensions.enabled=true \
اعتبار سنجی
To test your implementation of the OEM vendor library during the development stage, use the example app at androidx-main/camera/integration-tests/extensionstestapp/
, which runs through various vendor extensions.
After you complete your implementation, use the camera extensions validation tool to run automated and manual tests to verify that the vendor library is implemented correctly.
Extended scene mode versus camera extensions
For the bokeh extension, in addition to exposing it using camera extensions, you can expose the extension using the extended scene mode, which is enabled through the CONTROL_EXTENDED_SCENE_MODE
key. For more implementation details, see Camera bokeh .
Extended scene mode has fewer restrictions compared to camera extensions for camera2 apps. For example, you can enable extended scene mode in a regular CameraCaptureSession
instance that supports flexible stream combinations and capture request parameters. In contrast, camera extensions support only a fixed set of stream types and have limited support for capture request parameters.
A downside of extended scene mode is that you can only implement it in the camera HAL, which means that it must be verified to work across all orthogonal controls available to app developers.
We recommend exposing bokeh using both the extended scene mode and Camera Extensions because apps might prefer to use a particular API to enable bokeh. We recommend first using the extended scene mode because this is the most flexible way for apps to enable the bokeh extension. Then you can implement the camera extensions interface based on the extended scene mode. If implementing bokeh in the camera HAL is difficult, for example, because it requires a post processor running in the app layer to process images, we recommend implementing the bokeh extension using the Camera Extensions interface.
سوالات متداول (سؤالات متداول)
Are there any restrictions on API levels?
بله. This depends on the Android API feature set that's required by the OEM vendor library implementation. For example, ExtenderStateListener.onPresetSession()
uses the SessionConfiguration.setSessionParameters()
call to set a baseline set of tags. This call is available only on API level 28 and higher. For details on specific interface methods, see the API reference documentation .