בדף הזה מתואר תת-המערכת HAL, כולל בקשות, תת-מערכת המצלמה, רצף ההפעלה והפעולה, רמות החומרה והאינטראקציות.
בקשות
מסגרת האפליקציה שולחת בקשות לתוצאות שצולמו למערכת המשנה של המצלמה. כל בקשה מתאימה לקבוצת תוצאות אחת. הבקשה כוללת את כל פרטי ההגדרה לגבי איסוף התוצאות ועיבודן. המידע הזה כולל דברים כמו רזולוציה ופורמט פיקסלים, חיישן ידני, עדשה, שליטה בפלאש, מצבי הפעלה של 3A, שליטה בעיבוד RAW ל-YUV ויצירת נתונים סטטיסטיים. כך אפשר לשלוט הרבה יותר בתוצאות של הפלט והעיבוד. אפשר להגיש כמה בקשות בו-זמנית, והגשת הבקשות לא חוסמת את הפעולות האחרות. הבקשות תמיד מטופלות בסדר שבו הן מתקבלות.
איור 1. דגם המצלמה.
HAL ותת-מערכת המצלמה
מערכת המשנה של המצלמה כוללת את ההטמעות של רכיבים בצינור של המצלמה כמו אלגוריתם 3A ואמצעי בקרה לעיבוד. HAL המצלמה מספק ממשקים להטמעה של הגרסאות של הרכיבים האלה. כדי לשמור על תאימות בין פלטפורמות שונות של יצרני מכשירים שונים וספקי מעבדי אותות תמונה (ISP, או חיישן מצלמה), מודל צינור המצלמה הוא וירטואלי ולא תואם ישירות לאף ISP אמיתי. עם זאת, הוא דומה מספיק לצינורות עיבוד אמיתיים, כך שאפשר למפות אותו לחומרה שלכם בצורה יעילה. בנוסף, הוא מספיק מופשט כדי לאפשר שימוש באלגוריתמים שונים ובסדר פעולות שונה, בלי להתפשר על האיכות, היעילות או התאימות מקושר למכשיר אחר.
צינור המצלמה תומך גם בטריגרים שמסגרת האפליקציה יכולה להפעיל כדי להפעיל דברים כמו פוקוס אוטומטי. הוא גם שולח התראות בחזרה למסגרת האפליקציה, כדי להודיע לאפליקציות על אירועים כמו נעילת פוקוס אוטומטי או שגיאות.
איור 2. פייפליין של המצלמה.
הערה: חלק מהבלוקים של עיבוד התמונות שמוצגים בתרשים שלמעלה לא מוגדרים היטב בגרסה הראשונית. ההנחות הבאות מבוססות על צינור העיבוד של המצלמה:
- פלט RAW Bayer לא עובר עיבוד בתוך ה-ISP.
- הנתונים הסטטיסטיים נוצרים על סמך נתוני החיישנים הגולמיים.
- בלוקי העיבוד השונים שממירים את נתוני החיישן הגולמיים ל-YUV מסודרים בסדר שרירותי.
- למרות שמוצגות כמה יחידות של שינוי גודל וחיתוך, כל יחידות שינוי הגודל חולקות את אותם אמצעי בקרה של אזור הפלט (זום דיגיטלי). עם זאת, לכל יחידה יכולה להיות רזולוציית פלט ופורמט פיקסלים שונים.
סיכום השימוש ב-API
זהו סיכום קצר של השלבים לשימוש ב-Android Camera API. בקטע 'רצף ההפעלה והפעולה הצפוי' מפורטים השלבים האלה, כולל קריאות ל-API.
- האזנה למכשירי מצלמה וספירתם.
- פותחים את המכשיר ומחברים את האוזניות.
- מגדירים את הפלט לתרחיש השימוש הרצוי (למשל, צילום תמונה או הקלטה).
- יצירת בקשות לתרחיש שימוש ספציפי.
- תיעוד/חזרה על בקשות ופרצי תנועה.
- קבלת מטא-נתונים של התוצאה ונתוני תמונה.
- כשעוברים לתרחיש שימוש אחר, חוזרים לשלב 3.
סיכום פעולות HAL
- בקשות אסינכרוניות לצילום מסך מגיעות מהמסגרת.
- מכשיר HAL צריך לעבד בקשות לפי הסדר. לכל בקשה, צריך ליצור מטא-נתונים של תוצאת הפלט ומאגר אחד או יותר של תמונות פלט.
- הבקשות והתוצאות מועברות לפי סדר קבלתן, וגם הסטרימים שאליהם מתייחסות בקשות עוקבות.
- חותמות הזמן צריכות להיות זהות בכל הפלט של בקשה מסוימת, כדי שהמסגרת תוכל להתאים אותן אחת לשנייה אם צריך.
- כל ההגדרות והמצבים של הלכידה (חוץ משגרות 3A) מוצפנים בבקשות ובתוצאות.
איור 3. סקירה כללית של Camera HAL.
רצף ההפעלה והפעולה הצפוי
בקטע הזה מוסבר בפירוט מה צריך לעשות כשמשתמשים בממשק ה-API של המצלמה. הגדרות של ממשקי HIDL זמינות בכתובת platform/hardware/interfaces/camera/.
מנייה, פתיחה של מכשירי מצלמה ויצירה של סשן פעיל
- אחרי האתחול, המסגרת מתחילה להאזין לכל ספקי המצלמות הנוכחיים שמטמיעים את הממשק
ICameraProvider. אם יש ספק או ספקים כאלה, המסגרת מנסה ליצור חיבור. - המסגרת מפרטת את מכשירי המצלמה באמצעות
ICameraProvider::getCameraIdList. - המסגרת יוצרת מופע חדש של
ICameraDeviceעל ידי קריאה ל-ICameraProvider::getCameraDeviceInterface_VX_Xהמתאים. - המסגרת קוראת ל-
ICameraDevice::openכדי ליצור סשן פעיל חדש של לכידה ICameraDeviceSession.
שימוש בסשן פעיל של המצלמה
- המסגרת קוראת ל-
ICameraDeviceSession::configureStreamsעם רשימה של זרמי קלט/פלט למכשיר HAL. - המסגרת מבקשת הגדרות ברירת מחדל לכמה תרחישי שימוש באמצעות קריאות ל-
ICameraDeviceSession::constructDefaultRequestSettings. המצב הזה יכול להתרחש בכל שלב אחרי ש-ICameraDevice::openיוצר אתICameraDeviceSession. - המסגרת בונה ושולחת את בקשת הצילום הראשונה ל-HAL עם הגדרות שמבוססות על אחת מקבוצות הגדרות ברירת המחדל, ועם לפחות זרם פלט אחד שנרשם קודם על ידי המסגרת. הוא נשלח ל-HAL עם
ICameraDeviceSession::processCaptureRequest. שכבת ה-HAL צריכה לחסום את החזרה של השיחה הזו עד שהיא תהיה מוכנה לשליחת הבקשה הבאה. - המסגרת ממשיכה לשלוח בקשות ושיחות
ICameraDeviceSession::constructDefaultRequestSettingsכדי לקבל מאגרי הגדרות ברירת מחדל לתרחישי שימוש אחרים לפי הצורך. - כשמתחילים לצלם תמונה (החיישן מתחיל את החשיפה לצילום), ה-HAL קורא ל-
ICameraDeviceCallback::notifyעם הודעת הצילום, כולל מספר הפריים וחותמת הזמן של תחילת החשיפה. הקריאה החוזרת (callback) של ההודעה הזו לא חייבת להתרחש לפני הקריאה הראשונה שלprocessCaptureResultלבקשה, אבל לא מועברים תוצאות לאפליקציה לצילום עד שמתבצעת קריאה שלnotifyלצילום הזה. - אחרי עיכוב מסוים בצינור, ה-HAL מתחיל להחזיר ל-framework לכידות שהושלמו עם
ICameraDeviceCallback::processCaptureResult. התשובות מוחזרות באותו סדר שבו נשלחו הבקשות. יכולות להיות כמה בקשות פעילות בו-זמנית, בהתאם לעומק צינור העיבוד של מכשיר ה-HAL של המצלמה.
אחרי זמן מה, אחת מהאפשרויות הבאות מתרחשת:
- המסגרת מפסיקה לשלוח בקשות חדשות, מחכה שהלכידות הקיימות יושלמו (כל המאגרים יתמלאו, כל התוצאות יוחזרו), ואז קוראת שוב ל-
ICameraDeviceSession::configureStreams. הפעולה הזו מאפסת את חומרת המצלמה ואת צינור הנתונים שלה כדי ליצור קבוצה חדשה של זרמי קלט/פלט. אפשר להשתמש שוב בחלק מהשידורים מההגדרה הקודמת. לאחר מכן, המסגרת ממשיכה מבקשת הלכידה הראשונה אל HAL, אם נשאר לפחות פלט אחד רשום. (אחרת, קודם צריך להזין אתICameraDeviceSession::configureStreams). - ה-framework יכול לקרוא ל-
ICameraDeviceSession::closeכדי לסיים את סשן המצלמה. אפשר לקרוא לפונקציה הזו בכל שלב שבו אין שיחות אחרות פעילות מהמסגרת, אבל יכול להיות שהקריאה תיחסם עד שכל הלכידות הפעילות יושלמו (כל התוצאות יוחזרו, כל המאגרים ימולאו). אחרי שהקריאה ל-closeחוזרת, לא ניתן לבצע יותר קריאות ל-ICameraDeviceCallbackמ-HAL. אחרי שמתחילהcloseשיחה, המסגרת לא יכולה לקרוא לפונקציות אחרות של מכשיר HAL. - במקרה של שגיאה או אירוע אסינכרוני אחר, שכבת ה-HAL צריכה לקרוא ל-
ICameraDeviceCallback::notifyעם הודעת השגיאה או האירוע המתאימה. אחרי חזרה מהתראה על שגיאה קריטית במכשיר, שכבת ה-HAL צריכה לפעול כאילו בוצעה בה קריאה ל-close. עם זאת, ה-HAL חייב לבטל או להשלים את כל הלכידות התלויות ועומדות לפני הפעלתnotify, כדי שלאחר הפעלתnotifyעם שגיאה חמורה, המסגרת לא תקבל עוד קריאות חוזרות מהמכשיר. שיטות אחרות מלבדcloseצריכות להחזיר-ENODEVאוNULLאחרי שהשיטהnotifyמחזירה הודעת שגיאה חמורה.
איור 4. תהליך הפעולה של המצלמה.
רמות חומרה
מכשירי מצלמה יכולים להטמיע כמה רמות חומרה בהתאם ליכולות שלהם. מידע נוסף זמין במאמר בנושא רמת החומרה הנתמכת.
אינטראקציה בין בקשת לכידת האפליקציה, בקרת 3A וצינור העיבוד
בהתאם להגדרות בבלוק הבקרה של 3A, צינור הנתונים של המצלמה מתעלם מחלק מהפרמטרים בבקשת הצילום של האפליקציה ומשתמש בערכים שסופקו על ידי שגרות הבקרה של 3A. לדוגמה, כשחשיפה אוטומטית פעילה, הפרמטרים של זמן החשיפה, משך הפריימים והרגישות של החיישן נשלטים על ידי אלגוריתם 3A של הפלטפורמה, וכל הערכים שצוינו באפליקציה מתעלמים. הערכים שנבחרו למסגרת על ידי שגרות ה-3A צריכים להיות מדווחים במטא-נתונים של הפלט. בטבלה הבאה מתוארים המצבים השונים של בלוק הבקרה 3A והמאפיינים שמנוהלים על ידי המצבים האלה. הגדרות הנכסים האלה מופיעות בקובץ platform/system/media/camera/docs/docs.html.
| פרמטר | מדינה | מאפיינים מבוקרים |
|---|---|---|
android.control.aeMode |
OFF |
ללא. |
ON |
android.sensor.exposureTime, android.sensor.frameDuration, android.sensor.sensitivity, android.lens.aperture (אם נתמך) ו-android.lens.filterDensity (אם נתמך). |
|
ON_AUTO_FLASH |
כל התכונות שכלולות בתוכנית ON, בתוספת android.flash.firingPower,
android.flash.firingTime ו-android.flash.mode. |
|
ON_ALWAYS_FLASH |
בדיוק כמו ב-ON_AUTO_FLASH. |
|
ON_AUTO_FLASH_RED_EYE |
בדיוק כמו ב-ON_AUTO_FLASH. |
|
android.control.awbMode |
OFF |
ללא. |
WHITE_BALANCE_* |
android.colorCorrection.transform. התאמות ספציפיות לפלטפורמה אם הערך של android.colorCorrection.mode הוא FAST או HIGH_QUALITY. |
|
android.control.afMode |
OFF |
ללא |
FOCUS_MODE_* |
android.lens.focusDistance |
|
android.control.videoStabilization |
OFF |
ללא. |
ON |
אפשר לכוון את android.scaler.cropRegion כדי להפעיל ייצוב וידאו. |
|
android.control.mode |
OFF |
התכונות AE, AWB ו-AF מושבתות. |
AUTO |
נעשה שימוש בהגדרות נפרדות של AE, AWB ו-AF. | |
SCENE_MODE_* |
אפשר להגדיר ערכים חלופיים לכל הפרמטרים שצוינו למעלה. אמצעי הבקרה האישיים של 3A מושבתים. |
הפקדים בבלוק של עיבוד התמונה באיור 2 פועלים כולם על אותו עיקרון, ולכל בלוק יש שלושה מצבים:
-
OFF: חסימת העיבוד הזו מושבתת. אי אפשר להשבית את הבלוקים של הסרת הפסיפס, תיקון הצבע והתאמת עקומת הטונים. -
FAST: במצב הזה, יכול להיות שבלוק העיבוד לא יאט את קצב הפריימים של הפלט בהשוואה למצבOFF, אבל הוא אמור להפיק את הפלט באיכות הכי טובה שאפשר בהתחשב בהגבלה הזו. בדרך כלל, משתמשים באפשרות הזו במצבי תצוגה מקדימה או הקלטת סרטונים, או בצילום רצף של תמונות סטילס. במכשירים מסוימים, יכול להיות שזה יהיה שווה ערך למצבOFF(אי אפשר לבצע עיבוד בלי להאט את קצב הפריימים), ובמכשירים אחרים, יכול להיות שזה יהיה שווה ערך למצבHIGH_QUALITY(האיכות הכי טובה עדיין לא מאטה את קצב הפריימים). -
HIGH_QUALITY: במצב הזה, בלוק העיבוד צריך להפיק את התוצאה האיכותית ביותר שאפשר, ולהאט את קצב הפריימים של הפלט לפי הצורך. בדרך כלל, משתמשים בזה כדי לצלם תמונות באיכות גבוהה. חלק מהבלוקים כוללים אמצעי בקרה ידני שאפשר לבחור בו במקוםFASTאוHIGH_QUALITY. לדוגמה, בלוק תיקון הצבע תומך במטריצת טרנספורמציה של צבע, בעוד שהתאמת עקומת הטונים תומכת בעקומת מיפוי טונים גלובלית שרירותית.
קצב הפריימים המקסימלי שיכול להיות נתמך על ידי מערכת משנה של מצלמה הוא פונקציה של הרבה גורמים:
- הרזולוציות המבוקשות של זרמי תמונות הפלט
- זמינות של מצבי איגום/דילוג בחיישן התמונה
- רוחב הפס של ממשק המצלמה
- רוחב הפס של בלוקי העיבוד השונים של ספקי האינטרנט
הגורמים האלה משתנים מאוד בין ספקי אינטרנט וחיישנים שונים, ולכן ממשק HAL של המצלמה מנסה להפשיט את הגבלות רוחב הפס למודל פשוט ככל האפשר. למודל שמוצג יש את המאפיינים הבאים:
- חיישן התמונה תמיד מוגדר להפקת הרזולוציה הקטנה ביותר האפשרית בהתחשב בגדלים של זרם הפלט שהאפליקציה מבקשת. ההגדרה של הרזולוציה הקטנה ביותר היא לפחות בגודל של זרם הפלט הגדול ביותר שנדרש.
- כל בקשה יכולה להשתמש בכל שידורי הפלט שהוגדרו כרגע, או בחלק מהם, לכן חייבים להגדיר את החיישן ואת ספק שירותי האינטרנט כך שיתמכו בהרחבת לכידה יחידה לכל השידורים בו-זמנית.
- זרמי JPEG מתנהגים כמו זרמי YUV שעברו עיבוד בבקשות שבהן הם לא נכללים. בבקשות שבהן יש הפניה ישירה אליהם, הם מתנהגים כמו זרמי JPEG.
- מעבד ה-JPEG יכול לפעול במקביל לשאר צינור העיבוד של המצלמה, אבל הוא לא יכול לעבד יותר מתמונה אחת בכל פעם.