Android 15 memperkenalkan proses standar untuk mengintegrasikan konfigurasi pengguna area minat (RoI) ke dalam framework encoding video Android. Fitur ini memungkinkan kualitas kompresi yang lebih baik untuk RoI dengan menawarkan API publik untuk mengintegrasikan dan menganalisis konfigurasi pengguna ke dalam encoder video.
Implementasi
Vendor SoC dan OEM dapat mengontrol dukungan RoI untuk encoding video dengan tanda FEATURE_Roi
. Jika FEATURE_Roi
tidak diaktifkan, tidak ada perubahan pada perilaku encoder video.
Perubahan dalam framework video
Bagian ini menjelaskan perubahan dalam framework video yang diperlukan untuk menerapkan fitur ini.
Kunci di Codec2
Di Android 15, peta parameter kuantisasi (QP_map
) dan konfigurasi persegi panjang (rect
) ditentukan sebagai jenis konfigurasi RoI. Selain itu, dua kunci diperkenalkan di Codec2 (C2) untuk mendukung jenis baru ini. Penggunaan untuk kedua kunci sama dengan API publik.
Dalam loop frame encoder, konfigurasi disesuaikan secara dinamis
selama tahap berjalan, sebelum buffer input diantrekan, yang dijelaskan sebagai
berikut:
Dalam skenario sticky, jika tidak ada konfigurasi RoI yang diberikan untuk frame saat ini, encoder akan menggunakan konfigurasi yang sama dengan frame sebelumnya.
Dalam skenario dinamis, jenis konfigurasi RoI dapat berubah secara dinamis.
Kunci baru di C2 dijelaskan di bagian berikut.
kParamIndexQpOffsetMapBuffer
Kunci kParamIndexQpOffsetMapBuffer
memberi sinyal peta qp-offset
untuk frame. Nilainya ditetapkan menggunakan parameter
input PARAMETER_KEY_QP_OFFSET_MAP
dari setParameters
.
kParamIndexQpOffsetMapBuffer
adalah array byte dalam
C2InfoBuffer
,
dengan atribut berikut:
Panjang: Jumlah blok 16x16 dalam satu frame.
Nilai: Setiap nilai array adalah offset QP blok 16x16, dalam region -51~51. QP unit coding terbesar (LCU) target dihitung oleh kontrol kecepatan encoder ditambah offset. Jika hasil penghitungan melebihi rentang 0~51, nilai akan dipangkas menjadi 0~51.
- Jika 0: Tidak ada offset QP, QP ditentukan oleh kontrol kecepatan asli.
- Jika bukan nol: QP adalah kontrol laju asli ditambah offset.
- Jika negatif: Kualitas video ditingkatkan di LCU target.
- Jika positif: Kualitas video menurun di LCU target.
Penggunaan: Pengguna harus mengonfigurasi kunci ini sebagai blok 16x16. Encoder menyesuaikan konfigurasi ke ukuran LCU sebenarnya dengan merata-ratakan nilai blok 16x16 dalam LCU.
C2_PARAMKEY_QP_OFFSET_RECTS
Kunci C2_PARAMKEY_QP_OFFSET_RECTS
(ditetapkan ke coding.qp-offset-rects
menetapkan RoI sebagai QpOffset-Rects
. Nilainya ditetapkan menggunakan parameter input PARAMETER_KEY_QP_OFFSET_RECTS
dari setParameters
.
Untuk mendukung kunci ini, struktur C2QpOffsetRectStruct
berikut diperkenalkan:
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")
}
Dalam hal ini:
top
danleft
: Koordinat RoI, dalam bentuk persegi panjang. RoI diregangkan agar sesuai dengan batas LCU. Nilai ini mewakili sudut kiri atas setiap piksel, sehingga ((0,0), (16, 16)) menentukan blok 16x16 penuh.qpOffset
: Setiap nilai array mewakili offset QP dari arearect
target. Definisi dan penggunaannya sama dengan nilaikParamIndexQpOffsetMapBuffer
.
Algoritma pemetaan
Tabel berikut menunjukkan pemetaan dari kunci publik ke framework video:
Kunci atau API publik | Pemetaan dalam framework video |
---|---|
PARAMETER_KEY_QP_OFFSET_MAP |
Nilai diteruskan ke kParamIndexQpOffsetMapBuffer sebagai
instance C2InfoBuffer . |
PARAMETER_KEY_QP_OFFSET_RECTS |
Nilai dikonversi dari String menjadi
Struct C2QpOffsetRectStruct dan diteruskan ke
C2_PARAMKEY_QP_OFFSET_RECTS . |
Penanganan error
Implementasi OEM harus menangani kasus error berikut:
Kasus error | Contoh | Penanganan |
---|---|---|
Kunci vendor dan kunci standar digunakan untuk mengaktifkan RoI. | Pengguna memanggil setFeatureEnabled(FEATURE_ROI) DAN
kunci vendor untuk mengaktifkan RoI. |
RoI harus diaktifkan. |
Offset QP berada dalam rentang, tetapi tidak didukung oleh vendor SoC. | Pengguna menetapkan offset QP sebagai 12, tetapi SoC hanya mendukung offset QP hingga 10. | Rentang offset QP yang didukung dibiarkan sebagai upaya terbaik. Nilai akan dibatasi ke rentang yang didukung SoC. |
Beberapa konfigurasi RoI (baik kunci standar maupun kunci khusus vendor) ditetapkan ke satu frame. | Pengguna menggunakan kunci standar dan kunci vendor untuk frame 1. | Jika tersedia, framework akan mempertahankan konfigurasi rect
standar pertama, konfigurasi QP_map standar pertama,
atau keduanya. Di setiap kategori, framework hanya mengirimkan satu konfigurasi standar ke SoC dan jika konfigurasi standar tersedia, implementasi SoC harus mengabaikan konfigurasi vendor. Jika
beberapa konfigurasi dikirim ke SoC, vendor SoC hanya boleh menyimpan
satu konfigurasi RoI dan mengabaikan konfigurasi lainnya.Konfigurasi dipertahankan dalam urutan prioritas ini:
|