ב-Android 15 מוצג תהליך סטנדרטי לשילוב הגדרות משתמש של אזור עניין (RoI) במסגרת קידוד הווידאו של Android. התכונה הזו מאפשרת איכות דחיסה טובה יותר של אזורי עניין באמצעות ממשקי API ציבוריים לשילוב ולניתוח של הגדרות משתמשים במקודד הווידאו.
הטמעה
ספקי SoC ויצרני ציוד מקורי יכולים לשלוט בתמיכה ב-RoI בקידוד וידאו באמצעות הדגל FEATURE_Roi. אם האפשרות FEATURE_Roi לא מופעלת, לא יחול שינוי בהתנהגות של מקודד הווידאו.
שינויים במסגרת הווידאו
בקטע הזה מפורטים השינויים במסגרת הסרטון שנדרשים כדי להטמיע את התכונה הזו.
מפתחות ב-Codec2
ב-Android 15, מיפוי פרמטר הכימות (QP_map) וההגדרה המלבנית (rect) מוגדרים כסוגי הגדרות של אזור עניין (RoI). בנוסף, נוספו שני מפתחות ל-Codec2 (C2) כדי לתמוך בסוגים החדשים האלה. השימוש בשני המפתחות זהה לשימוש בממשקי ה-API הציבוריים.
בתוך לולאת המסגרות של המקודד, ההגדרה מותאמת באופן דינמי במהלך שלב ההפעלה, לפני שהמאגר של נתוני הקלט מתווסף לתור. התהליך מתואר באופן הבא:
בתרחיש sticky, אם לא מסופקת הגדרת 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: ללא היסט QP, ה-QP נקבע על ידי בקרת הקצב המקורית.
- אם הערך שונה מאפס: QP הוא בקרת הקצב המקורית בתוספת היסט.
- אם הערך שלילי: איכות הווידאו משתפרת ב-LCU של היעד.
- אם התוצאה חיובית: איכות הווידאו יורדת ביחידת ה-LCU של היעד.
שימוש: המשתמש צריך להגדיר את המפתח הזה כבלוקים בגודל 16x16. המקודד מתאים את ההגדרה לגודל האמיתי של יחידת הדחיסה הגדולה על ידי חישוב הממוצע של הערכים של הבלוקים בגודל 16x16 ביחידת הדחיסה הגדולה.
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.
אלגוריתם מיפוי
בטבלה הבאה מוצג המיפוי ממפתחות ציבוריים למסגרת הווידאו:
| מפתחות ציבוריים או ממשקי API | מיפוי במסגרת של סרטון |
|---|---|
PARAMETER_KEY_QP_OFFSET_MAP |
הערך מועבר אל kParamIndexQpOffsetMapBuffer בתור מופע של C2InfoBuffer. |
PARAMETER_KEY_QP_OFFSET_RECTS |
הערך מומר מ-String ל-Struct C2QpOffsetRectStruct ומועבר אל C2_PARAMKEY_QP_OFFSET_RECTS. |
טיפול בשגיאות
ההטמעה של יצרן הציוד המקורי צריכה לטפל במקרים הבאים של שגיאות:
| סוג שגיאה | דוגמה | שימוש |
|---|---|---|
| כדי להפעיל את החזר ה-ROI, צריך להשתמש גם במפתח הספק וגם במפתח הסטנדרטי. | המשתמש מתקשר גם אל setFeatureEnabled(FEATURE_ROI) וגם אל מפתח הספק כדי להפעיל את RoI. |
צריך להפעיל את התכונה 'החזר על השקעה'. |
| ההיסט של QP נמצא בטווח, אבל לא נתמך על ידי ספקי SoC. | המשתמש מגדיר את ההיסט של QP כ-12, אבל המערכת על שבב (SoC) תומכת בהיסט של QP עד 10. | טווח ההיסט של QP הנתמך מוגדר כמיטב היכולת. הערך מוגבל לטווח הנתמך של ה-SoC. |
| כמה הגדרות של החזר על השקעה (בין אם מדובר במפתח סטנדרטי או במפתח ספציפי לספק) מוגדרות לפריים יחיד. | המשתמש משתמש גם במפתח סטנדרטי וגם במפתח של הספק למסגרת 1. | אם קיימת תצורת rect סטנדרטית ראשונה, תצורת QP_map סטנדרטית ראשונה או שתיהן, המסגרת שומרת אותן. בכל קטגוריה, המסגרת שולחת רק הגדרה סטנדרטית אחת ל-SoC, ואם ההגדרה הסטנדרטית זמינה, הטמעת ה-SoC צריכה להתעלם מההגדרות של הספק. אם נשלחות כמה הגדרות ל-SoC, ספק ה-SoC צריך לשמור רק הגדרת RoI אחת ולהתעלם משאר ההגדרות.ההגדרות נשמרות לפי סדר העדיפויות הבא:
|