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