מקורות נתונים של פלט
מערכת המשנה של המצלמה פועלת רק על צינור עיבוד הנתונים שמבוסס על ANativeWindow לכל הרזולוציות ופורמטי הפלט. אפשר להגדיר כמה זרמים בו-זמנית כדי לשלוח פריים יחיד לכמה יעדים, כמו GPU, מקודד וידאו, RenderScript או מאגרי נתונים גלויים לאפליקציה (RAW Bayer, מאגרי נתונים של YUV שעברו עיבוד או מאגרי נתונים שעברו קידוד JPEG).
כדי לבצע אופטימיזציה, צריך להגדיר את זרמי הפלט האלה מראש, ויכול להיות רק מספר מוגבל שלהם בו-זמנית. כך אפשר להקצות מראש מאגרי זיכרון ולהגדיר את חומרת המצלמה, כדי שלא יהיו עיכובים או השהיות במילוי הבקשה כששולחים בקשות עם כמה צינורות פלט או צינורות פלט משתנים.
מידע נוסף על השילובים המובטחים של פלט הסטרימינג, שתלויים ברמת החומרה הנתמכת, זמין במאמר createCaptureSession()
.
חיתוך
חיתוך של מערך הפיקסלים המלא (לזום דיגיטלי ולתרחישי שימוש אחרים שבהם רצוי ששדה הראייה יהיה קטן יותר) מועבר באמצעות ההגדרה ANDROID_SCALER_CROP_REGION. זוהי הגדרה לכל בקשה, והיא יכולה להשתנות על בסיס כל בקשה, וזה קריטי להטמעה של זום דיגיטלי חלק.
האזור מוגדר כמלבן (x, y, width, height), כאשר (x, y) מתאר את הפינה השמאלית העליונה של המלבן. הריבוע מוגדר במערכת הקואורדינטות של מערך הפיקסלים הפעילים של החיישן, כאשר (0,0) הוא הפיקסל השמאלי העליון של מערך הפיקסלים הפעילים. לכן, הרוחב והגובה לא יכולים להיות גדולים מהמידות שמדווחות בשדה המידע הסטטי ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY. הרוחב והגובה המינימליים המותרים מדווחים על ידי HAL דרך שדה המידע הסטטי ANDROID_SCALER_MAX_DIGITAL_ZOOM, שמתאר את מקדם הזום המקסימלי הנתמך. לכן, הרוחב והגובה המינימליים של אזור החיתוך הם:
{width, height} = { floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[0] / ANDROID_SCALER_MAX_DIGITAL_ZOOM), floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[1] / ANDROID_SCALER_MAX_DIGITAL_ZOOM) }
אם אזור החיתוך צריך לעמוד בדרישות ספציפיות (לדוגמה, הוא צריך להתחיל בקואורדינטות זוגיות, והרוחב או הגובה שלו צריכים להיות זוגיים), שכבת ה-HAL צריכה לבצע את העיגול הנדרש ולכתוב את אזור החיתוך הסופי שבו נעשה שימוש במטא-נתונים של תוצאת הפלט. באופן דומה, אם ה-HAL מיישם ייצוב וידאו, הוא צריך להתאים את אזור החיתוך של התוצאה כדי לתאר את האזור שנכלל בפועל בפלט אחרי היישום של ייצוב הווידאו. באופן כללי, אפליקציה שמשתמשת במצלמה צריכה להיות מסוגלת לקבוע את שדה הראייה שהיא מקבלת על סמך אזור החיתוך, הממדים של חיישן התמונה ואורך המוקד של העדשה.
אזור החיתוך חל על כל הזרמים, ויכול להיות שלזרמים שונים יש יחסי גובה-רוחב שונים מאזור החיתוך. לכן, האזור המדויק בחיישן שמשמש לכל זרם עשוי להיות קטן יותר מאזור החיתוך. בפרט, כל סטרימינג צריך לשמור על פיקסלים רבועים ועל יחס הגובה-רוחב שלו על ידי חיתוך נוסף של אזור החיתוך המוגדר. אם יחס הגובה-רוחב של השידור רחב יותר מאזור החיתוך, צריך לחתוך את השידור עוד יותר בצורה אנכית. אם יחס הגובה-רוחב של השידור צר יותר מאזור החיתוך, צריך לחתוך את השידור עוד יותר בצורה אופקית.
בכל המקרים, החיתוך של הזרם צריך להיות במרכז של אזור החיתוך המלא, וכל זרם נחתך רק אופקית או אנכית ביחס לאזור החיתוך המלא, אף פעם לא בשני הכיוונים.
לדוגמה, אם מוגדרים שני סטרימינג, סטרימינג של 640x480 (יחס גובה-רוחב של 4:3) וסטרימינג של 1280x720 (יחס גובה-רוחב של 16:9), בהמשך מוצגים אזורי הפלט הצפויים לכל סטרימינג עבור כמה אזורי חיתוך לדוגמה, בחיישן היפותטי של 3MP (מערך של 2,000x1,500 פיקסלים).
אזור החיתוך: (500, 375, 1000, 750) (יחס גובה-רוחב של 4:3)
חיתוך של סטרימינג ברזולוציה 640x480: (500, 375, 1000, 750) (זהה לאזור החיתוך)
חיתוך של סטרימינג ברזולוציה 1280x720: (500, 469, 1000, 562)

איור 1. יחס גובה-רוחב 4:3
אזור החיתוך: (500, 375, 1333, 750) (יחס גובה-רוחב 16:9)
חיתוך של סטרימינג ברזולוציה 640x480: (666, 375, 1000, 750)
חיתוך של סטרימינג ברזולוציה 1280x720: (500, 375, 1333, 750) (זהה לאזור החיתוך)

