RoI uygulaması için 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 YG'ler için daha iyi sıkıştırma kalitesi sağlar.

Uygulama

SoC tedarikçileri ve OEM'ler, video kodlama için yatırım getirisi desteğini FEATURE_Roi işaretiyle kontrol edebilir. FEATURE_Roi etkinleştirilmemişse video kodlayıcı davranışında herhangi bir değişiklik olmaz.

Video çerçevesinde yapılan değişiklikler

Bu bölümde, bu özelliğin uygulanması için video çerçevesinde yapılan değişiklikler ayrıntılı olarak açıklanmıştır.

Codec2'deki Anahtarlar

Android 15'te, niceleme parametresi eşlemesi (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 kullanıma sunulmuştur. Her iki anahtarın kullanımı, genel API'lerle aynıdır. Kodlayıcının çerçeve döngüsünde yapılandırma, aşağıda açıklandığı gibi giriş arabelleği sıraya alınmadan önce çalıştırma aşamasında dinamik olarak ayarlanır:

  • Yapışkan senaryoda, geçerli çerçeve için RoI yapılandırması sağlanmamışsa kodlayıcı, önceki kareyle aynı yapılandırmayı kullanır.

  • Dinamik 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.

kParamIndexQpKapalısetHaritaBuffer

kParamIndexQpOffsetMapBuffer tuşu, bir karenin qp-offset haritasını işaret eder. Değeri, setParameters kaynağından gelen PARAMETER_KEY_QP_OFFSET_MAP giriş parametresi kullanılarak belirlenir.

kParamIndexQpOffsetMapBuffer, C2InfoBuffer bölgesinde aşağıdaki özelliklere sahip bir bayt dizisidir:

  • Uzunluk: Bir karedeki 16x16 blok sayısı.

  • Değer: Dizinin her değeri, -51~51 bölgesindeki 16x16 blokun QP ofsetidir. Hedef en büyük kodlama biriminin (LCU) QP'si, kodlayıcı hız kontrolü artı ofset ile hesaplanır. Hesaplanan sonuç 0~51 bölgeyi aşarsa değer, 0~51 olacak şekilde kısaltılır.

    • 0 ise: QP ofseti yoksa QP'ye orijinal ücret kontrolü karar verir.
    • Sıfırdan farklıysa: QP, orijinal bit hızı kontrolü artı ofsettir.
    • Negatifse: Video kalitesi, hedef izleme süresinde (LCU) artırılır.
    • Pozitifse: Video kalitesi, hedef LCU'da düşmüştür.
  • Kullanım: Kullanıcı bu anahtarı 16x16 blok olarak yapılandırmalıdır. Kodlayıcı, LCU'daki 16x16 blokların değerlerinin ortalamasını alarak 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 ayarlanır) YG'yi QpOffset-Rects olarak ayarlar. Değeri, setParameters kaynağındaki PARAMETER_KEY_QP_OFFSET_RECTS giriş parametresi kullanılarak belirlenir.

Bu anahtarı desteklemek için aşağıdaki yapı C2QpOffsetRectStruct kullanıma sunulmuştur:

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: YG'nin dikdörtgen şeklindeki koordinatları. Yatırım getirisi, LCU sınırlarıyla hizalanacak şekilde uzatılır. Değer, her pikselin sol üst köşesini temsil eder. Örneğin, ((0,0), (16, 16)) tam bir 16x16 blok tanımlar.

  • qpOffset: Dizinin her değeri, hedef rect alanının QP ofsetini temsil eder. Tanımı ve kullanımı, kParamIndexQpOffsetMapBuffer değerinin tanımıyla aynıdır.

Eşleme algoritması

Aşağıdaki tabloda, ortak anahtarlardan video çerçevesine eşleme gösterilmektedir:

Ortak anahtarlar veya API'ler Video çerçevesinde eşleme
PARAMETER_KEY_QP_OFFSET_MAP Değer, kParamIndexQpOffsetMapBuffer örneği olarak C2InfoBuffer'e iletilir.
PARAMETER_KEY_QP_OFFSET_RECTS Değer, String değerinden Struct C2QpOffsetRectStruct değerine dönüştürüldü ve C2_PARAMKEY_QP_OFFSET_RECTS değerine iletildi.

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 tedarikçi firma anahtarı hem de standartlaştırılmış anahtar kullanılır. Kullanıcı, RoI'yi etkinleştirmek için hem setFeatureEnabled(FEATURE_ROI) hem de tedarikçi anahtarını çağırır. YG açık olmalıdır.
QP ofseti aralık içinde ancak SoC tedarikçileri tarafından desteklenmiyor. Kullanıcı, QP ofsetini 12 olarak ayarlar ancak SoC yalnızca 10'a kadar QP ofsetini destekler. Desteklenen QP ofset aralığı, elimizden geldiğince uygulanır. Değer, SoC'nin desteklenen aralığına kenetlenir.
Birden fazla YG yapılandırması (standartlaştırılmış bir anahtar veya tedarikçiye özgü bir anahtar olabilir) tek bir çerçeveye ayarlanır. Kullanıcı, 1. kare için hem standartlaştırılmış anahtarı hem de tedarikçi anahtarını kullanır. Mevcutsa çerçeve, ilk standartlaştırılmış rect yapılandırmasını, ilk standartlaştırılmış QP_map yapılandırmasını veya ikisini birden korur. Çerçeve, her kategoride SoC'ye yalnızca bir standartlaştırılmış yapılandırma gönderir ve standartlaştırılmış yapılandırma mevcutsa SoC uygulaması, tedarikçi yapılandırmalarını yoksaymalıdır. SoC'ye birden fazla yapılandırma gönderilirse SoC tedarikçisinin yalnızca bir RoI yapılandırması tutması ve diğer yapılandırmaları yoksayması gerekir.

Yapılandırmalar şu öncelik sırasına göre saklanır:

  1. Standart rect
  2. Standartlaştırılmış QP_map
  3. Satıcı rect
  4. Satıcı QP_map