מיפוי גוונים של HDR Luminance לטווח תואם ל-SDR

ב-Android 13 חדש: פריט סטטי שאפשר להגדיר על ידי הספק ספרייה שנקראת libtonemap, שמגדירה פעולות של מיפוי טונים, ומשותפת באמצעות תהליך SurfaceFlinger וההטמעות של Hardware Composer (HWC). התכונה הזו מאפשרת ליצרני ציוד מקורי להגדיר ולשתף את מיפוי גווני המסך שלהם אלגוריתמים בין ה-framework לבין הספקים, וכך לצמצם את חוסר ההתאמה בטון מיפוי.

לפני Android 13, מיפוי גוונים ספציפי למסך הפעולות לא שותפו בין HWC, SurfaceFlinger והאפליקציות. בהתאם בנתיב הרינדור, ובמקרה של תוכן HDR, הדבר גרם לאי-התאמות באיכות התמונה שבו תוכן ה-HDR מופה בטון למרחב פלט בדרכים שונות. הזה היה ניתן להבחין בתרחישים כמו סיבוב מסך, שבהם הקומפוזיציה שינויים באסטרטגיה בין ה-GPU ל-DPU, והבדלים בעיבוד בין TextureView ל-SurfaceView.

בדף זה מתוארים פרטי הממשק, ההתאמה האישית ופרטי האימות של הספרייה libtonemap.

ממשק עם ספריית מיפוי הגוונים

libtonemap מכילה הטמעות שמגובות במעבד (CPU) ורכיבי הצללה (shader) של SkSL, מחובר על ידי SurfaceFlinger לצורך הרכבה של קצה עורפי של GPU ועל ידי HWC עבור כדי ליצור טבלת חיפוש מידע של מיפוי טונים (LUT). נקודת הכניסה אל libtonemap היא android::tonemap::getToneMapper(), שמחזירה אובייקט מטמיעים את הממשק ToneMapper.

הממשק של ToneMapper תומך ביכולות הבאות:

  • יצירת טבלת LUT למיפוי גוונים

    הממשק ToneMapper::lookupTonemapGain הוא מעבד (CPU) של תוכנת ההצללה שהוגדרה ב-libtonemap_LookupTonemapGain(). הזה משמש לבדיקות יחידה במסגרת ה-framework, ושותפים יכולים להשתמש בו כדי עזרה ביצירת LUT למיפוי גוונים בצינור הצבעים שלהם.

    libtonemap_LookupTonemapGain() מקבל ערכי צבע מוחלטים, מרחב ליניארי לא מנורמל, גם ב-RGB ליניארי וגם ב-XYZ, ומחזיר ערך של מספר ממשי (float) שמתארת כמה להכפיל את צבעי הקלט במרחב ליניארי.

  • יצירת תוכנת הצללה (shader) של SkSL

    הממשק ToneMapper::generateTonemapGainShaderSkSL() מחזיר מחרוזת של תוכנת ההצללה (shader) SkSL, עם מרחב נתונים של מקור ויעד. תוכנת ההצללה של SkSL מחובר להטמעה של Skia עבור RenderEngine, את רכיב הקומפוזיציה שמואץ באמצעות GPU ל-SurfaceFlinger. גם תוכנת ההצללה מחובר אל libhwui, כדי שניתן יהיה לבצע ביעילות מיפוי גוונים של HDR ל-SDR עבור TextureView. מכיוון שהמחרוזת שנוצרה ממולאת בכלי להצללה (shader) אחרים של SkSL ב-Skia, תוכנת ההצללה חייבת לפעול בהתאם לכללים הבאים:

    • מחרוזת ההצללה חייבת לכלול נקודת כניסה עם חתימה אחת (float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz)), כאשר linearRGB הוא הערך של ערכי ה-nit המוחלטים של הפיקסלים ב-RGB במרחב ליניארי ו-xyz הוא linearRGB מומר ל-XYZ.
    • כל שיטת סיוע שמשמשת את מחרוזת ההצללה חייבת להתחיל בקידומת המחרוזת libtonemap_, כדי שלא תהיה התנגשות בין ההגדרות של תוכנת ההצללה (shader) של framework. באופן דומה, מדי קלט חייב להתחיל ב-in_libtonemap_.
  • יצירה של מדי SkSL

    הממשק ToneMapper::generateShaderSkSLUniforms() מחזיר את הפונקציה בהמשך, בהינתן מטא-נתונים struct שמתארים מטא-נתונים ממערכות HDR שונות הסטנדרטים ותנאי התצוגה:

    • רשימה של מדים עם תוכנת הצללה (shader) של SkSL.

    • הערכים האחידים in_libtonemap_displayMaxLuminance ו- in_libtonemap_inputMaxLuminance. הערכים האלה נמצאים בשימוש על ידי תוכנות הצללה (shader) של framework כשמשנים את קנה המידה של הקלט ל-libtonemap, ומנורמלים את הפלט הרלוונטי.

    כיום תהליך יצירת המדים אינו תלוי בקלט במרחב הנתונים של הפלט.

התאמה אישית

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

מומלץ מאוד ליצרני ציוד מקורי לבטל את ההטמעה של libtonemap כדי מגדירים תת-מחלקה ToneMapper משלהם, שמוחזרת באמצעות getToneMapper(). בעת התאמה אישית של ההטמעה, השותפים צריכים לבצע אחת מהפעולות הבאות הבאים:

  • יש לשנות את ההטמעה של libtonemap ישירות.
  • להגדיר את הספרייה הסטטית שלהם, להרכיב את הספרייה בנפרד, להחליף את הקובץ .a של הספרייה libtonemap בקובץ שנוצר מהתמונה בהתאמה אישית לספרייה.

ספקים לא צריכים לשנות אף קוד ליבה (kernel), אך מספר ספקים צריכים לשנות לספק פרטים על האלגוריתמים למיפוי טונים של DPU יישום בפועל.

אימות

כדי לאמת את ההטמעה, פועלים לפי השלבים הבאים:

  1. ניתן להפעיל סרטוני HDR על מסך של כל תקני HDR שמערכת המסך שלך תומכת בו, למשל HLG, HDR10, HDR10+ או DolbyVision.

  2. יש להחליף את המצב של הרכב ה-GPU כדי לוודא שהמשתמש לא יכול לראות הבהובים.

    משתמשים בפקודה adb הבאה כדי להחליף את המצב של הרכב ה-GPU:

    adb shell service call SurfaceFlinger 1008 i32 <0 to enable HWC composition,
    1 to force GPU composition>
    

בעיות נפוצות

במהלך ההטמעה הזאת, עלולות להתרחש הבעיות הבאות:

  • התדרים נוצרים כשיעד העיבוד שמשמש את הרכבת ה-GPU נמוך יותר יותר מהערך הטיפוסי של תוכן HDR. לדוגמה, הפסים יכולים כאשר הטמעת HWC תומכת בפורמטים אטומים של 10 ביט ל-HDR, RGBA1010102 או P010, אבל נדרשת יצירה של הרכב ה-GPU בפורמט של 8 ביט כמו RGBA8888 לתמיכה באלפא.

  • שינוי עדין בצבע נגרם עקב הבדלים בכימות אם ה-DPU פועלת ברמת דיוק שונה מזו של ה-GPU.

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