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

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

הטמעה

ספקי SoC ויצרני ציוד מקורי יכולים לשלוט בתמיכה ב-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.

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

בטבלה הבאה מוצג המיפוי מהמפתחות הציבוריים ל-framework של הווידאו:

מפתחות ציבוריים או ממשקי 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 הנתמך נשאר כניסיון הטוב ביותר. הערך מוגבל לטווח הנתמך של המעבד.
כמה הגדרות של RoI (מפתח סטנדרטי או מפתח ספציפי לספק) מוגדרות למסגרת אחת. המשתמש משתמש גם במפתח סטנדרטי וגם במפתח ספק למסגרת 1. אם התצורה זמינה, היא נשמרת במסגרת בתור התצורה הראשונה של rect, בתור התצורה הראשונה של QP_map או בשתיהן. בכל קטגוריה, המסגרת שולחת רק הגדרה סטנדרטית אחת ל-SoC, ואם ההגדרה הסטנדרטית זמינה, ההטמעה של ה-SoC חייבת להתעלם מההגדרות של הספק. אם נשלחות כמה מערכים של הגדרות אישיות ל-SoC, ספק ה-SoC צריך לשמור רק הגדרה אחת של RoI ולתעלם משאר ההגדרות.

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

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