מקורות פלט
מערכת המשנה של המצלמה פועלת רק על צינור עיבוד נתונים מבוסס 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,000 x 1,500 פיקסלים).
אזור החיתוך: (500, 375, 1,000, 750) (יחס גובה-רוחב של 4:3)
חיתוך זרם של 640x480: (500, 375, 1,000, 750) (שווה לאזור החיתוך)
חיתוך 1280x720: (500, 069, 500, 069, 1,000, 750)
אזור החיתוך: (500, 375, 1333, 750) (יחס גובה-רוחב של 16:9)
חיתוך זרם של 640x480: (666, 375, 1,000, 750)
חיתוך של 1280x720: (500, 375, e 503, equal, e 5033,
אזור החיתוך: (500, 375, 750, 750) (יחס גובה-רוחב של 1:1)
חיתוך זרם של 640x480: (500, 469, 750, 562)
חיתוך של 1280x720: (500, 543, 750, 414)
דוגמה אחרונה: שידור ביחס גובה-רוחב מרובע של 1024x1024 במקום השידור באיכות 480p:
אזור החיתוך: (500, 375, 1000, 750) (יחס גובה-רוחב של 4:3)
חיתוך של שידור ביחס גובה-רוחב של 1024x1024: (625, 375, 750, 750)
חיתוך של שידור ביחס גובה-רוחב של 1280x720: (500, 469, 1000, 562)
עיבוד מחדש
תמיכה נוספת בקובצי תמונות גולמיות ניתנת על ידי תמיכה בעיבוד חוזר של נתוני 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, 2,000, 1500) (יחס גובה-רוחב 4:3)
חיתוך זרם של 640x480: (0, 0, 2000, 1,500) (שווה לאזור חיתוך 1,500, שידור 1280x720)
1280x720
יחס הזום: 2.0, 1/4 משדה הראייה המקורי
אזור החיתוך: (0, 187, 2000, 1125) (יחס גובה-רוחב של 16:9)
חיתוך זרם של 640x480: (250, 187, 1,500, 1125) (אזור חיתוך 1,000, 1125), (יחס גובה-רוחב של 16:9) (יחס גובה-רוחב של 16:9) (250, 187, 1,500, 1125) (אזור חיתוך 1,200, ו-1125)
1
יחס זום: 0.5; פי 4 משדה הראייה המקורי (מעבר מעדשה רחבה לעדשה רחבה במיוחד)
אזור חיתוך: (250, 0, 1500, 1500) (יחס גובה-רוחב 1:1)
חיתוך של שידור 640x480: (250, 187, 1500, 1125) (letterboxed)
חיתוך של שידור 1280x720: (250, 328, 1500, 844) (letterboxed)
כפי שרואים בתרשים שלמעלה, מערכת הקואורדינטות של אזור החיתוך משתנה לשטח התצוגה היעיל אחרי הזום, והיא מיוצגת על ידי מלבן בגודל הבא: (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
.