הנחיות 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 מגדירה את ההחזר על הוצאות הפרסום כ-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 מיפוי ב-framework של סרטון
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