YG'nin uygulanmasıyla ilgili OEM kılavuzu

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 tuşlar

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 işlem şu şekilde açıklanır:

  • Sabit (sticky) senaryosunda, mevcut kare için bir ROI 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ı belirtir. 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 uzaklığıdır. Hedeflenen en büyük kodlama biriminin (LCU) QP'si, kodlayıcı hız kontrolü ve ofset ile hesaplanır. Hesaplanan sonuç 0~51 bölgesini aşarsa değer 0~51 olarak kısaltılır.

    • 0 ise: QP telafisi yoktur, QP'ye orijinal hız kontrolü karar verir.
    • Sıfır değilse: QP, orijinal hız kontrolü artı telafidir.
    • Olumsuzsa: 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:

  • top ve left: 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, hedef rect alanının QP uzaklığını temsil eder. Tanımı ve kullanımı, kParamIndexQpOffsetMapBuffer değ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'a iletilir.

Hata işleme

OEM uygulaması aşağıdaki hata durumlarını ele almalıdır:

Hata durumu Ö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ı arar. RoI etkinleştirilmelidir.
QP ofseti aralık içinde ancak SoC tedarikçileri 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 satıcıya ö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 korunur:

  1. Standartlaştırılmış rect
  2. Standartlaştırılmış QP_map
  3. Tedarikçi rect
  4. Tedarikçi QP_map