שידורי פלט, חיתוך ושינוי מרחק התצוגה

שידורי פלט

מערכת המשנה של המצלמה פועלת אך ורק על צינור עיבוד נתונים מבוסס ANativeWindow כל הרזולוציות והפורמטים של הפלט. אפשר להגדיר כמה שידורים במקביל פעם אחת לשלוח פריים יחיד ליעדים רבים כמו ה-GPU, במקודד, RenderScript, או חוצצים גלויים לאפליקציות (RAW Bayer, YUV מעובד אגי נתונים זמניים, או אגי נתונים זמניים בקידוד JPEG).

לצורך אופטימיזציה, צריך להגדיר את ערוצי הפלט האלה מראש. רק מספר מוגבל יכול להיות קיים בו-זמנית. כך אפשר לבצע הקצאה מראש של מאגרי זיכרון זמניים ותצורה של חומרת המצלמה, כך שכאשר בקשות יישלחו עם כמה צינורות עיבוד נתונים פלט או משתנים, לא עיכובים או זמן אחזור בעיבוד הבקשה.

למידע נוסף על שילובים של פלט שידור מובטח שתלויות ברמת החומרה הנתמכת. createCaptureSession()

חיתוך

חיתוך של מערך הפיקסלים המלא (עבור זום דיגיטלי ומקרי שימוש אחרים שבהם רצוי לציין שדה תעופה קטן יותר) באמצעות ANDROID_SCALER_CROP_REGION הגדרה אישית. זוהי הגדרה לכל בקשה, והיא יכולה להשתנות על בסיס בקשה. שהוא קריטי להטמעת זום דיגיטלי חלק.

האזור מוגדר כמלבן (x, y, רוחב, גובה), עם (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), למטה מדגים את אזורי הפלט הצפויים בכל זרם בכמה אזורי חיתוך לדוגמה, ברזולוציה היפותטית של 3 MP (2000x חיישן של 1500 פיקסלים.

אזור החיתוך: (500, 375, 1000, 750) (יחס גובה-רוחב של 4:3)
חיתוך זרם של 640x480: (500, 375, 1000, 750) (שווה לאזור החיתוך)
חיתוך זרם של 1280x720: (500, 469, 1000, 562)

חיתוך-אזור-43-יחס

איור 1. יחס גובה-רוחב 4:3

אזור החיתוך: (500, 375, 1333, 750) (יחס גובה-רוחב של 16:9)
חיתוך זרם של 640x480: (666, 375, 1000, 750)
חיתוך זרם של 1280x720: (500, 375, 1333, 750) (שווה לאזור החיתוך)

אזור חיתוך-169-יחס

איור 2. יחס גובה-רוחב של 16:9

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

חיתוך-אזור-11-יחס

איור 3. יחס גובה-רוחב של 1:1

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

חיתוך-אזור-43-יחס ריבוע

איור 4. יחס גובה-רוחב של 4:3, ריבוע

מתבצע עיבוד מחדש

התמיכה הנוספת בקובצי תמונה גולמית ניתנת על ידי התמיכה בעיבוד מחדש ב-RAW Bayer . התמיכה הזו מאפשרת לצינור עיבוד הנתונים של המצלמה לעבד תמונה שכבר צילם מאגר נתונים זמני ומטא-נתונים של RAW (פריים שלם שהוקלט בעבר), כדי תיצור פלט YUV או JPEG חדש מעובד.

שינוי מרחק התצוגה

במכשירים עם Android מגרסה 11 ואילך, האפליקציה יכולה להשתמש בזום של המצלמה (דיגיטלי ואופטי) באמצעות ההגדרה ANDROID_CONTROL_ZOOM_RATIO.

יחס הזום מוגדר כגורם של נקודה צפה (floating-point). במקום באמצעות ANDROID_SCALER_CROP_REGION לחיתוך ולשינוי מרחק התצוגה, אפליקציה יכולה להשתמש ANDROID_CONTROL_ZOOM_RATIO כדי לשלוט ברמת הזום, ולהשתמש ANDROID_SCALER_CROP_REGION לחיתוך אופקי ואנכי עד להשיג יחסי גובה-רוחב שונים מחיישן המצלמה המקורי.

מערכת מרובת מצלמות עשויה להכיל יותר מעדשה אחת עם הבדלים אורכי מוקד, והמשתמש יכול להשתמש בזום אופטי על ידי מעבר בין עדשות. לשימוש ב-ANDROID_CONTROL_ZOOM_RATIO יש יתרונות בתרחישים הבאים:

  • התקרבות מעדשה רחבה לעדשת טלפוטו: יחס נקודה צפה מספק דיוק טוב יותר בהשוואה לערכי מספרים שלמים של 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)

זום-יחס-2-חיתוך-43

איור 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) (שווה לאזור החיתוך)

Zoom-ratio-2-crop-169

איור 6. זום 2.0, יחס גובה-רוחב של 16:9

יחס הזום: 0.5; פי 4 של שדה ראייה מקורי (עבר מעדשה רחבה לעדשת Ultrawide)
אזור החיתוך: (250, 0, 1,500, 1,500) (יחס גובה-רוחב 1:1)
חיתוך זרם של 640x480: (250, 187, 1500, 1125) (פורמט letterbox)
חיתוך זרם של 1280x720: (250, 328, 1500, 844) (פורמט letterbox)

תמונות/זום-יחס-0.5-חיתוך-11

איור 7. זום של 0.5, יחס גובה-רוחב של 1:1

כפי שניתן לראות בתרשימים שלמעלה, מערכת הקואורדינטות של אזור החיתוך משתנה שדה התצוגה אחרי מרחק התצוגה, ומיוצג על ידי המלבן באמצעות הממדים הבאים: (0, 0, activeArrayWith, activeArrayHeight). אותו עיקרון חל על אזורים ופנים של AE/AWB/AF. השינוי הזה במערכת הקואורדינטות לא חל על צילום RAW והמטא-נתונים שקשורים אליו, כמו intrinsicCalibration ו lensShadingMap.

נשתמש באותה דוגמה היפותטית שלמעלה, ובהנחה שזרם הפלט מס' 1 (640x480) הוא ניתן להשיג זום פי 2.0 באחת משתי דרכים:

  • 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.