Android 15, ilgi alanı (RoI) kullanıcı yapılandırmalarını Android video kodlama çerçevesine entegre etmek için standartlaştırılmış bir süreç sunar. Bu özellik, kullanıcı yapılandırmalarını video kodlayıcıya entegre edip analiz etmek için herkese açık API'ler sunarak ROI'ler için daha iyi sıkıştırma kalitesi sağlar.
Uygulama
SoC tedarikçileri ve OEM'ler, FEATURE_Roi işaretiyle video kodlama için RoI desteğini kontrol edebilir. FEATURE_Roi etkin değilse video kodlayıcı davranışında değişiklik olmaz.
Video çerçevesindeki değişiklikler
Bu bölümde, bu özelliği uygulamak için gereken video çerçevesindeki değişiklikler ayrıntılı olarak açıklanmaktadır.
Codec2'deki anahtarlar
Android 15'te nicemleme parametre haritası (QP_map) ve dikdörtgen yapılandırma (rect), RoI yapılandırma türleri olarak tanımlanır. Ayrıca, bu yeni türleri desteklemek için Codec2'de (C2) iki anahtar daha kullanıma sunulmuştur. Her iki anahtarın kullanımı, herkese açık API'lerle aynıdır.
Kodlayıcının çerçeve döngüsünde, yapılandırma, giriş arabelleği sıraya alınmadan önce çalışma aşamasında dinamik olarak ayarlanır. Bu durum şu şekilde açıklanır:
Sabit (sticky) senaryosunda, mevcut kare için YG yapılandırması sağlanmazsa kodlayıcı, önceki kareyle aynı yapılandırmayı kullanır.
Dinamik bir senaryoda, YG yapılandırma türleri dinamik olarak değişebilir.
C2'deki yeni anahtarlar aşağıdaki bölümlerde açıklanmıştır.
kParamIndexQpOffsetMapBuffer
kParamIndexQpOffsetMapBuffer
anahtarı, bir kare için qp-offset haritasını gösterir. Değeri, setParameters kaynağından gelen PARAMETER_KEY_QP_OFFSET_MAP giriş parametresi kullanılarak ayarlanır.
kParamIndexQpOffsetMapBuffer, C2InfoBuffer içinde bir bayt dizisidir ve aşağıdaki özelliklere sahiptir:
Uzunluk: Bir karedeki 16x16 blok sayısı.
Değer: Dizinin her değeri, bölgede -51~51 olan 16x16 blokun QP ofsetidir. Hedeflenen en büyük kodlama biriminin (LCU) QP'si, kodlayıcı hız kontrolü ve ofset ile hesaplanır. Hesaplanan sonuç 0-51 aralığını aşarsa değer 0-51 olarak kısaltılır.
- 0 ise: QP telafisi yok. QP, orijinal hız kontrolü tarafından belirlenir.
- Sıfır değilse: QP, orijinal hız kontrolü artı telafidir.
- Negatifse: Video kalitesi hedef LCU'da artırılır.
- Pozitifse: Hedef LCU'da video kalitesi düşer.
Kullanım: Kullanıcı, bu anahtarı 16x16 blok olarak yapılandırmalıdır. Kodlayıcı, LCU'daki 16x16 blokların değerlerini ortalayarak yapılandırmayı gerçek LCU boyutuna göre ayarlar.
C2_PARAMKEY_QP_OFFSET_RECTS
C2_PARAMKEY_QP_OFFSET_RECTS
anahtarı (coding.qp-offset-rects olarak ayarlanmış) YG'yi QpOffset-Rects olarak ayarlar. Değeri, setParameters kaynağından gelen PARAMETER_KEY_QP_OFFSET_RECTS giriş parametresi kullanılarak ayarlanır.
Bu anahtarı desteklemek için aşağıdaki yapı C2QpOffsetRectStruct
kullanılır:
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")
}
Nerede:
topveleft: Dikdörtgen şeklindeki ilgi alanının koordinatları. YG, LCU sınırlarıyla uyumlu olacak şekilde genişletilir. Değer, her pikselin sol üst köşesini temsil eder. Örneğin, ((0,0), (16, 16)) 16x16'lık tam bir bloğu tanımlar.qpOffset: Dizinin her değeri, hedefrectalanının QP uzaklığını temsil eder. Tanımı ve kullanımı,kParamIndexQpOffsetMapBufferdeğeriyle aynıdır.
Eşleme algoritması
Aşağıdaki tabloda, genel anahtarlardan video çerçevesine yapılan eşleme gösterilmektedir:
| Genel anahtarlar veya API'ler | Video çerçevesinde eşleme |
|---|---|
PARAMETER_KEY_QP_OFFSET_MAP |
Değer, kParamIndexQpOffsetMapBuffer öğesine C2InfoBuffer örneği olarak aktarılır. |
PARAMETER_KEY_QP_OFFSET_RECTS |
Değer String biriminden Struct C2QpOffsetRectStruct birimine dönüştürülür ve C2_PARAMKEY_QP_OFFSET_RECTS'ye iletilir. |
Hata işleme
OEM uygulaması aşağıdaki hata durumlarını ele almalıdır:
| Hata örneği | Örnek | Kullanım |
|---|---|---|
| YG'yi etkinleştirmek için hem satıcı anahtarı hem de standartlaştırılmış anahtar kullanılır. | Kullanıcı, YG'yi etkinleştirmek için hem setFeatureEnabled(FEATURE_ROI) hem de satıcı anahtarını çağırır. |
YG etkinleştirilmelidir. |
| QP ofseti aralık içinde ancak SoC satıcıları tarafından desteklenmiyor. | Kullanıcı, QP ofsetini 12 olarak ayarlıyor ancak SoC yalnızca 10'a kadar QP ofsetini destekliyor. | Desteklenen QP ofset aralığı, en iyi girişim olarak bırakılır. Değer, SoC'nin desteklenen aralığına sınırlanır. |
| Birden fazla YG yapılandırması (standartlaştırılmış bir anahtar veya tedarikçiye özel bir anahtar) tek bir kareye ayarlanır. | Kullanıcı, 1. kare için hem standartlaştırılmış anahtarı hem de satıcı anahtarını kullanır. | Kullanılabiliyorsa çerçeve, ilk standartlaştırılmış rect yapılandırmayı, ilk standartlaştırılmış QP_map yapılandırmayı veya her ikisini de korur. Çerçeve, her kategoride SoC'ye yalnızca bir standart yapılandırma gönderir ve standart yapılandırma varsa SoC uygulaması, satıcı yapılandırmalarını yoksaymalıdır. SoC'ye birden fazla yapılandırma gönderilirse SoC satıcısı yalnızca bir RoI yapılandırmasını saklamalı ve diğer yapılandırmaları yoksaymalıdır.Yapılandırmalar şu öncelik sırasına göre saklanır:
|