מקורות פלט
מערכת המשנה של המצלמה פועלת אך ורק בצינור עיבוד הנתונים שמבוסס על ANativeWindow לכל הרזולוציות ופורמטים הפלט. אפשר להגדיר כמה שידורים בו-זמנית כדי לשלוח פריים אחד למספר יעדים, כמו ה-GPU, מקודד הווידאו, RenderScript או מאגרים שגלויים לאפליקציה (מאגרים של Bayer RAW, מאגרים של 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,000 x 1,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, ריבועית
עיבוד מחדש
תמיכה נוספת בקובצי תמונות גולמיות ניתנת על ידי תמיכה בעיבוד חוזר של נתוני Bayer בפורמט RAW. התמיכה הזו מאפשרת לצינור עיבוד הנתונים של המצלמה לעבד מטא-נתונים ורענון של נתוני 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
תומך בהתרחקות (<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) (פורמט pillarbox)
חיתוך של שידור 1280x720: (0, 187, 2000, 1125) (שווה לאזור החיתוך)

איור 6. זום 2.0, יחס גובה-רוחב של 16:9
יחס זום: 0.5; פי 4 משדה הראייה המקורי (מעבר מעדשה רחבה לעדשה רחבה במיוחד)
אזור חיתוך: (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.0x באחת משתי דרכים:
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
.