שכבת ההפשטה של חומרת המצלמה (HAL) ב-Android מחברת את ממשקי ה-API ברמה הגבוהה יותר של מסגרת המצלמה ב-android.hardware.camera2 למנהל ולחומרה של המצלמה. החל מ-Android 13, הפיתוח של ממשק ה-HAL של המצלמה מתבצע באמצעות AIDL. ב-Android 8.0 הושקו Treble, ומחליפים את Camera HAL API לממשק יציב המוגדר על ידי שפת התיאור של ממשק ה-HAL (HIDL). אם פיתחתם בעבר מודול HAL ומנהל של מצלמה ל-Android 7.0 וגרסאות ישנות יותר, חשוב לדעת שיש שינויים משמעותיים בצינור עיבוד הנתונים של המצלמה.
מצלמת AIDL עם סיומת HAL
במכשירים עם Android מגרסה 13 ואילך, מסגרת המצלמה כוללת תמיכה ב-HALs של מצלמת AIDL. מסגרת המצלמה תומכת גם ב-HAL של מצלמה מסוג HIDL, אבל תכונות המצלמה שנוספו ב-Android 13 ואילך זמינות רק דרך ממשקי ה-HAL של מצלמה מסוג AIDL. כדי להטמיע תכונות כאלה במכשירים שמשדרגים ל-Android 13 ואילך, יצרני המכשירים צריכים להעביר את תהליך HAL שלהם משימוש בממשקים של מצלמות HIDL לממשקי מצלמות AIDL.
במאמר AIDL ל-HALs מוסבר על היתרונות של AIDL.
הטמעת HAL של מצלמה ב-AIDL
להטמעה לדוגמה של HAL של מצלמה ב-AIDL, ראו
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 של Android (sepolicy) ואת קובצי ה-RC, בהתאם למבנה הקוד.
אימות HAL של מצלמת AIDL
כדי לבדוק את ההטמעה של HAL למצלמה של AIDL, צריך לוודא שהמכשיר עובר את כל הבדיקות של CTS ו-VTS. ב-Android 13 מופיע הבדיקה AIDL VTS,
VtsAidlHalCameraProvider_TargetTest.cpp
.
תכונות של Camera HAL3
מטרת העיצוב מחדש של Android Camera API היא לשפר באופן משמעותי את היכולת של אפליקציות לשלוט במערכת המשנה של המצלמה במכשירי Android, תוך ארגון מחדש של ה-API כדי שיהיה יעיל יותר וקל יותר לתחזוקה. אמצעי הבקרה הנוספים מאפשרים ליצור בקלות אפליקציות מצלמה באיכות גבוהה במכשירי Android, שיכולות לפעול באופן אמין במספר מוצרים, תוך שימוש באלגוריתמים ספציפיים למכשיר בכל הזדמנות אפשרית כדי למקסם את האיכות והביצועים.
בגרסה 3 של מערכת המשנה של המצלמה, מצבי הפעולה מחולקים לתצוגה מאוחדת אחת, שאפשר להשתמש בה כדי להטמיע כל אחד מהמצבים הקודמים ועוד כמה מצבים, כמו מצב צילום רצוף. כך המשתמשים יכולים לשלוט טוב יותר בפוקוס ובחשיפה, ולבצע יותר עיבוד לאחר הצילום, כמו הפחתת רעש, הגברת הניגודיות והחדרה. בנוסף, התצוגה הפשוטה הזו מאפשרת למפתחי האפליקציות להשתמש בקלות רבה יותר בפונקציות השונות של המצלמה.
ה-API יוצר מודל של מערכת המשנה של המצלמה כצינור עיבוד נתונים שממיר בקשות נכנסות לצילום פריים לפריימים, על בסיס 1:1. הבקשות מכילות את כל פרטי ההגדרה של הצילום והעיבוד של הפריים. המידע הזה כולל רזולוציה ופורמט פיקסלים, שליטה ידנית בחיישן, בעדשה ובפלאש, מצבי הפעלה של 3A, בקרת עיבוד מ-RAW ל-YUV, יצירת נתונים סטטיסטיים ועוד.
במילים פשוטות, מסגרת האפליקציה מבקשת מסגרת מהתת-מערכת של המצלמה, ותת-מערכת המצלמה מחזירה תוצאות לזרם פלט. בנוסף, לכל קבוצת תוצאות נוצרים מטא-נתונים שמכילים מידע כמו מרחבי צבעים והצללה של עדשות. אפשר לחשוב על מצלמה בגרסה 3 בתור צינור עיבוד נתונים לשידור החד-כיווני של מצלמה בגרסה 1. הוא ממיר כל בקשת צילום לתמונה אחת שמצולמת על ידי החיישן, שעוברת עיבוד ליצירת:
- אובייקט תוצאה עם מטא-נתונים על הצילום.
- מאגרים (buffers) של נתוני תמונות, אחד עד N, כל אחד בשטח יעד משלו.
הקבוצה של פלטפורמות הפלט האפשריות מוגדרת מראש:
- כל משטח הוא יעד לזרם של מאגרי תמונות ברזולוציה קבועה.
- אפשר להגדיר רק מספר קטן של פלטפורמות כפלט בבת אחת (כ-3).
בקשה מכילה את כל הגדרות הצילום הרצויות ואת רשימת פלט המשטחים שצריך לדחוף אליהם את מאגרי הנתונים של התמונות עבור הבקשה הזו (מתוך הקבוצה הכוללת שהוגדרה). בקשה יכולה להיות חד-פעמית (עם capture()
) או לחזור על עצמה ללא הגבלת זמן (עם setRepeatingRequest()
). לצילום יש עדיפות על פני בקשות חוזרות.
סקירה כללית על Camera HAL1
גרסת 1 של מערכת המשנה של המצלמה תוכננה כקופסה שחורה עם אמצעי בקרה ברמה גבוהה ושלושת מצבי ההפעלה הבאים:
- תצוגה מקדימה
- הקלטת וידאו
- צילום סטילס
לכל מצב יש יכולות שונות במקצת וחופפות. לכן היה קשה להטמיע תכונות חדשות כמו מצב צילום רצוף, שנמצא בין שני מצבי הפעולה.
Android 7.0 ממשיך לתמוך ב-HAL1 של המצלמה, כי עדיין יש הרבה מכשירים שמסתמכים עליו. בנוסף, שירות המצלמה של Android תומך בהטמעה של שתי ממשקי ה-HAL (1 ו-3). הדבר שימושי כשרוצים לתמוך במצלמה קדמית עם יכולות נמוכות יותר באמצעות camera HAL1 ובמצלמה אחורית מתקדמת יותר באמצעות camera HAL3.
יש מודול יחיד של HAL למצלמה (עם מספר גרסה משלו), שמפרט כמה מכשירים עצמאיים של מצלמה, לכל אחד מהם מספר גרסה משלו. כדי לתמוך במכשירים מגרסה 2 ואילך, נדרשת מודול מצלמה מגרסה 2 ואילך. מודולים כאלה יכולים לכלול שילוב של גרסאות של מכשירי מצלמה (זה מה שאנחנו מתכוונים אליו כשאנחנו אומרים ש-Android תומך בהטמעה של שתי ה-HAL).