הפנייה למבנה camera3_device_ops
#include < camera3.h >
שדות נתונים | |
int(* | אתחול )(const struct camera3_device *, const camera3_callback_ops_t *callback_ops) |
int(* | configure_streams )(const struct camera3_device *, camera3_stream_configuration_t *stream_list) |
int(* | register_stream_buffers )(const struct camera3_device *, const camera3_stream_buffer_set_t *buffer_set) |
const camera_metadata_t *(* | construct_default_request_settings )(const struct camera3_device *, int type) |
int(* | process_capture_request )(const struct camera3_device *, camera3_capture_request_t *request) |
בָּטֵל(* | get_metadata_vendor_tag_ops )(const struct camera3_device *, vendor_tag_query_ops_t *ops) |
בָּטֵל(* | dump )(const struct camera3_device *, int fd) |
int(* | flush )(const struct camera3_device *) |
בטל* | שמור [8] |
תיאור מפורט
תיעוד שטח
int(* configure_streams)(const struct camera3_device *, camera3_stream_configuration_t *stream_list) |
configure_streams:
CAMERA_DEVICE_API_VERSION_3_0 בלבד:
אפס את צינור העיבוד של מכשירי מצלמת HAL והגדר זרמי קלט ופלט חדשים. קריאה זו מחליפה כל תצורת זרם קיימת בזרמים המוגדרים ב-stream_list. שיטה זו תיקרא לפחות פעם אחת לאחר initialize() לפני הגשת בקשה עם process_capture_request() .
ה-stream_list חייב להכיל לפחות זרם אחד עם יכולת פלט, ולא יכול להכיל יותר מזרם אחד עם יכולת קלט.
ה-stream_list עשוי להכיל זרמים שנמצאים גם בקבוצת הזרמים הפעילה כעת (מהקריאה הקודמת ל-configure_stream()). לזרמים האלה כבר יהיו ערכים חוקיים עבור שימוש, max_buffers והמצביע הפרטי.
אם לזרם כזה כבר נרשמו ה-buffers שלו, register_stream_buffers() לא ייקרא שוב עבור הזרם, וניתן לכלול בופרים מהזרם באופן מיידי בבקשות קלט.
אם ה-HAL צריך לשנות את תצורת הזרם עבור זרם קיים עקב התצורה החדשה, הוא עשוי לשכתב את ערכי השימוש ו/או max_buffers במהלך שיחת התצורה.
המסגרת תזהה שינוי כזה, ולאחר מכן תקצה מחדש את מאגרי הזרם, ותתקשר שוב ל-register_stream_buffers() לפני שימוש במאגרים מאותו זרם בבקשה.
אם זרם פעיל כעת אינו כלול ב-stream_list, ה-HAL עשוי להסיר בבטחה כל התייחסות לזרם זה. לא יעשה בו שימוש חוזר בקריאה מאוחרת יותר ל-configure() על ידי ה-framework, וכל המאגרים של gralloc עבורו ישוחררו לאחר שהקריאה configure_streams() תחזור.
מבנה stream_list הוא בבעלות המסגרת, ולא ניתן לגשת אליו לאחר השלמת השיחה הזו. הכתובת של מבנה camera3_stream_t אינדיבידואלי תישאר תקפה לגישה על ידי ה-HAL עד לסיום הקריאה הראשונה של configure_stream() שאינה כוללת עוד את אותו camera3_stream_t בארגומנט stream_list. ה-HAL לא יכול לשנות ערכים במבנה הזרם מחוץ למצביע הפרטי, למעט חברי השימוש וה-max_buffers במהלך הקריאה configure_streams() עצמה.
אם הזרם חדש, שדות השימוש, max_buffer ושדות המצביע הפרטי של מבנה הזרם יוגדרו כולם ל-0. התקן HAL חייב להגדיר שדות אלה לפני שהקריאה configure_streams() תחזור. שדות אלה משמשים לאחר מכן את המסגרת ואת מודול gralloc של הפלטפורמה כדי להקצות את מאגרי gralloc עבור כל זרם.
לפני שזרם חדש כזה יכול לכלול את המאגרים שלו בבקשת לכידה, המסגרת תקרא register_stream_buffers() עם הזרם הזה. עם זאת, המסגרת אינה נדרשת לרשום מאגרים עבור כל הזרמים לפני הגשת בקשה. זה מאפשר הפעלה מהירה של (לדוגמה) זרם תצוגה מקדימה, כאשר הקצאה לזרמים אחרים מתרחשת מאוחר יותר או במקביל.
CAMERA_DEVICE_API_VERSION_3_1 בלבד:
אפס את צינור העיבוד של מכשירי מצלמת HAL והגדר זרמי קלט ופלט חדשים. קריאה זו מחליפה כל תצורת זרם קיימת בזרמים המוגדרים ב-stream_list. שיטה זו תיקרא לפחות פעם אחת לאחר initialize() לפני הגשת בקשה עם process_capture_request() .
ה-stream_list חייב להכיל לפחות זרם אחד עם יכולת פלט, ולא יכול להכיל יותר מזרם אחד עם יכולת קלט.
ה-stream_list עשוי להכיל זרמים שנמצאים גם בקבוצת הזרמים הפעילה כעת (מהקריאה הקודמת ל-configure_stream()). לזרמים האלה כבר יהיו ערכים חוקיים עבור שימוש, max_buffers והמצביע הפרטי.
אם לזרם כזה כבר נרשמו ה-buffers שלו, register_stream_buffers() לא ייקרא שוב עבור הזרם, וניתן לכלול בופרים מהזרם באופן מיידי בבקשות קלט.
אם ה-HAL צריך לשנות את תצורת הזרם עבור זרם קיים עקב התצורה החדשה, הוא עשוי לשכתב את ערכי השימוש ו/או max_buffers במהלך שיחת התצורה.
המסגרת תזהה שינוי כזה, ולאחר מכן תקצה מחדש את מאגרי הזרם, ותתקשר שוב ל-register_stream_buffers() לפני שימוש במאגרים מאותו זרם בבקשה.
אם זרם פעיל כעת אינו כלול ב-stream_list, ה-HAL עשוי להסיר בבטחה כל התייחסות לזרם זה. לא יעשה בו שימוש חוזר בקריאה מאוחרת יותר ל-configure() על ידי ה-framework, וכל המאגרים של gralloc עבורו ישוחררו לאחר שהקריאה configure_streams() תחזור.
מבנה stream_list הוא בבעלות המסגרת, ולא ניתן לגשת אליו לאחר השלמת השיחה הזו. הכתובת של מבנה camera3_stream_t אינדיבידואלי תישאר תקפה לגישה על ידי ה-HAL עד לסיום הקריאה הראשונה של configure_stream() שאינה כוללת עוד את אותו camera3_stream_t בארגומנט stream_list. ה-HAL לא יכול לשנות ערכים במבנה הזרם מחוץ למצביע הפרטי, למעט חברי השימוש וה-max_buffers במהלך הקריאה configure_streams() עצמה.
אם הזרם חדש, max_buffer ושדות המצביע הפרטיים של מבנה הזרם יוגדרו כולם ל-0. השימוש יוגדר לדגלי השימוש של הצרכן. התקן HAL חייב להגדיר שדות אלה לפני שהקריאה configure_streams() תחזור. שדות אלה משמשים לאחר מכן את המסגרת ואת מודול gralloc של הפלטפורמה כדי להקצות את מאגרי gralloc עבור כל זרם.
לפני שזרם חדש כזה יכול לכלול את המאגרים שלו בבקשת לכידה, המסגרת תקרא register_stream_buffers() עם הזרם הזה. עם זאת, המסגרת אינה נדרשת לרשום מאגרים עבור כל הזרמים לפני הגשת בקשה. זה מאפשר הפעלה מהירה של (לדוגמה) זרם תצוגה מקדימה, כאשר הקצאה לזרמים אחרים מתרחשת מאוחר יותר או במקביל.
>= CAMERA_DEVICE_API_VERSION_3_2:
אפס את צינור העיבוד של מכשירי מצלמת HAL והגדר זרמי קלט ופלט חדשים. קריאה זו מחליפה כל תצורת זרם קיימת בזרמים המוגדרים ב-stream_list. שיטה זו תיקרא לפחות פעם אחת לאחר initialize() לפני הגשת בקשה עם process_capture_request() .
ה-stream_list חייב להכיל לפחות זרם אחד עם יכולת פלט, ולא יכול להכיל יותר מזרם אחד עם יכולת קלט.
ה-stream_list עשוי להכיל זרמים שנמצאים גם בקבוצת הזרמים הפעילה כעת (מהקריאה הקודמת ל-configure_stream()). לזרמים האלה כבר יהיו ערכים חוקיים עבור שימוש, max_buffers והמצביע הפרטי.
אם ה-HAL צריך לשנות את תצורת הזרם עבור זרם קיים עקב התצורה החדשה, הוא עשוי לשכתב את ערכי השימוש ו/או max_buffers במהלך שיחת התצורה.
המסגרת תזהה שינוי כזה, ולאחר מכן עשויה להקצות מחדש את מאגרי הזרם לפני השימוש במאגרים מאותו זרם בבקשה.
אם זרם פעיל כעת אינו כלול ב-stream_list, ה-HAL עשוי להסיר בבטחה כל התייחסות לזרם זה. לא יעשה בו שימוש חוזר בקריאה מאוחרת יותר ל-configure() על ידי ה-framework, וכל המאגרים של gralloc עבורו ישוחררו לאחר שהקריאה configure_streams() תחזור.
מבנה stream_list הוא בבעלות המסגרת, ולא ניתן לגשת אליו לאחר השלמת השיחה הזו. הכתובת של מבנה camera3_stream_t אינדיבידואלי תישאר תקפה לגישה על ידי ה-HAL עד לסיום הקריאה הראשונה של configure_stream() שאינה כוללת עוד את אותו camera3_stream_t בארגומנט stream_list. ה-HAL לא יכול לשנות ערכים במבנה הזרם מחוץ למצביע הפרטי, למעט חברי השימוש וה-max_buffers במהלך הקריאה configure_streams() עצמה.
אם הזרם חדש, max_buffer ושדות המצביע הפרטיים של מבנה הזרם יוגדרו כולם ל-0. השימוש יוגדר לדגלי השימוש של הצרכן. התקן HAL חייב להגדיר שדות אלה לפני שהקריאה configure_streams() תחזור. שדות אלה משמשים לאחר מכן את המסגרת ואת מודול gralloc של הפלטפורמה כדי להקצות את מאגרי gralloc עבור כל זרם.
מאגרים שהוקצו לאחרונה עשויים להיכלל בבקשת לכידה בכל עת על ידי המסגרת. ברגע שמאגר gralloc מוחזר למסגרת עם process_capture_result (ואותו ה- release_fence בהתאמה שלו) ה-framework עשויה לשחרר או לעשות בו שימוש חוזר בכל עת.
תנאים מוקדמים:
המסגרת תקרא לשיטה זו רק כאשר לא מעובדים לכידות. כלומר, כל התוצאות הוחזרו למסגרת, וכל מאגרי הקלט והפלט בטיסה הוחזרו וגדרות סנכרון השחרור שלהם אומנו על ידי ה-HAL. המסגרת לא תגיש בקשות חדשות ללכידה בזמן שהקריאה configure_streams() מתבצעת.
תנאי פוסט:
התקן HAL חייב להגדיר את עצמו לספק קצב פריימים פלט מרבי אפשרי בהתחשב בגדלים ובפורמטים של זרמי הפלט, כפי שמתועד במטא נתונים סטטיים של התקן המצלמה.
דרישות ביצועים:
השיחה הזו צפויה להיות בעלת משקל כבד ואולי לארוך כמה מאות אלפיות שניות להשלמתה, מכיוון שהיא עשויה לדרוש איפוס והגדרה מחדש של חיישן התמונה וצינור עיבוד המצלמה. עם זאת, התקן HAL צריך לנסות למזער את עיכוב ההגדרה מחדש כדי למזער את ההשהות הנראות למשתמש במהלך שינויי מצב תפעול של האפליקציה (כגון מעבר מלכידת סטילס להקלטת וידאו).
ה-HAL אמור לחזור משיחה זו בעוד 500 אלפיות השנייה, ועליו לחזור מהקריאה הזו בעוד 1000 אלפיות השנייה.
ערכי החזרה:
0: בתצורת זרם מוצלחת
-EINVAL: אם תצורת הזרם המבוקשת אינה חוקית. כמה דוגמאות לתצורות זרם לא חוקיות כוללות:
- כולל יותר מזרם אחד בעל יכולת קלט (INPUT או BIDIRECTIONAL)
- לא כולל זרמים בעלי יכולת פלט (פלט או BIDIRECTIONAL)
- כולל זרמים עם פורמטים לא נתמכים, או גודל לא נתמך עבור פורמט זה.
- כולל יותר מדי זרמי פלט בפורמט מסוים.
- תצורת סיבוב לא נתמכת (חלה רק על מכשירים עם גרסה >= CAMERA_DEVICE_API_VERSION_3_3)
- גדלים/פורמטים של זרמים אינם עומדים בדרישות camera3_stream_configuration_t->operation_mode עבור מצב לא נורמאלי, או שמצב הפעולה המבוקש אינו נתמך על ידי ה-HAL. (חל רק על מכשירים עם גרסה >= CAMERA_DEVICE_API_VERSION_3_3)
שים לב שהמסגרת המגישה תצורת זרם לא חוקית אינה פעולה רגילה, מכיוון שתצורות הזרם נבדקות לפני התצורה. תצורה לא חוקית פירושה שקיים באג בקוד המסגרת, או שיש אי התאמה בין המטא-נתונים הסטטיים של ה-HAL לבין הדרישות בזרמים.
-ENODEV: אם הייתה שגיאה קטלנית והמכשיר אינו פועל עוד. רק close() יכול להיקרא בהצלחה על ידי המסגרת לאחר החזרת השגיאה הזו.
const camera_metadata_t *(* construct_default_request_settings)(const struct camera3_device *, type int) |
construct_default_request_settings:
צור הגדרות צילום עבור מקרי שימוש סטנדרטיים במצלמה.
ההתקן חייב להחזיר מאגר הגדרות שמוגדר כדי לענות על מקרה השימוש המבוקש, אשר חייב להיות אחד מהסמנים של CAMERA3_TEMPLATE_*. יש לכלול את כל שדות בקרת הבקשה.
ה-HAL שומר על הבעלות על מבנה זה, אך המצביע על המבנה חייב להיות תקף עד לסגירת המכשיר. ייתכן שהמסגרת וה-HAL לא ישנו את המאגר ברגע שהוא מוחזר על ידי קריאה זו. ניתן להחזיר את אותו מאגר עבור קריאות עוקבות עבור אותה תבנית, או עבור תבניות אחרות.
דרישות ביצועים:
זו צריכה להיות שיחה לא חוסמת. ה-HAL אמור לחזור משיחה זו תוך 1ms, ועליו לחזור משיחה זו בעוד 5ms.
ערכי החזרה:
מטא נתונים חוקיים: ביצירה מוצלחת של מאגר הגדרות ברירת מחדל.
NULL: במקרה של שגיאה קטלנית. לאחר החזרה זו, רק שיטת close() יכולה להיקרא בהצלחה על ידי המסגרת.
void(* dump)(const struct camera3_device *, int fd) |
מזבלה:
הדפס מצב ניפוי באגים עבור התקן המצלמה. זה ייקרא על ידי ה-framework כאשר שירות המצלמה יתבקש ל-debug dump, מה שקורה בעת שימוש בכלי dumpsys, או בעת לכידת דוח באג.
ניתן להשתמש במתאר הקובץ המועבר לכתיבת טקסט ניפוי באגים באמצעות dprintf() או write(). הטקסט צריך להיות בקידוד ASCII בלבד.
דרישות ביצועים:
זו חייבת להיות שיחה לא חוסמת. ה-HAL אמור לחזור משיחה זו בעוד 1ms, חייב לחזור משיחה זו בעוד 10ms. שיחה זו חייבת למנוע תקלות, שכן היא עשויה להיקרא בכל נקודה במהלך פעולת המצלמה. כל פרימיטיביות סנכרון בשימוש (כגון נעילות mutex או סמפורות) צריכים להירכש עם פסק זמן.
int(* flush)(const struct camera3_device *) |
סומק:
יש לשטוף את כל הלכידות הנמצאות בתהליך ואת כל המאגרים בצינור במכשיר הנתון. המסגרת תשתמש בזה כדי לשפוך את כל המצבים במהירות האפשרית על מנת להתכונן לקריאה configure_streams() .
אין צורך במאגרים כדי להחזיר בהצלחה, כך שכל מאגר המוחזק בזמן ה- flush() (בין אם מולא בהצלחה ובין אם לא) עשוי להיות מוחזר עם CAMERA3_BUFFER_STATUS_ERROR. שימו לב שה-HAL עדיין רשאי להחזיר מאגרים חוקיים (CAMERA3_BUFFER_STATUS_OK) במהלך שיחה זו, בתנאי שהם מולאו בהצלחה.
כל הבקשות שנמצאות כעת ב-HAL צפויות להיות מוחזרות בהקדם האפשרי. בקשות שאינן בתהליך צריכות להחזיר שגיאות באופן מיידי. יש לעצור את כל חסימות החומרה הניתנות לפסק, ולהמתין לכל חסימות אל-פסק.
ניתן לקרוא ל- flush() במקביל ל- proces_capture_request() , מתוך ציפייה ש-process_capture_request יחזור במהירות והבקשה שהוגשה בקריאה זו process_capture_request מטופלת כמו כל הבקשות האחרות במהלך הטיסה. עקב בעיות במקביל, ייתכן שמנקודת המבט של ה-HAL, קריאת process_capture_request() עשויה להיות מופעלת לאחר ש-Fush הופעל אך עדיין לא חזר. אם קריאה כזו מתרחשת לפני ש-flush() חוזרת, ה-HAL צריך להתייחס לבקשת הלכידה החדשה כמו בקשות אחרות הממתינות בטיסה (ראה מס' 4 להלן).
ליתר דיוק, ה-HAL חייב לעמוד בדרישות להלן עבור מקרים שונים:
- עבור לכידות מאוחרות מדי עבור ה-HAL לבטל/להפסיק, ויושלמו בדרך כלל על-ידי ה-HAL; כלומר, ה-HAL יכול לשלוח shutter/notify ו-proces_capture_result ומאגרים כרגיל.
- עבור בקשות ממתינות שלא ביצעו שום עיבוד, ה-HAL חייב לקרוא ליידע CAMERA3_MSG_ERROR_REQUEST, ולהחזיר את כל מאגרי הפלט עם process_capture_result במצב השגיאה (CAMERA3_BUFFER_STATUS_ERROR). אסור ל-HAL להציב את גדר השחרור למצב שגיאה, במקום זאת, יש להגדיר את גדרות השחרור לגדרות הרכישה שעברו על ידי המסגרת, או -1 אם כבר המתינו להן על ידי ה-HAL. זה גם הנתיב שיש לעקוב אחריו עבור כל לכידות שעבורן ה-HAL כבר נקרא notify() עם CAMERA3_MSG_SHUTTER אך לא ייצור עבורם מטא נתונים/מאגרים חוקיים. לאחר CAMERA3_MSG_ERROR_REQUEST, עבור מסגרת נתונה, רק process_capture_results עם מאגרים ב-CAMERA3_BUFFER_STATUS_ERROR מותרים. אין הודעות נוספות או process_capture_result עם מטא נתונים שאינם אפס.
עבור בקשות ממתינות שהושלמו חלקית שלא יהיו בהן כל מאגרי הפלט או אולי חסרים מטא נתונים, ה-HAL צריך לפעול להלן:
3.1. התקשר הודעה עם CAMERA3_MSG_ERROR_RESULT אם חלק ממטא נתונים של התוצאות הצפויות (כלומר מטא נתונים חלקיים אחד או יותר) לא יהיו זמינים עבור הלכידה.
3.2. התקשר התראה עם CAMERA3_MSG_ERROR_BUFFER עבור כל מאגר שלא יופק עבור הלכידה.
3.3 הודעת שיחה עם CAMERA3_MSG_SHUTTER עם חותמת זמן לכידה לפני החזרת מאגרים/מטא נתונים כלשהם עם process_capture_result.
3.4 עבור לכידות שיניבו תוצאות מסוימות, אסור שה-HAL יתקשר ל-CAMERA3_MSG_ERROR_REQUEST, מכיוון שזה מצביע על כשל מוחלט.
3.5. יש להעביר מאגרים/מטא נתונים חוקיים למסגרת כרגיל.
3.6. יש להחזיר מאגרים שנכשלו למסגרת כמתואר למקרה 2. אך מאגרים שנכשלו אינם חייבים לפעול לפי הסדר המחמיר של מאגרים חוקיים, ועשויים להיות לא תקינים ביחס למאגרים תקפים. לדוגמה, אם מאגרים A, B, C, D, E נשלחים, D ו-E נכשלו, אז A, E, B, D, C היא הזמנת החזרה מקובלת.
3.7. עבור מטא נתונים חסרים לחלוטין, קריאה ל-CAMERA3_MSG_ERROR_RESULT מספיקה, אין צורך לקרוא ל-process_capture_result עם מטא נתונים NULL או שווה ערך.
- אם מופעלת flush() בזמן שהזמנת process_capture_request() פעילה, קריאת התהליך אמורה לחזור בהקדם האפשרי. בנוסף, אם קריאה process_capture_request() מתבצעת לאחר שה-flush() הופעלה אך לפני ש-flush() חזר, יש להתייחס לבקשת הלכידה שסופקה על ידי הקריאה המאוחרת process_capture_request כמו בקשה ממתינה במקרה מס' 2 לעיל.
flush() אמור לחזור רק כאשר לא נותרו עוד מאגרים או בקשות בולטים ב-HAL. המסגרת עשויה לקרוא ל-configure_streams (כפי שמצב ה-HAL מופסק כעת) או עשויה להוציא בקשות חדשות.
שים לב שמספיק לתמוך רק במקרים של הצלחה מלאה ונכשלה במלואה. עם זאת, רצוי מאוד לתמוך גם במקרים של כשל חלקי, מכיוון שזה יכול לעזור לשפר את הביצועים הכוללים של שיחת השטיפה.
דרישות ביצועים:
ה-HAL אמור לחזור משיחה זו בעוד 100 אלפיות השנייה, ועליו לחזור מהקריאה הזו בעוד 1000 אלפיות השנייה. ואסור לחסום את השיחה הזו יותר מהשהייה בצנרת (ראה S7 להגדרה).
מידע על הגרסה:
זמין רק אם גרסת המכשיר >= CAMERA_DEVICE_API_VERSION_3_1.
ערכי החזרה:
0: בשטיפה מוצלחת של המצלמה HAL.
-EINVAL: אם הקלט פגום (ההתקן אינו חוקי).
-ENODEV: אם התקן המצלמה נתקל בשגיאה חמורה. לאחר החזרת השגיאה הזו, רק שיטת close() יכולה להיקרא בהצלחה על ידי המסגרת.
void(* get_metadata_vendor_tag_ops)(const struct camera3_device *, vendor_tag_query_ops_t *ops) |
get_metadata_vendor_tag_ops:
קבל שיטות לשאילתה עבור פרטי תג מטא נתונים של תוסף ספק. ה-HAL צריך למלא את כל שיטות הפעולה של תגי הספק, או להשאיר את האופציות ללא שינוי אם לא מוגדרות תגי ספק.
את ההגדרה של vendor_tag_query_ops_t ניתן למצוא ב-system/media/camera/include/system/camera_metadata.h.
>= CAMERA_DEVICE_API_VERSION_3_2: הוצא משימוש. פונקציה זו הוצאה משימוש ויש להגדיר אותה ל-NULL על ידי ה-HAL. נא ליישם get_vendor_tag_ops ב- camera_common.h במקום זאת.
int(* initialize)(const struct camera3_device *, const camera3_callback_ops_t *callback_ops) |
לְאַתחֵל:
אתחול חד פעמי להעברת מצביעי פונקציית callback של המסגרת ל-HAL. ייקרא פעם אחת לאחר קריאה מוצלחת של open() לפני שפונקציות אחרות ייקראו במבנה camera3_device_ops .
דרישות ביצועים:
זו צריכה להיות שיחה לא חוסמת. ה-HAL אמור לחזור משיחה זו בעוד 5ms, ועליו לחזור משיחה זו בעוד 10ms.
ערכי החזרה:
0: באתחול מוצלח
-ENODEV: אם האתחול נכשל. רק close() יכול להיקרא בהצלחה על ידי המסגרת לאחר מכן.
int(* process_capture_request)(const struct camera3_device *, camera3_capture_request_t *request) |
process_capture_request:
שלח בקשת לכידה חדשה ל-HAL. ה-HAL לא אמור לחזור משיחה זו עד שהוא מוכן לקבל את הבקשה הבאה לעיבוד. רק קריאה אחת אל process_capture_request() תתבצע בכל פעם על ידי המסגרת, והקריאות יהיו כולן מאותו שרשור. הקריאה הבאה אל process_capture_request() תתבצע ברגע שבקשה חדשה והמאגרים המשויכים לה יהיו זמינים. בתרחיש תצוגה מקדימה רגיל, המשמעות היא שהפונקציה תיקרא שוב על ידי המסגרת כמעט באופן מיידי.
עיבוד הבקשות בפועל הוא אסינכרוני, כאשר תוצאות הלכידה מוחזרות על ידי ה-HAL באמצעות הקריאה process_capture_result() . קריאה זו דורשת שהמטא נתונים של התוצאה יהיו זמינים, אך מאגרי פלט עשויים פשוט לספק גדרות סנכרון להמתין. צפויות להיות בקשות מרובות בבת אחת, כדי לשמור על קצב מסגרות פלט מלא.
המסגרת שומרת בעלות על מבנה הבקשה. מובטח שזה יהיה תקף רק במהלך שיחה זו. התקן HAL חייב ליצור עותקים של המידע שהוא צריך לשמור עבור עיבוד הלכידה. הח"ל אחראי על המתנה וסגירה של גדרות החוצצים והחזרת ידיות החיץ למסגרת.
ה-HAL חייב לכתוב את מתאר הקובץ עבור גדר הסנכרון השחרור של מאגר הקלט לתוך input_buffer->release_fence, אם input_buffer אינו NULL. אם ה-HAL מחזיר -1 עבור גדר הסנכרון של שחרור מאגר הקלט, המסגרת חופשית לעשות שימוש חוזר מיידי במאגר הקלט. אחרת, המסגרת תחכה על גדר הסנכרון לפני מילוי מחדש ושימוש חוזר במאגר הקלט.
>= CAMERA_DEVICE_API_VERSION_3_2:
מאגרי הקלט/פלט המסופקים על ידי המסגרת בכל בקשה עשויים להיות חדשים לגמרי (מעולם לא נראו על ידי ה-HAL).
שיקולי ביצועים:
הטיפול במאגר חדש צריך להיות קל במיוחד ולא אמור להיות ירידה בקצב הפריימים או ריצוד מסגרת.
קריאה זו חייבת לחזור מהר מספיק כדי להבטיח שניתן יהיה לקיים את קצב הפריימים המבוקש, במיוחד עבור מקרי סטרימינג (הגדרות איכות שלאחר עיבוד מוגדרות ל-FAST). ה-HAL אמור להחזיר קריאה זו במרווחי פריים 1, ועליו לחזור מהקריאה הזו ב-4 מרווחי פריימים.
ערכי החזרה:
0: בהתחלה מוצלחת לעיבוד בקשת הלכידה
-EINVAL: אם הקלט פגום (ההגדרות הן NULL כאשר אינן מותרות, יש 0 מאגרי פלט וכו') ועיבוד הלכידה לא יכול להתחיל. יש לטפל בתקלות במהלך עיבוד הבקשות על ידי קריאה ל- camera3_callback_ops_t.notify() . במקרה של שגיאה זו, המסגרת תשמור על האחריות על גדרות חוצצי הנחל ועל ידיות החיץ; ה-HAL לא אמור לסגור את הגדרות או להחזיר את המאגרים הללו עם process_capture_result.
-ENODEV: אם התקן המצלמה נתקל בשגיאה חמורה. לאחר החזרת השגיאה הזו, רק שיטת close() יכולה להיקרא בהצלחה על ידי המסגרת.
int(* register_stream_buffers)(const struct camera3_device *, const camera3_stream_buffer_set_t *buffer_set) |
register_stream_buffers:
>= CAMERA_DEVICE_API_VERSION_3_2:
מיושן. זה לא ייקרא ויש להגדיר אותו ל-NULL.
<= CAMERA_DEVICE_API_VERSION_3_1:
רשום מאגרים עבור זרם נתון עם התקן HAL. שיטה זו נקראת על ידי ה-framework לאחר שזרם חדש מוגדר על ידי configure_streams, ולפני שמאגרים מאותו זרם נכללים בבקשת לכידה. אם אותו זרם רשום בקריאה עוקבת של configure_streams() , register_stream_buffers לא ייקראו שוב עבור אותו זרם.
המסגרת אינה צריכה לרשום מאגרים עבור כל הזרמים המוגדרים לפני שהיא שולחת את בקשת הלכידה הראשונה. זה מאפשר הפעלה מהירה לתצוגה מקדימה (או מקרי שימוש דומים) בזמן שזרמים אחרים עדיין מוקצים.
שיטה זו נועדה לאפשר למכשיר HAL למפות או להכין בדרך אחרת את המאגרים לשימוש מאוחר יותר. המאגרים שהועברו פנימה כבר יהיו נעולים לשימוש. בסיום השיחה, כל המאגרים צריכים להיות מוכנים להחזרה לזרם. הארגומנט buffer_set תקף רק למשך קריאה זו.
אם פורמט הזרם הוגדר ל-HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, ה-HAL של המצלמה צריך לבדוק את המאגרים שהועברו כאן כדי לקבוע מידע על פורמט פיקסל פרטי של פלטפורמה.
דרישות ביצועים:
זו צריכה להיות שיחה לא חוסמת. ה-HAL אמור לחזור משיחה זו תוך 1ms, ועליו לחזור משיחה זו בעוד 5ms.
ערכי החזרה:
0: ברישום מוצלח של מאגרי הזרם החדשים
-EINVAL: אם ה-stream_buffer_set אינו מתייחס לזרם פעיל חוקי, או אם מערך המאגרים אינו חוקי.
-ENOMEM: אם היה כשל ברישום המאגרים. המסגרת חייבת לשקול את כל מאגרי הזרם כבלתי רשומים, ויכולה לנסות להירשם שוב מאוחר יותר.
-ENODEV: אם יש שגיאה קטלנית, והמכשיר אינו פועל עוד. רק close() יכול להיקרא בהצלחה על ידי המסגרת לאחר החזרת השגיאה הזו.
התיעוד עבור מבנה זה נוצר מהקובץ הבא:
- hardware/libhardware/include/hardware/ camera3.h