הפנייה למבנה camera3_capture_result
#include < camera3.h >
שדות נתונים | |
uint32_t | מספר מסגרת |
const camera_metadata_t * | תוֹצָאָה |
uint32_t | num_output_buffers |
const camera3_stream_buffer_t * | output_buffers |
const camera3_stream_buffer_t * | input_buffer |
uint32_t | תוצאה_חלקית |
תיאור מפורט
camera3_capture_result_t:
תוצאה של לכידה/עיבוד מחדש בודד על ידי התקן HAL של המצלמה. זה נשלח למסגרת באופן אסינכרוני עם process_capture_result(), בתגובה לבקשת לכידה בודדת שנשלחה ל-HAL עם process_capture_request(). קריאות process_capture_result() מרובות עשויות להתבצע על ידי ה-HAL עבור כל בקשה.
כל שיחה, כולן עם אותו מספר מסגרת, עשויה להכיל תת-קבוצה כלשהי של מאגרי הפלט ו/או את המטא נתונים של התוצאה. ניתן לספק את המטא נתונים פעם אחת בלבד עבור מספר מסגרת נתון; כל שאר השיחות חייבות להגדיר את המטא-נתונים של התוצאה ל-NULL.
מבנה התוצאה מכיל את המטא-נתונים של הפלט מהלכידה הזו, ואת קבוצת מאגרי הפלט שמולאו/ימולאו עבור לכידה זו. כל מאגר פלט עשוי להגיע עם גדר סנכרון שחרור שהמסגרת תחכה עליה לפני הקריאה, למקרה שהמאגר עדיין לא התמלא על ידי ה-HAL.
>= CAMERA_DEVICE_API_VERSION_3_2:
המטא נתונים עשויים להיות מסופקים מספר פעמים עבור מספר מסגרת בודד. המסגרת תצבור יחד את ערכת התוצאה הסופית על ידי שילוב של כל תוצאה חלקית יחד למכלול התוצאות הכולל.
אם ניתן מאגר קלט בבקשה, ה-HAL חייב להחזיר אותו באחת מהקריאות process_capture_result, והקריאה עשויה להיות רק להחזיר את מאגר הקלט, ללא מטא נתונים ומאגרי פלט; יש לטפל בגדרות הסנכרון באותה דרך שבה הן מבוצעות עבור מאגרי פלט.
שיקולי ביצועים:
יישומים יקבלו גם את התוצאות החלקיות הללו באופן מיידי, כך ששליחת תוצאות חלקיות היא אופטימיזציה של ביצועים מומלצת מאוד כדי להימנע מהשהייה הכוללת של הצינור לפני שליחת התוצאות למה שידוע בשלב מוקדם מאוד של הצינור.
מקרה שימוש טיפוסי עשוי להיות חישוב מצב AF באמצע הדרך דרך הצינור; על ידי שליחת המדינה חזרה למסגרת באופן מיידי, אנו מקבלים גידול של 50% בביצועים ותגובתיות נתפסת של המיקוד האוטומטי.
תיעוד שטח
uint32_t frame_number |
מספר המסגרת הוא מספר שלם שהולך ומתגבר שנקבע על ידי המסגרת בבקשה שהוגשה לזיהוי ייחודי של לכידה זו. הוא משמש גם לזיהוי הבקשה בהתראות אסינכרוניות שנשלחות אל camera3_callback_ops_t.notify() .
const camera3_stream_buffer_t * input_buffer |
>= CAMERA_DEVICE_API_VERSION_3_2:
הידית למאגר זרם הקלט עבור לכידה זו. ייתכן שהוא עדיין לא נצרך בזמן שה-HAL קורא ל-process_capture_result(); המסגרת תחכה לגדרות סנכרון השחרור שסופקו על ידי ה-HAL לפני שימוש חוזר במאגר.
ה-HAL צריך להתמודד עם גדרות הסנכרון באותו אופן שבו הם נעשים עבור output_buffers.
מותר לשלוח רק מאגר קלט אחד לכל בקשה. בדומה למאגרי פלט, הסדר של מאגרי הקלט המוחזרים חייב להישמר על ידי ה-HAL.
שיקולי ביצועים:
יש להחזיר את מאגר הקלט מוקדם ככל האפשר. אם ה-HAL תומך בגדרות סנכרון, הוא יכול לקרוא ל-process_capture_result כדי להחזיר אותו עם גדרות סנכרון מוגדרות כראוי. אם גדרות הסנכרון אינן נתמכות, ניתן להחזיר את המאגר רק כאשר הוא נצרך, מה שעשוי להימשך זמן רב; ה-HAL עשוי לבחור להעתיק את מאגר הקלט הזה כדי שהמאגר יחזור מוקדם יותר.
uint32_t num_output_buffers |
מספר מאגרי הפלט שהוחזרו במבנה התוצאה הזה. חייב להיות קטן או שווה לספירת בקשת הלכידה התואמת. אם זה קטן מספירת המאגר בבקשת הלכידה, יש לבצע לפחות קריאה אחת נוספת ל-process_capture_result עם אותו frame_number, כדי להחזיר את מאגרי הפלט הנותרים למסגרת. זה עשוי להיות אפס רק אם המבנה כולל מטא נתונים חוקיים של תוצאות או מאגר קלט מוחזר בתוצאה זו.
const camera3_stream_buffer_t * output_buffers |
האחיזה עבור מאגרי זרם הפלט עבור לכידה זו. ייתכן שהם עדיין לא מולאו בזמן שה-HAL קורא ל-process_capture_result(); המסגרת תחכה לגדרות סנכרון השחרור שסופקו על ידי ה-HAL לפני שתקרא את המאגרים.
ה-HAL חייב להגדיר את גדר סנכרון השחרור של מאגר הזרם ל-fd סנכרון חוקי, או ל-1 אם המאגר כבר התמלא.
אם ה-HAL נתקל בשגיאה בעת עיבוד המאגר, והמאגר אינו מלא, יש להגדיר את שדה המצב של המאגר ל-CAMERA3_BUFFER_STATUS_ERROR. אם הח"ל לא המתין על גדר הרכישה לפני שנתקל בשגיאה, יש להעתיק את גדר הרכישה לגדר השחרור, כדי לאפשר למסגרת להמתין על הגדר לפני שימוש חוזר בחיץ.
יש להגדיר את גדר הרכישה ל-1 עבור כל מאגרי הפלט. אם num_output_buffers הוא אפס, זה עשוי להיות NULL. במקרה זה, לפחות עוד קריאת process_capture_result חייבת להתבצע על ידי ה-HAL כדי לספק את מאגרי הפלט.
כאשר process_capture_result נקרא עם מאגר חדש עבור מסגרת, כל המאגרים הקודמים של הפריימים הקודמים עבור אותו זרם מתאים חייבים להיות כבר מסופקים (הגדרות עדיין לא חייבות להיות מסומנות).
>= CAMERA_DEVICE_API_VERSION_3_2:
ניתן לשלוח מאגרי Gralloc למסגרת למסגרת לפני ה-SHUTTER-notify המתאים.
שיקולי ביצועים:
מאגרים שנמסרו למסגרת לא ישוגרו לשכבת האפליקציה עד שתתקבל חותמת זמן של תחילת החשיפה באמצעות קריאת SHUTTER notify() . מומלץ מאוד לשלוח את השיחה בהקדם האפשרי.
uint32_t partial_result |
>= CAMERA_DEVICE_API_VERSION_3_2:
על מנת לנצל תוצאות חלקיות, ה-HAL חייב להגדיר את המטא-נתונים הסטטיים android.request.partialResultCount למספר התוצאות החלקיות שהוא ישלח עבור כל מסגרת.
כל תוצאת לכידה חדשה עם תוצאה חלקית חייבת להגדיר את השדה הזה (partial_result) לערך כולל מובהק בין 1 ל-android.request.partialResultCount.
ל-HALs שאינם רוצים לנצל את התכונה הזו אסור להגדיר android.request.partialResultCount או partial_result לערך שונה מ-1.
יש להגדיר ערך זה ל-0 כאשר תוצאת לכידה מכילה מאגרים בלבד וללא מטא נתונים.
const camera_metadata_t * תוצאה |
המטא נתונים של התוצאה עבור לכידה זו. זה מכיל מידע על פרמטרי הלכידה הסופיים, מצב חומרת הלכידה והעיבוד שלאחר, מצב האלגוריתמים של 3A, אם מופעלים, והפלט של יחידות סטטיסטיקה מופעלות כלשהן.
רק קריאה אחת ל-process_capture_result() עם frame_number נתון עשויה לכלול את המטא נתונים של התוצאה. כל שאר הקריאות לאותו frame_number חייבות להגדיר זאת ל-NULL.
אם הייתה שגיאה בהפקת המטא נתונים של התוצאה, התוצאה חייבת להיות מאגר מטא נתונים ריק, ויש לקרוא ל-notify() עם ERROR_RESULT.
>= CAMERA_DEVICE_API_VERSION_3_2:
קריאות מרובות ל-proces_capture_result() עם frame_number נתון עשויות לכלול את המטא נתונים של התוצאה.
מטא נתונים חלקיים שנשלחו לא צריכים לכלול מפתח מטא נתונים שהוחזר בתוצאה חלקית קודמת עבור מסגרת נתונה. כל תוצאה חלקית חדשה עבור אותה מסגרת חייבת גם להגדיר ערך חלקי_תוצאה ברור.
אם התראה נקראה עם ERROR_RESULT, המסגרת מתעלמת מכל התוצאות החלקיות הנוספות עבור אותה מסגרת.
התיעוד עבור מבנה זה נוצר מהקובץ הבא:
- hardware/libhardware/include/hardware/ camera3.h