Hướng dẫn của OEM (Nhà sản xuất thiết bị gốc) về cách triển khai RoI

Android 15 giới thiệu một quy trình chuẩn để tích hợp cấu hình người dùng khu vực quan tâm (RoI) vào khung mã hoá video Android. Tính năng này mang lại chất lượng nén tốt hơn cho RoI, bằng cách cung cấp các API công khai để tích hợp và phân tích cấu hình của người dùng vào bộ mã hoá video.

Triển khai

Các nhà cung cấp hệ thống SoC (SoC) và OEM (Nhà sản xuất thiết bị gốc) có thể kiểm soát tính năng hỗ trợ RoI (Chỉ thị trường) để mã hoá video bằng cờ FEATURE_Roi. Nếu bạn không bật FEATURE_Roi, thì hành vi của bộ mã hoá video sẽ không thay đổi.

Các thay đổi về khung video

Phần này trình bày chi tiết những thay đổi trong khung video cần thiết để triển khai tính năng này.

Các khoá trong bộ mã hoá và giải mã 2

Trong Android 15, bản đồ thông số lượng tử hoá (QP_map) và cấu hình hình chữ nhật (rect) được xác định là các loại cấu hình RoI. Ngoài ra, 2 khoá được giới thiệu trong Codec2 (C2) để hỗ trợ các kiểu mới này. Cả hai khoá đều có cách sử dụng giống như API công khai. Trong vòng lặp khung của bộ mã hoá, cấu hình được điều chỉnh linh động trong giai đoạn chạy, trước khi bộ đệm đầu vào được đưa vào hàng đợi, như mô tả như sau:

  • Trong trường hợp bám, nếu không có cấu hình RoI nào được cung cấp cho khung hình hiện tại, thì bộ mã hoá sẽ sử dụng cấu hình giống như khung hình trước.

  • Trong trường hợp động, các loại cấu hình RoI có thể thay đổi linh động.

Các khoá mới trong C2 được mô tả trong các phần sau.

kParamIndexQpOffsetMapBuffer

Khoá kParamIndexQpOffsetMapBuffer báo hiệu cho bản đồ qp-offset về một khung. Giá trị của lớp này được đặt bằng cách sử dụng tham số đầu vào PARAMETER_KEY_QP_OFFSET_MAP từ setParameters.

kParamIndexQpOffsetMapBuffer là một mảng byte trong C2InfoBuffer, với các thuộc tính sau:

  • Chiều dài: Số lượng khối 16x16 trong một khung.

  • Giá trị: Mỗi giá trị của mảng là độ lệch QP của một khối 16x16, trong vùng -51~51. QP của đơn vị mã hoá lớn nhất mục tiêu (LCU) được tính bằng bộ điều khiển tốc độ của bộ mã hoá cộng với độ lệch. Nếu kết quả tính toán vượt quá vùng 0~51, thì giá trị sẽ bị cắt bớt thành 0~51.

    • Nếu 0: Không có độ lệch QP, QP được quyết định bằng chế độ kiểm soát tốc độ ban đầu.
    • Nếu khác 0: QP là mức kiểm soát giá gốc cộng với mức chênh lệch.
    • Nếu âm: Chất lượng video được cải thiện trong LCU mục tiêu.
    • Nếu dương: Chất lượng video giảm trong LCU mục tiêu.
  • Cách sử dụng: Người dùng phải định cấu hình khoá này dưới dạng các khối 16x16. Bộ mã hoá điều chỉnh cấu hình theo kích thước LCU thực bằng cách trung bình các giá trị của các khối 16x16 trong LCU.

C2_PARAMKEY_QP_OFFSET_RECTS

Khoá C2_PARAMKEY_QP_OFFSET_RECTS (đặt thành coding.qp-offset-rects sẽ đặt RoI thành QpOffset-Rects. Giá trị của biến này được đặt bằng cách sử dụng tham số đầu vào PARAMETER_KEY_QP_OFFSET_RECTS từ setParameters.

Để hỗ trợ khoá này, cấu trúc C2QpOffsetRectStruct sau đây được giới thiệu:

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")
}

Trong trường hợp:

  • topleft: Toạ độ của ROI, ở dạng hình chữ nhật. RoI được kéo dài để căn chỉnh với ranh giới LCU. Giá trị này thể hiện góc trên bên trái của mỗi pixel, sao cho ((0,0), (16, 16)) xác định một khối 16x16 đầy đủ.

  • qpOffset: Mỗi giá trị của mảng đại diện cho độ lệch QP của vùng rect mục tiêu. Định nghĩa và cách sử dụng thuộc tính này giống như định nghĩa và cách sử dụng của giá trị kParamIndexQpOffsetMapBuffer.

Thuật toán ánh xạ

Bảng sau đây cho thấy mối liên kết từ khoá công khai đến khung video:

Khoá công khai hoặc API Liên kết trong khung video
PARAMETER_KEY_QP_OFFSET_MAP Giá trị được truyền đến kParamIndexQpOffsetMapBuffer dưới dạng thực thể C2InfoBuffer.
PARAMETER_KEY_QP_OFFSET_RECTS Giá trị được chuyển đổi từ String sang Struct C2QpOffsetRectStruct và truyền vào C2_PARAMKEY_QP_OFFSET_RECTS.

Xử lý lỗi

Việc triển khai OEM phải xử lý các trường hợp lỗi sau:

Trường hợp lỗi Ví dụ Sử dụng
Cả khoá của nhà cung cấp và khoá được chuẩn hoá đều dùng để bật RoI. Người dùng gọi cả setFeatureEnabled(FEATURE_ROI) VÀ khoá nhà cung cấp để bật RoI. Bạn phải bật chiến lược Lợi tức đầu tư (ROI).
Độ lệch QP nằm trong phạm vi nhưng không được các nhà cung cấp SoC hỗ trợ. Người dùng thiết lập độ lệch QP là 12, nhưng SoC chỉ hỗ trợ độ lệch QP tối đa là 10. Phạm vi độ lệch QP được hỗ trợ được để ở mức tối ưu nhất. Giá trị này được giới hạn ở phạm vi được hỗ trợ của SoC.
Nhiều cấu hình RoI (cho dù là khoá được chuẩn hoá hay khoá dành riêng cho nhà cung cấp) được đặt thành một khung duy nhất. Người dùng sử dụng cả khoá chuẩn hoá và khoá nhà cung cấp cho khung 1. Nếu có, khung sẽ giữ lại cấu hình rect được chuẩn hoá đầu tiên, cấu hình QP_map được chuẩn hoá đầu tiên hoặc cả hai. Trong mỗi danh mục, khung chỉ gửi một cấu hình tiêu chuẩn đến SoC và nếu có cấu hình tiêu chuẩn, thì quá trình triển khai SoC phải bỏ qua cấu hình của nhà cung cấp. Nếu nhiều cấu hình được gửi đến SoC, thì nhà cung cấp SoC chỉ được giữ lại một cấu hình RoI và bỏ qua các cấu hình còn lại.

Các cấu hình được giữ lại theo thứ tự ưu tiên sau:

  1. rect được tiêu chuẩn hóa
  2. QP_map được chuẩn hoá
  3. Nhà cung cấp rect
  4. Nhà cung cấp QP_map