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

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

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