הנחיות ליצרני ציוד מקורי (OEM) להטמעת החזר ROI

ב-Android 15 מוצג תהליך סטנדרטי לשילוב הגדרות של משתמשים לגבי אזור עניין (RoI) במסגרת הקידוד של סרטונים ב-Android. התכונה הזו מאפשרת לשפר את איכות הדחיסה של אזורי העניין (ROI) על ידי הצעת ממשקי API ציבוריים לשילוב ולניתוח של הגדרות המשתמש בתוך מקודד הווידאו.

הטמעה

ספקי SoC ו-OEM יכולים לקבוע את התמיכה ב-ROI לקידוד וידאו באמצעות הדגל FEATURE_Roi. אם האפשרות FEATURE_Roi לא מופעלת, לא חל שינוי בהתנהגות של מקודד הווידאו.

שינויים במסגרת של הסרטון

בקטע הזה מפורטים השינויים במסגרת הסרטונים שנדרשים כדי להטמיע את התכונה הזו.

מפתחות ב-Codec2

ב-Android 15, מפת הפרמטרים של הקידוד (QP_map) והתצורה המלבנית (rect) מוגדרים כסוגי תצורה של RoI. בנוסף, נוספו שני מפתחות ב-Codec2‏ (C2) כדי לתמוך בסוגי הנתונים החדשים האלה. השימוש בשני המפתחות זהה לשימוש בממשקי ה-API הציבוריים. בתוך לולאת המסגרות של המקודד, ההגדרות משתנות באופן דינמי במהלך שלב ההרצה, לפני שהנתונים נכנסים לתור במאגר הקלט, באופן הבא:

  • בתרחיש דביק, אם לא צוינה הגדרת RoI לפריים הנוכחי, הקודק משתמש באותה הגדרה כמו בפריים הקודם.

  • בתרחיש דינמי, סוגי ההגדרות של החזר ה-ROI יכולים להשתנות באופן דינמי.

המפתחות החדשים ב-C2 מתוארים בקטעים הבאים.

kParamIndexQpOffsetMapBuffer

המקש kParamIndexQpOffsetMapBuffer מאותת למפה qp-offset על פריים. הערך שלו מוגדר באמצעות פרמטר הקלט PARAMETER_KEY_QP_OFFSET_MAP מ-setParameters.

kParamIndexQpOffsetMapBuffer הוא מערך בייטים ב-C2InfoBuffer, עם המאפיינים הבאים:

  • אורך: מספר הבלוקסים בגודל 16x16 בפריים אחד.

  • ערך: כל ערך במערך הוא ההיסט של QP בבלוק 16x16, באזור ‎-51~51. ה-QP של יחידת הקוד הגדולה ביותר ביעד (LCU) מחושב על ידי בקרת הקצב של המקודד בתוספת ההיסט. אם התוצאה המחושבת חורגת מהטווח 0 עד 51, הערך יקוצר לטווח 0 עד 51.

    • אם 0: אין שינוי QP, ה-QP נקבע על ידי בקרת הקצב המקורית.
    • אם הערך אינו אפס: QP הוא בקרת הקצב המקורית בתוספת הפרש.
    • אם הערך שלילי: איכות הווידאו משתפרת ב-LCU היעד.
    • אם הערך חיובי: איכות הווידאו יורדת ב-LCU היעד.
  • שימוש: המשתמש צריך להגדיר את המפתח הזה כבלוקים בגודל 16x16. המקודד מתאים את ההגדרה לגודל האמיתי של ה-LCU על ידי חישוב הממוצע של הערכים של הבלוקים בגודל 16x16 ב-LCU.

C2_PARAMKEY_QP_OFFSET_RECTS

המפתח C2_PARAMKEY_QP_OFFSET_RECTS (שמוגדר כ-coding.qp-offset-rects) מגדיר את ROI כ-QpOffset-Rects. הערך שלו מוגדר באמצעות פרמטר הקלט PARAMETER_KEY_QP_OFFSET_RECTS מ-setParameters.

כדי לתמוך במפתח הזה, הוצג המבנה הבא C2QpOffsetRectStruct:

struct C2QpOffsetRectStruct : C2Rect {
  int32_t qpOffset;

  DEFINE_AND_DESCRIBE_C2STRUCT(QpOffsetRect)
  C2FIELD(width, "width")
  C2FIELD(height, "height")
  C2FIELD(left, "left")
  C2FIELD(top, "top")
  C2FIELD(qpOffset, "qp-offset")
}

איפה:

  • top ו-left: הקואורדינטות של אזור העניין, בצורה מלבנית. ההחזר ה-ROI מתרחב כדי להתאים לגבולות של LCU. הערך מייצג את הפינה השמאלית העליונה של כל פיקסל, כך ש-((0,0), (16, 16)) מגדיר בלוק מלא בגודל 16x16.

  • qpOffset: כל ערך במערך מייצג את ההיסט של QP באזור היעד rect. ההגדרה והשימוש שלו זהים לאלה של הערך kParamIndexQpOffsetMapBuffer.

אלגוריתם למיפוי

בטבלה הבאה מוצג המיפוי מהמפתחות הציבוריים למסגרת הסרטון:

מפתחות ציבוריים או ממשקי API מיפוי במסגרת הווידאו
PARAMETER_KEY_QP_OFFSET_MAP הערך מועבר אל kParamIndexQpOffsetMapBuffer בתור מכונה של C2InfoBuffer.
PARAMETER_KEY_QP_OFFSET_RECTS הערך מומר מ-String ל-Struct C2QpOffsetRectStruct ומוענק ל-C2_PARAMKEY_QP_OFFSET_RECTS.

טיפול בשגיאות

הטמעת ה-OEM חייבת לטפל במקרים הבאים של שגיאות:

מקרה שגיאה דוגמה שימוש
גם מפתח הספק וגם המפתח הסטנדרטי משמשים להפעלת RoI. המשתמש קורא גם ל-setFeatureEnabled(FEATURE_ROI) וגם למפתח של הספק כדי להפעיל את ההחזר על ההשקעה. צריך להפעיל את ה-ROI.
ההיסט של QP נמצא בטווח, אבל הוא לא נתמך על ידי ספקי SoC. המשתמש מגדיר את ההיסט של QP כ-12, אבל המעבד (SoC) תומך בהיסט של QP עד 10 בלבד. טווח ההיסט של QP שנתמך נשאר כמיטב יכולת. הערך מוגבל לטווח הנתמך של ה-SoC.
כמה הגדרות של RoI (מפתח סטנדרטי או מפתח ספציפי לספק) מוגדרות לפריים יחיד. המשתמש משתמש גם במפתח סטנדרטי וגם במפתח של הספק למסגרת 1. אם ההגדרה זמינה, המסגרת שומרת את ההגדרה הראשונה של rect שמוגדרת כסטנדרטית, את ההגדרה הראשונה של QP_map שמוגדרת כסטנדרטית או את שתיהן. בכל קטגוריה, המסגרת שולחת רק הגדרה סטנדרטית אחת ל-SoC, ואם ההגדרה הסטנדרטית זמינה, ההטמעה של ה-SoC חייבת להתעלם מההגדרות של הספק. אם נשלחות כמה הגדרות ל-SoC, ספק ה-SoC צריך לשמור רק הגדרת RoI אחת ולהתעלם משאר ההגדרות.

ההגדרות נשמרות לפי סדר העדיפויות הזה:

  1. סטנדרטי rect
  2. סטנדרטי QP_map
  3. ספק rect
  4. ספק QP_map