導入 RoI 的 OEM 指南

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 設定。

kParamIndexQpOffsetMapBufferC2InfoBuffer 中的位元組陣列,包含下列屬性:

  • 長度:一個影格中的 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 會將投資報酬率設為 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")
}

其中:

  • topleft:矩形 RoI 的座標。RoI 會延展,以對齊 LCU 邊界。這個值代表每個像素的左上角,因此 ((0,0), (16, 16)) 會定義完整的 16x16 區塊。

  • qpOffset:陣列中的每個值都代表目標區域的 QP 偏移。rect定義和用法與 kParamIndexQpOffsetMapBuffer 值相同。

對應演算法

下表顯示公開金鑰對應的影片架構:

公開金鑰或 API 影片架構中的對應
PARAMETER_KEY_QP_OFFSET_MAP 值會以 C2InfoBuffer 例項的形式傳遞至 kParamIndexQpOffsetMapBuffer
PARAMETER_KEY_QP_OFFSET_RECTS 值會從 String 轉換為 Struct C2QpOffsetRectStruct,並傳遞至 C2_PARAMKEY_QP_OFFSET_RECTS

處理錯誤

OEM 實作項目必須處理下列錯誤情況:

錯誤案例 範例 使用方式
系統會使用供應商金鑰和標準化金鑰啟用投資報酬率。 使用者同時呼叫 setFeatureEnabled(FEATURE_ROI) 和供應商金鑰,開啟 RoI。 必須開啟 RoI。
QP 偏移量在範圍內,但 SoC 供應商不支援。 使用者將 QP 偏移量設為 12,但 SoC 最高僅支援 QP 偏移量 10。 支援的 QP 偏移範圍會盡量以最佳方式執行。該值會限制在 SoC 支援的範圍內。
多個投資報酬率設定 (無論是標準化鍵或廠商專屬鍵) 都會設為單一影格。 使用者同時使用標準化金鑰和供應商金鑰,取得影格 1 的授權。 如果有的話,架構會保留第一個標準化 rect 設定、第一個標準化 QP_map 設定,或兩者皆保留。在每個類別中,架構只會將一個標準化設定傳送至 SoC,如果標準化設定可用,SoC 實作就必須忽略供應商設定。如果將多個設定傳送至 SoC,SoC 供應商必須只保留一個 RoI 設定,並忽略其餘設定。

系統會依下列優先順序保留設定:

  1. 標準化 rect
  2. 標準化 QP_map
  3. 供應商 rect
  4. 供應商 QP_map