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