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.
איור 1. ממשק מצלמה עם HAL ב-Android 9 ובגרסאות קודמות
איור 2. ממשק מצלמה עם ממשק אנושי ל-Android 10 באמצעות ממשקי API לניהול מאגר הנתונים הזמני
הטמעת ממשקי ה-API לניהול מאגר הנתונים הזמני
כדי להטמיע את ממשקי ה-API לניהול מאגר הנתונים הזמני, תכונת HAL של המצלמה צריכה:
- הטמעת HIDL
ICameraDevice@3.5
- הגדרת מקש המאפיינים של המצלמה
android.info.supportedBufferManagementVersion
אלHIDL_DEVICE_3_5
.
טכנולוגיית 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++