בקשות
מסגרת האפליקציה שולחת בקשות לקבלת תוצאות שצולמו למערכת המשנה של המצלמה. בקשה אחת תוביל לקבוצת תוצאות אחת. בקשה מכילה את כל פרטי ההגדרה של תיעוד התוצאות ועיבודן. האפשרויות האלה כוללות, בין היתר, רזולוציה ופורמט פיקסלים, שליטה ידנית בחיישן, בעדשה ובפלאש, מצבי הפעלה של 3A, שליטה בעיבוד מ-RAW ל-YUV ויצירת נתונים סטטיסטיים. כך אפשר לשלוט הרבה יותר בתוצאות ובעיבוד שלהן. אפשר לשלוח כמה בקשות בו-זמנית, והשליחה שלהן לא גורמת לחסימה. הבקשות תמיד מטופלות לפי הסדר שבו הן מתקבלות.

איור 1. דגם מצלמה
HAL ומערכת משנה של מצלמה
מערכת המשנה של המצלמה כוללת את ההטמעות של הרכיבים בצינור עיבוד הנתונים של המצלמה, כמו אלגוריתם ה-3A ואמצעי הבקרה על העיבוד. ה-HAL של המצלמה מספק ממשקים להטמעת הגרסאות שלכם לרכיבים האלה. כדי לשמור על תאימות בפלטפורמות שונות בין יצרני מכשירים שונים לבין ספקי מעבדי אותות תמונה (ISP או חיישן מצלמה), מודל צינור עיבוד הנתונים של המצלמה הוא וירטואלי ולא תואם ישירות לאף מעבד אותות תמונה אמיתי. עם זאת, הוא דומה מספיק לצינורות עיבוד אמיתיים, כך שאפשר למפות אותו לחומרה בצורה יעילה. בנוסף, הוא מספיק מופשט כדי לאפשר שימוש במספר אלגוריתמים שונים וסדרי פעולה שונים, בלי להתפשר על האיכות, היעילות או התאימות למכשירים שונים.
צינור עיבוד הנתונים של המצלמה תומך גם בטריגרים שאפשר להפעיל באמצעות מסגרת האפליקציה כדי להפעיל תכונות כמו פוקוס אוטומטי. הוא גם שולח התראות חזרה למסגרת האפליקציה, ומעדכן את האפליקציות באירועים כמו נעילה של המיקוד האוטומטי או שגיאות.

