תת-מערכת HAL

בקשות

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

דגם של בקשת מצלמה

איור 1. דגם מצלמה

טכנולוגיית HAL ומערכת המשנה של המצלמה

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

צינור עיבוד הנתונים של המצלמה תומך גם בטריגרים שמסגרת האפליקציה יכולה להפעיל כדי להפעיל פעולות כמו מיקוד אוטומטי. הוא גם שולח התראות חזרה אל app framework, להודיע לאפליקציות על אירועים כמו נעילה של המיקוד האוטומטי או שגיאות.

שכבת הפשטה של חומרת המצלמה

איור 2. צינור עיבוד נתונים של המצלמה

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

  • פלט RAW של Bayer לא עובר עיבוד אצל ספק האינטרנט.
  • הנתונים הסטטיסטיים מופקים על סמך הנתונים הגולמיים של החיישנים.
  • בלוקי העיבוד השונים שממירים נתוני חיישנים גולמיים ל-YUV צו שרירותי.
  • בעוד שמוצגות מספר יחידות קנה מידה וחיתוך, כל יחידות ה-Scaler חולקות את פקדי אזורי פלט (זום דיגיטלי). עם זאת, לכל יחידה יכולים להיות רזולוציית פלט ופורמט פיקסלים.

סיכום השימוש ב-API
זהו סיכום קצר של שלבי השימוש ב-Android Camera API. לצפייה הקטע של ההפעלה ורצף הפעולות הצפויות, כדי לקבל פירוט של את השלבים האלו, כולל קריאות ל-API.

  1. האזנה למכשירי מצלמה וספירה שלהם.
  2. פתיחת המכשיר וחיבור מאזינים.
  3. להגדיר פלטים לתרחיש לדוגמה של יעד (למשל הקלטה, הקלטה, וכו').
  4. יצירת בקשות לתרחיש לדוגמה של היעד.
  5. תיעוד/חזרה של בקשות רצפים.
  6. קבלת מטא-נתונים ונתוני תמונה של התוצאה.
  7. כשמחליפים בין תרחישים לדוגמה, חוזרים לשלב 3.

סיכום פעולת HAL

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

איור 3. סקירה כללית של מצלמת HAL

הפעלה ורצף פעולות צפוי

בקטע הזה מופיע הסבר מפורט על השלבים הצפויים בזמן השימוש ממשק ה-API של המצלמה. כדאי לעיין פלטפורמה/חומרה/ממשקים/מצלמה/ לממשק HIDL הגדרות.

ספירה, פתיחת מצלמות של מכשירים ויצירת סשן פעיל

  1. לאחר האתחול, ה-framework מתחיל להקשיב לכל שידור ספקי מצלמות שמטמיעים ממשק ICameraProvider. אם ספק כזה קיימים ספקים, ה-framework ינסה ליצור חיבור.
  2. ה-framework סופר את מכשירי המצלמה באמצעות ICameraProvider::getCameraIdList()
  3. ה-framework יוצר ICameraDevice חדש על ידי קריאה לפונקציה המתאימה ICameraProvider::getCameraDeviceInterface_VX_X().
  4. תוכנת ה-framework קוראת ל-ICameraDevice::open() ליצור סשן צילום פעיל IcamDeviceSession.

שימוש בסשן מצלמה פעיל

  1. תוכנת ה-framework קוראת ל-ICameraDeviceSession::configureStreams() עם רשימה של זרמי קלט/פלט להתקן HAL.
  2. ה-framework מבקש הגדרות ברירת מחדל לתרחישים לדוגמה מסוימים עם שיחות אל ICameraDeviceSession::constructDefaultRequestSettings(). זה יכול לקרות בכל שלב אחרי התאריך ICameraDeviceSession נוצר על ידי ICameraDevice::open.
  3. ה-framework בונה ושולח את בקשת הצילום הראשונה ל-HAL עם על סמך אחת מקבוצות ברירת המחדל של הגדרות ברירת המחדל, ובנוסף זרם פלט שנרשם מוקדם יותר על ידי framework. ההודעה נשלחה ל-HAL עם ICameraDeviceSession::processCaptureRequest(). איכות השיחה (HAL) חייבת לחסום את החזרה של השיחה הזו עד שהיא תהיה מוכנה בקשה לשליחה.
  4. המערכת ממשיכה לשלוח בקשות ושיחות ICameraDeviceSession::constructDefaultRequestSettings() כדי לקבל מחדשים את הגדרות ברירת המחדל לתרחישים לדוגמה אחרים לפי הצורך.
  5. כשההקלטה של הבקשה מתחילה (החיישן מתחיל לחשוף לתיעוד), HAL קורא ל-ICameraDeviceCallback::notify() עם הודעת SHUTTER, כולל מספר המסגרת וחותמת הזמן של ההתחלה של חשיפה. הקריאה החוזרת של ההתראה לא חייבת להתרחש לפני קריאה ל-processCaptureResult() לבקשה, אבל אין תוצאות מועברים לאפליקציה להקלטה עד לאחר מכן notify() עבור הצילום הזה נקרא.
  6. לאחר עיכוב מסוים בצינור עיבוד הנתונים, מערכת HAL מתחילה להחזיר צילומים שהושלמו את המסגרת עם ICameraDeviceCallback::processCaptureResult(). הקבצים האלה מוחזרים לפי הסדר שבו הבקשות נשלחו. יותר מאחת הבקשות יכולות להיות בטיסה בבת אחת, בהתאם לעומק צינור עיבוד הנתונים מכשיר עם HAL למצלמה.

לאחר זמן מה, תתרחש אחת מהאפשרויות הבאות:

  • יכול להיות שבקשות חדשות לא יישלחו יותר על ידי ה-framework, צריך לחכות את הצילומים הקיימים להשלים (כל מאגרי הנתונים הזמניים מולאו, כל התוצאות הוחזרה), ולאחר מכן להתקשר למספר ICameraDeviceSession::configureStreams() שוב. הפעולה הזו תאפס את החומרה ואת צינור עיבוד הנתונים של המצלמה עבור סדרה חדשה של שידורי קלט/פלט. ייתכן שבחלק מהשידורים נעשה שימוש חוזר בגרסה הקודמת הגדרה אישית. לאחר מכן, ה-framework ממשיך מבקשת הצילום הראשונה ל-HAL, אם לפחות זרם הפלט הרשום נשאר. (אם לא, חובה להזין קודם ICameraDeviceSession::configureStreams()).
  • תוכנת ה-framework עשויה לקרוא ל-ICameraDeviceSession::close() כדי לסיים את סשן המצלמה. אפשר להתקשר למספר הזה בכל שלב, אם לא יתקבלו שיחות אחרות מה-framework פעילים, למרות שהשיחה עשויה להיחסם עד צילומי מסך בזמן ההפעלה הושלמו (כל התוצאות הוחזרו, כל מאגרי הנתונים הזמניים מלא). אחרי שהשיחה אל close() תוחזר, לא יהיו יותר שיחות למספר ניתן להשתמש ב-ICameraDeviceCallback מתוך HAL. אחרי ש הפעלת close() מתבצעת, ה-framework לא יכול לקרוא לאף אפשרות אחרת פונקציות של מכשיר HAL.
  • במקרה של שגיאה או אירוע אסינכרוני אחר, ה-HAL חייב להפעיל ICameraDeviceCallback::notify() עם הערכים המתאימים הודעת שגיאה או אירוע. לאחר החזרה מהתראה על שגיאה חמורה בכל המכשיר, בדיקת ה-HAL כאילו קוראים לו close(). עם זאת, הדרישות של הנחיות HAL או לבטל או להשלים את כל ההקלטות הממתינות לפני התקשרות אל notify(), כך שברגע בוצעה קריאה אל notify() עם שגיאה חמורה, ה-framework לא לקבל שיחות חוזרות נוספות מהמכשיר. שיטות מלבד close() צריך להחזיר -ENODEV או NULL אחרי שהשיטה notify() חוזרת מבדיקה חמורה הודעת שגיאה.
תהליך פעולות המצלמה

איור 4. תהליך התפעול של המצלמה

רמות החומרה

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

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

בהתאם להגדרות בבלוק הבקרה של 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_מצב_* android.lens.focuswhere,
android.control.videoStabilization מושבתת ללא
מופעלת אפשר לשנות את android.scaler.cropRegion כדי להטמיע ייצוב וידאו
android.control.mode מושבתת AE, AWB ו-AF מושבתים
אוטומטי נעשה שימוש בהגדרות נפרדות של AE, AWB ו-AF
SCENE_מצב_* הם יכולים לשנות את כל הפרמטרים שמפורטים למעלה. אמצעי בקרה נפרדים של 3A מושבתים.

הפקדים בבלוק עיבוד התמונות באיור 2 פועלים אותו עיקרון, ובדרך כלל לכל בלוק יש שלושה מצבים:

  • מושבת: בלוק העיבוד הזה מושבת. הדוגמאות, תיקון הצבע לא ניתן להשבית בלוקים של התאמת עקומת טונים.
  • מהיר: במצב זה, ייתכן שבלוק העיבוד לא יאט את מסגרת הפלט. בהשוואה למצב כבוי, אלא שאחרת הוא אמור להניב את האיכות הטובה ביותר הפלט שהוא יכול לתת, בהתאם להגבלה הזו. בדרך כלל, הוא משמש מצבי תצוגה מקדימה או הקלטת וידאו, או צילום רצף עבור תמונות סטילס. בחלק מכשירים מסוימים, הדבר עשוי להיות מקביל למצב כבוי (לא ניתן לבצע עיבוד מבלי להאטת קצב הפריימים), ובמכשירים מסוימים, הפעולה הזו עשויה להיות מקבילה ל- מצב high_QUALITY (האיכות הטובה ביותר עדיין לא מאטה את קצב הפריימים).
  • high_QUALITY: במצב הזה, בלוק העיבוד אמור להפיק את תוצאה של איכות כלשהי, ולהאט את קצב הפריימים של הפלט לפי הצורך. בדרך כלל, השיטה הזו מתאימה לצילום סטילס באיכות גבוהה. כמה בלוקים לכלול שליטה ידנית שניתן לבחור במקום FAST או high_QUALITY. לדוגמה, הבלוק לתיקון הצבע תומך בצבע טרנספורמציה של מטריצה, בעוד שהתאמת עקומת הטון תומכת במודל שרירותי גלובלי עקומה של מיפוי גוונים.

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

  • הרזולוציות הנדרשות של פלט תמונות בסטרימינג
  • הזמינות של מצבי הצמדה/דילוג בתוכנת התמונה
  • רוחב הפס של ממשק המערכת של מכשיר התמונה
  • רוחב הפס של חסימות העיבוד השונות של ספקי אינטרנט

מאחר שהגורמים האלה עשויים להשתנות באופן משמעותי בין ספקי אינטרנט וחיישנים שונים, ממשק HAL של המצלמה מנסה להפשט את הגבלות רוחב הפס ולהפוך אותן לפשוטות יותר מודל טרנספורמר ככל האפשר. למודל שמוצג יש את המאפיינים הבאים:

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