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 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 etkin değilse 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, kesme noktası parametresi 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 kullanıma sunulmuştur. Her iki anahtarın kullanımı da herkese açık API'lerle aynıdır. Kodlayıcının çerçeve döngüsü içinde yapılandırma, çalışma aşamasında, giriş arabelleğinin sıraya eklenmesinden önce dinamik olarak ayarlanır. Bu işlem aşağıdaki gibi açıklanır:

  • Yapışkan bir senaryoda, geçerli kare için 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ı işaret eder. Değeri, setParameters kaynağından gelen PARAMETER_KEY_QP_OFFSET_MAP giriş parametresi kullanılarak belirlenir.

kParamIndexQpOffsetMapBuffer, C2InfoBuffer içinde 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 değeri, 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 ofseti yoktur, QP'ye orijinal bit hızı kontrolü karar verir.
    • Sıfırdan farklıysa: QP, orijinal bit hızı kontrolü artı ofsettir.
    • Negatifse: Hedef LCU'da video kalitesi artırılır.
    • Değer 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 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 tanıtıldı:

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 ROI 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: Dizideki her değer, hedef rect alanının QP ofsetini temsil eder. Tanımı ve kullanımı kParamIndexQpOffsetMapBuffer değeriyle aynıdır.

Eşleme algoritması

Aşağıdaki tabloda, herkese açık anahtarların video çerçevesine eşlenmesi gösterilmektedir:

Genel 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'ten Struct C2QpOffsetRectStruct'e 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 tedarikçi 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 tedarikçi anahtarını çağırır. YG etkinleştirilmelidir.
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 desteklediği aralığa sabitlenir.
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çisi yalnızca bir YG yapılandırmasını saklamalı ve diğer yapılandırmaları yok saymalıdır.

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

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