راهنمایی‌های سازنده اصلی محصول برای پیاده‌سازی RoI

‫Android 15 فرایندی استاندارد برای ادغام پیکربندی‌های کاربر ناحیه موردعلاقه (RoI) در چارچوب کدبندی ویدیو Android معرفی می‌کند. این ویژگی با ارائه میاناهای برنامه‌سازی کاربردی عمومی برای ادغام و تحلیل پیکربندی‌های کاربر در کدبند ویدیو، کیفیت فشرده‌سازی بهتری را برای RoI فراهم می‌کند.

پیاده‌سازی

فروشندگان SoC و OEM می‌توانند پشتیبانی RoI را برای کدبندی ویدیو با FEATURE_Roi پرچم کنترل کنند. اگر FEATURE_Roi فعال نباشد، هیچ تغییری در رفتار کدبند ویدیو ایجاد نمی‌شود.

تغییرات در چارچوب ویدیو

این بخش جزئیات تغییرات لازم در چارچوب ویدیو برای پیاده‌سازی این ویژگی را شرح می‌دهد.

کلیدها در Codec2

در Android 15، نقشه پارامتر کمّی‌سازی (QP_map) و پیکربندی مستطیلی (rect) به‌عنوان انواع پیکربندی «منطقه موردعلاقه» تعریف شده‌اند. علاوه‌براین، دو کلید در Codec2 (C2) برای پشتیبانی از این انواع جدید معرفی شده است. کاربرد هر دو کلید مشابه کاربرد «میاناهای برنامه‌سازی کاربردی عمومی» است. در حلقه قاب کدبند، پیکربندی به‌صورت پویا در مرحله اجرا و قبل‌از قرار گرفتن بافر ورودی در صف تنظیم می‌شود، که به‌صورت زیر توضیح داده شده است:

  • در سناریو چسبنده، اگر پیکربندی RoI برای قاب فعلی ارائه نشده باشد، کدبند از همان پیکربندی قاب قبلی استفاده می‌کند.

  • در سناریو پویا، انواع پیکربندی «منطقه موردنظر» می‌تواند به‌طور پویا تغییر کند.

کلیدهای جدید در C2 در بخش‌های زیر توضیح داده شده است.

kParamIndexQpOffsetMapBuffer

کلید kParamIndexQpOffsetMapBuffer نقشه qp-offset را برای یک قاب نشان می‌دهد. مقدار آن بااستفاده از پارامتر ورودی PARAMETER_KEY_QP_OFFSET_MAP از setParameters تنظیم می‌شود.

‫kParamIndexQpOffsetMapBuffer آرایه بایت در C2InfoBuffer است، با مشخصه‌های زیر:

  • طول: تعداد بلوک‌های ۱۶×۱۶ در یک فریم.

  • مقدار: هر مقدار آرایه انحراف QP یک بلوک ۱۶x۱۶ در منطقه -۵۱ تا ۵۱ است. QP بزرگ‌ترین واحد کدبندی هدف (LCU) با کنترل نرخ کدبند به‌علاوه انحراف محاسبه می‌شود. اگر نتیجه محاسبه‌شده از محدوده ۰ تا ۵۱ بیشتر باشد، مقدار به ۰ تا ۵۱ کوتاه می‌شود.

    • اگر ۰: بدون جبران QP، مقدار QP توسط کنترل نرخ اصلی تعیین می‌شود.
    • اگر غیرصفر باشد: QP نرخ کنترل اصلی به‌علاوه جبران است.
    • اگر منفی باشد: کیفیت ویدیو در LCU هدف تقویت می‌شود.
    • اگر مثبت باشد: کیفیت ویدیو در واحد کنترل منطقی هدف کاهش می‌یابد.
  • کاربرد: کاربر باید این کلید را به‌عنوان بلوک‌های ۱۶×۱۶ پیکربندی کند. کدبند پیکربندی را با میانگین‌گیری مقادیر بلوک‌های ۱۶×۱۶ در LCU با اندازه واقعی LCU تنظیم می‌کند.

