RoI বাস্তবায়নের জন্য OEM নির্দেশিকা

অ্যান্ড্রয়েড ১৫ অ্যান্ড্রয়েড ভিডিও এনকোডিং ফ্রেমওয়ার্কে রিজিওন অফ ইন্টারেস্ট (RoI) ব্যবহারকারীর কনফিগারেশন একীভূত করার জন্য একটি প্রমিত প্রক্রিয়া চালু করেছে। এই ফিচারটি ভিডিও এনকোডারে ব্যবহারকারীর কনফিগারেশন একীভূত ও বিশ্লেষণ করার জন্য পাবলিক এপিআই প্রদানের মাধ্যমে RoI-এর জন্য উন্নততর কম্প্রেশন কোয়ালিটি নিশ্চিত করে।

বাস্তবায়ন

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

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

এই বৈশিষ্ট্যটি বাস্তবায়নের জন্য ভিডিও ফ্রেমওয়ার্কে যে পরিবর্তনগুলো প্রয়োজন, তা এই অংশে বিস্তারিতভাবে বর্ণনা করা হয়েছে।

কোডেক২-এর কী-গুলো

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

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

  • একটি গতিশীল পরিস্থিতিতে, RoI কনফিগারেশনের ধরণগুলো গতিশীলভাবে পরিবর্তিত হতে পারে।

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

kParamIndexQpOffsetMapBuffer

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

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

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

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

    • যদি ০ হয়: কোনো 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-এর স্থানাঙ্ক, একটি আয়তক্ষেত্রাকার আকারে। RoI-কে LCU সীমানার সাথে সারিবদ্ধ করার জন্য প্রসারিত করা হয়েছে। মানটি প্রতিটি পিক্সেলের উপরের-বাম কোণাকে প্রতিনিধিত্ব করে, এমনভাবে যে ((0,0), (16, 16)) একটি সম্পূর্ণ 16x16 ব্লক সংজ্ঞায়িত করে।

  • qpOffset : অ্যারের প্রতিটি মান টার্গেট rect এলাকার QP অফসেটকে নির্দেশ করে। এর সংজ্ঞা ও ব্যবহার kParamIndexQpOffsetMapBuffer মানের মতোই।

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

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

পাবলিক কী বা এপিআই ভিডিও ফ্রেমওয়ার্কে ম্যাপিং
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) এবং vendor key উভয়ই কল করেন। RoI অবশ্যই চালু করতে হবে।
QP অফসেট সীমার মধ্যে থাকলেও SoC ভেন্ডররা এটি সমর্থন করে না। ব্যবহারকারী QP অফসেট ১২ সেট করেছেন, কিন্তু SoC সর্বোচ্চ ১০ পর্যন্ত QP অফসেট সমর্থন করে। সমর্থিত QP অফসেট পরিসরটি সর্বোত্তম প্রচেষ্টা হিসাবে রাখা হয়েছে। মানটি SoC-এর সমর্থিত পরিসরের মধ্যে সীমাবদ্ধ করা হয়েছে।
একাধিক RoI কনফিগারেশন (তা প্রমিত কী হোক বা বিক্রেতা-নির্দিষ্ট কী হোক) একটি একক ফ্রেমে সেট করা হয়। ব্যবহারকারী ফ্রেম ১-এর জন্য প্রমিত কী এবং ভেন্ডর কী উভয়ই ব্যবহার করেন। যদি উপলব্ধ থাকে, ফ্রেমওয়ার্কটি প্রথম স্ট্যান্ডার্ডাইজড rect কনফিগারেশন, প্রথম স্ট্যান্ডার্ডাইজড QP_map কনফিগারেশন, অথবা উভয়ই সংরক্ষণ করে। প্রতিটি ক্যাটাগরিতে, ফ্রেমওয়ার্কটি এসওসি-তে শুধুমাত্র একটি স্ট্যান্ডার্ডাইজড কনফিগারেশন পাঠায় এবং যদি সেই স্ট্যান্ডার্ডাইজড কনফিগারেশনটি উপলব্ধ থাকে, তবে এসওসি ইমপ্লিমেন্টেশনকে অবশ্যই ভেন্ডর কনফিগারেশনগুলো উপেক্ষা করতে হবে। যদি এসওসি-তে একাধিক কনফিগারেশন পাঠানো হয়, তবে এসওসি ভেন্ডরকে অবশ্যই শুধুমাত্র একটি RoI কনফিগারেশন সংরক্ষণ করতে হবে এবং বাকি কনফিগারেশনগুলো উপেক্ষা করতে হবে।

কনফিগারেশনগুলি এই অগ্রাধিকার ক্রমে সংরক্ষিত থাকে:

  1. মানসম্মত rect
  2. প্রমিত QP_map
  3. বিক্রেতা rect
  4. বিক্রেতা QP_map