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

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

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