C2_PARAMKEY_QP_OFFSET_RECTS

کلید C2_PARAMKEY_QP_OFFSET_RECTS (روی coding.qp-offset-rects تنظیم شده است) ناحیه موردعلاقه را روی QpOffset-Rects تنظیم می‌کند. مقدار آن بااستفاده از پارامتر ورودی PARAMETER_KEY_QP_OFFSET_RECTS از setParameters تنظیم می‌شود.

برای پشتیبانی از این کلید، ساختار زیر C2QpOffsetRectStruct معرفی شده است:

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")
}

مکان:

  • ‫top و left: مختصات «منطقه موردعلاقه» به‌شکل مستطیل. «منطقه موردعلاقه» کشیده شده است تا با مرزهای LCU هماهنگ شود. این مقدار نشان‌دهنده گوشه بالا سمت چپ هر پیکسل است، به‌طوری‌که ((۰،۰)، (۱۶، ۱۶)) یک بلوک کامل ۱۶×۱۶ را تعریف می‌کند.

  • qpOffset: هر مقدار آرایه نشان‌دهنده جبران QP هدف rect است. تعریف و کاربرد آن مشابه مقدار kParamIndexQpOffsetMapBuffer است.

الگوریتم نگاشت

جدول زیر نگاشت کلیدهای عمومی به چارچوب ویدیو را نشان می‌دهد:

کلیدهای عمومی یا میاناهای برنامه‌سازی کاربردی تخصیص در چارچوب ویدیو
PARAMETER_KEY_QP_OFFSET_MAP مقدار به‌عنوان نمونه C2InfoBuffer به kParamIndexQpOffsetMapBuffer ارسال می‌شود.
PARAMETER_KEY_QP_OFFSET_RECTS مقدار از String به Struct C2QpOffsetRectStruct تبدیل می‌شود و به C2_PARAMKEY_QP_OFFSET_RECTS ارسال می‌شود.

مدیریت کردن خطا

پیاده‌سازی OEM باید موارد خطای زیر را مدیریت کند:

مورد خطا مثال استفاده
از کلید فروشنده و کلید استانداردشده برای روشن کردن RoI استفاده می‌شود. کاربر هم setFeatureEnabled(FEATURE_ROI) و هم کلید فروشنده را برای روشن کردن «منطقه موردعلاقه» فرا می‌خواند. «منطقه موردنظر» باید روشن باشد.
انحراف QP در محدوده است اما توسط فروشندگان SoC پشتیبانی نمی‌شود. کاربر جبران QP را روی ۱۲ تنظیم می‌کند، اما SoC فقط از جبران QP تا ۱۰ پشتیبانی می‌کند. محدوده افست QP پشتیبانی‌شده به‌عنوان بهترین تلاش باقی می‌ماند. مقدار به محدوده پشتیبانی‌شده SoC محدود شده است.
چندین پیکربندی RoI (چه کلید استانداردشده یا کلید مختص فروشنده) روی یک قاب تنظیم شده است. کاربر هم از کلید استاندارد و هم از کلید فروشنده برای قاب ۱ استفاده می‌کند. اگر دردسترس باشد، چارچوب اولین پیکربندی استانداردشده rect ، اولین پیکربندی استانداردشده QP_map، یا هر دو را حفظ می‌کند. در هر دسته، چارچوب فقط یک پیکربندی استانداردشده به SoC ارسال می‌کند و اگر پیکربندی استانداردشده دردسترس باشد، پیاده‌سازی SoC باید پیکربندی‌های فروشنده را نادیده بگیرد. اگر چندین پیکربندی به SoC ارسال شود، فروشنده SoC باید فقط یک پیکربندی RoI را حفظ کند و بقیه پیکربندی‌ها را نادیده بگیرد.

پیکربندی‌ها به این ترتیب اولویت حفظ می‌شوند:

  1. استانداردسازی‌شده rect
  2. استانداردسازی‌شده QP_map
  3. فروشنده rect
  4. فروشنده QP_map