ממשקי API לניהול מאגר נתונים זמני של מצלמה HAL3

Android 10 חדש: אופציונלי מאגר נתונים זמני של מצלמה HAL3 שמאפשרים לכם לנהל את ממשקי ה-API להטמיע לוגיקה של ניהול מאגר נתונים זמני כדי להשיג זיכרון ותיעוד שונים הבדלים בזמן האחזור בהטמעות של טכנולוגיית HAL במצלמה.

למצלמת HAL נדרשות N בקשות (כאשר N שווה ל- עומק צינור) נמצאת בתור בצינור עיבוד הנתונים, אבל לעיתים קרובות לא נדרשות כל N קבוצות של בתהליך אגירת נתונים בו-זמנית.

לדוגמה, ל-HAL יכול להיות שמונה בקשות בהמתנה בתור בצינור עיבוד הנתונים, אבל נדרשים רק מאגרי פלט עבור שתי הבקשות בשלבים האחרונים של צינור עיבוד נתונים. במכשירים עם Android מגרסה 9 ומטה, מסגרת המצלמה מקצה בתהליך אגירת נתונים כשהבקשה נמצאת בתור ב-HAL, כך שיכול להיות שיהיו שש קבוצות של חוצצים ב-HAL שלא נמצאים בשימוש. ב-Android 10, ממשקי ה-API לניהול מאגר הנתונים הזמני של המצלמה HAL3 מאפשרים פענוח של הפלט מאגרי נתונים זמניים כדי לפנות את שש הקבוצות של מאגרי הנתונים הזמניים. מצב כזה יכול להוביל למאות חיסכון של מגה-בייט בזיכרון במכשירים מתקדמים, והוא גם יכול להועיל מכשירים עם נפח זיכרון נמוך.

באיור 1 מוצג תרשים של ממשק ה-HAL של המצלמה במכשירים שפועלים Android מגרסה 9 ומטה. איור 2 מציג את ממשק המצלמה עם ממשק ה-HAL של המצלמה ב-Android 10 עם הוטמעו ממשקי ה-API לניהול מאגר הנתונים הזמני של המצלמה HAL3.

ניהול מאגר נתונים זמני בגרסה 9 ומטה

איור 1. ממשק מצלמה עם HAL ב-Android 9 ובגרסאות קודמות

ניהול מאגר נתונים זמני ב-Android 10

איור 2. ממשק מצלמה עם ממשק אנושי ל-Android 10 באמצעות ממשקי API לניהול מאגר הנתונים הזמני

הטמעת ממשקי ה-API לניהול מאגר הנתונים הזמני

כדי להטמיע את ממשקי ה-API לניהול מאגר הנתונים הזמני, תכונת HAL של המצלמה צריכה:

טכנולוגיית HAL של המצלמה משתמשת requestStreamBuffers וגם returnStreamBuffers שיטות ב- ICameraDeviceCallback.hal כדי לבקש ולהחזיר מאגרי נתונים זמניים. תקן HAL חייב גם להטמיע signalStreamFlush method ב- ICameraDeviceSession.hal כדי לאותת HAL של המצלמה להחזרת מאגר נתונים זמני.

requestStreamBuffers

משתמשים ב requestStreamBuffers כדי לבקש אגירת נתונים ממסגרת המצלמה. כשמשתמשים במצלמה עם HAL3 ממשקי API לניהול מאגר נתונים זמני, לא ניתן לתעד בקשות מ-framework של המצלמה לכלול חוצץ פלט, כלומר את השדה bufferId ב- StreamBuffer היא 0. לכן, טכנולוגיית ה-HAL של המצלמה חייבת להשתמש ב-requestStreamBuffers כדי לבקש אגירת נתונים ממסגרת המצלמה.

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

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

  • האפליקציה מתנתקת מזרם הפלט: זוהי שגיאה לא חמורה. המצלמה עם HAL צריכה לשלוח ERROR_REQUEST לכל בקשה לתיעוד לטרגט זרם מנותק ולהיות מוכנים לטפל בבקשות הבאות כרגיל.
  • זמן קצוב לתפוגה: הדבר יכול להתרחש כאשר האפליקציה עסוקה בביצוע בעיבוד אינטנסיבי תוך כדי שמירה על מאגרי נתונים זמניים. טכנולוגיית HAL של המצלמה צריכה להיות שליחה ERROR_REQUEST לבקשות תיעוד שלא ניתן למלא עקב שגיאה בזמן הקצוב לתפוגה ולהיות מוכנים לעבד את הבקשות הבאות כרגיל.
  • מסגרת המצלמה מכינה הגדרה חדשה של שידור: המצלמה עם HAL צריכה להמתין עד configureStreams השיחה תושלם לפני שתוכל להתקשר שוב אל requestStreamBuffers.
  • מצלמת HAL הגיעה מגבלת מאגר הנתונים הזמני (השדה maxBuffers): עם HAL של המצלמה יש להמתין עד שהיא תחזיר לפחות מאגר נתונים זמני אחד לפני השיחה requestStreamBuffers שוב.

ReturnStreamBuffers