איור 2. יחס גובה-רוחב של 16:9
אזור החיתוך: (500, 375, 750, 750) (יחס גובה-רוחב 1:1)
חיתוך של שידור באיכות 640x480: (500, 469, 750, 562)
חיתוך של שידור באיכות 1280x720: (500, 543, 750, 414)

איור 3. יחס גובה-רוחב של 1:1
דוגמה אחרונה, שידור ביחס גובה-רוחב מרובע של 1024x1024 במקום שידור באיכות 480p:
אזור החיתוך: (500, 375, 1000, 750) (יחס גובה-רוחב של 4:3)
חיתוך של שידור באיכות 1024x1024: (625, 375, 750, 750)
חיתוך של שידור באיכות 1280x720: (500, 469, 1000, 562)

איור 4. יחס גובה-רוחב של 4:3, ריבוע
עיבוד מחדש
יש תמיכה נוספת בקובצי תמונות RAW באמצעות עיבוד מחדש של נתוני RAW Bayer. התמיכה הזו מאפשרת לצינור העיבוד של המצלמה לעבד מאגר RAW ומטא-נתונים שנלכדו בעבר (פריים שלם שצולם בעבר), כדי ליצור פלט חדש של YUV או JPEG.
שינוי מרחק התצוגה
במכשירים עם Android 11 ואילך, אפליקציה יכולה להשתמש בזום של המצלמה (דיגיטלי ואופטי) דרך ההגדרה ANDROID_CONTROL_ZOOM_RATIO
.
יחס הזום מוגדר כגורם נקודה צפה. במקום להשתמש ב-ANDROID_SCALER_CROP_REGION
לחיתוך ולזום, אפליקציה יכולה להשתמש ב-ANDROID_CONTROL_ZOOM_RATIO
כדי לשלוט ברמת הזום, וב-ANDROID_SCALER_CROP_REGION
לחיתוך אופקי ואנכי כדי להשיג יחסי גובה-רוחב שונים מאלה של חיישן המצלמה המקורי.
מערכת מרובת מצלמות עשויה להכיל יותר מעדשה אחת עם אורכי מוקד שונים, והמשתמש יכול להשתמש בזום אופטי על ידי מעבר בין העדשות.
השימוש ב-ANDROID_CONTROL_ZOOM_RATIO
מועיל בתרחישים הבאים:
- מעבר מזום רחב לעדשת טלפוטו: יחס נקודה צפה (floating-point) של
ANDROID_SCALER_CROP_REGION
מספק דיוק טוב יותר בהשוואה לערכים שלמים. - התרחקות מעדשה רחבה לעדשת Ultrawide:
ANDROID_CONTROL_ZOOM_RATIO
תומך בהתרחקות (zoom-out) (<1.0f) ואילוANDROID_SCALER_CROP_REGION
לא.
יחס הזום: 2.0; 1/4 משדה הראייה המקורי
אזור החיתוך: (0, 0, 2000, 1500) (יחס גובה-רוחב של 4:3)
חיתוך של שידור באיכות 640x480: (0, 0, 2000, 1500) (זהה לאזור החיתוך)
חיתוך של שידור באיכות 1280x720: (0, 187, 2000, 1125)

איור 5. זום של 2.0, יחס גובה-רוחב של 4:3
יחס הזום: 2.0; 1/4 משדה הראייה המקורי
אזור החיתוך: (0, 187, 2000, 1125) (יחס גובה-רוחב של 16:9)
חיתוך של שידור באיכות 640x480: (250, 187, 1500, 1125) (pillarboxed)
חיתוך של שידור באיכות 1280x720: (0, 187, 2000, 1125) (שווה לאזור החיתוך)

איור 6. זום 2.0, יחס גובה-רוחב של 16:9
יחס הזום: 0.5; 4x של שדה הראייה המקורי (המעבר היה מעדשה רחבה לעדשה רחבה במיוחד)
אזור החיתוך: (250, 0, 1500, 1500) (יחס גובה-רוחב 1:1)
חיתוך של הזרם ברזולוציה 640x480: (250, 187, 1500, 1125) (letterboxed)
חיתוך של הזרם ברזולוציה 1280x720: (250, 328, 1500, 844) (letterboxed)

איור 7. זום של 0.5, יחס גובה-רוחב של 1:1
כפי שאפשר לראות מהתרשימים שלמעלה, מערכת הקואורדינטות של אזור החיתוך משתנה לשדה הראייה האפקטיבי אחרי הזום, והיא מיוצגת על ידי המלבן עם המידות הבאות: (0
, 0
, activeArrayWith
, activeArrayHeight
). אותו הדבר חל על אזורי AE/AWB/AF ועל פנים. השינוי הזה במערכת הקואורדינטות לא חל על צילום בפורמט RAW ועל המטא-נתונים שקשורים אליו, כמו intrinsicCalibration
ו-lensShadingMap
.
בדוגמה ההיפותטית שלמעלה, נניח שמקור נתוני הפלט מספר 1 (640x480) הוא מקור נתוני עינית המצלמה.אפשר להגדיל פי 2 את התצוגה באחת משתי דרכים:
zoomRatio = 2.0
,scaler.cropRegion = (0, 0, 2000, 1500)
-
zoomRatio = 1.0
(ברירת מחדל),scaler.cropRegion = (500, 375, 1000, 750)
כדי שאפליקציה תגדיר את android.control.aeRegions
להיות הרבע הימני העליון של שדה הראייה של העינית, צריך להגדיר את android.control.aeRegions
ל-(0, 0, 1000, 750)
ואת android.control.zoomRatio
ל-2.0
. לחלופין, האפליקציה יכולה להגדיר את android.control.aeRegions
לאזור המקביל של (500, 375, 1000, 750)
עבור android.control.zoomRatio
של 1.0
.