מצלמה עם HAL

שכבת ההפשטה של חומרת המצלמה (HAL) ב-Android מחברת את ממשקי ה-API ברמה הגבוהה יותר של מסגרת המצלמה ב-android.hardware.camera2 למנהל ולחומרה של המצלמה. החל מ-Android 13, הפיתוח של ממשק ה-HAL של המצלמה מתבצע באמצעות AIDL. ב-Android 8.0 הושק Treble, שעבר את Camera HAL API לממשק יציב שמוגדר על ידי שפת התיאור של ממשק HAL‏ (HIDL). אם פיתחתם בעבר מודול HAL ומנהל של מצלמה ל-Android 7.0 וגרסאות ישנות יותר, חשוב לדעת שיש שינויים משמעותיים בצינור עיבוד הנתונים של המצלמה.

AIDL camera HAL

במכשירים עם Android מגרסה 13 ואילך, מסגרת המצלמה כוללת תמיכה ב-HAL של מצלמת AIDL. מסגרת המצלמה תומכת גם ב-HAL של מצלמה מסוג HIDL, אבל תכונות המצלמה שנוספו ב-Android 13 ואילך זמינות רק דרך ממשקי ה-HAL של מצלמה מסוג AIDL. כדי להטמיע תכונות כאלה במכשירים ששודרגו ל-Android 13 ואילך, יצרני המכשירים צריכים להעביר את תהליך ה-HAL שלהם משימוש בממשקי מצלמה של HIDL לממשקי מצלמה של AIDL.

למידע נוסף על היתרונות של AIDL, ראו AIDL ל-HALs.

הטמעת HAL של מצלמה ב-AIDL

להטמעה לדוגמה של HAL למצלמה של AIDL, ראו hardware/google/camera/common/hal/aidl_service/.

המפרטים של HAL למצלמה של 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()). לצילום יש עדיפות על פני בקשות חוזרות.

מודל נתונים של מצלמה

איור 1. מודל הליבה של פעולות המצלמה

סקירה כללית על Camera HAL1

גרסת 1 של מערכת המשנה של המצלמה תוכננה כקופסה שחורה עם אמצעי בקרה ברמה גבוהה ושלושת מצבי ההפעלה הבאים:

  • תצוגה מקדימה
  • הקלטת וידאו
  • צילום סטילס

לכל מצב יש יכולות שונות במקצת וחופפות. לכן היה קשה להטמיע תכונות חדשות כמו מצב צילום רצוף, שנמצא בין שני מצבי הפעולה.

תרשים זרימה של מצלמה

איור 2. רכיבי המצלמה

מערכת Android 7.0 ממשיכה לתמוך ב-HAL1 של המצלמה, כי עדיין יש הרבה מכשירים שמסתמכים עליו. בנוסף, שירות המצלמה של Android תומך בהטמעה של שתי ממשקי ה-HAL (1 ו-3). הדבר שימושי כשרוצים לתמוך במצלמה קדמית עם יכולות נמוכות יותר באמצעות camera HAL1 ובמצלמה אחורית מתקדמת יותר באמצעות camera HAL3.

יש מודול יחיד של HAL למצלמה (עם מספר גרסה משלו), שמפרט כמה מכשירים עצמאיים של מצלמות, לכל אחד מהם מספר גרסה משלו. כדי לתמוך במכשירים מגרסה 2 ואילך, נדרשת מודול מצלמה מגרסה 2 ואילך. מודולים כאלה יכולים לכלול שילוב של גרסאות של מכשירי מצלמה (זה מה שאנחנו מתכוונים אליו כשאנחנו אומרים ש-Android תומך בהטמעה של שתי ה-HAL).