משתמשים ב returnStreamBuffers כדי להחזיר מאגרי נתונים נוספים למסגרת המצלמה. מצלמה עם HAL רגילה מחזיר מאגרי נתונים זמניים למסגרת המצלמה דרך processCaptureResult אבל היא יכולה להביא בחשבון רק את בקשות הלכידה שנשלחו אל HAL של המצלמה. באמצעות השיטה requestStreamBuffers, אפשר הטמעת תקן HAL של המצלמה כדי לשמור יותר מאגרי נתונים זמניים ממה שהתבקש על ידי המסגרת של המצלמה. אלה המקרים שבהם ה-method returnStreamBuffers צריכה להיות בשימוש. אם ההטמעה של תקן HAL אף פעם לא כוללת יותר מאגרי נתונים זמניים ממה שנדרש, הטמעת HAL במצלמה לא צריכה לקרוא ל-returnStreamBuffers .

SignalsStreamFlush

signalStreamFlush נשלחת ל-framework של המצלמה הודעה כדי לשלוח הודעה ל-HAL כדי להחזיר את כל בתהליך אגירת נתונים. היא נקראת בדרך כלל כשמסגרת המצלמה עומדת להתחיל לשלוח קריאה configureStreams והם צריכים לרוקן את צינור עיבוד הנתונים ללכידת המצלמה. דומה לreturnStreamBuffers אם בהטמעת HAL של מצלמה אין יותר מאגרי נתונים זמניים המבוקש, ייתכן שהיישום של השיטה הזו ריק.

אחרי שה-framework של המצלמה מופעל signalStreamFlush ה-framework מפסיק לשלוח בקשות צילום חדשות למצלמה עם HAL עד מאגרי הנתונים הזמניים הוחזרו למסגרת המצלמה. כשכל מאגר הנתונים הזמני הקריאות הוחזרו, הקריאות בשיטת requestStreamBuffers נכשלות והמצלמה. framework יכולה להמשיך לפעול במצב נקי. לאחר מכן, הפריים של המצלמה קוראת לפונקציה configureStreams או processCaptureRequest . אם ה-framework של המצלמה קורא ל-method configureStreams, המצלמה HAL יכול להתחיל לבקש אגירת נתונים שוב אחרי שהשיחה של configureStreams חוזרת בהצלחה. אם ה-framework של המצלמה קורא ל-method processCaptureRequest, טכנולוגיית HAL של המצלמה יכולה להתחיל לבקש מאגר נתונים זמני במהלך processCaptureRequest שיחה.

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

הבדל נוסף בין השיטה signalStreamFlush לבין שיטות אחרות הוא ש-signalStreamFlush היא שיטת HIDL חד-כיוונית, כלומר שהמצלמה framework עלול להפעיל ממשקי API חוסמים אחרים לפני ש-HAL מקבל שיחת signalStreamFlush. המשמעות היא ה-method signalStreamFlush ושיטות אחרות (במיוחד ה- configureStreams method) עשוי להגיע ל-HAL של המצלמה בסדר שונה מאשר הסדר שבו נקראו בפריים של המצלמה. כדי לפתור את הבעיה בעיה אסינכרונית, השדה streamConfigCounter נוסף אל StreamConfiguration ונוסף כארגומנט ל-signalStreamFlush . בהטמעת תקן HAL של המצלמה צריך להשתמש ברכיב streamConfigCounter ארגומנט כדי לקבוע אם הקריאה של signalStreamFlush מגיעה מאוחר יותר שיחת configureStreams תואמת. לדוגמה, באיור 3.

טיפול בשיחות שמגיעות באיחור

איור 3. איך טכנולוגיית ה-HAL של המצלמה אמורה לזהות הפעלות של SignalsStreamFlush שמגיעות באיחור ולטפל בהן

שינויים בהתנהגות כשמטמיעים את ממשקי ה-API לניהול מאגר הנתונים הזמני

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

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

    כמו כן, ללא ממשקי API לניהול מאגר נתונים זמני, ה-framework של המצלמה נפסק שליחת בקשות תיעוד אם אחד מזרמי הפלט של ההקלטה הגעת למספר המקסימלי של מאגרי נתונים זמניים ש-HAL יכול להכיל פעם אחת (ערך זה מצוין על ידי המצלמה עם HAL) השדה HalStream::maxBuffers בערך המוחזר של configureStreams שיחה). בזכות ממשקי ה-API לניהול מאגר הנתונים הזמני, ההתנהגות הזו של ויסות הנתונים כבר לא קיים ויישום המצלמה עם HAL לא יכול לקבל processCaptureRequest קריאות כאשר ל-HAL יש יותר מדי בקשות תיעוד בתור.

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

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

אסטרטגיות לניהול מאגר נתונים זמני

ממשקי ה-API לניהול מאגר הנתונים הזמני מאפשרים סוגים שונים של ניהול מאגר הנתונים הזמני שיעזרו לך ליישם. לפניכם מספר דוגמאות:

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

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

הטמעת דגימות ב-HAL של מצלמה חיצונית

מצלמת ה-HAL החיצונית הושקה ב-Android 9 וניתן למצוא אותה עץ המקור ב- hardware/interfaces/camera/device/3.5/ ב-Android 10, היא עודכנה ועכשיו היא כוללת ExternalCameraDeviceSession.cpp יישום של ממשק ה-API לניהול מאגר הנתונים הזמני. המצלמה החיצונית הזו עם HAL מיישמת את האסטרטגיה לחיסכון מרבי בזיכרון שהוזכרה בניהול מאגר נתונים זמני בכמה מאות שורות קוד C++