איור 2. צינור עיבוד נתונים של מצלמה
חשוב לזכור שחלק מהבלוקים של עיבוד התמונות שמוצגים בתרשים שלמעלה לא מוגדרים בצורה ברורה במהדורה הראשונית. צינור עיבוד הנתונים של המצלמה מבוסס על ההנחות הבאות:
- פלט Bayer בפורמט RAW לא עובר עיבוד בתוך ה-ISP.
- הנתונים הסטטיסטיים נוצרים על סמך נתוני החיישן הגולמיים.
- בלוקים שונים של עיבוד שממירים נתוני חיישן גולמיים ל-YUV נמצאים בסדר שרירותי.
- מוצגות כמה יחידות של שינוי קנה מידה וחיתוך, אבל כל יחידות השינוי משתפות את אמצעי הבקרה של אזור הפלט (זום דיגיטלי). עם זאת, לכל יחידה יכולה להיות רזולוציית פלט ופורמט פיקסלים שונים.
סיכום של השימוש ב-API
זהו סיכום קצר של השלבים לשימוש ב-Android camera API. בקטע Startup and expected operation sequence מפורט פירוט של השלבים האלה, כולל קריאות ל-API.
- האזנה למכשירי מצלמה וספירה שלהם.
- פותחים את המכשיר ומחברים את המאזינים.
- מגדירים את הפלט לתרחיש היעד (למשל, צילום סטילס, הקלטה וכו').
- יוצרים בקשות למקרה השימוש הרצוי.
- תיעוד/חזרה על בקשות ועל אירועים קצרים.
- קבלת מטא-נתונים של תוצאות ונתוני תמונות.
- כשעוברים בין תרחישים לדוגמה, חוזרים לשלב 3.
סיכום של פעולות HAL
- בקשות אסינכרוניות לצילום מגיעות מהמסגרת.
- מכשיר HAL חייב לעבד את הבקשות לפי הסדר. לכל בקשה, יוצרים מטא-נתונים של תוצאות הפלט ומאגר אחד או יותר של תמונות פלט.
- 'קודם נכנס, קודם יוצא' לבקשות ולתוצאות, ולסטרימינג שמפנים אליו בקשות עוקבות.
- חותמות הזמן צריכות להיות זהות לכל הפלט של בקשה מסוימת, כדי שהמסגרת תוכל להתאים אותן במקרה הצורך.
- כל ההגדרות והמצב של הצילום (למעט התרחישים של 3A) מוטמעים בבקשות ובתוצאות.

איור 3. סקירה כללית על Camera HAL
הפעלה ורצף הפעולות הצפוי
בקטע הזה מוסבר בפירוט מהם השלבים הצפויים כשמשתמשים ב-Camera API. הגדרות הממשק של HIDL מפורטות במאמר platform/hardware/interfaces/camera/.
ספירה של מכשירי מצלמה, פתיחת המכשירים ויצירת סשן פעיל
- אחרי האיפוס, המסגרת מתחילה להאזין לכל ספקי המצלמות שנמצאים בסביבה ומטמיעים את הממשק
ICameraProvider
. אם יש ספק או ספקים כאלה, המסגרת תנסה ליצור חיבור. - המסגרת מפרטת את מכשירי המצלמה באמצעות
ICameraProvider::getCameraIdList()
. - המסגרת יוצרת מופע חדש של
ICameraDevice
באמצעות קריאה ל-ICameraProvider::getCameraDeviceInterface_VX_X()
המתאים. - המסגרת קוראת ל-
ICameraDevice::open()
כדי ליצור סשן צילום פעיל חדש מסוג ICameraDeviceSession.
שימוש בסשן פעיל של המצלמה
- המסגרת קוראת ל-
ICameraDeviceSession::configureStreams()
עם רשימה של מקורות קלט/פלט למכשיר ה-HAL. - המסגרת מבקשת הגדרות ברירת מחדל לתרחישי שימוש מסוימים באמצעות קריאות ל-
ICameraDeviceSession::constructDefaultRequestSettings()
. זה יכול לקרות בכל שלב אחרי ש-ICameraDeviceSession
נוצר על ידיICameraDevice::open
. - המסגרת יוצרת את בקשת הצילום הראשונה ושולחת אותה ל-HAL עם הגדרות שמבוססות על אחת מקבוצות הגדרות ברירת המחדל, ועם לפחות אחד מזרמי הפלט שרשומים מוקדם יותר על ידי המסגרת. הוא נשלח ל-HAL באמצעות
ICameraDeviceSession::processCaptureRequest()
. ה-HAL צריך לחסום את החזרת הקריאה הזו עד שהוא יהיה מוכן לשליחת הבקשה הבאה. - המסגרת ממשיכה לשלוח בקשות וקריאות ל-
ICameraDeviceSession::constructDefaultRequestSettings()
כדי לקבל מאגרים של הגדרות ברירת מחדל לתרחישי שימוש אחרים לפי הצורך. - כשהצילום של בקשה מתחיל (החיישן מתחיל לחשוף את התמונה לצורך הצילום), ה-HAL קורא ל-
ICameraDeviceCallback::notify()
עם הודעת SHUTTER, כולל מספר המסגרת וחותמת הזמן של תחילת החשיפה. אין צורך שהקריאה החוזרת של ההודעה תתבצע לפני הקריאה הראשונה שלprocessCaptureResult()
לבקשה, אבל לא יישלחו תוצאות לאפליקציה עבור צילום עד לאחר הקריאה שלnotify()
לצילום הזה. - אחרי עיכוב מסוים בצינור עיבוד הנתונים, ה-HAL מתחיל להחזיר ל-framework את התמונות המצולמות באמצעות
ICameraDeviceCallback::processCaptureResult()
. התשובות יישלחו באותו הסדר שבו הבקשות נשלחו. ניתן לשלוח כמה בקשות בו-זמנית, בהתאם לעומק צינור עיבוד הנתונים של מכשיר ה-HAL של המצלמה.
אחרי זמן מה, תתרחש אחת מהאפשרויות הבאות:
- יכול להיות שהמסגרת תפסיק לשלוח בקשות חדשות, תמתין להשלמת הצילום הקיים (כל המאגרים יתמלאו, כל התוצאות יחזרו) ואז תפעיל שוב את
ICameraDeviceSession::configureStreams()
. הפעולה הזו מאפסת את החומרה ואת צינור עיבוד הנתונים של המצלמה לקבוצה חדשה של מקורות קלט/פלט. יכול להיות שחלק מהשידורים יוכלו לשמש שוב מהתצורה הקודמת. לאחר מכן, המסגרת ממשיכה מבקשת הצילום הראשונה אל HAL, אם עדיין יש לפחות שידור פלט אחד רשום. (אחרת, צריך להזין קודם אתICameraDeviceSession::configureStreams()
). - המסגרת עשויה להפעיל את
ICameraDeviceSession::close()
כדי לסיים את סשן המצלמה. אפשר להפעיל את הפונקציה הזו בכל שלב כשאין קריאות אחרות מהמסגרת פעילות, אבל יכול להיות שהקריאה תיחסם עד שכל הצילום בזמן אמת יושלם (כל התוצאות יחזרו וכל המאגרים יאוכלסו). אחרי שהקריאה ל-close()
חוזרת, לא ניתן לבצע יותר קריאות ל-ICameraDeviceCallback
מה-HAL. אחרי שהקריאה ל-close()
מתחילה, לא ניתן להפעיל ב-framework פונקציות אחרות של מכשיר 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 | מושבתת | ללא |
מופעלת | android.sensor.exposureTime android.sensor.frameDuration android.sensor.sensitivity android.lens.aperture (אם יש תמיכה) android.lens.filterDensity (אם יש תמיכה) | |
ON_AUTO_FLASH | כל האפשרויות מופעלות, וגם 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 | מושבתת | ללא |
WHITE_BALANCE_* | android.colorCorrection.transform. התאמות ספציפיות לפלטפורמה אם הערך של android.colorCorrection.mode הוא FAST או HIGH_QUALITY. | |
android.control.afMode | מושבתת | ללא |
FOCUS_MODE_* | android.lens.focusDistance | |
android.control.videoStabilization | מושבתת | ללא |
מופעלת | אפשר לשנות את android.scaler.cropRegion כדי להטמיע ייצוב וידאו | |
android.control.mode | מושבתת | התכונות AE, AWB ו-AF מושבתות |
אוטומטי | נעשה שימוש בהגדרות נפרדות של AE, AWB ו-AF | |
SCENE_MODE_* | אפשר לשנות את כל הפרמטרים שצוינו למעלה. אמצעי הבקרה הנפרדים של 3A מושבתים. |
כל הפקדים בבלוק של עיבוד התמונות באיור 2 פועלים לפי עיקרון דומה, ובדרך כלל לכל בלוק יש שלושה מצבים:
- מושבת: בלוק העיבוד הזה מושבת. אי אפשר להשבית את הבלוק של ביטול הפסאודו-מוזיקה, תיקון הצבע והתאמת עקומת הטון.
- מהיר: במצב הזה, יכול להיות שבלוק העיבוד לא יאט את קצב הפריימים בפלט בהשוואה למצב מושבת, אבל הוא אמור לייצר פלט באיכות הטובה ביותר שאפשר בהתאם למגבלה הזו. בדרך כלל, האפשרות הזו משמשת למצבי תצוגה מקדימה או צילום וידאו, או לצילום רצף של תמונות סטילס. במכשירים מסוימים, המצב הזה עשוי להיות שווה ערך למצב OFF (לא ניתן לבצע עיבוד בלי להאט את קצב הפריימים), ובמכשירים מסוימים, המצב הזה עשוי להיות שווה ערך למצב HIGH_QUALITY (האיכות הטובה ביותר עדיין לא מאטה את קצב הפריימים).
- HIGH_QUALITY: במצב הזה, בלוק העיבוד אמור לייצר את התוצאה באיכות הטובה ביותר האפשרית, ולהאט את קצב הפריימים של הפלט לפי הצורך. בדרך כלל, משתמשים באפשרות הזו כדי לצלם תמונות סטילס באיכות גבוהה. בחלק מהבלוקים יש אמצעי בקרה ידני שאפשר לבחור במקום FAST או HIGH_QUALITY. לדוגמה, הבלוק של תיקון הצבע תומך במטריצה של טרנספורמציית צבע, בעוד שהתאמת עקומת הטון תומכת בעקומת מיפוי גוונים גלובלית שרירותית.
קצב הפריימים המקסימלי שמערכת משנה של מצלמה יכולה לתמוך בו תלוי בגורמים רבים:
- רזולוציות המבוקשות של זרמי תמונות הפלט
- הזמינות של מצבי צבירה/דילוג במכשיר לצילום
- רוחב הפס של ממשק ה-imager
- רוחב הפס של בלוקים שונים של עיבוד ISP
הגורמים האלה יכולים להשתנות מאוד בין ספקי אינטרנט וחיישנים שונים, ולכן ממשק ה-HAL של המצלמה מנסה להפוך את ההגבלות על רוחב הפס למודל פשוט ככל האפשר. למדגם המוצג יש את המאפיינים הבאים:
- חיישן התמונה מוגדר תמיד להפיק פלט ברזולוציה הקטנה ביותר האפשרית, בהתאם לגדלים המבוקשים של מקור הפלט של האפליקציה. הרזולוציה הקטנה ביותר מוגדרת כגדולה לפחות כמו גודל פלט הנתונים הגדול ביותר שנבקש.
- מכיוון שכל בקשה עשויה להשתמש בכל אחד או בכל נתיבי הפלט שהוגדרו כרגע, חייבים להגדיר את החיישן ואת ספק האינטרנט כך שיתמכו בהתאמת צילום יחיד לכל נתיבי הפלט בו-זמנית.
- במקרים שבהם הם לא כלולים בבקשות, זרמי JPEG פועלים כמו זרמי YUV שעברו עיבוד. במקרים שבהם יש להם הפניה ישירה, הם פועלים כמו זרמי JPEG.
- מעבד ה-JPEG יכול לפעול בו-זמנית עם שאר צינור עיבוד הנתונים של המצלמה, אבל הוא לא יכול לעבד יותר מקלטת אחת בכל פעם.