Android 15 ra mắt một quy trình chuẩn hoá để tích hợp cấu hình người dùng của khu vực quan tâm (RoI) vào video Android khung mã hoá. Tính năng này giúp cải thiện chất lượng né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 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 tính năng hỗ trợ RoI cho việc 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.
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 đồ 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 loại mới này. Cách sử dụng cả hai khoá này giống với 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 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 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
kParamIndexQpOffsetMapBuffer
chính sẽ báo hiệu cho bản đồ qp-offset
cho một khung. Giá trị của biến này được đặt bằng cách sử dụng đầu vào
tham số PARAMETER_KEY_QP_OFFSET_MAP
từ setParameters
.
kParamIndexQpOffsetMapBuffer
là một mảng byte trong
C2InfoBuffer
thân mến!
với các thuộc tính sau:
Chiều dài: Số 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 mục tiêu (LCU) được tính bằng 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á khoảng từ 0 đến 51 thì giá trị được cắt ngắn 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 tăng cường 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_OFFSETS
Khoá C2_PARAMKEY_QP_OFFSET_RECTS
(được đặt thành coding.qp-offset-rects
) đặt RoI thành QpOffset-Rects
. Giá trị của thuộc tính 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 sau C2QpOffsetRectStruct
đượ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 là kéo dài để phù hợp với ranh giới của LCU. Giá trị biểu thị góc trên cùng bên trái của mỗi điểm ảnh, 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 này giống như của Giá trịkParamIndexQpOffsetMapBuffer
.
Thuật toán ánh xạ
Bảng sau đây trình bày mối liên kết từ khoá công khai đến video khung:
Khoá hoặc API công khai | Liên kết trong khung video |
---|---|
PARAMETER_KEY_QP_OFFSET_MAP |
Giá trị được truyền vào kParamIndexQpOffsetMapBuffer dưới dạng một thực thể C2InfoBuffer . |
PARAMETER_KEY_QP_OFFSET_RECTS |
Giá trị sẽ đượ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 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á nhà cung cấp và khoá được chuẩn hoá đều được 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 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 độ lệch QP được hỗ trợ vẫn sẽ cố gắng hết sức. 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 này sẽ giữ lại rect được chuẩn hoá đầu tiên
cấu hình này, cấu hình QP_map được chuẩn hoá đầu tiên,
hoặc cả hai. Trong mỗi danh mục, khung này chỉ gửi một URL được chuẩn hoá
cấu hình cho SoC và nếu có sẵn cấu hình chuẩn,
việc 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ấu hình được giữ lại theo thứ tự ưu tiên sau:
|