תמיכה במספר מצלמות

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

תמיכה במספר מצלמות

איור 1. תמיכה במספר מצלמות

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

דוגמאות ומקורות

מכשירים עם כמה מצלמות צריכים להיות מפורסמים עם היכולת הלוגית של כמה מצלמות.

לקוחות המצלמה יכולים לשלוח שאילתה לגבי מזהה המצלמה של המכשירים הפיזיים שמצלמה לוגית מסוימת מורכבת מהם על ידי קריאה ל-getPhysicalCameraIds(). המזהים שמוחזרים כחלק מהתוצאה משמשים לשליטה במכשירים פיזיים בנפרד באמצעות setPhysicalCameraId(). אפשר להריץ שאילתות על התוצאות של בקשות בודדות כאלה מתוך התוצאה המלאה באמצעות הפונקציה getPhysicalCameraResults().

יכול להיות שבקשות נפרדות למצלמה פיזית יתמכו רק בקבוצת משנה מוגבלת של פרמטרים. כדי לקבל רשימה של הפרמטרים הנתמכים, מפתחים יכולים להתקשר אל getAvailablePhysicalCameraRequestKeys().

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

הטמעה

רשימת משימות תמיכה

כדי להוסיף מכשירים לוגיים עם כמה מצלמות בצד HAL:

במכשירים עם Android 9, מכשירי מצלמה צריכים לתמוך בהחלפה של זרם לוגי אחד של YUV או RAW בזרמים פיזיים באותו גודל (לא חל על זרמי RAW) ובאותו פורמט משתי מצלמות פיזיות. ההגדרה הזו לא חלה על מכשירים עם Android מגרסה 10.

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

מפה של הגדרות מקורות נתונים

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

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

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

שילוב מובטח של שידורים

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

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

במכשירים עם Android מגרסה 9, לכל שילוב מובטח של סטרימים, המצלמה הלוגית צריכה לתמוך ב:

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

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

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

שיקולים לגבי ביצועים וצריכת חשמל

  • ביצועים:

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

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

התאמה אישית

אפשר להתאים אישית את ההטמעה של המכשיר בדרכים הבאות.

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

אימות

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

שלוש הבדיקות האלה של ITS מיועדות למערכות מרובות מצלמות כדי להקל על מיזוג התמונות בצורה נכונה:

הבדיקות של סצנה 1 וסצנה 4 מופעלות באמצעות ערכת הבדיקה ITS-in-a-box. בבדיקה test_multi_camera_match מוודאים שהבהירות של מרכז התמונות זהה כששתי המצלמות מופעלות. בדיקת test_multi_camera_alignment מוודאת שפרמטרים של מרווחי מצלמות, אוריינטציות ושיבושים נטענים בצורה תקינה. אם מערכת המצלמות כוללת מצלמה עם שדה ראייה רחב (מעל 90 מעלות), נדרשת גרסה rev2 של תיבת ה-ITS.

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

כל הקופסאות זמינות דרך AcuSpec, Inc. (www.acuspecinc.com, fred@acuspecinc.com) ו-MYWAY Manufacturing (www.myway.tw, sales@myway.tw). בנוסף, אפשר לרכוש את תיבת ה-ITS rev1 דרך West-Mark (www.west-mark.com, dgoodman@west-mark.com).

