מערכת משנה HAL

בקשות

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

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

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

תת מערכת ה-HAL והמצלמה

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

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

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

איור 2. צינור מצלמה

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

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

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

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

סיכום מבצע HAL

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

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

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

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

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

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

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

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

לאחר זמן מה, אחד מהדברים הבאים יתרחש:

  • המסגרת עשויה להפסיק לשלוח בקשות חדשות, להמתין להשלמת הלכידות הקיימות (כל המאגרים מולאו, כל התוצאות מוחזרות), ואז לקרוא שוב ל- ICameraDeviceSession::configureStreams() . זה מאפס את חומרת המצלמה ואת הצינור עבור קבוצה חדשה של זרמי קלט/פלט. ייתכן שבחלק מהזרמים נעשה שימוש חוזר מהתצורה הקודמת. לאחר מכן, המסגרת ממשיכה מבקשת הלכידה הראשונה ל-HAL, אם נשאר לפחות זרם פלט רשום אחד. (אחרת, תחילה נדרש ICameraDeviceSession::configureStreams() ).
  • המסגרת עשויה לקרוא ל- 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 כבוי אף אחד
עַל 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 כבוי אף אחד
מצב ממוקד_* android.lens.focusDistance
android.control.video ייצוב כבוי אף אחד
עַל יכול להתאים את android.scaler.cropRegion ליישום ייצוב וידאו
android.control.mode כבוי AE, AWB ו-AF מושבתים
אוטומטי נעשה שימוש בהגדרות אישיות של AE, AWB ו-AF
SCENE_MODE_* יכול לעקוף את כל הפרמטרים המפורטים למעלה. בקרות 3A בודדות מושבתות.

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

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

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

  • רזולוציות מבוקשות של זרמי תמונות פלט
  • זמינות של מצבי binning/דילוג ב-imager
  • רוחב הפס של ממשק ה-imager
  • רוחב הפס של בלוקי העיבוד השונים של ISP

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

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