הנחיות ליצרני ציוד מקורי (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. צריך להפעיל את ה-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