راهنمای OEM برای اجرای RoI

اندروید 15 یک فرآیند استاندارد را برای ادغام تنظیمات کاربر منطقه مورد علاقه (RoI) در چارچوب کدگذاری ویدیوی اندروید معرفی می کند. این ویژگی با ارائه API های عمومی برای ادغام و تجزیه و تحلیل پیکربندی های کاربر در رمزگذار ویدیو، کیفیت فشرده سازی بهتری را برای RoI ها فراهم می کند.

پیاده سازی

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

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

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

کلیدها در Codec2

در اندروید 15، نقشه پارامتر کوانتیزاسیون ( QP_map ) و پیکربندی مستطیلی ( rect ) به عنوان انواع پیکربندی RoI تعریف شده است. علاوه بر این، دو کلید در Codec2 (C2) برای پشتیبانی از این انواع جدید معرفی شده است. استفاده برای هر دو کلید مانند APIهای عمومی است. در حلقه فریم رمزگذار، پیکربندی به صورت پویا در مرحله اجرا تنظیم می شود، قبل از اینکه بافر ورودی در صف قرار گیرد، که به شرح زیر است:

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

  • در یک سناریوی پویا ، انواع پیکربندی RoI می تواند به صورت پویا تغییر کند.

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

kParamIndexQpOffsetMapBuffer

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

kParamIndexQpOffsetMapBuffer یک آرایه بایت در C2InfoBuffer است که دارای ویژگی های زیر است:

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

  • مقدار: هر مقدار آرایه، آفست QP یک بلوک ۱۶×۱۶، در ناحیه ۵۱-۵۱- است. QP بزرگترین واحد کدگذاری هدف (LCU) توسط کنترل نرخ رمزگذار به اضافه افست محاسبه می شود. اگر نتیجه محاسبه شده از ناحیه 0~51 بیشتر شود، مقدار به 0~51 کوتاه می شود.

    • اگر 0: بدون افست QP، QP توسط کنترل نرخ اصلی تعیین می شود.
    • اگر غیر صفر: QP کنترل نرخ اصلی به اضافه افست است.
    • اگر منفی است: کیفیت ویدیو در LCU هدف افزایش می یابد.
    • در صورت مثبت بودن: کیفیت ویدئو در LCU هدف کاهش می یابد.
  • استفاده: کاربر باید این کلید را به صورت بلوک های ۱۶×۱۶ پیکربندی کند. رمزگذار پیکربندی را با اندازه واقعی LCU با میانگین کردن مقادیر بلوک های 16x16 در LCU تنظیم می کند.

C2_PARAMKEY_QP_OFFSET_RECTS

کلید C2_PARAMKEY_QP_OFFSET_RECTS (تنظیم به coding.qp-offset-rects ، RoI را به عنوان 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 : مختصات RoI، به شکل مستطیل. RoI کشیده شده است تا با مرزهای LCU هماهنگ شود. این مقدار گوشه سمت چپ بالای هر پیکسل را نشان می دهد، به طوری که ((0,0)، (16,16)) یک بلوک کامل 16x16 را تعریف می کند.

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

الگوریتم نقشه برداری

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

کلیدهای عمومی یا API ها نقشه برداری در چارچوب ویدیویی
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) و هم کلید فروشنده را برای روشن کردن RoI فرا می خواند. RoI باید روشن باشد.
افست QP در محدوده است اما توسط فروشندگان SoC پشتیبانی نمی شود. کاربر افست QP را 12 تنظیم می کند، اما SoC فقط تا 10 QP Offset را پشتیبانی می کند. محدوده افست QP پشتیبانی شده به عنوان بهترین تلاش باقی مانده است. مقدار به محدوده پشتیبانی شده SoC متصل می شود.
تنظیمات RoI چندگانه (خواه یک کلید استاندارد شده یا یک کلید خاص فروشنده) روی یک قاب تنظیم شده است. کاربر از کلید استاندارد و کلید فروشنده برای فریم 1 استفاده می کند. در صورت موجود بودن، چارچوب اولین پیکربندی استاندارد شده rect ، اولین پیکربندی استاندارد QP_map یا هر دو را حفظ می کند. در هر دسته، چارچوب تنها یک پیکربندی استاندارد شده را به SoC ارسال می‌کند و اگر پیکربندی استاندارد شده در دسترس باشد، اجرای SoC باید پیکربندی‌های فروشنده را نادیده بگیرد. اگر چندین پیکربندی به SoC ارسال شود، فروشنده SoC باید تنها یک پیکربندی RoI را حفظ کند و بقیه تنظیمات را نادیده بگیرد.

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

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