ROI প্রয়োগের জন্য OEM নির্দেশিকা

Android 15, Android ভিডিও এনকোডিং ফ্রেমওয়ার্কে আগ্রহের অঞ্চল (RoI) সংক্রান্ত ব্যবহারকারীর কনফিগারেশন ইন্টিগ্রেট করার জন্য একটি স্ট্যান্ডার্ড প্রসেস নিয়ে এসেছে। এই ফিচারটি ভিডিও এনকোডারে ব্যবহারকারীর কনফিগারেশন ইন্টিগ্রেট এবং বিশ্লেষণ করার জন্য পাবলিক API অফার করে RoI-এর জন্য আরও ভালো কম্প্রেশন কোয়ালিটি প্রদান করে।

প্রয়োগ

SoC ভেন্ডর ও OEM-রা FEATURE_Roi ফ্ল্যাগ ব্যবহার করে ভিডিও এনকোডিংয়ের জন্য RoI কন্ট্রোল করতে পারে। FEATURE_Roi চালু না থাকলে, ভিডিও এনকোডারের আচরণে কোনও পরিবর্তন হয় না।

ভিডিও ফ্রেমওয়ার্কে পরিবর্তন

এই ফিচার প্রয়োগ করার জন্য ভিডিও ফ্রেমওয়ার্কে কী কী পরিবর্তন করতে হবে, তা এই বিভাগে বিস্তারিতভাবে বলা হয়েছে।

Codec2-এর কী

Android 15-এ, কোয়ান্টাইজেশন প্যারামিটার ম্যাপ (QP_map) এবং রেক্ট্যাঙ্গুলার কনফিগারেশন (rect)-কে RoI কনফিগারেশন ধরন হিসেবে সংজ্ঞায়িত করা হয়েছে। এছাড়াও, এই নতুন ধরনের কোডেককে সাপোর্ট করার জন্য Codec2 (C2)-তে দুটি কী যোগ করা হয়েছে। দুটি 'কী'-এর ব্যবহার পাবলিক API-এর মতোই। এনকোডারের ফ্রেম লুপের মধ্যে, রানিং স্টেজে কনফিগারেশন ডায়নামিক অ্যাডজাস্ট করা হয় ইনপুট বাফার সারিবদ্ধ করার আগে, যা নিম্নলিখিতভাবে বর্ণিত:

  • স্টিকি পরিস্থিতিতে, বর্তমান ফ্রেমের জন্য কোনও ROI কনফিগারেশন প্রদান করা না হলে, এনকোডার আগের ফ্রেমের মতো একই কনফিগারেশন ব্যবহার করে।

  • ডায়নামিক পরিস্থিতিতে, ROI কনফিগারেশন ডায়নামিক পরিবর্তন হতে পারে।

C2-এর নতুন কীগুলি নিম্নলিখিত বিভাগে বর্ণনা করা হয়েছে।

kParamIndexQpOffsetMapBuffer

kParamIndexQpOffsetMapBuffer কী ফ্রেমের জন্য qp-offset ম্যাপকে সিগন্যাল দেয়। setParameters থেকে ইনপুট প্যারামিটার PARAMETER_KEY_QP_OFFSET_MAP ব্যবহার করে এর ভ্যালু সেট করা হয়।

kParamIndexQpOffsetMapBuffer হল C2InfoBuffer-এর একটি বাইট অ্যারে, যার নিম্নলিখিত অ্যাট্রিবিউট আছে:

  • দৈর্ঘ্য: একটি ফ্রেমে ১৬x১৬ ব্লকের সংখ্যা।

  • ভ্যালু: অ্যারের প্রতিটি ভ্যালু হল ১৬x১৬ ব্লকের QP অফসেট, -৫১~৫১ রেঞ্জে। এনকোডার রেট কন্ট্রোল ও অফসেট যোগ করে টার্গেট করা সবচেয়ে বড় কোডিং ইউনিটের (LCU) QP গণনা করা হয়। হিসেব করা ফলাফল ০~৫১ রেঞ্জ পেরিয়ে গেলে, ভ্যালু ০~৫১-এ ট্রাঙ্কেট করা হয়।

    • 0 হলে: কোনও QP অফসেট নেই, QP আসল রেট কন্ট্রোল দ্বারা নির্ধারিত হয়।
    • শূন্য নয়: QP হল আসল রেট কন্ট্রোল প্লাস অফসেট।
    • নেগেটিভ হলে: টার্গেট LCU-তে ভিডিও কোয়ালিটি বুস্ট করা হয়।
    • পজিটিভ হলে: টার্গেট LCU-তে ভিডিও কোয়ালিটি কমে যায়।
  • ব্যবহার: ব্যবহারকারীকে এই কী ১৬x১৬ ব্লক হিসেবে কনফিগার করতে হবে। এনকোডার, LCU-তে ১৬x১৬ ব্লকের ভ্যালুর গড় করে, আসল LCU সাইজে কনফিগারেশন অ্যাডজাস্ট করে।

C2_PARAMKEY_QP_OFFSET_RECTS

C2_PARAMKEY_QP_OFFSET_RECTS কী (coding.qp-offset-rects হিসেবে সেট করা আছে) RoI-কে QpOffset-Rects হিসেবে সেট করে। setParameters থেকে ইনপুট প্যারামিটার PARAMETER_KEY_QP_OFFSET_RECTS ব্যবহার করে এর ভ্যালু সেট করা হয়।

এই কী কাজ করার জন্য, নিম্নলিখিত স্ট্রাকচার 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-এর কোঅর্ডিনেট। LCU সীমানার সাথে অ্যালাইন করার জন্য RoI স্ট্রেচ করা হয়েছে। মানটি প্রতিটি পিক্সেলের উপরের-বাঁদিকের কোণকে বোঝায়, যেমন, ((0,0), (16, 16)) একটি সম্পূর্ণ ১৬x১৬ ব্লক নির্ধারণ করে।

  • qpOffset: অ্যারের প্রতিটি ভ্যালু টার্গেট করা rect এলাকার QP অফসেটকে বোঝায়। এর সংজ্ঞা ও ব্যবহার kParamIndexQpOffsetMapBuffer ভ্যালুর মতো।

ম্যাপিং অ্যালগরিদম

নিচের সারণীতে পাবলিক কী থেকে ভিডিও ফ্রেমওয়ার্কের ম্যাপিং দেখানো হয়েছে:

পাবলিক কী বা API ভিডিও ফ্রেমওয়ার্কে ম্যাপিং
PARAMETER_KEY_QP_OFFSET_MAP kParamIndexQpOffsetMapBuffer-এ ভ্যালু C2InfoBuffer ইনস্ট্যান্স হিসেবে পাস করা হয়।
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 কনফিগারেশন রাখতে হবে এবং বাকি কনফিগারেশনগুলি উপেক্ষা করতে হবে।

এই অগ্রাধিকারের ক্রমে কনফিগারেশনগুলি বজায় রাখা হয়:

  1. স্ট্যান্ডার্ডাইজড rect
  2. স্ট্যান্ডার্ডাইজড QP_map
  3. বিক্রেতা rect
  4. বিক্রেতা QP_map