اندروید ۱۵ یک فرآیند استاندارد برای ادغام تنظیمات کاربر منطقه مورد علاقه (RoI) در چارچوب رمزگذاری ویدیوی اندروید معرفی میکند. این ویژگی با ارائه APIهای عمومی برای ادغام و تجزیه و تحلیل تنظیمات کاربر در رمزگذار ویدیو، کیفیت فشردهسازی بهتری را برای RoIها فراهم میکند.
پیادهسازی
فروشندگان SoC و تولیدکنندگان اصلی تجهیزات (OEM) میتوانند پشتیبانی RoI برای رمزگذاری ویدیو را با پرچم FEATURE_Roi کنترل کنند. اگر FEATURE_Roi فعال نباشد، هیچ تغییری در رفتار رمزگذار ویدیو ایجاد نمیشود.
تغییرات در چارچوب ویدیویی
این بخش جزئیات تغییرات مورد نیاز در چارچوب ویدیویی برای پیادهسازی این ویژگی را شرح میدهد.
کلیدها در Codec2
در اندروید ۱۵، نقشه پارامتر کوانتیزاسیون ( QP_map ) و پیکربندی مستطیلی ( rect ) به عنوان انواع پیکربندی RoI تعریف شدهاند. علاوه بر این، دو کلید در Codec2 (C2) برای پشتیبانی از این انواع جدید معرفی شدهاند. نحوه استفاده از هر دو کلید مشابه APIهای عمومی است. در حلقه فریم رمزگذار، پیکربندی به صورت پویا در طول مرحله اجرا، قبل از صفبندی بافر ورودی، تنظیم میشود که به شرح زیر است:
در یک سناریوی ثابت ، اگر هیچ پیکربندی RoI برای فریم فعلی ارائه نشده باشد، انکودر از همان پیکربندی فریم قبلی استفاده میکند.
در یک سناریوی پویا ، انواع پیکربندی RoI میتوانند به صورت پویا تغییر کنند.
کلیدهای جدید در C2 در بخشهای بعدی توضیح داده شدهاند.
kParamIndexQpOffsetMapBuffer
کلید kParamIndexQpOffsetMapBuffer نگاشت qp-offset را برای یک فریم سیگنال میدهد. مقدار آن با استفاده از پارامتر ورودی PARAMETER_KEY_QP_OFFSET_MAP از setParameters تنظیم میشود.
kParamIndexQpOffsetMapBuffer یک آرایه بایتی در C2InfoBuffer با ویژگیهای زیر است:
طول: تعداد بلوکهای ۱۶x۱۶ در یک قاب.
مقدار: هر مقدار آرایه، آفست QP یک بلوک ۱۶x۱۶، در ناحیه -۵۱~۵۱ است. QP بزرگترین واحد کدگذاری هدف (LCU) توسط کنترل نرخ کدگذاری به علاوه آفست محاسبه میشود. اگر نتیجه محاسبه شده از ناحیه ۰~۵۱ تجاوز کند، مقدار به ۰~۵۱ کاهش مییابد.
- اگر ۰ باشد: هیچ جبران QP وجود ندارد، QP توسط کنترل نرخ اصلی تعیین میشود.
- اگر غیر صفر باشد: QP کنترل نرخ اصلی به علاوهی آفست است.
- اگر منفی باشد: کیفیت ویدیو در LCU هدف افزایش مییابد.
- اگر مثبت باشد: کیفیت ویدئو در LCU هدف کاهش مییابد.
نحوهی استفاده: کاربر باید این کلید را به صورت بلوکهای ۱۶x۱۶ پیکربندی کند. انکودر با میانگینگیری از مقادیر بلوکهای ۱۶x۱۶ در LCU، پیکربندی را با اندازهی واقعی 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 ناحیهی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 استفاده میشوند. | کاربر برای فعال کردن RoI، هم setFeatureEnabled(FEATURE_ROI) و هم کلید فروشنده را فراخوانی میکند. | RoI باید فعال شود. |
| انحراف QP در محدوده است اما توسط فروشندگان SoC پشتیبانی نمیشود. | کاربر آفست QP را روی ۱۲ تنظیم میکند، اما SoC فقط از آفست QP تا ۱۰ پشتیبانی میکند. | محدودهی پشتیبانیشدهی جبران QP به عنوان بهترین تلاش باقی میماند. مقدار آن به محدودهی پشتیبانیشدهی SoC محدود میشود . |
| پیکربندیهای چندگانهی RoI (چه یک کلید استاندارد و چه یک کلید خاص فروشنده) روی یک فریم واحد تنظیم میشوند. | کاربر برای فریم ۱ از هر دو کلید استاندارد و کلید فروشنده استفاده میکند. | در صورت وجود، چارچوب، اولین پیکربندی استاندارد شدهی rect ، اولین پیکربندی استاندارد شدهی QP_map یا هر دو را حفظ میکند. در هر دسته، چارچوب فقط یک پیکربندی استاندارد شده را به SoC ارسال میکند و اگر پیکربندی استاندارد شده در دسترس باشد، پیادهسازی SoC باید پیکربندیهای فروشنده را نادیده بگیرد. اگر چندین پیکربندی به SoC ارسال شود، فروشندهی SoC باید فقط یک پیکربندی RoI را حفظ کند و بقیهی پیکربندیها را نادیده بگیرد.پیکربندیها به ترتیب اولویت زیر حفظ میشوند:
|