Android 15 giới thiệu một quy trình chuẩn hoá để tích hợp các cấu hình người dùng về vùng quan tâm (RoI) vào khung mã hoá video Android. Tính năng này giúp cải thiện chất lượng nén cho các 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 người dùng vào bộ mã hoá video.
Triển khai
Nhà cung cấp SoC và OEM có thể kiểm soát việc hỗ trợ RoI cho hoạt động mã hoá video bằng cờ FEATURE_Roi
. Nếu bạn không bật FEATURE_Roi
, thì sẽ không có thay đổi nào về hành vi của bộ mã hoá video.
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.
Khoá trong Codec2
Trong Android 15, bản đồ tham 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 loại khoá mới này. Cách sử dụng cho cả hai khoá này đều giống như các API công khai.
Trong vòng lặp khung hình của bộ mã hoá, cấu hình được điều chỉnh linh hoạt trong giai đoạn chạy, trước khi bộ đệm đầu vào được xếp hàng đợi, được mô tả như sau:
Trong trường hợp cố định, 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ùng một cấu hình 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 hoạt.
Các khoá mới trong C2 được mô tả trong các phần sau.
kParamIndexQpOffsetMapBuffer
Khoá kParamIndexQpOffsetMapBuffer
báo hiệu bản đồ qp-offset
cho một khung hình. Giá trị của tham số này được đặt bằ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:
Độ dài: Số lượng khối 16x16 trong một khung hình.
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 (LCU) mục tiêu được tính bằng cách kiểm soát tốc độ 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, giá trị sẽ bị cắt bớt thành 0~51.
- Nếu là 0: Không có độ lệch QP, QP do chế độ kiểm soát tốc độ ban đầu quyết định.
- Nếu khác 0: QP là chế độ kiểm soát tốc độ ban đầu cộng với độ lệch.
- Nếu âm tính: Chất lượng video sẽ được cải thiện trong LCU mục tiêu.
- Nếu có: Chất lượng video sẽ 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 tính trung bình các giá trị của khối 16x16 trong LCU.
C2_PARAMKEY_QP_OFFSET_RECTS
Khoá C2_PARAMKEY_QP_OFFSET_RECTS
(được đặt thành coding.qp-offset-rects
đặt RoI thành QpOffset-Rects
. Giá trị của tham số này được đặt bằ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 sẽ đượ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:
top
vàleft
: Toạ độ của RoI, ở dạng hình chữ nhật. RoI được kéo dài để căn chỉnh theo ranh giới LCU. Giá trị này biểu thị góc trên cùng 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ùngrect
mục tiêu. Định nghĩa và cách sử dụng của giá trị này giống với giá trịkParamIndexQpOffsetMapBuffer
.
Thuật toán liên kết
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 một thực thể C2InfoBuffer . |
PARAMETER_KEY_QP_OFFSET_RECTS |
Giá trị được chuyển đổi từ String thành Struct C2QpOffsetRectStruct và được truyền đến C2_PARAMKEY_QP_OFFSET_RECTS . |
Xử lý lỗi
Việc triển khai của 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á tiêu chuẩn đều được dùng để bật RoI. | Người dùng gọi cả setFeatureEnabled(FEATURE_ROI) VÀ khoá của nhà cung cấp để bật RoI. |
Bạn phải bật RoI. |
Độ lệch QP nằm trong phạm vi nhưng không được nhà cung cấp SoC hỗ trợ. | Người dùng đặt độ lệch QP là 12, nhưng SoC chỉ hỗ trợ độ lệch QP tối đa là 10. | Phạm vi bù QP được hỗ trợ được giữ nguyên ở mức tối ưu nhất có thể. Giá trị này được giới hạn trong phạm vi được SoC hỗ trợ. |
Nhiều cấu hình RoI (cho dù là khoá tiêu chuẩn hay khoá dành riêng cho nhà cung cấp) được đặt thành một khung hình duy nhất. | Người dùng sử dụng cả khoá tiêu chuẩn và khoá của nhà cung cấp cho khung hình 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 hoá đến SoC và nếu có cấu hình tiêu chuẩn hoá, thì quá trình triển khai SoC phải bỏ qua các 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:
|