שיטות מומלצות

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

  • (Android 10 ואילך) הסתרת מצלמות משנה פיזיות מ-getCameraIdList. הפעולה הזו מצמצמת את מספר המצלמות שאפליקציות יכולות לפתוח ישירות, וכך מבטלת את הצורך של האפליקציות להשתמש בלוגיקה מורכבת לבחירת מצלמה.
  • (Android 11 ואילך) במכשיר עם מצלמה לוגית מרובת עדשות שתומכת בזום אופטי, צריך להטמיע את ANDROID_CONTROL_ZOOM_RATIO API ולהשתמש ב-ANDROID_SCALER_CROP_REGION רק לחיתוך יחסי הגובה-רוחב. ‫ANDROID_CONTROL_ZOOM_RATIO מאפשרת למכשיר להקטין את התצוגה ולשמור על דיוק טוב יותר. במקרה כזה, שכבת ה-HAL צריכה להתאים את מערכת הקואורדינטות של ANDROID_SCALER_CROP_REGION,‏ ANDROID_CONTROL_AE_REGIONS,‏ ANDROID_CONTROL_AWB_REGIONS,‏ ANDROID_CONTROL_AF_REGIONS,‏ ANDROID_STATISTICS_FACE_RECTANGLES ו-ANDROID_STATISTICS_FACE_LANDMARKS כדי להתייחס לשדה הראייה אחרי הזום כמערך הפעיל של החיישן. מידע נוסף על האופן שבו ANDROID_SCALER_CROP_REGION פועל יחד עם ANDROID_CONTROL_ZOOM_RATIO זמין במאמר camera3_crop_reprocess#cropping.
  • במכשירים עם כמה מצלמות פיזיות בעלות יכולות שונות, צריך לוודא שהמכשיר מפרסם תמיכה בערך או בטווח מסוים של שליטה רק אם טווח הזום כולו תומך בערך או בטווח. לדוגמה, אם המצלמה הלוגית מורכבת ממצלמת Ultrawide, ממצלמה רחבה וממצלמת טלפוטו, מבצעים את הפעולות הבאות:
    • אם הגדלים של המערכים הפעילים של המצלמות הפיזיות שונים, ה-HAL של המצלמה צריך לבצע את המיפוי מהמערכים הפעילים של המצלמות הפיזיות למערך הפעיל של המצלמה הלוגית עבור ANDROID_SCALER_CROP_REGION,‏ ANDROID_CONTROL_AE_REGIONS,‏ ANDROID_CONTROL_AWB_REGIONS,‏ ANDROID_CONTROL_AF_REGIONS,‏ ANDROID_STATISTICS_FACE_RECTANGLES ו-ANDROID_STATISTICS_FACE_LANDMARKS, כך שמנקודת המבט של האפליקציה, מערכת הקואורדינטות היא הגודל של המערך הפעיל של המצלמה הלוגית.
    • אם המצלמות הרחבה והטלה-פוטו תומכות בפוקוס אוטומטי, אבל המצלמה האולטרה-רחבה היא עם פוקוס קבוע, צריך לוודא שהמצלמה הלוגית מפרסמת תמיכה בפוקוס אוטומטי. ממשק HAL צריך לדמות מכונת מצבים של פוקוס אוטומטי עבור מצלמת ה-ultrawide, כך שכשהאפליקציה מבצעת זום אאוט לעדשת ה-ultrawide, העובדה שהמצלמה הפיזית הבסיסית היא פוקוס קבוע שקופה לאפליקציה, ומכונות המצבים של הפוקוס האוטומטי עבור מצבי הפוקוס האוטומטי הנתמכים פועלות כמצופה.
    • אם המצלמות הרחבה והטלה-פוטו תומכות ב-4K ב-60 fps, והמצלמה האולטרה-רחבה תומכת רק ב-4K ב-30 fps או ב-1080p ב-60 fps, אבל לא ב-4K ב-60 fps, צריך לוודא שהמצלמה הלוגית לא מפרסמת 4K ב-60 fps בהגדרות הנתמכות של הזרמת הנתונים. כך מובטחת שלמות היכולות של המצלמה הלוגית, והאפליקציה לא תיתקל בבעיה של אי השגת 4k ב-60 fps בערך של ANDROID_CONTROL_ZOOM_RATIO פחות מ-1.
  • ב-Android מגרסה 10 ואילך, לא נדרשת מצלמה לוגית מרובת עדשות כדי לתמוך בשילובים של סטרימינג שכוללים סטרימינג פיזי. אם שכבת ה-HAL תומכת בשילוב עם סטרימינג פיזי:
    • ‫(Android מגרסה 11 ואילך) כדי לטפל טוב יותר בתרחישי שימוש כמו עומק מסטריאו ומעקב תנועה, צריך להגדיל את שדה הראייה של הפלט של הזרם הפיזי עד כמה שאפשר באמצעות החומרה. עם זאת, אם סטרימינג פיזי וסטרימינג לוגי מגיעים מאותה מצלמה פיזית, יכול להיות שמגבלות חומרה יכריחו את שדה הראייה של הסטרימינג הפיזי להיות זהה לזה של הסטרימינג הלוגי.
    • כדי לטפל בעומס על הזיכרון שנגרם מכמה זרמים פיזיים, צריך לוודא שהאפליקציות משתמשות ב-discardFreeBuffers כדי לבטל את ההקצאה של מאגרי הנתונים הזמניים החופשיים (מאגרים ששוחררו על ידי הצרכן, אבל עדיין לא הוצאו מהתור על ידי היצרן) אם צפוי שזרם פיזי יהיה בלי פעילות למשך תקופה מסוימת.
    • אם בדרך כלל לא מצרפים לאותה בקשה סטרימינג פיזי ממצלמות פיזיות שונות, צריך לוודא שהאפליקציות משתמשות ב-surface group כדי שתור במאגר נתונים זמני (buffer queue) אחד ישמש לגיבוי של שני משטחים שפונים לאפליקציה, וכך יצטמצם השימוש בזיכרון.