Android 15 推出了標準化程序,可將感興趣區域 (RoI) 使用者設定整合至 Android 影片編碼架構。這項功能提供公開 API,可將使用者設定整合至影片編碼器並進行分析,進而提升 RoI 的壓縮品質。
實作
SoC 供應商和原始設備製造商 (OEM) 可以使用 FEATURE_Roi
標記,控制影片編碼的 RoI 支援功能。如果未啟用 FEATURE_Roi
,影片編碼器的行為就不會有所變更。
影片架構異動
本節將詳細說明實作此功能所需的影片架構變更。
Codec2 中的鍵
在 Android 15 中,量化參數對應項目 (QP_map
) 和矩形設定 (rect
) 會定義為 RoI 設定類型。此外,Codec2 (C2) 中也推出了兩個鍵,以支援這些新類型。這兩組金鑰的用法與公開 API 相同。在編碼器的框架迴圈中,設定會在執行階段動態調整,也就是在輸入緩衝區排入佇列之前,如下所述:
在黏滯情況下,如果沒有為目前影格提供 RoI 設定,編碼器會使用與上一個影格相同的設定。
在動態情況下,投資報酬率設定類型會隨之變動。
以下各節將說明 C2 中的新鍵。
kParamIndexQpOffsetMapBuffer
kParamIndexQpOffsetMapBuffer
鍵會為影格傳送 qp-offset
對應表信號。其值會使用 setParameters
中的輸入參數 PARAMETER_KEY_QP_OFFSET_MAP
設定。
kParamIndexQpOffsetMapBuffer
是 C2InfoBuffer
中的位元組陣列,具有下列屬性:
長度:一個影格中的 16x16 區塊數量。
值:陣列的每個值都是 16x16 區塊的 QP 偏移量,範圍為 -51 至 51。目標最大編碼單元 (LCU) 的 QP 會透過編碼器速率控制加上偏移量來計算。如果計算結果超過 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
。其值會使用 setParameters
中的輸入參數 PARAMETER_KEY_QP_OFFSET_RECTS
進行設定。
為了支援這個鍵,我們引入了以下結構 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
:陣列的每個值都代表目標rect
區域的 QP 偏移量。其定義和用法與kParamIndexQpOffsetMapBuffer
值相同。
對應演算法
下表顯示公開金鑰與影片架構的對應關係:
公開金鑰或 API | 在影片架構中對應 |
---|---|
PARAMETER_KEY_QP_OFFSET_MAP |
值會以 C2InfoBuffer 例項的形式傳遞至 kParamIndexQpOffsetMapBuffer 。 |
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 僅支援最高 10 的 QP 偏移值。 | 系統會盡力支援 QP 偏移範圍。這個值會箝制至 SoC 支援的範圍。 |
將多個 RoI 設定 (無論是標準化鍵還是供應商專屬鍵) 設為單一影格。 | 使用者同時使用標準化金鑰和供應商金鑰來處理第 1 個影格。 | 如果可用,架構會保留第一個標準化 rect 設定、第一個標準化 QP_map 設定,或兩者皆保留。在每個類別中,架構只會將一個標準化設定傳送至 SoC,如果有可用的標準化設定,SoC 實作必須忽略供應商設定。如果有多個設定傳送至 SoC,SoC 供應商必須只保留一個 RoI 設定,並忽略其餘設定。系統會依下列優先順序保留設定:
|